Как изменить настройки локали по умолчанию в Java, чтобы сделать их согласованными? - PullRequest
4 голосов
/ 18 сентября 2010

Я ищу набор параметров командной строки, которые позволят мне принудительно установить определенный набор настроек локали для Java-приложения.

Допустим, я не могу изменить приложение, поэтому я должен установить свойства, используя java -Dmy.prop="value".

Я специально пытаюсь изменить формат даты / времени, чтобы сделать его совместимым со стандартом ISO-8601 (военное время), но мне не удалось найти подходящие свойства для этого.

Ответы [ 3 ]

3 голосов
/ 18 сентября 2010

Я подозреваю, что правильным решением этой проблемы было бы предоставление нового варианта Locale, такого как (например) en_US_mil.

<language code>[_<country code>[_<variant code>]]

. Это можно сделать путем реализации классов через java.util.spi и java.text.spi сервисные механизмы.

В этой теме упоминается в Сайт ICU .

2 голосов
/ 18 сентября 2010

Рекомендованный способ установки настроек языка Java по умолчанию - сделать это с помощью настроек языка оболочки / операционной системы.Например, в UNIX / LINUX локаль по умолчанию определяется переменными среды.

Следующая информация взята из FAQ по интернационализации Java :

Могу ли я установить язык по умолчанию вне приложения?

Это зависит от реализации используемой вами платформы Java.Исходный языковой стандарт по умолчанию обычно определяется из языкового стандарта операционной системы хоста.Версии JRE Sun версии 1.4 и выше позволяют вам переопределять это, устанавливая системные свойства user.language, user.country и user.variant из командной строки.Например, чтобы выбрать языковой стандарт ("th", "TH", "TH") в качестве исходного языкового стандарта по умолчанию, вы должны использовать:

java -Duser.language = th -Duser.country = TH -Duser.variant = TH MainClass

Поскольку не все среды выполнения предоставляют эту функцию, ее следует использовать только для тестирования.

РЕДАКТИРОВАТЬ

Вопрос задается следующим образом:

Я специально ищу, чтобы изменить формат даты и времени, чтобы сделать его совместимым со стандартом ISO-8601 (военное время), но я не смог найти подходящих для этого подходящих средств.

Похоже, вы хотите выборочно переопределить некоторые аспекты текущей локали, а не изменять их полностью.Простой способ сделать это - заставить приложение работать;т.е. использовать указанный формат даты, а не формат по умолчанию, заданный текущей локалью.Но если приложение имеет закрытый исходный код, у вас может не быть возможности изменить его.

Это можно обойти с помощью следующего подхода:

  • Выясните, как Java реализует разрешение троек локали (страна / язык / вариант) для объектов локали.
  • Для каждой локали, которую необходимо поддерживать, создайте подкласс для существующих классов локали (и т. Д.), Чтобы реализовать новыйвариант, который использует форматы даты / времени ISO.
  • Создайте JAR, содержащий ваши пользовательские классы или ресурсы, и добавьте его в путь к классам.(Возможно, вам понадобится добавить JAR в путь к загрузочному классу и т. Д., Чтобы заставить это работать)

Наконец, если приложение не использует механизмы локали, чтобы решить, какой формат даты использовать, любые изменения основаны нана изменение локали не будет никакого влияния.

1 голос
/ 18 сентября 2010

Хорошо, меня интересовало то же самое, но пока у меня есть только частичное решение :

user.timezone=UTC
user.country=CA
user.variant=
user.language=en
file.encoding=utf8

Вы можете использовать Канаду, потому что это одна из стран, использующихФормат ISO 8601.

...