Я рассматривал варианты интернационализации проекта с открытым исходным кодом:
-
Gettext, которому все, кажется, рекомендуют, по-видимому, требует, чтобы локали были "установлены в вашей системе", которые будут использоваться. Смотрите note в руководстве по PHP, которое точно отражает мою ситуацию. Этот вопрос SO > также спрашивает об одной и той же проблеме. Это не подходит для проекта с открытым исходным кодом, потому что я не могу доверить, что конечные пользователи имеют соответствующие локали, установленные в их системе. Кроме того, очень странно, что вам нужно установить локали только для использования перенесенных строк (IMO).
-
Zend_Translate также рекомендуется иногда использовать gettext, но я не использую структуру Zend, поэтому я не думаю, что это вариант для меня. Некоторые люди говорят, что вы можете разделить его на структуру Zend, но я не знаю, как это сделать. Если кто-нибудь скажет мне, какие файлы мне нужны (я загрузил tarball из рамки Zend), чтобы выбрать, я был бы открыт для использования Zend_Translate.
-
Массивы. Это то, что я делаю сейчас, но это не идеально, потому что:
- Он будет использовать много памяти для определения каждого перевода, когда большинство не будет использоваться текущей страницей.
- У меня возникают проблемы с поиском дублирования ключей в массиве, который уже стал 1000 строк кода, и я пока ничего не добавил...
- Это означает, что не-программисты не могут действительно переводить, тогда как POedit - это стандарт, который все ожидают использовать.
Могу ли я как-то читать файлы .mo
без Gettext или Zend_Translate, или я должен использовать Gettext? Если да, как я могу заставить все локали работать, как в вопросе, который я связал с выше?
EDIT: теперь я готов использовать Zend_Translate. Мне просто нужно выяснить, какие файлы мне нужны (было бы здорово, если бы их можно было объединить в один файл) - мне не нужна вся Zend Framework в моем проекте.
Обновление: мне было интересно увидеть, как большие проекты с открытым исходным кодом обрабатывают i18n:
- Moodle использует массивы.
- Drupal, похоже, использует массивы с резервной копией базы данных. Они также запускают
setlocale('C')
, чтобы получить общий язык и обходить весь беспорядокsetlocale
. - Wordpress использует кучи своих собственных функций для i18n, хотя под ним используется gettext.
Таким образом, ни один из этих трех случайных проектов не использует Zend_Translate, а не gettext, насколько я могу судить.
Может быть, неплохо использовать локаль C
, сохранить имя языка в текстовом доменном имени и перейти оттуда.
Так что, насколько я понял,
$lang = 'de'; //debug
setlocale( LC_ALL, 'C' );
bindtextdomain( 'default', PATH . "/locale/$lang" );
bind_textdomain_codeset( 'default', 'UTF-8' );
textdomain( 'default' );
var_dump( file_exists( PATH . "/locale/$lang/C/LC_MESSAGES/default.mo" ) ); //bool(true)
Но я все еще просто получаю английскую строку, хотя я использовал poedit, msgfmt и т.д. для создания соответствующих файлов. Я также попытался перезапустить Apache.