如何在PHP中使用gettext加载语言?

如何在PHP中使用gettext加载语言?,php,gettext,poedit,Php,Gettext,Poedit,我已经在poedit中创建了一个语言文件,用于使用PHP gettext函数,现在在我尝试测试它的页面上,我无法让它找到/加载我创建的.po或.mo文件,有人看到我做错了什么吗 $locale = "en_US"; putenv("LC_ALL=$locale"); setlocale(LC_ALL, $locale); bindtextdomain("default", "/includes/locale"); textdomain("default"); //my .po ad .mo f

我已经在poedit中创建了一个语言文件,用于使用PHP gettext函数,现在在我尝试测试它的页面上,我无法让它找到/加载我创建的.po或.mo文件,有人看到我做错了什么吗

$locale = "en_US";
putenv("LC_ALL=$locale");
setlocale(LC_ALL, $locale);
bindtextdomain("default", "/includes/locale");
textdomain("default");

//my .po ad .mo file is located here /includes/locale/en/default.mo

尽管我试图加载默认的英语语言文件,但我已经更改了文件中的一些文本,以确保它是从语言文件中读取的,并且当前它只显示默认文本,而没有进行翻译,我认为我的路径可能是错误的。我终于让它工作了,我在这里发帖,也许它可以帮助其他人,我认为它的记录方式有些混乱

我将在这个演示中使用法语的FR

$locale = "fr_fr";
putenv("LC_ALL=$locale");
setlocale(LC_ALL, $locale);
bindtextdomain("default", "/includes/locale");
textdomain("default");
在上面的
bindtextdomain
函数中,第一个参数是.po语言文件的名称减去扩展名。第二个参数是文件夹的路径,这是有点棘手/未记录的地方。。。在这里设置的文件夹中,您必须为每种语言创建一个带有2位国家代码的文件夹,然后在这个国家代码文件夹中,我必须添加名为
LC\u MESSAGES
的文件夹,在
LC\u MESSAGES
中是您的
默认.po
文件所在的位置

这是我能让它工作的唯一方法,有点混乱,因为lang文件夹的路径没有提到任何关于粗体部分的内容:

langfolder/fr\u fr/LC\u消息/default.po


但是仍然很奇怪,
default.po
对我有效,但是如果我将其更改为上面代码中的其他内容,然后更改.po和.mo文件的文件名以匹配它,它将不再有效,只对我的
default
名称有效,我开始想也许gettext做了一些幕后缓存,我怀疑这是你的路径

“/includes/locale”是主机上的正确目录吗?或者这是相对于什么?注意:您需要完整的路径名,而不是相对于主目录或安装目录。所以可能是这样的:

  • C:/xampp/htdocs/include/locale
  • /var/www/include/locale
  • /home/username/include/locale

找到它的完整目录是什么?

是的,我刚刚尝试了C:\webserver\htdocs\includes\locale是实际路径,我在浏览器中检查了它并加载了它,但它对gettext没有帮助,这很奇怪我有一个小演示,没有完整路径可以正常工作,但它有一堆奇怪的目录名,可能它们是必需的,在php.net上找不到很多关于它的信息,尽管使用正斜杠而不是反斜杠。尽管Windows是\,但像我使用/一样将其放入,让我困惑的是bindtextdomain和textdomain函数,一个域,我想到site.com,但在这里我认为这意味着一些不同的东西gettext有一些缓存,因此如果更改.mo文件,您经常必须重新启动Apache。这对我不起作用,我需要将
.utf8
添加到
$locale
中,结果成功了。这一切都是为了你。