用__()和sprintf()翻译WP

时间:2016-04-30 15:11:41

标签: wordpress internationalization gettext translate

我正在尝试翻译WP主题。我有这段代码:

$translation = __( get_color(), 'textdomain' );

它有效,我从get_color()函数动态获取颜色,并且转换得很好。但是,当我使用“主题检查”插件时,我收到此代码的错误。

我需要改用它:

$translation = sprintf( __( '%s', 'textdomain' ), get_color() );

但是在那种情况下我的占位符%s没有翻译,我得到原始颜色名称(未翻译)。

我做错了什么?谢谢。

4 个答案:

答案 0 :(得分:4)

echo sprintf(__("text %s", 'your__text_domain'), $data);

答案 1 :(得分:1)

一个。,

在您的代码中:

$translation = sprintf( __( '%s', 'textdomain' ), get_color() );

__()函数会检查字符串'%s'的转换。 - 你可能没有翻译 - 然后替换'%s'结果为get_color()。因此get_color()的值永远不会通过翻译函数。

我不确定这里有什么正确的解决方案,也许在这种情况下忘记主题检查。

答案 2 :(得分:1)

许多提取可翻译字符串的翻译工具会查找字符串文字,如下所示:

$translation = __( 'red', 'textdomain' );

可以肯定的是,主题检查插件会提醒您动态字符串不会被此类工具提取。这是因为在提取过程中不会执行代码,因此表达式get_color()将不会被计算为可翻译的字符串。

如果您不关心与字符串提取工具的兼容性,那么只需按照您的第一个示例保留您的代码(第二个示例是错误的,如已经指出的那样)。

如果您确实希望您的代码使用翻译工具,那么我建议您创建一个包含所有可能颜色值的虚拟 PHP文件。 (假设列表是有限的)。您的文件看起来像这样:

<?php
__('red', 'textdomain' );
__('blue', 'textdomain' );
// and so on..

然后,如果你想停止实际的翻译调用产生“主题检查”错误,你将不得不将它重构成一些不会被拾取的东西。大多数提取器都会错过这样的东西:

$translation = call_user_func( '__', get_color(), 'textdomain' );

*值得注意的是,主题检查的作者是WordPress的核心撰稿人,对doing WordPress i18n correctly非常直言不讳。

答案 3 :(得分:1)

我很惊讶没有人提到“翻译器”注释,该注释告诉翻译器sprintf中的每个变量是什么。例子:

sprintf(
    /* translators: %s: Name of a city */
    __( 'Your city is %s.', 'my-plugin' ),
    $city
);

sprintf(
     /* translators: 1: Name of a city 2: ZIP code */
    __( 'Your city is %1$s, and your zip code is %2$s.', 'my-plugin' ),
    $city,
    $zipcode
);

请参阅:https://developer.wordpress.org/plugins/internationalization/how-to-internationalize-your-plugin/#variables