Установить языковой стандарт программно по всему приложению с помощью API 27

Я использую этот класс приложения, чтобы установить мой язык во всем приложении

public class MyApplication extends Application {
public static void updateLanguage(Context ctx) {
    SharedPreferences prefs = getDefaultSharedPreferences(ctx);
    String lang = prefs.getString("locale_override", "");
    updateLanguage(ctx, lang);

}

public static void updatefont(Context ctx) {
    SharedPreferences prefs = getDefaultSharedPreferences(ctx);

    String lang = prefs.getString("locale_override", "");
    if (lang.equals("ar")) {
        CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
                .setDefaultFontPath("fonts/Cairo-Regular.ttf")
                .setFontAttrId(R.attr.fontPath)
                .build()
        );

    } else {
    }


}

public static void updateLanguage(Context ctx, String lang) {
    Configuration cfg = new Configuration();
    if (!TextUtils.isEmpty(lang))
        cfg.locale = new Locale(lang);
    else
        cfg.locale = Locale.getDefault();

    ctx.getResources().updateConfiguration(cfg, null);
}

@Override
public void onCreate() {
    updateLanguage(this);
    updatefont(this);
    super.onCreate();


}
}

он работает нормально, но когда я тестирую его на устройстве эмулятора Nexus 5X API 27, он вообще не работает. все решения не работают

1 ответ

Принимая во внимание тот способ, которым вы устанавливаете шрифт для приложения (не очень хороший способ), вы должны сделать это вместо этого.

Также вы должны знать об использовании устаревших методов для изменения локализации, также вам нужно установить DisplayMetrics, например:DisplayMetrics dm = res.getDisplayMetrics();

Как только вы установите язык, лучше перезапустить приложение для пользователя (лучший опыт).

Весь метод должен быть таким:

 @SuppressWarnings("deprecation")
public static void updateLanguage(Context ctx, String lang) {
Locale locale = new Locale(lang);
Resources resources = ctx.getResources();
Configuration configuration = resources.getConfiguration();
DisplayMetrics displayMetrics = resources.getDisplayMetrics();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
    configuration.setLocale(locale);
} else{
    configuration.locale=locale;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
    getApplicationContext().createConfigurationContext(configuration);
} else {
    resources.updateConfiguration(configuration,displayMetrics);
}


    Intent i = getBaseContext().getPackageManager()
            .getLaunchIntentForPackage(getBaseContext().getPackageName());
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    startActivity(i);
    this.finish();

}
Другие вопросы по тегам