Установка локали только на локальной машине JVM - PullRequest
1 голос
/ 12 июня 2019

Мне нужно изменить свой языковой стандарт Java на другой системный язык для рабочих целей, но, по-видимому, не существует простого способа сделать это по умолчанию.Я занимаюсь разработкой приложений CJK, но изменение действительного языкового стандарта системы для соответствия также переименовывает мои домашние папки, а это означает, что если мой метод ввода решит прекратить работу, мне придется перезагрузить всю систему.

Я попытался настроитьАргументы JVM (-Duser.language=ja -Duser.locale=JP) для

  • аргументы командной строки maven (на самом деле не то, что я хочу, но пытался из отчаяния)
  • {$project_dir}/.mvn/jvm.config (не идеально)
  • environment JAVA_ARGS (под /etc/environment)
  • аргументы maven JVM в eclipse / intellij
  • MAVEN_OPTS

, но ни один из них не работает.Здесь почти все кончено.

Для ясности, я ищу решение по следующим критериям:

  • Не зависит от проекта
  • Нетребуется изменение исходного кода проекта (например, файлов свойств проекта) за пределами .mvn
  • Не требует изменения моего фактического языкового стандарта системы (en_US)
  • Не требует постоянного обслуживания (например, постояннодобавить аргументы командной строки)

Так что, в принципе, какая-то переменная окружения.

Ответы [ 4 ]

1 голос
/ 12 июня 2019

JVM поддерживает свою собственную текущую локаль по умолчанию. Это поведение требуется спецификациями Java.

Обычно реализация JVM определяет, какая ОС хоста установлена ​​по умолчанию при запуске JVM, и использует ее в качестве своей собственной настройки по умолчанию. Дальнейшее изменение текущего значения по умолчанию в операционной системе хоста не влияет на JVM. Это поведение не , указанное в спецификации Java.

Обычно вы можете переопределить это поведение, указав локаль по умолчанию в командной строке, используемой для запуска JVM. Вы сказали, что пытались это сделать, но не объяснили, почему это не решение. Это поведение не указано в спецификации Java.

Внешний мониторинг и манипулирование

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

JMX приходит на ум.

Внешний вид

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

Сервер LDAP является одним из таких внешних мест для хранения таких значений. Вы бы использовали JNDI в Java для доступа к серверу и получения значения.

Звоните Locale.setDefault

Вызов Locale.setDefault немедленно влияет на весь код во всех приложениях в JVM. Но это не сохраняется. При перезапуске приложения или JVM вы должны позвонить снова.

Любой другой код может вызывать как этот код, так и ваш код, что делает его ненадежным. Я не рекомендую такой подход.

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

static final public Locale LOCALE = Locale.ITALY ;

В коде жизненного цикла, который вызывается при запуске приложения, звоните Locale.setDefault( SomeClass.LOCALE ) ;.

Pass Locale объект в вашем коде

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

ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;
Locale locale = Locale.CANADA_FRENCH ;  // Pass explicitly your desired/expected `Locale`.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL ).withLocale( locale ) ;
String output = today.format( f ) ;

Марди 11 июня 2019

В зависимости от текущего языка по умолчанию JVM ненадежен. Как программист, вы зависите от внешних факторов, которыми не можете управлять.

  • Системный администратор или конечный пользователь могут изменить настройки по умолчанию при развертывании.
  • Любой код в любом потоке любого приложения или библиотеки в JVM, вызывающем Locale.setDefault, немедленно влияет на ваш код.

Кстати, то же самое относится и к часовому поясу, ZoneId. Лучше всегда явно передавать желаемый / ожидаемый часовой пояс.

Кроме того, если локаль или часовой пояс имеют решающее значение, лучше всего подтвердить это пользователем.

1 голос
/ 12 июня 2019

Вы можете включить эти свойства в application.properties или application.yaml:

spring.mvc.locale=pt_BR
spring.mvc.locale-resolver=fixed

Изменение языка на нужный вам.

Эти свойства используются для определения языкового стандарта при настройке WebMvcAutoConfiguration следующим способом:

    @Bean
    @ConditionalOnMissingBean
    @ConditionalOnProperty(prefix = "spring.mvc", name = "locale")
    public LocaleResolver localeResolver() {
        if (this.mvcProperties.getLocaleResolver() == WebMvcProperties.LocaleResolver.FIXED) {
            return new FixedLocaleResolver(this.mvcProperties.getLocale());
        }
        AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
        localeResolver.setDefaultLocale(this.mvcProperties.getLocale());
        return localeResolver;
    }

Вы также можете проверить исходный код здесь

0 голосов
/ 12 июня 2019

Единственный способ, который я нашел, который работает для меня, это установить LANG=ja_JP.UTF-8 в качестве фактической переменной системной среды в моих средах разработки, которая срабатывает после загрузки (и eclipse, и intellij предоставляют это в конфигурациях запуска). Но мне действительно очень не нравится этот подход.

0 голосов
/ 12 июня 2019

Вы можете попробовать установить параметры jvm, такие как (presudocode)

Первый способ, вы можете сделать это так -

java -Duser.country=CA -Duser.language=fr ........

Второй способ будет вызыватьМетод

Locale.setDefault(Locale)

Приведенный выше метод установит его как мудрый языковой стандарт jvm.

Третий способ согласно документам

Использование явного языкового стандарта

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

Многонациональные компании имеют клиентов по всему миру.Это означает, что как их клиенты, так и сотрудники могут говорить на разных языках и иметь разные ожидания того, как должна вести себя компания и ее программное обеспечение.Более того, вполне возможно, даже обычное дело, чтобы французский сотрудник обрабатывал рекорд продаж для итальянского клиента.В этих ситуациях вам понадобится абсолютный контроль над тем, какой язык вашей организации и объекты пользовательского интерфейса используют для манипулирования и представления данных.Вашему приложению может потребоваться распечатать квитанции о продажах с использованием итальянских форматов даты и валюты, а также отсортировать списки клиентов для английского продавца.Комбинации слишком многочисленны, чтобы перечислять их, но технология Java предоставляет вам возможность справиться с этой сложностью.

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

Если вы отслеживали предпочтения языкового стандарта пользователя, вы бы явно создали экземпляры чувствительных к языку классовпредоставление локали в конструкторе или методе создания.Представьте, что объект предпочтений хранит выбор языка вашего клиента:

Locale userLocale = preferences.getLocale(); 
NumberFormat nf = NumberFormat.getInstance(userLocale);

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

Что вы можете сделать, это установить одну глобальную локаль или оставить одну локаль по умолчанию.И всякий раз, когда это необходимо, в методе укажите явно «языковой стандарт».

Пожалуйста, переведите также следующие ссылки:

https://www.top -password.com / blog / tag/ change-system-locale-windows-command-line /

https://www.oracle.com/technetwork/articles/javase/locale-140624.html#using

...