Android Nougat игнорирует строковые ресурсы, расположенные в res/values-zh-rTW.

Приложение поддерживает 3 языка:

  • английский
  • Упрощенный китайский
  • Традиционный китайский

Ресурсы расположены соответственно в каталогах:

  • разрешение/значения
  • res/values-zh-rCN
  • res/values-zh-rTW

На версиях pre-Nougat все работало, как описано на соответствующей странице документации - https://developer.android.com/guide/topics/resources/providing-resources.html.

В настоящее время в Nougat, когда пользователь переключает устройство на любой из языков упрощенного китайского, используются ресурсы из values-zh-rCN. Но когда пользователь переключает язык устройства на любой из традиционных китайских приложений, он по-прежнему использует значения из values-zh-rCN (что выглядит как правильное поведение, если вы предполагаете отсутствие традиционных ресурсов). Наконец, если я удалю из проекта каталог values-zh-rCN, приложение полностью проигнорирует традиционные ресурсы и будет использовать английские по умолчанию.

Кто-нибудь сталкивался с такой проблемой и есть ли решение, кроме сообщения об ошибке в Google?


person Nikita Malov    schedule 28.02.2017    source источник


Ответы (1)


Хорошо, я сообщил об этой ошибке – https://code.google.com/p/android/issues/detail?id=235561 На данный момент я реализовал такой обходной путь, возможно, кому-то он покажется полезным.
Во-первых, нам нужно создать BroadcastReciever, который будет прослушивать изменения языка системы:

private class LanguageChangeReceiver extends BroadcastReceiver {

    public static boolean isNougatTraditionalChinese() {
    return isNougat() && Locale.getDefault().toLanguageTag().contains("zh-Hant");
    }

    @Override
    public void onReceive(Context context, Intent intent) {

        if (!application.getConfiguration().isLanguageSet()) {
            if (isNougatTraditionalChinese()) {
                String[] supportedLangTags = context.getResources().getStringArray(R.array.language_values);
                application.getConfiguration().setLanguagePreference(supportedLangTags[2]);
                application.updateLanguage();
            }

        }
    }
}

... в рамках обновления языка приложения выглядит примерно так ...

private void updateLanguage(String langTag) {
    Locale myLocale = L10nUtils.createLocaleByTag(langTag);
    Resources res = getResources();
    DisplayMetrics dm = res.getDisplayMetrics();
    android.content.res.Configuration conf = res.getConfiguration();
    conf.locale = myLocale;
    res.updateConfiguration(conf, dm);
}

... и зарегистрируйте этот BroadcastReciever в контексте ...

context.registerReceiver(new LanguageChangeReceiver(), new IntentFilter(Intent.ACTION_LOCALE_CHANGED));
person Nikita Malov    schedule 04.03.2017
comment
Не могли бы вы указать массив R.array.language_values ​​и метод createLocaleByTag. Спасибо! - person Oleksandr Albul; 14.04.2017