[解決済み] プログラムによるロケールの設定
質問
私のアプリは3カ国語(近々4カ国語)に対応しています。いくつかのロケールは非常によく似ているので、アプリケーション内でロケールを変更するオプションをユーザーに提供したいと思います。例えば、イタリア人は英語よりもスペイン語を好むかもしれません。
アプリケーションで利用可能なロケールの中からユーザーが選択し、使用するロケールを変更する方法はありますか?Activityごとにロケールを設定するのは、ベースクラスで行う簡単な作業なので、問題ないと思います。
どのように解決するのですか?
この答えをまだ探している人のために
configuration.locale
がAPI 24から非推奨になったので、使えるようになった。
configuration.setLocale(locale);
このメソッドのminSkdVersionはAPI 17であることを考慮に入れてください。
完全なサンプルコードです。
@SuppressWarnings("deprecation")
private void setLocale(Locale locale){
SharedPrefUtils.saveLocale(locale); // optional - Helper method to save the selected language to SharedPreferences in case you might need to attach to activity context (you will need to code this)
Resources resources = getResources();
Configuration configuration = resources.getConfiguration();
DisplayMetrics displayMetrics = resources.getDisplayMetrics();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
configuration.setLocale(locale);
} else{
configuration.locale=locale;
}
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N){
getApplicationContext().createConfigurationContext(configuration);
} else {
resources.updateConfiguration(configuration,displayMetrics);
}
}
実行中のActivityでロケールを変更した場合、変更を反映させるためにActivityを再起動する必要があることを忘れないでください。
EDIT 11th MAY 2018
CookieMonster さんの投稿にあるように、高い API バージョンでロケールの変更を維持するのに問題があるかもしれません。その場合は、以下のコードを Base Activity (BaseActivity extends AppCompatActivity / other activities) に追加して、Activity を作成するたびにコンテキストのロケールを更新するようにします。
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(updateBaseContextLocale(base));
}
private Context updateBaseContextLocale(Context context) {
String language = SharedPrefUtils.getSavedLanguage(); // Helper method to get saved language from SharedPreferences
Locale locale = new Locale(language);
Locale.setDefault(locale);
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {
return updateResourcesLocale(context, locale);
}
return updateResourcesLocaleLegacy(context, locale);
}
@TargetApi(Build.VERSION_CODES.N_MR1)
private Context updateResourcesLocale(Context context, Locale locale) {
Configuration configuration = new Configuration(context.getResources().getConfiguration());
configuration.setLocale(locale);
return context.createConfigurationContext(configuration);
}
@SuppressWarnings("deprecation")
private Context updateResourcesLocaleLegacy(Context context, Locale locale) {
Resources resources = context.getResources();
Configuration configuration = resources.getConfiguration();
configuration.locale = locale;
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
return context;
}
これを使う場合、ロケールを設定するときにSharedPreferencesに言語を保存することを忘れないでください。
setLocale(locale)
EDIT 7th APRIL 2020
Android 6および7で問題が発生する可能性があります。これは、androidxライブラリでナイトモードを処理する際に問題が発生するためです。このため
applyOverrideConfiguration
をベースアクティビティに追加し、新しいロケールが作成された場合に設定のロケールを更新してください。
サンプルコードです。
@Override
public void applyOverrideConfiguration(Configuration overrideConfiguration) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && Build.VERSION.SDK_INT <= Build.VERSION_CODES.N_MR1) {
// update overrideConfiguration with your locale
setLocale(overrideConfiguration) // you will need to implement this
}
super.applyOverrideConfiguration(overrideConfiguration);
}
関連
-
Android端末にADBが接続できない!を解決。理由: デバイスが認証されていない!
-
[解決済み] ImageViewの幅と高さをプログラムで設定する?
-
Google PlayデバイスはPlay保護機構の認証を受けていません。
-
アンドロイドのエリプサイズを使用する
-
Android カスタムスピナーコントロールのドロップダウン・ボックスの実装
-
ConstraintLayoutのいくつかのプロパティの概要(RelativeLayoutの強化版、LinearLayoutの比例プロパティを含む、階層ツールの削減)。
-
Android ProgressBarの色を変更する
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み] Perlからロケール設定の警告を修正する方法
-
[解決済み】アプリ内でロケールを変更する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
AndroidでAttempt to invoke virtual method... on null object referenceの例外が発生する。
-
aapt2エラー:ログを確認する(具体的な原因の探り方)
-
android.os の NetworkOnMainThreadException。
-
[android studio]com.android.ide.common.process.ProcessException: aaptの実行に失敗しました
-
Android開発で「Attempt to invoke virtual method 'XXX()' on null object reference」というヌルポインター例外に遭遇する。
-
Android studioのインストールと問題発生、Emulator: PANIC: AVDのシステムパスが見つかりません。
-
Android Bluetooth 開発の基本プロセス
-
Androidカスタムドロップダウンリストボックスコントロール
-
アンドロイドにおけるトークンの利用
-
[解決済み] Androidでプログラムによるアプリの言語変更