當前位置:首頁>WordPress建站>WordPress開發(fā)>WordPress翻譯中 __()、_e()、_x、_ex 和 _n 的用法及區(qū)別

WordPress翻譯中 __()、_e()、_x、_ex 和 _n 的用法及區(qū)別

作為WordPress主題或插件開發(fā)者,倡萌建議大家要掌握主題或插件國際化(I18n)/本地化的實現方法。

編譯函數

WordPress使用了下面幾個函數來方便語言本地化。

  • __()
  • _e()
  • _x()
  • _ex()
  • _n()

以上所列的函數是用來包含所需翻譯的字符串的,根據字符串的不同參數和輸出類型,需要使用不同的函數。相信有不少朋友還是不太明白這幾個函數的區(qū)別和用法,下面倡萌就來詳細說說。

__() 和 _e()

__() 和 _e() 都是用來返回對應當前語言的字符串內容。請看下面的例子:

使用 __()

<?php  
if( is_single() ) { //如果這是一篇“文章”  
    echo __( 'This is a post.' );  
}  
?> 

使用 _e()

<?php  
if( is_single() ) { //如果這是一篇“文章”  
    _e( 'This is a post.' );  
}  
?>  

上面兩組代碼的最終輸出內容都是一樣的。請自己對比一下這兩組代碼的第 3 行,使用了 echo 函數的,就用 __(),直接返回內容的就用 _e() 。由此,我們可以簡單理解為:

如果字符串是返回給其他函數調用,不打印出來,就用 __() ;直接打印輸出到 html 中的字符串,就用 _e() 。

再看下面的例子:

<?php  
the_content( __( 'Click here to read more' ) );  
?>

‘Click here to read more’ 是被函數 the_content() 直接包裹的,所以這里使用 __();如果你換成 _e() ,它就會直接輸出“Click here to read more”,函數 the_content() 就不起作用了。

_x() 和 _ex()

如果要翻譯的字符串是根據上下文來決定的,就需要用到 _x()。比如“Post”根據上下文的不同既可以指 “a post(名詞)” 也可以指 “to post (動詞)”。你需要明確表達同一個詞的不同含義,方便翻譯者識別。 _x() 主要是用在單個具有多重用法的詞語,而且它比其他的編譯函數多了一個額外的參數,這個參數就是用來根據不同上下文顯示的不同內容。

比如,你在主題的兩個地方用到了”post“這個詞,但是這兩個地方的要表達的意思是不一樣的。這時候,你可以這樣操作:

在第一處的post使用下面的代碼:

<?php echo _x('post','A post.') ?>

在第二處的post使用下面的代碼:

<?php echo _x('post','To post.') ?>

那么,翻譯者就可以理解兩處post的不同,將第一處翻譯為“一篇文章”,第二處翻譯為“發(fā)布”。

注:導出的 .pot 語言包文件,使用 POEdit 軟件打開后,你會發(fā)現有兩條翻譯條目分別為:post[A post] 和 post[To post],這樣就可以分別翻譯這兩個意思。

_ex() 區(qū)別于 _x() 的地方,和 _e() 區(qū)別于__() 是一樣的。前者是用于直接打印輸出到html的字符串,后者用于返回字符串以供其他函數調用,不打印輸出。

_n()

_n() 是用來進行單復數編譯的。比較常見于 WordPress 的評論功能模塊。例如下面的兩組代碼輸出的內容都是一樣的:

<?php  
if(get_comments_number() == 1) {  
    _e( 'There is a comment' );  
} else {  
    _e( 'There are comments' );  
}  
?> 

 

<?php  
echo _n( 'There is a comment' , 'There are comments' , get_comments_number() );  
?>

第一組代碼是通過 if 來判斷,如果評論數量是 1 ,就輸出“There is a comment ”,否則輸出“There are comments”,由于是直接輸出的,所以使用 _e() ;第二組是使用echo 函數輸出,然后使用 _n() 來區(qū)分1條評論和多條評論的顯示內容。

