Gettext 不翻译每个字符串
Gettext not translating every string
我正在使用 PHP Gettext 和 .mo 文件(使用 PoEdit)从法语 (fr_FR.UTF-8) 翻译成英语 (en_US.UTF-8),并且它工作得很好但并不是所有的字符串都被翻译!我不是在谈论没有用 UTF-8 正确翻译的重音符号,一些整个字符串都没有翻译。
我已经从我所有的 PHP 文件中提取了要翻译的法语字符串 - _("stringtotranslate") - 感谢 shell 脚本 :
find . -iname "*.php" | xargs xgettext -j --from-code=UTF-8 -o locale/default.pot
一个default.pot已经全部正确生成,没有遗漏一个。从那个 .pot 文件中,我为英文版创建了一个 default.po 文件。 .po 是 UTF-8,我需要的 PHP 文件也是 UTF-8(无 BOM)。
缓存没有问题:我每次修改都不同地命名.mo文件('default_' + filemtime).
我能注意到什么:
- 翻译没有 utf-8 字符的短字符串。
- 长字符串或包含 utf-8 字符(法语口音)未翻译...但我找到了一个没有重音的短字符串示例,也未翻译...(未找到其他示例) .
我已经根据我的服务器设置了语言环境(Apache 1.3.37,PHP 4.4.4,--with-gettext)。语言环境是动态的,具体取决于在网站上单击的标志,这里是英文版本:
putenv('LANGUAGE=eng');
setlocale(LC_ALL, 'en_US.UTF-8');
bindtextdomain('default', './locale');
bind_textdomain_codeset('default', 'UTF-8');
textdomain('default');
正如我所说,一些字符串的英文翻译正确,但不是每个字符串。
这是英文版的网站:http://librairiedescarres.com/2015/en/
这是 .po 文件的一部分:
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: Librairie des Carrés\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-08-03 14:57+0200\n"
"PO-Revision-Date: 2015-08-04 10:08+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.8.2\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Poedit-SourceCharset: UTF-8\n"
#: about-us.php:10 about-us.php:31
#, php-format
msgid ""
"Initialement spécialisé dans l'histoire des sciences et des voyages, notre stock est aujourd'hui largement diversifié : "
"%slivres illustrés%s, %shistoire%s, %sagriculture%s, %sjardinage et architecture%s, %smédecine%s, %sbibliophilie%s, "
"%slivres rares et curieux du XVème au XXème siècle%s."
msgstr ""
"Initially specialised in Travel and Science, our stock is now largely diversified and includes literature and "
"%sillustrated books%s, %shistory%s, %sagriculture%s, %sgardens and architecture%s, %smedicine%s, %sbibliophile%s and "
"%srare books from the XVth to the XXth century%s."
(...)
我尝试了很多解决方案,但没有一个有效:
- 尝试其他语言环境,例如:"en_US"、"en_US.utf8"、"en_US.utf-8"...
- putenv('LANG=fra'), putenv('LC_ALL=fra')...
- 使用 Notepad++ 为生成的 .mo 文件强制使用 UTF-8 编码。
有什么办法吗? Apache 或 PHP 或 Gettext 是否存在问题...?
我终于找到了答案!多亏了 post(法语 post):solution
Gettext 似乎不支持 msgid(或类似的东西)中的正确重音符号或 UTF-8 字符。
解决方案是使用“--no-hash”选项生成 .mo 文件:
msgfmt --no-hash default.po -o default.mo
我希望 PoEdit 自己完成,但我没有找到类似的设置...
我正在使用 PHP Gettext 和 .mo 文件(使用 PoEdit)从法语 (fr_FR.UTF-8) 翻译成英语 (en_US.UTF-8),并且它工作得很好但并不是所有的字符串都被翻译!我不是在谈论没有用 UTF-8 正确翻译的重音符号,一些整个字符串都没有翻译。
我已经从我所有的 PHP 文件中提取了要翻译的法语字符串 - _("stringtotranslate") - 感谢 shell 脚本 :
find . -iname "*.php" | xargs xgettext -j --from-code=UTF-8 -o locale/default.pot
一个default.pot已经全部正确生成,没有遗漏一个。从那个 .pot 文件中,我为英文版创建了一个 default.po 文件。 .po 是 UTF-8,我需要的 PHP 文件也是 UTF-8(无 BOM)。
缓存没有问题:我每次修改都不同地命名.mo文件('default_' + filemtime).
我能注意到什么:
- 翻译没有 utf-8 字符的短字符串。
- 长字符串或包含 utf-8 字符(法语口音)未翻译...但我找到了一个没有重音的短字符串示例,也未翻译...(未找到其他示例) .
我已经根据我的服务器设置了语言环境(Apache 1.3.37,PHP 4.4.4,--with-gettext)。语言环境是动态的,具体取决于在网站上单击的标志,这里是英文版本:
putenv('LANGUAGE=eng');
setlocale(LC_ALL, 'en_US.UTF-8');
bindtextdomain('default', './locale');
bind_textdomain_codeset('default', 'UTF-8');
textdomain('default');
正如我所说,一些字符串的英文翻译正确,但不是每个字符串。
这是英文版的网站:http://librairiedescarres.com/2015/en/
这是 .po 文件的一部分:
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: Librairie des Carrés\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-08-03 14:57+0200\n"
"PO-Revision-Date: 2015-08-04 10:08+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.8.2\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Poedit-SourceCharset: UTF-8\n"
#: about-us.php:10 about-us.php:31
#, php-format
msgid ""
"Initialement spécialisé dans l'histoire des sciences et des voyages, notre stock est aujourd'hui largement diversifié : "
"%slivres illustrés%s, %shistoire%s, %sagriculture%s, %sjardinage et architecture%s, %smédecine%s, %sbibliophilie%s, "
"%slivres rares et curieux du XVème au XXème siècle%s."
msgstr ""
"Initially specialised in Travel and Science, our stock is now largely diversified and includes literature and "
"%sillustrated books%s, %shistory%s, %sagriculture%s, %sgardens and architecture%s, %smedicine%s, %sbibliophile%s and "
"%srare books from the XVth to the XXth century%s."
(...)
我尝试了很多解决方案,但没有一个有效:
- 尝试其他语言环境,例如:"en_US"、"en_US.utf8"、"en_US.utf-8"...
- putenv('LANG=fra'), putenv('LC_ALL=fra')...
- 使用 Notepad++ 为生成的 .mo 文件强制使用 UTF-8 编码。
有什么办法吗? Apache 或 PHP 或 Gettext 是否存在问题...?
我终于找到了答案!多亏了 post(法语 post):solution
Gettext 似乎不支持 msgid(或类似的东西)中的正确重音符号或 UTF-8 字符。
解决方案是使用“--no-hash”选项生成 .mo 文件:
msgfmt --no-hash default.po -o default.mo
我希望 PoEdit 自己完成,但我没有找到类似的设置...