thinkphp实现多语言功能(语言包)


Posted in PHP onMarch 04, 2014

1.在Home(你取的项目名)的config.php中添加如下配置

<?php
return array(
    //'配置项'=>'配置值'
        'LANG_SWITCH_ON'     =>     true,    //开启语言包功能        
        'LANG_AUTO_DETECT'     =>     true, // 自动侦测语言
        'DEFAULT_LANG'         =>     'zh-cn', // 默认语言        
        'LANG_LIST'            =>    'en-us,zh-cn,zh-tw', //必须写可允许的语言列表
        'VAR_LANGUAGE'     => 'l', // 默认语言切换变量
);
?>

2.Home的conf文件夹里添加一个php文件(tag.php),添加如下代码:

return array(
    // 添加下面一行定义即可
    'app_begin' => array('CheckLang')
);

3.把Extend/Behavior/CheckLangBehavior.class.php 文件复制到Home/lib/Behavior/中(完整版的thinkphp包才有,没有的话请自行创建)

CheckLangBehavior.class.php代码:

<?php
defined('THINK_PATH') or exit();
/**
 * 语言检测 并自动加载语言包
 * @category   Extend
 * @package  Extend
 * @subpackage  Behavior
 */
class CheckLangBehavior extends Behavior {
    // 行为参数定义(默认值) 可在项目配置中覆盖
    protected $options   =  array(
            'LANG_SWITCH_ON'        => false,   // 默认关闭语言包功能
            'LANG_AUTO_DETECT'      => true,   // 自动侦测语言 开启多语言功能后有效
            'LANG_LIST'             => 'zh-cn', // 允许切换的语言列表 用逗号分隔
            'VAR_LANGUAGE'          => 'l',        // 默认语言切换变量
        );
    // 行为扩展的执行入口必须是run
    public function run(&$params){
        // 开启静态缓存
        $this->checkLanguage();
    }
    /**
     * 语言检查
     * 检查浏览器支持语言,并自动加载语言包
     * @access private
     * @return void
     */
    private function checkLanguage() {
        // 不开启语言包功能,仅仅加载框架语言文件直接返回
        if (!C('LANG_SWITCH_ON')){
            return;
        }
        $langSet = C('DEFAULT_LANG');
        // 启用了语言包功能
        // 根据是否启用自动侦测设置获取语言选择
        if (C('LANG_AUTO_DETECT')){
            if(isset($_GET[C('VAR_LANGUAGE')])){
                $langSet = $_GET[C('VAR_LANGUAGE')];// url中设置了语言变量
                cookie('think_language',$langSet,3600);
            }elseif(cookie('think_language')){// 获取上次用户的选择
                $langSet = cookie('think_language');
            }elseif(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])){// 自动侦测浏览器语言
                preg_match('/^([a-z\d\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);
                $langSet = $matches[1];
                cookie('think_language',$langSet,3600);
            }
            if(false === stripos(C('LANG_LIST'),$langSet)) { // 非法语言参数
                $langSet = C('DEFAULT_LANG');
            }
        }
        // 定义当前语言
        define('LANG_SET',strtolower($langSet));
        $group = '';
        $path    =   (defined('GROUP_NAME') && C('APP_GROUP_MODE')==1) ? BASE_LIB_PATH.'Lang/'.LANG_SET.'/' : LANG_PATH.LANG_SET.'/';
        // 读取项目公共语言包
        if(is_file(LANG_PATH.LANG_SET.'/common.php'))
            L(include LANG_PATH.LANG_SET.'/common.php');     
        // 读取分组公共语言包
        if(defined('GROUP_NAME')){
            if(C('APP_GROUP_MODE')==1){ // 独立分组
                $file = $path.'common.php';
            }else{ // 普通分组
                $file = $path.GROUP_NAME.'.php';
                $group = GROUP_NAME.C('TMPL_FILE_DEPR');
            }
            if(is_file($file))
                L(include $file);
        }
        // 读取当前模块语言包
        if (is_file($path.$group.strtolower(MODULE_NAME).'.php'))
            L(include $path.$group.strtolower(MODULE_NAME).'.php');
    }
}

4.在Home里的lang文件夹下创建3个语言文件夹。分别是zh-cn  en-us  zh-tw,

在这三个文件夹里各创建一个common.php文件,如图:

在common.php 里对应写上

<?php
return array(
        'welcome'=>'Welcome to use thinkphp',
);
?>

<?php
return array(
    'welcome'=>'欢迎使用ThinkPHP',
);
?>

<?php
return array(
    'welcome'=>'?g迎使用ThinkPHP',
);
?>

5.在tpl/Index/文件夹下创建视图 index.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <title>ThinkPHP示例:多语言</title>
 </head>
 <body>
 <div class="main">
