Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GetText和PO文件不适用于XAMPP、PHP7.3_Php_Gettext_Po - Fatal编程技术网

GetText和PO文件不适用于XAMPP、PHP7.3

GetText和PO文件不适用于XAMPP、PHP7.3,php,gettext,po,Php,Gettext,Po,我知道有很多帖子都是关于同一个问题的,但我真的搞不懂 使用PHP7.3.23在OSX上运行XAMPP PHP snipet: <?php $language = "fr_CA"; putenv("LANGUAGE=".$language); //if(!defined('LC_ALL')) putenv('LC_ALL=' . $language); $setlocale = setlocale(LC_ALL, $language); $domain

我知道有很多帖子都是关于同一个问题的,但我真的搞不懂

使用PHP7.3.23在OSX上运行XAMPP

PHP snipet:

<?php
$language = "fr_CA";
putenv("LANGUAGE=".$language);
//if(!defined('LC_ALL')) putenv('LC_ALL=' . $language);
$setlocale = setlocale(LC_ALL, $language);
$domain = "textdomain";
$bindtextdomain = bindtextdomain($domain, realpath(dirname(__FILE__)."/locale"));
$textdomain = textdomain($domain);
bind_textdomain_codeset($domain, 'UTF-8');

var_dump($setlocale); // Returns : string(5) "fr_CA"
var_dump($bindtextdomain); // Returns : string(57) "/ABSOLUTE_PATH_TO_WEBSITE/locale"
var_dump($textdomain); // Returns : my textdomain

echo _("Ceci est un test"); // Returns : the same (instead of "TEST REUSSI")
文件夹结构如下所示:

locale/fr_CA/LC_MESSAGES/textdomain.po  and .mo

区域设置存在(如果我查找区域设置-a),并尝试重新启动Apache。我没有主意了。

您需要在通话中添加textdomain:

//不好
echo(“Ceci测试”);
//这会有用的!
echo($domain.\004.“Ceci测试”);
现在将textdomain作为
msgctxt“textdomain”
添加到您的PO文件中并保存它

#: _test.php:7 _test_locale.php:18
msgctxt "textdomain" # Add this
msgid "Ceci est un test"
msgstr "TEST REUSSI"
请记住,
$domain
必须与
msgctxt
值匹配


此答案改编自“gmail.com上的kingjackal”对PHP官方文档的评论,可以查看

您需要在通话中添加textdomain:

//不好
echo(“Ceci测试”);
//这会有用的!
echo($domain.\004.“Ceci测试”);
现在将textdomain作为
msgctxt“textdomain”
添加到您的PO文件中并保存它

#: _test.php:7 _test_locale.php:18
msgctxt "textdomain" # Add this
msgid "Ceci est un test"
msgstr "TEST REUSSI"
请记住,
$domain
必须与
msgctxt
值匹配


这个答案是根据“gmail.com上的kingjackal”的PHP官方文档评论改编的,可以查看

问题出在哪里?没有翻译。原始字符串打印出来。你确定这不是简单的问题,比如权限问题吗?也许PHP进程无法读取.mo文件?问题是什么?没有翻译。原始字符串打印出来。你确定这不是简单的问题,比如权限问题吗?也许PHP进程无法读取.mo文件?非常感谢您的回复。但当我尝试此操作时,它会回显:“textdomain Ceci est un test”和msgctxt“textdomain”已正确添加到po文件中(以及之后生成的mo文件)。我的文件夹结构可行吗?是的,我想可行。为了解决这个问题,我创建了一个
test.php
文件,然后创建了一个文件夹结构,它与您提供的
.po
路径完全相同,并将其编译为
.mo
,授予了nginx对所有这些文件的组访问权限。我必须安装法语语言(我没有)。直到这里得到和你一样的结果。然后,我将代码更改为上面的代码,并且成功了。我还使用示例中的
gettext
函数和我自己的语言(pt_BR.utf8)进行了尝试。当我运行locale-a时,列表中确实有fr_CA,fr_CA.utf8,所以很可能安装了它。。。我不知道该往哪里看:(msgctxt与textdomain无关,但它用于区分两条消息,它们具有相同的msgid,但根据上下文有不同的翻译(想想“coin”,它可以是名词或动词,根据上下文,翻译成德语的“munze”或“prägen”).textdomain是将两个不同程序或库的翻译分开,并匹配要使用的.mo文件的名称。非常感谢您的回复。但当我尝试此操作时,它会回显:“textdomain Ceci est un test”和msgctxt“textdomain”已正确添加到po文件中(以及之后生成的mo文件).我的文件夹结构可行吗?是的,我想是的。为了解决这个问题,我创建了一个
test.php
文件,然后创建了一个文件夹结构,它与您提供的
.po
路径完全相同,并将其编译成
.mo
,为所有这些文件授予nginx的组访问权限。我必须安装法语lang(我没有)。在此之前,我得到了与您相同的结果。然后我将代码更改为上面的代码,它成功了。我还使用示例中的
gettext
函数和我自己的语言(pt_BR.utf8)进行了尝试。所有的结果都是一样的。当我运行locale-a时,我的列表中确实有fr_CA,fr_CA.utf8,所以它很可能已经安装了……我不知道该去哪里找了:(msgctxt与textdomain无关,但它用于区分两条消息,它们具有相同的msgid,但基于上下文的不同翻译(想想“coin”),可以是名词,也可以是动词,根据上下文,翻译成德语,可以是“Münze”或“prägen”)。textdomain是将两个不同程序或库的翻译分开的,并与要使用的.mo文件的名称相匹配。