我正在使用带有.mo文件的PHP Gettext(使用PoEdit)从法语(fr_FR.UTF-8)翻译成英语(en_US.UTF-8),并且它非常好但不是所有字符串已翻译!我不是在谈论没有用UTF-8正确翻译的口音,有些整个字符串都没有翻译过。
我已经从我的所有PHP文件中提取了法语字符串 - _(“stringtotranslate”) - 感谢shell脚本:
putenv('LANGUAGE=eng');
setlocale(LC_ALL, 'en_US.UTF-8');
bindtextdomain('default', './locale');
bind_textdomain_codeset('default', 'UTF-8');
textdomain('default');
已正确生成所有字符串的 default.pot ,没有人丢失。从那个.pot文件我已经为英文版创建了一个default.po文件。那.po是UTF-8,我需要它们的PHP文件也是UTF-8(没有BOM)。
缓存没有问题:我为每次修改命名.mo文件的方式不同('default_'+ filemtime)。
我能注意到的事情:
我根据我的服务器设置了语言环境(Apache 1.3.37,PHP 4.4.4, - with-gettext)。根据网站上点击的标志,语言环境是动态的,这是英文版本:
# 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."
(...)
正如我所说,有些字符串是用英文正确翻译的,但不是每一根字符串都是正确的。
以下是英文版网站:http://librairiedescarres.com/2015/en/
以下是.po文件的一部分:
typedef union
{
struct
{
char a;
char b;
} Foo;
unsigned int whole;
} MyUnion;
MyUnion _Union;
_Union.Foo.a = 0x23; // assign by element
_Union.Foo.b = 0x45; // assign by element
_Union.whole = 0x6789; // assign at once
我尝试了很多解决方案,但没有人工作:
任何解决方案?是否存在Apache或PHP或Gettext的问题......
答案 0 :(得分:0)
我终于找到了答案!感谢该帖子(法语帖子):solution
Gettext似乎不支持正确的重音符号或msgid中的UTF-8字符(或类似的东西)。
解决方案是使用“--no-hash”选项生成.mo文件:
msgfmt --no-hash default.po -o default.mo
我希望PoEdit自己做,但我没有找到任何类似的设置......