Тимчасово змінити мову термінальних повідомлень / попереджень / помилок


22

Повідомлення в моєму терміналі за замовчуванням відображаються за допомогою російської мови, яка є моєю рідною.

На хвилину я хочу, щоб вони були англійською мовою (наприклад, щоб вставити на форумах), а потім повернутися до мови за замовчуванням.

Як я можу зробити перемикач і переключитися назад за допомогою bash?

Відповіді:


23

Існує кілька змінних середовищ для зміни мовних налаштувань. Ви можете переглянути свої поточні параметри локалі, виконавши localeкоманду. Щоб змінити всі параметри локалі на англійську, використовуйте LANG=C. Ця Cмова завжди доступна без встановлення додаткових мовних пакетів. (Щоб тимчасово змінити не-англійські мови, див. Публікацію @ mklement0 .)

Приклади:

Виконання команди з налаштуваннями мови за замовчуванням та друк поточних параметрів мови:

$ /nonexistent
bash: /nonexistent: Bestand of map bestaat niet
$ locale
LANG=nl_NL.UTF-8
LANGUAGE=
LC_CTYPE="nl_NL.UTF-8"
LC_NUMERIC="nl_NL.UTF-8"
LC_TIME="nl_NL.UTF-8"
LC_COLLATE="nl_NL.UTF-8"
LC_MONETARY="nl_NL.UTF-8"
LC_MESSAGES="nl_NL.UTF-8"
LC_PAPER="nl_NL.UTF-8"
LC_NAME="nl_NL.UTF-8"
LC_ADDRESS="nl_NL.UTF-8"
LC_TELEPHONE="nl_NL.UTF-8"
LC_MEASUREMENT="nl_NL.UTF-8"
LC_IDENTIFICATION="nl_NL.UTF-8"
LC_ALL=

Тимчасово замініть мову для однієї програми і покажіть, що вона дійсно тимчасова:

$ LANG=C ls /nonexistent
ls: cannot access /nonexistent: No such file or directory
$ ls /nonexistent
ls: kan geen toegang krijgen tot /nonexistent: Bestand of map bestaat niet

Змініть локаль для всіх команд, виконаних у поточній оболонці, і знову додайте докази:

$ LANG=C
$ ls /nonexistent
ls: cannot access /nonexistent: No such file or directory
$ locale
LANG=C
LANGUAGE=
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=

6
Для інших користувачів, які мають проблеми з тим, як це не працює, для мене все ще є налаштування LANGчи LANG_ALLне працює LANGUAGE. Див. Чому перевизначення змінної середовища LANG не змінює мову для мене?
gertvdijk

1
@gertvdijk: Дякую за це; Причина, що ця відповідь працює навіть без встановлення, LANGUAGEє винятком : gettext GNU надає перевагу LANGUAGEзначенню, за винятком випадків, коли значення (ефективне) LC_MESSAGES(як правило, встановлене опосередковано через LANGабо LC_ALL) є Cабо (або його синонім) POSIX. Також зверніть увагу , що LANGUAGEтрапляється бути знята в цій відповіді, в той час як він буде встановлений за замовчуванням, і якщо він встановлений, ви повинні перевизначити його , щоб перейти до конкретної локалі мови (на відміну від «C» / «POSIX»), яка є що ти знайшов.
mklement0

Ваша відповідь чудово працює при переключенні на локальний пункт "C" (з повідомленнями в англійській мові США, як повторно запитані), але не працюватиме для інших локальних файлів, якщо LANGUAGEявно не встановлено або скасовано. Зважаючи на загальну назву питання, ймовірно, що люди знайдуть цю відповідь і хочуть перейти на не англійську мову, тому, будь ласка, подумайте про те, щоб додати цю інформацію до своєї відповіді.
mklement0

@ mklement0 З огляду на контекст запитання (розміщення англійських повідомлень про помилки), я вважаю, що поточна публікація є достатньою. Ви можете додати ще одну відповідь, щоб пояснити деталі навколо, LANGUAGEякщо хочете :)
Lekensteyn

Я додав власну відповідь , як ви запропонували. Якщо ви погоджуєтесь з моєю оцінкою, що майбутні читачі можуть завітати сюди, бажаючи перейти на будь-яку мову (як уже декілька людей вже активно вказали), будь ласка, додайте посилання на мою відповідь на ваше запитання. Окрім цього, я пропоную змінити значення LANGUAGEу вашому вибірковому висновку на nl, яке є фактичним значенням за замовчуванням, коли ваша мова nl_NL.UTF-8.
mklement0

9

Корисна відповідь Лекенштейна чудово працює, якщо ви хочете перейти на англійську мову США на вимогу, як вимагає ОП, але якщо ви хочете перейти на іншу мову на вимогу , потрібно більше роботи.

