Skip to content

rashn/RuSwitcher

Repository files navigation

RuSwitcher

RuSwitcher icon

Lightweight keyboard layout switcher for macOS
Free and open-source alternative to PuntoSwitcher

Release License macOS 13+ Swift 6

English · Русский


English

Typed ghbdtn when you meant привет? Just tap Option ⌥ and RuSwitcher converts the last word into the right layout — typing it directly, no copy-paste. Works with any pair of installed keyboard layouts — Russian, Ukrainian, Belarusian, German, French, and more — and the trigger key is fully configurable.

How it works

Action Result
Type a word, tap Option ⌥ Last typed word is converted
Tap Option ⌥ again Reverse conversion (undo)
Select text, tap Option ⌥ Selected text is converted

The trigger is configurable — Option, Command, Control or Shift, left or right side, single or double-tap.

Automatic conversion (beta — new in 2.4)

RuSwitcher can also fix the layout automatically as you type, with no key press. Turn it on in Settings → Auto-conversion (off by default). When you finish a word (space), it checks the word against the macOS system dictionary and — only when confident — converts it and switches the layout for you.

Precision-first: to avoid false fixes it deliberately skips short words (< 3 letters), words with digits / punctuation / URLs, ALL-CAPS acronyms typed with Shift, camelCase / mixed-script code identifiers, terminals / IDEs / password managers, and password fields. It targets layout pairs that have a macOS system dictionary (English ↔ Russian / Ukrainian / German / French… are reliable); languages without one (Belarusian, Armenian, Georgian) keep using the manual trigger.

