用户
 找回密码
 入住 CI 中国社区
搜索
查看: 14326|回复: 12
收起左侧

[程序 App] [1.5.4]CI 多语言解决方案【原创】

  [复制链接]
发表于 2008-2-18 00:22:12 | 显示全部楼层 |阅读模式
由于项目要求多语言自由切换(所以文字,包括网页文字和数据库),示例以 english、french、german为例子。
数据库设计(以一个简单blog为例)
表名:blog
字段:id, title_english, title_french, title_german, body_english, body_french, body_german, created_time...
语言文件:
在application/language下建3个文件夹:english, french, german
在english下建议一个 blog_lang.php
PHP复制代码
 
<?php
$lang['blog_title'] = "Blog title";
$lang['blog_body'] = "Blog body";
$lang['blog_hello'] = "Hello, welcome to CI blog.";
?>
复制代码
然后拷贝到french, german,修改内容为 法语和德语 (这里自己标记一下就OK啦,法语和德语不会 哈哈)
application 下 autoload
$autoload['libraries'] = array('database', 'session'); (用session存储当前语言的值)
$autoload['helper'] = array('url');   (下面有一个自动切换语言的类需要)
基本准备完毕,下面加入了 xwero 的语言切换:
(from http://codeigniter.com/forums/viewthread/64118/#315962)
在application/libraries 下建立一个 MY_language.php
PHP复制代码
class MY_Language extends CI_Language
{
function MY_Language()
{
parent::CI_Language();
}
function switch_to($idiom)
{
$CI =& get_instance();
if(is_string($idiom) && $idiom != $CI->config->item('language'))
{
$CI->config->set_item('language',$idiom);
$loaded = $this->is_loaded;
$this->is_loaded = array();
foreach($loaded as $file)
{
$this->load(str_replace('_lang.php','',$file));
}
}
}
}
复制代码
在application/controller下建立 admin.php
PHP复制代码
class Admin extends Controller
{
function Admin()
{
parent::Controller();
$this->lang->load('cms_form_msg');
$this->lang->load('cms_form');
$this->lang->switch_to($this->session->userdata('language'));
}
function langswitch()
{
$this->session->set_userdata('language',$this->uri->segment(3));
redirect(str_replace('_','/',$this->uri->segment(4)));
}
}
复制代码
下面设置你的 blog 的controller
PHP复制代码
class Blog extends Controller {
function Blog()
{
  parent::Controller();
  $this->lang->load('blog', $this->session->userdata('language'));
  $this->load->scaffolding('blog');
  $this->load->helper(array('url','form'));
}
function index()
{
  $data['query'] = $this->db->get('blog');
  $this->load->view('blog_view',$data);
}
}
复制代码
在视图blog_view 里
PHP复制代码
 
<html>
<head>
<title>
title.....</title>
</head>
<body>
<h1><?=$heading?></h1>
<h5><a href="<?php echo site_url('admin/langswitch/english'.$this->uri->uri_string().'/'); ?>">English</a> </h5>
<h5><a href="<?php echo site_url('admin/langswitch/french'.$this->uri->uri_string().'/'); ?>">French</a> </h5>
<h5><a href="<?php echo site_url('admin/langswitch/german'.$this->uri->uri_string().'/'); ?>">German</a> </h5>
<h2>-current language:<?=$this->session->userdata("language")?>-</h2>
<hr>
read language field:
<?=$this->lang->line('blog_title');?>
<hr>
<ul>
<?php foreach ($query->result_array() as $row):?>
  <?php echo '<li>'.$row['title_'.$this->session->userdata("language")].':'.$row['body_'.$this->session->userdata("language")].'</li>';?>
<?php endforeach;?>
</ul>
</body>
</html>
复制代码
好了。估计应该可以用啦。哈哈
注意:lony是个新手,不知道上面代码有哪里可以优化一下,还请高手们指点。嘿嘿
更希望高手们出个更漂亮的实例。有什么问题,请跟帖哦,大家一起研究下。

评分

参与人数 1威望 +5 收起 理由
Hex + 5 精品文章

查看全部评分

发表于 2008-2-18 01:39:10 | 显示全部楼层
感谢分享,加分加精。

PS: 请楼主修改一下代码高亮显示。
 楼主| 发表于 2008-2-18 09:30:46 | 显示全部楼层
怎么高亮?我点了 代码 然后 php,然后没有反应。。。。   

[php]php代码[/php]标记来高亮显示php代码 ?不管用哦。。。。

------------------  老大说:

  Hex<zhaochang_tj@hotmail.com>  9:42:11

[code=PHP]xxxx[/code]

[ 本帖最后由 lony 于 2008-2-18 09:47 编辑 ]
发表于 2008-9-15 01:25:59 | 显示全部楼层
lony
把admin.php里面这两行注释掉:
$this->lang->load('cms_form_msg');
$this->lang->load('cms_form');

才能顺利运行
发表于 2009-3-15 22:04:58 | 显示全部楼层
感谢分享,
数据库设计不太合理,譬如这个例子的DB变成这样更合理
blog(b_id,b_click,..........),
blog_description(b_id,b_name,b_comment,language_id........)
反正就是把逻辑上与语言内相关的参数提出来,这样就只需要session一个language_id就可以了基本数据库也3范了
发表于 2009-3-15 22:10:27 | 显示全部楼层
route 配合一下就行了
发表于 2009-3-16 09:42:32 | 显示全部楼层
是不是这样,先把config里面的设置注释掉
然后写一个根据自己的session或者cookie判断然后改变config的plugin就可以了
每次就只运行plugin就可以了 .
如果是这样的话,我来写一个sample
发表于 2010-12-30 16:59:28 | 显示全部楼层
:) 正要用session呢 这下可好了 有实例了
发表于 2011-4-9 19:02:51 | 显示全部楼层
这个方法 放到2.0中 不行了呢??怎办???
发表于 2011-4-27 09:58:44 | 显示全部楼层
建庫的方式有些問題,可能要改良下會比較好

本版积分规则