Как обнаружить изменение конфигурации Android в локали во время изменения языка приложения

Я исследую язык каждого приложения в своем текущем приложении для Android и добавляю его в свой файл манифеста Android.

android:configChanges = "locale|layoutDirection"

Вызывается функция My Activity onConfigurationChanged, и я вижу, как обнаружить изменения направления текста, используя приведенный ниже код:

@RequiresApi(Build.VERSION_CODES.N)
override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)

     if (newConfig.layoutDirection == Configuration.SCREENLAYOUT_LAYOUTDIR_LTR) {
        finishAffinity()
        recreate()
    }
}

Как определить, что локаль изменилась?

Автор !newConfig.locales.isEmpty?

0
0
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Как упоминалось здесь

ACTION_LOCALE_CHANGED :

Действие при широковещании: Фактический региональный стандарт получателя изменился. Это происходит при изменении языкового стандарта устройства, языкового стандарта принимающего приложения (заданного с помощью LocaleManager.setApplicationLocales(LocaleList)) или языковых тегов региональных настроек. Могут быть получены получателями, объявленными в манифесте.

  • EXTRA_PACKAGE_NAME — это имя пакета, для которого изменена локаль.

  • EXTRA_LOCALE_LIST содержит локали, которые в данный момент установлены для указанного приложения.


Вы можете использовать BroadcastReceiver с фильтром намерений Intent.ACTION_LOCALE_CHANGED. Зарегистрируйте этот получатель, и когда языковой стандарт изменится, вы получите его в методе onReceive с объектом намерения, затем сопоставите его с intent.action == Intent.ACTION_LOCALE_CHANGED и выполните дальнейший процесс.

Для этого вы можете рассмотреть следующий пример:

public class LocaleReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent.getAction() == Intent.ACTION_LOCALE_CHANGED){
            Log.v("LocaleRecevier", "received ACTION_LOCALE_CHANGED");

            Locale newLocale = context.getResources().getConfiguration().locale();

            Log.v("LocaleRecevier", newLocale);

        }

    }
}

Зарегистрируйте свой приемник Brodcast в файле манифеста.

<receiver
    android:name = ".LocaleReceiver"
    android:enabled = "true"
    android:exported = "true">
    <intent-filter>
        <action android:name = "android.intent.action.LOCALE_CHANGED" />
    </intent-filter>
</receiver>

Обновление 1

С помощью API-интерфейсов Android невозможно напрямую определить, изменен ли языковой стандарт с device settings, с within your app или какого-либо другого приложения. Стандартные API, предоставляемые в Android, позволяют обнаружить изменение локали.

Однако есть несколько способов получить некоторое представление об этом:

Мониторинг внутренних изменений локали

  • Приложение должно иметь переменную, в которой хранится ранее установленная локаль.
  • Обновляйте это значение всякий раз, когда языковой стандарт вашего приложения изменяется программно.
  • Когда пользователь меняет свою локаль во всей системе (обнаруживается путем сравнения с сохраненной переменной с помощью Locale.getDefault());. Если они совпадают, у вас есть убедительный признак того, что изменение произошло со стороны вашего приложения.

пример :

private Locale previousLocale;

public void setAppLocale(Locale newLocale) {
  previousLocale = Locale.getDefault();
  Locale.setDefault(newLocale);
  // Update UI and resources based on newLocale
}

public boolean isLocaleChangeFromApp() {
  return Locale.getDefault().equals(previousLocale);
}

// ...

// When locale changes (e.g., in an activity's `onCreate`):
Locale currentLocale = Locale.getDefault();
if (currentLocale.equals(previousLocale)) {
  // Locale change likely from app
} else {
  // Locale change likely from device settings
  previousLocale = currentLocale;
}

Это, конечно, не надежно, поскольку другие приложения могут редактировать локаль, но это грубое указание, которое помогает установить контекст.

Есть ли способ определить, произошло ли изменение локали из настроек устройства или из самого приложения?

Hector 29.05.2024 16:40

@Hector Пожалуйста, проверьте Обновление 1 части моего ответа. Он может подсказать вам, как достичь этого требования. Спасибо

Bob 18.06.2024 11:14

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