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

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 ); 


#1 楼

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

始终使用字符串('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年9月15日在7:12

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

–brasofilo
2013年9月15日10:33



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

–查尔斯·克拉克森(Charles Clarkson)
2013年9月15日上午11:27

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

–helgatheviking
2013年9月15日上午11:31

我看不到sprintf()的使用除了可能看起来更干净以外没有其他帮助。如果您的句子中带有HTML,例如某些文本中带有 strong 单词。如何将整个句子翻译成整体而不翻译,而某些文本中带有强,词的单词则单独翻译(没有意义)。

–phpheini
17-6-37在16:56



#2 楼

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

您想使字符串保持静态,这意味着内容不会改变。您还希望避免不必要的HTML。可以将它们重写为:

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


将其减少为一行。

有时文本中的HTML是不可避免的。例如:

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


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

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

评论


在最后一个示例中,您可以将粗体标签包装在插入的 $ string ”参数周围。然后,您可以使用“您当前欠%s美元”。但是,如果将它与需要%d占位符的_n()函数一起使用,则可能需要保留它。

–查尔斯·克拉克森(Charles Clarkson)
2013年9月15日11:36



@CharlesClarkson好的电话。也许我应该省略%s使其更加清晰。

–二十
2013年9月15日上午11:52