Использовать PHP Gettext без необходимости устанавливать локали

Я рассматривал варианты интернационализации проекта с открытым исходным кодом:

Могу ли я как-то читать файлы .mo без Gettext или Zend_Translate, или я должен использовать Gettext? Если да, как я могу заставить все локали работать, как в вопросе, который я связал с выше?

EDIT: теперь я готов использовать Zend_Translate. Мне просто нужно выяснить, какие файлы мне нужны (было бы здорово, если бы их можно было объединить в один файл) - мне не нужна вся Zend Framework в моем проекте.


Обновление: мне было интересно увидеть, как большие проекты с открытым исходным кодом обрабатывают i18n:

Таким образом, ни один из этих трех случайных проектов не использует 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.

Ответ 1

Вот решение:

$lang = 'de'; //debug
setlocale( LC_ALL, 'C.UTF-8' );
bindtextdomain( 'default', PATH . "/locale/$lang" );
bind_textdomain_codeset( 'default', 'UTF-8' );
textdomain( 'default' );

Единственная разница между тем, что я привел в нижней части моего ответа, заключается в том, что он использует C.UTF-8 не только C.

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

Ответ 2

Попробуйте gettext-php. Это переполнение для gettext, написанное на PHP. Первоначально это было сделано для WordPress, поскольку WP необходимо запускать на общих хостах, которые не всегда настроены для каждой локали. Мне кажется, это тоже ваша проблема.

У этого есть бит производительности, но это не было проблемой для меня вообще.

Ответ 3

Для тех, у кого все еще есть проблемы с этим, вы можете попробовать код ниже, который я получаю отсюда: http://php.net/manual/en/function.gettext.php#58310

Это решило меня на сервере freebsd без дополнительной установки локали (fr_FR и my_MY). Этот код также полезен, когда у вас есть проблемы с кешем gettext.

<?php
function initialize_i18n($locale) {
  $locales_root="/app/php/locale"; // change This to where you locale folder at
  putenv('LANG='.$locale);
  setlocale(LC_ALL,"");
  setlocale(LC_MESSAGES,$locale);
  setlocale(LC_CTYPE,$locale);
  $domains = glob($locales_root.'/'.$locale.'/LC_MESSAGES/*.mo');
  $current = basename($domains[0],'.mo');
  $timestamp = preg_replace('{messages-}i','',$current);
  bindtextdomain($current,$locales_root);
  textdomain($current);
}
?>