【问题标题】:GetText and PO files not working on XAMPP, PHP 7.3GetText 和 PO 文件不适用于 XAMPP、PHP 7.3
【发布时间】:2021-03-11 16:56:21
【问题描述】:

我知道有很多关于同样问题的帖子,但我真的想不通。

在 OS X 上使用 PHP 7.3.23 运行 XAMPP

PHP 片段:

<?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")

采购订单文件:

"Project-Id-Version: Projet\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-29 10:56-0500\n"
"PO-Revision-Date: 2020-11-29 10:57-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 2.2\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Poedit-KeywordsList: _;__;_e;esc_html__\n"
"X-Poedit-Basepath: ../../..\n"
"X-Poedit-SearchPath-0: .\n"

#: _test.php:7 _test_locale.php:18
msgid "Ceci est un test"
msgstr "TEST REUSSI"

文件夹结构是这样的:

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

语言环境存在(如果我查找语言环境 -a),也尝试重新启动 Apache。我没有想法。

【问题讨论】:

  • 问题出在哪里?
  • 无翻译。原始字符串打印出来。
  • 你确定这不是简单的事情,比如权限问题吗?也许PHP进程无法读取.mo文件?

标签: php gettext po


【解决方案1】:

您需要将文本域添加到您的通话中:

// No good
echo _("Ceci est un test");
// This will work!
echo _($domain . "\004" . "Ceci est un test");

现在在您的 PO 文件中添加文本域为 msgctxt "textdomain" 并保存。

#: _test.php:7 _test_locale.php:18
msgctxt "textdomain" # Add this
msgid "Ceci est un test"
msgstr "TEST REUSSI"

请记住,$domain 必须与 msgctxt 值匹配。

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

【讨论】:

  • 非常感谢您的回复。但是当我尝试这个时,它会回显:“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 与文本域无关,但它用于区分具有相同 msgid 但基于上下文的不同翻译的两条消息(想想“硬币”,它可以是名词或动词,基于上下文,翻译成德语为“Münze”或“prägen”)。文本域用于分隔两个不同程序或库的翻译,并与要使用的 .mo 文件的名称相匹配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 2012-01-16
  • 2013-03-22
  • 2012-03-29
  • 2016-10-19
  • 2017-07-27
  • 2022-06-30
相关资源
最近更新 更多