错误:翻译 wordpress 主题时,msgstr 不是有效的 PHP


Error: msgstr is not a valid PHP when translating a wordpress theme

我正在尝试使用Poedit翻译WordPress的主题。当我尝试翻译字符串% comment无论我是否在翻译中使用%时,我都会收到此错误:

错误:"msgstr"不是有效的PHP格式字符串,与"msgid"不同。
原因:终止指令编号 1 的字符不是有效的转换说明符。

该字符串的资源如下行:

comments_number(
    __( '0 comments' , 'hbthemes' ) ,
    __( '1 comment' , 'hbthemes' ),
    __( '% comments' , 'hbthemes' )
);

我看了一下 gettext 手册,但不明白是什么会导致这些错误。起初我想知道为什么只有一个%可以出现在格式字符串中,但主题本身显示评论计数正确。

编辑

如果我在翻译中使用%%而不是%,错误仍然存在,如果我在 PHP 代码中更改它,我会得到两次注释计数,例如 22而不是2.

更新:

这里的文档说%将被注释数量取代,所以我认为实际问题出在 Poedit 而不是代码上。

问题出在POEdit上,通过使用另一种翻译工具,我得到了我想要的东西。

你到底想完成什么?在我看来,你正在重新发明轮子,并在它上面做错了。它认为你应该使用 sprintf(__('%d comments'(,get_comments_number(((,它想强迫你让它正确。你不应该这样翻译它。我不确定wordpress是否使用gettext本身。如果是,请使用 ngettext('%d comment', '%d comments', get_comments_number(((。这样,它将具有其他语言的正确形式,例如在 1、3 和 5 之间有所不同。

见 http://codex.wordpress.org/Function_Reference/_n也许是这样:

    $localized = _n( "%d comment", "%d comments", get_comments_number(), 'hbthemes' );
    // Not sure how it behaves on number 0, try $localized, $localized, $localized
    comments_number( __('0 comment', 'hbthemes'), $localized, $localized);

问题是Wordpress是如何设计的,它不能很好地翻译。如果您手动删除 po 文件中此字符串之前的 #、php 格式标志,它应该对您有所帮助。它不会尝试验证不是 printf 格式的 sprintf 格式。