Utf 8 Gettext不翻译每个字符串

Utf 8 Gettext不翻译每个字符串,utf-8,gettext,php-gettext,Utf 8,Gettext,Php Gettext,我正在使用PHP Gettext和.mo文件(使用PoEdit)将法语(fr_fr.UTF-8)翻译成英语(en_US.UTF-8),它工作得非常好,但并不是所有的字符串都被翻译了!我不是说口音没有用UTF-8正确翻译,有些整条字符串就是没有翻译 我已经从所有PHP文件中提取了要翻译的法语字符串-u(“stringtotranslate”)-感谢shell脚本: find . -iname "*.php" | xargs xgettext -j --from-code=UTF-8 -o loca

我正在使用PHP Gettext和.mo文件(使用PoEdit)将法语(fr_fr.UTF-8)翻译成英语(en_US.UTF-8),它工作得非常好,但并不是所有的字符串都被翻译了!我不是说口音没有用UTF-8正确翻译,有些整条字符串就是没有翻译

我已经从所有PHP文件中提取了要翻译的法语字符串-u(“stringtotranslate”)-感谢shell脚本:

find . -iname "*.php" | xargs xgettext -j --from-code=UTF-8 -o locale/default.pot
已使用所有字符串正确生成了一个默认值.pot,没有丢失任何字符串。从这个.pot文件中,我为英语版本创建了一个默认的.po文件。po在UTF-8中,我需要它们的PHP文件也在UTF-8中(没有BOM)

缓存没有问题:每次修改时,我都会对.mo文件进行不同的命名(“默认值”+filemtime)

我能注意到的:

  • 翻译没有utf-8字符的短字符串
  • 长字符串或包含utf-8字符(法语重音)的字符串不会被翻译。。。但是我发现了一个没有重音的短字符串的例子,没有翻译过。。。(未找到其他示例)
我已经根据我的服务器设置了区域设置(Apache1.3.37,PHP4.4.4,--使用gettext)。根据在网站上单击的标志,区域设置是动态的,以下是英文版本:

putenv('LANGUAGE=eng');
setlocale(LC_ALL, 'en_US.UTF-8');
bindtextdomain('default', './locale');
bind_textdomain_codeset('default', 'UTF-8');
textdomain('default');
正如我所说的,一些字符串被正确地翻译成英语,但不是每个字符串

以下是英文版的网站:

以下是.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."
(...)
#一些描述性的标题。
#版权(C)软件包版权所有者的年份
#此文件在与包相同的许可证下分发。
#第一作者,年。
#
msgid“”
msgstr“”
“项目Id版本:Librarie des Carrés\n”
“将Msgid错误报告给:\n”
“罐创建日期:2015-08-03 14:57+0200\n”
“采购订单修订日期:2015-08-04 10:08+0200\n”
“最后一个转换器:\n”
“语言团队:\n”
“语言:en\n”
“MIME版本:1.0\n”
“内容类型:文本/普通;字符集=UTF-8\n”
“内容传输编码:8位\n”
“X-Generator:Poedit 1.8.2\n”
“复数形式:nplurals=2;复数=(n!=1);\n”
“X-Poedit-SourceCharset:UTF-8\n”
#:关于我们。php:10关于我们。php:31
#,php格式
msgid“”
《科学和航海史》一书的开头部分,诺特尔证券交易所是一家多元化的大公司:
%slivres illustrés%s,%shistoire%s,%sagraculture%s,%sjardinage et architecture%s,%smédecine%s,%sbibliophilie%s
“我的作品非常珍贵。”
msgstr“”
“最初我们专注于旅游和科学,现在我们的股票基本上是多样化的,包括文学和文学”
%s丛书%s、%s历史%s、%s农业%s、%s花园和建筑%s、%s中药%s、%s嗜菌%s和
%s是从西元到三十世纪的书籍%s。“
(...)
我尝试了许多解决方案,但没有一个有效:

  • 尝试其他区域设置,例如:“en_US”、“en_US.utf8”、“en_US.utf-8”
  • putenv('LANG=fra')、putenv('LC_ALL=fra')
  • 使用记事本++对生成的.mo文件强制进行UTF-8编码

有什么解决办法吗?Apache、PHP或Gettext是否存在问题我终于找到了答案!感谢这篇文章(法国文章):

Gettext似乎不支持msgid中正确的重音或UTF-8字符(或类似的东西)

解决方案是使用“-no hash”选项生成.mo文件:


我想PoEdit自己做,但我没有找到任何这样的设置…

我终于找到了答案!感谢这篇文章(法国文章):

Gettext似乎不支持msgid中正确的重音或UTF-8字符(或类似的东西)

解决方案是使用“-no hash”选项生成.mo文件:


我想让PoEdit自己做,但我没有发现任何这样的设置…

一个更简单的解决方案是在PoEdit的xgettext高级设置中添加
--no hash
选项,使其在编译时自己完成。一个更简单的解决方案是在PoEdit的xgettext高级设置中添加
--no hash
选项,让它在编译时自己完成。
msgfmt --no-hash default.po -o default.mo