Feeds:
文章
迴響

Archive for 六月 10th, 2009

MediaWiki 的多語系架構

最近要改進 MediaWiki (補充:版本為1.2.0)的操作流程,因為對於該系統架構不是很瞭解,文件資源又找不到所需要的資訊。我決定對這個系統進行剖析瞭解一下,今天我針對他的語言架構進行瞭解,整理出下面的類別圖。

mw03

我個人是覺得他的語言相當容易擴充和使用,但是底層架構卻不是挺漂亮,使用了許多全域變數和函數,找尋關聯性頗費工夫。

不過走完一遍之後,對於他的語系架構已經有個概念。整個多語系的關鍵還是在 Language 類別,而最重要的 method 就是 getMessage( ),他是最終負責抓取真正語系內容。每個語系類別都會覆寫這個 method 來提供自己的語系,一般實作方式如下:

function getMessage( $key ) {

global $wgAllMessagesZh_tw; // 定義在 MessageZh_tw.php

if(array_key_exists($key, $wgAllMessagesZh_tw))

return $wgAllMessagesZh_tw[$key];

else

return parent::getMessage( $key );

}

如果目前語系找不到對應值,則往上尋找直到 Language 定義的語系。每個 Language 都會有對應的 Message*.php 檔,用來定義訊息變數 $wgAllMessages*,這個變數也就是 getMessage 用來查找訊息的變數。

至於 LanguageUtf8 是為了支援 Utf-8 編碼所多出來的,擴增 Language 所沒有編碼轉換功能。如果你的語系要支援 Utf-8 編碼,都是從該類別繼承下來。

MessageCache 是為了提高效率所提供的快娶機制。MediaWiki_I18N 則是封裝上述複雜過程的類別,除此之外還提供一個動態代換訊息的方式,不過目前頁面呈現似乎沒有用到該機制。

以上就是今天剖析的一個小心得~

廣告

Read Full Post »