Интеграция перевода фраз с помощью String.Format

У меня есть фраза на английском языке, которая выглядит так: "У меня есть {0} собак и {1} кошек". В коде я предоставляю данные в виде String.Format:

String.Format("I have {0} dogs and {1} cats", 1, 2)

Итак, вывод такой: "У меня есть 1 собака и 2 кошки".

Проблема, которую я пытаюсь решить, заключается в том, что фразу "у меня есть {0} собак и {1} кошек" "необходимо перевести на другие языки.

В этом примере испанского перевода английская фраза "I have {0} dogs and {1} cats" "и переведенная фраза" Tengo {0} perros y gatos {1} "хранятся в базе данных.

Если бы пользователь изменил "Tengo {0} perros y gatos {1}" на "Tengo {0} perros y gatos {3}", при вызове String.Format ("Tengo {0" возникнет исключение System.FormatException. } perros y gatos {3}", 1, 2).

На данный момент я перехватываю исключение формата и оно кажется неправильным. Я ищу идеи для лучшего решения.

6 ответов

Решение

Я бы сравнил переведенную фразу с сохраненной исходной фразой, чтобы проверить, равны ли число и типы заполнителей.

Разберите оригинальную английскую фразу и проверьте заполнители, например, используя регулярное выражение: /\{\d+\}/ (если вы используете только заполнители и не форматируете). Проверьте совпадения и сравните их во время редактирования с переведенной строкой. Это гарантирует, что приложение не будет работать в тот момент, когда пользователь все еще сможет его исправить.

Перед сохранением в базу данных, почему бы не посмотреть, если вы бросаете String.Format? Если так - не позволяйте пользователю сохранять.

Просто простая идея, которая может решить проблему...

Вам определенно нужна функция проверки, которая может каким-либо образом проверять отредактированную строку. Даже в другой схеме, в которой не использовались индикаторы числового положения, все равно была бы возможность для опечаток.

С точки зрения пользовательского интерфейса, после того, как они закончат редактирование, вы можете показать им пример перевода, который фактически заполняет параметризованные значения. Это послужило бы двойной цели проверки их форматирующей строки и визуальной двойной проверки того, как она будет выглядеть в контексте.

Ну, я думаю, что ваши пользователи не смогут изменить строку перевода, если они не знают, что делают. Обычно переводчикам следует сообщить, что {0}, {1} представляют собой заменяемые параметры и не должны изменяться. Все остальные люди, кроме переводчиков, не должны иметь доступа к этим строкам, ИМХО.

Вы можете сделать две вещи:

  1. Убедитесь, что этого не происходит, когда переводчик сохраняет новый перевод, т. Е. Вы можете найти {XX} и посмотреть, отличается ли максимальное число от исходного перевода. Если так, не сохраняйте новый.
  2. При отображении, если есть такая ошибка, перехватите исключение и вернитесь к языку по умолчанию, который, как вы знаете, является правильным.

Ночные юнит-тесты могут решить эту проблему.

Еще одна идея:

Дайте этому пользователю инструмент проверки, который пользователь сможет запустить после внесения изменений.

Другие вопросы по тегам