Skip to main content

Python i18n: kompletan vodič za lokalizaciju

Podesite python-i18n sa JSON ili YAML datotekama prevoda, obradite čuvare mesta i množine, a zatim automatizujte prevode pomoću AI tehnologije.

1

Instalirajte python-i18n

python-i18n je lagana biblioteka za Python internacionalizaciju. Odmah podržava JSON i YAML datoteke prevoda, ugnežđene ključeve, interpolaciju čuvara mesta i množinu.

Terminal
pip install python-i18n
python-i18n podrazumevano podržava JSON. Za YAML datoteke prevoda instalirajte neobaveznu YAML zavisnost pomoću pip install python-i18n[YAML], koja dodaje PyYAML.
Terminal
# To use YAML translation files instead of JSON:
pip install python-i18n[YAML]
2

Podesite prevode

Postavite format datoteke, dodajte putanje datoteka prevoda i podesite podrazumevani i rezervni lokal. Uvezite ovu konfiguraciju na ulaznoj tački aplikacije pre bilo kog poziva za prevođenje.

i18n_config.py
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)
load_path mora da pokazuje na direktorijum koji sadrži datoteke prevoda, a ne na određenu datoteku. Ako prevodi vraćaju neobrađene ključeve, proverite da li je load_path ispravan i da li imena datoteka odgovaraju kodovima lokala (npr. en.json, de.json).
3

Napravite datoteke prevoda

Napravite po jednu datoteku za svaki jezik u JSON ili YAML formatu. Koristite ugnežđene ključeve da organizujete tekstove po funkcionalnosti ili stranici. Neka izvorni jezik (obično engleski) bude jedini izvor istine.

translations/en.json
// 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"
  }
}
Imenujte ključeve prema onome što opisuju, a ne mestu na kojem se pojavljuju: 'cart.item_count' je bolje od 'homepage_cart_label'. Ključevi treba da prežive redizajn korisničkog interfejsa.
4

Koristite prevode u kodu

Pozovite i18n.t() sa putanjom ključa razdvojenom tačkama da pronađete prevedene tekstove. Možete da promenite lokal za pojedinačni poziv bez promene globalne postavke.

app.py
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"
Ugnežđeni ključevi koriste tačkastu notaciju: i18n.t('nav.home'). Ako JSON ključevi sadrže doslovne tačke, python-i18n će ih tumačiti kao razdelnike ugnežđivanja. Izbegavajte tačke u imenima ključeva.
5

Čuvari mesta i množina

python-i18n podržava interpolaciju čuvara mesta sintaksom %{name} i osnovnu množinu pomoću potključeva 'zero', 'one' i 'many'. Prosledite imenovane argumente funkciji i18n.t() za obe funkcije.

Placeholders
# 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"
Pluralization
# 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"
Množina u python-i18n sistemu koristi tri kategorije: zero, one i many. To pokriva engleski i mnoge jezike, ali ne podržava sva CLDR pravila množine (few, two, other). Za jezike poput arapskog, ruskog ili poljskog sa složenim oblicima množine možda ćete morati ručno da obradite rubne slučajeve ili koristite napredniju biblioteku.
6

Promena lokala tokom izvršavanja

Globalno promenite aktivni lokal pomoću i18n.set('locale', code) ili ga promenite za pojedinačni poziv imenovanim argumentom locale. U veb-radnim okvirima otkrijte željeni jezik korisnika iz zahteva i postavite lokal pre prikazivanja.

Locale switching
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!"
app.py
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")
i18n.set('locale', ...) globalno menja lokal. Na višenitnim veb-serverima (gunicorn sa worker procesima, Django) to može da izazove uslove trke, pri kojima jedan zahtev menja lokal dok se drugi prikazuje. Koristite promenu lokala za pojedinačni poziv ili skladište lokalno za nit da to izbegnete.
7

Pametni rezervni lokali uz python-i18n-locale-chain

