PHP Gettext – нет перевода

Я пытаюсь использовать расширение gettext PHP, чтобы перевести некоторые строки. Все функции возвращают правильные значения, но вызов gettext() / _() возвращает только исходную строку. Файлы PO / MO кажутся правильными, и я считаю, что правильно настроил каталоги. Я запускаю WAMP Server с PHP 5.3.10 в Windows (также пытался работать с 5.3.4 и 5.3.8, потому что у меня есть установки).

Во-первых, см. /new2/www/index.php :

 $locale = 'esn'; # returns Spanish_Spain.1252 in var dump putenv("LC_ALL={$locale}"); // Returns TRUE setlocale(LC_ALL, $locale); // Returns 'Spanish_Spain.1252' $domain = 'messages'; bindtextdomain($domain, './locale'); // Returns C:\wamp\www\new2\www\locale bind_textdomain_codeset($domain, 'UTF-8'); // Returns UTF-8 textdomain($domain); // Returns'messages' print gettext("In the dashboard"); // Prints the original text, not the translation. exit; 

Я создал следующую структуру файлов:

 www/new2/www/locale/Spanish_Spain.1252/LC_MESSAGES/messages.mo 

Я также попытался заменить Spanish_Spain.1252 на: es_ES , esn , esp , Spanish и Spanish_Spain .

Файл PO, используемый для генерации MO, выглядит так (только соответствующая запись):

 #: C:\wamp\www\new2/www/index.php:76 msgid "In the dashboard" msgstr "TRANSLATED es_ES DASHBOARD" 

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

Любая помощь будет оценена по достоинству.

Изменить : Изменена структура каталогов. Примечание. Вы сможете попробовать последние ответы в течение 24 часов.

Я установил это на свой экземпляр XAMPP и выяснил это.

  • Flat out setlocale не работает в Windows, поэтому то, что оно возвращает, не имеет значения.
  • Для Windows вы устанавливаете языковой стандарт, используя стандартные коды языка / страны (в этом случае es_ES является испанским, как говорят в Испании)
  • В вашем каталоге locale создайте es_ES / LC_MESSAGES /. Это, где живет ваш файл messages.mo.

     $locale = 'es_ES'; putenv("LC_ALL={$locale}"); // Returns TRUE $domain = 'messages'; bindtextdomain($domain, './locale'); bind_textdomain_codeset($domain, 'UTF-8'); textdomain($domain); // Returns'messages' print gettext("In the dashboard"); exit; 

Я не уверен, что это изменилось, но я сделал две вещи при создании po-файла. В poEdit в разделе «Файл -> Настройки» я изменил формат окончания строки на Windows. И после того, как я создал исходное po с poEdit, я открыл файл в Notepad ++ и переключил тип кодировки на UTF-8, поскольку poEdit этого не делал.

Надеюсь, это, по крайней мере, указывает на правильное направление.

Рекомендации

Учебник по локализации PHP в Windows

Коды стран

Языковые коды

Ваш код упоминает это как возвращаемое значение из bindtextdomain :

 C:\wamp\www\new2\www\locale 

С помощью setlocale Spanish_Spain.1252 и textdomain messages вызовы gettext будут выглядеть по этому пути:

 C:\wamp\www\new2\www\locale\Spanish_Spain.1252\LC_MESSAGES\messages.mo 

Но вы создали файловую структуру:

 www/new2/locale/Spanish_Spain.1252/LC_MESSAGES/messages.mo ^^ www/ missing here 

редактировать

Ладно, так что это не помогло. Я создал тестовый скрипт в Windows и используя POEdit, как вы:

 $locale = "Dutch_Netherlands.1252"; putenv("LC_ALL=$locale"); // 'true' setlocale(LC_ALL, $locale); // 'Dutch_Netherlands.1252' bindtextdomain("messages", "./locale"); // 'D:\work\so\l10n\locale' textdomain("messages"); // 'messages' echo _("Hello world"); // 'Hallo wereld' 

Моя структура папок выглядит так:

 D:\work\so\l10n\ \locale\Dutch_Netherlands.1252\LC_MESSAGES\messages.mo \locale\Dutch_Netherlands.1252\LC_MESSAGES\messages.po \test.php 

Надеюсь, что это поможет, хотя оно выглядит почти идентично вашему. Несколько вещей, которые я нашел в Интернете:

  • Важно установить набор символов в файле .po
  • Пространства внутри файла локализации могут иметь альтернативу UTF8, поэтому будьте осторожны при сбоях в ключевом поиске. Наверное, самое лучшее, что нужно проверить сначала – это клавиши без пробелов.

Предложение: вам может понадобиться полный языковой стандарт для файла .mo. Это, вероятно, Spanish_Spain.UTF8 или esn_esn.UTF8 или esn_esp.UTF8 (а не 1252 при изменении базы кода).

Чтобы узнать, какой каталог он ищет, вы можете установить Process Monitor (http://technet.microsoft.com/en-us/sysinternals/bb896645). Он выводит на экран информацию о загрузке bucket, но вы должны знать, какой файл / каталог просматривается.

(Моя другая мысль – проверить права доступа к файлам, но если у вас уже есть что-то подобное в Zend_Translate, то, вероятно, не причина, но в любом случае стоит проверить).

Извините, если не хорошо, но может дать вам ключ.

Послушайте. Он работает для меня и на окнах, и на linux. Последние значения в массиве работают для окон. Список имен языков можно найти здесь . Мои каталоги находятся в

 ./locales/en/LC_MESSAGES/domain.mo /cs/LC_MESSAGES/domain.mo 

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

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