{name} v překladu je ztraceno, jak to zastavit před přechodem online
Pokud se v překladu ztratí {name}, dojde k chybám online. Pravidelný úsudek je nespolehlivý. Tento článek používá standardní knihovnu Python string.Formatter.parse ke strukturování ověřovacích zástupných symbolů s příklady správné a nesprávné syntézy, přímo spustitelné skripty a hranice ruční kontroly.
V přeložené kopii jsou proměnné jako {name} často překládány společně a stránka často nehlásí chybu, dokud není hodnota skutečně vyplněna. Pokud se při kontrole složených závorek před přechodem na internet spoléháte pouze na lidské oči nebo regulární výrazy, je snadné je přehlédnout. Tento článek je určen pro vývojáře a editory odpovědné za lokalizaci, šablony a kontroly doručení. Představuje, jak používat standardní knihovnu Pythonu string.Formatter.parse k provádění strukturovaného ověřování na zástupných symbolech, a vysvětluje, které situace stále vyžadují ruční kontrolu.
Po přečtení můžete získat ověřovací nápad, který lze spustit přímo: ověřte identitu pole, četnost výskytů a specifikace formátu při dodání překladu, místo abyste čekali, až bude problém objeven online. Příklady používají syntetické vzorky a kód byl zkontrolován v izolovaném prostředí, ale to nepředstavuje záruku všech skutečných souborů nebo výkonu produktu. Před zpracováním důležitých dokumentů si prosím uschovejte originály a zkontrolujte je podle níže uvedených hranic a položek přijetí.
Ztracené zástupné symboly po překladu? Závěr jednou větou
Nejprve použijte strukturovanou analýzu k extrahování polí ve formátovacím řetězci a poté je porovnejte jedno po druhém s poli zdrojové kopie; pokud jsou názvy polí, časy výskytu nebo specifikace formátu nekonzistentní, bude přímo odmítnuto a úprava pořadí slov bude ponechána na ruční kontrolu.
| vaší situaci | Doporučené postupy | důvod |
|---|---|---|
| Názvy proměnných v překladu jsou přeloženy | Před doručením obnovte název pole rozhraní | Název proměnné patří ke smlouvě rozhraní. Po změně bude hlášena chyba při vyplňování hodnoty na stránce. |
| V překladu jednou chybí pole se stejným názvem | Odmítněte článek a zkontrolujte, zda v něm nechybí překlad | Součástí smlouvy je i počet výskytů stejného pole |
| Upravena byla pouze poloha pole | Přijměte, zda je slovosled čtení přirozený | Změny v pořadí polí obvykle neovlivní výsledky vyplňování hodnot |
| Specifikace formátu, jako jsou desetinná místa, se změnily | Označení je nejednotné, potvrďte podle lokalizačního protokolu | Specifikace formátu jsou také chráněny a zda jsou povoleny změny, je třeba rozhodnout dohodou. |
Nejprve vyberte syntaxi formátu
Tento článek se zabývá pouze zástupnými symboly stylu Python str.format a nezabývá se řetězci šablon JavaScriptu, ICU MessageFormat nebo jinými systémy zástupných symbolů. Různé systémy mají velmi odlišná pravidla vnořování, escapování a pluralizace a jeden regulární výraz nemůže tvrdit, že je podporuje všechna. Příklad vyžaduje použití pojmenovaných polí a odmítá automaticky očíslovaná pole (jako je {}).
Kompletní popis syntaxe pole lze nalézt v Dokumentace řetězce Python a formátu.
Uniklé složené závorky nejsou proměnné
{{name}} představuje zobrazený text {name} a nemělo by se počítat jako pole. Ve specifikaci formátu mohou být také vnořená pole, například {value:{width}}. Níže uvedený kód čte specifikaci rekurzivně a udržuje počet opakovaných výskytů stejného pole.
from string import Formatter
from collections import Counter
def contract(text, depth=0):
if depth > 5:
raise ValueError("nested format budget")
result = Counter()
for literal, field, spec, conversion in Formatter().parse(text):
if field is None:
continue
if not field or field != field.strip():
raise ValueError("named field without surrounding whitespace required")
result[(field, conversion, spec)] += 1
if spec:
result.update(contract(spec, depth + 1))
return result
assert contract("Hi {name}, total {amount:.2f}") == contract("{name}:金额 {amount:.2f}")
assert contract("{{name}}") == Counter()
assert contract("{name} {name}") != contract("{name}")
assert contract("{value:{width}}")[("width", None, "")] == 1
assert contract("{amount:.2f}") != contract("{amount:.0f}")
for bad in ["Hi {name", "{ name}", "{}"]:
try:
contract(bad)
except ValueError:
pass
else:
raise AssertionError("invalid template accepted")
Tato smlouva je záměrně přísná
Specifikace formátu jsou zde také považovány za chráněný obsah, takže změna počtu desetinných míst bude označena. Některé úlohy lokalizace vyžadují změnu způsobu zobrazení čísel, v takovém případě byste pro to měli vytvořit samostatné pravidlo a ne rušit všechny kontroly zástupných symbolů. Limit hloubky vnoření v příkladu je demonstrační rozpočet a není požadavkem jazykové specifikace.
Následující tabulka uvádí několik běžných typů změn a jejich odpovídající metody zpracování:
| přeměna | Výsledek tohoto příkladu | revizní akce |
|---|---|---|
| Změňte pole | přijmout | Je slovosled čtení přirozený? |
| Stejné pole jednou chybí | Odmítněte smlouvu | Zkontrolujte, zda nejsou přečteny |
| Názvy proměnných jsou překládány | Odmítněte smlouvu | Obnovuje názvy polí rozhraní |
| Variace desetinné specifikace | Nekonzistentní označení | Potvrzeno podle dohod o lokalizaci |
📊 Srovnání jádra
| Typy změn | Zda projde kalibračním testem | Následné kroky |
|---|---|---|
| Přemístění hřiště | Průsmyk | Zkontrolujte, zda je slovosled při čtení přirozený |
| O jeden čas méně ve stejném oboru | Nepřicházím | Zkontrolujte, zda nejsou přečteny |
| Názvy proměnných jsou překládány | Nepřicházím | Obnovuje názvy polí rozhraní |
| Variace desetinné specifikace | Označit jako nekonzistentní | Potvrzeno podle dohod o lokalizaci |
🎯 Která metoda ti vyhovuje?
Pokud jsi zodpovědný za překlad
Před doručením proveďte kontrolu struktury, abyste vrátili zamítnuté položky překladateli a připojili chybějící nebo změněné názvy polí.
Pokud jsi zodpovědný za šablony a rozhraní
Jasně uveďte, která pole patří do smlouvy o rozhraní, a uveďte je v doručovacích poznámkách, aby bylo lepší porovnat překladatele a recenzenty.
Pokud potřebujete změnit, jak jsou čísla prezentována
Stanovte samostatný lokalizační protokol pro specifikaci formátu a poté jej přidejte do validačního pravidla, místo abyste celou kontrolu uzavírali.
❓ Často kladené otázky (FAQ)
1. Zvládne tato metoda JavaScriptové šablony nebo ICU MessageFormat?
Ne. Tento článek pokrývá pouze pojmenovaná pole ve stylu Pythonu str.format; vnořování, escaping a množné čísla pravidel v jiných systémech je třeba řešit samostatně.
2. Bude {{name}} kontrolována jako proměnná?
Ne. Reprezentuje zobrazovaný text {name}, který se při parsování nepočítá jako pole.
3. Pokud jen upravíte pozici pole ve větě, bude to zamítnuto?
Ne. V tomto příkladu jsou akceptovány změny polohy polí a poté ručně čteno, zda je slovosled přirozený.
4. Lze přímo volat format k ověření překladu?
Kód v tomto článku je pouze parsován a ve skutečnosti nevolá format k vyplnění objektů; není to bezpečnostní sandbox šablony. Následné vykreslování musí také omezit dostupná pole, přístup k objektům a výstupní kontext, zejména pravidla escape na HTML stránkách.
📝 Shrnutí
Při doručování překladů může použití strukturovaného parsování ke kontrole zástupných prvků předejít problémům s názvy polí, počty a specifikacemi formátování před spuštěním. Zda je jazyk plynulý, stále vyžaduje další posouzení korektorů.
Zkušenost nyní: Nahrajte svůj dokument a začněte s překladem, přičemž zachováte původní formátování