Перш ніж почати, ви повинні встановити таблиці повідомлень з sudo apt-get install language-pack-<lang-tag>, де <lang-tag>є простим підтегом мови RTF 5646 , наприклад esдля іспанської.

Довідкова інформація

ГНУ GetText заснованих утиліти дають пріоритет до нестандартної LANGUAGEзмінної середовищі [1] над POSIX певної локалі змінну середу LC_ALL, LC_MESSAGESі LANG(в зазначеному порядку).

З огляду на , що LANGUAGEза замовчуванням встановлюються в системах Ubuntu [2] , а саме до підрядку з LANGзначення , яке відображає або простий тег мови (наприклад, esдля іспанської мови) або мови область тегів (наприклад, de_DEдля варіанта Німеччині німецького), ви повинні скасувати або змінити LANGUAGE, щоб повідомлення іншої мови набули чинності. [3]

Варіант 1: Встановити LANGUAGE

Приклад : перехід на іспанські ( es) повідомлення ad-hoc:

$ LANGUAGE=es ls NoSuchFile
ls: no se puede acceder a NoSuchFile: No existe el archivo o el directorio

Примітка.es Достатній простий тег мови, такий як , але ви можете додати ідентифікатор регіону (наприклад, es_ARдля Аргентини) і навіть суфікс шаблону (наприклад, es_AR.UTF-8).
Однак локалізовані повідомлення можуть існувати лише на мовному рівні, а резервна копія полягає у використанні повідомлень, які відповідають мовній частині ( esу цьому випадку).

Варіант 2: Зніміть LANGUAGEі встановітьLC_ALL

Це альтернативне рішення undefines LANGUAGE , а потім використовує POSIX змінну мовного середовища , LC_ALLщоб встановити неявно LC_MESSAGES[4] :

$ LANGUAGE= LC_ALL=es_ES.UTF-8 ls NoSuchFile
ls: no se puede acceder a NoSuchFile: No existe el archivo o el directorio

Це рішення має перевагу в налаштуванні всіх аспектів локалізації на вказану локаль (наприклад, LC_TIMEформати дати / часу), а також (неявно) LC_MESSAGESтакож інформує програми, що не належать до GNU, бажаною мовою.

Зверніть увагу, наскільки LC_ALLпотрібне точне повне ім’я мови, включаючи суфікс шаблону, щоб бути ефективним ( es_ES.UTF-8) (на відміну від цього LANGUAGE, для якого достатньо простого тегу мови (як es)). Те саме стосується налаштування LC_MESSSAGESі LANG. Вказівка ​​недійсного / невстановленого імені локальної локалізації спричиняє запас локалі POSIX, а отже, англійську мову США.


Виноски

[1] Причини , по яким відповідь Lekensteyn працює навіть без зняття з охорони / перевизначення LANGUAGEє виняток : якщо (ефективне) LC_MESSAGESзначення (зазвичай встановлюється побічно через LANGабо LC_ALL) або Cчи (його синонім) POSIX, що значення дотримується, незалежно від вартості LANGUAGE, якщо хто-небудь. І навпаки, якщо (ефективним) LC_MESSAGESзначенням є будь-яка інша, конкретна локаль, LANGUAGEмає перевагу.

[2] Це стосується належних Ubuntu , але не обов'язково інших ароматів ; Lekensteyn стверджує , що Kubuntu це НЕ встановлено LANGUAGE.
Можна стверджувати, що LANGUAGEповинно НЕ бути встановлено за замовчуванням, якщо врахувати , що в її відсутність, LC_MESSAGESзначення випливає з LANGзначення (яке визначає поточний стандарт), дотримується.

[3] Ви також можете використовувати цей підхід для переходу до [американської] англійської мови, призначивши LANGUAGE=Cабо LANGUAGE=POSIX(як альтернативу, LANG=C/ LANG=POSIX), хоча мені незрозуміло, чи це активно розпізнається чи просто резервний механізм, враховуючи, що ці значення не відповідають не починати з мовного тегу; можливо, кращий вибір був би en_US.

[4] Там в край випадок , коли цей підхід не працює: Спроба викликати виконуваний файл з шляху - будь то відносне або абсолютне - не переходить на зазначену мову, в той час як саме ім'я файлу робить:
LANGUAGE= LC_ALL=es_ES.UTF-8 /path/to/no_such_utilityробить НЕ роботу (виводить повідомлення у поточному локалі), тоді як
LANGUAGE= LC_ALL=es_ES.UTF-8 no_such_utilityтак (видає іспанське повідомлення про помилку).
Якщо хтось знає, чому і чи є для цього вагомі причини, повідомте нам.


Порада капелюха @ wjandrea за його допомогу в структуруванні цього допису.
mklement0
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.