5

我正在创建一个在所有 3 个移动平台(Android、iOS a、d Windows Mobile 8)上运行的 HTML5 移动应用程序。我正在使用 javascript 进行本地化(https://github.com/eligrey/l10n.js/#readme)。

该应用程序在浏览器上运行良好。但是当我在移动模拟器上部署它时,本地化不起作用。

我认为问题在于 javascript 从浏览器获取语言信息,但在移动设备中,我们使用 PhoneGap 运行 HTML5。

有什么方法可以在 PhoeGap 中使用 javascript 启用本地化。

4

3 回答 3

3

您可以编写自己的 JavaScript 来获取本地化语言。这是我在其他地方写的完全相同的回复。

一般来说,JavaScriptwindow.navigator.language通常适用于 iOS 和更新的 Android,但早期版本的 Android 已将其硬编码为en.

对于较旧的 Android,我建议从 UserAgent 字符串中提取语言参数(是的嗅探!),例如

if (navigator && navigator.userAgent && (androidLang = navigator.userAgent.match(/android.*\W(\w\w)-(\w\w)\W/i))) {
   lang = androidLang[1];
}

在这里, lang 可能还包含国家代码(例如“en-IE”),因此您可能还必须删除它:

if (lang.indexOf('-') != -1) lang = lang.substring(0, lang.indexOf('-'));

这是我在最近的应用程序中使用的,使用 HTML5 和 PhoneGap,它运行良好。

于 2013-02-14T08:33:48.513 回答
2

我刚刚通过为每个仅返回用户当前语言环境的平台创建自定义 PhoneGap 插件解决了同样的问题。

例如,在 Android 上,插件只检查:

var message = Locale.getDefault().getLanguage();

然后在 Javascript 方面,当您获得该语言名称时,例如。en,您将使用它以该语言命名的 JSON 对象。JSON 对象的示例如下所示:

MyApp.Language = en: {
    'Player'  : 'Player',
    'Players' : 'Players',
    'Not Set' : 'Not Set'
},
fi: {
    'Player'  : 'Pelaaja',
    'Players' : 'Pelaajat',
    'Not Set' : 'Ei määritetty'
}

Android的插件很简单:

JS文件

window.localizeMe = {
    getDefaultLocale: function( callback ) {
        cordova.exec(
            callback,
            function(err) {
                callback( 'Error: ' + err.code );
            },
            "LocalizeMe",
            "getDefaultLocale",
            []);
    }
}

Java 文件

public class LocalizeMe extends CordovaPlugin {
    @Override
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
        if (action.equals("getDefaultLocale")) {
            String message = Locale.getDefault().getLanguage();
            this.getDefaultLocale(message, callbackContext);
            return true;
        }
        return false;
    }

    private void getDefaultLocale(String message, CallbackContext callbackContext) {
        if (message != null && message.length() > 0) { 
            callbackContext.success(message);
        } else {
            callbackContext.error("Expected one non-empty string argument.");
        }
    }

}

最后,在您的主 JS 文件中,设置应用程序的语言:

window.localizeMe.getDefaultLocale( function( result ) {
    if ( result != null && result.length > 0 ) {
        if ( result.toLowerCase().indexOf( 'fi' ) !== -1 ) {
            MyApp.Lang = MyApp.Language.fi;
        } else {
            MyApp.Lang = MyApp.Language.en;
        }
    }
});
于 2013-02-14T08:42:17.510 回答
1

本地化有一个常见的陷阱,也许这是您的问题:许多设备以,等
形式报告语言环境- 请注意下划线de_DEen_GB

l10n (或者在我的情况下,globalize.js)使用连字符来分隔语言和国家 - 因此没有找到匹配的文化并且它提供了默认的后备。

在您的应用程序中放置一个console.log以转储您正在获取的语言环境字符串,然后转到控制台并检查adb logcat您的设备上是否可能出现这种情况。然后只需修改字符串以允许匹配(例如locale.value.replace('_', '-')

于 2013-04-14T21:16:55.527 回答