Русские и болгарские формы букв в одном шрифте: настройка

Если один шрифт должен обслуживать русский и болгарский тексты, одних общих кириллических знаков может быть недостаточно: в этих языковых традициях некоторые буквы принято рисовать по-разному. Для таких случаев OpenType предусматривает локальные формы, выбираемые по языковой разметке текста. Разберём, как спланировать набор, настроить подстановки и проверить, что русский, болгарский и английский фрагменты сохраняют нужный облик.
Почему один набор кириллицы не всегда подходит двум языкам
Кириллица — письменность, которой пользуются разные языковые сообщества. Совпадение кодов символов не означает полного совпадения типографических норм: в некоторых языках привычный рисунок отдельных букв отличается. Например, болгарский читатель может ожидать локальные формы, отличающиеся от русских; в одной гарнитуре поэтому могут сосуществовать два рисунка для одного и того же символа.
Важно разделять смысл и форму. В русском и болгарском тексте буква остаётся тем же Unicode-символом, если различается только её начертание. Не следует придумывать новый код или подменять букву похожим знаком из латиницы: это ухудшит поиск, копирование, сортировку и работу со вспомогательными технологиями. Решение находится в шрифтовой таблице подстановок, а выбор варианта должен зависеть от языка конкретного текста.
В многоязычном проекте рядом могут стоять русская инструкция, болгарская цитата и английское название продукта. Если весь абзац помечен одним языком, типографская система может применить неверный локальный вариант к его части. Поэтому работа включает и рисунок глифов, и корректные языковые границы в самом тексте.
Что делает OpenType-функция locl
Функция `locl` (Localized Forms) позволяет шрифту подставить локальный вариант глифа, когда приложение передало язык текстового фрагмента. Спецификация OpenType приводит болгарские и сербские формы кириллических букв в качестве примера таких вариантов и рекомендует связывать их с языковыми тегами. Подстановка сохраняет исходный Unicode-символ: меняется глиф, который отображает шрифт, а не текстовые данные.
Условно цепочка выглядит так: символ из текста проходит через таблицы шрифта; приложение задаёт для фрагмента язык; система набора выбирает соответствующую языковую систему; `locl` заменяет базовый глиф на нужную локальную форму, если такая подстановка предусмотрена. Для латинского текста без отдельной локальной подстановки остаётся обычный латинский набор.
Это не то же самое, что стилистический набор, который пользователь вручную включает для декоративного эффекта. Локальная форма — языковое решение по умолчанию для фрагмента с соответствующим языком. В спецификации Microsoft описана рекомендация активировать её по языковому тегу и держать включённой при штатной обработке.
Сначала составьте карту языков и примеров
До рисования выпишите реальные языки, которые должны поддерживаться, и определите, где они встречаются: в длинном тексте, коротких подписях, именах, кнопках, ссылках или числовых данных. Уточните, будут ли русская и болгарская кириллица нужны в одном документе, а английские слова — внутри обоих языковых вариантов.
Для каждого языка соберите короткие фразы от носителей и сравните буквы, рисунок которых может отличаться. Не ограничивайтесь таблицей алфавита: в словах заметны соседства, интервалы и общий темп строки. Для проверки попросите носителя посмотреть на пробные фразы без подсказки, где какой вариант должен быть.
Затем решите, какая форма будет базовой. Если продукт в основном русскоязычный, логично оставить привычный русскоязычный рисунок как основной и подключать болгарские формы там, где явно задан болгарский язык. Для проекта с иным приоритетом базовый выбор может быть другим. Главное — не менять базовую форму незаметно для всех языков сразу.
Как подготовить шрифт: рабочая последовательность
- **Зафиксируйте набор символов.** Проверьте, что нужные русские и болгарские буквы имеют правильные Unicode-коды. Локальные варианты — это альтернативные глифы для кодированных символов, а не дополнительные буквы алфавита.
- **Нарисуйте и назовите варианты.** Для каждой буквы сначала создайте читаемую базовую форму, затем соответствующий локальный вариант. Дайте им понятные внутренние имена, например `a_cyrillic` и `a_cyrillic.bul`, если редактор и схема именования проекта это поддерживают. Названия глифов не меняют поведение сами по себе, но помогают не перепутать пары при сборке.
- **Сведите формы в одну систему.** Сравните высоту, толщину, наклон, ширину, контраст и соединения с соседями. Локальный рисунок может отличаться конструкцией, но не должен выглядеть случайно взятым из другой гарнитуры. Проверьте парные сочетания и интервалы для частых буквосочетаний каждого языка.
- **Настройте `locl`.** В редакторе шрифта укажите соответствие между кодированным символом и его болгарским вариантом в языковой системе Bulgarian. Для русского текста оставьте основной глиф, если он выбран базовым. Не ограничивайтесь названием функции: убедитесь, что таблица подстановок связана с нужным языковым тегом.
- **Добавьте латиницу как отдельный рабочий набор.** Проверьте английские слова, домены и названия рядом с обоими вариантами кириллицы. Функция `locl` для болгарской кириллицы не создаёт латинские символы и не гарантирует совместимость алфавитов: у латиницы должны быть собственные глифы, метрики и интервалы.
- **Соберите и проверьте экспорт.** После экспорта убедитесь, что таблицы OpenType сохранились, а разные языковые фрагменты обрабатываются так, как задумано. Проверяйте именно экспортный файл, а не только предпросмотр в редакторе.
Как выглядит проверочный тест
Составьте один тестовый текст, где есть русский абзац, болгарская строка, английское название и смешанное предложение. Пример сценария: русская подпись «Новый каталог», болгарская подпись «Нов каталог», затем пояснение «Читайте guide перед началом». Точный набор слов лучше выбрать с носителем болгарского и редактором проекта; здесь важна последовательность теста, а не перевод.
Сравнивайте рендеринг в трёх вариантах: без языковой разметки, с русским языком для всего текста и с отдельной болгарской разметкой только на болгарском фрагменте. Ожидаемый результат — базовые формы там, где нужен русский вариант, локальные формы на болгарском участке и неизменённая латиница в английском слове. Если во всех случаях виден один вариант, проверьте поддержку языка приложением, передачу тега и наличие `locl` в экспортном файле.
Тестируйте в тех средах, где шрифт реально будет использоваться: настольном редакторе, браузере или приложении. Способ назначения языка у разных программ отличается. Для веб-текста язык страницы можно задать атрибутом `lang`, а отдельный фрагмент разметить своим `lang`; однако конечный результат зависит от цепочки браузера, шрифтового файла и механизма формирования строк. Не обещайте, что одно CSS-правило заставит каждую старую программу одинаково обработать `locl`.
Как проверять английские фрагменты рядом с кириллицей
Латинские названия часто остаются без явно заданного языка, потому что браузер наследует язык родительского элемента. В тестовом макете отдельно помечайте английские слова и бренды, если для них нужно английское формирование. Это полезно не потому, что каждая латинская буква обязательно меняется, а потому что язык может влиять на другие локальные формы или правила набора.
Проверяйте не только отдельные буквы, но и полную строку: заголовок с названием приложения, кнопку с англоязычным глаголом, адрес сайта в русской инструкции. Убедитесь, что смена языка на одной части не меняет форму соседнего русского слова, не нарушает переносы и не создаёт резкий скачок плотности. Сопоставляйте на одинаковом кегле, насыщенности и масштабе.
Если продукт не может передавать язык каждому небольшому фрагменту, заранее определите безопасный запасной сценарий. Например, можно выбрать общий рисунок, который приемлем для всех целевых языков, или назначить язык на уровне отдельных блоков контента. Не стоит подменять язык страницы глобально ради одной цитаты: это может изменить локальные правила во всём документе.
Частые ошибки и способы их исправить
- **Рисовать болгарскую форму как отдельный Unicode-символ.** Это создаёт ложный код и мешает нормальной обработке текста. Оставьте код исходной буквы и используйте глифовую подстановку.
- **Добавить альтернативы, но не связать их с языком.** В редакторе они видны, однако обычная программа не знает, когда их применять. Проверьте языковую систему и `locl` в собранном файле.
- **Проверять только латинские и кириллические буквы по одной.** Ошибки проявляются в словах: ширина, интервалы и ритм могут отличаться. Добавьте фразы, заголовки и смешанные строки.
- **Считать, что язык всего документа всегда одинаков.** Внутри страницы встречаются цитаты, товарные названия и подсказки на другом языке. Размечайте такие фрагменты отдельно, когда это важно для вида текста.
- **Проверить только редактор шрифта.** Он может показывать подстановки, которые не пережили экспорт или не поддерживаются целевой программой. Повторите тест на конечном файле и в целевых приложениях.
- **Копировать локальные формы из другого шрифта без настройки.** Их пропорции, толщина и интервалы могут конфликтовать с вашими знаками. Согласуйте рисунок с собственным алфавитом и проверьте его с носителями.
Контрольный список перед выпуском
- Указаны все языки, письменности и места, где они появляются.
- Для нужных символов выбраны правильные Unicode-коды; новые коды ради локального рисунка не добавлены.
- Базовый вариант и локальные варианты нарисованы в одной системе пропорций.
- Болгарские подстановки назначены языковой системе Bulgarian через `locl`.
- Русский, болгарский и английский примеры размечены как отдельные фрагменты.
- Смешанные слова, названия, строки и короткие элементы интерфейса проверены целиком.
- Экспорт протестирован в редакторе, браузере или приложении, где шрифт будет работать.
- Результат просмотрен человеком, который читает каждый поддерживаемый язык.
Часто задаваемые вопросы
Нужен ли отдельный файл шрифта для болгарского языка?
Не обязательно. Если шрифт содержит обе версии необходимых глифов и корректно настроенную функцию локальных форм, один файл может переключать их по языку текста. Отдельные файлы могут упростить ограниченные рабочие процессы, но увеличивают риск, что документ или приложение выберет не тот вариант.
Меняется ли текстовый символ при включении `locl`?
Нет, функция подменяет отображаемый глиф, а Unicode-символ остаётся прежним. Поэтому поиск, копирование и обработка текста продолжают работать с исходной буквой. Если для похожего рисунка вручную вставить другой символ, это уже изменение текста, а не локальная типографическая форма.
Можно ли переключить русскую форму на болгарскую вручную?
В некоторых редакторах доступны панели OpenType-функций и язык абзаца, но интерфейс и поведение различаются. Для обычного читателя предпочтительно, чтобы нужную форму выбирала корректная языковая разметка. Ручной выбор полезен при проверке или в особом макете, но не заменяет проверку языкового процесса.
Включится ли `locl` в любом приложении автоматически?
Гарантировать одинаковое поведение нельзя: приложение должно передать язык фрагмента и поддерживать нужную обработку OpenType. Проверьте файл в целевых редакторах и браузерах. Если язык не задан, приложение может использовать базовую или дефолтную систему.
Нужно ли рисовать локальную версию для английского текста?
Только если у гарнитуры есть варианты, которые должны применяться именно к английскому языку. Для сочетания кириллицы и латиницы в первую очередь нужны полноценные символы обоих алфавитов, согласованные метрики и интервалы. Само наличие функции `locl` не добавляет отсутствующие латинские буквы.
Как проверить подстановку без специальной панели OpenType?
Назначьте языки отдельным фрагментам в программе, которая поддерживает языковую разметку, и сравните результат с базовым вариантом. Для веб-страницы задайте язык всему документу и явно укажите язык цитаты или названия на другом языке. Если форма не меняется, проверьте другой поддерживаемый редактор и сам экспортный файл.
Итог
Многоязычный шрифт требует учитывать не только наличие кириллицы и латиницы, но и локальные нормы внутри одной письменности. Для русского и болгарского текста храните один исходный символ и переключайте предусмотренные формы через `locl` и языковую разметку; затем проверяйте смешанные строки на экспортном файле. Чтобы собрать собственный шрифт по почерку, можно начать с шаблона на Fontgenerator и заранее добавить в тестовые фразы все нужные языки.
Источники: спецификация Microsoft OpenType, описание функции Localized Forms — https://learn.microsoft.com/en-us/typography/opentype/spec/features_ko ; формат языковых систем OpenType — https://learn.microsoft.com/en-us/typography/opentype/spec/chapter2 ; список языковых тегов OpenType — https://learn.microsoft.com/en-us/typography/opentype/spec/languagetags .