资讯专栏INFORMATION COLUMN

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

ACb0y / 931人阅读

摘要:最后,贴一下贴一下整个语言类文件的源码注释版下午框架源码分析语言类语言类提供了一些方法用于获取语言文件和不同语言的文本来实现国际化。

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

在你的 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文件的源码(注释版):

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;  
    }  
  
}  

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30613.html

相关文章

  • 零基础如何学爬虫技术

    摘要:楚江数据是专业的互联网数据技术服务,现整理出零基础如何学爬虫技术以供学习,。本文来源知乎作者路人甲链接楚江数据提供网站数据采集和爬虫软件定制开发服务,服务范围涵盖社交网络电子商务分类信息学术研究等。 楚江数据是专业的互联网数据技术服务,现整理出零基础如何学爬虫技术以供学习,http://www.chujiangdata.com。 第一:Python爬虫学习系列教程(来源于某博主:htt...

    KunMinX 评论0 收藏0
  • Python爬虫学习路线

    摘要:以下这些项目,你拿来学习学习练练手。当你每个步骤都能做到很优秀的时候,你应该考虑如何组合这四个步骤,使你的爬虫达到效率最高,也就是所谓的爬虫策略问题,爬虫策略学习不是一朝一夕的事情,建议多看看一些比较优秀的爬虫的设计方案,比如说。 (一)如何学习Python 学习Python大致可以分为以下几个阶段: 1.刚上手的时候肯定是先过一遍Python最基本的知识,比如说:变量、数据结构、语法...

    liaoyg8023 评论0 收藏0
  • SpringBoot 实战 (十三) | 整合 MyBatis (XML 版)

    摘要:如要运行多次,请把上次生成的映射文件代码删除再运行。层启动类扫描接口,必须加上提一嘴,这个注解非常的关键,这个对应了项目中所对应的包路径,必须加上,否则会导致异常。另外,关注之后在发送可领取免费学习资料。 微信公众号:一个优秀的废人如有问题或建议,请后台留言,我会尽力解决你的问题。 前言 如题,今天介绍 SpringBoot 与 Mybatis 的整合以及 Mybatis 的使用,之前...

    _Zhao 评论0 收藏0
  • 2017-08-09 前端日报

    摘要:前端日报精选解密一专题之如何判断两个对象相等在项目上,为什么我们分别选择了音频框架教程发布中文深入理解笔记解构使数据访问更便捷周二放送缓存知乎专栏个非常实用的小技巧风雨过后见彩虹个你可能不知道的属性众成翻译如何在模板驱动表单中自 2017-08-09 前端日报 精选 解密 Angular WebWorker Renderer (一)JavaScript专题之如何判断两个对象相等在项目上...

    crelaber 评论0 收藏0
  • CI3设置子目录控制器为默认控制器的解决办法

    摘要:在框架中配置文件多目录前后台应该是个很常见的事情。于是在求学问道的途中,终于得到了比较完美的解决方法。业务需求环境需求在中实现前后台的效果。因为已经不支持设置子目录下的控制器为默认控制器的功能。 showImg(https://segmentfault.com/img/remote/1460000010545771);     在框架中配置文件多目录、前后台应该是个很常见的事情。像一...

    niceforbear 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<