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