
i18n di Python: la guida completa alla localizzazione
Configuri python-i18n con file di traduzione JSON o YAML, gestisca segnaposto e plurali, quindi automatizzi le traduzioni con l'IA.
Installare python-i18n
python-i18n è una biblioteca di internazionalizzazione leggera per Python. Supporta file di traduzione JSON e YAML, chiavi annidate, interpolazione dei segnaposto e gestione dei plurali senza configurazione aggiuntiva.
pip install python-i18n# To use YAML translation files instead of JSON:
pip install python-i18n[YAML]Configurare le traduzioni
Imposti il formato dei file, aggiunga i percorsi dei file di traduzione e configuri le lingue predefinita e di fallback. Importi questa configurazione nel punto di ingresso dell'applicazione prima di qualsiasi chiamata di traduzione.
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)Creare i file di traduzione
Crei un file per ogni lingua in formato JSON o YAML. Usi chiavi annidate per organizzare le stringhe per funzionalità o pagina. Mantenga la lingua di origine, generalmente l'inglese, come unica fonte di riferimento.
// 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"
}
}Usare le traduzioni nel codice
Chiami i18n.t() con un percorso della chiave separato da punti per cercare le stringhe tradotte. Può sostituire la lingua per ogni chiamata senza cambiare l'impostazione globale.
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"Segnaposto e gestione dei plurali
python-i18n supporta l'interpolazione dei segnaposto con la sintassi %{name} e una gestione di base dei plurali tramite le sottochiavi 'zero', 'one' e 'many'. Passi argomenti con parola chiave a i18n.t() per entrambe le funzionalità.
# 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"Cambio di lingua durante l'esecuzione
Cambi la lingua attiva a livello globale con i18n.set('locale', code) oppure la sostituisca per singola chiamata con l'argomento con parola chiave locale. Nei framework web, rilevi dalla richiesta la lingua preferita dall'utente e la imposti prima del rendering.
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")Fallback intelligente con python-i18n-locale-chain
Per impostazione predefinita, python-i18n supporta una sola lingua di fallback. Quando un utente pt-BR non dispone di traduzioni pt-BR, la biblioteca passa direttamente al fallback inglese, ignorando traduzioni pt-PT perfettamente valide. python-i18n-locale-chain risolve il problema con catene di fallback configurabili che coprono 75 varianti linguistiche.
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()Automatizzare le traduzioni
Completata la configurazione i18n, tradurre i file con l'IA. Chiedere all'assistente nell'IDE o usare i18n Agent CLI nella pipeline 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,esAutomatizzare la qualità
Problemi comuni
Le traduzioni restituiscono chiavi non elaborate
I file YAML non vengono caricati
La ricerca delle chiavi annidate non riesce
I cambi di lingua interferiscono tra le richieste
Struttura dei file consigliata
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
└── ...Provi subito i18n Agent
Trascinare qui il file di traduzione
JSON, YAML, PO, XML, CSV, Markdown, Properties
oppure fare clic per selezionarlo
Lingue di destinazione
Fallback della lingua con python-i18n-locale-chain
Quando manca una chiave di traduzione in una lingua regionale come es-419, python-i18n passa direttamente alla lingua predefinita anziché controllare prima la lingua principale 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 chainConsultare la Guida al fallback delle lingue per l'elenco completo dei framework supportati e delle 75 catene integrate. Learn more →