{imię} w kopii tłumaczenia zostało utracone, jak to zatrzymać przed przejściem do trybu online
Jeśli {name} zaginie w tłumaczeniu, w Internecie pojawią się błędy. Regularne osądy są niewiarygodne. W tym artykule użyto standardowej biblioteki Pythona string.Formatter.parse do uporządkowania symboli zastępczych weryfikacji, z poprawnymi i niepoprawnymi przykładami syntezy, bezpośrednio wykonywalnymi skryptami i granicami ręcznego przeglądu.
W przetłumaczonym egzemplarzu zmienne takie jak {name} są często tłumaczone razem, a strona często nie zgłasza błędu, dopóki wartość nie zostanie faktycznie uzupełniona. Jeśli przed przejściem do trybu online sprawdzasz nawiasy klamrowe wyłącznie ludzkim okiem lub wyrażeniami regularnymi, łatwo je przeoczyć. Ten artykuł jest przeznaczony dla programistów i redaktorów odpowiedzialnych za lokalizację, szablony i kontrolę dostarczania. Wprowadza, jak używać standardowej biblioteki Pythona string.Formatter.parse do przeprowadzania strukturalnej weryfikacji symboli zastępczych i wyjaśnia, które sytuacje nadal wymagają ręcznego przeglądu.
Po przeczytaniu możesz wpaść na pomysł weryfikacji, który można przeprowadzić bezpośrednio: zweryfikuj tożsamość pola, częstotliwość występowania i specyfikacje formatu po dostarczeniu tłumaczenia, zamiast czekać, aż problem zostanie wykryty w Internecie. W przykładach wykorzystano próbki syntetyczne, a kod został sprawdzony w izolowanym środowisku, ale nie stanowi to gwarancji działania wszystkich rzeczywistych plików lub produktu. Przed przystąpieniem do przetwarzania ważnych dokumentów prosimy o zachowanie oryginałów i zapoznanie się z nimi zgodnie z poniższymi granicami i punktami akceptacji.
Elementy zastępcze utracone po tłumaczeniu? Wniosek w jednym zdaniu
Najpierw użyj analizy strukturalnej, aby wyodrębnić pola z ciągu formatującego, a następnie porównaj je jeden po drugim z polami kopii źródłowej; jeśli nazwy pól, czasy wystąpienia lub specyfikacje formatu są niespójne, zostanie to bezpośrednio odrzucone, a korektę kolejności słów pozostawi się do ręcznego sprawdzenia.
| twoja sytuacja | Zalecane praktyki | powód |
|---|---|---|
| Nazwy zmiennych w tłumaczeniu są tłumaczone | Przywróć nazwę pola interfejsu przed dostawą | Nazwa zmiennej należy do kontraktu interfejsu. Po dokonaniu zmiany zostanie zgłoszony błąd podczas wypełniania wartości na stronie. |
| W tłumaczeniu brakuje raz pola o tej samej nazwie | Odrzuć artykuł i sprawdź, czy nie brakuje w nim tłumaczenia | Liczba wystąpień tego samego pola jest również częścią umowy |
| Dostosowano jedynie położenie pola | Zaakceptuj, czy kolejność czytanych wyrazów jest naturalna | Zmiany kolejności pól zazwyczaj nie mają wpływu na wyniki wypełniania wartości |
| Specyfikacje formatu, takie jak miejsca dziesiętne, uległy zmianie | Oznakowanie jest niespójne, potwierdzić zgodnie z protokołem lokalizacyjnym | Specyfikacje formatu są również chronione, a decyzja o dopuszczeniu zmian musi zostać podjęta w drodze porozumienia. |
Najpierw wybierz składnię formatu
Ten artykuł dotyczy wyłącznie symboli zastępczych w stylu Python str.format i nie obejmuje ciągów szablonów JavaScript, formatu komunikatów ICU ani innych systemów symboli zastępczych. Różne systemy mają bardzo różne zasady zagnieżdżania, ucieczki i mnożenia, a jedno wyrażenie regularne nie może twierdzić, że obsługuje je wszystkie. Przykład wymaga użycia nazwanych pól i odrzuca pola automatycznie numerowane (takie jak {}).
Pełny opis składni pól można znaleźć w Dokumentacja ciągu Pythona i programu formatującego.
Uciekające nawiasy klamrowe nie są zmiennymi
{{name}} reprezentuje wyświetlany tekst {name} i nie należy go liczyć jako pola. W specyfikacji formatu mogą również znajdować się pola zagnieżdżone, takie jak {value:{width}}. Poniższy kod odczytuje specyfikację rekurencyjnie i rejestruje liczbę powtarzających się wystąpień tego samego pola.
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")
Niniejsza umowa jest celowo rygorystyczna
Specyfikacje formatu również są tutaj uważane za treść chronioną, więc zmiana liczby miejsc po przecinku zostanie oznaczona. Niektóre zadania lokalizacyjne wymagają zmiany sposobu prezentowania liczb. W takim przypadku należy utworzyć do tego oddzielną regułę, zamiast anulować wszystkie kontrole symboli zastępczych. Limit głębokości zagnieżdżenia w przykładzie jest budżetem demonstracyjnym i nie jest wymogiem specyfikacji języka.
W poniższej tabeli wymieniono kilka typowych typów zmian i odpowiadające im metody obsługi:
| zmiana | Wynik tego przykładu | przegląd akcji |
|---|---|---|
| Zmień pola | przyjąć | Czy kolejność słów w czytaniu jest naturalna? |
| Jeden czas mniej w tej samej dziedzinie | odrzucić umowę | Sprawdź, czy nie poległy tłumaczenia |
| Nazwy zmiennych są tłumaczone | Odrzuć umowę | Przywraca nazwy pól interfejsu |
| Wariacja specyfikacji dziesiętnej | Niespójne oznaczenia | Potwierdzone zgodnie z umowami lokalizacyjnymi |
📊 Porównanie rdzenia
| Rodzaje zmian | Czy przejdzie test kalibracyjny | Działania następcze |
|---|---|---|
| Przeniesienie pola | Przełęcz | Sprawdź, czy szyk wyrazów jest naturalny podczas czytania |
| Jeden czas mniej w tej samej dziedzinie | Nie przechodzi | Sprawdź, czy nie poległy tłumaczenia |
| Nazwy zmiennych są tłumaczone | Nie przechodzi | Przywraca nazwy pól interfejsu |
| Wariacja specyfikacji dziesiętnej | Oznacz jako niespójny | Potwierdzone zgodnie z umowami lokalizacyjnymi |
🎯 Która metoda ci odpowiada?
Jeśli odpowiadasz za dostarczanie tłumaczeń
Przed dostarczeniem wykonaj sprawdzenie struktury, aby zwrócić odrzucone wpisy do tłumacza i przypisać brakujące lub zmienione nazwy pól.
Jeśli odpowiadasz za szablony i interfejsy
Jasno określić, które nazwy pól należą do kontraktu interfejsu i wymienić je w notatkach dostaw, aby ułatwić tłumaczom i recenzentom porównanie.
Jeśli musisz zmienić sposób prezentacji liczb
Ustal osobny protokół lokalizacji dla specyfikacji formatu, a następnie dodał go do reguły walidacyjnej, zamiast zamykać ogólne sprawdzanie.
❓ Najczęściej zadawane pytania (FAQ)
1. Czy ta metoda potrafi obsłużyć szablony JavaScript lub ICU MessageFormat?
Nie. Ten artykuł omawia tylko nazwy pól w stylu str.format w Pythonie; zagnieżdżanie, escaping i reguły mnogie w innych systemach muszą być obsługiwane osobno.
2. Czy {{name}} będzie sprawdzana jako zmienna?
Nie. Reprezentuje tekst wyświetlany {name}, który nie jest liczony jako pole podczas analizy.
3. Jeśli tylko zmienisz pozycję pola w zdaniu, czy zostanie odrzucone?
Nie. W tym przykładzie akceptowane są zmiany pozycji pól, a następnie ręcznie odczytane, czy szyk wyrazów jest naturalny.
4. Czy można bezpośrednio zadzwonić do format, aby zweryfikować tłumaczenie?
Kod w tym artykule jest jedynie parsowany i nie wywołuje format do wypełniania obiektów; nie jest to piaskownica bezpieczeństwa szablonu. Późniejsze renderowanie musi również ograniczać dostępne pola, dostęp do obiektów oraz kontekst wyjściowy, zwłaszcza reguły escape na stronach HTML.
📝 Podsumowanie
Podczas dostarczania tłumaczeń, użycie strukturyzowanego parsowania do sprawdzania zastępców może zapobiec problemom z nazwami pól, liczbami i specyfikacjami formatowania przed uruchomieniem publikacji. To, czy język jest płynny, wymaga dalszej oceny korektorów.
Doświadczenie teraz: Prześlij dokument, aby zacząć tłumaczyć, zachowując oryginalne formatowanie


