Не может перевести на любой другой язык с помощью функции 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");
Другие вопросы по тегам