2013-02-14 57 views
5

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

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

我認爲問題在於JavaScript從瀏覽器獲取語言信息,但在移動設備上我們使用PhoneGap運行HTML5。

有沒有什麼辦法可以讓我在PhoeGap中使用javascript進行本地化。

+3

如果您使用的是Phonegap,請確保您通過[globalization.getLocaleName()](http://docs.phoneLauncherName.com/)閱讀文化.0/cordova_globalization_globalization.md.html#globalization.getLocaleName)或'globalization.getPreferredLanguage()'和__not__瀏覽器的導航器對象,在我的經驗中,它總是設置爲「en」。另請參閱我的帖子,關於連字符/下劃線匹配陷阱 – Philzen 2013-05-10 16:49:43

+0

看看這裏:https://github.com/EffEPi/localize – Fabrizio 2014-09-12 01:00:11

回答

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; 
     } 
    } 
}); 
3

您可以編寫自己的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]; 
} 

這裏,郎鹹平也可能包含國家代碼(例如,「EN-IE」),所以你可能需要刪除也:

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

這是我在最近使用過應用程序,使用HTML5和PhoneGap,它工作正常。

+0

在我的Android 4.4.4'window.navigator.language'上產生'zz-ZZ'。 – 2015-05-01 10:18:21

1

有本地化一個常見的錯誤,也許這是你的問題:
許多設備在de_DE形式報告的語言環境,en_GB ,等... - 請注意下劃線

本地化(或在我的情況,globalize.js)使用連字符分離語言和國家 - 因此沒有匹配的文化被發現,它與默認的備用上來。

console.log放入您的應用程序中以轉儲您所獲得的區域設置字符串,然後轉到控制檯,並檢查adb logcat設備上是否出現這種情況。然後,簡單地修改字符串以允許匹配(例如locale.value.replace('_', '-')

相關問題