PHP 多國語系製作 i18n library 筆記 (一)

php-logo
多國語系是目前網站必有的模組,至少都會支援繁體中文及英文,那大家都怎麼設計多國語系的架構呢,底下來一步一步來介紹。

多國語系目錄架構

language/
---> englisg/
---------> about.php
---> zh-tw/
---------> about.php
---> zh-cn/
---------> about.php
這是大部分的專案設計模式,也最容易清楚了解,接著我們就寫一個簡單的 Language Class 來動態讀取各國語系。

撰寫 Language Class

在根目錄新增 index.php 及 language.php,當然還有 language 多國語系目錄,檔案內容如下 index.php
language.php
load language class 畫面。接著必須規畫兩個 method,分別是載入 language 檔案,以及讀取資料,程式碼變成:

language 陣列,並且將檔名複製到 $this->is_loaded 陣列,代表已載入,避免重複。接著看看程式碼:

public function load($langfile = '', $idiom = 'english')
{
    $langfile = str_replace('.php', '', $langfile);

    $langfile .= '.php';

    if (in_array($langfile, $this->is_loaded, TRUE))
    {
        return;
    }

    if ($idiom == '')
    {
        $idiom = ($deft_lang == '') ? 'english' : $deft_lang;
    }

    // Determine where the language file is and load it
    if (file_exists('language/'.$idiom.'/'.$langfile))
    {
        include('language/'.$idiom.'/'.$langfile);
    }

    if ( ! isset($lang))
    {
        return;
    }

    $this->is_loaded[] = $langfile;
    $this->language = array_merge($this->language, $lang);
    unset($lang);

    return TRUE;
}
最後實作讀取語系
public function line($line = '')
{
    $value = ($line == '' OR ! isset($this->language[$line])) ? FALSE : $this->language[$line];

    return $value;
}
$this->language 不存在此變數,則回傳布林函數 FALSE。最後來測試看看,先針對兩個語系 english 跟 zh-tw 目錄底下新增 about.php,內容如下
load("about", "english");

echo $lang->line("index") . "\n";
這樣就完成了基本的多國語系 class 實作,當然還有很多應用,等下次有再繼續寫 XD。程式碼也同時放在 php-i18n @ github >>>>> 繼續閱讀 PHP 多國語系製作 i18n library 筆記 (二) <<<<<