(私はポストの下部に更新を追加しました)Androidの言語の変更:一部の文字列が、私は現在、英語とインドネシア語をサポートするプロジェクトに取り組んでいます適切に
翻訳されていません。私はすべての文字列を英語のデフォルトstrings.xmlに書きました。そして、私は "バリューイン"フォルダを作成し、そのフォルダにstrings.xmlをコピーし、テストのためにいくつかのテキストを変更しました。
私は、BaseActivity、Applicationクラス、およびLocaleHelperを使用して、自分のアプリケーションでローカリゼーションを管理しています。 それから私のアプリでこの動作が見つかりました。私はインドネシアにはsetlocale後SettingsActivity内のすべての文字列があり、HomeActivityでナビゲーションビュー内の
- 断片
- 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();
}
}
私を助けてください!ありがとう!
(UPDATE)
私はrecyclerviewおよびフラグメントのいずれかのビューのためのstrings.xmlにアクセスしたい時はいつでも再びのsetlocaleする必要があることが分かりました。これは全く不都合なことですが、私はその性能について心配しています。私は言語を変更するためのより良いアドバイスを聞いてみたいと思う。
あなたは本当にそのようなロケールを直接変更するつもりはありません。ほとんどの場合動作しますが、システムが動作する方法は、システムロケールに従って自分で変更することはできません。あなた自身でそれを変更したいのであれば、独自の文字列システムを作成するほうがはるかに良いでしょう。 –
こんにちは!申し訳ありません。私が意味するのは、私はこの "言語の変更"設定を自分のアプリケーションに持っている、私はアプリケーション上でのみ言語を変更する必要があります。私たち自身の「文字列システム」を書く方法についてもっと説明したり、参考にしたりできますか?ありがとう! – Kyk