_n() 有 3 個參數。第一個是單數形式的字符串,第二個是復數形式的字符串,第三個是引用的數字。在這個例子中,get_comments_number() 是用來獲取 評論 的條數,提供給 _n() 使用。

含有變量的翻譯

如果在翻譯的字符串中包含一個額外的函數或變量,我們應該如何處理呢?比如下面的例子:

<?php  
$color = the_color();  
_e( "You have chosen the $color theme" );  
?> 

如果你通過 POEdit 制作 .pot 文件,這時會報錯。因為在翻譯的字符串中包含了 $color 這個變量。那么,如何規(guī)避這個問題呢?下面有2種方法:

拆分內容

<?php  
$color = the_color();  
echo __( 'You have chosen the ' ) . $color . __( ' theme.' );  
?>  

仔細看第 3 行代碼,使用了 echo 函數,這樣就能保證 $color 變量的輸出,同時將變量兩端的內容分別進行編譯,中間使用點號“.”相連。這樣一來,只需翻譯兩端的內容即可。

使用 printf()sprintf()

上面說的“拆分內容”法雖然可以實現我們要的效果,但是它將內容分成幾段,需要我們分別翻譯,多少有些繁瑣。其實我們可以使用 printf()sprintf() 來解決這個問題。看下面的代碼:

<?php  
//使用 sprintf() 的寫法
echo sprintf( __( 'You have chosen the %s theme.' ) , the_color() );

//使用 printf() 的寫法 
printf( __( 'You have chosen the %s theme.' ) , the_color() );  
?> 

你可以看到,翻譯的內容中使用了 %s ,而且 翻譯的內容 和 變量函數 都被包裹在 printf()sprintf() 函數中。這個例子中,只使用了一個變量,如果有更多的函數改怎么辦?這就需要你自己去了解 printf()sprintf() 這兩個函數的了。

printf()sprintf() 用法的區(qū)別,和 _e() 與 __() 的區(qū)別是一樣的。

好了,關于這幾個編譯函數,就講到這里,在這方面,倡萌也是新手,如果有什么地方說錯了,或者表達不清楚,望大家指正。

聲明:本站所有文章,如無特殊說明或標注,均為本站原創(chuàng)發(fā)布。任何個人或組織,在未征得本站同意時,禁止復制、盜用、采集、發(fā)布本站內容到任何網站、書籍等各類媒體平臺。如若本站內容侵犯了原著者的合法權益,可聯系我們進行處理。

給TA打賞
共{{data.count}}人
人已打賞
歡迎關注WordPress大學公眾號 WPDAXUE
WordPress開發(fā)

WordPress函數:load_plugin_textdomain(插件本地化)

2013-4-14 8:25:28

WordPress開發(fā)

讓WordPress主題支持語言本地化

2013-4-16 8:32:00

