{name} в копии перевода потеряно, как остановить его перед выходом в интернет
Если {name} потеряется в копии перевода, в сети возникнут ошибки. Обычное суждение ненадежно. В этой статье используется стандартная библиотека Python string.Formatter.parse для структурирования заполнителей проверки с правильными и неправильными примерами синтеза, непосредственно исполняемыми сценариями и границами проверки вручную.
Основные положения этой статьи
— Имена переменных перезаписываются после перевода, и страница часто не сообщает об ошибке до тех пор, пока значение не будет фактически заполнено, поэтому его следует проверить при доставке. — Обычные фигурные скобки ненадежны. Используйте string.Formatter.parse для анализа имен полей, символов преобразования и спецификаций формата.
- {{name}} — это экранированный отображаемый литерал, а не переменная, и его не следует учитывать в контракте-заполнителе.
- Спецификации формата считаются защищенным контентом. Изменение десятичного знака (например, с .2f на .0f) будет отмечено и должно быть подтверждено в соответствии с соглашением о локализации.
— Код синтаксического анализа не вызывает форматирование и не является безопасной для шаблонов песочницей. Поля и экранирование вывода по-прежнему необходимо ограничивать при рендеринге.
В переведенной копии переменные, такие как {name}, часто переводятся вместе, и страница часто не сообщает об ошибке до тех пор, пока значение не будет фактически заполнено. Если вы полагаетесь только на человеческий глаз или регулярные выражения для проверки фигурных скобок перед выходом в Интернет, их легко пропустить. Эта статья предназначена для разработчиков и редакторов, отвечающих за локализацию, шаблоны и проверку доставки. В нем рассказывается, как использовать стандартную библиотеку Python string.Formatter.parse для выполнения структурированной проверки заполнителей, и объясняется, какие ситуации все еще требуют проверки вручную.
После прочтения вы можете получить идею проверки, которую можно запустить напрямую: проверять идентичность поля, частоту появления и спецификации формата при доставке перевода, вместо того, чтобы ждать, пока проблема будет обнаружена в Интернете. В примерах используются синтетические образцы, а код проверен в изолированной среде, но это не является гарантией работоспособности всех реальных файлов или продукта. Перед обработкой важных документов сохраните оригиналы и просмотрите их в соответствии с границами и пунктами приема, указанными ниже.
Заполнители потеряны после перевода? Вывод в одно предложение
Сначала используйте структурированный анализ, чтобы извлечь поля в строке формата, а затем сравнить их одно за другим с полями исходной копии; если имена полей, время появления или спецификации формата не соответствуют друг другу, оно будет напрямую отклонено, а корректировка порядка слов будет оставлена на рассмотрение вручную.
| твоя ситуация | Рекомендуемые практики | причина |
|---|---|---|
| Имена переменных в переводе переведены | Восстановите имя поля интерфейса перед доставкой. | Имя переменной принадлежит контракту интерфейса. После изменения будет сообщено об ошибке при заполнении значения на странице. |
| В переводе один раз отсутствует поле с таким же именем | Отклоните статью и проверьте, отсутствует ли в ней перевод | Количество вхождений одного и того же поля также является частью контракта. |
| Скорректировано только положение поля. | Принять, является ли порядок чтения слов естественным | Изменение порядка полей обычно не влияет на результаты заполнения значений. |
| Спецификации формата, такие как десятичные знаки, изменились. | Маркировка не соответствует, подтвердите согласно протоколу локализации | Спецификации формата также защищены, и вопрос о том, разрешены ли изменения, должен решаться по соглашению. |
Сначала выберите синтаксис формата
В этой статье рассматриваются только заполнители в стиле Python str.format и не рассматриваются строки шаблонов JavaScript, ICU MessageFormat или другие системы заполнителей. В разных системах действуют очень разные правила вложенности, экранирования и множественного числа, и одно регулярное выражение не может претендовать на поддержку их всех. В примере требуется использование именованных полей и отклоняются поля с автоматической нумерацией (например, {}).
Полное описание синтаксиса полей можно найти в Документация по строкам Python и форматтеру.
Экранированные фигурные скобки не являются переменными
{{name}} представляет отображаемый текст {name} и не должен считаться полем. В спецификации формата также могут быть вложенные поля, например {value:{width}}. Код ниже рекурсивно считывает спецификацию и подсчитывает количество повторных вхождений одного и того же поля.
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")
Этот контракт намеренно строгий
Спецификации формата также считаются здесь защищенным контентом, поэтому изменение количества десятичных знаков будет отмечено. Некоторые задачи локализации требуют изменения способа представления чисел, и в этом случае вам следует создать для этого отдельное правило, а не отменять все проверки заполнителей. Предел глубины вложенности в примере является демонстрационным бюджетом и не является требованием спецификации языка.
В следующей таблице перечислены несколько распространенных типов изменений и соответствующие им методы обработки:
| Перемены | Результаты этого дела | и тщательно осматривал движения |
|---|---|---|
| Перенос месторождений | Принимаю | Проверьте, естественен ли порядок слов при чтении |
| На один раз меньше в одной и той же сфере | Откажитесь от контракта | Проверьте пропущенные переводы |
| Имена переменных переводятся | Откажитесь от контракта | Восстанавливает имена полей интерфейса |
| Вариация десятичной спецификации | Несогласованные маркировки | Подтверждено согласно соглашениям о локализации |
📊 Сравнение ядра
| Виды изменений | Проходит ли он калибровочный тест | Последующие действия |
|---|---|---|
| Перенос месторождений | Перевал | Проверьте, естественен ли порядок слов при чтении |
| На один раз меньше в одной и той же сфере | Не прохожу | Проверьте пропущенные переводы |
| Имена переменных переводятся | Не прохожу | Восстанавливает имена полей интерфейса |
| Вариация десятичной спецификации | Марк как непоследовательный | Подтверждено согласно соглашениям о локализации |
🎯 Какой способ тебе подходит?
Если вы отвечаете за доставку перевода
Перед доставкой выполните проверку структуры, чтобы вернуть отклонённые записи в переводчик и добавить отсутствующие или изменённые имена полей.
Если вы отвечаете за шаблоны и интерфейсы
Чётко указывайте, какие названия полей относятся к контракту интерфейса, и указывайте их в примечаниях к поставке, чтобы облегчить сравнение переводчиков и рецензентов.
Если нужно менять представление чисел
Установите отдельный протокол локализации спецификации формата и затем добавьте его в правило валидации, вместо того чтобы закрывать общую проверку.
❓ Часто задаваемые вопросы (FAQ)
1. Может ли этот метод работать с JavaScript-шаблонами или ICU MessageFormat?
Нет. В этой статье рассматриваются только именованные поля в стиле Python str.format; правила вложения, ухода и множественного числа в других системах должны обрабатываться отдельно.
2. Проверяется ли {{name}} как переменная?
Нет. Он представляет собой текст отображения {name}, который при разборе не считается полем.
3. Если просто изменить положение поля в предложении, будет ли оно отклонено?
Нет. Изменения позиции поля принимаются в этом примере, а затем вручную считываются, естественный ли порядок слов.
4. Можно ли напрямую вызвать format для проверки перевода?
Код в этой статье только парсируется и фактически не вызывает format для заполнения объектов; это не шаблонная безопасная песочница. Последующий рендеринг также должен ограничивать доступные поля, доступ к объектам и контекст вывода, особенно правила escape на HTML-страницах.
📝 Краткое содержание
При предоставлении переводов использование структурированного парсинга для проверки заглушителей может предотвратить проблемы с названиями полей, количеством и спецификациями форматирования до запуска. Вопрос о том, насколько язык свободен, всё ещё требует дальнейшего суждения корректоров.
Опыт сейчас: загрузите документ, чтобы начать перевод, сохраняя оригинальное форматирование


