Пакет приложений 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);

PS Приложение работает отлично, когда его собирают как APK.

4 ответа

Решение

В настоящее время вы можете отключить разделение по языку, добавив следующую конфигурацию в ваш 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
        }
    }
}

Лучшие решения в ближайшее время.

Подробности загрузки языка по запросу можно найти здесь

https://android-developers.googleblog.com/2019/03/the-latest-android-app-bundle-updates.html

В вашем приложении build.gradleфайл:

      dependencies {
    // This dependency is downloaded from the Google’s Maven repository.
    // So, make sure you also include that repository in your project's build.gradle file.
    implementation 'com.google.android.play:core:1.10.0'

    // For Kotlin users also add the Kotlin extensions library for Play Core:
    implementation 'com.google.android.play:core-ktx:1.8.1'
    ...
}

Получить список установленных языков

      val splitInstallManager = SplitInstallManagerFactory.create(context)
val langs: Set<String> = splitInstallManager.installedLanguages

Запрос дополнительных языков

      val installRequestBuilder = SplitInstallRequest.newBuilder()
installRequestBuilder.addLanguage(Locale.forLanguageTag("pl"))
splitInstallManager.startInstall(installRequestBuilder.build())

Проверьте ссылку выше для получения полной информации

Спустя много часов я наконец смог использовать язык по запросу с новым API PlayCore.

Шаг 1.) Поскольку пользователь меняет язык, вам необходимо сначала проверить, доступен ли язык, если нет, то загрузить язык.

      private void changeLocale(final String languageSelected){
  SplitInstallManager splitInstallManager = SplitInstallManagerFactory.create(PlayAgainstComputer.this);
    final Set<String> installedLangs = splitInstallManager.getInstalledLanguages();
    if(installedLangs.contains(languageSelected)){ // checking if lang already available
        Toast.makeText(PlayAgainstComputer.this,"Done! The language settings will take effect, once you restart the app!").show();
    }
    else{
        SplitInstallRequest request =
                SplitInstallRequest.newBuilder()
                        .addLanguage(Locale.forLanguageTag(languageSelected))
                        .build();
        splitInstallManager.startInstall(request);
        splitInstallManager.registerListener(new SplitInstallStateUpdatedListener() {
        @Override
        public void onStateUpdate(@NonNull SplitInstallSessionState splitInstallSessionState) {
            if(splitInstallSessionState.status() == SplitInstallSessionStatus.INSTALLED){
                Toast.makeText(PlayAgainstComputer.this,"Download complete! The language settings will take effect, once you restart the app!").show();
            }
        }
    });
 }}

Шаг 2.) Загруженные языки должны быть установлены, когда пользователь запускает приложение. что делается в attchBaseContext()метод

      @Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    SplitCompat.install(this); // It will install all the downloaded langauges into the app
  }

Шаг 3.) Вам нужно указать Activity использовать выбранный язык. Следующий код должен быть помещен перед setContentView(R.layout.layout);этой деятельности

        String selectedLanguage = getFromPrefernceOrWhereEverYouSavedIt(); // should be 2 letters. like "de", "es"
  Locale locale = new Locale(selectedLanguage); 
  Locale.setDefault(locale);
  Resources resources = getResources();
  Configuration config = new Configuration(resources.getConfiguration());
  config.locale = locale;
  resources.updateConfiguration(config,
        getBaseContext().getResources().getDisplayMetrics());

Сделанный!

Пожалуйста, обрати внимание

Когда пользователь (который выбрал язык, отличный от загруженного по умолчанию) обновляет приложение, этот язык необходимо снова загрузить в приложение, поэтому убедитесь, что вы обрабатываете это в своем коде.

когда я использовал activity.recreate();после завершения загрузки (для автоматического обновления приложения для нового языка) я столкнулся с некоторыми проблемами, поэтому я использовал Toastчтобы попросить пользователя вручную перезапустить приложение. но можно попробовать другие методы

Я также заметил некоторые другие несоответствия (даже иногда сталкивался с утечкой памяти из-за SplitCompat.install(this);) с помощью этого метода, поэтому убедитесь, что вы протестировали и оптимизировали его в соответствии с вашим кодом.

Это невозможно с пакетами приложений: Google Play загружает ресурсы только при изменении выбранных языков устройства.

Вам придется использовать APK, если вы хотите иметь встроенный инструмент выбора языка.

Другие вопросы по тегам