PHP gettext不能在本地WAMP服务器上运行

时间:2016-02-10 19:09:36

标签: php localization wamp translation gettext

我在使用本地WAMP(v2.5)服务器上的翻译时遇到了问题。以下是该问题的一个示例。

putenv("LANG=frc");                          //output: 1
setlocale(LC_ALL, "frc");                    //output: French_Canada.1252

$domain = 'messages';

bindtextdomain($domain, "locale");           //output: D:\wamp\www\[project folder]\locale
bind_textdomain_codeset($domain, 'UTF-8');   //output: UTF-8
textdomain($domain);                         //output: messages

echo gettext("Hello");                       //output: Hello

这是文件夹结构:

locale
     --> French_Canada.1252
        --> LC_MESSAGES
            --> messages.po
            --> messages.mo

最后PO文件:

msgid ""
msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: 2016-02-10 14:01-0500\n"
"PO-Revision-Date: 2016-02-10 14:01-0500\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: fr_CA\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.8.2\n"
"X-Poedit-Basepath: ../../..\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Poedit-SearchPath-0: .\n"

#: test.php:11
msgid "Hello"
msgstr "Bonjour"

以下是我尝试的内容:
1)卸载64位WAMP并在其位置安装32位WAMP。
2)使用不同的语言环境代码,如fr_CA,fr_FR,fr。 fr是唯一被识别的但我仍然遇到同样的问题(即使将文件夹重命名为fr) 3)将代码集更改为1252和Windows-1252(在php文件和PO文件中)
4)每次更改后重新启动所有服务

1 个答案:

答案 0 :(得分:0)

使用GetText类:https://github.com/oscarotero/Gettext 并在本地或网络上以不同方式加载.po文件。

use Gettext\Translator;
use Gettext\GettextTranslator;

$locale = !empty($_GET['locale']) ? $_GET['locale'] : Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']); 
$_SESSION['locale'] = $locale;
putenv("LC_ALL=$locale");
setlocale(LC_ALL, $locale);
$domain = 'traduction';

if(strstr($_SERVER['HTTP_HOST'], '127.0.0.1')) {

    $t = new Translator();

    //Create a Translations instance using a po file
    $translations = Gettext\Translations::fromPoFile('locale/'.$locale.'/LC_MESSAGES/'.$domain.'.po');
    $t->loadTranslations($translations);


} else {

    //Create the translator instance
    $t = new GettextTranslator();

    //Set the language and load the domain
    $t->setLanguage($locale);
    $t->loadDomain($domain, 'Locale');

}

//If you want use the global functions
$t->register();

echo __('Pomme'); // "Apple"
echo n__('%d fenetre', '%d fenetres', 2, 2); // "2 windows"