
Python i18n: kompletny przewodnik po lokalizacji
Skonfiguruj python-i18n z plikami tłumaczeń JSON lub YAML, obsłuż symbole zastępcze i liczbę mnogą, a następnie zautomatyzuj tłumaczenia za pomocą AI.
Instalacja python-i18n
python-i18n to lekka biblioteka do internacjonalizacji Pythona. Obsługuje pliki tłumaczeń JSON i YAML, zagnieżdżone klucze, interpolację symboli zastępczych oraz liczbę mnogą bez dodatkowej konfiguracji.
pip install python-i18n# To use YAML translation files instead of JSON:
pip install python-i18n[YAML]Konfigurowanie tłumaczeń
Ustaw format pliku, dodaj ścieżki do plików tłumaczeń oraz skonfiguruj domyślny i rezerwowy język. Zaimportuj tę konfigurację w punkcie wejścia aplikacji przed pierwszym wywołaniem funkcji tłumaczącej.
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)Tworzenie plików tłumaczeń
Utwórz po jednym pliku dla każdego języka w formacie JSON lub YAML. Użyj zagnieżdżonych kluczy, aby uporządkować teksty według funkcji lub strony. Zachowaj język źródłowy, zwykle angielski, jako jedno źródło referencyjne.
// 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"
}
}Używanie tłumaczeń w kodzie
Wywołaj i18n.t() ze ścieżką klucza rozdzieloną kropkami, aby wyszukać przetłumaczony tekst. Dla pojedynczego wywołania można nadpisać język bez zmiany ustawienia globalnego.
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"Symbole zastępcze i liczba mnoga
python-i18n obsługuje interpolację symboli zastępczych za pomocą składni %{name} oraz podstawową liczbę mnogą przez podklucze 'zero', 'one' i 'many'. Dla obu funkcji przekaż argumenty nazwane do 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"Zmiana języka podczas działania
Zmień aktywny język globalnie przez i18n.set('locale', code) lub nadpisz go dla pojedynczego wywołania argumentem locale. W aplikacjach internetowych wykryj preferowany język użytkownika z żądania i ustaw go przed renderowaniem.
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")Inteligentny łańcuch rezerwowy z python-i18n-locale-chain
Domyślnie python-i18n obsługuje tylko jeden język rezerwowy. Gdy brakuje tłumaczeń pt-BR, biblioteka od razu przechodzi do angielskiego i ignoruje poprawne tłumaczenia pt-PT. python-i18n-locale-chain rozwiązuje ten problem za pomocą konfigurowalnych łańcuchów dla 75 wariantów regionalnych.
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()Automatyzacja tłumaczeń
Po ukończeniu konfiguracji i18n przetłumacz pliki językowe za pomocą AI. Poproś asystenta AI w środowisku programistycznym o przetłumaczenie pliku źródłowego lub użyj CLI i18n Agent w 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,esAutomatyczna kontrola jakości tłumaczeń
Częste pułapki
Zamiast tłumaczeń zwracane są surowe klucze
Pliki YAML nie są wczytywane
Wyszukiwanie zagnieżdżonych kluczy nie działa
Zmiany języka przenikają między żądaniami
Zalecana struktura plików
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
└── ...Przetłumacz również:
Wypróbuj i18n Agent
Upuść tutaj plik tłumaczenia
JSON, YAML, PO, XML, CSV, Markdown, Properties
lub kliknij, aby go wybrać
Języki docelowe
Łańcuch rezerwowy z python-i18n-locale-chain
Gdy brakuje klucza tłumaczenia w regionalnych ustawieniach takich jak es-419, python-i18n od razu przechodzi do języka domyślnego zamiast najpierw sprawdzić nadrzędny język 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 chainZobacz przewodnik po mechanizmach locale fallback, aby poznać pełną listę obsługiwanych frameworków i 75 wbudowanych łańcuchów. Learn more →