Как добавить новую локаль в macOS Catalina

В Системных настройках, Языке и регионе, когда я выбираю Соединенное Королевство, localeвывод

LANG="en_GB"
LC_COLLATE="en_GB"
LC_CTYPE="en_GB"
LC_MESSAGES="en_GB"
LC_MONETARY="en_GB"
LC_NUMERIC="en_GB"
LC_TIME="en_GB"
LC_ALL=

Если я выберу Норвегию, хотя выходы

LANG="en_NO"
LC_COLLATE="C"
LC_CTYPE="C"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=

Я подозреваю, что именно по этой причине такие команды, как lsдаты, отображаются в mon dateформате вместо date mon, даже если норвежский язык следует за последним. locale -a | grep en_NOничего не показывает, и я думаю, поэтому. Поэтому я попытался скопировать /usr/share/locale/no_NOи /usr/share/locale/en_NOизменить его в соответствии со своими потребностями, и, конечно же, я получил, mkdir: en_NO: Operation not permittedпотому что системный том монтируется только для чтения на Catalina. Итак, есть ли способ добавить свою локаль?

Будет ли добавление export LC_TIME="en_GB.UTF-8"и т. д. в вашу ~/.zshrcработу для вас?
По какой-то причине это не работает, независимо от того, что localeпоказывает мне, что LC_TIMEэто C. Также я хотел получить все значения LC_*отdefaults read NSGlobalDomain AppleLocale
Вам нужно запустить source ~/.zshrcили открыть новое окно эмулятора терминала после изменения файла...
Да, я знаю это. На самом деле я не использую ZSH, я использую Fish в качестве оболочки, и она уже достаточно настроена, и все работает как положено, кроме этого

Ответы (2)

Я не знаю, была ли ваша проблема идентична моей, но, по крайней мере, это сработало для меня. Я также заметил, что моя система пыталась установить nb_no.UTF-8 (и потерпела неудачу) вместо no.NO.

  1. vim ~/.config/fish/config.fish
  2. set -x LC_ALL no_NO.UTF-8
Не то же самое, что я хочу en_NO, с нет в наличии в системе, поэтому вопрос в том, как его сначала добавить

Процедура из моей поваренной книги для добавления новой локали

Это работает на MacOS 12.5 Monterrey поверх компьютеров Mac с SIP (защита целостности системы), чип M1:

В первую очередь проверьте, существует ли региональность в системе:

locale -a | grep en_NO

Если нет результатов, региональности не существует. Делать копию бесполезно, потому что корень монтируется только для чтения, а SIP не позволяет вам его модифицировать. Хотя и есть возможность записи на него, повторно использовать SIP не получится, чтобы изменения сохранились. localedef тоже не работает. Решение состоит в том, чтобы создать домашнюю папку и изменить путь, по которому glibc ищет локали:

mkdir ~/.locale
cp -rpf /usr/share/locale/en_GB.UTF-8 ~/.locale/en_NO.UTF-8
export PATH_LOCALE=~/.locale
export LC_ALL=en_NO.UTF-8

Теперь система будет иметь соответствующую региональность. В файл ˜/.profile можно добавить следующие строки, чтобы изменения в терминале вступили в силу навсегда:

export PATH_LOCALE=~/.locale
export LC_ALL=en_NO.UTF-8

С другой стороны, если в системе существует локаль (если локаль -a | grep en_does НЕ возвращает результат), она достигает только следующего:

export LC_ALL=en_NO.UTF-8

Точно так же эта строка может быть и в ˜/.profile. В моем случае я использую es_AR на основе локали, предоставленной системой es_ES. Это самое чистое решение (и я думаю, правильное), которое я нашел до сих пор без вмешательства в систему.

Является ли /usr/local/share/localeальтернативой пользовательской установке?
@gidds Да, это тоже хорошая альтернатива. Хотя для всех пользователей, а не для конкретных пользователей.