2017-11-03 13 views
1

(私はポストの下部に更新を追加しました)Androidの言語の変更:一部の文字列が、私は現在、英語とインドネシア語をサポートするプロジェクトに取り組んでいます適切に

翻訳されていません。私はすべての文字列を英語のデフォルトstrings.xmlに書きました。そして、私は "バリューイン"フォルダを作成し、そのフォルダにstrings.xmlをコピーし、テストのためにいくつかのテキストを変更しました。

私は、BaseActivity、Applicationクラス、およびLocaleHelperを使用して、自分のアプリケーションでローカリゼーションを管理しています。 それから私のアプリでこの動作が見つかりました。私はインドネシアにはsetlocale後SettingsActivity内のすべての文字列があり、HomeActivityでナビゲーションビュー内の

  1. 断片
  2. SettingsActivity

:私は、このような「ヘルプ」などの文字列を使用し、2つの場所で「設定」彼らはいくつかの同じ文字列を持っていますが、HomeActivityでは変更されていません。私はアプリを再起動しようとしたが、まだ動作していない。 HomeActivityにはまだ英語の単語がありますが、SettingsActivityには翻訳された単語があります。

アクティビティの単語の一部が翻訳されていますが、フラグメント内のすべての単語とrecyclerviewは全く翻訳されませんでした。

まだ正しく翻訳されていない理由が見つかりませんでした。誰かが私を助けることができる?

ここではいくつかの抜粋です:

Applicationクラス

@Override 
public void onCreate() { 
    super.onCreate(); 
    LocaleUtil.setLocale(new Locale(LocaleUtil.with(this).getPreference())); 
    LocaleUtil.updateConfig(this,getBaseContext().getResources().getConfiguration()); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    LocaleUtil.setLocale(new Locale(LocaleUtil.with(this).getPreference())); 
    LocaleUtil.updateConfig(this, newConfig); 
} 

BaseActivity

public BaseActivity() { 
    LocaleUtil.updateConfig(this); 
} 

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    initLocale(); 
    super.onCreate(savedInstanceState); 
} 

public void initLocale(){ 
    localeUtil = new LocaleUtil(this); 
    localeUtil.setListener(this); 
    localeUtil.setLanguageByCode(localeUtil.getPreference()); 
} 

LocaleUtilクラス

public class LocaleUtil { 
    private static Locale sLocale; 
    public static final String LOCALE_PREF="locale_pref"; 

    public static final String ENGLISH="en"; 
    public static final String INDONESIA="in"; 

    private Context context; 

    private LocaleListener listener; 

    public LocaleUtil(Context context){ 
     this.context = context; 
    } 
    public static LocaleUtil with(Context context){ 
     return new LocaleUtil(context); 
    } 

    public void setListener(LocaleListener listener){ 
     this.listener = listener; 
    } 

    public static void setLocale(Locale locale) { 
     sLocale = locale; 
     if(sLocale != null) { 
      Locale.setDefault(sLocale); 
      Configuration configuration = new Configuration(); 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
       configuration.setLocale(sLocale); 
      } 
     } 
    } 

    public static void updateConfig(ContextThemeWrapper wrapper) { 
     if(sLocale != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
      Configuration configuration = new Configuration(); 
      configuration.setLocale(sLocale); 
      wrapper.applyOverrideConfiguration(configuration); 
     } 
    } 

    public static void updateConfig(Application app, Configuration configuration) { 
     if (sLocale != null && Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) { 
      //Wrapping the configuration to avoid Activity endless loop 
      Configuration config = new Configuration(configuration); 
      // We must use the now-deprecated config.locale and res.updateConfiguration here, 
      // because the replacements aren't available till API level 24 and 17 respectively. 
      config.locale = sLocale; 
      Resources res = app.getBaseContext().getResources(); 
      res.updateConfiguration(config, res.getDisplayMetrics()); 
     } 
    } 

    public void updateConfig(Locale locale){ 
     Configuration config = context.getResources().getConfiguration(); 
     Locale.setDefault(locale); 
     config.locale = locale; 
     context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics()); 
    } 

    public void setLanguageByCode(String code){ 
     savePreference(code); 
     Locale locale = new Locale(code); 
     setLocale(locale); 
     updateConfig(locale); 
     if(listener!=null)listener.onLocalChanged(); 
    } 

    public String getLanguageCode(String languageName){ 
     String locale=""; 
     if(languageName.equals(context.getString(R.string.indonesia))){ 
      locale=INDONESIA; 
     }else if(languageName.equals(context.getString(R.string.english))){ 
      locale=ENGLISH; 
     } 
     return locale; 
    } 

    public void setLanguageByName(String language){ 
     setLanguageByCode(getLanguageCode(language)); 
    } 

    public void savePreference(String locale){ 
     GlobalFunction.storeSetting(context,LOCALE_PREF, locale); 
    } 

    public String getPreference(){ 
     return GlobalFunction.getSetting(context,LOCALE_PREF,""); 
    } 

    public interface LocaleListener{ 
     void onLocalChanged(); 
    } 
} 

私の文字列ファイル my strings file

私を助けてください!ありがとう!

UPDATE

私はrecyclerviewおよびフラグメントのいずれかのビューのためのstrings.xmlにアクセスしたい時はいつでも再びのsetlocaleする必要があることが分かりました。これは全く不都合なことですが、私はその性能について心配しています。私は言語を変更するためのより良いアドバイスを聞いてみたいと思う。

+0

あなたは本当にそのようなロケールを直接変更するつもりはありません。ほとんどの場合動作しますが、システムが動作する方法は、システムロケールに従って自分で変更することはできません。あなた自身でそれを変更したいのであれば、独自の文字列システムを作成するほうがはるかに良いでしょう。 –

+0

こんにちは!申し訳ありません。私が意味するのは、私はこの "言語の変更"設定を自分のアプリケーションに持っている、私はアプリケーション上でのみ言語を変更する必要があります。私たち自身の「文字列システム」を書く方法についてもっと説明したり、参考にしたりできますか?ありがとう! – Kyk

答えて

0

これを確認してください。おそらく、一部の文字列は含まれていません。 ドキュメント。

https://developer.android.com/guide/topics/resources/localization.html#using-framework

アプリケーションのデフォルト言語が英語であると仮定します。 あなたのアプリケーション内のすべてのテキストをフランス語 フランス語にローカライズし、アプリケーションのテキストの大半(アプリケーションのタイトルを 以外)を日本語に変換するとします。この場合、あなたは、ロケール固有の リソースディレクトリに格納されている各 3つの代替のstrings.xmlファイルを作成することができます。

RES /値を/のstrings.xmlは、アプリケーションの使用を すべての文字列のための英語のテキストが含まれていますtitleという文字列のテキストも含まれます。 res/values-fr/strings.xmlタイトルを含む すべての文字列のフランス語のテキストが含まれています。 res/values-ja/strings.xml の日本語テキストを含み、タイトル以外のすべての文字列。 Javaコードが R.string.titleの場合は、実行時に次のようになります。

デバイスがフランス語以外の言語に設定されている場合、Androidはres/values/stringsから ロードタイトルを取得します。 xmlファイル。デバイスが からフランス語に設定されている場合、Androidはres/values-fr/strings.xml ファイルからタイトルを読み込みます。デバイスが日本語に設定されている場合、Androidはres/values-ja/strings.xmlファイルのタイトルとして と表示されます。しかし、このファイルに 文字列が含まれていないため、は デフォルトのに戻り、 res/values/strings.xmlファイルから英語のタイトルが読み込まれます。

私はうまくいきたいと思います。

関連する問題