Gettext - Получить текст:Хорошая ли идея, чтобы идентификатором сообщения был текст на английском языке?

StackOverflow https://stackoverflow.com/questions/216478

Вопрос

Мы готовимся перевести наш веб-сайт на PHP на различные языки, и поддержка gettext в PHP, похоже, подходит для этого.

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

gettext("Привет всем!")

Но действительно ли это хорошая идея?Допустим, кто-то из отдела маркетинга хочет изменить текст на "Привет всем!".Тогда разве вам не нужно обновлять все языковые файлы, потому что эта строка, которая на самом деле является идентификатором сообщения, изменилась?

Может быть, лучше иметь какой-то общий идентификатор, например "hello.message", и файл перевода на английский?

Это было полезно?

Решение

Я использую значимые идентификаторы, например " welcome_back_1 " что было бы добро пожаловать обратно,% 1 " и т. д. У меня всегда есть английский в качестве моей "базы" язык, поэтому в худшем случае, когда конкретный язык не имеет идентификатора сообщения, я использую английский.

Я не люблю использовать настоящие английские фразы в качестве идентификаторов сообщений, потому что, если меняется английский, меняется и идентификатор. Это может не сильно повлиять на вас, если вы используете некоторые автоматизированные инструменты, но это беспокоит меня. Я не люблю использовать простые коды (например, msg3975), потому что они ничего не значат, поэтому читать код сложнее, если вы не засоряете комментарии повсюду.

Другие советы

Ого, я удивлен, что никто не выступает за использование английского в качестве ключа. Я использовал этот стиль в паре программных проектов, и имхо он сработал довольно хорошо. Читаемость кода отличная, и если вы измените английскую строку, становится очевидным, что сообщение необходимо рассмотреть для повторного перевода (что хорошо).

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

Тем не менее, в настоящее время я оцениваю, стоит ли продолжать этот способ выполнения I18N в новом проекте, поэтому полезно услышать некоторые мысли о том, почему это не может быть хорошей идеей.

Я категорически не согласен с ответом Ричарда Харрисона, по поводу которого он утверждает, что это "единственный способ".Уважаемый пользователь, не доверяйте ответу, в котором говорится, что это единственный способ, потому что "единственного способа" не существует.

Вот еще один способ, который, ИМХО, имеет несколько преимуществ перед подходом Ричардса:

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

Преимущества:

  • читаемый код
  • текст в вашем коде очень близок, если не идентичен тому, что отображается в вашем представлении
  • если вы хотите изменить текст на английском языке, вы меняете не прототип строки, а перевод
  • если вы хотите перевести одно и то же дважды, просто напишите немного другую прототипную строку или просто добавьте "версию для этого и того", и у вас все равно будет идеально читаемый код

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

Кроме того, если текст на английском языке изменится, возможно, нужно будет обновить другие переводы?

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

Одним словом, не делай этого.

Одно и то же слово / фраза в английском языке часто может иметь более одного значения, и каждое из них имеет свой перевод.

Определите мнемонические идентификаторы для своих строк и рассматривайте английский как просто другой язык.

Согласитесь с другими авторами, что идентификационные номера в коде - это кошмар для читабельности кода.

Бывший инженер по локализации

Нужно многое обдумать, и ответить на этот вопрос не так-то просто.

Используя простой английский

Плюсы

  • Простой в написании и ЧТЕНИИ код
  • В большинстве случаев это работает даже без запуска функций перевода в коде

Минусы

  • Привлеченные программисты должны быть также хорошими копирайтерами :)
  • Вам нужно писать правильные точные тексты полностью на английском, даже в том случае, если первым языком, который вам нужно запустить, является что-то другое (т.Е. мы запускаем множество проектов на чешском языке и позже локализуем их на EN).
  • Во многих случаях вам необходимо использовать контексты.Если вам не удастся сделать это с самого начала, потребуется много работы, чтобы добавить их позже.Чтобы объяснить:В английском языке одно слово может иметь много разных значений - и вам нужно использовать контексты, чтобы различать их, - а это не всегда так просто (order = порядок сортировки, или это может быть заказ на покупку).
  • Позже в этом процессе может быть очень трудно исправить английский.Исправления исходных строк очень часто приводят к потере уже переведенных фраз.Очень неприятно потерять перевод на 3 разных языка только потому, что вы исправили английский.

