2012-10-16 5 views
69

私のアプリがスペイン語、ポルトガル語の3言語をサポートするようにします&英語。アプリで言語を選択するオプションを提供します。ユーザーが言語を選択したときにアプリの言語を変更するにはどうすればよいですか?

1)3つのドロウアブルフォルダドロアブル、ドロアブル、pt、ドロウアブル。

2)3つの値のフォルダ値-es、values-pt、values.Change言語に応じた値。

言語を選択する画像ビューがあります。クリックすると、英語、スペイン語、ポルトガル語のオプションで構成されるメニューが開きます。

私はManifest- アンドロイドに宣言している

public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case R.id.en: 
      Locale locale = new Locale("en"); 
      Locale.setDefault(locale); 
      Configuration config = new Configuration(); 
      config.locale = locale; 
      getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 
      Toast.makeText(this, "Locale in English !", Toast.LENGTH_LONG).show(); 
      break; 

     case R.id.pt: 
      Locale locale2 = new Locale("pt"); 
      Locale.setDefault(locale2); 
      Configuration config2 = new Configuration(); 
      config2.locale = locale2; 
      getBaseContext().getResources().updateConfiguration(config2, getBaseContext().getResources().getDisplayMetrics()); 

      Toast.makeText(this, "Locale in Portugal !", Toast.LENGTH_LONG).show(); 
      break; 

     case R.id.es: 
      Locale locale3 = new Locale("es"); 
      Locale.setDefault(locale3); 
      Configuration config3 = new Configuration(); 
      config3.locale = locale3; 
      getBaseContext().getResources().updateConfiguration(config3, getBaseContext().getResources().getDisplayMetrics()); 

      Toast.makeText(this, "Locale in Spain !", Toast.LENGTH_LONG).show(); 
      break; 


    } 
     return super.onOptionsItemSelected(item); 
} 

このコードによりオプション選択でアプリ内のロケールを設定します。それは仕事configChangesは=「ロケール」

が、それはいくつかの問題があります。

問題: - 言語選択の画像で構成された言語が選択

1)、画面は変化しないが、他の画面が変更されています。

2)オリエンテーション変更後、携帯電話のロケールに応じて言語を復元します。

+0

追加: 'アンドロイド:AndroidManifest.xmlを –

+0

内部のあなたの活動のためのconfigChanges =「ロケール」'私はすでに私のマニフェストにすべてのactivitiyに追加しています。 – mukesh

+0

言語リスト、設定画面の設定を提供する次のライブラリを使用して、アプリケーションの言語を上書きすることができます:https://github.com/delight-im/Android-Languages – caw

答えて

127

それは、ウェブページのための抜粋です:http://android.programmerguru.com/android-localization-at-runtime/

それは、ユーザーに応じてアプリの言語を変更するのは簡単だが言語のリストからそれを選択します。ロケールを文字列(英語の場合は「en」、ヒンディー語の場合は「hi」など)として受け付け、アプリケーションのロケールを設定し、現在のアクティビティをリフレッシュして言語の変更を反映させる、以下のようなメソッドを用意します。適用したロケールは、手動で再度変更するまで変更されません。

public void setLocale(String lang) { 
    Locale myLocale = new Locale(lang); 
    Resources res = getResources(); 
    DisplayMetrics dm = res.getDisplayMetrics(); 
    Configuration conf = res.getConfiguration(); 
    conf.locale = myLocale; 
    res.updateConfiguration(conf, dm); 
    Intent refresh = new Intent(this, AndroidLocalize.class); 
    startActivity(refresh); 
    finish(); 
} 

必ず以下のパッケージインポート:

import java.util.Locale; 
import android.os.Bundle; 
import android.app.Activity; 
import android.content.Intent; 
import android.content.res.Configuration; 
import android.content.res.Resources; 
import android.util.DisplayMetrics; 

が活動アンドロイドにマニフェストに追加します。configChanges = |あなたはどちらか、マニフェストからandroid:configChanges="locale"を削除する必要があります "ロケールの向き"

+2

確かです。私はウェブページの抜粋を提供することができます。私が提供する必要があるところで私に教えてください。ありがとう。 – Udhay

+2

+1は抜粋を提供します。 –

+0

あなたのための追加情報として、私のAVDがエラーになりました。そこで私は 'Intent refresh = new Intent(this、AndroidLocalize.class);を削除しました。 startActivity(refresh); 'それを' onSharedPreferenceChange'メソッドに入れました。単純に、私は 'setLocale(String lang)'サブクラスの中に置きました。それは今働いた。 –

5

ましたアクティビティが再読み込みされるか、onConfigurationChangedメソッドを無効にします。

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
super.onConfigurationChanged(newConfig); 
    // your code here, you can use newConfig.locale if you need to check the language 
    // or just re-set all the labels to desired string resource 
} 
1

良い解決策がここではうまく説明されています。しかし、もう一つはあります。

を拡張して独自のCustomContextWrapperクラスを作成し、これを使用して完全なアプリケーションのロケール設定を変更します。 Here is a GISTです。

次に、保存されたロケール識別子でCustomContextWrapperを呼び出します。アクティビティライフサイクルのヒンディー語の'hi'メソッドattachBaseContext。ここでの使用方法:

@Override 
protected void attachBaseContext(Context newBase) { 
//fetch from shared preference also save to the same when applying. default here is en = English 
    String language = MyPreferenceUtil.getInstance().getString("saved_locale", "en"); 
    super.attachBaseContext(SnapContextWrapper.wrap(newBase, language)); 
} 
1

Udhayのサンプルコードはうまくいきます。Sofiane HassainiとChirag SolankIの質問を除いて、再入国のためには、それは機能しません。私はonCreate()でsuper.onCreate(savedInstanceState);の前にアクティビティを再起動せずにUdhayのコードを呼び出そうとします。それからOK! ちょっとした問題ですが、メニュー文字列は設定されたロケールに変更されません。第二の問題の試みのために

public void setLocale(String lang) { //call this in onCreate() 
    Locale myLocale = new Locale(lang); 
    Resources res = getResources(); 
    DisplayMetrics dm = res.getDisplayMetrics(); 
    Configuration conf = res.getConfiguration(); 
    conf.locale = myLocale; 
    res.updateConfiguration(conf, dm); 
    //Intent refresh = new Intent(this, AndroidLocalize.class); 
    //startActivity(refresh); 
    //finish(); 
} 
関連する問題