Лучшие практики локализации PHP? gettext?


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

Я заглянул в "gettext" php, однако, если я правильно его понимаю, я вижу большой недостаток:

Если моя веб-страница имеет, скажем," Hello World " в виде статического текста. Я могу поместить строку в виде <?php echo gettext("Hello World"); ?>, сгенерировать файлы po / mo с помощью инструмента. Затем я отдавал файл переводчику для работы.

Через несколько дней мы хотим изменить текст на английском языке, чтобы сказать "Hello Small World"? Разве я меняюсь? значение в gettext? Могу ли я создать английский PO-файл и изменить его там? Если вы измените gettext, он будет рассматривать его как новую строку, и вы мгновенно потеряете текущий перевод ...

Мне кажется, что постепенно содержимое файла php будет иметь старый текст везде. Или людям, переводящим, возможно, придется сказать: "когда вы видите Hello World, вместо этого переведите Hello Small World".

Не знаю, я что-то путаю.

На других языках программирования я видно, что они используют ключевые слова, такие как web.home.featured.HelloWorld.

Как лучше всего обрабатывать переводы в PHP?

Спасибо

3 21

3 ответа:

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

В PO-файле есть msgid и msgstr. Msgid-это значение, которое заменяется на msgstr в файле PHP в зависимости от локализации.

Теперь вы можете сделать эти msgid все, что вы хотели бы, вы могли бы очень хорошо сделать это:

<?php echo _("web.home.featured.HelloWorld"); ?>

И тогда вы никогда больше не коснетесь этой строки в источнике, вы редактируете строку только через PO-файлы.

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

Я надеюсь, что это ясно.

Я знаю, что ответ был принят, и вышеприведенный ответ хорош. Но есть еще одна проблема с использованием постоянных ключей машинного стиля, таких как thing.stuff.widget при работе с Gettext.

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

Если вы представите переводчику PO-файл, заполненный ключами вместо исходного текста, он может не знать, каким должен быть английский язык. Так вы должны были бы предоставить им второй файл, содержащий переводы исходного языка для сравнения. Не конец света, но более точно для них и не так, как был разработан Gettext. (квадратный колышек, круглое отверстие и т. д..)

Я думаю, что PO идеально подходит в качестве формата файла для переводов на PHP, и особенно рекомендуется, если вы не работаете с фреймворком, который имеет хороший модуль l10n, но это не значит, что он хорош для рабочего процесса и вашего процесса перевода.

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

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

В настоящее время я занимаюсь тем же вопросом. Обычная практика использования gettext-это использование английского текста в качестве ключа. Недавно наш редактор копий изменил целую кучу английского текста (другие языки почти не затронуты), поэтому мы должны изменить весь исходный код всех PO-файлов.

Мы переходим на нейтральный ключ. Так как у нас уже есть несколько сайтов на Java. Мы будем использовать тот же формат имени свойства.