HTML5移动应用程序本地化使用javascript和PhoneGap

HTML5 Mobile app localization using javascript and PhoneGap

本文关键字:javascript PhoneGap 移动 应用程序 本地化 HTML5      更新时间:2023-09-26

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

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

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

有没有什么方法可以让我在PhoeGap中使用javascript实现本地化。

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

一般来说,JavaScript window.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,效果很好。

我刚刚解决了同样的问题,为每个平台创建了一个自定义的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;
        }
    }
});

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

l10n(或者在我的例子中,globalize.js)使用连字符来分隔语言和国家/地区-因此找不到匹配的区域性,它会出现默认的回退。

在你的应用程序中放一个console.log来转储你得到的区域设置字符串,然后转到控制台,用adb logcat检查你的设备上是否存在这种情况。然后简单地修改字符串以允许匹配(例如locale.value.replace('_', '-')