我正在尝试翻译WP主题。我有这段代码:
$translation = __( get_color(), 'textdomain' );
它有效,我从get_color()函数动态获取颜色,并且转换得很好。但是,当我使用“主题检查”插件时,我收到此代码的错误。
我需要改用它:
$translation = sprintf( __( '%s', 'textdomain' ), get_color() );
但是在那种情况下我的占位符%s没有翻译,我得到原始颜色名称(未翻译)。
我做错了什么?谢谢。
答案 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
);