問題描述
到目前為止,我一直在處理 Wordpress 中的一些翻譯,並嘗試閱讀官方的 gettext 檔案,但不會得到一個簡單的事情:這些啟發之間有什麼區別,如__(,_e(等等) 甚至是更多:哪些其他人在旁邊?提前感謝!
坦率
最佳解決方案
__(雙下劃線) 是基本翻譯功能。它翻譯一個字串並將其作為字串返回。
_e 與__相同,但立即回顯結果。
_x 是上下文翻譯功能。它有第二個選擇,為翻譯的人提供上下文。
_ex 與_x 相同,但回聲結果。
使用_x 的例子:
$string = _x( 'Buffalo', 'an animal', 'plugin-domain' );
$string = _x( 'Buffalo', 'a city in New York', 'plugin-domain' );
$string = _x( 'Buffalo', 'a verb meaning to confuse somebody', 'plugin-domain' );
有時在其他語言中,相同的字串可能會有所不同。為翻譯人員提供上下文可以幫助他們選擇正確的詞語。
快捷功能:
-
esc_attr__:相當於__,也可透過esc_attr執行。 -
esc_html__:相當於__,也可透過esc_html執行。 -
esc_attr_e:相當於_e,也可透過esc_attr執行。 -
esc_html_e:相當於_e,也可透過esc_html執行。 -
esc_attr_x:相當於_x,也可透過esc_attr執行。 -
esc_html_x:相當於_x,也可透過esc_html執行。
_n 是複數處理程序。例:
$string = sprintf( _n(
'You have %d taco.',
'You have %d tacos.',
$number,
'plugin-domain'),
$number );
在這個例子中,有兩種方法可以說出反光度,這取決於它是否是單數。第一次使用 $號表示_n 功能使用哪個版本。 $ number 的第二個用法發生在 sprintf 中,用%d 替換字串中的實際數字。
_n 沒有回聲功能,但有一個名為_nx 的功能。它是_n 和_x 的組合。多元化和語境
_n_noop 是一個特殊的。它用於翻譯多個字串,但不是實際執行翻譯。如果要使字串集中,但實際上在其他地方進行工作,這很有用。實際上在其他地方工作的功能是 translate_nooped_plural 。
例:
$holder = _n_noop('You have %d taco.', 'You have %d tacos.', 'plugin-domain');
// ... later ...
$string = sprintf( translate_nooped_plural( $holder, $count ), $count );
這不是很多,但可以方便組織。例如,如果將所有的字串放在一個檔案中,那麼在_n 中就可以使用_n,這樣就可以在_n_noop 這樣做。
_nx_noop 與_n_noop 相同,但也可以為_x 提供翻譯器的上下文。
請注意,您可以將域放入 noop 函式呼叫或 translate_nooped_plural 函式呼叫。無論哪個更適合您的組織。如果兩個都有一個域,那麼傳遞給 noop 呼叫的一個獲勝。
number_format_i18n 相當於 PHP 的內建 number_format,但它增加了諸如小數等的處理,這在其他語言環境中是不同的。
date_i18n 相當於 PHP 的內建 date,還有所有相關處理。月份名稱,日期名稱等
另外,never break the laws 。只是提醒。 🙂
次佳解決方案
__(), _e() 和 _x(), _ex()
__()和_e()基本上都是 translate()的包裝 (不要直接使用) 和幾乎相同。
區別在於__()返回翻譯的字串,_e()回顯它。兩者都需要輸入一個字串作為必需的引數,通常雖然可選,也是一個文字域。
類似地,有_x()和_ex(),它允許您指定可以描述字串出現在哪裡的上下文。如果您的專案包含超過幾十個可翻譯的字串,則使用上下文很有意義。
另外,請注意_n()和_nx()的複數形式。
常見用法示例
$output = '<label for="some_field">' .
_x( 'Some Information.', 'Some Form Field', 'your-text-domain' ) .
'</label>' .
'<input type="text" name="some_field" value="" />' .
'<p class="description">' .
_x( 'Here you can enter some info.', 'Some Form Field', 'your-text-domain' ) .
'</p>';
return $output;
Parameters
__( $text, $domain )
_e( $text, $domain )
_x( $text, $context, $domain )
_ex( $text, $context, $domain )
_n( $single, $plural, $number $domain )
_nx( $single, $plural, $number, $context, $domain )
所有引數,但 $number 是字串。除了 $domain 之外,都是必需的。
變數與 sprintf() 有更大的靈活性
如果您的字串將包含可變數字或單詞,請使用 sprintf():
$stars = get_post_meta( $post->ID, 'rating', true );
$title = get_the_title( $post->ID );
$output = '<p>' .
sprintf(
_x(
'The movie titled %2$s received a %1$d star rating.',
'Movie Description',
'your-text-domain'
),
$stars,
$title
) .
'</p>';
return $output;
額外的資源
一些額外的資源為即將到來的 WordPress I18n 忍者:
-
Codestyling Localization(精彩外掛!)
第三種解決方案
我不是翻譯專家,但 WordPress Codex 頁面有很好的檔案,並解釋了使用每個例項的原因。
從 codex 頁面:
__()
當訊息作為引數傳遞給另一個函式時使用; _e()用於將訊息直接寫入頁面。關於這兩個功能的更多細節:
__('message')
搜尋本地化模組來翻譯’message’,並將翻譯傳遞給 PHP 返回語句。如果沒有找到’message’ 的翻譯,它只是返回’message’ 。
_e('message')
搜尋本地化模組來翻譯’message’,並將翻譯傳遞給 PHP echo 語句。如果沒有找到’message’ 的翻譯,它只是回應’message’ 。
請注意,如果您正在國際化主題或外掛,則應使用"Text Domain"。
gettext 框架負責大部分的 WordPress 。但是,WordPress 發行版中有幾個地方無法使用 gettext:
-
主要的 WordPress README 檔案 – 它是一個靜態 HTML 檔案,而不是 PHP 檔案,因此無法透過 gettext 函式執行。
-
在載入 gettext 之前,WordPress 載入週期中很早就會生成一些錯誤訊息。
Additional info regarding when gettext doesn’t work
希望能回答你的問題,如果不是讓我們知道,也許別人可以幫助,或者我可以做更多的研究。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。