问题描述

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

例如,

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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。