簡體   English   中英

使用javascript和PhoneGap進行HTML5移動應用本地化

[英]HTML5 Mobile app localization using javascript and PhoneGap

我正在創建一個可在所有3個移動平台(Android,iOS a和Windows Mobile 8)上運行的HTML5移動應用程序。 我正在使用javascript進行本地化( https://github.com/eligrey/l10n.js/#readme )。

該應用程序在瀏覽器上正常工作。 但是當我在移動模擬器上部署它時,本地化不起作用。

我認為問題是javascript從瀏覽器獲取語言信息,但在移動設備中我們使用PhoneGap運行HTML5。

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

您可以編寫自己的JavaScript來獲取本地化語言。 這是我在其他地方寫的完全相同的回復。

通常,JavaScript window.navigator.language通常適用於iOS和更新的Androids,但早期版本的Android將其硬編碼為en

對於較舊的機器人,我建議從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('_', '-')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM