Belarusian Localization: i18n, Pluralization, and Fonts
You display your product catalog, but the user sees 1 товар instead of 1 тавар. Or the order date appears as 28 сакавіка. Such details kill trust in your resource. Belarusian website localization is not just about translating strings — it requires adapting numerals, currency, date formats, and fonts. Without correct pluralization and hreflang, you risk losing up to 30% of search traffic. Optimizing localization for Core Web Vitals can boost conversion by 15–20%.
How Pluralization Affects Perception
The Belarusian language has three plural forms (one/few/many) with special rules for numbers 11–19. A declension error — and the client sees "11 тавар" instead of "11 тавараў". We solve this on two levels: on the backend with a custom pluralBe function, on the frontend with Intl.PluralRules. Mozilla Developer Network documentation confirms full support for Belarusian.
Problems We Solve
- Pluralization: Belarusian has three forms (one/few/many) with exceptions for 11–19. Incorrect declension shows "11 тавар" instead of "11 тавараў".
- Currency formatting: BYN requires the Br separator and a space: 49,99 Br. Without
Intl.NumberFormat— manual handling risks typos. - Letter Ў: Not all fonts contain the glyph U+040E. Hieroglyphs instead of the letter — loss of trust.
- Apostrophe: In Belarusian, the apostrophe (ʼ) is a standalone character, not the ASCII apostrophe.
- hreflang: Without
alternateattributes, search engines don't understand language versions. - Cost of errors: Localization mistakes can cost thousands of rubles per month due to lost conversion.
Case: Integrating Pluralization in Laravel and React (from Our Practice)
In one of our projects (Laravel 11 + React 18), Laravel's default pluralization didn't handle the 11–19 exception. We wrote our own pluralBe function and implemented Intl.PluralRules on the frontend. Result: 100% correct forms for any number. We saved approximately 10% of the project budget on post-release fixes.
Basic Laravel Setup
// config/app.php 'locale' => 'be', 'fallback_locale' => 'ru', // resources/lang/be/messages.php return [ 'welcome' => 'Вітаем на нашым сайце', 'catalog' => 'Каталог', 'cart' => 'Кошык', 'checkout' => 'Афармленне заказу', 'search' => 'Пошук', 'add_to_cart' => 'У кошык', 'price' => 'Цана', 'in_stock' => 'Ёсць у наяўнасці', 'out_of_stock' => 'Няма ў наяўнасці', 'order_placed' => 'Заказ аформлены', ]; Pluralization on the Backend
function pluralBe(int $n, string $one, string $few, string $many): string { $abs = abs($n); $mod10 = $abs % 10; $mod100 = $abs % 100; // 11–19 → many if ($mod100 >= 11 && $mod100 <= 19) return "$n $many"; // 1 → one if ($mod10 === 1) return "$n $one"; // 2–4 → few if ($mod10 >= 2 && $mod10 <= 4) return "$n $few"; return "$n $many"; } Pluralization on the Frontend
// Intl.PluralRules — modern standard const rules = new Intl.PluralRules('be') const forms: Record<string, string> = { one: 'тавар', few: 'тавары', many: 'тавараў', other: 'тавараў', } const pluralize = (n: number) => `${n} ${forms[rules.select(n)]}` // Date and currency formatting const df = new Intl.DateTimeFormat('be-BY', { day: 'numeric', month: 'long', year: 'numeric', }) df.format(new Date()) // "28 сакавіка" const nf = new Intl.NumberFormat('be-BY', { style: 'currency', currency: 'BYN', }) nf.format(49.99) // "49,99 Br" const rtf = new Intl.RelativeTimeFormat('be', { numeric: 'auto' }) rtf.format(-1, 'day') // "учора" Why Intl API Is Better Than Custom Solutions
The Intl API eliminates manual exception handling and guarantees consistency with the OS regional settings. Compare: a custom function handles only three forms, while Intl.PluralRules follows all CLDR rules — including "other" for fractional numbers. Custom solutions can have a 30% error margin for complex numbers, directly affecting user trust.
| Criterion | Custom Function | Intl.PluralRules |
|---|---|---|
| 11–19 exceptions | Manual | Automatic |
| Fractional numbers | Not handled | Handled (other) |
| Runtime locale switching | No | Yes (locale change) |
| Performance | High | High (native code) |
Additional comparison: hreflang via plugins vs manual markup:
| Criterion | Plugin (Yoast) | Manual Markup |
|---|---|---|
| Flexibility | Limited | Full control |
| Performance | Depends on CMS | No overhead |
| Errors | Possible duplicates | Minimized |
Common Mistakes in Belarusian Localization
The most frequent errors: numbers 11–19 — the many form is missing, displaying "11 тавар" instead of "11 тавараў". The letter Ў (U+040E) missing in older versions of Arial, Times New Roman — substitution with "У" changes the meaning. The apostrophe confused with ASCII apostrophe, though in Belarusian orthography it is the symbol ʼ. hreflang often specified without region — should be be or be-BY. These mistakes lead to lost trust and lower rankings. Contact us to discuss your project details.
Our Process
- Analysis: audit of current stack and language files.
- Translation: prepare Belarusian strings with context consideration.
- Pluralization: implement
pluralBeandIntl.PluralRules. - Formats: configure dates, currency, relative time.
- Typography: check fonts, replace apostrophes.
- SEO: set up hreflang and open graph tags.
- Testing: verify all forms with mocks.
- Deploy: commit to repository, document.
What's Included (Deliverables)
- Translated UI strings (at least 200 phrases).
- Pluralization function for backend and frontend.
-
Intl.DateTimeFormatandIntl.NumberFormatsetup. - hreflang tags for all language versions.
- Test report with examples.
- Documentation on formats.
- 30-day support after deployment.
Estimated Timeline and Pricing
Basic localization — from 1 to 3 working days. Comprehensive (with CMS integration and SEO audit) — up to 7 days. Our service starts at $500 for basic setup, and we estimate savings of up to $200 per month on support costs due to reduced post-release fixes. Get a consultation on localization setup today. Our specialists with over 5 years of experience will audit your project and propose a solution. Order localization — we'll evaluate your project within 24 hours.
Detailed pluralization rules for Belarusian
Belarusian pluralization has three forms: one (1, 21, 31...), few (2-4, 22-24...), and many (0, 5-20, 25-30...). Exception: numbers 11-19 always take the many form. For example: 1 тавар, 2 тавары, 5 тавараў, 11 тавараў, 21 тавар.







