そのため、デバイス/アプリの現在のロケール設定に関係なく、いくつかのロケールで文字列の値を取得したいと思います。どうすればいいですか?
基本的に必要なのは関数getString(int id, String locale)
ではなく関数ですgetString(int id)
どうすればそれができますか?
ありがとう
そのため、デバイス/アプリの現在のロケール設定に関係なく、いくつかのロケールで文字列の値を取得したいと思います。どうすればいいですか?
基本的に必要なのは関数getString(int id, String locale)
ではなく関数ですgetString(int id)
どうすればそれができますか?
ありがとう
注最小 API が 17 以上の場合は、この回答の最後まで進んでください。それ以外の場合は、読み進めてください...
注: App Bundle を使用している場合は、言語分割を無効にするか、別の言語を動的にインストールする必要があります。これについては、 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)
ロケール用に複数の文字列リソースをロードする場合は、これをメソッドにまとめるのを躊躇します。(いずれかのレシピを使用して) ロケールを変更すると、フレームワークがすべてのリソースを再バインドするために多くの作業を行う必要があります。一度ロケールを更新し、必要なものをすべて取得してから、ロケールを元に戻す方がはるかに優れています。
編集(@Mygodに感謝):
最小 API レベルが 17 以上の場合は、別のスレッドのこの回答に示されているように、はるかに優れたアプローチがあります。たとえば、次のように、Resource
必要なロケールごとに 1 つずつ、複数のオブジェクトを作成できます。
@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
次に、このメソッドによって返されたローカライズされたオブジェクトから好きなリソースを取得します。リソースを取得したら、何もリセットする必要はありません。
この Kotlin 拡張関数をコードに配置し、次のように使用します。
getLocaleStringResource(Locale.ENGLISH,R.string.app_name)
fun Context.getLocaleStringResource(
requestedLocale: Locale?,
resourceId: Int,
): String {
val result: String
val config =
Configuration(resources.configuration)
config.setLocale(requestedLocale)
result = createConfigurationContext(config).getText(resourceId).toString()
return result
}