Несколько соображений:
1. Переводы
Кто будет делать переводы? Люди, которые тоже подключены к сайту? Бюро переводов? При использовании Gettext вы будете работать с файлами типа «pot» (.po). Эти файлы содержат идентификатор сообщения и строку сообщения (перевод). Пример:
msgid "A string to be translated would go here"
msgstr ""
Теперь это выглядит прекрасно и понятно для всех, кому нужно это перевести. Но что происходит, когда вы используете ключевые слова, как предлагает Майк, вместо полных предложений? Если кому-то нужно перевести msgid с именем «address_home», он или она не имеет ни малейшего понятия, должен ли это быть заголовок «Домашний адрес» или это полное предложение. В этом случае не забудьте добавить комментарии к файлу прямо перед вызовом функции gettext, например:
/// This is a comment that will be included in the pot file for the translators
gettext("ready_for_lost_episode");
Использование xgettext --add-comments=///
при создании файлов .po добавит эти комментарии. Однако я не думаю, что Gettext можно использовать таким образом. Кроме того, если вам нужно добавить комментарии к каждому тексту, который вы хотите отобразить, вы: а) возможно, в какой-то момент сделаете ошибку, б) весь скрипт все равно будет заполнен текстами, только в форме комментариев; c) комментарии должны быть размещены непосредственно над функцией Gettext, что не всегда удобно, в зависимости от положения функции в вашем коде.
2. Техническое обслуживание
Когда ваш сайт разрастется (даже дальше), а вместе с ним и ваши языковые файлы, может стать довольно сложно поддерживать все различные переводы таким способом. Каждый раз, когда вы добавляете текст, вам нужно создавать новые файлы, отправлять файлы переводчикам, получать файлы обратно, следить за тем, чтобы структура оставалась нетронутой (нетерпеливые переводчики всегда рады перевести синтаксис, сделав весь файл непригодный для использования :)), и закончите с импортом новых переводов. Конечно, это выполнимо, но помните о возможных проблемах в этой связи с большими сайтами и множеством разных языков.
Другой вариант: объедините вторую и третью альтернативы:
Лично я считаю более полезным управлять переводом с помощью (простой) CMS, сохраняя переменные и переводы в базе данных и самостоятельно экспортируя соответствующие тексты в языковые файлы:
- добавить переменные в базу данных (например: id, page, variable);
- добавить переводы к этим переменным (например: id, varId, language, translation);
- выберите соответствующие переменные и переводы, запишите их в файл;
- включить соответствующий языковой файл на свой сайт;
- создайте свою собственную функцию для отображения текста переменных:
text('var');
или что-то вроде __('faq','register','lost_password_text');
Пункт 3 может заключаться в простом выборе всех соответствующих переменных и переводов из базы данных, помещении их в массив и записи сериализованного массива в файл.
Преимущества:
Техническое обслуживание. Поддерживать тексты в больших проектах может быть намного проще. Вы можете группировать переменные по страницам, разделам или другим частям вашего сайта, просто добавив столбец в вашу базу данных, который определяет, к какой части сайта принадлежит эта переменная. Таким образом, вы можете быстро просмотреть список всех переменных, используемых, например, в страницу часто задаваемых вопросов.
Идет перевод. Вы можете отобразить переменную со всеми переводами всех разных языков на одной странице. Это может быть полезно для людей, которые могут переводить тексты на несколько языков одновременно. И может быть полезно увидеть другие переводы, чтобы почувствовать контекст, чтобы перевод был как можно лучше. Вы также можете запросить базу данных, чтобы узнать, что было переведено, а что нет. Возможно, добавьте отметки времени, чтобы отслеживать возможные устаревшие переводы.
Доступ. Это зависит от того, кто будет переводить. Вы можете обернуть CMS простым логином, чтобы предоставить доступ людям из бюро переводов, если это необходимо, и разрешить им изменять только определенные языки или даже определенные части сайта. Если это не вариант, вы все равно можете вывести данные в файл, который можно будет вручную перевести и импортировать позже (хотя при этом могут возникнуть те же проблемы, что и упомянутые ранее). Вы можете добавить один из уже имеющихся переводов (английский или другой основной язык) в качестве контекста для переводчика.
В целом, я думаю, вы обнаружите, что таким образом у вас будет гораздо больше контроля над переводами, особенно в долгосрочной перспективе. Я ничего не могу сказать о скорости или эффективности этого подхода по сравнению с собственной функцией gettext. Но, в зависимости от размера языковых файлов, я не думаю, что это будет большой разницей. Если вы группируете переменные по страницам или разделам, вы всегда можете включать только необходимые части.
person
Alec
schedule
11.05.2010