我使用
RequireJS i18n plugin将翻译加载到我的应用程序中.我正在努力解决用户首选语言的运行时确定问题.
如果您使用navigator.language来确定用户的首选语言,该插件可以很好地工作,但在我的应用程序中,用户的语言保存在服务器上的数据库中.所以我需要在运行时设置语言环境:
require.config({ config: { i18n: { locale: userLocale } } });
所以我需要的是在RequireJS加载我的应用程序之前设置userLocale的一种聪明的方法.有谁知道最好的方法是什么?可能性包括:
1)以非AMD方式在我的应用程序之外设置userLocale:
//run Ajax call to determine user's localization preferencess var Localization = Localization || getUserLocalization(); //and then... require.config({ config: { i18n: { locale: Localization.userLocale } } }); require(['app']);
这让我有点难过,因为这意味着我的一些应用程序将在RequireJS之外,因此不整洁.它还意味着所有用户的本地化设置(语言时区,日期格式,数字格式)将保存在全局命名空间中.
2)单独的require调用以检索本地化设置
我不确定这是如何工作的,但也许:
var Localization = require(['localization']); require.config({ config: { i18n: { locale: Localization.userLocale } } }); require(['app']);
也许由于异步性,这不起作用?此外,应用程序无法访问Localization对象,因此仍需要将其存储为全局变量.
解决方法
经过大量研究后,解决此问题的最佳方法是检查localStorage的区域设置值.如果还没有设置,我使用虚拟语言加载应用程序:
var locale = localStorage.getItem('locale') || 'dummy'; require.config({ config: { i18n: { locale: locale } } }); require(['app']);
我使用一种名为dummy的语言,设置为我的nls文件中的空对象.使用虚拟而不是默认,意味着我不必猜测用户的语言可能是什么,并可能强迫他们以错误的语言下载大量翻译:
define({ "root": false,"dummy": {},//dummy language with no translations if user language is unknown "fr": true,"en": true,"en-uk": true,"fr-fr": true });
然后,当应用程序加载并且用户已登录时,我使用服务调用查询数据库,在localStorage中设置语言并使用location.reload()重新加载应用程序:
//retrieve user object (including preferred locale) from service call user = getUserObject(userId); locale = localStorage.getItem('locale'); if (!locale || locale !== user.locale) { localStorage.setItem('locale',user.locale); //reload the app location.reload(); }