1. ホーム
  2. android

[解決済み] Androidで異なるロケールから文字列を取得する方法は?

2023-04-04 10:39:41

質問

デバイスやアプリのロケール設定に関係なく、複数のロケールで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 オブジェクトから好きなリソースを取得します。一度リソースを取り出したら、何もリセットする必要はありません。