最近要改進 MediaWiki (補充:版本為1.2.0)的操作流程,因為對於該系統架構不是很瞭解,文件資源又找不到所需要的資訊。我決定對這個系統進行剖析瞭解一下,今天我針對他的語言架構進行瞭解,整理出下面的類別圖。
我個人是覺得他的語言相當容易擴充和使用,但是底層架構卻不是挺漂亮,使用了許多全域變數和函數,找尋關聯性頗費工夫。
不過走完一遍之後,對於他的語系架構已經有個概念。整個多語系的關鍵還是在 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 則是封裝上述複雜過程的類別,除此之外還提供一個動態代換訊息的方式,不過目前頁面呈現似乎沒有用到該機制。
以上就是今天剖析的一個小心得~
發表留言