Заставить 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;
}
}