Заставить Android DateUtils.getRelativeDateTimeString() игнорировать языковой стандарт устройства?

Я нашел использование относительных API android.text.format.DateUtils, которые возвращают такие значения, как "вчера" или "2 часа назад", очень приятно, но мое приложение не поддерживает все языки, на которых работает Android. Итак, я по умолчанию на английском, но для каждого языка, который я не поддерживаю, относительная строка отображается в настройках устройства.

Например, например:

Last attempt: hace 11 minutos.

Я бы хотел, чтобы API вызывал по умолчанию английский для любых языков, которые я не поддерживаю. Тем не менее, я не вижу нигде, чтобы установить Locale для вызова API - я надеюсь, что я просто что-то пропустил.

Есть ли способ установить Locale только для вызова API, игнорируя настройки устройства?

Ответ 1

В соответствии с исходным кодом класса DateUtils он использует как метод Resource.getSystem(), так и Locale.getDefault() для форматирования даты и времени. Вы можете изменить значение по умолчанию Locale с помощью метода Locale.setDefault(), но я не думаю, что можно изменить возвращаемое значение метода Resource.getSystem(). Вы можете попытаться изменить локаль по умолчанию на Locale.US, но мне кажется, что в этом случае результаты будут еще хуже.

Ответ 2

Это работает для меня до Android 7

  void forceLocale(Locale locale) {
    Configuration conf = getBaseContext().getResources().getConfiguration();
    updateConfiguration(conf, locale);
    getBaseContext().getResources().updateConfiguration(conf, getResources().getDisplayMetrics());

    Configuration systemConf = Resources.getSystem().getConfiguration();
    updateConfiguration(systemConf, locale);
    Resources.getSystem().updateConfiguration(conf, getResources().getDisplayMetrics());

    Locale.setDefault(locale);
  }

  void updateConfiguration(Configuration conf, Locale locale) {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
      conf.setLocale(locale);
    }else {
      //noinspection deprecation
      conf.locale = locale;
    }
  }