[解決済み] Androidで異なるロケールから文字列を取得する方法は?
質問
デバイスやアプリのロケール設定に関係なく、複数のロケールでStringの値を取得したいです。どのようにすればよいでしょうか。
基本的に私が必要としているのは、関数
getString(int id, String locale)
よりも
getString(int id)
どうすればいいのでしょうか?
ありがとうございます。
どのように解決するのですか?
注意 もしあなたの最小APIが17+なら、この答えの一番下まで直行してください。そうでない場合は、続きをお読みください...
注意 App Bundlesを使用している場合、言語分割を無効にするか、異なる言語を動的にインストールする必要があります。参照 https://stackoverflow.com/a/51054393 を参照してください。これを行わないと、常にフォールバックを使用します。
ロケールごとに様々なresフォルダがある場合、このようにすることができます。
Configuration conf = getResources().getConfiguration();
conf.locale = new Locale("pl");
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
Resources resources = new Resources(getAssets(), metrics, conf);
String str = resources.getString(id);
代わりに、@jyotiprakash が指摘した方法を使用してアクティビティを再起動することもできます。
注意
を呼び出すと
Resources
のようなコンストラクタを呼び出すと、Android の内部で何かが変更されます。元の状態に戻すには、元のロケールでコンストラクタを呼び出す必要があります。
EDIT 特定のロケールからリソースを取得するための若干異なる(そして幾分すっきりした)レシピは
Resources res = getResources();
Configuration conf = res.getConfiguration();
Locale savedLocale = conf.locale;
conf.locale = desiredLocale; // whatever you want here
res.updateConfiguration(conf, null); // second arg null means don't change
// retrieve resources from desired locale
String str = res.getString(id);
// restore original locale
conf.locale = savedLocale;
res.updateConfiguration(conf, null);
APIレベル17では
conf.setLocale()
を直接設定するのではなく
conf.locale
. これにより、右から左と左から右のロケールを切り替えている場合、設定のレイアウト方向が正しく更新されます。(レイアウト方向は 17 で導入されました)。
を新たに作成する意味はありません。
Configuration
オブジェクトを作成する意味がありません (@Nulano がコメントで提案しているように)。
updateConfiguration
を呼び出すと、元の設定が変更されてしまうからです。
res.getConfiguration()
.
に束ねるのはためらわれますね。
getString(int id, String locale)
メソッドにバンドルすることを躊躇するでしょう。ロケールを変更する (どちらのレシピでも) と、フレームワークがすべてのリソースを再バインドするために多くの作業を行う必要があります。ロケールを一度更新し、必要なものをすべて取得し、そしてロケールを設定し直すほうがはるかによいです。
EDIT (@Mygodに感謝)。
API レベルの最小値が 17+ である場合、次のようなもっと良い方法があります。
この回答
に示されているように、もっと良い方法があります。たとえば、複数の
Resource
オブジェクトを複数作成し、必要なロケールごとに一つずつ作成することができます。
@NonNull Resources getLocalizedResources(Context context, Locale desiredLocale) {
Configuration conf = context.getResources().getConfiguration();
conf = new Configuration(conf);
conf.setLocale(desiredLocale);
Context localizedContext = context.createConfigurationContext(conf);
return localizedContext.getResources();
}
そして、ローカライズされた
Resource
オブジェクトから好きなリソースを取得します。一度リソースを取り出したら、何もリセットする必要はありません。
関連
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み] Androidでアクティビティ起動時にEditTextにフォーカスが当たらないようにする方法
-
[解決済み] AndroidのListViewで画像を遅延ロードする方法
-
[解決済み] Androidで画面の大きさをピクセル単位で取得する方法
-
[解決済み] Androidのローテーションでアクティビティを再開する
-
[解決済み] APKファイルからソースコードを取得する方法はありますか?
-
[解決済み] Android Webview - キャッシュを完全に削除する
-
[解決済み] 「KotlinとAndroidで「パラメータTを推測するのに十分な情報がありません。
-
[解決済み] これはどういうことですか?失敗 [INSTALL_FAILED_CONTAINER_ERROR]?
-
[解決済み] WhatsAppでメッセージを送信する
最新
-
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 Webview - キャッシュを完全に削除する
-
[解決済み] Androidのソースコードにある@hideの意味とは?
-
[解決済み] Androidのadb logcatでTAG名で特定のメッセージを除外する方法は?
-
[解決済み] 複数のフィルタを持つBroadcastReceiverか、複数のBroadcastReceiverか?
-
[解決済み] 非ActivityクラスでContextを取得する [重複].
-
[解決済み] フラグメント間の値の受け渡し方法
-
[解決済み] FragmentPagerAdapterのgetItemが呼び出されない
-
[解決済み] アンドロイドのdatepickerダイアログで最大の日付を設定するには?
-
[解決済み] proguard hell - 参照されているクラスが見つかりません。
-
[解決済み] Androidでツールバーの戻るボタンの色を変えるには?