Исходная информация
Я протестировал решение на Fedora 21 с GNOME Shell 3.14.4, но считаю, что оно может быть применено и к другим версиям.
Первое, что нужно понять, это то, что среда рабочего стола GNOME переопределяет общесистемные определения локали и поэтому не подвержена влиянию /etc/locale.conf
. Кроме того, могут существовать приложения, которые имеют свою собственную конфигурацию локали и вообще не используют настройки системы или GNOME. В этом руководстве я опишу способ настройки параметров локали в соответствии с вашими потребностями и GNOME, и система будет согласованной с точки зрения локали.
Проверка текущего статуса локали
Общесистемные настройки
Из руководства системного администратора Fedora 21 :
Общесистемные настройки локали хранятся в /etc/locale.conf
файле, который читается при ранней загрузке демоном systemd . Параметры локали, настроенные в /etc/locale.conf
, наследуются каждой службой или пользователем, если только отдельные программы или отдельные пользователи не переопределяют их.
Чтобы увидеть текущий статус локали, мы можем запустить:
$ localectl status
System Locale: LANG=en_US.UTF-8
LC_NUMERIC=en_US.UTF-8
LC_TIME=en_US.UTF-8
LC_MONETARY=en_US.UTF-8
LC_PAPER=en_US.UTF-8
LC_MEASUREMENT=en_US.UTF-8
VC Keymap: us
X11 Layout: us
Настройки GNOME
$ gsettings get org.gnome.system.locale region
'en_US.UTF-8'
GNOME имеет только одну настройку. При быстром взгляде на исходный код gnome-control-center кажется, что при set_localed_locale()
вызове функции она устанавливает все следующие категории (LC_TIME, LC_NUMERIC, LC_MONETARY, LC_MEASUREMENT, LC_PAPER) в одну и ту же локаль, определенную в org.gnome.system.locale region
.
Смешивание различных настроек локали кажется невозможным без создания собственной локали, но, к счастью, это не очень сложная задача.
Создание собственной локали
Я думаю, что самый простой способ объяснить это на примере. В моем конкретном случае я хотел иметь пользовательский языковой стандарт, в основном на иврите ( he_IL ), но с LC_NAME, LC_MESSAGES из en_US и LC_TIME (с измененным first_weekday
и first_workday
) из en_GB .
Получение файлов определения локали
Вы должны иметь представление, какие локации вы хотите смешать. Сначала нам нужно найти соответствующие файлы определений, которые можно найти в /usr/share/i18n/locales/
. Возвращаясь к моему примеру, мне нужно было следующее: he_IL , en_US и en_GB . Я создал рабочую папку у себя дома и скопировал в нее нужные файлы:
$ cd /usr/share/i18n/locales
$ mkdir -v ~/custom-locale ; cp -v he_IL en_US en_GB ~/custom-locale/
Создание нового файла определения
Я решил назвать свою локаль hc_IL и взял за основу he_IL . Следующие строки создают новый файл hc_IL
с содержимым he_IL
и по пути замены всех вхождений строки he_IL внутри файла на hc_IL .
$ cd ~/custom-locale/
$ sed 's/he_IL/hc_IL/g' he_IL > hc_IL
Изменение нового файла определения
Теперь мы можем настроить новую локаль под наши нужды. Откройте вновь созданный файл в ~/custom-locale/hc_IL
вашем любимом текстовом редакторе. Я использую vim (он имеет правильную подсветку синтаксиса для файлов определения локали):
$ vim ~/custom-locale/hc_IL
Для тех, кто еще не выбрал свой любимый редактор, а vim не является их чашкой чая, можете использовать gedit :)
$ gedit ~/custom-locale/hc_IL
Структура файла не очень сложна. По сути, он построен из разделов. Из локали (5) справочных страниц:
Определение локали имеет одну часть для каждой категории локали. Каждая часть может быть скопирована из другой существующей локали или может быть определена с нуля. Если категория должна быть скопирована, единственным допустимым ключевым словом в определении является копия, за которой следует имя локали, которая должна быть скопирована.
Понятие копии очень полезно. Это экономит время, и полученный файл является четким и лаконичным. Например, вместо копирования целых разделов, вы можете иметь:
LC_MESSAGES
copy "en_US"
END LC_MESSAGES
Полная документация по файлу определения локали доступна через:
$ man 5 locale
Хотя, если вы просто хотите создать собственный языковой стандарт, представляющий собой смесь существующих, вам не нужно разбираться в каждой детали.
В моем случае я изменил следующие категории и ключевые слова:
LC_IDENTIFICATION
title "Custom Hebrew locale"
source "mydomain.ws"
address "http:////www.mydomain.ws"
contact ""
email "admin@mydomain.ws"
tel ""
fax ""
language "Hebrew"
territory "Israel"
revision "1.0"
date "2015-04-21"
Примечание. Все строки " category .. " в разделе LC_IDENTIFICATION были изменены при создании файла с использованием sed
. Поэтому нам не нужно больше их трогать.
LC_TIME
Я скопировал весь раздел из en_GB и изменил только те строки, которые указывают первый день недели и первый рабочий день:
first_weekday 1
first_workday 1
Остальные категории я оставил как есть или заменил их содержимое директивой копирования как в:
LC_NAME
copy "en_US"
END LC_NAME
Вот и все, файл определения готов. Не забудьте сохранить файл :)
Скомпилируйте и скопируйте новую локаль
Компиляция новой локали выполняется с помощью следующей команды от имени root или с использованием sudo . Замените hc_IL
на ваш язык:
$ sudo localedef -c -v -i hc_IL -f UTF-8 hc_IL.UTF-8
Если компиляция прошла успешно, скомпилированные данные локали добавляются в файл архива /usr/lib/locale/locale-archive
.
Скопируйте новый файл определения локали в каталог определений локали. Замените hc_IL
на ваш язык:
$ sudo cp -v hc_IL /usr/share/i18n/locales/
Активация новой локали
На этом шаге мы хотим настроить систему и GNOME для использования новой локали.
Общесистемные настройки
Отредактируйте /etc/locale.conf
файл как root и установите каждую строку, которая начинается с LC_
вашей новой локали. Например:
LANG=en_US.UTF-8
LC_NUMERIC=hc_IL.utf8
LC_TIME=hc_IL.utf8
LC_MONETARY=hc_IL.utf8
LC_PAPER=hc_IL.utf8
LC_MEASUREMENT=hc_IL.utf8
Настройки GNOME
Чтобы активировать новую локаль в GNOME, выполните следующую команду. Замените hc_IL
на ваш язык:
$ gsettings set org.gnome.system.locale region "hc_IL.utf8"
Проверка новых настроек
Последний шаг - проверить, что все работает как положено. Для перезагрузки всех настроек проще всего было перезагрузить компьютер.
- Обратитесь к разделу «Проверка текущего состояния локали», чтобы проверить правильность конфигурации системы.
Используйте GNOME Shell и зависимые от локали приложения (графические и консольные) и убедитесь, что они работают должным образом с новой локалью. Например, если вы настроили LC_TIME, вы можете запустить date
команду для проверки формата даты:
$ date +%x
21/04/15
Примечание: все было протестировано на Fedora 21 с GNOME 3.14. Другие дистрибутивы Linux могут потребовать дополнительных или других шагов.
Пожалуйста, прокомментируйте, если вы обнаружите какие-либо проблемы с инструкциями.