問題描述

翻譯字串的正確方法是什麼?

例如,

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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。