Настройка locate (локали) в Unix/Linux
Я получил сообщение об ошибке следующего содержания при подключении к любому удаленному Unix/Linux серверу терминал:
-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
Сейчас, я расскажу в своей статье «Настройка locate (локали) в Unix/Linux» как можно данную ошибку исправить.
Смотрим какое переменное окружение установлено:
# printenv
Проверяем локаль:
$ locale
Можно отгрепать нужное:
┌(captain@Macbook)─(✓)─(10:49 AM Wed Apr 20) └─(~)─(19 files, 600b)─> locale -a | grep ru ru_RU ru_RU.CP1251 ru_RU.CP866 ru_RU.ISO8859-5 ru_RU.KOI8-R ru_RU.UTF-8 ┌(captain@Macbook)─(✓)─(10:49 AM Wed Apr 20) └─(~)─(19 files, 600b)─>
Данная команда покажет на экран нужную локаль. Например, для кодировки UTF-8 нужна следующая локаль — ru_RU.utf8. При выводе данной команды если имеется данная локаль, нужно сейчас создать:
# touch /etc/sysconfig/i18n
И добавляем в файл:
LANG="ru_RU.UTF-8" SUPPORTED="ru_RU.UTF-8:ru_RU:ru" SYSFONT="latarcyrheb-sun16"
Для utf-8 используйте:
LANG="en_US.UTF-8" SYSFONT="latarcyrheb-sun16"
Сохраняем открытый файл и перезаходим в консоль, должен появиться русский шрифт в локали. Но бывает так, что при выводе команды:
$ locale -a | grep ru
Способ 1.
Ничего не показало ( нет именно русской локали), то мы сейчас это исправим:
$ localedef -i ru_RU -f UTF-8 ru_RU.UTF-8
И так, команда что выше, берет из директории /usr/share/i18n/locales/ файл с русской локалью с названием — ru_RU, а так же, из директории /usr/share/i18n/charmaps файлик с символьной картой для юникода с названием — UTF-8.gz. После чего, на основании двух этих файлов — генерирует необходимую локаль с именем — ru_RU.UTF-8. Собственно, локаль была сгенерирована, сейчас нужно выполнить все действия что я приводил выше.
Более расширенный вариант:
$ locale LANG=en_US.UTF-8 LC_CTYPE=en_US.UTF-8 LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="en_US.UTF-8" LC_NAME="en_US.UTF-8" LC_ADDRESS="en_US.UTF-8" LC_TELEPHONE="en_US.UTF-8" LC_MEASUREMENT="en_US.UTF-8" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL=
Способ 2.
Можно предотвратить передачу LC_* переменных в самой утилите (OpenSSH клиенте) на Unix/Linux машине.
Откройте /etc/ssh/ssh_config или /etc/ssh_config:
$ sudo vim ~/.ssh/config
Удаляем или закоментируйте строку:
#SendEnv LANG LC_*
Сохраняйте и закройте данный файл. Настройка locate (локали) в Unix/Linux завершена.
Хорошая статья.
Есть ли такая же статья по том как передать локали (напр. ru_RU) в питоновский докерфайл?
Просто в Dockerfile вставить:
ENV LANG="ru_RU.UTF-8"
Так же, можно добавлять и другие переменные (LC_ALL, LC_CTYPE и так далее).