Временно измените язык для сообщений терминала / предупреждений / ошибок

22

Сообщения в моем терминале отображаются по умолчанию на русском языке, который является моим родным.

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

Как я могу переключиться и переключиться обратно, используя bash?

takeshin
источник

Ответы:

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=
Lekensteyn
источник
6
Для других пользователей, испытывающих проблемы с тем, чтобы заставить это работать - настройка LANGили LANG_ALLне работает для меня, пока LANGUAGEесть. См. Почему переопределение переменной среды LANG не меняет язык для меня?
gertvdijk
1
@gertvdijk: Спасибо за это; причина, по которой этот ответ работает даже без установки, LANGUAGEявляется исключением : GNU gettext отдает приоритет 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 язык Subtag , например, esна испанском языке.

Справочная информация

Утилиты на основе gettext в GNU отдают приоритет нестандартной LANGUAGEпеременной среды [1] над переменными среды LC_ALL, определяемыми POSIX 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

Это альтернативное решение сначала определяет неопределенность LANGUAGE , а затем использует LC_ALLнеявную переменную окружения POSIX для установки 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] Причины, по которым ответ Лекенштейна работает даже без отмены или переопределения, LANGUAGEявляются исключением : если (эффективное) LC_MESSAGESзначение (обычно устанавливаемое косвенно через LANGили LC_ALL) равно Cили (его синоним) POSIX, это значение уважается независимо от значения LANGUAGE, если есть. И наоборот, если (эффективное) LC_MESSAGESзначение является любым другим, конкретным языком, LANGUAGEимеет приоритет.

[2] Это относится к собственно Ubuntu , но не обязательно к другим вкусам ; Lekensteyn утверждает , что Kubuntu это не установлено LANGUAGE.
Можно утверждать, что LANGUAGEдолжно не быть установлено по умолчанию, если учесть , что в ее отсутствие, LC_MESSAGESзначение вытекает из LANGзначения (которое определяет текущий стандарт), соблюдается.

[3] Вы также можете использовать этот подход, чтобы переключиться на [US] английский, назначив либо 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делает (выводит испанское сообщение об ошибке).
Если кто-то знает, почему и есть ли для этого веская причина, сообщите нам.

mklement0
источник
Наконечник шляпы @ wjandrea за его помощь в структурировании этого поста.
mklement0