PHP 绑定(bind)文本域失败

标签 php internationalization gettext

我正在尝试在运行 PHP 7.1 的 CentOS 服务器上设置 PHP 国际化

这是我的目录结构:

/home/project/public_html/locale/japanese/LC_MESSAGES/messages.po 
/home/project/public_html/locale/japanese/LC_MESSAGES/messages.mo
/home/project/public_html/index.php

messages.po 包含以下行(除其他外):

"Language: japanese\n"
"Content-Type: text/plain; charset=UTF-8\n"

我有以下代码:

$check_putenv = putenv("LC_ALL=japanese");
if (!$check_putenv) {
    echo "Warning: putenv LC_ALL failed!\n";
}

$check_putenv2 = putenv("LANGUAGE=japanese");
if (!$check_putenv2) {
    echo "Warning: putenv LANGUAGE failed!\n";
}    

$check_locale = setlocale(LC_MESSAGES, 'japanese');
if (!$check_locale) {
    echo "Warning: Failed to set locale japanese!\n";
}
$check_bind = bindtextdomain("messages", "/home/project/public_html/locale");
if (!$check_bind) {
    echo "Warning: Failed to bind text domain!\n";
}
$check_textdomain = textdomain("messages");
if ($check_textdomain !== "messages") {
    echo "Warning: Failed to set text domain!\n";
}

输出为

Warning: Failed to bind text domain!

locale -a 返回(以及其他)

ja_JP
ja_JP.utf8
japanese

知道可能出了什么问题吗?

最佳答案

正如评论中所讨论的,gettext 扩展依赖于包含语言和区域代码的标准区域设置说明符,即 ja_JP 表示“日本的日语”或使用指定编码ja_JP.utf-8。即使有像 japanese 这样的别名,gettext 的 PHP 实现也不接受它。请注意,必须在您的系统上安装并配置区域设置。

语言和区域说明符可以在 IANA language-subtag-registry 中找到

此代码已经适用于日语:

$dir     = $_SERVER['DOCUMENT_ROOT'] . '/locale';
$domain  = 'messages';
$locale  = 'ja_JP.utf8';
$codeset = 'UTF-8';

setlocale( LC_MESSAGES, $locale);
bindtextdomain($domain, $dir);
textdomain($domain);
bind_textdomain_codeset($domain, $codeset);

记住还要将您的目录重命名为locale/ja_JP.utf8。确保您的 .po 文件以正确的编码存储,即本例中的 UTF-8,并包含行

"Content-Type: text/plain; charset=UTF-8\n"

(正如您已经完成的那样)。

关于PHP 绑定(bind)文本域失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54251911/

相关文章:

php - Facebook Graph API - 是否可以获取广告集的 "suggest bid"?

internationalization - 美国英语是唯一具有mmddyyyy格式的语言吗?

java - 将字符串从 EditText 转换为整数会导致应用程序在启动前停止工作

python - 在 Django 模板中使用 urlize 过滤器和 blocktrans 的惯用方法

php - MYSQL - 更新数据库每次都会创建新记录

php - ftp上传不工作

ruby-on-rails - ActiveRecord 错误消息 : translation for fields

php - i18n 无法在 debian 中通过 php-fpm 工作

php - 在 Laravel 中查询集合

eclipse - 无法创建带有外语字符的文件