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

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

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

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

22
задан 4 June 2012 в 16:25

2 ответа

Полезный ответ Lekensteyn работает отлично, если Вы хотите переключиться на американский английский язык по требованию, как OP запросил, но если Вы хотите переключиться на другой язык по требованию, больше работы необходимо.

Перед запуском необходимо установить таблицы сообщений с sudo apt-get install language-pack-<lang-tag>, где <lang-tag> простой подтег языка RTF 5646, такой как es для испанского языка.

Вводная информация

GNU находящиеся в gettext утилиты дает приоритет нестандартному LANGUAGE переменная среды [1] по определенным POSIX переменным среды локали LC_ALL, LC_MESSAGES, и LANG (в том порядке).

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

Опция 1: набор LANGUAGE

Пример: переключитесь на испанский язык (es) сообщения для данного случая:

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

8
ответ дан 4 June 2012 в 16:25

Существует несколько переменных среды, доступных для изменения языковых настроек. Вы можете просмотреть текущие настройки локали, выполнив команду 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=
0
ответ дан 4 June 2012 в 16:25

Другие вопросы по тегам:

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