python-i18n podrazumevano podržava samo jedan rezervni lokal. Kada korisnik lokala pt-BR nema prevode za pt-BR, biblioteka odmah prelazi na englesku rezervu i zanemaruje sasvim dobre prevode za pt-PT. python-i18n-locale-chain to ispravlja podesivim lancima rezerve koji obuhvataju 75 varijanti lokala.

python-i18n-locale-chain je besplatan paket otvorenog koda. Jedan poziv funkcije aktivira 75 ugrađenih lanaca rezerve za regionalne varijante kineskog, portugalskog, španskog, francuskog, nemačkog, italijanskog, holandskog, engleskog, arapskog, norveškog i malajskog.
Terminal
pip install python-i18n-locale-chain
i18n_config.py
from 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")
Advanced configuration
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()
Najvažniji lanci za testiranje: pt-BR -> pt-PT -> pt -> en (portugalski), es-MX -> es-419 -> es -> en (španski), zh-Hant-HK -> zh-Hant-TW -> zh-Hant -> en (tradicionalni kineski). Oni obuhvataju najčešće scenarije regionalne rezerve.
8

Automatizujte prevode

Kada završite i18n podešavanje, prevedite datoteke lokala pomoću AI. U IDE okruženju zatražite od AI pomoćnika da prevede izvornu datoteku ili koristite i18n Agent CLI u CI/CD pipeline procesu.

Terminal
# 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
Prevodite postepeno. Kada dodate nove ključeve u izvornu datoteku, prevedite samo razliku umesto ponovnog generisanja svih datoteka. Time se čuvaju prevodi koje su ljudi pregledali.

Automatizujte kvalitet prevoda

Pomoću i18n-validate alatke otkrijte nedostajuće ključeve i neispravne čuvare mesta pre isporuke. Testirajte korisnički interfejs pseudoprevodima pomoću i18n-pseudo alatke pre nego što stignu pravi prevodi.

Uobičajene zamke

Prevodi vraćaju neobrađene ključeve

Uzroci: load_path nije postavljen ili pokazuje na pogrešan direktorijum, file_format ne odgovara nastavcima datoteka ili imena datoteka ne odgovaraju kodovima lokala. Proverite da li i18n.load_path sadrži ispravan direktorijum i da li su datoteke ispravno imenovane (npr. en.json, de.json).

YAML datoteke se ne učitavaju

python-i18n zahteva PyYAML za YAML podršku, ali se on podrazumevano ne instalira. Instalirajte ga pomoću pip install python-i18n[YAML]. Bez njega se YAML datoteke neprimetno zanemaruju, a prevodi vraćaju čuvare mesta za nedostajuće ključeve.

Pretraga ugnežđenih ključeva ne uspeva

python-i18n koristi tačkastu notaciju za ugnežđene ključeve: i18n.t('nav.home'). Ako JSON koristi ravne ključeve sa tačkama u imenu (npr. 'nav.home' kao jedan ključ), biblioteka ih tumači kao ugnežđenu pretragu i ne uspeva. Umesto toga koristite stvarne ugnežđene JSON objekte.

Promene lokala prelaze između zahteva

i18n.set('locale', ...) je globalna operacija. Na višenitnim serverima jedan zahtev može da promeni lokal dok se drugi prikazuje. Koristite imenovani argument locale= u pojedinačnim pozivima i18n.t() ili postavite lokal u skladištu lokalnom za nit pomoću posredničkog softvera.

Preporučena struktura datoteka

Project Structure
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
└── ...

Isprobajte i18n Agent sada

Pustite datoteku za prevođenje ovde

JSON, YAML, PO, XML, CSV, Markdown, Properties

ili kliknite za izbor

Ciljni jezici

Registracija nije potrebnaTrenutna procena

Rezervni lokali uz python-i18n-locale-chain

Kada ključ prevoda nedostaje u regionalnom lokalu kao što je es-419, python-i18n odmah prelazi na podrazumevani lokal umesto da prvo proveri nadređeni lokal es.

Terminal
pip install python-i18n-locale-chain
Configuration
from 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

Pogledajte naš vodič za rezervne lokale za celu listu podržanih sistema i 75 ugrađenih lanaca. Learn more →

Česta pitanja