__()或_e()语言翻译字符串内的HTML


24

构建翻译字符串的正确方法是什么?

例如,

echo __( 'Hello ' . $first . ' you owe me money.' );
echo __( '<div><p>Top: ' . $t_margin . '</p>' . '<p>Bottom: ' . $b_margin . '</p></div>' )

是否可以添加字符串和/或HTML,还是应该先完成然后再进行翻译,例如:

$html = '<div><p>Top: ' . $t_margin . '</p>' . '<p>Bottom: ' . $b_margin . '</p></div>';
echo __( $html ); 

Answers:


41

函数中有第二个参数__()。应该将其设置为您用于插件或主题的域。在下面的示例中,我使用'text_domain'。您的域字符串应该是唯一的。它不应与任何其他域字符串匹配。不使用文本域参数默认为'default'WordPress域名。请参阅链接查看更多细节。

始终使用字符串('text_domain')。切勿在字符串中使用变量,函数或常量。如果没有该字符串,大多数(全部?)翻译程序将看不到它。

您的代码:

echo __( 'Hello ' . $first . ' you own me money.' );

不要在字符串中包含变量。

更好的方法:

echo sprintf( __( 'Hello %s you own me money.', 'text_domain' ), $first );

要不就:

printf( __( 'Hello %s you own me money.', 'text_domain' ), $first );

%s占位符告诉翻译人员,一个字符串在那里发生。使用%d的号码。还有其他占位符

(此句子的语法错误是英语。请根据您的意思使用'Hello %s, you owe me money.''Hello %s, you own my money.'。)


您的代码:

$html = '<div><p>Top: ' . $t_margin . '</p>' . <p>Bottom: ' . $b_margin . '</p></div>';

不要翻译HTML。任何语言都相同。

更好的方法:

$html = sprintf( '<div><p>%s</p><p>%s</p></div>', __( 'Top: ', 'text_domain' ) .  $t_margin, __( 'Bottom: ', 'text_domain' ) . $b_margin );

或将其分为多行:

$html = sprintf(
    '<div><p>%s</p><p>%s</p></div>',
    __( 'Top: ', 'text_domain' ) .  $t_margin,
    __( 'Bottom: ', 'text_domain' ) . $b_margin
);

如果不清楚“ 顶部”和“ 底部”是什么,则可以使用_x()来解释这些术语的上下文。


您可以在这里找到其他翻译案例:国际化:您做错了


您说不要翻译HTML。我可能会指出,它没有被翻译,而是在现有的预翻译字符串表中查找。如果翻译器没有删除字符串,则在字符串中包含HTML不会有任何区别。实际上,在某些情况下,它比正则表达式搜索和替换具有更好的性能。
2013年

无关,但值得注意的是:textdomain必须是文字字符串,不能是变量/常量/属性。
brasofilo

@brasofilo,该建议写在顶部附近的答案中,但需要重复。我在为客户编写的几个自定义插件中犯了这个错误。
查尔斯·克拉克森

为+1 sprintf()。这就是在可翻译字符串中包含HTML的方法。
helgatheviking

sprintf()除了看起来更简洁以外,我看不到如何使用辅助功能。如果你有HTML里面一句话Some text with a <strong>strong</strong> word inside.怎么可能作为一个整体的句子翻译并没有转化Some text with astrongword inside单独(这是没有意义的)。
phpheini

4

因为已经说过了,所以我不会解决字符串中变量的问题。

您想使字符串保持静态,这意味着内容不会更改。您还想避免不必要的HTML。

__( '<p>Hello World!</p>' );
__( '<h1>Hello World!</h1>' );

上面将在您的表中占据两行,基本上是相同的文本。它们可以重写为:

'<p>' . __( 'Hello World!' ) . '</p>'
'<h1>' . __( 'Hello World!' ) . '</h1>'

将其减少为一行。

有时文本中的HTML是不可避免的。举个例子:

__( 'You currently owe <b>%s</b> dollars' );

由于语言是语法的,因此拆分文本会对翻译人员造成问题。

经验法则。句子中间的HTML文本格式标签也可以。以HTML开头和结尾的句子只会浪费空间。


在最后一个示例中,您可以将粗体标签包裹在insert的参数周围"<b>$string</b>"。然后就可以使用了'You currently owe %s dollars'。但是,如果将其与_n()需要%d占位符的函数一起使用,则可能需要保留它。
查尔斯·克拉克森

@CharlesClarkson好的电话。也许我应该省略%s它以使其更加清晰。
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.