Android, разные языки

Можно ли создать приложение для Android на языке, который выбирается нажатием одной из нескольких кнопок? Например, если у меня есть четыре кнопки в начале приложения с текстом: «английский», «немецкий», «итальянский», «испанский», я хочу использовать немецкий язык в приложении, когда я нажимаю кнопку «немецкий». . Я знаю, что мне нужно использовать разные папки для строк (values-de для немецкого), но я не знаю, как и где изменить настройку по умолчанию, которая использует папку по умолчанию для значений. Заранее спасибо!

Возможный дубликат сделать многоязычное приложение для Android

Ege Kuzubasioglu 10.09.2018 10:42
0
1
112
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам нужно переопределить метод attachBaseContext в каждом классе. и передайте выбранный код локали в суперметод. Приведенный ниже код используется в Котлине.

 override fun attachBaseContext(newBase: Context) {
    val lang = SharedPref.getPrefVal<String>(newBase, Constants.SELECTED_LANG_CODE)
    super.attachBaseContext(MyContextWrapper.wrap(newBase, lang))
}

MyContextWrapper класс для поддержки смены языка во всех версиях

public class MyContextWrapper extends ContextWrapper {

public MyContextWrapper(Context base) {
    super(base);
}

@SuppressWarnings("deprecation")
public static ContextWrapper wrap(Context context, String language) {
    Configuration config = context.getResources().getConfiguration();
    Locale sysLocale = null;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        sysLocale = getSystemLocale(config);
    } else {
        sysLocale = getSystemLocaleLegacy(config);
    }
    if (!language.equals("") && !sysLocale.getLanguage().equals(language)) {
        Locale locale = new Locale(language);
        Locale.setDefault(locale);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            setSystemLocale(config, locale);
        } else {
            setSystemLocaleLegacy(config, locale);
        }

    }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        context = context.createConfigurationContext(config);
    } else {
        context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
    }
    return new MyContextWrapper(context);
}

@SuppressWarnings("deprecation")
public static Locale getSystemLocaleLegacy(Configuration config) {
    return config.locale;
}

@TargetApi(Build.VERSION_CODES.N)
public static Locale getSystemLocale(Configuration config) {
    return config.getLocales().get(0);
}

@SuppressWarnings("deprecation")
public static void setSystemLocaleLegacy(Configuration config, Locale locale) {
    config.locale = locale;
}

@TargetApi(Build.VERSION_CODES.N)
public static void setSystemLocale(Configuration config, Locale locale) {
    config.setLocale(locale);
}
}

и при установке языка в методе onClick используйте:

 try {                           
     attachBaseContext(MyContextWrapper.wrap(applicationContext, lang_code))
     } catch (e: Exception) {
     }

Дайте мне знать, если вам понадобится помощь в понимании структуры кода.

Никогда не пользовался Kotlin, использую Java, но полагаю, что структура кода похожа?

dolphin 10.09.2018 10:42

Попробуйте код ниже.

для смены языка я сделал одну функцию, вам нужно передать код языка и контекст.

language = "en" установите язык в соответствии с вашими требованиями (английский en, французский fr, испанский sp & Другие языки) контекст передайте контекст вашей активности / фрагмента

    public static boolean setLangRecreate(String language, Context context) {
try {
    Configuration config = context.getResources().getConfiguration();
    Locale locale = new Locale(language);
    Locale.setDefault(locale);
    config.locale = locale;
    context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
    // recreate();
    ((Activity) context).finish();
    ((Activity) context).overridePendingTransition(0, 0);
    ((Activity) context).startActivity(((Activity) context).getIntent());
    ((Activity) context).overridePendingTransition(0, 0);
    return true;
} catch (Exception e) {
    e.printStackTrace();
}
return false;}

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