您的位置:首页 > 编程语言 > PHP开发

CI框架源码解析十三之语言类文件Lang.php

2016-10-27 14:47 585 查看
        本篇博文讲述语言类,主要讲述语言类的用法,关于语言类本身文件类内容并没有多少内容,比较简单,稍微查看代码就可以明白其作用用途,语言类提供了一些方法用于获取语言文件和不同语言的文本来实现国际化。下面我们讲述多语言的用法。

        在你的 CodeIgniter 的 system 目录,有一个 language 子目录,它包含了一系列 英文 的语言文件。在 system/language/english/ 这个目录下的这些文件定义了 CodeIgniter 框架的各个部分使用到的一些常规消息,错误消息,以及其他一些通用的单词或短语。

        如果需要的话,你可以创建属于你自己的语言文件,用于提供应用程序的错误消息和其他消息,或者将核心部分的消息翻译为其他的语言。翻译的消息或你另加的消息应该放在 application/language/ 目录下,每种不同的语言都有相应的一个子目录(例如, 'french' 或者 'german')。CodeIgniter 框架自带了一套 "英语" 语言文件,另外可以在CodeIgniter框架官方网站中的翻译仓库中找到其他不同的语言,每个语言都有一个独立的目录。

        当 CodeIgniter 加载语言文件时,它会先加载 system/language/ 目录下的,然后再加载你的 application/language/ 目录下的来覆盖它。

        如何处理多语言呢?请看下面:

        如果你想让你的应用程序支持多语言,你就需要在 application/language/ 目录下提供不同语言的文件,然后在 application/config/config.php 配置文件中指定默认语言。application/language/english/ 目录可以包含你的应用程序需要的额外语言文件,例如错误消息。每个语言对应的目录中都应该包含从 翻译仓库 中获取到的核心文件,或者你自己翻译它们,你也可以添加你的程序需要的其他文件。你应该将你正在使用的语言保存到一个会话变量中。

        语言文件例子:

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" 这种国际标准的缩写名字。

我们如何使用语言类呢?

1、创建语言文件

        语言文件的命名必须以 _lang.php 结尾,例如,你想创建一个包含错误消息的文件,你可以把它命名为:error_lang.php 。(在每个文件中使用一个通用的前缀来避免和其他文件中的相似名称冲突是个好方法。例如,如果你在创建错误消息你可以使用 error_ 前缀。)在此文件中,你可以在每行把一个字符串赋值给名为 $lang 的数组,例如: //例如:
$lang['language_key'] = '这是要现实的信息';

//具体:
$lang['error_email_missing'] = '电子邮件地址填写错误';
$lang['error_url_missing'] = 'URL地址填写错误';
$lang['error_username_missing'] = '用户名不能为空';

2、加载语言文件

        在使用语言文件之前,你必须先加载它。可以使用下面的代码: $this->lang->load('filename', 'language');
        其中 filename 是你要加载的语言文件名(不带扩展名),language 是要加载哪种语言(比如,英语)。如果没有第二个参数,将会使用 application/config/config.php 中设置的默认语言。你也可以通过传一个语言文件的数组给第一个参数来同时加载多个语言文件。 $this->lang->load(array('filename1', 'filename2'));

3、读取语言文本

        当你的语言文件已经加载,你就可以通过下面的方法来访问任何一行语言文本: $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: ZhiHua_W
* Date: 2016/10/27 0007
* Time: 下午 2: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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息