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

17

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

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

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

    
задан takeshin 27.05.2012 в 07:37
источник

2 ответа

17

Для изменения языковых настроек доступно несколько переменных среды. Вы можете просмотреть текущие настройки локали, выполнив команду 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 27.05.2012 в 07:44
источник
6

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

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

Фоновая информация

Утилиты GNU 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 ).
Однако локализованные сообщения могут существовать только на уровне language , а резервное копирование - использовать сообщения, соответствующие части language ( es , в данном случае).

Вариант 2: Unset 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

Это решение имеет то преимущество, что перед локализацией all локализации (например, LC_TIME для форматов даты / времени) и <неявно> установка LC_MESSAGES также сообщает non -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 , но не обязательно к другие вкусы ; Лекенстейн утверждает, что Kubuntu не выполняет не LANGUAGE .
По-видимому, LANGUAGE должно быть установлено not по умолчанию, учитывая, что в его отсутствие соблюдается значение LC_MESSAGES , подразумеваемое значением LANG (которое определяет текущую локаль).

[3] Вы также можете использовать этот подход для перехода на [US] English, назначив либо LANGUAGE=C или LANGUAGE=POSIX (в качестве альтернативы, LANG=C / LANG=POSIX ), хотя я не знаю, активно ли это признанный или просто механизм fallback , учитывая, что эти значения не начинаются с тега language ; возможно, лучшим выбором будет en_US .

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

ответ дан mklement0 02.11.2016 в 02:10