Three exception lists let you tune it (Settings → Auto-conversion):

  • Apps — where auto-conversion stays off (terminals, IDEs and password managers are pre-filled; password managers can't be removed).
  • Never convert — words it must never touch (nicknames, logins, brands). After a wrong fix, tap the trigger to undo and RuSwitcher offers to add the word here.
  • Always convert — words to always fix even if they aren't in the dictionary (compound words, slang). Add the target word — the result you want.

Features

  • Any two layouts — configure any pair from your installed system layouts. No hardcoded tables.
  • Configurable trigger — pick Option, Command, Control or Shift; left or right side; single or double-tap.
  • Automatic conversion (beta) — optionally fix the layout as you type, with a precision-first system-dictionary check. Off by default.
  • Exception lists — a per-app exclusion list plus never-convert and always-convert word lists.
  • Universal binary — runs natively on both Apple Silicon and Intel Macs.
  • Clipboard-free — the converted word is typed directly via synthesized Unicode, so it works even in Electron / VS Code / Atom-class editors. Your clipboard is never touched (it's only a fallback for unusual apps).
  • Smart word detection — converts the last typed word, including punctuation.
  • Selected text — select any text and tap the trigger to convert it in place.
  • Tap again to undo — reverse conversion if you changed your mind.
  • Per-app layout memory — remembers the active layout for each application and restores it when you switch back.
  • 16 interface languages — English, Русский, Українська, Беларуская, Deutsch, Français, Español, Português, Polski, 中文, 日本語, 한국어, Ελληνικά, Български, Հայերեն, ქართული.
  • Auto-start at login — set and forget.
  • Minimal footprint — no Electron, no web views, pure Swift + AppKit.
  • No telemetry — your keystrokes stay on your Mac.

Installation

Homebrew (recommended)

brew tap rashn/ruswitcher
brew install --cask ruswitcher

To upgrade later: brew upgrade --cask ruswitcher.

Download DMG

Grab the latest .dmg from Releases, open it and drag RuSwitcher to Applications.

Build from source

git clone https://github.com/rashn/RuSwitcher.git
cd RuSwitcher
bash build_app.sh
cp -R RuSwitcher.app /Applications/

Requires macOS 13+ and Xcode Command Line Tools.

Permissions

On first launch, RuSwitcher requests two macOS permissions:

  1. Accessibility — to read and modify text in applications.
  2. Input Monitoring — to detect keyboard events.

The app adds itself to the permission lists automatically — you only need to flip the toggles. The built-in permission wizard walks you through it step by step.

Technical details

  • CGEventTap (passive, listen-only) for keyboard monitoring.
  • UCKeyTranslate (Carbon) for dynamic character mapping between any layout pair.
  • CGEvent.keyboardSetUnicodeString to type the converted text directly — no clipboard, no pasteboard side effects.
  • CGEventSource.userData marker to filter the app's own simulated events.
  • AXUIElement API for focused element detection.
  • SMAppService for login item management.
  • No hardcoded layout tables — works with any installed layouts.

Settings

Access via the menu bar icon → Settings (⌘,).

  • General — conversion trigger, per-app layout memory, launch at login, interface language, layout pair.
  • Auto-conversion — automatic conversion toggle and the three exception lists (apps, never-convert, always-convert).
  • About — version, donate, contact, check updates.
  • Advanced — debug logging, log management.

Support the project

If you find RuSwitcher useful:

  • Boosty — donate
  • Star this repo on GitHub

License

MIT — free to use, modify, and distribute.


Русский

Набрали ghbdtn вместо привет? Просто нажмите Option ⌥ — и RuSwitcher сконвертирует последнее слово в правильную раскладку, печатая его напрямую, без копипасты. Работает с любой парой установленных раскладок — русская, украинская, белорусская, немецкая, французская и другие — а клавишу-триггер можно настроить.

Как работает

Действие Результат
Набрать слово, нажать Option ⌥ Последнее слово сконвертировано
Нажать Option ⌥ повторно Обратная конвертация (отмена)
Выделить текст, нажать Option ⌥ Выделенный текст сконвертирован

Триггер настраивается — Option, Command, Control или Shift, левый или правый, одиночный или двойной тап.

Автоматическая конверсия (бета — новое в 2.4)

RuSwitcher умеет исправлять раскладку автоматически по ходу набора, без нажатий. Включается в Настройки → Автоконверсия (по умолчанию выключено). Когда вы заканчиваете слово (пробел), приложение сверяет его с системным словарём macOS и — только при уверенности — конвертирует и само переключает раскладку.

Точность важнее полноты: чтобы не сработать зря, авто-конверсия намеренно пропускает короткие слова (< 3 букв), слова с цифрами / пунктуацией / URL, акронимы капсом через Shift, camelCase / смешанные алфавиты (идентификаторы кода), терминалы / IDE / менеджеры паролей и поля паролей. Работает для пар раскладок, у которых есть системный словарь macOS (английский ↔ русский / украинский / немецкий / французский… — надёжно); для языков без словаря (белорусский, армянский, грузинский) остаётся ручной триггер.

Три списка исключений для тонкой настройки (Настройки → Автоконверсия):

  • Приложения — где авто-конверсия выключена (терминалы, IDE, менеджеры паролей уже в списке; менеджеры паролей удалить нельзя).
  • Никогда не конвертировать — слова, которые трогать нельзя (ники, логины, бренды). После ошибочной замены нажмите триггер для отмены — RuSwitcher предложит добавить слово сюда.
  • Всегда конвертировать — слова, которые исправлять всегда, даже если их нет в словаре (составные слова, сленг). Добавляйте целевое слово — то, что должно получиться.

Возможности

  • Любая пара раскладок — настраивается любая пара из установленных в системе. Без захардкоженных таблиц.
  • Настраиваемый триггер — Option, Command, Control или Shift; левый или правый; одиночный или двойной тап.
  • Автоматическая конверсия (бета) — опционально исправляет раскладку по ходу набора, с проверкой по системному словарю. По умолчанию выключено.
  • Списки исключений — список приложений плюс словари never-convert и always-convert.
  • Universal-сборка — нативно на Apple Silicon и Intel.
  • Без буфера обмена — конвертированное слово печатается напрямую через синтез Unicode, поэтому работает даже в Electron / VS Code / Atom. Буфер обмена не трогается (только как запасной вариант для нестандартных приложений).
  • Умное определение слова — конвертирует последнее набранное слово, включая знаки препинания.
  • Выделенный текст — выделите любой текст и нажмите триггер для конвертации на месте.
  • Повторное нажатие — отмена — обратная конвертация, если передумали.
  • Память раскладки по приложению — запоминает активную раскладку для каждой программы и восстанавливает при возврате.
  • 16 языков интерфейса — English, Русский, Українська, Беларуская, Deutsch, Français, Español, Português, Polski, 中文, 日本語, 한국어, Ελληνικά, Български, Հայերեն, ქართული.
  • Автозапуск при входе — настроил и забыл.
  • Минимальное потребление — без Electron и веб-вьюх, чистый Swift + AppKit.
  • Без телеметрии — ваши нажатия остаются на вашем Mac.

Установка

Homebrew (рекомендуется)

brew tap rashn/ruswitcher
brew install --cask ruswitcher

Для обновления: brew upgrade --cask ruswitcher.

Скачать DMG

Скачайте последний .dmg со страницы Releases, откройте и перетащите RuSwitcher в «Программы».

Сборка из исходников

git clone https://github.com/rashn/RuSwitcher.git
cd RuSwitcher
bash build_app.sh
cp -R RuSwitcher.app /Applications/

Требуется macOS 13+ и Xcode Command Line Tools.

Разрешения

При первом запуске RuSwitcher запросит два системных разрешения macOS:

  1. Универсальный доступ (Accessibility) — для чтения и изменения текста в приложениях.
  2. Мониторинг ввода (Input Monitoring) — для отслеживания нажатий клавиш.

Программа автоматически добавляется в списки разрешений — вам нужно только включить тумблеры. Встроенный мастер разрешений проведёт по шагам.

Технические детали

  • CGEventTap (пассивный, только чтение) для мониторинга клавиатуры.
  • UCKeyTranslate (Carbon) для динамического маппинга символов между любой парой раскладок.
  • CGEvent.keyboardSetUnicodeString для прямой печати конвертированного текста — без буфера обмена и побочных эффектов с pasteboard.
  • Маркер CGEventSource.userData для фильтрации собственных симулированных событий.
  • AXUIElement API для определения сфокусированного элемента.
  • SMAppService для управления автозапуском.
  • Без захардкоженных таблиц — работает с любыми установленными раскладками.

Настройки

Доступ через иконку в строке меню → Настройки (⌘,).

  • Общие — триггер конвертации, память раскладки по приложению, автозапуск, язык интерфейса, пара раскладок.
  • Автоконверсия — тумблер автоматической конверсии и три списка исключений (приложения, never-convert, always-convert).
  • О программе — версия, донат, контакт, проверка обновлений.
  • Дополнительно — режим отладки, управление логами.

Поддержать проект

Если RuSwitcher вам полезен:

  • Boosty — донат
  • Star на GitHub

Лицензия

MIT — свободное использование, модификация и распространение.