- Локализация Ubuntu Server 18.04 LTS
- Текущие настройки языка
- Список доступных локалей
- Добавить новую локаль
- Подробная информация о локалях
- Локаль по-умолчанию
- Быстрая локализация
- Удалить лишние локали
- Переводы для системных программ
- Локализация для текущей сессии
- Файлы конфигурации шрифта и клавиатуры
- Настройка шрифта и клавиатуры
- Как определить язык ввода в консоли?
Локализация Ubuntu Server 18.04 LTS
Локаль (locale или локализация) в Linux определяет, какой язык и какой набор символов (кодировку), пользователь видит в терминале. Посмотрим, как проверить текущие настройки языка и кодировки, как получить список всех доступных локалей, как сменить язык и кодировку для текущей сессии или установить их постоянно.
Для тех, кому лень читать всю статью до конца — чаще всего для локализации консоли достаточно повторно сконфигурировать пакет locales :
$ sudo dpkg-reconfigure locales
Сначала будут созданы нужные локали (их выбрать на первом экране), потом установлена локаль по умолчанию (ее выбрать на втором экране).
Текущие настройки языка
Посмотрим информацию о текущем языковом окружении:
$ locale LANG=C.UTF-8 LANGUAGE= LC_CTYPE="C.UTF-8" LC_NUMERIC="C.UTF-8" LC_TIME="C.UTF-8" LC_COLLATE="C.UTF-8" LC_MONETARY="C.UTF-8" LC_MESSAGES="C.UTF-8" LC_PAPER="C.UTF-8" LC_NAME="C.UTF-8" LC_ADDRESS="C.UTF-8" LC_TELEPHONE="C.UTF-8" LC_MEASUREMENT="C.UTF-8" LC_IDENTIFICATION="C.UTF-8" LC_ALL=
Список доступных локалей
Теперь посмотрим список всех установленных языков и кодировок:
Есть только системная локаль C.UTF-8 , которая присутствует всегда. А нам надо добавить еще две локали — en_US.UTF-8 и ru_RU.UTF-8 .
Добавить новую локаль
Смотрим список всех поддерживаемых (доступных для установки) локалей:
# This file lists locales that you wish to have built. You can find a list # of valid supported locales at /usr/share/i18n/SUPPORTED, and you can add # user defined locales to /usr/local/share/i18n/SUPPORTED. If you change # this file, you need to rerun locale-gen. # aa_DJ ISO-8859-1 # aa_DJ.UTF-8 UTF-8 # . # en_US.ISO-8859-15 ISO-8859-15 # en_US.UTF-8 UTF-8 # en_ZA ISO-8859-1 # . # ru_RU.KOI8-R KOI8-R # ru_RU.UTF-8 UTF-8 # ru_UA KOI8-U # . # zu_ZA ISO-8859-1 # zu_ZA.UTF-8 UTF-8
Устанавливаем нужные локали — en_US.UTF-8 и ru_RU.UTF-8 :
$ sudo locale-gen en_US.UTF-8 ru_RU.UTF-8 Generating locales (this might take a while). en_US.UTF-8. done ru_RU.UTF-8. done Generation complete.
Второй способ установить локали — расскомментровать нужные строки в файле /etc/locale.gen
# This file lists locales that you wish to have built. You can find a list # of valid supported locales at /usr/share/i18n/SUPPORTED, and you can add # user defined locales to /usr/local/share/i18n/SUPPORTED. If you change # this file, you need to rerun locale-gen. # aa_DJ ISO-8859-1 # aa_DJ.UTF-8 UTF-8 # . # en_US.ISO-8859-15 ISO-8859-15 en_US.UTF-8 UTF-8 # en_ZA ISO-8859-1 # . # ru_RU.KOI8-R KOI8-R ru_RU.UTF-8 UTF-8 # ru_UA KOI8-U # . # zu_ZA ISO-8859-1 # zu_ZA.UTF-8 UTF-8
И просто выполнить команду locale-gen без указания локалей:
Подробная информация о локалях
Более подробную информацию об установленных в системе локалях можно посмотреть так:
$ locale -a -v locale: en_US.utf8 archive: /usr/lib/locale/locale-archive ------------------------------------------------------------------------------- title | English locale for the USA source | Free Software Foundation, Inc. address | http://www.gnu.org/software/libc/ email | bug-glibc-locales@gnu.org language | American English territory | United States revision | 1.0 date | 2000-06-24 codeset | UTF-8 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: ru_UA.utf8 archive: /usr/lib/locale/locale-archive ------------------------------------------------------------------------------- title | Russian locale for Ukraine source | RFC 2319 email | bug-glibc-locales@gnu.org language | Russian territory | Ukraine revision | 1.0 date | 2000-06-29 codeset | UTF-8 locale: C.UTF-8 directory: /usr/lib/locale/C.UTF-8 ------------------------------------------------------------------------------- title | C locale email | aurel32@debian.org language | C revision | 1.6 date | 2016-08-08 codeset | UTF-8
Часть локалей размещена в архиве /usr/lib/locale/locale-archive , а часть — в директориях внутри /usr/lib/locale/ .
Локаль по-умолчанию
Хорошо, нужные локали у нас теперь есть, осталось только задать локаль по умолчанию:
$ sudo update-locale LANG=ru_RU.UTF-8
Эта команда запишет в файл /etc/default/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=
Теперь все правильно, так что запишем эту информацию в файл /etc/default/locale :
$ locale | sudo tee /etc/default/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=
Переменная окружения LANG — это локаль по умолчанию. Локаль, установленная в этой переменной, используется в качестве значения для всех остальных переменных LC_XXXXX , которые не установлены явно. Переменная окружения LC_ALL переопределяет своим значением все переменные LC_XXXXX , включая LANG — независимо от того, установлены они или нет.
Быстрая локализация
До сих пор мы все делали ручками, но если лень — можно просто повторно сконфигурировать пакет locales . Сначала будут созданы нужные локали (их нужно выбрать на первом экране), потом установлена локаль по умолчанию (ее нужно выбрать на втором экране).
$ sudo dpkg-reconfigure locales
Удалить лишние локали
После установки (генерации) локали, она помещается в архив /usr/lib/locale/locale-archive . Файл архива — это файл, отображаемый в память, который содержит все локали системы; он используется всеми локализованными программами. Посмотреть список локалей в архиве можно с помощью команды:
$ localedef --list-archive en_US.utf8 ru_RU.utf8 ru_UA.utf8
Удалить заданную локаль из файла архива:
$ sudo localedef --delete-from-archive ru_UA.utf8
Обратите внимание на название локали — ru_UA.utf8 , а не ru_UA.UTF-8 . Если неправильно указать локаль — она не будет удалена из архива:
$ sudo localedef --delete-from-archive ru_UA.UTF-8 locale "ru_UA.UTF-8" not in archive
В случае, если утилита locale-gen была вызвана с опцией —no-archive , надо удалить соответствующую директорию в /usr/lib/locale :
$ cd /usr/lib/locale $ ls C.UTF-8 en_US.utf8 ru_RU.utf8 ru_UA.utf8 $ sudo rm -r ru_UA.utf8
Есть еще один способ удалить лишние локали — закомментровать в файле /etc/locale.gen строки локалей, которые больше не нужны — и запустить locale-gen без параметров.
Переводы для системных программ
Локализация для основных системных программ, чтобы получать сообщения на русском языке:
$ sudo apt install language-pack-ru
Локализация для текущей сессии
Достаточно временно установить переменную окружения LANG в текущей сессии терминала:
$ export LANG=en_US.UTF-8 $ cat /etc/shadow cat: /etc/shadow: Permission denied
$ export LANG=ru_RU.UTF-8 $ cat /etc/shadow cat: /etc/shadow: Отказано в доступе
Или даже так — передать переменную LANG конкретной программе:
$ export LANG=en_US.UTF-8 $ cat /etc/shadow cat: /etc/shadow: Permission denied $ LANG=ru_RU.UTF-8 cat /etc/shadow cat: /etc/shadow: Отказано в доступе
Файлы конфигурации шрифта и клавиатуры
Настройки можно найти в файлах конфигурации /etc/default/console-setup и /etc/default/keyboard :
$ cat /etc/default/console-setup
# Consult the console-setup(5) manual page. ACTIVE_CONSOLES="/dev/tty4" CHARMAP="UTF-8" CODESET="CyrSlav" FONTFACE="Fixed" FONTSIZE="8x16" VIDEOMODE=
# Consult the keyboard(5) manual page. XKBMODEL="pc105" XKBLAYOUT="us,ru" XKBVARIANT="," XKBOPTIONS="grp:alt_shift_toggle,grp_led:scroll" BACKSPACE="guess"
Это системные настройки, пользователь может создать свои в файлах ~/.console-setup и ~/.keyboard .
Настройка шрифта и клавиатуры
Чтобы сформировать файлы конфигурации /etc/default/console-setup и /etc/default/keyboard можно использовать команды:
$ sudo dpkg-reconfigure console-setup
$ sudo dpkg-reconfigure keyboard-configuration
После того, как файлы конфигурации будут сформированы, нужно выполнить команду setupcon без аргументов или перезагрузить систему.
Console-cyrillic — это пакет для руссификации консоли (поддержки кириллицы в терминале), старый и известный пакет. Но в новых версиях операционных систем с системой инициализации systemd он считается устаревшим, поскольку у systemd есть нативные средства локализации консоли и наличие console-cyrillic там не только не требуется, но и не рекомендуется.
Команда localectl предоставляет возможности для централизованного управления языковыми и региональными параметрами.
$ localectl --help localectl [OPTIONS. ] COMMAND . Query or change system locale and keyboard settings. Commands: status Show current locale settings set-locale LOCALE. Set system locale list-locales Show known locales set-keymap MAP [MAP] Set console and X11 keyboard mappings list-keymaps Show known virtual console keyboard mappings set-x11-keymap LAYOUT [MODEL [VARIANT [OPTIONS]]] Set X11 and console keyboard mappings list-x11-keymap-models Show known X11 keyboard mapping models list-x11-keymap-layouts Show known X11 keyboard mapping layouts list-x11-keymap-variants [LAYOUT] Show known X11 keyboard mapping variants list-x11-keymap-options Show known X11 keyboard mapping options Options: -h --help Show this help --version Show package version --no-pager Do not pipe output into a pager --no-ask-password Do not prompt for password -H --host=[USER@]HOST Operate on remote host -M --machine=CONTAINER Operate on local container --no-convert Don't convert keyboard mappings See the localectl(1) man page for details.
$ localectl status System Locale: LANG=ru_RU.UTF-8 VC Keymap: n/a X11 Layout: us,ru X11 Model: pc105 X11 Variant: , X11 Options: grp:alt_shift_toggle
$ localectl list-locales C.UTF-8 en_US.UTF-8 ru_RU.UTF-8 ru_UA.UTF-8
Как определить язык ввода в консоли?
Всем привет. Хотелось бы вывести на панельку статуса tmux инфу о том, какой язык ввода используется, каким образом это можно сделать? Где хранится инфа об используемом языке?
gentoo 3.17, keymap ruwin_alt_sh-UTF-8, tmux 1.9a, agetty
(2 языка ввода, переключение настроено через alt+shift, никакие леды не подсвечиваются, т.е. по ним определить не получится)
xset это чтото из Xorga? Мне бы в чистой консоли.
Можно рисовать раскладку, только если используешь tmux на локальной машине (например вместо вкладок терминала). Тут уж точно xset есть, так как переключение раскладки настроено очевидно в xorg.
На удалённых машинах нельзя, так как раскладка меняется локально и удалённая машина о ней не знает.
Не подходит индикатор раскладки в трее? Чтото вроде xxkb/kbdd
В иксах хватает индикатора в трее. Как сделать определение без иксов. Нет никаких xsel и тому подобных, только agetty в ней запускается какимто образом расскладка из /etc/conf.d/keymaps, возможно какимто драйвером клавиатуры типа kbd. Если keymaps настроен на переключение языка с подсветкой леда, к примеру на caps lock, то теоретически можно попробовать узнать язык ввода по индикатору капс, поэкспериментировав с командой kbdinfo gkbled, но при alt+shift никакой индикации при переключении языка нет. Каким еще образом можно определить язык?
Ядерный модуль с выводом в /proc/mydriver
поэкспериментировав с командой kbdinfo gkbled, но при alt+shift никакой индикации при переключении языка нет
См. как определяется статус индикатора в my_timer_func