在Windows 7 home和PHP 7.0.8上使用gettext进行国际化失败

在Windows 7 home和PHP 7.0.8上使用gettext进行国际化失败,php,php-gettext,Php,Php Gettext,在工作中,我们决定将我们的网站翻译成另外3种语言,我一直在研究如何做到这一点。我花了一天的大部分时间搜索google和stackoverflow,尝试各种不同的解决方案,但我无法让它工作 我开始担心在Windows7家庭版(我的开发机器)中不可能做到这一点 回声应该转换为“工作”,但它不是。还是我不明白这个概念 ---更多信息-------------------------------------------------------- 我已经做了一些更改并重新编译了mo文件,这就是它现在的样子

在工作中,我们决定将我们的网站翻译成另外3种语言,我一直在研究如何做到这一点。我花了一天的大部分时间搜索google和stackoverflow,尝试各种不同的解决方案,但我无法让它工作

我开始担心在Windows7家庭版(我的开发机器)中不可能做到这一点

回声应该转换为“工作”,但它不是。还是我不明白这个概念

---更多信息--------------------------------------------------------

我已经做了一些更改并重新编译了mo文件,这就是它现在的样子

// C:\Apache24\htdocs\locale\en_GB\LC_MESSAGES\messages.mo
// C:\Apache24\htdocs\locale\en_GB\LC_MESSAGES\messages.po
msgid ""
msgstr ""
"Project-Id-Version: iArbete 1.0.0\n"
"Report-Msgid-Bugs-To: ******** \n"
"Last-Translator: ********\n"
"Language: en_GB\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

msgid "workIng"
msgstr "iArbete"

msgid "Menu"
msgstr "Meny"


// C:\Apache24\htdocs\index.php
if(isset($_GET["locale"]))
{
    $locale = $_GET["locale"];
}
else
{
    $locale = 'sv_SE';
    $locale = 'en_GB';
//  $locale = 'ar_AE';
}

putenv("LC_ALL=$locale");
setlocale(LC_ALL, $locale);
//  echo getenv("LC_ALL");

$domain = 'messages';
bindtextdomain($domain, './locale');
textdomain($domain);
bind_textdomain_codeset($domain, 'UTF-8');

echo _("workIng");
echo _("Menu");
msgid“workIng”
被翻译成“iArbete”
msgid“菜单”
未转换为“菜单”

发生了什么事?感觉很奇怪,只有第一个词被翻译了。所以我重新整理了po中的单词并重新编译,但仍然“工作”是唯一被翻译的单词


如果有人想看一下,我已经将我的文件上传到google drive。

您需要使用
msgfmt
将您的PO文件转换为MO文件:

“.PO”文件中的字母PO表示可移动对象,以区分 它来自“.mo”文件,其中mo代表机器对象。[……]

采购订单文件意味着由人工读取和编辑,并与 给定包的每个原始可翻译字符串及其 特定目标语言的翻译。[……]

MO文件是由程序读取的,本质上是二进制文件。[……]

采购订单文件完成且可靠后,“msgfmt”程序即告启动 用于将PO文件转换为面向机器的格式,可能 通过计算机程序对译文进行高效检索 包,在运行时需要时(请参阅)。有关的所有执行模式的详细信息,请参见 “msgfmt”计划


-GNU gettext手册,

你的问题是什么?为什么它不起作用?如果你在
bindtextdomain
之前做了
var\u转储(\uu\u DIR\uu)
,它会显示包含
locale
子目录的目录吗?您的
messages.mo
文件的完整路径是什么?是的
var\u dump(\uuuuu DIR\uuuuuuuu)
=string(18)“C:\Apache24\htdocs”
C:\Apache24\htdocs\locale\en\u GB\LC\MESSAGES\MESSAGES.mo
C:\Apache24\htdocs\locale\en\u GB\LC\MESSAGES.po
我注意到mo文件没有编码为
utf-8
,而是
ANSI
,这可能很正常,我不知道。我尝试了一个在线编译器,这给我留下了一个
ANSI
mo文件。这些行是po文件中标题的一部分
“内容类型:text/plain;charset=UTF-8\n”
“内容传输编码:8bit\n”这可能与我的问题有关吗?我已经这样做了。没关系。因为我无法显示其中的内容,因为它是编译的,所以我发布了我的消息源。poI认为可能是缓存的原因。但我每次改变都会清理缓存,所以我不知道,再也不知道了。。。也许是其他文件。但是,当我更改po文件中的某些内容时,我会删除并重新组合mo文件。
// C:\Apache24\htdocs\locale\en_GB\LC_MESSAGES\messages.mo
// C:\Apache24\htdocs\locale\en_GB\LC_MESSAGES\messages.po
msgid ""
msgstr ""
"Project-Id-Version: iArbete 1.0.0\n"
"Report-Msgid-Bugs-To: ******** \n"
"Last-Translator: ********\n"
"Language: en_GB\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

msgid "workIng"
msgstr "iArbete"

msgid "Menu"
msgstr "Meny"


// C:\Apache24\htdocs\index.php
if(isset($_GET["locale"]))
{
    $locale = $_GET["locale"];
}
else
{
    $locale = 'sv_SE';
    $locale = 'en_GB';
//  $locale = 'ar_AE';
}

putenv("LC_ALL=$locale");
setlocale(LC_ALL, $locale);
//  echo getenv("LC_ALL");

$domain = 'messages';
bindtextdomain($domain, './locale');
textdomain($domain);
bind_textdomain_codeset($domain, 'UTF-8');

echo _("workIng");
echo _("Menu");