cyc*_*arc 13 internationalization ember.js
我正在使用ember-i18n库来翻译我的应用程序中使用的静态字符串.由于语言文件相当大,我不想在应用程序启动时加载所有可能的语言词典.因此,我想在用户选择更改语言时动态加载字典.我做了第一个相当好的实现.
见http://jsfiddle.net/cyclomarc/RYbNG/7/
启动应用程序时,它以英语呈现.您现在可以选择其中一个视图("关于"或"信息"),这些视图也以英语呈现.当您单击"荷兰语"时,将加载荷兰语语言字典,并以正确的语言将应用程序重定向到索引路径.
似乎新的语言字符串仅在您转换到虚拟路径然后返回到您想要的路径时使用(在我的示例中,这始终是'索引').
updateLanguage: function (lang) {
var _self = this;
//Load correct dictionary and transition to index route
$.getScript("http://libraries.azurewebsites.net/locales/dictionary_" + lang + ".js", function () {
CLDR.defaultLanguage = lang;
_self.transitionToRoute('I18redirect');
});
}
App.I18redirectRoute = Ember.Route.extend({
activate: function () {
this.transitionTo('index');
}
});
Run Code Online (Sandbox Code Playgroud)
我的问题:
这是重新加载view.template(转换为虚拟路由然后激活转换到索引)的最佳方法吗?
有没有办法转换回您请求语言更改的路径(需要使用get(路径)左右的东西)?
我还想将字符串"外部"转换为红色div(应用程序插座).我转换回索引,但在这种情况下,应用程序模板没有重绘...可能是什么原因?
当你离开模板然后重新输入模板时,模板本身是用所有语言字符串重建的,或者只有在此期间语言被更改时才是预期的行为?如何在控制台日志中跟踪带有新字符串的模板重建?
还有什么其他想法可以使它成为一个强大的交换解
我还没有在我的应用程序中进行翻译,但我计划这样做。所以我也有兴趣知道什么是最好的解决方案。我将描述我目前的想法,我将如何利用我目前的知识来做到这一点。
1)我将语言定义为顶级路线。
App.Router.map(function() {
this.resource('language', {path:'/language/:lang_code'}, function() {
// All other routes
});
});
Run Code Online (Sandbox Code Playgroud)
然后更改语言将链接到带有相应语言代码的语言路径。为此,我还将使用属性代码、名称、标志等定义语言模型。当显示语言选择按钮或下拉列表列表时,这也很方便。
此外,在加载子路线模型时,您已经知道语言是什么,并且可以获取当前语言的模型(例如,考虑每种语言都不同的博客文章)。使用 this.modelFor('language') 获取任何子路由中的当前语言。
2)这很棘手。AFAIK 没有公共 API 来获取包含所有动态段的当前 URL。应用程序控制器中有 currentPath 属性,但它不包含动态路由变量。还有一些 Ember 内部变量,但我不会使用它们,因为它们可能会改变。您还可以调查当前路由器 url:this.get('router.url')。您也可以绕过 ember 并使用 window.location.href 直接读取 URL。但我不会花太多时间在这上面。用户很少更改他们的语言(通常仅在第一次访问时),并且在语言更改时重定向到索引路由并不是一个大问题。我会将其存储在 cookie 或本地存储中,这样以后就不需要更改语言了。如果 Ember 提出了很好且简单的方法来做到这一点,那么您以后可以轻松地添加此功能。
3)我不会将任何内容放入应用程序模板中,因为它没有翻译。使用语言模板而不是应用程序模板,然后在切换语言时所有内容都应该重新呈现。
4)我认为文本不会自动更新,因为它们当前不是双向绑定的。但这很好,因为对所有文本进行两种方式绑定并不是一个好主意,因为它会使系统变慢。因此,只需将语言作为顶级路线,一切就应该正常工作:)