Gettext不在Debian 10中翻译PHP

Gettext不在Debian 10中翻译PHP,php,gettext,Php,Gettext,我正在尝试本地化我的网站,它位于运行LEMP Debian 10(PHP7.3.27-1~deb10u1)的VPS中。我花了一天的时间来解决它为什么不工作,但没有成功 我的项目具有以下结构: MY_PROJECT_NAME - locale - en_GB LC_MESSAGES en_GB.mo en_GB.po - es_ES LC_MESSAGES

我正在尝试本地化我的网站,它位于运行LEMP Debian 10(PHP7.3.27-1~deb10u1)的VPS中。我花了一天的时间来解决它为什么不工作,但没有成功

我的项目具有以下结构:

MY_PROJECT_NAME
   - locale
       - en_GB
            LC_MESSAGES
               en_GB.mo
               en_GB.po
       - es_ES
            LC_MESSAGES
               es_ES.mo
               es_ES.po
   - index.php
文件index.php包含以下代码:


文件es_es.po的内容如下:

msgid ""
msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: 2021-05-28 00:19-0500\n"
"PO-Revision-Date: 2021-05-28 01:54-0500\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.4.3\n"
"X-Poedit-Basepath: .\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Language: es_ES\n"

msgid "hello"
msgstr "Hola mundo"
文件en_GB.po包含以下内容:

msgid ""
msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: 2021-05-28 00:16-0500\n"
"PO-Revision-Date: 2021-05-28 01:54-0500\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.4.3\n"
"X-Poedit-Basepath: .\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Language: en_GB\n"

msgid "hello"
msgstr "Hello word"
这两个文件都已使用POedit编译,以生成正确的.mo文件

此外,我还通过
sudodpkg-reconfigurelocales
将区域设置添加到系统中。命令
locale-a
的输出如下:

C
C.UTF-8
de_DE.utf8
en_GB.utf8
en_US.utf8
es_ES.utf8
it_IT.utf8
ja_JP.utf8
POSIX
pt_BR.utf8
每当我运行php代码检查翻译是否有效时:
index.php?language=en_GB
index.php?language=es\u es

我得到输出:

bool(true)
en_GB
hello


分别。我错过了什么?日志中没有错误,我已重新启动服务器以确保这不是缓存问题,我还尝试了index.php配置的几种变体,但没有成功。

我认为混淆之处在于,您使用的是基于语言的动态域,而域是固定的,表示翻译的文件名

因此,首先,按如下方式重新组织文件

MY_PROJECT_NAME
   - locale
       - en_GB
            LC_MESSAGES
               messages.mo
               messages.po
       - es_ES
            LC_MESSAGES
               messages.mo
               messages.po
   - index.php
正确重命名文件后,您可以将$domain设置为
messages
,而不是语言

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

这将解决您的问题。还要仔细检查路径是否正确,根据您调用index.php文件的方式,您可能希望从相对路径
/locale/
切换到使用
\uuuu DIR\uuuu

我通过使用
sudo dpkg重新配置locales>安装其他语言解决了这个问题

脚本请求
en_GB
时,未设置区域设置
en_GB.utf8


debian的
sudo dpkg Reconfigue locales
屏幕中没有简单的
en_GB
,所需的区域设置显示为
en_GB ISO-8859-1

setlocale
将返回其设置的区域设置,如果无法选择,则返回false。您可以检查该函数返回的内容并将值发布在此处吗。这将有助于确定问题的原因。我只是通过运行“setlocale(LC_ALL,es_es”);print(strftime(“%A%e%B%Y”,time());”进行了检查,但没有效果(未设置本地化日期),但我尝试运行了“setlocale(LC_ALL,es_es.UTF-8”);print(strftime(“%A%e%B%Y”,time());”这次本地化日期设置正确。@mario,这是一个错误,文件夹“locale”是小写的。@Arnold我相信代码没有设置locale。我附加了一行
echo setlocale(LC_ALL,NULL)
位于index.php文件的最后一行之后,当我运行该文件时,它将显示为空。但是,如果我运行
index.php.php?language=es_es.UTF-8
,则底部会出现一行“es_es.UTF-8”。我想使用dynamic domain,因为我将创建多个翻译,所有语言的名称都相同可能会让我感到困惑。行
var_dump(文件_存在(“./locale/$language/LC_MESSAGES/$language.mo”)检查.mo文件是否存在并由代码找到。不过我还是会测试你的代码,看看它是否有效,谢谢。
$domain = 'messages';
bindtextdomain($domain, "./locale/");
textdomain($domain);
bind_textdomain_codeset($domain, 'UTF-8');