Javascript 字符串和标签本地化和全球化的最佳实践
我是一个拥有20多名开发人员的团队的成员。每个开发人员处理一个单独的模块(大约10个模块)。在每个模块中,我们可能至少有50个CRUD表单,这意味着我们目前有近500个添加按钮、保存按钮、编辑按钮等 然而,因为我们想要全球化我们的应用程序,我们需要能够翻译应用程序中的文本。例如,对于法国用户来说,无论在哪里,add这个词都应该变成ajouter 到目前为止,我们所做的是,对于UI或表示层中的每个视图,我们都有一个键/值对翻译的字典。然后,在呈现视图时,我们使用该词典翻译所需的文本和字符串。然而,通过这种方法,我们在500本字典中找到了接近500本的add。这意味着我们违反了原则 另一方面,如果我们将公共字符串集中化,比如将添加到一个地方,并要求开发人员在任何地方都使用它,那么我们就会遇到无法确定字符串是否已在集中字典中定义的问题 另一个选择可能是没有翻译词典,使用在线翻译服务,如谷歌翻译、必应翻译等 我们遇到的另一个问题是,一些承受按时交付项目压力的开发人员无法记住翻译键。例如,对于添加按钮的文本,一个开发人员使用了add,而另一个开发人员使用了new,等等Javascript 字符串和标签本地化和全球化的最佳实践,javascript,localization,translation,client-side,globalization,Javascript,Localization,Translation,Client Side,Globalization,我是一个拥有20多名开发人员的团队的成员。每个开发人员处理一个单独的模块(大约10个模块)。在每个模块中,我们可能至少有50个CRUD表单,这意味着我们目前有近500个添加按钮、保存按钮、编辑按钮等 然而,因为我们想要全球化我们的应用程序,我们需要能够翻译应用程序中的文本。例如,对于法国用户来说,无论在哪里,add这个词都应该变成ajouter 到目前为止,我们所做的是,对于UI或表示层中的每个视图,我们都有一个键/值对翻译的字典。然后,在呈现视图时,我们使用该词典翻译所需的文本和字符串。然而,
什么是应用程序字符串资源全球化和本地化的最佳实践或最著名的方法?jQuery。i18n是一个轻量级jQuery插件,用于在网页中实现国际化。它允许您在“.properties”文件中打包自定义资源字符串,就像在Java资源包中一样。它根据提供的语言或浏览器报告的语言加载和解析资源束(.properties)
要了解更多信息,请查看,据我所知,有一个名为
localeplanet
的库,用于JavaScript的本地化和国际化。此外,我认为它是本机的,不依赖于其他库(例如jQuery)
这是图书馆的网站:
另外,看看Mozilla的这篇文章,您可以找到非常好的客户端翻译方法和算法:
所有这些文章/库的共同之处在于,它们使用i18n
类和get
方法(在某些方面,还定义了一个较小的函数名,如
)来检索键
并将其转换为值。在我的解释中,键
表示要翻译的字符串,值
表示翻译的字符串。
然后,您只需要一个JSON文档来存储键和值
例如:
var _ = document.webL10n.get;
alert(_('test'));
这里是JSON:
{ test: "blah blah" }
我相信使用当前流行的库解决方案是一个很好的方法
当你面临一个需要解决的问题时(坦白说,谁不是
如今,我们电脑人通常采取的基本策略是什么
被称为“分而治之”。它是这样的:
- 将特定问题概念化为一组较小的子问题
- 解决每个小问题
- 将结果合并为特定问题的解决方案李>
但“分而治之”并不是唯一可能的战略。我们还可以采取更通才的方法:
- 将特定问题概念化为更一般问题的特例
- 以某种方式解决一般问题
- 使一般问题的解决方案适应具体问题
-Eric Lippert
我相信在服务器端语言(如ASP.Net/C)中已经存在许多解决此问题的方法
我已经概述了这个问题的一些主要方面
- 问题:我们只需要加载所需语言的数据
解决方案:为此,我们将每种语言的数据保存到单独的文件中
例如res.de.js、res.fr.js、res.en.js、res.js(默认语言)
- 问题:每个页面的资源文件应该分开,以便我们只获取所需的数据
解决方案:我们可以使用一些已经存在的工具,如
- 问题:我们需要一个键/值对结构来保存数据
解决方案:我建议使用javascript对象,而不是字符串/string air。
我们可以从IDE的intellisense中获益
- 问题:一般成员应存储在公共文件中,所有页面都应访问它们
解决方案:为此,我在web应用程序的根目录中创建了一个名为“全局\u资源”的文件夹,以及一个用于存储每个子文件夹的全局文件的文件夹,我们将其命名为“本地\u资源”
- 问题:每个子系统/子文件夹/模块成员应覆盖其作用域上的全局_资源成员
解决方案:我考虑为每个
应用程序结构
文件的相应代码:
Global\u Resources/default.js
var res = {
Create : "Create",
Update : "Save Changes",
Delete : "Delete"
};
var res = {
Create : "créer",
Update : "Enregistrer les modifications",
Delete : "effacer"
};
res.Name = "Name";
res.UserName = "UserName";
res.Password = "Password";
res.Name = "nom";
res.UserName = "Nom d'utilisateur";
res.Password = "Mot de passe";
// Override res.Create on Global_Resources/default.js
res.Create = "Create User";
// Override Global_Resources/default.fr.js
res.Create = "Créer un utilisateur";
Global\u Resources/default.fr.js
var res = {
Create : "Create",
Update : "Save Changes",
Delete : "Delete"
};
var res = {
Create : "créer",
Update : "Enregistrer les modifications",
Delete : "effacer"
};
res.Name = "Name";
res.UserName = "UserName";
res.Password = "Password";
res.Name = "nom";
res.UserName = "Nom d'utilisateur";
res.Password = "Mot de passe";
// Override res.Create on Global_Resources/default.js
res.Create = "Create User";
// Override Global_Resources/default.fr.js
res.Create = "Créer un utilisateur";
所需语言的资源文件应加载到从全局_资源选择的页面上-这应是所有页面上加载的第一个文件
UserManagementSystem/Local\u Resources/default.js
var res = {
Create : "Create",
Update : "Save Changes",
Delete : "Delete"
};
var res = {
Create : "créer",
Update : "Enregistrer les modifications",
Delete : "effacer"
};
res.Name = "Name";
res.UserName = "UserName";
res.Password = "Password";
res.Name = "nom";
res.UserName = "Nom d'utilisateur";
res.Password = "Mot de passe";
// Override res.Create on Global_Resources/default.js
res.Create = "Create User";
// Override Global_Resources/default.fr.js
res.Create = "Créer un utilisateur";
UserManagementSystem/Local\u Resources/default.fr.js
var res = {
Create : "Create",
Update : "Save Changes",
Delete : "Delete"
};
var res = {
Create : "créer",
Update : "Enregistrer les modifications",
Delete : "effacer"
};
res.Name = "Name";
res.UserName = "UserName";
res.Password = "Password";
res.Name = "nom";
res.UserName = "Nom d'utilisateur";
res.Password = "Mot de passe";
// Override res.Create on Global_Resources/default.js
res.Create = "Create User";
// Override Global_Resources/default.fr.js
res.Create = "Créer un utilisateur";
用户管理系统