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