Skip to content

Feature Request: Add Bulgarian Cyrillic localized forms (locl BGR) #114

Description

@vasilGerginski

Summary

Open Sans currently lacks OpenType locl (Localized Forms) support for Bulgarian Cyrillic (language BGR). This means that when Bulgarian text is rendered with Open Sans, users see Russian-style Cyrillic letterforms instead of the historically distinct Bulgarian forms — even when lang="bg" is correctly set in HTML.

Given that Open Sans is used on 26+ million websites worldwide, this is arguably the most impactful single change that could be made for Bulgarian language representation on the web.

Background

The Bulgarian and Russian variants of the Cyrillic script have significant visual differences, particularly in lowercase letters. Bulgarian Cyrillic letterforms are rounder and more calligraphic, with distinct ascenders and descenders that improve legibility and reflect the script's historical origins — Bulgaria being the birthplace of the Cyrillic alphabet in the 9th century.

The differences are not cosmetic — they are comparable to the distinction between Latin a (single-story) and ɑ (double-story). Using Russian-style forms for Bulgarian text is akin to rendering English with Fraktur letterforms: technically readable, but culturally and typographically wrong.

Key lowercase glyphs that differ between Russian and Bulgarian Cyrillic in sans-serif typefaces:

Glyph Unicode Russian form Bulgarian form
в U+0432 в (like "b") more open, calligraphic
г U+0433 г (like "Γ") г (like "s"-shaped)
д U+0434 д (like "A" base) д (with descender)
ж U+0436 ж more calligraphic
з U+0437 з з (with different proportions)
и U+0438 и (like "N" reversed) и (like Latin "u" mirrored)
й U+0439 й й (follows и form + breve)
к U+043A к к (calligraphic)
л U+043B л (like "Λ") л (with serif/foot)
н U+043D н more open form
п U+043F п (like "n" mirror) п (like Latin "n")
т U+0442 т (like "m" mirror) т (like Latin "m")
ц U+0446 ц ц (different tail)
ч U+0447 ч ч (different bowl)
ш U+0448 ш ш (different proportions)
щ U+0449 щ щ (different proportions + tail)
ъ U+044A ъ ъ (with ascender)
ь U+044C ь ь (different)
ю U+044E ю ю (different connection)

Additionally, several uppercase glyphs differ:

  • Д (U+0414) — optional, but preferred
  • Ѝ (U+040D) — required for Bulgarian language (capital И with grave)
  • Л (U+041B) — different structural form
  • Ф (U+0424) — optional

Technical Implementation

The OpenType locl feature is the standard mechanism for this. The implementation would involve:

1. Design alternate glyphs

Create .loclBGR suffixed alternates for the glyphs listed above, matching the weight/style across all masters in the variable font source.

2. Add OpenType feature code

feature locl {
    script cyrl;
    language BGR exclude_dflt;
    sub [uni0432 uni0433 uni0434 uni0436 uni0437 uni0438 uni0439 uni045D
         uni043A uni043B uni043D uni043F uni0442 uni0447 uni0446 uni0448
         uni0449 uni044C uni044A uni044E]
    by  [uni0432.loclBGR uni0433.loclBGR uni0434.loclBGR uni0436.loclBGR
         uni0437.loclBGR uni0438.loclBGR uni0439.loclBGR uni045D.loclBGR
         uni043A.loclBGR uni043B.loclBGR uni043D.loclBGR uni043F.loclBGR
         uni0442.loclBGR uni0447.loclBGR uni0446.loclBGR uni0448.loclBGR
         uni0449.loclBGR uni044C.loclBGR uni044A.loclBGR uni044E.loclBGR];
} locl;

3. Optionally expose via Stylistic Set

Adding the same alternates as a Stylistic Set (e.g., ss04) gives non-Bulgarian designers access to the forms without needing to change spell-check language — a best practice recommended by type designers working in this space.

Relevant Context

Open Sans is derived from Noto Sans

Per this repo's README, Open Sans styles are now updated from Noto Sans sources. The Noto project has had an open issue about Bulgarian Cyrillic since 2014. If Noto Sans gains locl BGR support, the path to Open Sans inheriting it would be straightforward.

Community workarounds already exist

The Bulgarian community has had to create workarounds due to this gap:

  • npoekmu.me created "Open Sans BG" — a fork with Bulgarian letterforms, distributed as a WordPress plugin. It covers Regular, Bold, and Italic only.
  • Stefan Peev / localfonts.eu maintains an extensive catalogue of fonts with Bulgarian Cyrillic support and documents the locl implementation process.
  • The Libra Sans project took a similar approach for Liberation Sans (another Matteson-derived font), adding multilingual Cyrillic support via OpenType local features.

The same issue affects other Google Fonts

Institutional momentum in Bulgaria

  • Sofia Sans (by Lettersoup, on Google Fonts) was designed with Bulgarian Cyrillic as the default and is now the official typeface of Sofia Municipality, Bulgarian State Railways, and the Vision for Sofia initiative.
  • The Bulgarian "Site of the Year" competition awards bonus points for proper Bulgarian Cyrillic usage (cyrillic.bgweb.bg).
  • The initiative is supported by FAPW (Foundation for Active Production on the Web).

Comprehensive technical guide available

Botio Nikoltchev of Lettersoup has published a detailed technical guide covering exactly which glyphs need alternates, how to implement them in Glyphs App / FontLab, and the OpenType feature code. Lettersoup also created the Monotype standard for Bulgarian Cyrillic glyphs and has deep expertise in this area.

Impact

  • ~7 million native Bulgarian speakers see incorrect letterforms on the majority of the web
  • Bulgaria is an EU member state — proper script support matters for digital inclusion
  • Open Sans's Apache 2.0 license enables the community to fork (and they have), but upstreaming the fix would benefit all 26M+ sites at once
  • Browsers already support locl features triggered by lang="bg" — the infrastructure is ready, only the font glyphs are missing

Offer to Help

I'm happy to help coordinate this effort — whether that's connecting with Bulgarian type designers who have expertise in this area, testing implementations, or contributing to documentation. The Bulgarian type design community (Lettersoup, localfonts.eu, Fontfabric, npoekmu.me) has been working on this problem for years and would likely welcome the opportunity to contribute upstream.

References

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions