Skip to content
Назад в блог

EzSwitch — утилита для быстрого переключения раскладки на macOS

2 мин. чтения
EzSwitch — утилита для быстрого переключения раскладки на macOS

Для тех, кто постоянно работает с текстом на нескольких языках (например, пишет код на английском и документацию на русском), раскладка клавиатуры часто становится источником раздражения. Промахи мимо нужного языка, набранный абракадаброй текст (ghbdtn вместо привет) — всё это сбивает рабочий темп.

Чтобы решить эту проблему раз и навсегда, я разработал EzSwitch — лёгкую утилиту для macOS, написанную на Swift и SwiftUI, которая размещается в системном меню-баре и автоматизирует работу с клавиатурными раскладками.

В этой статье я расскажу о возможностях утилиты и о том, как реализованы её ключевые функции под капотом macOS.

Ключевые фичи EzSwitch

Приложение решает две основные задачи: быстрое переключение раскладок физической клавишей и мгновенное исправление уже набранного не в том режиме текста.

1. Переключение по клавише Command (или Option)

Интерфейс EzSwitch в меню-баре
Интерфейс EzSwitch в меню-баре

Вместо стандартных неудобных комбинаций Cmd+Space или Ctrl+Space, EzSwitch позволяет переключать язык одиночным тапом по модификаторам:

  • Одиночный тап по левому Command ➔ принудительно включает левую раскладку (например, английский).
  • Одиночный тап по правому Command ➔ включает правую раскладку (например, русский). Это работает мгновенно и безошибочно, так как вам не нужно помнить, какой язык активен сейчас. Достаточно нажать левую или правую кнопку.

2. Конвертация набранного текста по двойному Shift

Если вы забыли переключить язык и набрали слово «абракадаброй», выделите его и дважды нажмите клавишу Shift (или Option). Текст мгновенно трансформируется в правильную раскладку.

  • Поддерживается исправление как выделенного текста, так и последнего слова перед курсором.
  • Имеется функция автопереключения раскладки вслед за исправленным текстом.

Как это устроено под капотом macOS

Разработка подобного системного софта под macOS требует глубокого взаимодействия с низкоуровневыми API операционной системы.

Перехват клавиатурных событий (Event Taps)

Для отслеживания нажатий клавиш (двойной Shift, одиночный Command) в KeyboardManager.swift используется механизм CGEventTap. Приложение регистрирует слушатель событий клавиатуры на уровне системы:

let eventTap = CGEvent.tapCreate(
    tap: .cgSessionEventTap,
    place: .headInsertEventTap,
    options: .defaultTap,
    eventsOfInterest: [.keyDown, .keyUp, .flagsChanged],
    callback: myEventTapCallback,
    userInfo: nil
)

Это требует предоставления приложению системного разрешения Input Monitoring (Мониторинг ввода).

Автоматическая генерация мапперов через UCKeyTranslate

Чтобы текст корректно конвертировался между любыми парами языков, приложению нужна таблица соответствия клавиш. Вместо написания таких файлов вручную, EzSwitch использует Carbon API под названием UCKeyTranslate. Приложение считывает активные раскладки в системе, симулирует виртуальные нажатия клавиш для каждой физической кнопки во всех модификациях (с Shift и без) и на лету генерирует точную карту символов. Это гарантирует, что конвертер будет корректно работать с абсолютно любыми установленными у пользователя раскладками ввода.

Сгенерированная карта раскладки клавиатуры
Сгенерированная в рантайме карта раскладки клавиатуры через Carbon UCKeyTranslate API

Замена текста

Для исправления текста приложение использует симуляцию клавиатурных сочетаний через доступность (Accessibility API):

  1. Симулирует нажатие Shift + Option + Left (или Ctrl + Shift + Left в IDE) для выделения последнего набранного слова.
  2. Копирует выделенный текст в буфер обмена (Cmd+C).
  3. Трансформирует символы буфера по сгенерированной карте символов.
  4. Вставляет исправленный текст обратно (Cmd+V).

Заключение

EzSwitch получился лёгким, быстрым и нетребовательным к ресурсам инструментом, который экономит массу времени при ежедневной работе на Mac. Проект полностью открытый — переходите в репозиторий EzSwitch на GitHub, чтобы изучить исходный код, собрать его в Xcode или внести свои доработки.

Разрабатываете инструмент или утилиту, и нужна помощь с архитектурой или технической стороной? Можем обсудить это на технической консультации. Или посмотрите, что ещё я строю и разрабатываю.

Автор

Fullstack Engineer

В коммерческой разработке с 2011 года — больше 15 лет. Автор двух SaaS-продуктов: TeleGo.io и LingvoHabit.com. Статьи здесь выросли из реальной клиентской и продуктовой работы.

Подробнее об автореНаписать в Telegram

Похожие статьи

GZIP VS BROTLI
GZIP VS BROTLI · '26

Как патенты на LZW привели к gzip, а веб к Brotli

История gzip, DEFLATE и Brotli, устройство двух форматов сжатия и практический выбор между размером результата, скоростью кодирования и совместимостью.

#GZip vs Brotli #история сжатия данных #Jean-loup Gailly #Brotli Google #Deflate алгоритм #LZ77 Huffman
5 мин. чтения
ФОРМАТИРОВАНИЕ RTL ТЕКСТА
ФОРМАТИРОВАНИЕ RTL ТЕКСТА · '26

Почему иврит и английский меняются местами

Как Unicode BiDi отображает иврит и арабский вместе с латиницей и кириллицей и когда использовать isolates, LRM или RLM.

#Форматирование RTL текста #Иврит и английский #Unicode BiDi controls #LRM и RLM #LRI RLI PDI #Смешанное направление текста
3 мин. чтения
СЖАТИЕ ИЗОБРАЖЕНИЙ
СЖАТИЕ ИЗОБРАЖЕНИЙ · '26

Оптимизация SVG, экспорт кода и сжатие изображений

Оптимизируйте и трансформируйте SVG, экспортируйте React, React Native, Vue, PNG или Data URI и сжимайте растровые изображения локально в браузере.

#сжатие изображений #WebP формат #оптимизация SVG #PNG vs JPEG #AVIF #SVGO
4 мин. чтения