Я пытаюсь создать переключатель языка в приложении для приложения, над которым я работаю, но я пробовал почти все методы, доступные в Stackoverflow. Я также попробовал Официальное руководство отсюда https://developer.android.com/guide/topics/resources/app-languages#api-implementation
Кажется, ничего не работает. Вот код на GitHub https://github.com/bauripalash/Pankti-Android
Вот экран настроек, где я меняю язык
fun Context.findActivity() : Activity? = when(this){
is Activity -> this
is ContextWrapper -> baseContext.findActivity()
else -> null
}
fun changeLanguage( context: Context , language: String ){
context.findActivity()?.runOnUiThread {
val appLocale = LocaleListCompat.forLanguageTags(language)
AppCompatDelegate.setApplicationLocales(appLocale)
//context.findActivity()?.recreate()
}
//context.findActivity()?.recreate()
}
А вот основная деятельность
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags("bn"))
AppCompatDelegate.getApplicationLocales()[0]?.let { Log.i("MainView" , it.displayLanguage) }
setContent {
PanktiMobTheme {
// A surface container using the 'background' color from the theme
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
MainView()
}
}
}
}
}
Воссоздание активности тоже не работает.
Я перепробовал почти все методы, которые смог найти на Stackoverflow и в других местах.
Android context.getResources.updateConfiguration() устарел
Как вызвать перекомпоновку после updateConfiguration?
Как заставить реактивный ранец компоноваться заново?
Изменение языка Android с помощью JetPack Compose
Я знаю, что здесь часто задают этот вопрос. Но может кто-нибудь помочь мне здесь.
Чтобы работать, измените тему MaterialTheme на тему AppCompat в файле Themes.xml в папке значений.
Проверьте этот блог для добавления Android локализация или мультиязычность от царапина - кликните сюда
пример : темы.xml
<?xml version = "1.0" encoding = "utf-8"?>
<resources>
<!-- <style name = "Theme.SatCat" parent = "android:Theme.Material.Light.NoActionBar" />-->
<style name = "Theme.SatCat" parent = "Theme.AppCompat.Light" />
</resources>
ОБНОВИТЬ : Для Jetpack Compose,
Даже если вы добавите android:theme="@style/Theme.SatCat" из MainActivity в AndroidManifest.xml. он будет работать только выше setContent{} вашего ComponentActivity. потому что мы добавили нашу MaterialTheme внутрь setContent{}.
Решение :
Мы должны изменить нашу MainActivity, расширяющую ComponentActivity на AppCompatActivity, и использовать тему как тему AppCompat в манифесте.
После мы изменим его работу в Jetpack Compose.
Другое дело, в вашем случае перейдите в раскрывающееся меню «Настройки экрана». После выбора любого языка вы должны сохранить этот код, а не имя. . . .
Больше информации : если мы используем AppCompatDelegate.setApplicationLocales() с MaterialTheme, Context становится NULL, поэтому он не может создать Locale Manager.
Контекст имеет значение null, потому что sActivityDelegates пуст.
Даже я не знаю, что такое sActivityDelegates
Но как только я изменю тему на AppCompat. он становится рабочим.
Расскажите нам, если кто-то знает о sActivityDelegates и почему он не добавляется при жизненном цикле в postCreate, как они упоминают в комментариях. это было бы оценено.