【发布时间】:2021-05-28 07:17:36
【问题描述】:
我正在尝试本地化我的网站,它位于运行 LEMP Debian 10 (PHP 7.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 的代码如下:
<?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 配置的几种变体,但均未成功。
【问题讨论】:
-
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 我相信代码没有设置语言环境。我在 index.php 文件的最后一行之后附加了
echo setlocale(LC_ALL,NULL);行,当我运行文件时它为空。但是,如果我运行index.php.php?language=es_ES.UTF-8,底部会出现“es_ES.UTF-8”行。