22 июля 2010 г.

Настройка локалей в Ubuntu

Опишу небольшой глюк с локалями, возникший недавно у меня. Точнее это даже не столько глюк, сколько, скорее всего, я не до конца разобралась, однако проблему я решила и это может кому-то помочь (да и мне, если повторится).
Глюк проявился следующим образом - внезапно весь интерфейс стал на английском языке. И произошло это после того, как я заменила экран входа в систему с kdm на slim, хотя в настройках самого slim ничего даже близко нет и он использует те же сессии, что и gdm и kdm.
Сам по себе английский интерфейс лично для меня даже предпочтительнее, но как выяснилось позже, проблема проявлялась и более неприятным образом.
Во-первых, в 2gis и, скорее всего, и в других приложениях под wine перестала печататься кириллица - в интерфейсе она отображалась по прежнему нормально, а напечатать в полях поиска можно было только латиницей.
А во-вторых, в эмуляторах терминала, вместо кириллических символов печатались знаки вопроса. Если открыть пункт меню Terminal, то можно увидеть такую картину:

И тут даже можно выбрать кодировку UTF-8, тогда кириллица будет печататься нормально, но работает это лишь в текущем открытом окне программы.

На скриншоте ещё заметно, что текущей локалью установлена POSIX, однако при входе через kdm или gdm, всё возвращается к нормальному виду без изменения настроек. И, кажется, даже если зайти через slim в gnome или kde, то можно поменять локаль через их gui-инструменты.
Однако, правка файлов никак не помогала, пока я не поставила пакет utils-linux-locale. Не знаю, в чём тут секрет, тем более у других пользователей, этот пакет не установлен и всё работает (ну правда в kde с kdm), но помогло именно это.

Теперь вкратце инструкция как вообще изменять язык интерфейса и добавлять недостающие локали не через gui-утилиты.
Во-первых, в папке /var/lib/locales/supported.d/ лежат три файла: en, ru и local. Это у меня их три, а если вам нужна ещё, допустим, и японская локаль, то добавится ещё один файл (правда, придётся ещё установить необходимые пакеты).
В файлах en и ru прописаны варианты данных языков, которые будут сформированы в системе, в частности:

en_US.UTF-8 UTF-8
en_GB.UTF-8 UTF-8
и
ru_RU.UTF-8 UTF-8
ru_RU.CP1251 CP1251
ru_RU.KOI8-R KOI8-R
А в файле local вписываются те кодировки, которые будут использоваться, у меня содержание файла такое:
ru_RU.UTF-8 UTF-8
en_US.UTF-8 UTF-8
ru_RU.CP1251 CP1251
ru_RU.KOI8-R KOI8-R
После измнения в этих файлах есть смысл перегенерировать локали командой locale-gen.

Текущая локаль в системе задаётся в файле /etc/default/locale:

LANG=en_GB.UTF-8
LANGUAGE=en_GB:en
Это у меня, так как мне хочется интерфейс на английском. А русский язык и кириллица всё равно поддерживаются при этом за счёт сформированных локалей. Правда, в примерах, которые я видела в сети, вторая строка обычно выглядит так: LANGUAGE="en_EN:en:ru_RU:ru", типа чтобы русский язык поддерживался, но у меня работает и без этого.
И ещё в старых версия системы то же самое прописывалось в файле /etc/environment, однако, сейчас он вроде бы не используется, хотя существует, но на всякий случай можно и там прописать.

Проверить, как локаль установлена основной можно командой locale:

LANG=en_GB.UTF-8
LANGUAGE=en_GB:en
LC_CTYPE="en_GB.UTF-8"
LC_NUMERIC="en_GB.UTF-8"
LC_TIME="en_GB.UTF-8"
LC_COLLATE="en_GB.UTF-8"
LC_MONETARY="en_GB.UTF-8"
LC_MESSAGES="en_GB.UTF-8"
LC_PAPER="en_GB.UTF-8"
LC_NAME="en_GB.UTF-8"
LC_ADDRESS="en_GB.UTF-8"
LC_TELEPHONE="en_GB.UTF-8"
LC_MEASUREMENT="en_GB.UTF-8"
LC_IDENTIFICATION="en_GB.UTF-8"
LC_ALL=
Что обозначает каждая переменная можно почитать в мане команды, но и так понятно, что если, например, хочется при английском интерфейсе иметь русский формат отображения денежных единиц, то в /etc/default/locale нужно добавить строку LC_MONETARY="ru_RU.UTF-8".
Ну и кстати, все примеры тут для кодировки UTF-8, так как я её использую. Если предпочтение отдаётся KOI8-R, то действия те же, но с соответствующими поправками.

