【问题标题】:How can I get device Locale or Language with PhoneGap Build?如何使用 PhoneGap Build 获取设备区域设置或语言?
【发布时间】:2014-10-01 20:27:16
【问题描述】:

我正在使用 Phonegap Build 开发适用于 iOS 和 Android 的应用程序。

我想确定设备的语言环境(例如“en-US”),但我会满足于当前的语言设置,甚至是我的应用程序安装的应用商店(这是漫长的一天)。

按照全球化插件的说明here,我认为我一切正常,但在我用于测试的 iPhone 6 或三星 Galaxy Nexus 上似乎没有任何效果。

我的 config.xml 的相关部分如下所示:

<gap:plugin name="org.apache.cordova.globalization" />

我从插件中获取语言环境的函数如下所示:

var getPhoneGapLocaleName = function() {
    var loc = 'unknown';

    if (navigator.globalization !== undefined) {
        navigator.globalization.getLocaleName(
            function (locale) {
                if (locale !== undefined) {
                        loc = locale.value;
                }
            },
            function () {
                // nothing
            }
        );
    }

    return loc;
};

注意:在两个设备上 navigator.globalization.getLocaleName 都存在并且看起来是正确的,评估为类似于我根据文档所期望的函数。

【问题讨论】:

    标签: android ios cordova phonegap-plugins globalization


    【解决方案1】:

    这里的问题是变量'loc'被声明在成功或失败回调的范围之外,这当然会在片刻之后发生。

    我通过改变函数来解决这个问题:

    var refreshPhoneGapLocaleName = function() {
        if (navigator.globalization !== undefined) {
            navigator.globalization.getLocaleName(
                function (locale) {
                    if (locale !== undefined) {
                        localStorage['pg.locale'] = locale.value;
                    }
                },
                function () {
                    // nothing
                }
            );
        }
    };
    

    现在在 onDeviceReady 中调用它,以便在应用启动时刷新值。

    稍后(不是立即)以下函数可用于检索语言环境值:

    var getLocale = function() {
        return localStorage['pg.locale']();
    };
    

    StackOverflow 最棒的地方在于它帮助人们解决自己的愚蠢错误的频率。 :)

    【讨论】:

      【解决方案2】:

      虽然之前的答案返回了预期的结果,并提供了检索当前 phonegap 语言环境名称的选项,但他们没有解释主题启动器为什么他的功能不起作用,以及如何调整他的功能以工作他想要的方式(即不使用 localStorage 并且不在控制台中显示语言环境,而是实时给出答案)

      我发布此答案是因为我正在寻找一种快速获取设备语言环境的功能,而这篇文章是我的第一个结果。虽然开篇文章给了我所需的一切,但我想以与我相同的目的为未来的访客回答这个问题。很抱歉在这么老的话题上发帖,但我希望我的回答能帮助其他人。

      topic starter的功能不起作用的原因如下:插件以异步方式返回locale。因此,loc =locale.value 行仅在函数的 return 语句之后执行。为了解决这个问题,我们可以编写一个包装函数来简化插件输出,如下所示。请记住,我们需要异步使用此函数,因为插件结果也是异步的。

      功能:

      var getPhoneGapLocaleName = function ( callback ) {
          var unknownLocation = 'unknown'; //Default value
          if ( navigator.globalization !== undefined ) {
              navigator.globalization.getLocaleName(
                  function ( locale ) {
                      if ( locale !== undefined ) {
                          callback( locale.value );
                      } else {
                          callback( unknownLocation );
                      }
                  },
                  function () {
                      callback( unknownLocation );
                  }
              );
          } else {
              callback( unknownLocation );
          }
      };
      

      像这样使用函数:

      getPhoneGapLocaleName( function( loc ){ console.log( 'The locale was set as follows: ' + loc ); } );
      

      【讨论】:

        【解决方案3】:

        试试这个代码

        当浏览器设置为 en_US 语言环境时,这应该会显示一个弹出对话框,其文本语言为:English:

        navigator.globalization.getPreferredLanguage(

        function (language) {alert('language: ' + language.value + '\n');},
        function () {alert('Error getting language\n');}
        

        );

        完整示例

        <!DOCTYPE HTML>
        <html>
          <head>
            <title>getPreferredLanguage Example</title>
            <script type="text/javascript" charset="utf-8" src="cordova.js"></script>
            <script type="text/javascript" charset="utf-8">
        
            function checkLanguage() {
              navigator.globalization.getPreferredLanguage(
                function (language) {alert('language: ' + language.value + '\n');},
                function () {alert('Error getting language\n');}
              );
            }
            </script>
          </head>
          <body>
            <button onclick="checkLanguage()">Click for language</button>
          </body>
        </html> 

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-05
          • 1970-01-01
          • 2014-06-14
          • 1970-01-01
          • 1970-01-01
          • 2013-01-01
          • 1970-01-01
          相关资源
          最近更新 更多