【问题标题】:How to load language with gettext in PHP?如何在 PHP 中使用 gettext 加载语言?
【发布时间】:2009-09-20 01:33:23
【问题描述】:

我在 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

即使我正在尝试加载默认的英语语言文件,我已经更改了文件中的一些文本以确保它是从语言文件中读取的,并且目前它只显示默认文本而不进行翻译,我认为我可能走错了路

【问题讨论】:

标签: php gettext poedit


【解决方案1】:

我终于让它工作了,我在这里发帖所以也许它可以帮助其他人,我认为它的记录方式有点令人困惑。

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

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

在上面的bindtextdomain函数中,第一个参数是.po语言文件的名称减去扩展名。第二个参数是文件夹的路径,这是有点棘手/未记录的地方......在您在这里设置的文件夹中,您必须为每种语言创建一个文件夹,其中包含 2 位国家代码,然后在这个国家代码中文件夹我必须添加这个名为 LC_MESSAGES 的文件夹,在 LC_MESSAGES 内是您的 default.po 文件所在的位置。

这是我让它工作的唯一方法,有点令人困惑,因为 lang 文件夹的路径没有提到这里的粗体部分:

langfolder/fr_FR/LC_MESSAGES/default.po

这仍然很奇怪,default.po 对我有用,但如果我在上面的代码中将其更改为其他内容,然后更改 .po 和 .mo 文件的文件名以匹配它,它将不再起作用,只有为我使用 default 名称,我开始认为 gettext 可能会在幕后进行某种缓存

【讨论】:

  • gettext 有一些缓存,因此如果您更改 .mo 文件,您通常需要重新启动 Apache。
  • 这对我不起作用,我需要将 .utf8 添加到 $locale 并且它起作用了。
【解决方案2】:

我怀疑这是你的路。

“/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 但在这里我认为它意味着不同的东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
相关资源
最近更新 更多