Региональные настройки (locale) в Linux

Из статьи вы узнаете как в Linux, а именно Ubuntu и Debian, настроить locale для системы в целом и для пользователей по отдельности.















Locale в linux




Locale (локаль) — это региональные настройки операционной системы.




Каждая GNU/Linux система поставляется с конкретными региональными настройками. Эти настройки влияют на язык:




  • интерфейса,
  • сообщений об ошибках;
  • справочной информации;
  • вывода консольных утилит.




Но locale влияет не только на язык. Дополнительно это влияет на формат чисел, даты и времени, денежной валюты и другого.




Определение текущей locale в системе




Во-первых давайте определим с какими региональными настройками вы работаете в данный момент. Другими словами, какая locale сейчас используется в вашей linux системе. Для этого нужно выполнить команду locale без дополнительных параметров:




alex@s-ubu:~$ locale
LANG=ru_RU.UTF-8
LANGUAGE=
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=




Так как, в примере, мы выполнили команду под пользователем alex, то утилита покажет региональные настройки для этого пользователя.




Имя локали состоит из нескольких частей. Вначале двумя маленькими символами обозначается язык, затем после нижнего подчеркивания идет название страны. Дальше идет кодировка, в современном мире чаще всего используется кодировка UTD-8. Примеры локалей:




  • ru_RU.UTF-8 — Русский Россия;
  • ru_UA.UTF-8 — Русский Украина;
  • en_US.UTF-8 — Английский США;
  • en_GB.UTF-8 — Английский Великобритания.




Разберём вывод предыдущей команды.




LANG — системная локаль для этого пользователя содержит значение ru_RU.UTF-8.




Дальше идут переменные, которыми могут пользоваться некоторые утилиты или подсистемы, рассмотрим некоторые из них:




  • LANGUAGE — список резервных языков для перевода. Если приложение умеет это использовать и у приложения нет локализации для определённой локали, то оно может использовать запасную локаль;
  • LC_NUMERIC — формат чисел, например 100 000 /100.000 / 100,000;
  • LC_MONETARY — валюта и денежное форматирование.




Эти и другие переменные используются различными утилитами и подсистемами. Но обычно нет смысла использовать разные локали для этих подсистем.




Список сгенерированных locales в системе




В системе можно использовать только сгенерированные локали. Посмотреть какие сейчас сгенерированы можно так:




alex@s-ubu:~$ locale -a
C
C.utf8
POSIX
ru_RU.utf8




Логали: C, C.utf8, POSIX — это синонимы. Они являются локалями используемыми по умолчанию, если не задана никакая другая локаль.




В системе есть ещё одна локаль — ru_RU.utf8. Эта локаль была сгенерирована при установки системы.




А если добавим опцию -v, то дополнительно увидим описание по каждой locale:




alex@s-ubu:~$ locale -a -v
locale: ru_RU.utf8      archive: /usr/lib/locale/locale-archive
-------------------------------------------------------------------------------
    title | Russian locale for Russia
   source | RAP
  address | Sankt Jorgens Alle 8, DK-1615 Kobenhavn V, Danmark
    email | bug-glibc-locales@gnu.org
 language | Russian
territory | Russia
 revision | 1.0
     date | 2000-06-29
  codeset | UTF-8

locale: C.utf8          directory: /usr/lib/locale/C.utf8
-------------------------------------------------------------------------------
    title | C locale
    email | bug-glibc-locales@gnu.org
 revision | 2.1
     date | 2022-01-30
  codeset | UTF-8




Так как локали C и POSIX это псевдонимы к C.utf8, то в этом выводе они исключаются.




Генерация новых locales




Список locales находятся в файле — /etc/locale.gen. А чтобы сгенерировать новую локаль нужно разкоментировать нужные локали в этом файле, а затем выполнить от суперпользователя команду locale-gen. Давайте попробуем сгенерировать locale en_US.utf8:




alex@s-ubu:~$ sudo nano /etc/locale.gen
en_US.UTF-8 UTF-8
ru_RU.UTF-8 UTF-8

alex@s-ubu:~$ sudo locale-gen
Generating locales (this might take a while)...
  en_US.UTF-8... done
  ru_RU.UTF-8... done
Generation complete.




Кстати, если мы укажем использовать локаль, которую не сгенерировали. То команда locale сообщит нам об ошибке:




$ locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=fr_FR.utf8
LANGUAGE=
LC_CTYPE="fr_FR.utf8"
LC_NUMERIC="fr_FR.utf8"
LC_TIME="fr_FR.utf8"
LC_COLLATE="fr_FR.utf8"
LC_MONETARY="fr_FR.utf8"
LC_MESSAGES="fr_FR.utf8"
LC_PAPER="fr_FR.utf8"
LC_NAME="fr_FR.utf8"
LC_ADDRESS="fr_FR.utf8"
LC_TELEPHONE="fr_FR.utf8"
LC_MEASUREMENT="fr_FR.utf8"
LC_IDENTIFICATION="fr_FR.utf8"
LC_ALL=




В выводе видно, что мы пытаемся использовать локаль fr_FR.utf8, но забыли его сгенерировать.




Настройка различных locales разным пользователям




Для начала, если не настраивать локаль отдельным пользователям, то все они будут использовать локаль прописанную в файле /etc/default/locale:




alex@s-ubu:~$ cat /etc/default/locale
LANG=ru_RU.UTF-8




Из вывода видно что все пользователи будут использовать локаль ru_RU.UTF-8.




Если пользователю нужно использовать другую локаль, то можно для него переопределить переменную LANG. Для этого можно использовать файл .bashrc в его домашнем каталоге, например:




alex@s-ubu:~$ nano .bashrc
LANG=en_US.utf8

alex@s-ubu:~$ su - alex

alex@s-ubu:~$ locale
LANG=en_US.utf8
LANGUAGE=
LC_CTYPE="en_US.utf8"
LC_NUMERIC="en_US.utf8"
LC_TIME="en_US.utf8"
LC_COLLATE="en_US.utf8"
LC_MONETARY="en_US.utf8"
LC_MESSAGES="en_US.utf8"
LC_PAPER="en_US.utf8"
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT="en_US.utf8"
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=




Теперь все пользователи, кроме alex будут использовать локаль ru_RU.utf8, а alex будет использовать локаль en_US.utf8.




Перенастройка locales с помощью одной команды




В самом конце я покажу команду, с помощью которой можно сгенерировать нужные локали и убрать не нужные, а также выставить локаль по умолчанию. Это команда dpkg-reconfigure locales и запускать её нужно с правами администратора:




$ sudo dpkg-reconfigure locales




После выполнения команды вы увидите псевдографический интерфейс:




Выполнение команды dpkg-reconfigure locales
Выполнение команды dpkg-reconfigure locales




После выбора locales для генерации, вам нужно будет выбрать locale по умолчанию, которая пропишется в файл /etc/default/locale:




Утилита dpkg-reconfigure locales — выбор locale по умолчанию




Итог




Мы познакомились с настройками locale в linux на примерах операционных систем Debian и Ubuntu.




Изучили команды:




  • locale — для просмотра используемой и сгенерированных локалей;
  • locale-gen — для генерации локалей;
  • dpkg-reconfigure locales — для генерации локалей и установки локали по умолчанию.




А также узнали про системные файлы:




  • /etc/default/locale — в нём прописана локаль по умолчанию;
  • /etc/locale.gen — здесь содержится список доступных локалей для генерации;
  • .bashrc — с помощью этого файла, в домашнем каталоге пользователя, можно переопределить локаль для пользователя.















2022-07-12T12:45:22
Администрирование Linux