久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

正確使用gettext來(lái)翻譯Wordpress主題

 專(zhuān)業(yè)淘寶拍圖 2010-09-02

  正確使用gettext來(lái)翻譯Wordpress主題 收藏

Wordpress是一個(gè)非常不錯(cuò)的blog系統(tǒng),,使用方便,,且能更換不同的主題。在國(guó)外的網(wǎng)站上,,有很多免費(fèi)的主題,,這些主題不但表現(xiàn)形式漂亮、簡(jiǎn)潔,,而且代碼也非常精煉,。

但我們國(guó)人在使用這些主題的時(shí)候,都不免要碰到一個(gè)漢化的問(wèn)題,。最直接的辦法,,當(dāng)然是打開(kāi)文本編輯器,將這些主題的模板文件進(jìn)行修改,,將英文的地方 替換成中文,。但這樣的做法,,雖然直接,存在的缺點(diǎn)也是很明顯的:首先,,我們需要了解我們文本編輯器最后保存文件時(shí)的編碼,,并且要符合Wordpress生 成頁(yè)面時(shí)產(chǎn)生的charset屬性,如果你的文本編輯器保存文件為GB2312,,而Wordpress設(shè)置成了UTF-8,,那么頁(yè)面顯示出來(lái)就是亂碼。其 次,,我們直接改動(dòng)了原來(lái)的主題代碼,,增加了程序和相應(yīng)語(yǔ)言的耦合度,不便于維護(hù),,以后如果主題的作者對(duì)主題代碼進(jìn)行了升級(jí),,我們就需要重新進(jìn)行修改了。最 后,,對(duì)于那些追求完美的程序員來(lái)說(shuō),,更趨向于低耦合度的東西。

其實(shí),,Wordpress利用了GNU gettext模塊,,已經(jīng)完美地支持了多語(yǔ)言。而很多國(guó)外的優(yōu)秀主題,,也是遵循這樣的規(guī)范進(jìn)行開(kāi)發(fā)的,,我們所需要做的就是,生成一張翻譯列表,,然后填上我 們的漢語(yǔ)對(duì)應(yīng)語(yǔ)句就可以了,。當(dāng)然,你的主題如果不準(zhǔn)備更新,,或者追求快速(畢竟翻譯的步驟還是比直接修改來(lái)的麻煩一點(diǎn)),,你也可以跳過(guò)本文。

在開(kāi)始本文的實(shí)驗(yàn)以前,,請(qǐng)確保你已經(jīng)知道以下事情:

  • 安裝Wordpress 2.5 (本文在2.5版本上測(cè)試通過(guò))
  • 大致明白GNU gettext的工作原理,。GNU gettext利用兩個(gè)文件:po和mo,其中po是一個(gè)翻譯列表,,列舉了所以需要翻譯的詞組,,并提供翻譯。mo則是由po文件進(jìn)行編譯過(guò)后的文件,,更加適合機(jī)器閱讀,。
  • 會(huì)設(shè)置Wordpress為中文,也就是將wp-config.php文件里的WPLANG定義為’zh_CN’,,其中zh代表中文,,CN代表中國(guó)大陸,。然后下載安裝Wordpress的mo文件到wp-content/language目錄下。
  • 會(huì)安裝并且切換主題,,并大致明白主題模板文件的作用,,比如邊框內(nèi)容對(duì)應(yīng)于sidebar.php文件。

好了,,首先,,我們到這里下載一個(gè)用于測(cè)試的主題。這個(gè)主題叫做Barthelme,,是一個(gè)符合Wordpress 2.5規(guī)范的主題,,非常簡(jiǎn)潔的主題,,下面是它的預(yù)覽:

barthelme v3 screenshot

另外插句話(huà),,http://www./ 這個(gè)網(wǎng)站里面提供了幾個(gè)非常簡(jiǎn)潔的主題,而且都支持Wordpress 2.5,,喜歡這種風(fēng)格的朋友可以自行選擇,。

好了,我們按照常規(guī)辦法安裝好 Barthelme 主題,。由于我們已經(jīng)將Wordpress切換到了中文,,所以我們可以看到這樣的模樣:

只有詞條'頁(yè)面'被翻譯了

