Пакет приложений 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, если вы хотите иметь встроенный инструмент выбора языка.