Internationalization (i18n)

Multi-language sites with gettext PO/MO, RTL support, and translation workflows

2 min read 343 words
Edit this page

Was this page helpful?

Bengal supports multi-language sites with directory-based content, gettext PO/MO translation files, plural-aware translations viant(), and full RTL (right-to-left) layout support for Arabic, Hebrew, and other bidirectional languages.

Quick Start

  1. Configure languages inbengal.toml:
TOML
[i18n]
default_language = "en"
strategy = "prefix"
content_structure = "dir"
languages = [
    { code = "en", name = "English", weight = 1 },
    { code = "es", name = "Español", weight = 2 },
    { code = "ar", name = "العربية", weight = 3, rtl = true },
]
  1. Create content per locale:
content/
├── en/
│   ├── _index.md
│   └── about.md
├── es/
│   ├── _index.md
│   └── about.md
└── ar/
    ├── _index.md
    └── about.md
  1. Add PO translation files for UI strings:
i18n/
├── en/LC_MESSAGES/messages.po
├── es/LC_MESSAGES/messages.po
└── ar/LC_MESSAGES/messages.po
  1. Uset()in templates:
HTML
<nav>
  <a href="/">{{ t("Home") }}</a>
  <a href="/about/">{{ t("About") }}</a>
</nav>
  1. Compile and build:
BASH
bengal i18n compile
bengal build

Translation Workflow

Step Command Description
Extract bengal i18n extract Scan templates fort() calls, generate .pot
Translate Edit.pofiles Add translations with a PO editor (e.g. Poedit)
Compile bengal i18n compile Compile.po.mofor faster loading
Status bengal i18n status Check translation coverage per locale
Build bengal build Generate site

Key Concepts

  • Content structure:dir (content/en/, content/es/) or file(about.en.md, about.es.md)
  • URL strategy:prefix (/en/, /es/) or subdomain(en.example.com)
  • Fallback: When a key is missing, Bengal falls back to the default language
  • RTL: Arabic and Hebrew getdir="rtl" on <html>automatically

Guides

In This Section

i18n Quickstart Set up a bilingual site with gettext PO/MO in 5 minutes