Где переменная $ LANG устанавливается в Mac OS X?

24

Я впервые использовал wgetпосле установки Lion OS X и заметил, что wget локализован на мой родной язык. Запуск setкоманды в терминале показал, что моя LANGпеременная представляет мой локальный язык. Где я могу изменить это или заставить wgetигнорировать этот параметр?

Обновить

Вот что localeдает мне:

LANG="lt_LT.UTF-8"
LC_COLLATE="lt_LT.UTF-8"
LC_CTYPE="lt_LT.UTF-8"
LC_MESSAGES="lt_LT.UTF-8"
LC_MONETARY="lt_LT.UTF-8"
LC_NUMERIC="lt_LT.UTF-8"
LC_TIME="lt_LT.UTF-8"
LC_ALL=

Следовательно, весь вывод непараметрических параметров (таких как приглашения и сообщения отладки) осуществляется на литовском языке. Это моя проблема. Я хотел бы вернуть его на английский.

Я использую в zshкачестве оболочки для входа в систему.

Eimantas
источник
С чем конкретно проблема wget? А что localeпоказывает и совпадает ли это с тем, что вы ожидаете от выбора языка на панели настроек « Язык и текст» ?
bmike

Ответы:

26

По умолчанию Терминал устанавливает переменные среды локали в соответствии с выбранным в данный момент языком и форматами времени / даты / числа, которые использует Терминал, которые выбираются через

Системные настройки> Язык и текст

(Это имя на Lion. В более ранних системах точное имя панели настроек может отличаться.)

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

Постоянный подход состоит в том, чтобы сказать Терминалу не устанавливать локальные переменные среды, отключив

Терминал> Настройки> Настройки> [профиль]> Дополнительно> Задать переменные среды локали при запуске

Тогда языковой стандарт по умолчанию будет «C» без указания языка, а большинство программ по умолчанию будет использовать английский.

Обратите внимание, что отключение этого означает, что некоторые программы не будут знать, какой терминал использует кодировку символов, и будут предполагать, что это только ASCII или ISO-Latin-1. Поэтому, если Терминал использует UTF-8 (по умолчанию), эти программы могут работать или не работать так, как нужно.

Если это главным образом wget, я рекомендую вам сделать копию профиля настроек по умолчанию, отключить настройку локали в вашем пользовательском профиле и использовать этот профиль только при использовании wget, чтобы вы могли продолжать использовать UTF-8 с полной поддержкой при использовании других программ, используя настройки по умолчанию.

Как уже упоминали другие, вы также можете переопределить начальные настройки локали, предоставленные терминалом, в сценарии запуска оболочки. Для zsh поместите его в ~ / .zshrc. Для bash используйте ~ / .bashrc (а если у вас его еще нет, создайте ~ / .bash_profile, который запускает ~ / .bashrc).

См. X-man-page: // 1 / locale для получения дополнительной информации о каждом из значений среды локали.

Однако, если вы просто unset LANGили установите его в «C», это обычно применяется ко всем вашим оболочкам и программам, в то время как большую часть времени вы, вероятно, захотите использовать UTF-8 и в терминале установить переменные языкового стандарта для соответствия, чтобы получить высшую степень сотрудничества, верности и функциональности.

Поэтому, если вы собираетесь пойти по этому пути, я предлагаю вам написать код для редактирования, а не замены начальных значений, чтобы вы сохранили информацию о кодировке («UTF-8») и просто принудительно переключили язык на английский, вместо того, чтобы устанавливать переменные в «C».

Например, это работает в zsh и bash:

# Replace Lithuanian with English
export LANG=${LANG/lt_LT/en_US}

Когда LANG="lt_LT.UTF-8"это изменит его на LANG="en_US.UTF-8". У меня нет wgetвозможности проверить это, но этого должно быть достаточно.

Это означает, что если вы измените настройку кодировки символов в терминале, вы не переопределите ее в скрипте запуска оболочки.

