Я пытаюсь использовать расширение 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 и выяснил это.
В вашем каталоге 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
Надеюсь, что это поможет, хотя оно выглядит почти идентично вашему. Несколько вещей, которые я нашел в Интернете:
Предложение: вам может понадобиться полный языковой стандарт для файла .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 . Это может быть проблемой, поэтому вы можете использовать обходной путь – всегда переименуйте эти файлы в какое-то новое имя, и они будут перезагружены.