web-dev-qa-db-ja.com

Androidアプリ内ロケールが変更されたアプリバンドル

アプリ自体からアプリのロケールを変更する必要がある場合(つまり、アプリ内で言語を変更する設定がある場合)、AABに問題があります。問題は、AABがデバイスの言語リソースのみを提供することです。

デバイスには英語とフランス語がインストールされているため、AABは英語とフランス語のリソースのみを提供します。

しかし、アプリ自体の中から、英語、フランス語、インドネシア語の間で言語を切り替える選択肢があり、

その場合、言語を英語またはフランス語に変更するとすべてが完全に動作しますが、インドネシア語に変更すると、アプリはインドネシア語を探し続けるためクラッシュループに入りますが、見つかりません。

ここでの問題は、アプリを再起動しても、アプリがまだ欠落している言語リソースを探しているため、再びクラッシュループに入ることであり、ここでの唯一の解決策は、通常のユーザーが獲得した解決策である現金をクリアするか再インストールすることです通らない.


それに言及するために、これは私がアプリを通してロケールを変更する方法です:

    // get resources
    Resources res = context.getResources();
    // create the corresponding locale
    Locale locale = new Locale(language); // for example "en"
    // Change locale settings in the app.
    Android.content.res.Configuration conf = res.getConfiguration();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        conf.setLocale(locale);
        conf.setLayoutDirection(locale);
    } else {
        conf.locale = locale;
    }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        context.getApplicationContext().createConfigurationContext(conf);
    }
    res.updateConfiguration(conf, null);

追伸APKとしてビルドすると、アプリは完全に機能します。

21
Muhammed Refaat

編集:

PlayCore APIは、オンデマンドで別の言語の文字列のダウンロードをサポートするようになりました: https://developer.Android.com/guide/app -bundle/playcore#lang_resources

代替ソリューション(非推奨):

Build.gradleに次の構成を追加することにより、言語による分割を無効にできます。

Android {
    bundle {
        language {
            // Specifies that the app bundle should not support
            // configuration APKs for language resources. These
            // resources are instead packaged with each base and
            // dynamic feature APK.
            enableSplit = false
        }
    }
}

この後者のソリューションは、アプリのサイズを大きくします。

25
Pierre

これはアプリバンドルでは不可能です。GooglePlayは、デバイスの選択された言語が変更された場合にのみリソースをダウンロードします。

アプリ内言語ピッカーを使用する場合は、APKを使用する必要があります。

3
ianhanniballake