<div>切换语言:<a href="?l=zh-cn">简体中文</a> | <a href="?l=zh-tw">繁体中文</a> | <a href="?l=en-us">英文</a></div>
 <div class="result">{$Think.lang.welcome}</div>
</div>
 </body>
</html>

大功告成!

后台语言要进行语言切换的话, 在每句话之前加L,如:

public function index(){
print  L('add_user_error');//add_user_error只是语言变量,具体的语言要到语言包里写
$this->display();
}

这一点我觉得cakephp做的就比较好,不需要给每句话都给予一个变量。

PHP 相关文章推荐
PHP个人网站架设连环讲(一)
Oct 09 PHP
PHP详细彻底学习Smarty
Mar 27 PHP
php下防止单引号,双引号在接受页面转义的设置方法
Sep 25 PHP
php for 循环语句使用方法详细说明
May 09 PHP
PHP--用万网的接口实现域名查询功能
Dec 13 PHP
php函数与传递参数实例分析
Nov 15 PHP
php常用文件操作函数汇总
Nov 22 PHP
PHP实现HTTP断点续传的方法
Jun 17 PHP
PHP定时执行任务实现方法详解(Timer)
Jul 30 PHP
PHP去除字符串最后一个字符的三种方法实例
Mar 01 PHP
laravel 获取某个查询的查询SQL语句方法
Oct 12 PHP
tp5修改(实现即点即改)
Oct 18 PHP
thinkphp实现图片上传功能分享
Mar 04 #PHP
php判断是否为json格式的方法
Mar 04 #PHP
php不写闭合标签的好处
Mar 04 #PHP
php循环创建目录示例分享(php创建多级目录)
Mar 04 #PHP
PHP中is_file不能替代file_exists的理由
Mar 04 #PHP
php获取目标函数执行时间示例
Mar 04 #PHP
PHP代码优化的53个细节
Mar 03 #PHP
You might like
PHP垃圾回收机制引用计数器概念分析
2013/06/24 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
2014/11/19 PHP
PHP随手笔记整理之PHP脚本和JAVA连接mysql数据库
2015/11/25 PHP
php使用array_chunk函数将一个数组分割成多个数组
2018/12/05 PHP
Laravel框架定时任务2种实现方式示例
2018/12/08 PHP
php5与php7的区别点总结
2019/10/11 PHP
采用call方式实现js继承
2014/05/20 Javascript
2014年50个程序员最适用的免费JQuery插件
2014/12/15 Javascript
Javascript技术难点之apply,call与this之间的衔接
2015/12/04 Javascript
一个字符串中出现次数最多的字符 统计这个次数【实现代码】
2016/04/29 Javascript
jQuery实现的文字逐行向上间歇滚动效果示例
2017/09/06 jQuery
对于input 框限定输入值为浮点型的js代码
2017/09/25 Javascript
微信小程序实现复选框效果
2018/12/28 Javascript
使用RxJS更优雅地进行定时请求详析
2019/06/02 Javascript
[00:12]DAC SOLO赛卫冕冠军 VG.Paparazi灬展现SOLO技巧
2018/04/06 DOTA
[37:50]VP vs TNC Supermajor小组赛B组 BO3 第一场 6.2
2018/06/03 DOTA
Python运用于数据分析的简单教程
2015/03/27 Python
Python中的元类编程入门指引
2015/04/15 Python
Python之csv文件从MySQL数据库导入导出的方法
2018/06/21 Python
python实现RabbitMQ的消息队列的示例代码
2018/11/08 Python
python之线程通过信号pyqtSignal刷新ui的方法
2019/01/11 Python
Scrapy框架爬取西刺代理网免费高匿代理的实现代码
2019/02/22 Python
Python实现定制自动化业务流量报表周报功能【XlsxWriter模块】
2019/03/11 Python
pandas实现将dataframe满足某一条件的值选出
2019/06/12 Python
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)
2020/10/12 Python
Michael Kors澳大利亚官网:世界知名的奢侈饰品和成衣设计师
2020/02/13 全球购物
如何撰写岗位职责
2014/02/01 职场文书
党员公开承诺书内容
2014/05/20 职场文书
2015年元旦文艺晚会总结(学院)
2014/11/28 职场文书
2014年青年教师工作总结
2014/12/17 职场文书
个人借条范本
2015/05/25 职场文书
天堂的孩子观后感
2015/06/11 职场文书
2016党员干部反腐倡廉心得体会
2016/01/13 职场文书
golang特有程序结构入门教程
2021/06/02 Python
总结Python连接CS2000的详细步骤
2021/06/23 Python
Java 超详细讲解IO操作字节流与字符流
2022/03/25 Java/Android