string和标签本地化和全球化的最佳实践

我是一个拥有20多名开发人员的团队的成员。 每个开发人员在一个单独的模块上工作(接近10个模块)。 在每个模块中,我们可能至less有50个CRUD表单,这意味着我们目前有近500个添加button保存button编辑button等。

但是,由于我们希望将应用程序全球化,因此我们需要能够在应用程序中翻译文本。 例如,在任何地方, add这个词都应该成为法国用户的首选

我们到目前为止所做的是,对于UI或表示层中的每个视图,我们都有一个翻译键/值对的字典。 然后在渲染视图的同时,我们使用这个字典翻译需要的文本和string。 但是,这个方法呢,我们已经有500个词典附近有500个左右了。 这意味着我们违反了DRY本金。

另一方面,如果我们把常见的string集中起来,比如把add添加到一个地方,并要求开发者在任何地方使用,我们会遇到不确定string是否已经在集中字典中定义的问题。

另外一个select可能是没有翻译字典,并使用在线翻译服务,如谷歌翻译,必应翻译等。

我们遇到的另一个问题是,一些开发人员在按时交付项目的压力下不能记住翻译密钥 。 例如,对于添加button的文本,开发人员使用add,而另一个开发人员使用new等。

什么是应用程序的string资源的全球化和本地化的最佳实践或最有名的方法?

据我所知,在JavaScript中有一个名为localeplanet的好的库用于本地化和国际化。 此外,我认为它是本机的,并没有依赖其他库(例如jQuery)

这里是图书馆的网站: http : //www.localeplanet.com/

另外看Mozilla的这篇文章,你可以find非常好的客户端翻译方法和algorithm: http : //blog.mozilla.org/webdev/2011/10/06/i18njs-internationalize-your-javascript-with- A-小的帮助-从- JSON-和在服务器/

所有这些文章/库的共同之处在于它们使用i18n类和get方法(在某些方面还定义了一个较小的函数名称,例如_ )来将key检索/转换为value 。 在我解释的key手段,你想要翻译的string和value意味着翻译string。
然后,你只需要一个JSON文件来存储keyvalue

例如:

 var _ = document.webL10n.get; alert(_('test')); 

这里的JSON:

 { test: "blah blah" } 

我相信使用目前stream行的库解决scheme是一个好方法。

当你面对一个要解决的问题(坦率地说,谁不是这些日子?),我们计算机人通常采取的基本策略就是“分而治之”。它是这样的:

  • 将具体问题概念化为一组较小的子问题。
  • 解决每个小问题。
  • 将结果组合成具体问题的解决scheme。

但“分而治之”不是唯一可行的策略。 我们也可以采取更通用的方法:

  • 将具体问题概念化为一个更普遍问题的特例。
  • 以某种方式解决一般问题。
  • 将一般问题的解决scheme适应于具体问题。

– Eric Lippert

我相信在服务器端语言(如ASP.Net/C#)中已经存在许多解决scheme。

我已经概述了这个问题的一些主要方面

  • 问题 :我们只需要加载所需语言的数据

    解决scheme :为此,我们将数据保存到每种语言的单独文件中

恩。 res.de.js,res.fr.js,res.en.js,res.js(默认语言)

  • 问题:每个页面的资源文件应该分开,所以我们只获取我们需要的数据

    解决scheme :我们可以使用一些已经存在的工具,比如https://github.com/rgrove/lazyload

  • 问题:我们需要一个键/值对结构来保存我们的数据

    解决scheme :我build议一个JavaScript对象,而不是string/string空气。 我们可以从IDE的智能感知中受益

  • 问题:一般成员应该存储在公共文件中,所有页面都应该访问它们

    解决scheme :为此,我在Web应用程序的根目录中创build一个名为Global_Resources的文件夹,并为每个子文件夹存储全局文件,我们将其命名为“Local_Resources”

  • 问题:每个子系统/子文件夹/模块成员应覆盖其范围上的Global_Resources成员

    解决scheme :我为每个文件考虑了一个文件

应用结构

 root/ Global_Resources/ default.js default.fr.js UserManagementSystem/ Local_Resources/ default.js default.fr.js createUser.js Login.htm CreateUser.htm 

相应的文件代码:

Global_Resources / default.js

 var res = { Create : "Create", Update : "Save Changes", Delete : "Delete" }; 

Global_Resources / default.fr.js

 var res = { Create : "créer", Update : "Enregistrer les modifications", Delete : "effacer" }; 

所需语言的资源文件应加载到从Global_Resource中select的页面上 – 这应该是在所有页面上加载的第一个文件。

UserManagementSystem / Local_Resources / default.js

 res.Name = "Name"; res.UserName = "UserName"; res.Password = "Password"; 

UserManagementSystem / Local_Resources / default.fr.js

 res.Name = "nom"; res.UserName = "Nom d'utilisateur"; res.Password = "Mot de passe"; 

UserManagementSystem / Local_Resources / createUser.js

 // Override res.Create on Global_Resources/default.js res.Create = "Create User"; 

UserManagementSystem / Local_Resources / createUser.fr.js

 // Override Global_Resources/default.fr.js res.Create = "Créer un utilisateur"; 

manager.js文件 (这个文件应该是最后加载的)

 res.lang = "fr"; var globalResourcePath = "Global_Resources"; var resourceFiles = []; var currentFile = globalResourcePath + "\\default" + res.lang + ".js" ; if(!IsFileExist(currentFile)) currentFile = globalResourcePath + "\\default.js" ; if(!IsFileExist(currentFile)) throw new Exception("File Not Found"); resourceFiles.push(currentFile); // Push parent folder on folder into folder foreach(var folder in parent folder of current page) { currentFile = folder + "\\Local_Resource\\default." + res.lang + ".js"; if(!IsExist(currentFile)) currentFile = folder + "\\Local_Resource\\default.js"; if(!IsExist(currentFile)) throw new Exception("File Not Found"); resourceFiles.push(currentFile); } for(int i = 0; i < resourceFiles.length; i++) { Load.js(resourceFiles[i]); } // Get current page name var pageNameWithoutExtension = "SomePage"; currentFile = currentPageFolderPath + pageNameWithoutExtension + res.lang + ".js" ; if(!IsExist(currentFile)) currentFile = currentPageFolderPath + pageNameWithoutExtension + ".js" ; if(!IsExist(currentFile)) throw new Exception("File Not Found"); 

希望能帮助到你 :)

jQuery.i18n是一个轻量级的jQuery插件,用于在您的网页中实现国际化。 它允许您在“.properties”文件中打包自定义资源string,就像在Java资源包中一样。 它根据浏览器提供的语言或语言加载和parsing资源包(.properties)。

了解更多关于这个看看如何使用JQuery国际化您的网页?