Изменение языка приложения (локализация) не применимо на Android 23 Android - PullRequest
2 голосов
/ 14 мая 2019

У меня проблема с локализацией в приложении для Android.

Функция для правильной смены языка работает, когда я тестирую его на уровень API 24 и выше, но когда я меняю язык на эмуляторе уровень API 23 , он просто не будет применятьсялокальные изменения.Я читал об этом на многих форумах, и я попробовал почти все предоставленные решения, но оно просто не работает.

Важно то, что анимация закрытия всплывающего меню, которая является listPreference, немного странная, чем, например, закрытие анимации наAndroid Nougat, так что уже пахнет какой-то неровностью.

Важное замечание - это то, что я запускаю приложение на своем физическом устройстве, которое имеет уровень API 23 или Зефир, и проблема все еще существует.

В следующих разделах я предоставил некоторый код, который важен для этого случая, с другой стороны, я пропустил некоторые файлы, такие как strings.xml и preferences.xml который не нужен для этого случая.Таким образом, основное внимание здесь уделяется возможности изменения языка приложения.Если кто-то из вас понял, в чем может быть проблема, я бы попросил его поделиться с нами.


Вспомогательный класс для настройки Locale

package com.metropolitan.hangouter;

import android.annotation.TargetApi;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.res.Configuration;
import android.os.Build;

import java.util.Locale;

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);
}
}

Затем в своей основной деятельности среди других методов я называю этот, который для нас крайне важен.

override fun attachBaseContext(newBase: Context) {
    preferences = PreferenceManager.getDefaultSharedPreferences(newBase)
    vred = preferences.getString("languageKey", "no selection")!!
    val locale = Locale(vred)
    super.attachBaseContext(MyContextWrapper.wrap(newBase, locale.language))
}

Этот метод также вызывается в SettingsActivity, который имеет ту же функциональность и который присоединяет локальную конфигурацию к baseContext, конечно, мне нужно обновить действие из-за внесенных изменений, и я обрабатываю егособытие.

Итак, этот метод вызывается в нужном месте и в нужное время.Другими словами, я обновляю действия каждый раз на PreferenceChange.Мое приложение написано в kotlin , но этот класс MyContextWrapper находится в java .Так что пока что, если кому-то понадобится дополнительная информация, я буду очень рад ее предоставить.

1 Ответ

1 голос
/ 15 мая 2019

Это, вероятно, происходит из-за следующего:

Начиная с Android 7.0 (уровень API 24), Android предоставляет расширенные возможности поддержка многоязычных пользователей, что позволяет им выбрать несколько локали в настройках. Android предоставляет эту возможность значительно расширение количества поддерживаемых локалей и изменение способа Система разрешает ресурсы.

Подробнее об этом можно прочитать здесь

Если у вас есть ресурсы с именем xx_XX, попробуйте удалить XX, у меня это работало на старых версиях. В противном случае укажите полностью определенный языковой стандарт.

...