cakephp, i18n .po файлы, как их правильно использовать - PullRequest
4 голосов
/ 24 марта 2010

Мне наконец-то удалось настроить многоязычный сайт CakePHP. Хотя это еще не закончено, я впервые могу изменить DEFAULT_LANGUAGE в начальной загрузке, и я вижу язык для изменения.

Моя проблема сейчас заключается в том, что я не очень хорошо понимаю, как правильно использовать po-файлы. В соответствии с учебниками, которые я использовал, мне нужно создать папку / app / locale и внутри этой папки создать папку для каждого языка в следующем формате: /locale/eng/LC_MESSAGES.

Я сделал это, и мне также удалось извлечь файл default.pot с использованием экстракта cake i18n. И похоже, что все вхождения функции __ () были успешно найдены.

В моем приложении я использую 2 языка: eng и gre. Я понимаю, почему вам нужна отдельная папка для каждого языка. Однако в моем случае ничего не происходит, когда я редактирую po-файлы внутри каждой папки .... ну почти ничего. Если я отредактирую /app/locale/gre/LC_MESSAGES/default.po, у меня не будет языковых изменений. Если я отредактирую /app/locale/eng/LC_MESSAGES/default.po, то язык изменится на новое значение (в поле перевода) и не переключится на другой язык.

Что я делаю не так. Надеюсь, я высказался как можно яснее.

Ответы [ 2 ]

4 голосов
/ 25 марта 2010

Есть разные способы сделать это. Проще всего написать приложение на основном языке и просто обернуть все переводимые строки в __(). Позже вы можете добавить .po файлов для каждого перевода.

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

Пожалуйста, не обращайте внимания на старую информацию выше. Правильно настроенный рабочий процесс i18n будет использовать xgettext или аналогичные утилиты для автоматического извлечения __() обернутых строк из исходного кода и создания, обновления и объединения файлов .po. Ничего обременительного в этом нет.


Альтернатива - использовать текст «дескриптор» в исходных файлах и поместить фактический текст в файлы .po, даже для основного языка. То есть:

__('PRODUCT CAPTION');

/eng/.po
msgid "PRODUCT CAPTION"
msgstr "Buy our awesome products!"

/ger/.po
msgid "PRODUCT CAPTION"
msgstr "Kaufen Sie unsere Produkte!"

То, что работает лучше, зависит от проекта и от вас, вам придется это выяснить ...

1 голос
/ 29 марта 2010

Использование

Configure::write('Config.language', 'fr');

для установки французского языка пользователя.

...