Не может перевести на любой другой язык с помощью функции gettext php
Я использую сервер WAMP в Windows и делаю тестовый проект. У меня есть эти файлы в папке сайта:
C: \ wamp \ www \ project \ locale \ ar_EG \ LC_MESSAGES \ messages.po C: \ wamp \ www \ project \ locale \ en_US \ LC_MESSAGES \ messages.po
Ниже приведен код PHP:
$language="en_US";
$encoding = "UTF-8";
putenv("LANG=".$language);
setlocale(LC_ALL,$language);
$domain="messages"; // name of PO file
bindtextdomain($domain,"Locale");
bind_textdomain_codeset($domain, $encoding);
textdomain($domain);
echo gettext("name");
Выше код работает нормально. Когда я пытаюсь заменить en_US
с ar_EG
он также отображает перевод для en_US
и когда я пытаюсь удалить en_US
папку и попробуйте снова, он отображает msgid
не msgstr
,
Я искал и обнаружил, что есть проблема с setlocale
на платформе Windows, но мне нужно решение для его запуска на Windows.
2 ответа
У setlocale() в Windows есть проблемы.
Из setLocale() в руководстве по PHP:
Пользователи Windows найдут полезную информацию о строках локали на веб-сайте Microsoft MSDN. Поддерживаемые языковые строки можно найти в " документации по языковым строкам и поддерживаемые строки страны / региона в" документации по странам / регионам.
Вы можете попробовать использовать $language = 'english-us';
вместо $language = 'en_US';
,
Я не уверен в коде языка для ar_eg
, может быть Arabic_Egypt
или же Arabic_Egypt.1256
,
Если это не сработает, у вас все еще есть возможность использовать библиотеку PHP, которая реализует gettext, например https://github.com/oscarotero/Gettext или https://launchpad.net/php-gettext.
Я сделал это работает на окнах с помощью следующего кода:
$locale = 'en_US';
if(!defined('LC_MESSAGES') || !setlocale(LC_ALL, $locale)) {
putenv("LC_ALL=$locale");
}
$domain = 'messages';
$path = "C:\wamp\www\project\locale";
$codeset = 'UTF-8';
bindtextdomain($domain, $path);
textdomain($domain);
bind_textdomain_codeset($domain, $codeset);
echo gettext("name");