Крис Пейдж
источник
Красиво сделано; обобщить команду LANGпереопределения: echo ${LANG/*./en_US.}заменяет имя текущей культуры en_US независимо от того, что это такое; работает bash, ksh, zsh.
mklement0
7

Это установлено здесь ...

введите описание изображения здесь

Если вам нужно больше или меньше опций в раскрывающемся меню, перейдите на вкладку « Кодировки », чтобы просмотреть еще большую награду.

bmike
источник
3
на OS X это ~ / .bash_profile, а не bashrc. Люди очень запутались, когда читали онлайн-уроки.
Энрико Сусатио
Черт возьми это - спасибо, что поймали это. Я даже зашел на страницу с открытым исходным кодом и проверил, внесла ли компания Apple изменения в gnu bash, и все равно ошиблась. (редактирование моего ответа - спасибо @the_great_monkey)
bmike
4
Терминал создает оболочки входа в систему, которые запускают ~ / .bash_profile. Однако большинство пользовательских настроек следует помещать в ~ / .bashrc, чтобы они также применялись к оболочкам, не входящим в систему (например, к вложенным оболочкам), а ~ / .bash_profile должен запускать ~ / .bashrc, поэтому он применяется к оболочкам входа. Файл ~ / .bash_profile, как правило, в основном пустой и содержит код специально для оболочек входа верхнего уровня, который пользователь не хочет запускать для вложенных оболочек.
Крис Пейдж
1
«Беглое прочтение справочной страницы показывает, что оболочка устанавливает это значение при каждом входе в систему». На справочной странице bash это сказано, но Terminal устанавливает начальное значение, и я никогда не видел, чтобы bash устанавливал их, если они еще не установлены. Если я отключу настройку «установить среду локали…», ни одна из переменных не будет установлена, и локаль покажет, LANG=а все остальные значения по умолчанию будут равны "C".
Крис Пейдж
2

Я решил эту проблему, установив язык в своем файле .profile, который загружается при каждом запуске терминала.

export LANG="en_US.UTF-8"
export LC_ALL="POSIX"
user42973
источник
LC_ALLпереопределяет LANG, поэтому ваша первая команда не будет иметь никакого эффекта.
mklement0
Кроме того, POSIXэто эквивалентно, Cи это не справляется с Unicode вообще.
Себастьян Граф
1

Основываясь больше на опыте Linux, если вы не хотите полностью менять свою локализацию с помощью LC_LANG, но хотели бы просто иметь системные сообщения на английском языке, вы просто должны установить

LC_COLLATE=C    (to have standard sorting in ls, etc)
LC_CTYPE=en_US.UTF-8
dmpogo
источник
Это LC_MESSAGESпеременная, которая определяет, на каком языке должны выводиться сообщения (если они установлены).
mklement0
0

Используя сервер Debian на французском языке и клиент Bash Macsox, я «просто» должен был добавить это в мой файл .bash_profile в пользовательском каталоге macosx:

экспорт LANG = fr_FR.UTF-8

Решаемые.

Xiangxing
источник
0

Другие ответы верны, то есть о Terminalнастройке для установки переменных окружения локали при запуске и использовании оболочки /etc/profile. Однако есть еще один способ, который стоит понять, особенно если «проблема» возникает из-за удаленного sshвхода в систему.

OpenSSH (используемый в Linux, BSD и macOS) может отправлять переменные среды из клиентской среды в оболочку, которую запускает сервер. Это происходит только в том случае, если клиент настроен на их отправку, а сервер настроен на их прием. Клиент ( ~/.ssh/config) должен иметь:

SendEnv LANG LC_*

и серверу ( /etc/ssh/sshd_config) потребуется:

AcceptEnv LANG LC_*

Если они оба на месте, локальный клиент передается в оболочку входа на сервере ssh:

$ ssh me@my-mac locale
LANG="en_GB.UTF-8"
LC_COLLATE="en_GB.UTF-8"
LC_CTYPE="en_GB.UTF-8"
LC_MESSAGES="en_GB.UTF-8"
LC_MONETARY="en_GB.UTF-8"
LC_NUMERIC="en_GB.UTF-8"
LC_TIME="en_GB.UTF-8"
LC_ALL=

Требуемые настройки сервера не установлены по умолчанию в Snow Leopard ; это там, в Сьерре . Не забудьте перезапустить сервер SSH после изменения /etc/sshd_config!!!

starfry
источник