Androidの国際化および開発における問題解決[全]


基本的な要件:
Androidの国際化の開発ニーズには、次の2つの状況があります.
1.システムの言語とアドレスを取得します.つまり、システム言語に従います.
2.appアプリケーション内で言語設定を行います.
基本的な知識:
1.Androidは、システムの言語領域に応じて自動的に一致するリソースパッケージを設定します.例えば、簡体字中国語は(/values-zh-rCN)から(/values-zh)に、(/values)に続きます.中国語と英語しかない場合は、(/values-en)を英語リソースとして構成し、デフォルト(/values)を中国語リソースとして使用できます.2.一般的にAndroid src/main/res/ディレクトリの下で、対応する言語フォルダを作成します.フォーマットは一般的にvalues-言語番号-地域番号で、デフォルトのリソースには言語番号と地域番号が含まれていません.3.構成オプションには、言語番号と地域番号が含まれます.中国語と中国を表す配置オプションはzh-rCN(zhは中国語、CNは中国)も簡体字中国語、zh-rTW(zhは中国語、TWは台湾)も繁体字中国語を表す.英語と米国を表す構成オプションはen-rUS(enは英語、USは米国)、英語(英国):values-en-rGB(enは英語、GBは英国)です.同じ言語の代名詞には複数の地域代名詞があり、rで区別を表すことができる.4.注意:デフォルト(/valuesは存在する必要があります.そうしないとコンパイルできません).5.注意:Resourcesはlayout、stringなどの多言語を構成することができます.
言語コードの取得と設定:
            :
   Java         , :Locale locale = Locale.getLocale();
String language = locale.getLanguage();
String country = locale.getCountry();
   Configuration    
//  1,      ,    API >= 17       
Locale locale = context.getResources().getConfiguration().locale;
//  2,  API >= 17         
Locale locale = context.getResources().getConfiguration().getLocales().get(0);
String language = locale.getLanguage();
String country = locale.getCountry();


  , context.getResources()      Resources.getSystem()    ,                  ,               ,     ,        。

Appの言語設定の変更
上記の解析により,システムと応用言語領域の設定をどのように取得するかが分かった.次に、Androidアプリの多言語切り替えを実現する方法についてお話しします.先にコンフィギュレーションを使用しましたが、このクラスはAndroidアプリケーションのすべてのデバイス情報を保存しています.詳細はコンフィギュレーションを参照してください.アプリケーションの多言語切り替えを実現するには、コンフィギュレーションの言語領域に関する属性を更新する必要があります.
Resources resources = context.getResources();
DisplayMetrics metrics = resources.getDisplayMetrics();
Configuration configuration = resources.getConfiguration();
//API >= 17     
configuration.setLocale(locale);
//       ,       Context.createConfigurationContext(Configuration)
resources.updateConfiguration(configuration, metrics);

リソースの再ロード
    ,          ? ,    ,   Configuration   ,      Activity,             。
Intent intent = new Intent(this, MainActivity.class);
//    activity         activity
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

永続化ストレージの設定
アプリケーションが殺されて再起動されると、以前のすべての設定が失効し、アプリケーションの言語領域がシステムのデフォルトになった.これは、アプリケーションに対する変更がメモリに保存されているだけで、アプリケーションが殺され、メモリにおけるデータも解放され、アプリケーションが再起動されると、アプリケーションがシステムのコンフィギュレーションを読み取るためである.言語領域もシステムのデフォルトになります.アプリケーションがユーザー変更を保存する必要がある場合は、ユーザーの選択を永続化し、アプリケーションが再起動されると、構成から構成を読み出して適用する必要があります.
public class MyApplication extends Application {

 

    @Override

    public void onCreate() {

        super.onCreate();

        //    Application   onCreate()       Configuration

        LanguageUtil.changeAppLanguage(this, Locale.SIMPLIFIED_CHINESE, true);

    }

}

LanguageUtil.java

/**

*       

*

* @param context

* @param locale     

* @param persistence      

*/