我們看看這個(gè)主題截圖,其中少部分被正常翻譯了,,比如“頁(yè)面”,然而更多的詞條還沒(méi)有被翻譯,,比如“CATEGORIES“和”Comments“ 等。這是怎么回事呢,?原來(lái)我們由于安裝過(guò)Wordpress的漢化mo文件,,并且將站點(diǎn)切換到了zh_CN,所以這些詞條首先從Wordpress的漢化 mo文件里尋找,,這樣,,它找到了“頁(yè)面”詞條的翻譯,但卻沒(méi)有找到“CATEGORIES“詞條的翻譯,,于是產(chǎn)生了這樣奇怪的現(xiàn)象,。

到這里,我們應(yīng)該看到一個(gè)問(wèn)題,,那就是,,新的模板(符合多語(yǔ)言開(kāi)發(fā)規(guī)范的模板)會(huì)自動(dòng)進(jìn)入Wordpress的漢化包里進(jìn)行詞條翻譯搜索,這樣,,就 和Wordpress的翻譯混雜在了一起,。我們知道,Wordpress的中文漢化主要應(yīng)該集中于后臺(tái)管理的漢化,,而對(duì)于主題,,理想的狀況是每個(gè)主題有自 己的漢化包,。

為了解決這個(gè)問(wèn)題,Wordpress提出了文字域的概念,。用過(guò)C++語(yǔ)言的朋友可以將其對(duì)應(yīng)于namespace概念,。這個(gè)概念解決了作用域的沖突。好,,那么我們首先為Barthelme主題添加其獨(dú)自的文字域,。

我們進(jìn)入wp-content/themes/barthelme目錄,打開(kāi)functions.php文件,。functions.php文件是wordpress主題的一個(gè)標(biāo)準(zhǔn)文件,,主要用來(lái)定義一些該主題的php函數(shù)以及進(jìn)行一些環(huán)境的設(shè)置。我們?cè)谠撐募淖詈蟛糠职l(fā)現(xiàn)了這樣的代碼:

load_theme_textdomain('barthelme')

load_theme_textdomain函數(shù)用來(lái)設(shè)置主題的域,。我們看到,,Barthelme主題是嚴(yán)格按照多語(yǔ)言標(biāo)準(zhǔn)進(jìn)行開(kāi)發(fā)的,它已經(jīng)為我們?cè)O(shè)置好了域名:barthelme,。在漢化其他主題時(shí),,如果我們沒(méi)有發(fā)現(xiàn)這條語(yǔ)句,可以在functions.php文件里添加這條語(yǔ)句,,并定義自己的域名,。

既然定義了域名,那么為什么詞條“頁(yè)面”能夠正確翻譯,,而“Categories“就不能了呢,?讓我們打開(kāi)sidebar.php文件,找到以下部分:

<?php wp_list_pages('title_li=<h3>'.__('Pages').'</h3>&sort_column=menu_order') ?>
<li id="categories">
<h3><?php _e('Categories', 'barthelme'); ?></h3>
<ul>
<?php wp_list_cats('sort_column=name&hierarchical=1') ?>
</ul>
</li>

原來(lái),,在顯示詞條”頁(yè)面“時(shí),,用的是__('Pages'),而顯示詞條“分類(lèi)”時(shí),,用的是_e('Categories', 'bathelme'); 我們知道,,php里主要通過(guò)__(key,domain)_e(key,domain)來(lái)進(jìn)行詞條翻譯,而當(dāng)我們不提供第二個(gè)參數(shù)時(shí),,則在全局域里進(jìn)行搜索,,這就是為什么我們的“頁(yè)面”詞條可以正常顯示的原因,因?yàn)檫@里遺漏了域名,,wordpress進(jìn)入全局域里為其搜索去了,。看來(lái),,這里是bug了,,對(duì)其進(jìn)行修改:__('Pages', 'barthelme')。然后保存后,刷新下頁(yè)面:

由于沒(méi)有提供域翻譯,所以都沒(méi)有被翻譯

這樣,,詞條“頁(yè)面”就不會(huì)被翻譯了,,因?yàn)槲覀冞€沒(méi)有提供該域的翻譯文件。

接下來(lái)要進(jìn)行翻譯了,,我們首先需要產(chǎn)生一個(gè)翻譯詞條的列表,,也就是po文件(或者pot文件,pot的意思是po文件的模板template),。當(dāng)然,,我們?nèi)绻止ぎa(chǎn)生這個(gè)列表的話(huà),工作量是非常巨大的,,這里我們借助GNU gettext的工具來(lái)產(chǎn)生:

] cd wp-content/themes/barthelme
] find . -iname "*.php" > files.tmp
] xgettext --language=PHP --indent --keyword=__ --keyword=_e
--keyword=__ngettext:1,2 -s -n --from-code=UTF-8 -f files.tmp
] rm files.tmp

