
Python i18n: de complete lokalisatiehandleiding
Stel python-i18n in met JSON- of YAML-vertaalbestanden, verwerk placeholders en meervoudsvormen en automatiseer daarna vertalingen met AI.
python-i18n installeren
python-i18n is een compacte internationaliseringsbibliotheek voor Python. De bibliotheek ondersteunt standaard JSON- en YAML-vertaalbestanden, geneste sleutels, interpolatie van placeholders en meervoudsvormen.
pip install python-i18n# To use YAML translation files instead of JSON:
pip install python-i18n[YAML]Vertalingen configureren
Stel de bestandsindeling in, voeg paden naar vertaalbestanden toe en configureer je standaard- en fallbacklocales. Importeer deze configuratie bij het toegangspunt van je applicatie voordat je vertaalfuncties aanroept.
import i18n
# Set the file format (json or yaml)
i18n.set("file_format", "json")
# Add the directory containing your translation files
i18n.load_path.append("translations/")
# Set the default locale
i18n.set("locale", "en")
# Set the fallback locale (used when a key is missing)
i18n.set("fallback", "en")
# Enable/disable error on missing translations
i18n.set("error_on_missing_translation", False)Vertaalbestanden maken
Maak voor elke taal één bestand in JSON- of YAML-indeling. Gebruik geneste sleutels om teksten per functie of pagina te ordenen. Houd je brontaal, meestal Engels, aan als enige gezaghebbende bron.
// translations/en.json
{
"greeting": "Hello!",
"welcome": "Welcome to our application",
"nav": {
"home": "Home",
"about": "About",
"settings": "Settings"
},
"cart": {
"item_count": "%{count} item(s) in your cart"
}
}
// translations/de.json
{
"greeting": "Hallo!",
"welcome": "Willkommen in unserer Anwendung",
"nav": {
"home": "Startseite",
"about": "Über uns",
"settings": "Einstellungen"
},
"cart": {
"item_count": "%{count} Artikel in Ihrem Warenkorb"
}
}Vertalingen in je code gebruiken
Roep i18n.t() aan met een door punten gescheiden sleutelpad om een vertaalde tekst op te zoeken. Je kunt de locale per aanroep overschrijven zonder de algemene instelling te wijzigen.
import i18n
# Simple translation
print(i18n.t("greeting")) # "Hello!"
print(i18n.t("nav.home")) # "Home"
print(i18n.t("nav.about")) # "About"
# Translation with a specific locale
print(i18n.t("greeting", locale="de")) # "Hallo!"
print(i18n.t("nav.home", locale="ja")) # "ホーム"
# Missing key returns a placeholder
print(i18n.t("missing.key")) # "Missing.Key"Placeholders en meervoudsvormen
python-i18n ondersteunt interpolatie van placeholders met de syntaxis %{name} en eenvoudige meervoudsvormen met de subsleutels 'zero', 'one' en 'many'. Geef voor beide functies benoemde argumenten door aan i18n.t().
# translations/en.json
# {
# "welcome_user": "Welcome, %{name}!",
# "order_status": "Order #%{order_id}: %{status}",
# "file_size": "File size: %{size} %{unit}"
# }
import i18n
# Single placeholder
print(i18n.t("welcome_user", name="Alice"))
# "Welcome, Alice!"
# Multiple placeholders
print(i18n.t("order_status", order_id=12345, status="shipped"))
# "Order #12345: shipped"
# Reusable with different values
print(i18n.t("file_size", size=2.5, unit="MB"))
# "File size: 2.5 MB"
print(i18n.t("file_size", size=800, unit="KB"))
# "File size: 800 KB"# translations/en.json
# {
# "inbox": {
# "zero": "No messages",
# "one": "1 message",
# "many": "%{count} messages"
# }
# }
import i18n
print(i18n.t("inbox", count=0)) # "No messages"
print(i18n.t("inbox", count=1)) # "1 message"
print(i18n.t("inbox", count=42)) # "42 messages"Tijdens runtime van locale wisselen
Wissel de actieve locale voor de hele applicatie met i18n.set('locale', code) of overschrijf deze per aanroep met het argument locale. Detecteer in webframeworks de voorkeurstaal van de gebruiker via het verzoek en stel de locale in voordat je de pagina rendert.
import i18n
# Set locale globally
i18n.set("locale", "de")
print(i18n.t("greeting")) # "Hallo!"
# Switch to Japanese
i18n.set("locale", "ja")
print(i18n.t("greeting")) # "こんにちは!"
# Override per-call without changing global locale
i18n.set("locale", "en")
print(i18n.t("greeting")) # "Hello!"
print(i18n.t("greeting", locale="de")) # "Hallo!"from flask import Flask, request, g
import i18n
app = Flask(__name__)
i18n.set("file_format", "json")
i18n.load_path.append("translations/")
SUPPORTED_LOCALES = ["en", "de", "ja", "es", "fr"]
@app.before_request
def set_locale():
# Check URL parameter, cookie, then Accept-Language header
locale = request.args.get("lang")
if not locale:
locale = request.cookies.get("locale")
if not locale:
locale = request.accept_languages.best_match(SUPPORTED_LOCALES)
g.locale = locale or "en"
i18n.set("locale", g.locale)
@app.route("/")
def index():
return i18n.t("welcome")Slimme locale-fallback met python-i18n-locale-chain
Standaard ondersteunt python-i18n maar één fallbacklocale. Wanneer een pt-BR-gebruiker geen pt-BR-vertalingen heeft, springt de bibliotheek meteen naar de Engelse fallback en worden prima pt-PT-vertalingen genegeerd. python-i18n-locale-chain lost dit op met configureerbare fallbackketens voor 75 localevarianten.
pip install python-i18n-locale-chainfrom locale_chain import configure
import i18n
i18n.set("file_format", "json")
i18n.load_path.append("translations/")
# Activate smart fallback chains (75 built-in chains)
configure()
# Now pt-BR falls back to pt-PT -> pt -> en (instead of just en)
result = i18n.t("greeting", locale="pt-BR")
# es-MX falls back to es-419 -> es -> en
result = i18n.t("greeting", locale="es-MX")
# zh-Hant-HK falls back to zh-Hant-TW -> zh-Hant -> en
result = i18n.t("greeting", locale="zh-Hant-HK")from locale_chain import configure, reset
# Override specific chains
configure(overrides={
"pt-BR": ["pt"], # Skip pt-PT, go straight to pt
"ja-JP": ["ja"], # Add a new chain
})
# Full custom map (no defaults)
configure(
fallbacks={"pt-BR": ["pt-PT"]},
merge_defaults=False
)
# Use German as final fallback instead of English
configure(default_locale="de")
# Restore original i18n.t() behaviour
reset()Vertalingen automatiseren
Wanneer je i18n-configuratie gereed is, vertaal je localebestanden met AI. Vraag je AI-assistent in je ontwikkelomgeving om het bronbestand te vertalen of gebruik de CLI van i18n Agent in je CI/CD-pipeline.
# In your IDE, ask your AI assistant:
> Translate translations/en.json to German, Japanese, and Spanish
translations/de.json created (1.2s)
translations/ja.json created (1.5s)
translations/es.json created (1.1s)
# Or use the CLI in CI/CD:
npx i18n-agent translate translations/en.json --lang de,ja,esVertaalkwaliteit automatisch bewaken
Veelvoorkomende valkuilen
Vertalingen leveren onbewerkte sleutels op
YAML-bestanden worden niet geladen
Opzoeken van geneste sleutels mislukt
Localewijzigingen lekken tussen verzoeken
Aanbevolen bestandsstructuur
my-python-app/
├── translations/
│ ├── en.json # Source language (JSON)
│ ├── de.json # German
│ ├── ja.json # Japanese
│ ├── es.json # Spanish
│ └── pt-BR.json # Brazilian Portuguese
├── app.py # Application entry point
├── i18n_config.py # i18n setup and configuration
├── requirements.txt # pip dependencies
└── pyproject.toml # Project metadata
# Or with YAML files:
my-python-app/
├── translations/
│ ├── en.yml
│ ├── de.yml
│ └── ja.yml
├── app.py
└── ...Probeer i18n Agent nu
Zet je vertaalbestand hier neer
JSON, YAML, PO, XML, CSV, Markdown, Properties
of klik om een bestand te selecteren
Doeltalen
Locale-fallback met python-i18n-locale-chain
Wanneer een vertaalsleutel ontbreekt in een regionale locale zoals es-419, springt python-i18n meteen naar de standaardlocale in plaats van eerst de bovenliggende locale es te controleren.
pip install python-i18n-locale-chainfrom i18n_locale_chain import configure_chain
configure_chain('{')
'es': ['en', 'ru'],
'pt-BR': ['pt', 'en'],
'zh-Hant-HK': ['zh-Hant', 'zh', 'en'],
'}')
# Usage: t('greeting', locale='es') — falls back through chainBekijk onze handleiding voor locale-fallback voor de volledige lijst met ondersteunde frameworks en 75 ingebouwde ketens. Learn more →