public static void changeAppLanguage(Context context, Locale locale,

                                    boolean persistence) {

   Resources resources = context.getResources();

   DisplayMetrics metrics = resources.getDisplayMetrics();

   Configuration configuration = resources.getConfiguration();

   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {

       configuration.setLocale(locale);

   } else {

       configuration.locale = locale;

   }

   resources.updateConfiguration(configuration, metrics);

   if (persistence) {

       saveLanguageSetting(context, locale);

   }

}

 

private static void saveLanguageSetting(Context context, Locale locale) {

   String name = context.getPackageName() + "_" + LANGUAGE;

   SharedPreferences preferences =

           context.getSharedPreferences(name, Context.MODE_PRIVATE);

   preferences.edit().putString(LANGUAGE, locale.getLanguage()).apply();

   preferences.edit().putString(COUNTRY, locale.getCountry()).apply();

}
  ,Android             。   ,                  。

多言語切り替え中に発生したピット
1.静的変数として、アプリケーションの初期化時にネットワーク要求エラーメッセージを初期化し、システムで言語を切り替えた後、ネットワーク要求エラーメッセージは更新されません.解決策:使用時にgetString()メソッドで直接取得します.2.Appマルチ言語切替設定の永続化後、アプリケーション起動時には、アプリケーションのonCreate()においてもマルチ言語切替が行われている.その後、システム設定で言語を切り替え、Appもシステム言語に従います.理由:システムの言語を変更すると、アプリケーションのコンフィギュレーションもシステムの変更に従い、アプリケーションを開始するときの設定ではなく、Activityのライフサイクルをリスニングし、ActivityのonCreate()で現在の言語設定がユーザー設定値と同じかどうかを判断します.そうしないと、アプリケーション言語設定を強制的に更新します.なぜなら、システムが言語オプションを切り替えると、前に述べたように、リソースの再ロードを実現するためにActivityを再起動する必要があるためです.ここにも3つのシナリオがある:a.ベースクラスBaseActivityを作成し、そのonCreate()メソッドで処理するb.Activity LifecycleCallbacksを使用して、そのコールバックonActivity Created()で処理する
c.activityの再構築を防止し、MainActivityのインベントリファイルにandroid:configChanges="locale|layoutDirection"(会員システムはこの方法)を構成し、アプリケーションでメソッド:onConfigurationChanged()を書き換え、そのままこのメソッドを実行して言語を修正します.対照的に、上記の2つのスキームは、1つ目はBaseActivityから継承されたものに対してのみ有効であり、2つ目はリスニングされたのでActivityのライフサイクルである.だから相対的に、第2の案はもっと良いです.
/**
*             .
*
* @param context
* @return
*/
public static boolean isSameWithSetting(Context context) {
  Locale current = context.getResources().getConfiguration().locale;
  return current.equals(getAppLocale(context));
}

public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        LanguageUtil.init(this);
        //  Activity        
        registerActivityLifecycleCallbacks(callbacks);
    }
    ActivityLifecycleCallbacks callbacks = new ActivityLifecycleCallbacks() {
        @Override
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
            //        
            if (!LanguageUtil.isSameWithSetting(activity)) {
                LanguageUtil.changeAppLanguage(activity,
                        LanguageUtil.getAppLocale(activity));
            }
        }
        //Activity          
    };
}

    AndroidManifest.xml     launchMode   singleInstance   Activity,  Intent intent = new Intent(this, MainActivity.class);
//    activity         activity
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

リソースファイルは更新されません.理由:launchModeがsingleInstanceのActivityであり、現在のアプリケーションと同じTaskスタックではない解決方法:launchModeを他のモードに変更するか、アプリケーションを殺して再起動します.
リソースフォルダがvalues-zh-rCNの場合、アプリケーションLocaleをLocaleに設定.CHINESEの場合、対応するリソースファイルが見つかりません.理由:values-zh-rCN対応のLocaleはLocaleである.SIMPLIFIED_CHINESE解決策:LocaleをLocaleに設定.SIMPLIFIED_CHINESEやリソースファイルをvalues-zhに変更するのは最も惨めな穴で、多くの時間を浪費しているので、Androidアプリケーションリソースの国際化のエピソードが始まります.
app言語を設定してMainActivityインタフェースに切り替えると、白い画面が点滅します.解決策は次のとおりです.
       MainActivity      


 style.xml       :