我們首先進(jìn)入主題目錄,,通過(guò)find命令產(chǎn)生一個(gè)php文件名列表,并將這個(gè)文件名列表保存為一個(gè)臨時(shí)文件files.tmp,。接著,,我們用xgettext文件來(lái)掃描php文件,自動(dòng)產(chǎn)生po文件,。你可以通過(guò) info xgettext 來(lái)獲取詳細(xì)的使用幫助,,其中--indent選項(xiàng)指定使用縮進(jìn)模式,,-s選項(xiàng)指定對(duì)詞條進(jìn)行排序,,-n選項(xiàng)則將每個(gè)詞條所處的位置添加到該詞條的注釋里。

運(yùn)行完xgettext后,,會(huì)產(chǎn)生一個(gè)messages.po文件,,這就是我們需要工作的翻譯文件。它主要由兩部分組成:頭信息和翻譯詞條列表,。我們打開(kāi)這個(gè)文件,,它的開(kāi)始部分是一個(gè)頭信息部分:

msgid   ""
msgstr "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2008-04-09 18:51+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <[email protected]>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"

我們首先需要對(duì)這個(gè)頭信息進(jìn)行改造,改造有兩個(gè)部分:一,,設(shè)置charset,,這個(gè)一般設(shè)置為UTF-8;二來(lái)要為其添加關(guān)于漢語(yǔ)的一些細(xì)節(jié),。關(guān)于 語(yǔ)言的細(xì)節(jié)主要包括nplurals和plural的設(shè)置,,其實(shí)它包括了該語(yǔ)言如何處理單數(shù)和復(fù)數(shù)的情況,當(dāng)然,,我們漢語(yǔ)沒(méi)有這個(gè)問(wèn)題,,我們簡(jiǎn)單地將 nplurals設(shè)置為2,plural設(shè)置為1就可以了,。下面是修改好的頭信息(注意紅色部分):

msgstr  "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2008-04-09 18:51+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <[email protected]>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=1 != 1;\n"

接下來(lái),,該翻譯了,我們搜索以下詞條,并將其翻譯:

#: sidebar.php:11
msgid "Pages"
msgstr "頁(yè)面"

#: sidebar.php:14
msgid "Categories"
msgstr "分類(lèi)"

保存文件的時(shí)候,,我們要注意,,因?yàn)槲覀円呀?jīng)設(shè)置編碼為UTF-8,所以我們需要將文件保存為UTF-8編碼,,常用的編輯器,,比如UtralEdit和Emacs都支持的。保存好后我們需要將messages.po文件重新命名為zh_CN.po:

] mv messages.po zh_CN.po

接下來(lái)編譯這個(gè)po文件為mo文件:

] msgfmt -o zh_CN.mo zh_CN.po

好了,,檢查以下我們的主題目錄,,是否有一個(gè)名為zh_CN.mo文件,如果有,,說(shuō)明一切正常,,我們刷新一下頁(yè)面:

翻譯成功

翻譯成功!接下來(lái)要做的就是,,繼續(xù)修改po文件,,翻譯詞條,然后用msgfmt工具對(duì)其進(jìn)行編譯即可,。

總結(jié)

一個(gè)符合gettext規(guī)范的主題需要注意以下內(nèi)容(針對(duì)Wordpress 2.5):

  • 確定一個(gè)主題使用的域名: mydomain,;
  • functions.php文件里設(shè)置文字域 load_theme_textdomai('mydomain')
  • 主題模板里使用__('key','mydomain')或者_e('key','mydomain'),;
  • 用xgettext自動(dòng)產(chǎn)生po文件,,并且修改信息頭,編碼設(shè)置為UTF-8,,并設(shè)置漢語(yǔ)細(xì)節(jié),;
  • 將po文件改名為你的語(yǔ)言區(qū)域,如zh_CN.po,;
  • 用UTF-8編碼編輯zh_CN.po文件,,翻譯各個(gè)詞條;
  • 用msgfmt命令對(duì)po文件進(jìn)行編譯,,生成mo文件,;
  • 刷新網(wǎng)頁(yè),搞定,!

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀(guān)點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多