Заставить Android DateUtils.getRelativeDateTimeString () игнорировать локаль устройства? - PullRequest
12 голосов
/ 30 июня 2011

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

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

Last attempt: hace 11 minutos.

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

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

Ответы [ 2 ]

12 голосов
/ 11 ноября 2014

Это работает для меня до 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;
    }
  }
7 голосов
/ 07 июля 2011

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

...