Мы готовимся переводить наш PHP-сайт на разные языки, а поддержка gettext в PHP выглядит как способ.
Все учебные пособия, которые я вижу, рекомендуют использовать английский текст как идентификатор сообщения, т. Е.
gettext («Привет!»)
Но разве это действительно хорошая идея? Скажем, кто-то в маркетинге хочет изменить текст на «Привет, все!». Тогда вам не нужно обновлять все языковые файлы, потому что эта строка, которая на самом деле является идентификатором сообщения, изменилась?
Лучше ли иметь какой-то общий идентификатор, например «hello.message», и файл английских переводов?
Я использую значащие идентификаторы, такие как « welcome_back_1
», которые будут « welcome back, %1
» и т. Д. У меня всегда есть английский как мой «базовый» язык, поэтому в худшем случае, когда на конкретном языке нет идентификатора сообщения, я отступать на английском.
Я не люблю использовать настоящие английские фразы в качестве идентификаторов сообщений, потому что если английский изменит, значит, и ID. Это может не сильно повлиять на вас, если вы используете некоторые автоматизированные инструменты, но это меня беспокоит. Я не люблю использовать простые коды (например, msg3975), потому что они ничего не значат, поэтому чтение кода сложнее, если вы не будете комментировать комментарии повсюду.
Ничего себе, я удивлен, что никто не защищает английский как ключ. Я использовал этот стиль в нескольких программных проектах, и IMHO это получилось довольно хорошо. Читаемость кода велика, и если вы измените английскую строку, становится очевидным, что сообщение нужно учитывать при повторном переводе (что хорошо).
В случае, если вы исправляете орфографию или делаете некоторые другие изменения, которые определенно не требуют перевода, просто обновить идентификаторы для этой строки в файлах ресурсов.
Тем не менее, я в настоящее время оцениваю, переносить ли этот способ I18N на новый проект, поэтому хорошо слышать некоторые мысли о том, почему это может быть не очень хорошая идея.
Я категорически не согласен с ответом Ричарда Харрисона, о котором он заявляет, что это «единственный способ». Уважаемый вопросник, не верьте ответам, в которых говорится, что это единственный способ, потому что «единственный путь» не существует.
Вот еще один способ, которым ИМХО имеет несколько преимуществ по сравнению с Ричардсом:
Преимущества:
Причина, по которой идентификаторы являются английскими, заключается в том, что идентификатор возвращается, если перевод по какой-либо причине невозможен – перевод для текущего языка и токена недоступен или другие ошибки. Это, конечно, предполагает, что разработчик пишет оригинальный текст на английском языке, а не какой-либо человек документации.
Кроме того, если текст на английском изменяется, то, возможно, другие переводы необходимо обновить?
На практике мы также используем Pure ID, а не английский текст, но это означает, что мы должны делать много дополнительной работы по умолчанию на английском языке.
Одним словом, не делайте этого.
Одно и то же слово / фраза на английском языке часто может иметь более одного значения, а каждый означает другой перевод.
Определите мнемонические идентификаторы для ваших строк и рассматривайте английский как просто другой язык.
Согласитесь с другими плакатами, что идентификационные номера в коде являются кошмаром для чтения кода.
Инженер по локализации
Разве вы уже не ответили на свой вопрос? 🙂
Очевидно, что если вы намерены поддерживать i18n вашего приложения, вы должны рассматривать все языковые реализации одинаково. Если кто-то решит, что строка должна измениться, вы делаете подобное изменение во всех языковых файлах. Метаданные с помощью checkin должны сгруппировать все языковые файлы вместе с тем же изменением. Если ваш язык по умолчанию обрабатывается по-разному, это затрудняет его поддержку.
Есть много, чтобы рассмотреть и ответить не так просто.
Pros
Cons
Pros
Вы можете использовать функции платформы локализации даже для английского языка. Т.е. мы используем прекрасную платформу Кроудина. Существует много удобных инструментов – или, скорее, полный рабочий процесс – для управления переводом: голосование за разные переводы, историю переводов, глоссарии (что помогает поддерживать согласованность перевода / языка), проверку, утверждение и т. Д. Использование ключей делает этот процесс более гладкий.
Гораздо проще отправлять английские тексты для корректуры и т. Д. Обычно не рекомендуется копировать копирайтеры напрямую для изменения вашего кода 🙂
Cons
Я бы зашел так далеко, чтобы сказать, что вы никогда (для большинства ценностей никогда) не хотите использовать бесплатный текст в качестве ключей ко всему. Представьте, что SO использовал заголовок запроса как ключ к этой странице, например. Если кто-то ссылается на него, а затем редактируется заголовок, ссылка больше не действительна.
Ваша проблема аналогична, за исключением того, что вы также несете ответственность за обновление всех ссылок …
Как упоминает Дуглас Лидер, вы, вероятно, хотите использовать английский, как язык по умолчанию (резервный), хотя интерфейс, в котором используется английский и другой язык, смешанный, очень запутан (но тоже забавный).
В дополнение к рассмотренным выше соображениям есть много случаев, когда вы хотите, чтобы «ключ» (msgid) отличался от исходного текста (на английском языке). Например, в представлении HTML я могу сказать [yyyy], где место назначения и метка этого якоря-тега зависят от локали пользователя. Например, это может быть ссылка на социальную сеть, а в США это будет Facebook, но в Китае это будет Weibo. Таким образом, MsgIds могут быть чем-то вроде socialSiteUrl и socialSiteLabel.
Я использую микс.
Для базовых строк, которые, как я думаю, не будет иметь конфликтов / изменений / странных значений, я сделаю ключ таким же, как на английском.
В конце концов, переводчик должен иметь возможность сесть и изменить тексты для каждого языка (чтобы они соответствовали по смыслу) без привлечения программиста, который уже выполнял свою работу.
Это заставляет меня чувствовать, что правильным ответом является использование модифицированной версии gettext
где вы помещаете строки, подобные этому
_(id, backup_text, context) _('ABOUT_ME', 'About Me', 'HOMEPAGE')
контекст является необязательным
почему так? потому что вам нужно идентифицировать текст в системе, используя уникальный текст, а не английский текст, который можно повторить в другом месте.
Вы должны также сохранить резервную копию, идентификатор и контекст в одном и том же месте вашего кода, чтобы уменьшить расхождения.
Идентификатор также должен быть доступен для чтения, что приводит к проблеме синонимов и использования дубликатов (даже в виде ids), мы могли бы префикс идентификаторов типа «HOMEPAGE_ABOUT_ME» или «MAIL_LETTER», но
поэтому я также добавил контекстную переменную в конце
текст в резервном копировании может быть практически любым, даже может быть «[О__ME @ HOMEPAGE текст не загружен, пожалуйста, свяжитесь с example@example.com]"
Он не будет работать с текущими программами редактирования текста, такими как «poedit», но я думаю, что вы можете определить имена настраиваемых переменных для переводов, как просто «t ()», без подчеркивания в начале.
Я знаю, что gettext также поддерживает контексты, но он не очень хорошо документирован или широко используется.
PS Я не уверен в наилучшем переменном порядке для обеспечения хорошего и расширяемого кода, поэтому предложения приветствуются.