Locale.getDefault() всегда возвращает en

Серверы на машине unix всегда используют en в качестве локали по умолчанию. Ниже приведен вывод локали

 LANG=en_US
 LC_CTYPE="C"
 LC_NUMERIC="C"
 LC_TIME="C"
 LC_COLLATE="C"
 LC_MONETARY="C"
 LC_MESSAGES="C"
 LC_ALL=C

Я просто не понимаю, если LANG установлен правильно, то почему серверы начинаются с en locale.


person Delta    schedule 22.05.2012    source источник


Ответы (1)


В Linux/Unix/Mac параметры LC_ALL и LANG могут управлять локалью по умолчанию для программ Java. В Windows локали задаются на панели управления в разделе «Язык и региональные стандарты».

Когда JVM запускается в среде *nix, она делает следующее:

  • Сканировать окружающую среду на наличие LC_ALL
  • Если LC_ALL не существует, просканируйте среду на наличие LANG
  • Если задан параметр JVM user.language, используйте его вместо переменных среды.
  • Если ничего не установлено, по умолчанию en_US (я считаю, что это последний случай отказа)

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

Вы можете изменить LC_ALL в своем случае и перезапустить JVM, и вы должны получить новое значение для java.util.Locale.getDefault().

Пример:

import java.util.Locale;

public class LocaleTest {
   public static void main(String[] args) {
      System.out.println(Locale.getDefault());
   }
}

Вот работает:

> LC_ALL=en_UK java LocaleTest
en_UK

> LC_ALL=ja_JP java LocaleTest
ja_JP

Также обратите внимание, что если вы используете Java 1.7.0-b147, существует ошибка, связанная с тем, что JRE не распознает настройки среды для языкового стандарта и всегда будет использовать системный языковой стандарт по умолчанию.

Отчет об ошибке здесь: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7073906

person wkl    schedule 22.05.2012
comment
Спасибо, биррири. Но метод getDefault возвращает Locale на основе свойств user.language. Если эти свойства не передаются явно при работе таких серверов, как этот -Duser.language=en_GB, то как устанавливаются эти значения? Эти свойства устанавливаются, когда пользователь входит в систему, или jvm устанавливает эти свойства в зависимости от среды. - person Delta; 22.05.2012
comment
@Delta - как я уже упоминал, он будет смотреть на вашу локальную среду и использовать переменные LC_ALL или LANG для локали при запуске JVM. Если ничего не установлено, по умолчанию будет установлено какое-то жестко закодированное значение (en_US). - person wkl; 22.05.2012
comment
Спасибо биррейри. Я собираюсь внести это изменение и посмотреть, работает ли оно правильно. Я буду держать вас в курсе. Спасибо - person Delta; 22.05.2012
comment
Спасибо. Установкой LC_ALL проблема исправлена. - person Delta; 25.05.2012