{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 sytuacjaZalecane praktykipowód
Nazwy zmiennych w tłumaczeniu są tłumaczonePrzywróć 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 nazwieOdrzuć artykuł i sprawdź, czy nie brakuje w nim tłumaczeniaLiczba wystąpień tego samego pola jest również częścią umowy
Dostosowano jedynie położenie polaZaakceptuj, czy kolejność czytanych wyrazów jest naturalnaZmiany kolejności pól zazwyczaj nie mają wpływu na wyniki wypełniania wartości
Specyfikacje formatu, takie jak miejsca dziesiętne, uległy zmianieOznakowanie jest niespójne, potwierdzić zgodnie z protokołem lokalizacyjnymSpecyfikacje 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:

zmianaWynik tego przykładuprzegląd akcji
Zmień polaprzyjąćCzy kolejność słów w czytaniu jest naturalna?
Jeden czas mniej w tej samej dziedzinieodrzucić umowęSprawdź, czy nie poległy tłumaczenia
Nazwy zmiennych są tłumaczoneOdrzuć umowęPrzywraca nazwy pól interfejsu
Wariacja specyfikacji dziesiętnejNiespójne oznaczeniaPotwierdzone zgodnie z umowami lokalizacyjnymi

📊 Porównanie rdzenia

Rodzaje zmianCzy przejdzie test kalibracyjnyDziałania następcze
Przeniesienie polaPrzełęczSprawdź, czy szyk wyrazów jest naturalny podczas czytania
Jeden czas mniej w tej samej dziedzinieNie przechodziSprawdź, czy nie poległy tłumaczenia
Nazwy zmiennych są tłumaczoneNie przechodziPrzywraca nazwy pól interfejsu
Wariacja specyfikacji dziesiętnejOznacz jako niespójnyPotwierdzone 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

Zaktualizowano 2026-11-15