問題描述

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