CI框架源碼解析十三之語言類文件Lang.php

本篇博文講述語言類,主要講述語言類的用法,關於語言類自己文件類內容並無多少內容,比較簡單,稍微查看代碼就能夠明白其做用用途,語言類提供了一些方法用於獲取語言文件和不一樣語言的文原本實現國際化。下面咱們講述多語言的用法。php

在你的 CodeIgniter 的 system 目錄,有一個 language 子目錄,它包含了一系列 英文 的語言文件。在 system/language/english/ 這個目錄下的這些文件定義了 CodeIgniter 框架的各個部分使用到的一些常規消息,錯誤消息,以及其餘一些通用的單詞或短語。數組

若是須要的話,你能夠建立屬於你本身的語言文件,用於提供應用程序的錯誤消息和其餘消息,或者將核心部分的消息翻譯爲其餘的語言。翻譯的消息或你另加的消息應該放在 application/language/ 目錄下,每種不一樣的語言都有相應的一個子目錄(例如, 'french' 或者 'german')。CodeIgniter 框架自帶了一套 "英語" 語言文件,另外能夠在CodeIgniter框架官方網站中的翻譯倉庫中找到其餘不一樣的語言,每一個語言都有一個獨立的目錄。session

當 CodeIgniter 加載語言文件時,它會先加載 system/language/ 目錄下的,而後再加載你的 application/language/ 目錄下的來覆蓋它。app

如何處理多語言呢?請看下面:框架

若是你想讓你的應用程序支持多語言,你就須要在 application/language/ 目錄下提供不一樣語言的文件,而後在 application/config/config.php 配置文件中指定默認語言。application/language/english/ 目錄能夠包含你的應用程序須要的額外語言文件,例如錯誤消息。每一個語言對應的目錄中都應該包含從 翻譯倉庫 中獲取到的核心文件,或者你本身翻譯它們,你也能夠添加你的程序須要的其餘文件。你應該將你正在使用的語言保存到一個會話變量中。函數

語言文件例子:oop

system/
    language/
        english/
            ...
            email_lang.php
            form_validation_lang.php
            ...
application/
    language/
        english/
            error_messages_lang.php
        french/
            ...
            email_lang.php
            error_messages_lang.php
            form_validation_lang.php
            ...

切換語言源碼分析

$idiom = $this->session->get_userdata('language');  
$this->lang->load('error_messages', $idiom);  
$oops = $this->lang->line('message_key');

CodeIgniter 的語言類給你的應用程序提供了一種簡單輕便的方式來實現多語言,它並非一般咱們所說的 國際化與本地化 的完整實現。咱們能夠給每一種語言一個別名,一個更通用的名字,而不是使用諸如 "en"、 "en-US"、"en-CA-x-ca" 這種國際標準的縮寫名字。
咱們如何使用語言類呢?網站

一、建立語言文件
語言文件的命名必須以 lang.php 結尾,例如,你想建立一個包含錯誤消息的文件,你能夠把它命名爲:error_lang.php 。(在每一個文件中使用一個通用的前綴來避免和其餘文件中的類似名稱衝突是個好方法。例如,若是你在建立錯誤消息你可使用 error 前綴。)在此文件中,你能夠在每行把一個字符串賦值給名爲 $lang 的數組,例如:this

//例如:  
$lang['language_key'] = '這是要現實的信息';  
  
//具體:  
$lang['error_email_missing'] = '電子郵件地址填寫錯誤';  
$lang['error_url_missing'] = 'URL地址填寫錯誤';  
$lang['error_username_missing'] = '用戶名不能爲空';

二、加載語言文件
在使用語言文件以前,你必須先加載它。可使用下面的代碼:

$this->lang->load('filename', 'language');

其中 filename 是你要加載的語言文件名(不帶擴展名),language 是要加載哪一種語言(好比,英語)。若是沒有第二個參數,將會使用 application/config/config.php 中設置的默認語言。你也能夠經過傳一個語言文件的數組給第一個參數來同時加載多個語言文件。

$this->lang->load(array('filename1', 'filename2'));

三、讀取語言文本
當你的語言文件已經加載,你就能夠經過下面的方法來訪問任何一行語言文本:

$this->lang->line('language_key');

注:其中,language_key 參數是你想顯示的文本行所對應的數組的鍵名。
萬一你不肯定你想讀取的那行文本是否存在,你還能夠將第二個參數設置爲 FALSE 禁用錯誤日誌:

