我正在使用 ember-i18n 库来翻译我的应用程序中使用的静态字符串。由于语言文件相当大,我不想在应用程序启动时加载所有可能的语言词典。因此,我想在用户选择更改语言时动态加载字典。我已经做了第一个实现,效果相当好。
See http://jsfiddle.net/cyclomarc/RYbNG/7/ 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');
}
});
我的问题:
这是重新加载 view.template 的最佳方法(转换到虚拟路由,然后激活转换到索引)吗?
有没有办法转换回您请求更改语言的路线(需要使用 get(path) 等)?
我还想翻译红色 div(应用程序出口)“外部”的字符串。我转换回索引,但在这种情况下,应用程序模板不会重新绘制...可能是什么原因?
当您离开模板然后重新输入模板时,模板本身会使用所有语言字符串进行重建,这是否是预期的行为,还是仅在同时更改语言时才出现这种情况?如何在控制台日志中跟踪这种使用新字符串重建模板的情况?
还有其他想法可以使其成为强大的交换解决方案吗?
我还没有在我的应用程序中进行翻译,但我计划这样做。所以我也有兴趣知道什么是最好的解决方案。我将描述我目前的想法,如何利用我目前的知识来做到这一点。
1)我将语言定义为顶级路线。
App.Router.map(function() {
this.resource('language', {path:'/language/:lang_code'}, function() {
// All other routes
});
});
然后更改语言将链接到带有相应语言代码的语言路径。为此,我还将使用属性代码、名称、标志等定义语言模型。当显示语言选择按钮或下拉列表列表时,这也很方便。
此外,在加载子路线模型时,您已经知道语言是什么,并且可以获取当前语言的模型(例如,考虑每种语言都不同的博客文章)。使用 this.modelFor('language') 获取任何子路由中的当前语言。
2)这很棘手。 AFAIK 没有公共 API 来获取包含所有动态段的当前 URL。应用程序控制器中有 currentPath 属性,但它不包含动态路由变量。还有一些 Ember 内部变量,但我不会使用它们,因为它们可能会改变。您还可以调查当前路由器 url:this.get('router.url')。您也可以绕过 ember 并使用 window.location.href 直接读取 URL。但我不会花太多时间在这上面。用户很少更改他们的语言(通常仅在第一次访问时),并且在语言更改时重定向到索引路由并不是一个大问题。我会将其存储在 cookie 或本地存储中,这样以后就不需要更改语言了。如果 Ember 提出了很好且简单的方法来做到这一点,那么您以后可以轻松地添加此功能。
3)我不会将任何内容放入应用程序模板中,因为它没有翻译。使用语言模板而不是应用程序模板,然后在切换语言时所有内容都应该重新呈现。
4)我认为文本不会自动更新,因为它们当前不是双向绑定的。但这很好,因为对所有文本进行两种方式绑定并不是一个好主意,因为它会使系统变慢。因此,只需将语言作为顶级路线,一切就应该正常工作:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)