
Python i18n: ghidul complet pentru localizare
Configurați python-i18n cu fișiere de traducere JSON sau YAML, gestionați substituenții și formele de plural, apoi automatizați traducerile cu IA.
Instalați python-i18n
python-i18n este o bibliotecă simplă de internaționalizare pentru Python. Acceptă fișiere de traducere JSON și YAML, chei imbricate, interpolarea substituenților și pluralizarea fără configurări suplimentare.
pip install python-i18n# To use YAML translation files instead of JSON:
pip install python-i18n[YAML]Configurați traducerile
Setați formatul fișierelor, adăugați căile către fișierele de traducere și configurați setarea regională implicită și pe cea de rezervă. Importați această configurație în punctul de intrare al aplicației înainte de orice apel de traducere.
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)Creați fișierele de traducere
Creați câte un fișier pentru fiecare limbă, în format JSON sau YAML. Utilizați chei imbricate pentru a organiza șirurile după funcționalitate sau pagină. Păstrați limba-sursă, de obicei engleza, drept unica sursă de referință.
// 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"
}
}Utilizați traducerile în cod
Apelați i18n.t() cu o cale de chei separată prin puncte pentru a căuta șirurile traduse. Puteți înlocui setarea regională pentru fiecare apel fără a modifica setarea globală.
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"Substituenți și pluralizare
python-i18n acceptă interpolarea substituenților cu sintaxa %{name} și pluralizarea de bază prin subcheile 'zero', 'one' și 'many'. Transmiteți argumente cu cuvinte-cheie către i18n.t() pentru ambele funcționalități.
# 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"Schimbarea setării regionale în timpul execuției
Schimbați global setarea regională activă cu i18n.set('locale', code) sau înlocuiți-o pentru fiecare apel prin argumentul cuvânt-cheie locale. În platformele web, detectați limba preferată a utilizatorului din solicitare și setați setarea regională înainte de redare.
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")Mecanism inteligent de rezervă pentru setările regionale cu python-i18n-locale-chain
În mod implicit, python-i18n acceptă o singură setare regională de rezervă. Atunci când un utilizator pt-BR nu are traduceri pt-BR, biblioteca revine direct la engleză, ignorând traducerile pt-PT perfect utilizabile. python-i18n-locale-chain remediază problema cu lanțuri de rezervă configurabile, care acoperă 75 de variante regionale.
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()Automatizați traducerile
După finalizarea configurării i18n, traduceți fișierele de localizare cu ajutorul IA. În IDE, solicitați asistentului IA să traducă fișierul-sursă sau utilizați CLI-ul i18n Agent în fluxul CI/CD.
# 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,esAutomatizați controlul calității traducerilor
Probleme frecvente
Traducerile returnează cheile brute
Fișierele YAML nu se încarcă
Căutările cheilor imbricate eșuează
Modificările setării regionale se propagă între solicitări
Structura recomandată a fișierelor
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
└── ...Încercați acum i18n Agent
Plasați aici fișierul de traducere
JSON, YAML, PO, XML, CSV, Markdown, Properties
sau faceți clic pentru a-l selecta
Limbi țintă
Rezerva pentru setările regionale cu python-i18n-locale-chain
Atunci când lipsește o cheie de traducere dintr-o setare regională precum es-419, python-i18n revine direct la setarea regională implicită în loc să verifice mai întâi setarea regională părinte es.
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 chainConsultați Ghidul nostru privind mecanismele de rezervă pentru setările regionale, care conține lista completă a platformelor acceptate și cele 75 de lanțuri integrate. Learn more →