//該方法只是簡單的返回文本行,而不是顯示出它。  
$this->lang->line('misc_key', FALSE);

若是你發現你須要在整個應用程序中使用某個語言文件,你可讓 CodeIgniter 在系統初始化的時候 自動加載該語言文件。能夠打開 application/config/autoload.php 文件,把語言放在 autoload 數組中。
關於語言類的就講解這麼多,在國際化的今天程序多語言的開發也是必不可少的,CI框架這一語言類在當前是很是實用的。最後,貼一下貼一下整個語言類Lang.php文件的源碼(註釋版):

<?php  
  
/** 
 * ======================================= 
 * Created by Pocket Knife Technology. 
 * User: FengYi_Jin
 * Date: 2017/10/11 0007 
 * Time: 下午 14:11 
 * Project: CodeIgniter框架—源碼分析 
 * Power: Analysis for Lang.php 
 * ======================================= 
 */  
  
defined('BASEPATH') OR exit('No direct script access allowed');  
  
/** 
 * 語言類 
 * 語言類提供了一些方法用於獲取語言文件和不一樣語言的文原本實現國際化。 
 */  
class CI_Lang  
{  
    //語言列表  
    public $language = array();  
    //加載的語言文件列表  
    public $is_loaded = array();  
  
    /** 
     * 構造函數 
     */  
    public function __construct()  
    {  
        log_message('info', 'Language Class Initialized');  
    }  
  
    /** 
     * 加載語言文件 
     */  
    public function load($langfile, $idiom = '', $return = FALSE, $add_suffix = TRUE, $alt_path = '')  
    {  
        if (is_array($langfile)) {  
            foreach ($langfile as $value) {  
                $this->load($value, $idiom, $return, $add_suffix, $alt_path);  
            }  
            return;  
        }  
        $langfile = str_replace('.php', '', $langfile);  
        if ($add_suffix === TRUE) {  
            $langfile = preg_replace('/_lang$/', '', $langfile) . '_lang';  
        }  
        $langfile .= '.php';  
        if (empty($idiom) OR !preg_match('/^[a-z_-]+$/i', $idiom)) {  
            $config =& get_config();  
            $idiom = empty($config['language']) ? 'english' : $config['language'];  
        }  
        if ($return === FALSE && isset($this->is_loaded[$langfile]) && $this->is_loaded[$langfile] === $idiom) {  
            return;  
        }  
  
        //加載基本文件,任何其餘語言文件能夠覆蓋它  
        $basepath = BASEPATH . 'language/' . $idiom . '/' . $langfile;  
        if (($found = file_exists($basepath)) === TRUE) {  
            include($basepath);  
        }  
        if ($alt_path !== '') {  
            $alt_path .= 'language/' . $idiom . '/' . $langfile;  
            if (file_exists($alt_path)) {  
                include($alt_path);  
                $found = TRUE;  
            }  
        } else {  
            foreach (get_instance()->load->get_package_paths(TRUE) as $package_path) {  
                $package_path .= 'language/' . $idiom . '/' . $langfile;  
                if ($basepath !== $package_path && file_exists($package_path)) {  
                    include($package_path);  
                    $found = TRUE;  
                    break;  
                }  
            }  
        }  
        if ($found !== TRUE) {  
            show_error('Unable to load the requested language file: language/' . $idiom . '/' . $langfile);  
        }  
        if (!isset($lang) OR !is_array($lang)) {  
            log_message('error', 'Language file contains no data: language/' . $idiom . '/' . $langfile);  
            if ($return === TRUE) {  
                return array();  
            }  
            return;  
        }  
        if ($return === TRUE) {  
            return $lang;  
        }  
        $this->is_loaded[$langfile] = $idiom;  
        $this->language = array_merge($this->language, $lang);  
        log_message('info', 'Language file loaded: language/' . $idiom . '/' . $langfile);  
        return TRUE;  
    }  
  
    /** 
     * 從一個已加載的語言文件中,經過行名獲取一行該語言的文本。 
     */  
    public function line($line, $log_errors = TRUE)  
    {  
        $value = isset($this->language[$line]) ? $this->language[$line] : FALSE;  
        if ($value === FALSE && $log_errors === TRUE) {  
            log_message('error', 'Could not find the language line "' . $line . '"');  
        }  
        return $value;  
    }  
  
}
相關文章
相關標籤/搜索