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.

Ответ 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