问题描述
翻译字符串的正确方法是什么?
例如,
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 );
最佳解决方案
__()
功能中有第二个参数。它应该设置为您正在为您的插件或主题使用的域。在下面的例子中,我使用'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
数字。还有 other placeholders 。
(这句话语法不正确,使用'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
);
如果不清楚 Top 和 Bottom 是否可以使用_x()
来解释这些术语的上下文。
您可以在这里找到其他翻译案例:Internationalization: You』re probably doing it wrong
次佳解决方案
自从已经说过,我不会解释字符串中变量的问题。
你想保持你的字符串静态,这意味着内容不会改变。你也想避免不必要的 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 开头和结尾的句子只会浪费空间。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。