【问题标题】:Serving a language file depending on language preference settings根据语言首选项设置提供语言文件
【发布时间】:2013-08-19 07:20:41
【问题描述】:

在我的 ember 应用程序中,我支持不同的语言。我是这样做的:

这是index.html的一部分:

<script src="scripts/vendor/ember.js"></script>
<script src="scripts/vendor/ember-i18n.js"></script>
...
<script>window.mynamespace = {};</script>
<script src="scripts/languages/en.js"></script>
<script src="scripts/ember_application.js"></script>

在我的languages/es.js 中,我按照ember-i18n 的预期配置了一个翻译对象:

var lang = {
    key1 : 'Translation1',
    ...
};
window.mynamespace.lang = lang;

现在在我的 Ember 应用程序中,我可以这样做:

Ember.I18n.translations = window.mynamespace.lang;
var App = Ember.Application.createWithMixins({...});

我有三个问题:

  1. 是否有另一种提供多语言页面的方法?具体来说,我不太喜欢window.mynamespace 的使用,但我不知道在创建我的 ember 应用程序之前如何共享这些设置。
  2. 如何根据浏览器中的语言首选项设置(通过 HTTP 请求)提供不同的语言文件,例如 scripts/languages/es.js
  3. 而这个更难:如何根据数据库设置(属于我的应用程序的用户配置文件)提供不同的语言文件?此设置将覆盖 HTTP 请求中的*语言首选项设置。

【问题讨论】:

    标签: javascript ember.js internationalization


    【解决方案1】:

    我这样做的方法是保留几个单独的语言文件,找出浏览器的语言设置,然后加载适当的文件。这是我正在使用的功能(很可能并不完美,但它可以满足您的期望):

    function loadLanguage() {
        "use strict";
        if (window.navigator.language) {
            LocalLanguage = window.navigator.language;
        } else if (window.navigator.userLanguage) {
            LocalLanguage = window.navigator.userLanguage;
        } else {
            LocalLanguage = "en";
        }
    
        var fileref = document.createElement('script');
        fileref.setAttribute("type", "text/javascript");
    
        switch (LocalLanguage) {
        case "cs-CZ":
        case "cs":
            LocalLanguage = "cs";
            fileref.setAttribute("src", "Language/cz-CZ.js");
            document.getElementsByTagName("head")[0].appendChild(fileref);
            break;
        default:
            LocalLanguage = "";
            fileref.setAttribute("src", "Language/en-EN.js");
            document.getElementsByTagName("head")[0].appendChild(fileref);
            break;
        }
    }
    

    LocalLanguage 是一个全局变量,无论使用何种浏览器,我都可以快速找出语言设置。

    问题 3: 至于根据数据库中的设置提供不同的文件,实际上这听起来相当简单 - 在您的代码中,您必须决定要使用哪种本地化。只需检查是否有用户定义的本地化(将其存储在某处,或最初将语言首选项设置为“无”或数据库中的其他内容,然后检查用户是否已更改,任何类似的内容)以及用户是否定义了本地化,只需跳过检查浏览器语言设置的整个过程,只需获取数据库中设置的值即可。

    【讨论】:

    • 谢谢,非常有趣。您能否也发布您的index.html 的相关部分?我不确定仅通过查看此功能如何共同发挥作用。例如:您是加载所有语言文件,然后选择一个,还是只加载活动语言?您是先加载 ember,还是稍后加载? ...
    • @gonvaled:我的解决方案实际上并不需要在 HTML 中出现——它是完全由 JS 驱动的项目的一部分。我也根本不使用 ember.js。基本上,该功能所做的只是找出浏览器的本地化设置,然后基于此,将适当的脚本文件附加到 HTML 的 中。所有语言文件都需要具有相同的格式和变量才能使该解决方案正常工作(它们没有,但您最终会得到很多 undefined-s)。好处是,最终,浏览器中只会加载一种语言文件。下行用户无法更改语言。
    • 关于问题 3。我不确定我是否可以在处理 HEAD 时完成所有这些操作并返回所需的语言,但我会进行调查。谢谢。
    • @gonvaled :哦,请记住,IE 使用不同的变量来存储本地化设置(IE:window.navigator.userLanguage,世界其他地方:window.navigator.language),以及为了让事情变得更糟,至少对于 cz 本地化来说,IE 给了我“cs-CZ”的值,而 FireFox 只是“cs”,这就是为什么我必须同时检查两者。
    • @gonvaled :好吧,如果从数据库中异步获取数据的速度存在问题,您始终可以根据浏览器设置加载数据,等待服务器响应,然后重新加载页面包含的用户数据。或者做一个“获取您的数据,可能需要 3 分钟到 5 天”加载栏:-P
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 2013-10-30
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    相关资源
    最近更新 更多