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

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

Locale в linux

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

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

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

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

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

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

$ 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=
  • Утилита покажет региональные настройки для пользователя.

Имя локали состоит из нескольких частей. Вначале двумя маленькими символами обозначается язык, затем после нижнего подчеркивания идет название страны. Дальше идет кодировка, в современном мире чаще всего используется кодировка 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

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

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

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

$ 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:

$ sudo nano /etc/locale.gen
en_US.UTF-8 UTF-8
ru_RU.UTF-8 UTF-8

$ 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

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

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

Итог

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

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

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

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

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

Если понравилась статья, подпишись на мой канал в  VK  или  Telegram .