18 條回復 A文章作者 M管理員
  1. 秋雨落花生

    _e() __() 等這幾個函數在使用的時候沒有翻譯出結果,是什么原因

  2. artad

    倡萌高人,請教個問題,我有一個主題,翻譯中文他部分能翻譯,為何呀,添加頁面的設置選項翻譯正常,后臺主題管理的字段部分翻譯,其他翻譯不了,我檢查了下貌似沒發(fā)現錯誤,高人指點
    例如 // BBPress & BuddyPress
    $this->sections[] = array(
    ‘icon’ => ‘el-icon-book’,
    ‘icon_class’ => ‘icon’,
    ‘title’ => __(‘BBPress & BuddyPress’),這里沒有錯誤
    ‘fields’ => array(
    array(
    ‘id’=>’bb-layout’,
    ‘type’ => ‘image_select’,
    ‘title’ => __(‘Page Layout’),
    ‘options’ => $page_layouts,
    ‘default’ => ‘fullwidth’
    ),

    語言文件#: inc/admin/per/settings.php:3620 指向也沒錯,
    msgid “BBPress & BuddyPress” 這里調用也沒錯
    msgstr “BBPress和BuddyPress”

    請問這是什么原因

    • 網站編輯

      __(‘BBPress & BuddyPress’), 看代碼缺失了第二個參數,應該類似于 __(‘BBPress & BuddyPress’,’xxx’),具體你可以仔細看下文章
      http://www.ydqwiac.cn/localize-wordpress-themes.html
      找到其他翻譯字段,是否后面包含了類似于 xxx 的第二個參數

      如果還解決不了,建議你聯系主題作者吧

  3. jsaihaozhe

    非常感謝,經常見到 %s 始終迷惑不解,還以為是wordpress專用的;后來才知道是php的printf函數

  4. 以前看主題時大概知道了意思,現在更加明了了

  5. function _e( $text, $domain = ‘default’ ) {
    echo translate( $text, $domain );
    }
    有時候也是兩個參數。第二個參數什么意思?看這個定義也看不明白。默認主題有時候這樣用,_e( ‘Featured post’, ‘twentytwelve’ );

    • 第二個參數 $domain 就和默認主題的 twentytwelve 一樣,如果你指定了自己的值,比如這里的 twentytwelve,就用 twentytwelve,如果沒有,就用默認的值 default

  6. printf 如果有兩個變量呢

    • 那就使用2個變量,比如
      printf( __( ‘You have chosen the %s theme and %d theme.’ ) , the_color(), the_color2() );

    • 網站編輯

      嗯,謝謝

    • 網站編輯

      printf( __( ‘<em>發(fā)表于:%s </em>|<em>分類:%d </em>’ ) , the_time(‘F jS, Y’), the_category(‘,’));
      八月 29th, 2013視頻發(fā)表于: |分類: 0

      如果這樣他就先把 時間和分類 顯示出來了, 怎么解決哇?

    • 你應該使用 get_ 類函數,這樣就不會直接輸出,而是返回值給其他函數調用。比如 get_the_time 、get_the_category

    • 對了,糾正一下,%s 和 %d 返回的內容類型不一樣,有專門的用法的:
      參數 format 是轉換的格式,以百分比符號 ("%") 開始到轉換字符結束。下面的可能的 format 值:
      %% – 返回百分比符號
      %b – 二進制數
      %c – 依照 ASCII 值的字符
      %d – 帶符號十進制數
      %e – 可續(xù)計數法(比如 1.5e+3)
      %u – 無符號十進制數
      %f – 浮點數(local settings aware)
      %F – 浮點數(not local settings aware)
      %o – 八進制數
      %s – 字符串
      %x – 十六進制數(小寫字母)
      %X – 十六進制數(大寫字母)
      arg1, arg2, ++ 等參數將插入到主字符串中的百分號 (%) 符號處。該函數是逐步執(zhí)行的。在第一個 % 符號中,插入 arg1,在第二個 % 符號處,插入 arg2,依此類推。

    • 網站編輯

      我說分類咋一直顯示的是 0 呢,原來如此,謝謝樓主

    • 網站編輯

      發(fā)現和C語言好像

  7. 十分感謝,學到新知識了

  8. 非常感謝^_^

  9. 基本不會English的飄過

?
個人中心
購物車
優(yōu)惠劵
今日簽到
有新私信 私信列表
搜索

安陆市| 永善县| 肥城市| 略阳县| 南阳市| 雅江县| 宁城县| 伊金霍洛旗| 皋兰县| 永顺县| 鄂托克前旗| 五河县| 新郑市| 进贤县| 商洛市| 锦州市| 平罗县| 增城市| 泗阳县| 辰溪县| 星座| 东源县| 马公市| 阿拉善左旗| 城固县| 玉树县| 万山特区| 娱乐| 溆浦县| 邵武市| 宜兴市| 金乡县| 武夷山市| 申扎县| 福建省| 龙江县| 云和县| 临汾市| 达尔| 大埔区| 延寿县|