Виртуальная клавиатура

Экранная клавиатура для другого языка: раскладки, привязка по позиции, мёртвые клавиши, слой AltGr, корейские слоги и японские ромадзи — всё в браузере.

Стрелки перемещают по клавишам на экране, Enter нажимает клавишу. Tab выходит из клавиатуры; ваша собственная клавиатура печатает прямо в текстовое поле.

Физические клавиши сопоставляются по позиции: каждая клавиша печатает то, что выбранная раскладка ставит на это место, какой бы ни была раскладка системы. Перехват действует только пока текстовое поле в фокусе — Ctrl+C, Tab и стрелки продолжают работать.

Alt Gr — удерживаемый на вашей клавиатуре или нажатый ниже — открывает третий слой, куда раскладка помещает @, € и скобки. Мёртвая клавиша (пунктирная рамка) сама по себе ничего не печатает: нажмите её, затем букву, чтобы составить знак с диакритикой, пробел, чтобы получить сам знак, или Backspace, чтобы отменить.

Один инструмент, тринадцать языков

Эта клавиатура печатает на тринадцати языках, на которых написан этот сайт, и для каждого показывает раскладку, которой носители языка действительно пользуются, — по простому правилу: стандартная раскладка страны с наибольшим числом говорящих. Иврит — стандарт SI-1452, французский — AZERTY, немецкий — QWERTZ, русский — ЙЦУКЕН, испанский — латиноамериканская раскладка, португальский — бразильская ABNT2, турецкий — Turkish Q, японский — кана-раскладка JIS, корейский — тубольсик (Dubeolsik). В списке каждая раскладка подписана собственным именем на собственном языке, потому что читатель, ищущий свой язык, узнаёт его самоназвание при любом языке интерфейса.

Один пункт нарочно скучен: индонезийский. У Индонезии нет национальной раскладки — страна печатает на US QWERTY, той же раскладке, что и английский, — и честный ответ состоит в том, чтобы так и сказать, а не выдумывать раскладку, которой ни один индонезиец никогда не видел. Инструмент открывается с раскладкой языка, на котором вы его читаете, и в любой момент можно переключиться на любую другую; набранный текст при переключении остаётся на месте.

Позиционное сопоставление: ваша собственная раскладка не важна

Печатайте на физической клавиатуре — и инструмент читает каждую клавишу по её позиции на доске, никогда не по символу, который, по мнению операционной системы, она даёт. Клавиша двумя рядами выше пробела, сразу справа от J — позиция K — печатает k в US QWERTY и ל в ивритской раскладке, какая бы раскладка ни была установлена на вашей машине. В этом перевороте весь смысл: слушай инструмент операционную систему, он лишь возвращал бы вам эхом вашу же раскладку и никогда не смог бы печатать на языке, раскладки которого у вас нет.

Щелчок по экранной клавише и нажатие на физической доске проходят через один и тот же механизм, поэтому они никогда не разойдутся в том, что делает клавиша. Пока вы печатаете физически, нажатая клавиша подсвечивается на экранной клавиатуре — так и учат, где живут символы незнакомой раскладки, как когда-то этому учили печатные наклейки на клавиши.

Перехват нарочно узок. Физические клавиши читаются только пока текстовое поле в фокусе, так что остальная страница продолжает работать как обычно. Сочетания вроде Ctrl+C, Ctrl+V, Ctrl+A и Ctrl+Z проходят прямо в браузер, как и стрелки, Home, End и Delete, — а Tab не проглатывается никогда, потому что инструмент, съедающий Tab, запирает на странице всякого, кто перемещается с клавиатуры.

Чего физической клавиатуре может не хватать, так это клавиш. Европейские раскладки здесь — это клавиатуры ISO: у них есть 102-я клавиша между левым Shift и первой буквой нижнего ряда, а бразильская ABNT2 добавляет 49-ю рядом с правым Shift. На клавиатуре ANSI американского образца нет ни той, ни другой, так что ни одно ваше нажатие до них не доберётся — но на экранной клавиатуре они нарисованы, как и все прочие, и щелчок печатает ровно то, что раскладка туда помещает. Ничто в раскладке не остаётся недостижимым: на неподходящей клавиатуре небольшая её часть доступна только мышью.

Слои: Shift, Caps Lock, AltGr и мёртвые клавиши

Настоящая клавиатура печатает больше символов, чем у неё клавиш, и делает это слоями. Удержанный Shift при нажатии печатает слой Shift; щелчок же по экранному Shift фиксирует его ровно на один символ — так экранные клавиатуры ведут себя везде. Caps Lock уже, чем принято думать: он капитализирует только те клавиши, где слой Shift действительно является заглавной буквой базовой, поэтому превращает a в A, но никогда не превращает 1 в !. На письме вовсе без регистра — иврит из таких — Caps Lock не делает ничего, ровно как и настоящая ивритская клавиатура.

