Gettext不翻译每个字符串

时间:2015-08-04 08:53:49

标签: utf-8 gettext php-gettext

我正在使用带有.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)。

我能注意到的事情:

  • 翻译没有utf-8字符的短字符串。
  • 长字符串或包含utf-8字符(法语口音)不会翻译...但我找到了一个没有重音的短字符串示例,也没有翻译过......(没有找到其他示例)。< / LI>

我根据我的服务器设置了语言环境(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

我尝试了很多解决方案,但没有人工作:

  • 尝试其他语言环境,例如:“en_US”,“en_US.utf8”,“en_US.utf-8”......
  • putenv('LANG = fra'),putenv('LC_ALL = fra')...
  • 使用Notepad ++强制生成.mo文件的UTF-8编码。

任何解决方案?是否存在Apache或PHP或Gettext的问题......

1 个答案:

答案 0 :(得分:0)

我终于找到了答案!感谢该帖子(法语帖子):solution

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

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

msgfmt --no-hash default.po -o default.mo

我希望PoEdit自己做,但我没有找到任何类似的设置......