字符串和标签的本地化和全球化的最佳实践

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

然而,因为我们想要使我们的应用程序全球化,所以我们需要能够在我们的应用程序中翻译文本。例如,在任何地方,对于法语用户来说,单词 都应该变成 加快速度

到目前为止,我们所做的是,对于 UI 或表示层中的每个视图,我们都有一个关键字/值对转换的字典。然后,在呈现视图时,我们使用这个字典翻译所需的文本和字符串。然而,通过这种方法,我们已经在500个字典中拥有了接近500个 。这意味着我们违反了 DRY 的原则。

另一方面,如果我们将常见的字符串集中起来,比如将 放在一个地方,并要求开发人员在任何地方都使用它,我们就会遇到这样的问题: 不确定一个字符串是否已经在集中的字典中定义好了。

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

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

对于应用程序的字符串资源的全球化和本地化,什么是最佳实践或最著名的方法?

135349 次浏览

I18n 是一个轻量级的 jQuery 插件,用于在网页中实现国际化。它允许您将自定义资源字符串打包到。属性的文件,就像在 Java 资源包中一样。它加载和解析资源包(。属性)。

想了解更多,请看 如何使用 JQuery 使页面国际化?

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

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

还可以看看 Mozilla 的这篇文章,您可以找到非常好的客户端翻译方法和算法: http://blog.mozilla.org/webdev/2011/10/06/i18njs-internationalize-your-javascript-with-a-little-help-from-json-and-the-server/

所有这些文章/库的共同之处在于,它们使用 i18n类和 get方法(在某些方面还定义了一个更小的函数名,比如 _)来检索/转换 keyvalue。在我的解释中,key表示你想翻译的字符串,而 value表示已翻译的字符串。
然后,您只需要一个 JSON 文档来存储 keyvalue

例如:

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

这里是 JSON:

{ test: "blah blah" }

我相信使用当前流行的库解决方案是一种很好的方法。

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

  • 将具体问题概念化为一组较小的子问题。
  • 解决每一个小问题。
  • 将结果合并到特定问题的解决方案中。

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

  • 将具体问题概念化为更一般问题的特例。
  • 想办法解决一般问题。
  • 使一般问题的解决方案适应具体问题。

埃里克 · 利伯特

我相信在诸如 ASP.Net/C # 这样的服务器端语言中已经存在许多解决这个问题的方案。

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

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

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

例如 res.de.js,res.fr.js,res.en.js,res.js (默认语言)

申请结构

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 中选择的页面上——这应该是第一个加载到所有页面上的文件。

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";

Js file (这个文件应该最后加载)

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");

希望对你有所帮助:)