
Python i18n: пълно ръководство за локализация
Настройте python-i18n с JSON или YAML файлове с преводи, обработвайте заместители и множествено число, а след това автоматизирайте преводите с ИИ.
Инсталирайте python-i18n
python-i18n е олекотена библиотека за интернационализация на Python. Тя поддържа JSON и YAML файлове с преводи, вложени ключове, заместване на стойности и множествено число без допълнителна конфигурация.
pip install python-i18n# To use YAML translation files instead of JSON:
pip install python-i18n[YAML]Конфигурирайте преводите
Задайте файловия формат, добавете пътищата до файловете с преводи и конфигурирайте локала по подразбиране и резервния локал. Импортирайте тази конфигурация във входната точка на приложението, преди да извикате функция за превод.
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)Създайте файлове с преводи
Създайте по един файл за всеки език във формат JSON или YAML. Използвайте вложени ключове, за да организирате низовете по функционалност или страница. Поддържайте изходния език (обикновено английски) като единствен достоверен източник.
// 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"
}
}Използвайте преводите в кода
Извикайте i18n.t() с път до ключ, разделен с точки, за да намерите преведения низ. Можете да замените локала за отделно извикване, без да променяте глобалната настройка.
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"Заместители и множествено число
python-i18n поддържа заместване на стойности чрез синтаксиса %{name} и основни форми за множествено число чрез подключовете 'zero', 'one' и 'many'. Подайте именувани аргументи към 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"Смяна на локала по време на изпълнение
Сменете активния локал глобално чрез i18n.set('locale', code) или го заменете за отделно извикване чрез именувания аргумент locale. В уеб платформи определете предпочитания от потребителя език от заявката и задайте локала преди визуализиране.
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")Интелигентни резервни локали с python-i18n-locale-chain
По подразбиране python-i18n поддържа само един резервен локал. Когато за потребител с pt-BR няма преводи на pt-BR, библиотеката преминава направо към резервния английски, като пренебрегва наличните преводи на pt-PT. python-i18n-locale-chain решава проблема чрез конфигурируеми резервни вериги, които обхващат 75 варианта на локали.
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()Автоматизирайте преводите
След като настройката за i18n е готова, преведете файловете за локалите чрез ИИ. Във Вашата IDE поискайте от асистента си с ИИ да преведе изходния файл или използвайте CLI на i18n Agent в пайплайна за 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,esАвтоматизирайте контрола на качеството на превода
Често срещани затруднения
Преводите връщат необработени ключове
YAML файловете не се зареждат
Търсенето на вложени ключове е неуспешно
Промените на локала се пренасят между заявките
Препоръчителна файлова структура
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
└── ...Изпробвайте i18n Agent сега
Пуснете тук Вашия файл за превод
JSON, YAML, PO, XML, CSV, Markdown, Properties
или натиснете, за да изберете файл
Целеви езици
Резервни локали с python-i18n-locale-chain
Когато ключ за превод липсва в регионален локал като es-419, python-i18n преминава направо към локала по подразбиране, вместо първо да провери родителския локал 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'],
'}')
# Употреба: t('greeting', locale='es') — преминава по резервната веригаВижте нашето ръководство за резервна локализация за пълния списък с поддържани платформи и 75 вградени вериги. Learn more →