Использование ключей

Плюсы

  • Вы можете использовать функции платформы локализации даже для английского языка.То есть.мы используем прекрасную платформу Crowdin.Существует множество удобных инструментов - или, скорее, полный рабочий процесс - для управления переводом:голосование за различные переводы, историю переводов, глоссарии (которые помогают поддерживать согласованность перевода и языка), корректуру, одобрение и т.д.Использование клавиш делает этот процесс намного более плавным.

  • Гораздо проще отправлять тексты на английском языке для вычитки и т.д.Обычно не стоит позволять копирайтерам изменять ваш код напрямую :)

Минусы

  • Более сложная настройка проекта.
  • Сложнее использовать %d, %s и т.д.

Разве вы не ответили на свой вопрос? :)

Очевидно, что если вы намереваетесь поддерживать i18n своего приложения, вы должны одинаково относиться ко всем языковым реализациям. Если кто-то решит, что строку нужно изменить, вы сделаете аналогичное изменение во всех языковых файлах. Метаданные с пометкой должны сгруппировать все языковые файлы в одно и то же изменение. Если ваш " default " с языком обращаются по-разному, что усложняет его поддержку.

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

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

_(id, backup_text, context)

_('ABOUT_ME', 'About Me', 'HOMEPAGE')

контекст является необязательным

почему вот так?потому что вам нужно идентифицировать текст в системе, используя уникальный идентификатор, а не текст на английском языке, который может повторяться в другом месте.

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

Идентификаторы также должны быть читаемыми, что приводит к проблеме синонимов и дублирования использования (даже в качестве идентификаторов), мы могли бы добавить к идентификаторам префикс, подобный этому "HOMEPAGE_ABOUT_ME" или "MAIL_LETTER", но

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

именно поэтому я также добавил контекстную переменную в конце

текст резервной копии может быть практически любым, даже таким: "[Текст О_МЕ @ДОМАШНЕЙ странице не удалось загрузить, пожалуйста, свяжитесь с example@example.com]".

Это не будет работать с текущими программами редактирования gettext, такими как "poedit", но я думаю, вы можете определить пользовательские имена переменных для переводов, например, просто "t()" без подчеркивания в начале.

Я знаю, что gettext также поддерживает контексты, но он не очень хорошо документирован и широко используется.

P.S.Я не уверен в наилучшем порядке следования переменных для обеспечения хорошего и расширяемого кода, поэтому предложения приветствуются.

Я бы сказал, что вы никогда (для большинства значений никогда) не хотите использовать свободный текст в качестве ключей ко всему. Представьте себе, если SO использует заголовок запроса, например, в качестве ключа к этой странице. Если кто-то ссылается на него, а затем заголовок редактируется, ссылка больше не действительна.

Ваша проблема похожа, за исключением того, что вы также будете нести ответственность за обновление всех ссылок ...

Как упоминает Дуглас Лидер, вы, вероятно, захотите использовать английский как язык по умолчанию (резервный), хотя интерфейс, который использует английский и другой язык, смешанный, очень запутан (но тоже немного забавен).

В дополнение к вышеизложенным соображениям во многих случаях вам нужен ключ " quot; (msgid) отличаться от исходного текста (английский). Например, в представлении HTML я мог бы сказать [гггг], где назначение и метка этого тега привязки зависят от локали пользователя. Например. это может быть ссылка на социальную сеть, а в США это будет Facebook, а в Китае - Weibo. Таким образом, MsgIds может быть чем-то вроде socialSiteUrl и socialSiteLabel.

Я использую микс.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top