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
。
我正在尝试本地化我的网站,它位于 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
。