更新区域设置不更改 Android 版本低于 Build.VERSION_CODES.N (API 24) 的区域设置
Update Locale not changing the Locale for Android version lower than Build.VERSION_CODES.N (API 24)
几天来我一直在努力更改应用程序中的语言,看起来它仍然很好但是如果 API 低于 24 (VERSION_CODES.N) 它不想要更新语言环境。我在这里找到了解决方案:https://gunhansancar.com/change-language-programmatically-in-android/
我尝试实现它,API 从 24 开始运行良好,但 API 23、22、21、19 .. 不更新语言环境。拥有 4 string.xml(四种语言)和:
LocaleHelper.java
public class LocaleHelper {
private static final String SELECTED_LANGUAGE = "Locale.Helper.Selected.Language";
public static Context onAttach(Context context){
String lang = getPersistedData (context, Locale.getDefault ().getLanguage () );
return setLocale (context, lang);
}
public static Context onAttach(Context context, String defaultLanguage){
String lang = getPersistedData (context, defaultLanguage );
return setLocale (context, lang);
}
public static Context setLocale(Context context, String lang){
persist(context, lang);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
return updateResources(context, lang);
return updateResourceLegacy(context, lang);
}
@TargetApi ( Build.VERSION_CODES.N )
private static Context updateResources (Context context, String lang) {
Locale locale = new Locale ( lang );
Locale.setDefault ( locale );
Configuration config = context.getResources ().getConfiguration ();
config.setLocale ( locale );
config.setLayoutDirection ( locale );
return context.createConfigurationContext ( config );
}
private static Context updateResourceLegacy (Context context, String lang) {
Locale locale = new Locale ( lang );
Locale.setDefault ( locale );
Resources resources = context.getResources ();
Configuration config = resources.getConfiguration ();
config.locale = locale;
config.setLayoutDirection ( locale );
resources.updateConfiguration ( config, resources.getDisplayMetrics () );
return context;
}
private static void persist (Context context, String lang){
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences ( context );
SharedPreferences.Editor editor = pref.edit();
editor.putString ( SELECTED_LANGUAGE, lang );
editor.apply ();
}
private static String getPersistedData(Context context, String language){
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences ( context );
return preferences.getString ( SELECTED_LANGUAGE, language );
}
}
MainAplication.java
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(LocaleHelper.onAttach(base, "en"));
}
}
MainActivity.java
@Override
protected void attachBaseContext (Context newBase) {
super.attachBaseContext ( LocaleHelper.onAttach ( newBase, "en" ) );
}
private void updateView (String lang) {
Context context = LocaleHelper.setLocale(this, lang);
context.getResources ();
}
@Override
public boolean onMenuItemClick (MenuItem menuItem) {
click_efx.start ();
switch (menuItem.getItemId ()){
case R.id.ro_lang:
updateView("ro");
recreate ();
return true;
case R.id.eng_lang:
updateView("en");
recreate ();
return true;
case R.id.ru_lang:
updateView("ru");
recreate ();
return true;
case R.id.fr_lang:
updateView("fr");
recreate ();
return true;
default:
return false;
}
}
AndroidManifest.xml
android:name=".MainApplication"
android:allowBackup="true"
android:fullBackupContent="true"
android:hardwareAccelerated="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:largeHeap="true"
android:roundIcon="@mipmap/ic_launcher_round"
android:screenOrientation="portrait"
android:supportsRtl="true"
android:requestLegacyExternalStorage="true"
android:theme="@style/NewStyle"
android:usesCleartextTraffic="true"
android:windowSoftInputMode="adjustResize"
tools:ignore="AllowBackup,GoogleAppIndexingWarning,UnusedAttribute"
我想 LocaleHelper.java 中有一个逃生通道,但我不知道在哪里...请帮助我,在此先感谢!
所以代码是正确的,功能正常,一切都很简单。我创建了没有语言区域的新字符串文件,一切都自行解决了。
几天来我一直在努力更改应用程序中的语言,看起来它仍然很好但是如果 API 低于 24 (VERSION_CODES.N) 它不想要更新语言环境。我在这里找到了解决方案:https://gunhansancar.com/change-language-programmatically-in-android/ 我尝试实现它,API 从 24 开始运行良好,但 API 23、22、21、19 .. 不更新语言环境。拥有 4 string.xml(四种语言)和:
LocaleHelper.java
public class LocaleHelper {
private static final String SELECTED_LANGUAGE = "Locale.Helper.Selected.Language";
public static Context onAttach(Context context){
String lang = getPersistedData (context, Locale.getDefault ().getLanguage () );
return setLocale (context, lang);
}
public static Context onAttach(Context context, String defaultLanguage){
String lang = getPersistedData (context, defaultLanguage );
return setLocale (context, lang);
}
public static Context setLocale(Context context, String lang){
persist(context, lang);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
return updateResources(context, lang);
return updateResourceLegacy(context, lang);
}
@TargetApi ( Build.VERSION_CODES.N )
private static Context updateResources (Context context, String lang) {
Locale locale = new Locale ( lang );
Locale.setDefault ( locale );
Configuration config = context.getResources ().getConfiguration ();
config.setLocale ( locale );
config.setLayoutDirection ( locale );
return context.createConfigurationContext ( config );
}
private static Context updateResourceLegacy (Context context, String lang) {
Locale locale = new Locale ( lang );
Locale.setDefault ( locale );
Resources resources = context.getResources ();
Configuration config = resources.getConfiguration ();
config.locale = locale;
config.setLayoutDirection ( locale );
resources.updateConfiguration ( config, resources.getDisplayMetrics () );
return context;
}
private static void persist (Context context, String lang){
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences ( context );
SharedPreferences.Editor editor = pref.edit();
editor.putString ( SELECTED_LANGUAGE, lang );
editor.apply ();
}
private static String getPersistedData(Context context, String language){
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences ( context );
return preferences.getString ( SELECTED_LANGUAGE, language );
}
}
MainAplication.java
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(LocaleHelper.onAttach(base, "en"));
}
}
MainActivity.java
@Override
protected void attachBaseContext (Context newBase) {
super.attachBaseContext ( LocaleHelper.onAttach ( newBase, "en" ) );
}
private void updateView (String lang) {
Context context = LocaleHelper.setLocale(this, lang);
context.getResources ();
}
@Override
public boolean onMenuItemClick (MenuItem menuItem) {
click_efx.start ();
switch (menuItem.getItemId ()){
case R.id.ro_lang:
updateView("ro");
recreate ();
return true;
case R.id.eng_lang:
updateView("en");
recreate ();
return true;
case R.id.ru_lang:
updateView("ru");
recreate ();
return true;
case R.id.fr_lang:
updateView("fr");
recreate ();
return true;
default:
return false;
}
}
AndroidManifest.xml
android:name=".MainApplication"
android:allowBackup="true"
android:fullBackupContent="true"
android:hardwareAccelerated="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:largeHeap="true"
android:roundIcon="@mipmap/ic_launcher_round"
android:screenOrientation="portrait"
android:supportsRtl="true"
android:requestLegacyExternalStorage="true"
android:theme="@style/NewStyle"
android:usesCleartextTraffic="true"
android:windowSoftInputMode="adjustResize"
tools:ignore="AllowBackup,GoogleAppIndexingWarning,UnusedAttribute"
我想 LocaleHelper.java 中有一个逃生通道,但我不知道在哪里...请帮助我,在此先感谢!
所以代码是正确的,功能正常,一切都很简单。我创建了没有语言区域的新字符串文件,一切都自行解决了。