問題描述
翻譯字符串的正確方法是什麼?
例如,
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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。