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;  
    }  
  
}
相关文章
相关标签/搜索