Android国際化(多言語)

4259 ワード

リソースの照合
  • 文字リソースvalues、レイアウトリソースlayout、ピクチャリソースdrawableは、フォルダの後に国接尾辞を追加し、対応する言語のリソースを置くことができます.設定した言語に基づいて自動的に対応する言語のリソースを探し、設定したシステム言語リソースがない場合はデフォルトのリソース(values、layout、drawableフォルダの下)を取得します.
  • 国家地区言語略語コード:http://www.cnblogs.com/Mien/archive/2008/08/22/1273950.html

  • 工程内初期化設定
    Application
  • onCreate()メソッドを書き換え、設定言語を初期化する.グローバルContextに言語を設定します.設定しないと、グローバルContextでロードされたリソースは、ユーザーが設定した言語タイプのリソースをロードしません.
  • onConfigurationChanged(Configuration newConfig)メソッドを書き換え、設定言語を再初期化する.携帯電話システムが変更されると、この方法はコールバックするので、手動でユーザーが選択した言語に設定する必要があります.そうしないと、システム設定に従います.

  • Activity
  • onCreate()メソッドを書き換え、設定言語を初期化する.ここでは,実際には現在のActivityのコンテキストに言語を設定し,設定するとユーザが設定したシステム言語を認識できる.通常はBaseActivityで処理します.

  • アプリケーション内変更言語
  • ユーザ言語設定後、ローカルspが保存する言語
  • アプリケーション内言語変更
  • public static Context checkLanguage(Context context) {
        // index:         :0  ,1    ,2    
        int index = DataRepository.getInstence().getSpValue(SPConstant.SP_LANGUAGE, SPConstant.KEY_LANGUAGE_INDEX, -1);
        Resources resources = context.getResources();
        Configuration configuration = resources.getConfiguration();
        DisplayMetrics displayMetrics = resources.getDisplayMetrics();
        Locale locale;
        if (index == LanguageConstant.ENGLISH) {
            locale = Locale.ENGLISH;
        } else if (index == LanguageConstant.SIMPLIFIED_CHINESE) {
            locale = Locale.SIMPLIFIED_CHINESE;
        } else if (index == LanguageConstant.CHINESE_TW) {
            locale = Locale.TRADITIONAL_CHINESE;
        } else {
            //         ,    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                locale = LocaleList.getDefault().get(0);
            } else {
                locale = Locale.getDefault();
            }
        }
        //     ,     
        //   updateConfiguration     ,     createConfigurationContext。       
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            configuration.setLocale(locale);
            context = context.createConfigurationContext(configuration);
        } else {
            configuration.locale = locale;
            resources.updateConfiguration(configuration, displayMetrics);
        }
        return context;
    }
    
  • 対応Activity調recreate()メソッド
  • システム適合、互換性
  • 公式Api紹介:https://developer.android.com/reference/android/content/res/Configuration

  • 以上のアプリケーション内の設定言語は、互換性が必要なApiの一部に関連しています.
    //         
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        locale = LocaleList.getDefault().get(0);
    } else {
        locale = Locale.getDefault();
    }
    //       ;      
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        configuration.setLocale(locale);
        context = context.createConfigurationContext(configuration);
    } else {
        configuration.locale = locale;
        resources.updateConfiguration(configuration, displayMetrics);
    }
    

    Android 7.0システム
    Android 7.0システムよりLocaleListで言語を管理
  • システムは、優先度に基づいて言語を選択する複数の言語リストを設定することができる.では、通常、アプリケーション言語がシステムに追従すると、直接LocaleList.getDefault().get(0)を取得することができる.しかし、configuration.setLocale(locale)設定言語を適用すると(ソースコードは実際にはnew LocaleList(locale))このlocaleがシステム言語リストのトップに詰め込まれ、このときシステムの現在の言語はトップの言語ではない.したがって,アプリケーションが再びシステムに従うことを選択すると,言語リストのトップを獲得する言語はシステムの現在の言語ではない.
  • ソリューション:1、Appに入った後、ApplicationでLocaleList.getDefault()を通じてシステム言語リストの集合を取得し、メモリに保存することができる.その後,設定言語追従システムを適用すると,保存した言語リストの集合からトップ言語を直接取得し,設定を行う.2、傍受システム言語変化、登録傍受システム言語変化放送Intent.ACTION_LOCALE_CHANGED;ブロードキャストを受信したら、再度システム言語リストを取得し、更新をメモリに保存します.メモリに保存されている言語リストのセットがシステム言語リストとリアルタイムで一致することを保証します.

  • Android 7.0以上のシステムは、言語をContextに植え込む必要があります
  • context.createConfigurationContext(configuration)メソッドを使用して更新構成を設定します.このメソッドはContextを返します.Applicaiton、Activity、ServiceのattachBaseContext()メソッドを書き換え、言語メソッドを設定して、返されるContextを転送する必要があります.
  • @Override 
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(checkLanguage(base));
    } 
    

    Android 8.0システム
  • Android 8.0システムでは、Activityのコンテキストで、言語構成の更新を設定すると、グローバルコンテキストでも自動的に言語が設定され、アプリケーションContextでリソースcontext.getResource().getString()が取得され、設定された言語タイプが自動的に認識されます.しかしAndroid 8.0システムでは、取得したリソースは変わりません.したがって,初期化言語,言語変更後,ActivityでのcheckLanguage(Activityのコンテキスト)に加えて,グローバルコンテキストに言語checkLanguage(アプリケーションContext)を再設定する.