I took an approach to this problem that allows others to contribute language translations for my application.
优点:
- 使用“网络成熟”的库
- 众包翻译
- 没有原生黑客攻击
- 使用模板
- 非常容易实现 HTML/JS 并且易于测试
- 支持语言检测
- 支持文本方向 (BiDi)
- 完全没有原生依赖,因此可以在 Android/iOS/BB/WP yada yada..
- 可在网络浏览器中测试
缺点:
- 您的项目需要开源并满足 TranslateWiki 的要求
- 如果您来自分支/合并世界,实现对 Gerrit 的提交会有点棘手。
我使用handlebars 进行模板化,使用html10n 库提供翻译逻辑,翻译后的字符串来自社区贡献的json 文件。
TranslateWiki 通过众包的力量提供实际的翻译。我实现的大部分繁重工作由 TranslateWiki 完成,这是一个来自 Wiki Media Foundation 的免费开源社区服务。
Handlebars 和 html10n 库功能强大,专为 Web 构建并被广泛使用。它们被证明是非常有用的库。
不需要本机代码或插件。
index.html
<head>
<script type="text/javascript" src="js/handlebars.js"></script>
<script type="text/javascript" src="js/html10n.js"></script>
<link rel="localizations" type="application/l10n+json" href="locales.json">
</head>
<body>
{{html10n "helloWorld"}}
</body>
locales.json
{
"fr":"locales/fr.json",
"en":"locales/en.json"
}
locales/en.json
{
"en":{
"helloWorld":"Hello Cruel World"
}
}
locales/fr.json
{
"fr":{
"helloWorld":"Hello Baguette World"
}
}
index.js
Handlebars.registerHelper('html10n', function(str,a){
return (html10n != undefined ? html10n.get(str) : str);
});
要在语言之间切换,请打开浏览器的 javascript 控制台并输入
html10n.localize("fr");
进行浏览器语言检测需要一些额外的逻辑,我使用 Etherpad 的实现来完成。
var language = document.cookie.match(/language=((\w{2,3})(-\w+)?)/);
if(language) language = language[1];
html10n.bind('indexed', function() {
html10n.localize([language, navigator.language, navigator.userLanguage, 'en'])
})
html10n.bind('localized', function() {
document.documentElement.lang = html10n.getLanguage()
document.documentElement.dir = html10n.getDirection()
// Then I display the index page using handlebars to render a template.
});
就是这样,在您的 Cordova 应用程序中推出 i18n 的免破解秘诀。