Куда переводить строки сообщений - в представлении или в модели?
У нас есть многоязычное (PHP) приложение и мы используем gettext для i18n. В бэкэнде / модели есть несколько классов, которые возвращают сообщения или форматы сообщений для printf().
Мы используем xgettext для извлечения строк, которые мы хотим перевести.
Мы применяем функцию gettext T_() во внешнем интерфейсе / представлении - похоже, именно там она и принадлежит. До сих пор мы сохраняли бэкэнд чистым от вызовов T_(), таким образом, мы также можем отправлять сообщения модульного тестирования.
Так что в интерфейсе у нас есть что-то вроде
echo T_($mymodel->getMessage());
или же
printf(T_($mymodel->getMessageFormat()), $mymodel->getValue());
Это делает невозможным применение xgettext для извлечения строк, если мы не поместим некоторый фиктивный вызов T_("мое сообщение%s для перевода") в класс MyModel.
Так что это приводит к более общему вопросу:
Применяете ли вы перевод в бэкэнд-классах, соотв. где вы применяете перевод и как вы отслеживаете строки, которые вы должны перевести?
(Мне известен вопрос: обходной путь poedit для динамического gettext.)
2 ответа
Мои бэкэнд-классы обычно выводят английские строки с опущенными параметрами. пример
["Good job %s you have %i points", "Paul", 10]
Тогда ключ для перевода - английская строка (так как я не очень люблю коды сообщений).
Для меня перевод - это проблема View, за исключением четко определенных деловых причин, таких как необходимость сохранять отображаемые сообщения, как показано. Последнее может, например, произойти, если вы хотите сохранить отправленный счет-фактуру как доставленный клиенту.