Gettext 未在 Debian 10 中翻译 PHP

Gettext not translating PHP in Debian 10

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

我的项目结构如下:

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具有以下代码:

<?php

session_start();
$language = "es_ES";

if (isset($_GET['language']))
{
    $language = $_GET['language'];
}

putenv("LANG=" . $language);
putenv("LC_ALL={$language}");
setlocale(LC_ALL, $language);

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

var_dump( file_exists("./locale/$language/LC_MESSAGES/$language.mo" ) ); //bool(true) if exists
echo ('<br/>');
echo $language; //output the lang name
echo ('<br/>');
echo gettext('hello'); //text to be translated

?>

文件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 文件。

此外,我已经通过 sudo dpkg-reconfigure locales 将语言环境添加到系统中。命令 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_ES

我得到输出:

bool(true)
en_GB
hello

bool(true)
es_ES
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/ 切换到使用 __DIR__

我通过使用 sudo dpkg-reconfigure locales 安装其他语言解决了这个问题。

脚本请求 en_GB 时未设置语言环境 en_GB.utf8

debian 的sudo dpkg-reconfigure locales 屏幕中没有普通的en_GB,需要的语言环境显示为en_GB ISO-8859-1