作為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ū)別是一樣的。
好了,關于這幾個編譯函數,就講到這里,在這方面,倡萌也是新手,如果有什么地方說錯了,或者表達不清楚,望大家指正。





_e() __() 等這幾個函數在使用的時候沒有翻譯出結果,是什么原因
倡萌高人,請教個問題,我有一個主題,翻譯中文他部分能翻譯,為何呀,添加頁面的設置選項翻譯正常,后臺主題管理的字段部分翻譯,其他翻譯不了,我檢查了下貌似沒發(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 的第二個參數
如果還解決不了,建議你聯系主題作者吧
非常感謝,經常見到 %s 始終迷惑不解,還以為是wordpress專用的;后來才知道是php的printf函數
以前看主題時大概知道了意思,現在更加明了了
function _e( $text, $domain = ‘default’ ) {
echo translate( $text, $domain );
}
有時候也是兩個參數。第二個參數什么意思?看這個定義也看不明白。默認主題有時候這樣用,_e( ‘Featured post’, ‘twentytwelve’ );
第二個參數 $domain 就和默認主題的 twentytwelve 一樣,如果你指定了自己的值,比如這里的 twentytwelve,就用 twentytwelve,如果沒有,就用默認的值 default
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語言好像
十分感謝,學到新知識了
非常感謝^_^
基本不會English的飄過