問題描述

到目前為止,我一直在處理 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 忍者:

第三種解決方案

我不是翻譯專家,但 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 載入週期中很早就會生成一些錯誤訊息。

Link to the Codex Page

Additional info regarding when gettext doesn’t work

希望能回答你的問題,如果不是讓我們知道,也許別人可以幫助,或者我可以做更多的研究。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。