На что я должен установить свой язык и каковы последствия этого?


19

Этот вопрос был вызван тем, что браузер Chromium не позволяет устанавливать размер бумаги по умолчанию для «Печатать в файл» , а также беседой с @Gilles в чате. Как указал @don_crissti, и, как я убедился, изменение языкового стандарта (по крайней мере LC_PAPER) имеет значение в выборе размера бумаги.

Я никогда не задумывался о том, что выбрать, и всегда делал en_US.UTF-8это, потому что это казалось разумным выбором по умолчанию.

Тем не менее, за @Gilles в чате (см. Разговор, начинающийся на http://chat.stackexchange.com/transcript/message/17017095#17017095 ). Экстракты:

Жиль: по умолчанию LC_PAPER - $ LANG

Жиль: Вы должны иметь LANG = en_US.UTF-8. Это плохая идея: она устанавливает LC_COLLATE, и это почти всегда плохо

Жиль: LC_COLLATE не описывает правильное сопоставление, оно слишком ограничивающее (оно идет символ за символом), удаляет LANG и вместо этого устанавливает LC_CTYPE и LC_PAPER

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

Очевидно, что здесь есть проблемы, о которых я не знаю, и я уверен, что многие другие тоже. Итак, какие проблемы следует учитывать при настройке локалей и как их устанавливать? Я всегда просто работал dpkg-reconfigure localesв Debian и не думал об этом дважды.

Конкретный вопрос: я должен установить мою локаль в en_IN.UTF-8? Есть ли недостатки этого?

Смотрите также: Влияет ли (должно) LC_COLLATE на диапазоны символов?

Ответы:


29

Настройки локали - это пользовательские настройки, относящиеся к вашей культуре.

Названия локалей

Во всех текущих версиях Unix, о которых я знаю (но не о некоторых антиквариатах), имена локалей следуют той же схеме:

  • ISO 639-1 строчными двубуквенный код языка, или ISO 639-2 код языка три буквы , если язык не имеет два-буквенный код. Например, enдля английского, deдля немецкого, jaдля японского, ukдля украинского, berдля берберского, ...
  • Для многих, но не для всех языков, подчеркивание, _за которым следует двухбуквенный код страны в соответствии с ISO 3166 . Таким образом: en_USдля американского английского, en_UKдля британского английского, fr_CAканадского (квебекского) французского, de_DEдля немецкого из Германии, de_ATдля немецкого из Австрии, ja_JPдля японского (из Японии) и т. Д.
  • Необязательно, точка с .последующим именем персонажа , кодирующей такими как UTF-8, ISO-8859-1, KOI8-U, GB2312, Big5и т.д. С GNU LIBC по крайней мере (не знаю , насколько широко это), случай и пунктуация игнорируются при кодировании имен. Например, zh_CN.UTF-8китайский (мандаринский) (упрощенный) кодируется в UTF-8, zh_CNкитайский - мандаринский код в GB2312, а zh_TWтайваньский (традиционный) китайский - в Big5.
  • По желанию, знак at, @сопровождаемый именем варианта. Значение вариантов зависит от локали. Например, во многих европейских странах есть @euroвариант локали, где знак валюты - это евро, а кодировка - это символ, который включает этот символ (ISO 8859-15 или ISO 8859-16), в отличие от неукрашенного варианта со старым знаком валюты. Например, en_IE(английский, Ирландия) использует кодировку latin1 (ISO 8859-1) и £ в качестве символа валюты, а en_IE@euroкодировку latin9 (ISO 8859-15) и € в качестве символа валюты.

Кроме того, есть два имени локали, которые существуют во всех Unix-подобных системах: Cи POSIX. Эти имена являются синонимами и означают computerese, то есть настройки по умолчанию, которые подходят для данных, которые анализируются компьютерной программой.

Настройки локали

POSIX определяет следующие категории локалей :

  • LC_CTYPE: набор символов, используемый терминальными приложениями: данные классификации (какие символы являются буквами, пунктуацией, пробелами, недействительными и т. д.) и преобразование регистра. Текстовые утилиты обычно учитывают LC_CTYPEграницы символов.
  • LC_COLLATE: порядок сортировки (т.е. сортировки). Этот параметр имеет очень ограниченное использование по нескольким причинам:
    • Большинство языков имеют сложные правила, которые зависят от того, что сортируется (например, словарные слова и собственные имена могут не использовать один и тот же порядок) и не могут быть выражены с помощью LC_COLLATE.
    • Есть несколько приложений, где правильный порядок сортировки имеет значение, которые выполняются программным обеспечением, которое использует настройки локали. Например, текстовые процессоры хранят язык и кодировку файла в самом файле (в противном случае файл не будет правильно обрабатываться в системе с другими настройками языкового стандарта) и не заботятся о параметрах языкового стандарта, заданных средой.
    • LC_COLLATEможет иметь неприятные побочные эффекты, в частности потому, что это вызывает порядок сортировки A <a <B <…, который заставляет «между A и Z» включать строчные буквы от a до y. В частности, очень распространенные регулярные выражения, такие как [A-Z]break в некоторых приложениях .
  • LC_MESSAGES: язык информационных сообщений и сообщений об ошибках.
  • LC_NUMERIC: форматирование чисел: десятичный разделитель и разделитель тысяч.
    Многие приложения жестко закодированы .как десятичный разделитель. Это делает LC_NUMERICне очень полезным и потенциально опасным:
    • Даже если вы установите его, вы все равно будете часто видеть формат по умолчанию.
    • Скорее всего, вы попадаете в ситуацию, когда одно приложение производит вывод, зависящий от локали, а другое приложение ожидает .десятичную точку или ,разделитель полей.
  • LC_MONETARY: нравится LC_NUMERIC, но для сумм в местной валюте.
    Очень немногие приложения используют это.
  • LC_TIME: форматирование даты и времени: названия дней и месяцев, 12- или 24-часовые часы, порядок частей даты, пунктуация и т. д.

GNU libc, который вы найдете в не встроенном Linux, определяет дополнительные категории локалей:

  • LC_PAPER: размер бумаги по умолчанию (определяется высотой и шириной).
  • LC_NAME, LC_ADDRESS, LC_TELEPHONE, LC_MEASUREMENT, LC_IDENTIFICATIONЯ не знаю ни одного приложения , которое использует их.

Переменные среды

Приложения, которые используют настройки локали, определяют их из переменных среды.

  • Затем используется значение LANGпеременной среды, если оно не переопределено другим параметром. Если LANGне установлено, локаль по умолчанию - C.
  • Эти LC_xxxимена могут быть использованы в качестве переменных окружения.
  • Если LC_ALLустановлено, то все остальные значения игнорируются; это в первую очередь полезно для настройки LC_ALL=Cзапуска приложений, которые должны выдавать одинаковые выходные данные независимо от того, где они запущены.
  • Кроме того, GNU libc используетсяLANGUAGE для определения запасных вариантов LC_MESSAGES(например, LANGUAGE=fr_BE:fr_FR:enдля предпочтения бельгийского французского, или, если нет французского или французского, или, если английский недоступен).

Установка локалей

Данные локали могут быть большими, поэтому некоторые дистрибутивы не доставляют их в удобной форме и вместо этого требуют дополнительного шага установки.

  • В Debian для установки локалей запустите dpkg-reconfigure localesи выберите из списка в диалоговом окне или отредактируйте, /etc/locale.genа затем запустите locale-gen.
  • В Ubuntu для установки локалей запустите locale-genс именами локалей в качестве аргументов.

Вы можете определить свой собственный язык .

Рекомендация

Полезные настройки:

  • Установите LC_CTYPEязык и кодировку, в которой вы кодируете свои текстовые файлы. Убедитесь, что ваши терминалы используют эту кодировку.
    Для большинства языков важна только кодировка. Есть несколько исключений; например, в верхнем регистре iявляется Iв большинстве языков , но İна турецком языке ( tr_TR).
  • Установите LC_MESSAGESязык, на котором вы хотите видеть сообщения.
  • Установите LC_PAPERзначение, en_USесли вы хотите, чтобы по умолчанию использовалась буква US Letter, и почти все остальное (например en_GB), если вы хотите использовать формат A4.
  • При желании, установите LC_TIMEваш любимый формат времени.

Как объяснено выше, избегайте установки LC_COLLATEи LC_NUMERIC. Если вы используете LANG, явно переопределите эти две категории, установив их в C.


Привет, Жиль, спасибо за подробный ответ. Где можно переопределить настройки по умолчанию в Debian? Так как мне нужен размер бумаги A4, я думаю, мне нужно переопределить значение по умолчанию LC_PAPER. И могу ли я обновить это через систему без перезагрузки?
Фахим Митха

1
@FaheemMitha Какой лучший способ установить переменные окружения в зависимости от дистрибутива / оболочки? И если вы хотите установить его для всей системы, в Debian также есть /etc/default/locale. Эти файлы вступают в силу при входе в систему; Вы можете сделать это export LC_PAPER=…в оболочке, чтобы повлиять на команды, запускаемые из этой оболочки.
Жиль "ТАК - перестань быть злым"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.