2013-02-14 5 views
5

3つのモバイルプラットフォーム(Android、iOS、Windows Mobile 8)で動作するHTML5モバイルアプリを作成しています。私はローカライズのためにjavascriptを使用しています(https://github.com/eligrey/l10n.js/#readme)。javascriptとPhoneGapを使用したHTML5モバイルアプリのローカライゼーション

アプリはブラウザで正常に動作します。しかし、モバイルエミュレータに展開すると、ローカライゼーションは機能しません。

javascriptはブラウザから言語情報を取得することが問題だと思いますが、携帯電話ではPhoneGapを使用してHTML5を実行します。

PhoeGapでjavascriptを使用してローカリゼーションを有効にする方法はありますか?

+3

Phonegapを使用している場合は、[globalization.getLocaleName()](http://docs.phonegap.com/en/2.2)でカルチャを読んでいることを確認してください。 .0/cordova_globalization_globalization.md.html#globalization.getLocaleName)または 'globalization.getPreferredLanguage()'とブラウザのナビゲータオブジェクトを__not__すると、これは私の経験に合わせてアンドロイド上で常に "en"に設定されます。また、ハイフン/アンダースコア一致の落とし穴に関する私の投稿を参照してください – Philzen

+0

ここで見て:https://github.com/EffEPi/localize – Fabrizio

答えて

2

私は、ユーザーの現在のロケールだけを返すプラットフォームごとにカスタムPhoneGapプラグインを作成することで、同じ種類の問題を解決しました。

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

をして、Javascriptの側で、あなたが戻って、その言語名を持っているとき、例えば:

例えば、Android上で、プラグインはのみチェックします。 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]; 
} 

、langは、国コードが含まれているかもしれません(例えば「エンIE」)ので、あなたもそれを削除する必要があります:これは私が最近に使用してきたものです

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

アプリ、HTML5とPhoneGapを使用して、それは正常に動作します。

+0

私のAndroid 4.4.4で 'window.navigator.language'は' zz-ZZ'を生成します。 –

1

局在化と一つの共通の落とし穴がありますが、多分これはあなたの問題である:
多くのデバイスはen_GBde_DEの形でロケールを報告します等... - の下線に注意してください。

L10N(または私の場合には、globalize.jsは)別々の言語と国にハイフンを使用する - ため、一致する文化が見つかりません、それはデフォルトのフォールバックを思い付くています。

アプリケーションにconsole.logを入れて、取得しているロケール文字列をダンプしてから、コンソールにアクセスしてadb logcatでデバイスに問題がないかどうかを確認してください。次に、一致するように文字列を変更するだけです(locale.value.replace('_', '-')

関連する問題