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


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

編譯函數

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

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

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

__() 和 _e()

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

使用 __()

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

使用 _e()

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

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

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

再看下面的例子:

1
2
3
<?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使用下面的代碼:

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

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

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

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

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

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

_n()

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

1
2
3
4
5
6
7
<?php  
if(get_comments_number() == 1) {  
    _e( 'There is a comment' );  
} else {  
    _e( 'There are comments' );  
}  
?>

 

1
2
3
<?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() 來區分1條評論和多條評論的顯示內容。

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

含有變量的翻譯

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

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

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

拆分內容

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

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

使用 printf() 或 sprintf()

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

1
2
3
4
5
6
7
<?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() 用法的區別,和 _e() 與 __() 的區別是一樣的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM