该说不说res下对应语言的文件要先准备好,然后才开始到正题。
android13及以上,api33+
首先在res/xml下添加locales_config.xml,将涉及到的tag加入
<?xml version="1.0" encoding="utf-8"?>
<locale-config xmlns:android="http://schemas.android.com/apk/res/android">
<locale android:name="cs"/>
<locale android:name="da"/>
<locale android:name="de"/>
<locale android:name="es"/>
<locale android:name="fr"/>
<locale android:name="it"/>
<locale android:name="ko"/>
<locale android:name="nl"/>
<locale android:name="pl"/>
<locale android:name="pt-PT"/>
<locale android:name="ru"/>
<locale android:name="th"/>
<locale android:name="uk"/>
<locale android:name="vi"/>
<locale android:name="zh-Hans"/>
</locale-config>
接着在minifest.xml中应用该文件,可能会出现33+才能使用的提示,可以不管
<application
android:localeConfig="@xml/locales_config"
/>
然后调用LocaleManager进行切换,这边需要传入对应tag
ContextCompat.getSystemService<LocaleManager>(
context, LocaleManager::class.java
)?.let {
it.applicationLocales = LocaleList.forLanguageTags(languageTag)
}
android 12 及以下
导入谷歌appcompact的依赖。
implementation 'androidx.appcompat:appcompat:1.7.1'
调用AppCompatDelegate的方法即可
AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags(languageTag));
总结
public static void changeLanguage(String languageTag) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
LocaleManager localeManager = ContextCompat.getSystemService(MyApp.getInstance(), LocaleManager.class);
if (localeManager != null) {
localeManager.setApplicationLocales(LocaleList.forLanguageTags(languageTag));
}
} else {
AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags(languageTag));
}
}