установите LC_*, но не LC_ALL

Можно использовать route найти Ваш маршрут по умолчанию:

$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0     *               255.255.255.0   U     1      0        0 eth0
link-local      *               255.255.0.0     U     1000   0        0 eth0
default         192.168.1.1     0.0.0.0         UG    0      0        0 eth0

Iface столбец в соответствии с местом назначения default говорит Вам, какой интерфейс используется.

13
21.06.2011, 00:11
2 ответа

Существует три набора настроек локали ¹:

  • LANG, установка нейтрализации, если Вы не указали значение для категории. Это - отступ для пользователей для указания на их локаль простым способом.
  • LC_xxx для каждой категории (xxx может быть MESSAGES, TIME, и т.д.).
  • LC_ALL переопределения все настройки. Это - путь к приложениям для переопределения всех настроек для работы в известной локали (обычно C, локаль по умолчанию), обычно так, чтобы различные команды произвели вывод в известном формате.

Таким образом, можно установить LANG=de_AT.UTF-8 и LC_MESSAGES=C (C локаль по умолчанию и означает непереведенный; en_US обычно идентично C для сообщений).

Однако существует две категории, где я не рекомендую изменить значение по умолчанию, потому что оно повреждает много программ:

  • LC_COLLATE символьный порядок сопоставления. Это не очень полезно, потому что это только указывает, как отсортировать символы, не, как отсортировать строки. Инструменты, которые знают, как отсортировать строки, не используют LC_COLLATE. Кроме того, много инструментов ожидает вещи как “[a-z] соответствия все 26 строчных букв ASCII и никакие другие символы ASCII”, но это не верно в большинстве локалей не по умолчанию (попытка echo B | LC_COLLATE=en_US grep '[a-z]').
  • LC_NUMERIC указывает, как отобразить числа. В частности, на многих языках это заставляет числа с плавающей точкой использовать a , вместо . как десятичная точка. Но большинство программ, которые анализируют числа, ожидает a . и обработка a , как разделитель полей.

Таким образом, я рекомендую

  • любой явно LC_COLLATE=C LC_NUMERIC=_C,
  • или отпуск LANG сброс и только установленный значение для полезных категорий (LC_MESSAGES, LC_TIME, LC_PAPER, плюс LC_CTYPE (чье значение может варьироваться в зависимости от Вашего терминала)).

¹ Плюс LANGUAGE с GNU libc. Если Вы не услышали об этом, Вы не отсутствуете очень.

16
27.01.2020, 19:52
  • 1
    Спасибо за подробный ответ и объяснения! Я попробую локализованный LC_NUMERIC, тем не менее, так как цифровая клавиатура на немецких клавиатурах имеет a , вместо a . (к сожалению), так введение номеров с точкой неудобно (и большинство приложений, кажется, работает приятно с нестандартным LC_NUMERIC). Я не полностью понимаю Вашего примера LC_COLLATE: В моей системе пример, который Вы дали, не соответствует B. –  Heinzi 01.07.2011, 16:29
  • 2

Локаль страницы справочника (7) говорит:

локаль по умолчанию [...] определяется с помощью следующих шагов:

  1. Если существует непустая переменная среды LC_ALL, значение LC_ALL используется.

  2. Если переменная среды с тем же именем как одна из категорий [LC_ *] выше существует и является непустым, его значение используется для той категории.

  3. Если существует непустая переменная среды ЛЕНГ, значение ЛЕНГА используется.

Так, можно использовать ЛЕНГА в качестве своего рода аналога низкого приоритета LC_ALL: установите значение ЛЕНГА к de_AT и LC_MESSAGES к en_US:

$ env LC_MESSAGES=en_US.UTF-8 LANG=de_AT.UTF-8 locale | egrep '(MESSAGES|PAPER)'
LC_MESSAGES=en_US.UTF-8
LC_PAPER="de_AT.UTF-8"
10
27.01.2020, 19:52

Теги

Похожие вопросы