
Python i18n: الدليل الكامل للتوطين
أعد إعداد python-i18n باستخدام ملفات ترجمة JSON أو YAML، وتعامل مع placeholders وصيغ الجمع، ثم أتمتِ الترجمات باستخدام AI.
تثبيت python-i18n
python-i18n هي مكتبة تدويل خفيفة الوزن لـ Python. تدعم ملفات ترجمة JSON وYAML، والمفاتيح المتداخلة، وإقحام الـ placeholders، وصيغ الجمع بشكل جاهز.
pip install python-i18n# To use YAML translation files instead of JSON:
pip install python-i18n[YAML]تهيئة الترجمات
حدِّد صيغة الملف، وأضِف مسارات ملفات الترجمة، واضبط locale الافتراضي وlocales التراجع. استورد هذه التهيئة في نقطة دخول تطبيقك قبل أي استدعاءات ترجمة.
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() باستخدام مسار مفتاح مفصول بنقاط للبحث عن السلاسل المترجمة. يمكنك تجاوز locale لكل استدعاء من دون تغيير الإعداد العام.
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"تبديل locale أثناء التشغيل
بدّل locale النشط على مستوى التطبيق باستخدام i18n.set('locale', code)، أو تجاوز ذلك لكل استدعاء باستخدام الوسيط locale. في أطر الويب، اكتشف اللغة المفضلة لدى المستخدم من الطلب واضبط 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 locale تراجعاً واحداً فقط. عندما لا تتوفر ترجمات pt-BR لمستخدم pt-BR، تقفز المكتبة مباشرةً إلى تراجع الإنجليزية، متجاهلةً ترجمات pt-PT المتاحة. يعالج python-i18n-locale-chain ذلك عبر سلاسل تراجع قابلة للتهيئة تغطي 75 متغيراً من locale.
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، ترجم ملفات locale باستخدام الذكاء الاصطناعي. في IDE، اطلب من مساعدك بالذكاء الاصطناعي ترجمة ملف المصدر، أو استخدم i18n Agent CLI ضمن مسار 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 لا يتم تحميلها
يفشل البحث عن المفاتيح المتداخلة
تسرب تغييرات locale بين الطلبات
بنية الملفات الموصى بها
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
أو انقر للاستعراض
اللغات المستهدفة
تراجع locale باستخدام python-i18n-locale-chain
عندما يكون مفتاح الترجمة مفقوداً في locale إقليمي مثل es-419، يقفز python-i18n مباشرةً إلى locale الافتراضي بدلاً من التحقق من locale الأب 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 chainاطّلع على دليل Locale Fallback لدينا للاطلاع على القائمة الكاملة للأطر المدعومة و75 سلسلة مدمجة. Learn more →