Европейские раскладки несут третий слой, достижимый через AltGr, где живут символы вроде @, € и пар скобок, и мёртвые клавиши со стандартным поведением: нажимаете значок ударения, затем букву — и они складываются; мёртвая клавиша и затем пробел дают сам значок, а буква, к которой значок не может присоединиться, просто приходит после него. Ожидающая мёртвая клавиша помечается на экранной клавиатуре, чтобы тишина между двумя нажатиями была видимой, а не сбивающей с толку.

Две ивритские детали выглядят как ошибки и являются стандартом. Раскладка зеркалит свои парные ограничители — Shift+9 печатает ) там, где US QWERTY печатает ( — потому что стандарт сопоставляет логический символ, а алгоритм двунаправленного текста зеркалит его обратно при отрисовке; клавиша, выглядящая как открывающая скобка, даёт на экране открывающую скобку. И само текстовое поле переворачивается справа налево при выборе иврита или арабского, потому что направление принадлежит набираемому тексту, а не языку страницы вокруг.

Японский и корейский — методы ввода, а не просто раскладки

Для большинства языков клавиатура — это таблица: одна позиция клавиши, один символ. Корейскому и японскому таблицы мало. Корейский тубольсик печатает чамо — отдельные согласные и гласные, — а метод ввода на ходу складывает их в слоговые блоки: ㅎ, затем ㅏ, затем ㄴ становятся 한, составные гласные и двойные конечные согласные собираются так же, а конечная согласная переносится в следующий слог, когда идущее следом делает такое чтение правильным. Backspace разбирает композицию чамо за чамо, а не стирает слог целиком, потому что так ведёт себя каждый корейский метод ввода, а всё прочее превращает исправление опечатки в мучение.

Японский есть в двух режимах. По умолчанию — ввод ромадзи на физической клавиатуре: печатаете ka, появляется か, со стандартной обработкой маленького っ и ん — потому что именно так и происходит большая часть японского набора. Экранная клавиатура показывает кана-раскладку JIS, где каждая клавиша — слог, а позиционный режим JIS есть для тех, кто действительно так печатает. Переключатель меняет вывод между хираганой и катаканой.

Чего инструмент нарочно не делает — так это не преобразует кану в кандзи. Настоящее преобразование требует словаря в сотни тысяч слов и модели ранжирования поверх — это IME, а не клавиатура, — и выпустить плохое было бы хуже, чем никакого: вы получали бы правдоподобный неверный текст без всякой возможности это увидеть. Вывод только каной заявлен здесь прямо, чтобы предел был понят, а не обнаружен.

Работает в вашем браузере

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

Частые вопросы

Почему нажатие клавиши K печатает ל?
Потому что клавиши сопоставляются по физической позиции, а не по символу, который сообщает операционная система. В ивритской раскладке позиция K несёт букву ל — её она и печатает, что на вашей доске, что на экранной клавиатуре. Именно это позволяет печатать на языке, раскладки которого на вашей машине нет.
Нужно ли, чтобы язык был установлен на компьютере?
Нет. Инструмент никогда не спрашивает операционную систему, что означает клавиша, — он сам разрешает каждую клавишу по выбранной раскладке. На вашей машине может стоять любая раскладка или ни одной из нужных — набранный текст выйдет одинаковым.
Почему мой Ctrl+C продолжал работать во время набора?
Так задумано. Сочетания с модификаторами, стрелки, Home, End, Delete и Tab передаются браузеру как есть, а не перехватываются, поэтому привычные приёмы редактирования — копировать, вставить, отменить, выделить всё — продолжают работать внутри текстового поля, а клавиатурная навигация — вне его.
Умеет ли он превращать японскую кану в кандзи?
Нет, и это сознательно. Преобразование в кандзи требует IME — словаря в сотни тысяч слов плюс модели ранжирования, — а плохой IME выдаёт правдоподобный неверный текст, что хуже, чем ничего. Инструмент печатает хирагану и катакану, с вводом ромадзи на физической клавиатуре, и говорит об этом прямо, а не даёт вам обнаружить предел самим.
Почему Shift+9 печатает в иврите закрывающую скобку?
Он печатает логический символ, который ставит там стандарт SI-1452, а алгоритм двунаправленного текста зеркалит его при отрисовке текста справа налево — на экране вы видите ровно ту скобку, что нарисована на клавише. «Починить» это значило бы сломать каждую скобку, набранную на иврите.
На моей клавиатуре нет клавиши рядом с левым Shift. Её всё равно можно напечатать?
Да, щелчком по ней. Европейские раскладки — это клавиатуры ISO со 102-й клавишей в этом месте, а у бразильской ABNT2 есть дополнительная клавиша рядом с правым Shift; на клавиатуре ANSI американского образца нет ни одной из них. Обе нарисованы на экранной клавиатуре, и щелчок печатает то, что раскладка туда помещает, — так что ни один символ раскладки не остаётся недоступным, какая бы клавиатура у вас ни была.
Отправляется ли что-нибудь из набранного на сервер?
Нет. Вся клавиатура — раскладки, сопоставление, композиция — работает в вашем браузере. Нажатия обрабатываются локально, ничего не выгружается и не журналируется, а перехват действует только пока текстовое поле в фокусе, так что клавиши, нажатые в других местах страницы, не видны вовсе.