Проблема с локализацией

Небольшая заметка, надеюсь кому-нибудь поможет.

На днях обсуждалась тема по поводу проблем с локализацией XFCE. Вроде и прописано все как надо, а язык интерфейса не меняется.

Сегодня ставил на ноут Arch и столкнулся со следующим не стандартным поведением.

Пересказывать вики в подробностях я не буду, можно почитать.

Переменные окружения LC_* получают свое значение через setlocale по следующему принципу:
1. Проверяют задана ли LC_ALL, которая переопределяет все другие переменные
2. Проверяется, заданы ли значения явно, если заданы, присваивается соответствующее значение.
3. Если явно не заданы, Проверяется LANG и если LANG задана, то присваивают себе ее значение.
4. Если ничего не подходит, получают стандартное значение.

Об этом можно почитать в man 7 locale или на вики:
LANG: default locale
The locale set for this variable will be used for all the LC_* variables that are not explicitly set.
LANG задает локаль по умолчанию, значение заданное в этой переменной используется во всех LC_*, если они явно не заданы.

Теперь смотрим что делал я.
1. Расcкомментировал нужные строчки в /etc/locale.gen
$ egrep "^[^#]" /etc/locale.gen
en_US.UTF-8 UTF-8
ru_RU.UTF-8 UTF-8
2. Сгенерировал локали:
$ locale-gen
Generating locales...
  en_US.UTF-8... done
  ru_RU.UTF-8... done
3. Выбрал нужную локаль
localectl set-locale LANG=ru_RU.UTF-8
Все это стандартные действия, выполняемые мной на момент первого запуска установленного арча.
Когда я поставил i3wm и часть приложений они запустились с англоязычным интерфейсом. Сразу посмотрель что у меня с LANG

 $ echo $LANG
 en_US.utf8

Проверил вручную что там задал systemd

$ cat /etc/locale.conf
LANG=ru_RU.UTF-8

$ localectl status
System Locale: LANG=ru_RU.UTF-8
		LC_CTYPE=en_US.utf8
		LC_NUMERIC=en_US.utf8
		LC_COLLATE=C
		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

Но как интерпретировать эти данные? Ведь LANG задана, а вручную я LC_* не задавал. А в выводе явно отображаются LC_*

Смотрю порсто locale

$ locale
	LANG=en_US.utf8
	LC_CTYPE=
	LC_NUMERIC=
	LC_TIME=
	LC_COLLATE=C
	LC_MONETARY=
	LC_MESSAGES=
	LC_PAPER=
	LC_NAME=
	LC_ADDRESS=
	LC_TELEPHONE=
	LC_MEASUREMENT=
	LC_IDENTIFICATION=
	LC_ALL=

Уже интересней? systemd показывает одни настройки локали, locale - другие.
Решаю выставить принудительно все настройки и перезагружаюсь.

$ locale > /etc/locale.conf
$ vim $_
$ cat $_
	LANG=ru_RU.UTF-8
	LC_CTYPE=
	LC_NUMERIC=
	LC_TIME=
	LC_COLLATE=C
	LC_MONETARY=
	LC_MESSAGES=
	LC_PAPER=
	LC_NAME=
	LC_ADDRESS=
	LC_TELEPHONE=
	LC_MEASUREMENT=
	LC_IDENTIFICATION=
	LC_ALL=

Проверяю:
$ echo $LANG
  en_US.utf8

$ localectl status
   System Locale: LANG=ru_RU.UTF-8
                     LC_COLLATE=C

Теперь с localectl все нормально. Смотрю вывод locale
$ locale
  LANG=en_US.utf8
	LC_CTYPE="en_US.utf8"
	LC_NUMERIC="en_US.utf8"
	LC_TIME="en_US.utf8"
	LC_COLLATE=C
	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=

WTF? Что происходит - непонятно.
Пробовал задавать пользовательские настройки локали в ~/.config/locale.conf - не помогло, такое ощущение что файл просто не читался.

Решил проблему следующим образом:
 $ cat << EOF | sudo tee --append /etc/profile
export LANG=ru_RU.UTF-8
export LC_CTYPE=
export LC_NUMERIC=
export LC_TIME=
export LC_COLLATE=C
export LC_MONETARY=
export LC_MESSAGES=
export LC_PAPER=
export LC_NAME=
export LC_ADDRESS=
export LC_TELEPHONE=
export LC_MEASUREMENT=
export LC_IDENTIFICATION=
export LC_ALL=
EOF

На сим был таков. Все заработало, но это неприятный костыль, причины которого до сих пор не понятны. Кто знает как это решить "правильно" сообщите. На двух системах, где тоже установлен archlinux при стандартном localectrl set-locale LANG=ru_RU.UTF-8 все работает и всегда работало с момента перехода на systemd на множестве инсталляций archlinux. Мракобесие, однако.
Просто не используйте команды systemd (для локали, времени, хоста и т.п.), они то ли сами кривые, то ли пока ещё плохо поддерживаются. А ещё после настройки желательно перезагружаться, чтобы всё применилось как полагается.
lampslave
Просто не используйте команды systemd (для локали, времени, хоста и т.п.), они то ли сами кривые
а что, что то поломали? У меня все работает
https://github.com/warlock90000/awesome
Не знаю, просто есть негативный опыт.
lampslave
Просто не используйте команды systemd (для локали, времени, хоста и т.п.), они то ли сами кривые, то ли пока ещё плохо поддерживаются. А ещё после настройки желательно перезагружаться, чтобы всё применилось как полагается.

а какая разница, если даже вручную прописанный файл /etc/locale.conf не читается системой? locale выдавал совершенно левые настройки, не соответствующие /etc/locale.conf, и только экспорт в переменные окружения помогли всей остальной системе и приложениям увидеть локаль.
Насколько я понимаю имеется два случая установки/переустановки локали в системе
1. Начальный момент установки системы, используя установочный образ (в принципе, сюда же можно отнести и изменение локали на установленной системе, используя установочный образ) — используется systemd-firstboot.
2. Изменение локали на установленной системе средствами самой системы — используется systemd.
А читая man localectl и man systemd-firstboot, решил для себя - делать все ручками, по старинке, так оно спокойнее и понятнее.
Ошибки не исчезают с опытом - они просто умнеют
Voronov.S.V, покажи
cat /etc/profile.d/locale.sh
cat /etc/profile
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
Voronov.S.V
а какая разница, если даже вручную прописанный файл /etc/locale.conf не читается системой?
Если /etc/locale.conf не работает, значит дело не в команде systemd, а в том, что локаль задана где-то ещё.
nafanja
покажи
cat /etc/profile.d/locale.sh
cat /etc/profile

locale.sh
/etc/profile
vasek
Насколько я понимаю имеется два случая установки/переустановки локали в системе
Если я правильно понял вопрос, то нет, я все делаю в рабочей системе уже. Вся моя установка сводится к нескольким командам типа
cfdisk, mkfs, mount, pacstrap, genfstab, arch-chroot, grub-install, grub-mkconfig, exit, reboot :)
Всю остальную настройку я произвожу уже в установленной системе. Т.е. генерация локали, и выбор LANG через systemd
 
Зарегистрироваться или войдите чтобы оставить сообщение.