1

几天来,我一直在努力改变应用程序中的语言,看起来它仍然很好,但如果 API 低于 24 (VERSION_CODES.N),它不想更新语言环境。我在这里找到了解决方案:https ://gunhansancar.com/change-language-programmatically-in-android/ 我尝试实现它,从 24 开始的 API 运行良好,但 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中有一个逃脱,但我不知道在哪里......请帮助我,提前谢谢!

4

1 回答 1

2

所以代码是正确的和功能的,一切都很简单。我创建了没有语言区域的新字符串文件,一切都解决了。在此处输入图像描述

于 2020-08-10T09:07:54.873 回答