Building a product for a global audience means your font needs to render correctly across scripts. Most free UI fonts cover Latin, Cyrillic, and Greek. Far fewer handle CJK (Chinese, Japanese, Korean), Arabic, Thai, or Devanagari. Here’s what actually works for multilingual products.
Coverage Comparison
| Font | Latin | Cyrillic | Greek | Arabic | CJK | Thai | Devanagari | Variable |
|---|---|---|---|---|---|---|---|---|
| Noto Sans | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
| Inter | Yes | Yes | Yes | No | No | No | No | Yes |
| IBM Plex Sans | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No |
| Source Sans 3 | Yes | Yes | Yes | No | No | No | No | Yes |
| Roboto | Yes | Yes | Yes | No | No | No | No | Yes |
| Open Sans | Yes | Yes | Yes | No | No | No | No | Yes |
The Two Real Options
For truly global products, there are only two comprehensive free choices:
Noto Sans — The Universal Option
Noto Sans covers over 150 scripts. Google commissioned the Noto project specifically to eliminate tofu (the empty rectangles that appear when a font lacks a glyph). If your product must display any script a user might encounter, Noto is the answer.
The tradeoff: loading all Noto scripts is enormous. In practice, you subset to the scripts your product needs. Google Fonts handles this automatically with &subset= parameters, or you can use unicode-range in CSS to load scripts on demand.
IBM Plex Sans — The Enterprise Option
IBM Plex Sans covers Latin, Cyrillic, Greek, Arabic, Devanagari, Hebrew, Thai, and CJK (via IBM Plex Sans JP/KR/TC). IBM designed it for their global operations, and the script-specific variants are tuned to work together visually. It lacks variable font support, which limits its flexibility for responsive typography.
Latin-First Products
If your product primarily serves Latin-script languages with some Cyrillic and Greek coverage, you have more options:
Inter covers Latin Extended, Cyrillic, and Greek with variable font support. For European products, this is sufficient. Source Sans 3 and Roboto offer comparable coverage.
Fallback Strategy
No single font file covers everything. A practical approach:
font-family: 'Inter', 'Noto Sans Arabic', 'Noto Sans JP', system-ui, sans-serif;
Use your primary UI font for Latin text, then Noto variants for specific scripts. This gives you design control over Latin typography while ensuring non-Latin scripts render correctly.
What to Choose
For global SaaS products: Start with Noto Sans and subset to the scripts you support. Accept the design tradeoff — Noto is functional rather than distinctive.
For enterprise products with CJK requirements: IBM Plex Sans provides more visual personality than Noto with good CJK coverage via script-specific companions.
For European or Americas-focused products: Use Inter or Source Sans 3 for Latin/Cyrillic/Greek, with Noto as a fallback for edge cases.
FAQ
How do I subset Noto Sans for my project?
Google Fonts subsets automatically. For self-hosting, use pyftsubset or glyphhanger to extract only the Unicode ranges your product needs.
Do CJK fonts affect page load significantly?
Yes. CJK fonts contain thousands of glyphs and are substantially larger than Latin-only fonts. Use unicode-range to load them only when needed.
Can I mix fonts from different families for different scripts? Yes, and this is the recommended approach. Match x-height and weight between your Latin and non-Latin fonts for visual consistency.