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


13

Я хотів би мати німецький (Австрія) локальний (розмір паперу формату А4, 24 години часу, рік-мм-дд), але англомовний інтерфейс користувача (я не люблю погані переклади). Я подумав, що правильний спосіб досягти цього - встановити такі LC_змінні в моєму .bashrc(будь-ласка, виправте мене, якщо я помиляюся):

LC_MESSAGES=en_US.UTF-8
LC_$everythingelse=de_AT.UTF-8

Чи є більш елегантний спосіб встановити LC_ $ allelse, а не встановлювати кожне значення? Налаштування LC_ALL - це не варіант, оскільки він має перевагу перед LC_MESSAGES:

$ export LC_ALL=de_AT.UTF_8
$ export LC_MESSAGES=en_US.UTF_8
$ echo $LC_MESSAGES
en_US.UTF_8
$ locale | grep LC_MESSAGES
LC_MESSAGES="de_AT.UTF_8"

PS: Це загальноприйнята машина, і я не люблю, тому зміна загальносистемних налаштувань - це не варіант.

Відповіді:


15

Існує три набори налаштувань локалі¹¹:

  • 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" .розглядають ,як роздільник поля.

Тож рекомендую

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

¹ Плюс LANGUAGEдо GNU libc. Якщо ви про це не чули, ви багато чого не пропускаєте.


Дякуємо за детальну відповідь та пояснення! Я спробую локалізовану LC_NUMERIC, хоча, так як Numpad на німецьких клавіатурах є ,замість .(на жаль), тому введення чисел з точкою незручно (і більшість додатків , здається, добре працюють з нестандартним LC_NUMERIC). Я не повністю розумію ваш приклад LC_COLLATE: У моїй системі приклад, який ви подали, не відповідає B.
Heinzi


10

Людина сторінка локалі (7) говорить:

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

  1. Якщо є ненульова змінна середовища LC_ALL, використовується значення LC_ALL.

  2. Якщо змінна середовища з тим самим іменем, що і одна з категорій [LC_ *] вище, не є нульовою, її значення використовується для цієї категорії.

  3. Якщо є ненульова змінна середовище LANG, використовується значення LANG.

Отже, ви можете використовувати LANG як своєрідний аналог з низьким пріоритетом LC_ALL: встановіть значення LANG 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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.