语言类用来处理不同语言的配置文件,它使用公有属性$language存放所有的语言配置,使用$is_loaded标记已经加载的语言配置文件。语言类有两个公有方法loadline,前者用于加载某个特定的语言配置文件,后者用来获得特定的语言配置项。

// $langfile 语言文件名
// $idiom 语言类型
// $alt_path 别名路径

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

这一段代码本身没什么难以理解的,但是我个人认为$add_suffix$return这两个参数实现的功能有点多余。$add_suffix是用来规格化文件名的,但是文件名这种就应该直接约定好不要搞乱七八糟的事情。$return返回加载的语言配置项数组,这个感觉需求不大。我感觉最奇怪的是竟然没有一个特定的$_ci_lang_paths

加载后的语言配置项合并到$language属性中,所以要找其中一项就是从这个数组中查找。

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

results matching ""

    No results matching ""