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
- Configure languages in
bengal.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 },
]
- Create content per locale:
content/
├── en/
│ ├── _index.md
│ └── about.md
├── es/
│ ├── _index.md
│ └── about.md
└── ar/
├── _index.md
└── about.md
- Add PO translation files for UI strings:
i18n/
├── en/LC_MESSAGES/messages.po
├── es/LC_MESSAGES/messages.po
└── ar/LC_MESSAGES/messages.po
- Use
t()in templates:
html
<nav>
<a href="/">{{ t("Home") }}</a>
<a href="/about/">{{ t("About") }}</a>
</nav>
- Compile and build:
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/) orfile(about.en.md, about.es.md) - URL strategy:
prefix(/en/, /es/) orsubdomain(en.example.com) - Fallback: When a key is missing, Bengal falls back to the default language
- RTL: Arabic and Hebrew get
dir="rtl"on<html>automatically
Guides
In This Section
i18n Quickstart
Set up a bilingual site with gettext PO/MO in 5 minutes
RTL Layout Support
CSS authoring for Arabic, Hebrew, and bidirectional sites
Translator Contributor Guide
How to contribute translations and PO file conventions