Кстати, посмотреть, какие локали ещё поддерживаются можно в файле /usr/share/i18n/SUPPORTED, в частности для русского языка ещё доступна:

ru_RU ISO-8859-5
Там же рядом лежат файлы локалей в /usr/share/i18n/locales/ и файлы кодировок в /usr/share/i18n/charmaps/.

В этом "руководстве", возможно, есть ошибки, так как готовые рецепты из сети не всегда работают или не всегда работают как надо, и, возможно, оно ещё будет дополняться.


Как учесть затраты на фирменные пакеты.

Цена оборудования для изготовления бумажных пакетов в Московской области.

9 комментариев:

  1. Спасибо тебе! Встретл этот баг в Gentoo, установив KDE3 через оверлей (сторонний репозитарий). Кстати в Убунте он хороший, TDE! Здесь - не очень... kdm-3.5 не умеет при загрузке, когда вводится пароль и выбирается пользователь, выбрать язык и локаль! При этом в других дистрибутивах с KDE 3 я всё прекрасно выбирал раньше! Решил проблему сменой kdm на gdm.

    Но недавно я купил нетбук и решил Gentoo потому поставить, что он хорошо оптимизируется под его слабое железо... И снова этот сбой! Проблема в том, что я не установил Gnome вообще...

    В ДубльГИС в Wine я эту ошибку ещё в 2007-м году встретил! И решилась она тогда очень странно, установкой шрифта Tahoma из Windows. Или я что-то путаю... Текст не просто не вводится, а вводятся вместо него странные символы, широкие и плоские... Можно правда копировать по букве и вставлять из других окон.

    Я встречаю ошибки в тех же местах, что и ты! Но ты пропустила самую противную. Откроешь раздел в другом дистрибутиве - и все русские файлы не в той кодировке! Как будто это юникод, открытый в koi8-r.

    Спасибо! В этой статье я нашёл всё то, что хотел найти. Сразу, не ищя каждую мелочь. Я сначала тоже нашёл команду locale и понял, что дело в kdm. Сейчас приступлю к решению проблемы

    ОтветитьУдалить
  2. Пожалуйста.
    Охренеть, если честно) Не думала, что сумбурно собранная инфа по теме реально полезна будет.
    Мне, кстати, вот сейчас не помогло...

    ОтветитьУдалить
  3. Хм, поздновато, но лучше поздо, чем никогда, хотя бы для тех, кто гуглит проблему со slim: чтобы слим устанавливал русский язык, надо в .xinitrc добавить строчку:
    export LANG=ru_RU.UTF-8
    причем добавить ее ПЕРЕД выбором сессии.
    За статью огромное спасибо, все четко, кратко и работает.

    ОтветитьУдалить
  4. а как сделать так, что бы в последней строчке locale было не пусто?

    ОтветитьУдалить
  5. А зачем, собственно? Если написать:
    ...
    LC_MONETARY="en_GB.UTF-8"
    LC_MESSAGES="en_GB.UTF-8"
    LC_MONETARY="ru_RU.UTF-8"
    ...
    то строчка LC_MONETARY="ru_RU.UTF-8" имеет больший приоритет, чем строчка LC_MONETARY="en_GB.UTF-8" и денежные единицы будут русскими. LC_ALL= задает ВСЕ переменные, так зачем же тогда остальные писать?
    Нарыл здесь (англ) http://pubs.opengroup.org/onlinepubs/7908799/xbd/envvar.html

    ОтветитьУдалить
  6. всё дело в торм, что судя по коментам отсюда http://zenway.ru/page/fatrat, fatrat ест именно этот параметр. именно его я и пытаюсь русифицировать

    ОтветитьУдалить
  7. конкретно fatrat не пробовал, временно можно попробовать запустить из терминала строчку вида:
    LC_ALL="ru_RU.cp1251" gedit
    и gedit запусится с локалью ru_RU.cp1251
    Пробуйте вместо gedit запустить так fatrat, как вариант - прописать команду в ярлык запуска sh -c "LC_ALL=ru_RU.CP1251 audacious2"

    ОтветитьУдалить
  8. То есть sh -c "LC_ALL=ru_RU.CP1251 fatrat" или как там его зовут. Копипастил просто из поста про audacious :)

    ОтветитьУдалить
  9. спасибо.это помогло :)

    ОтветитьУдалить