无法使用gettext检索.mo文件中的翻译后的字符串

时间:2018-11-15 09:50:49

标签: php locale gettext setlocale

我正在尝试建立一个干净的环境来测试php的gettext。我从其中一个示例分叉并从此处开始,但未能使其正常工作: https://github.com/yookoala/gettext-example

(如果需要,请克隆源代码并进行自我测试)

PHP脚本的主要部分:

<?php
// set locale to either first argument or the $_GET['locale']
$localeToSet = $argv[1] ?? $_GET['locale'] ?? 'zh_HK.utf8';
if (($locale = setlocale(LC_ALL, [
    $localeToSet,
    "$localeToSet.utf8",
    "$localeToSet.utf-8",
    "$localeToSet.UTF8",
    "$localeToSet.UTF-8",
])) === false) {
    throw new Exception($localeToSet . ' is not supported in this system');
}

bindtextdomain('messages', 'locale');

textdomain('messages');

printf("locale: %s - \n", $locale);
printf(_("Hello, %s, it is nice to see you today.\n"), "Vic");

locale/zh_HK/LC_MESSAGES/messages.po文件:

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR Codegroove.net
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid   ""
msgstr  "Project-Id-Version: Codegroove.net Example Translations 0.0.1\n"
        "Report-Msgid-Bugs-To: vmc@codegroove.net\n"
        "POT-Creation-Date: 2010-05-28 06:18-0500\n"
        "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
        "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
        "Language-Team: LANGUAGE <LL@li.org>\n"
        "MIME-Version: 1.0\n"
        "Content-Type: text/plain; charset=UTF-8\n"
        "Content-Transfer-Encoding: 8bit\n"

#, php-format
msgid   "Hello, %s, it is nice to see you today.\n"
msgstr "你好,%s,很高興今日與你會面。\n"

CLI和PHP测试服务器均无法显示翻译后的文本(如预期的那样)。它只是显示原始消息。

这里有人知道我的设置有什么问题吗?还是我该如何找到问题所在?

1 个答案:

答案 0 :(得分:0)

还有gettext的命令行版本。试试这个:

TEXTDOMAIN=messages TEXTDOMAINDIR=locale LC_ALL=zh_HK.UTF-8 gettext 'Hello, %s, it is nice to see you today.
>'

代替换行符,您必须按Enter,然后添加结束引号。 >来自您的外壳。

行得通吗?然后,您知道问题出在代码中。如果不起作用,则问题出在您的设置和本地环境中。尝试查看gettext会考虑哪些目录和文件,例如使用strace左右。

其他可能的错误:

  1. 翻译是从mo文件而不是po文件中检索的。是否存在?尝试msgunfmt locale/zh_HK/LC_MESSAGES/messages.mo
  2. 尝试使用bindtextdomain('messages', '/path/to/locale');指定语言环境目录的绝对路径
  3. 您使用Windows吗?

实际上使用什么语言环境?您没有发布脚本的输出。