Русификация Omarchy Linux одним скриптом

Решил попробовать нашумевший дистрибутив Omarchy Linux и понять — за что же его все так хвалят.
И сразу столкнулся с тем, что поддержки русского языка в полной мере нет в интерфейсе. Да, локаль можно перевести и доустановить нужное, но сами меню, плагины — не имеют переключения интерфейса на русский язык.
Поэтому сначала я начал доустанавливать всё руками, а потом собрал всё в скрипты, которые делают следующее:
ставят локаль
ru_RU.UTF-8, раскладкуus,ruс переключением по Alt, словари для проверки орфографии и русские man‑страницы;переводят меню Omarchy, меню горячих клавиш (Super+K) и панели бара: календарь, сеть, Bluetooth, звук, питание, уведомления, буфер обмена и ещё с десяток;
настраивают мелочи, о которых вспоминаешь только когда они понадобились: часовой пояс, кириллический шрифт в TTY, символы
₽ № «» —через Compose, погоду в метрической системе с русскими названиями городов;ставят Telegram, русский голосовой ввод (voxtype + Parakeet) и синтез речи;
добавляют в виджет сети Яндекс DNS, DNS4EU и NextDNS вместо Cloudflare и Google;
по желанию — PC/SC‑стек для ЭЦП и сертификаты Минцифры с еженедельной проверкой срока.
Ниже — что внутри, как это ставить и где пришлось повозиться.
Почему нельзя просто поставить LANG=ru_RU
В Omarchy нет i18n как такового. Строки меню, панелей и подсказок горячих клавиш зашиты прямо в конфиги и QML‑плагины. Смена локали переводит GTK‑ и Qt‑приложения, но собственный интерфейс дистрибутива остаётся английским.
Вторая сложность — всё стоковое лежит в /usr/share/omarchy/. Править там можно, но первый же omarchy update всё вернёт. Поэтому я сразу поставил себе правило: системные файлы Omarchy не трогаю, работаю только через ~/.config/ и механизмы расширения, которые предусмотрел сам дистрибутив.
Из этого правила и выросли все решения ниже. Где‑то это переопределения, где‑то клоны плагинов, где‑то сгенерированная копия стокового скрипта.
Как это устроено
Изначально это был один длинный bash‑скрипт. Быстро стало понятно, что кому‑то не нужен Telegram, кому‑то голосовой ввод, а сертификаты Минцифры ставить молча вообще нельзя. Так появился install.sh — оркестратор, и папка modules/ с независимыми модулями.
Каждый модуль — это файл modules/NN-имя.sh с метаданными в шапке: название, группа, включён ли по умолчанию, нужен ли sudo, описание. Установщик читает эти шапки и собирает из них меню. Чтобы добавить свой модуль, достаточно положить файл в папку.
Что получилось в итоге:
Группа | Модули |
|---|---|
Базовая |
|
Простое |
|
Приложения |
|
Интерфейс |
|
Работа (не по умолчанию) |
|
Несколько вещей, которые я сделал намеренно:
sudo запрашивается один раз на всю установку, а не в каждом модуле;
если упал один модуль, остальные продолжают работу, а в конце печатается сводка;
шелл Omarchy перезапускается один раз в конце, и только если менялись панели;
всё идемпотентно: повторный запуск ничего не ломает и не дублирует.
Дальше — про три самых интересных места.
Меню Omarchy
Omarchy позволяет переопределять пункты меню через ~/.config/omarchy/extensions/omarchy-menu.jsonc. translate-menu.py читает стоковое меню и пишет туда переведённые label и title.
Подвох нашёлся не сразу: если записать в расширение только label, Omarchy затирает у пункта action, icon и when. Поэтому пункты пишутся целиком, а переводятся только текстовые поля. Словари LABELS и TITLES лежат в начале скрипта.
Горячие клавиши (Super+K)
Описания привязок лежат в Lua‑конфигах Hyprland внутри /usr/share/omarchy/, а omarchy-menu-keybindingsпоказывает их как есть. Переопределить это штатно нельзя.
Пришлось сделать так: keybindings-ru.py собирает копию стокового скрипта в ~/.local/bin/omarchy-menu-keybindings-ru и добавляет в неё шаг перевода. В словаре 171 описание плюс правила для шаблонных строк вроде «рабочий стол N». Затем SUPER + K переназначается в ~/.config/hypr/bindings.lua — в блок между маркерами, чтобы его можно было найти и убрать.
Перевод применяется после сортировки, поэтому порядок строк остаётся стоковым. Если структура исходного скрипта после обновления изменится, генератор остановится с сообщением, а не соберёт что‑то битое.
Панели бара
Это самая трудоёмкая часть. Панели — QML‑плагины, и переопределений для них нет. Зато есть omarchy plugin clone: он делает копию плагина в ~/.config/omarchy/plugins/, а оригинал отключает.
translate-plugins.py для каждого плагина делает четыре шага:
клонирует его, если клона ещё нет;
заменяет строковые литералы по словарю
TRANSLATIONS, но не трогает литералы в сравнениях (===,indexOf() и внутренние ключи вроде DHCP/Custom — иначе ломается логика;применяет точечные правки
PATCHESтам, где текст собирается кодом;перезапускает шелл, иначе открытые панели держат старый код.
Хороший пример для третьего шага — календарь. Плагин принудительно форматирует дату английской локалью, поэтому перевод строк там ничего не даёт. Пришлось явно подставить Qt.locale("ru_RU"). С профилями питания похожая история: «Экономия», «Баланс», «Мощность» собираются из системных имён, а не лежат готовыми строками.
DNS
В виджете сети есть пилюли для быстрой смены DNS: Cloudflare и Google. Стоковый omarchy-dns другие провайдеры не принимает. dns-ru.py генерирует из него копию omarchy-dns-ru с Яндексом, DNS4EU и NextDNS и правит пилюли в клоне виджета. Идею и набор провайдеров я подсмотрел в WokoFlipper/omarchy‑network‑ru, реализацию сделал свою — без копии всего плагина.
Helper ставится с владельцем root:root и правами 0755. Он исполняется от root после подтверждения в polkit, и пользователь не должен иметь возможности его переписать. Тихого режима нет: каждая смена DNS спрашивает пароль.
Установка
Нужен установленный Omarchy, обычный пользователь (не root) и sudo. Релиз собирается GitHub Actions по тегу, рядом с архивом лежит контрольная сумма:
curl -fLO https://github.com/chastnik/omarchy-rus/releases/latest/download/omarchy-rus.tar.gz
curl -fLO https://github.com/chastnik/omarchy-rus/releases/latest/download/omarchy-rus.tar.gz.sha256
sha256sum -c omarchy-rus.tar.gz.sha256
tar xzf omarchy-rus.tar.gz && cd omarchy-rus
./install.shУстановщик предложит три варианта: «Рекомендуемое», «Всё» или «Выбрать вручную». Меню рисуется через gum, он в Omarchy уже есть; без него будет обычное текстовое. После установки нужно перезайти в сессию, чтобы применился язык.
Если меню не нужно, есть ключи:
./install.sh --list # что есть и что делает
./install.sh -y # рекомендуемое без вопросов
./install.sh --only timezone,telegram # только указанное
./install.sh --skip voxtype,tts # рекомендуемое, кроме указанного
./install.sh --dry-run -y # показать план и выйти--dry-run советую запустить первым: он покажет, какие модули и в каком порядке будут выполнены, ничего не меняя.
Откат сделан по модулям, а не одной кнопкой. Клон плагина удаляется через rm -r ~/.config/omarchy/plugins/$USER.<имя>, оригинал включается через omarchy plugin enable omarchy.<имя>. Правки в input.lua и bindings.lua делаются с бэкапом или между маркерами. Сертификаты Минцифры снимаются командой ./install-mincifry-ca.sh --remove.
Где пришлось повозиться
Voxtype и пустой текст. Модель parakeet-tdt-0.6b-v3-int8 весит около 650 МБ, а models.voxtype.io иногда отдаёт её очень медленно. Если загрузка не удалась, скрипт качает те же файлы с зеркала на Hugging Face с докачкой и проверкой sha256. Движок переключается на Parakeet только после успешной загрузки — иначе голосовой ввод просто перестал бы работать.
Вторая проблема была смешнее. Voxtype выдавал пустую строку или английский мусор, хотя модель стояла. Оказалось, что на ноутбуке Internal Mic Boost и Capture стояли на 100%, и звук клиппился в потолок (peak 32768). Скрипт теперь выставляет Boost=1 и Capture=60%. Если у вас то же самое, проверить можно так:
arecord -D default -f S16_LE -r 16000 -c 1 -d 5 t.wav && voxtype transcribe t.wavСертификаты Минцифры. Скрипт скачивает Russian Trusted Root/Sub CA с gu‑st.ru, сверяет зашитые в него SHA-256 и при несовпадении прерывается. Ставит их в системное хранилище, в NSS‑базу Chromium и включает enterprise roots в Firefox. Еженедельный systemd‑таймер проверяет отпечаток и срок действия.
Автоматического обновления сертификатов нет, и это сознательное решение. Это доверие к корневому центру, и я не хочу, чтобы оно менялось без участия человека. При смене отпечатка или сроке меньше 90 дней приходит уведомление, дальше решаете вы. По этой же причине модуль mincifry не входит в рекомендуемый набор.
Клоны плагинов не обновляются. Это главный минус подхода. После omarchy update оригинальные плагины получат исправления, а клоны — нет. Если панель сломалась или хочется свежей версии, клон удаляется и translate-plugins.py создаёт его заново. Если в новой версии плагина не нашлось фрагмента для PATCHES, скрипт напишет об этом в stderr.
Чего нет и не будет
Российских зеркал pacman. Omarchy использует своё зеркало, которое фиксирует версии пакетов, и замена
mirrorlistсломала бы эту модель.Перевода экрана блокировки и окна polkit. Ошибка в клоне плагина аутентификации может оставить без входа в систему — риск того не стоит.
КриптоПро, драйверов Рутокен и JaCarta, 1С. Они проприетарные и требуют регистрации. Модуль
ecpставит только открытую часть (PC/SC) и печатает ссылки.
Что пока не переведено
Dropbox, Agents, индикаторы на самом баре, названия эмодзи, меню Tmux и Herdr. Новые пункты меню после обновлений Omarchy тоже будут английскими, пока их не добавить в словари.
Вместо заключения
На вопрос, за что хвалят Omarchy, я для себя ответил: за то, что его удобно расширять, не ломая. Вся русификация уложилась в ~/.config/, клоны плагинов и пару сгенерированных скриптов, а системные файлы остались нетронутыми.
Репозиторий: github.com/chastnik/omarchy‑rus, лицензия MIT. Если после очередного omarchy update что‑то отвалилось или вы нашли непереведённую строку — пишите в issues или присылайте PR. Словари лежат в начале каждого скрипта, и дописать туда пару строк проще, чем кажется.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.