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

多语言设计——使用了L18n国际标准

  [复制链接]
发表于 2012-4-6 11:58:57 | 显示全部楼层 |阅读模式
本帖最后由 xingch 于 2012-4-6 12:01 编辑

     首先大吼一声:我又回来了{:soso_e113:}
     做PHP的多语言系统,我一直使用的是单独的语言文件中用数组来实现。使用CI后发现也是这种设计,这样使用CI也用了2年了。其中对CI中语言文件的加载也做了些修改。
      最近下载PHPMYADMIN新版的时候发现它里面的语言文件是.MO格式,百度下了解是符合L18n标准的多语言软件的实现方式,对此感觉非常不错。可以使用工具从源码中自动抽取需要翻译的标识。进一步把程序员从语言翻译中脱离出来,结构也简单很多。
下面分别对CI原有语言系统修改和标准化语言方式我自己的使用方法写下,也是抛砖引玉。
一、 原有的框架中是用数组形式存储在语言文件中调用。在每次使用语言文件的时候都要加载一次,本人比较喜欢自动加载。于是最次做了些修改。如下:(CI版本1.7.2)
         (1)扩展核心类CI_Controller
PHP复制代码
class DK_Controller extends Controller {
/**
   * __construct
   */

function DK_Controller()
{
  parent::Controller();
  $this->load_lng();
}
Function load_lng()
{
  //我把语言分为两类:1、供系统多处调用的语言文件(如系统名、版权等);2、单独模块语言文件(以类文单位)
  $this->CI =& get_instance();
  $RTR =& load_class('Router');
  //加载整个系统公共语言
  if ( ! in_array('system_lang'.EXT, $this->CI->lang->is_loaded, TRUE))
  {
   $lang_system   = $this->CI->lang->load('system');
   $this->lang_system  = $lang_system;
  }
 
  //加载各个模块操作的语言,以类为单位,语言文件的文件名方式为:类名_lang.php
  $className = strtolower($RTR->fetch_class());
  if ( ! in_array($className.'_lang'.EXT, $this->CI->lang->is_loaded, TRUE))
  {
   $lang_page    = $this->CI->lang->load($RTR->fetch_directory().$className);
   $this->lang_page  = $lang_page[$className];
  }
}
}
复制代码
      (2)语言文件格式:类名_lang.php
PHP复制代码
class class_name extends DK_Controller {
function class_name()
{
  parent::DK_Controller();
  $lang_system = $this->lang_system;
  $lang_page  = $this->lang_page;
}[/align][align=left]Function action1(){
  $data = array(
   'lang_system' => $this->lang_system,
   'lang_page' => $this->lang_page,
  );
  //语言数组传入视图文件
  $this->load->view('视图文件', $data);
}
}
复制代码
二、     符合L18n标准的.MO语言文件模式,使用到的语言提取和编辑工具poEdit。
PHP里面调用.MO文件的函数为“gettext()”,也可以写成“_()”,实际为前者的宏定义。默认此扩展是没有开启的,所以要在PHP.INI中把该扩展开启。(我的WIN开发环境下“extension=php_gettext.dll“)。
  1      语言文件存放目录
/application
-----/locale
---------/zh_CN
------------system.mo
---------/ en_GB
------------system.mo
   2      扩展核心控制类
   扩展核心类CI_Controller
PHP复制代码
class DK_Controller extends Controller {
/**
        * __construct
        */

function DK_Controller()
{
  parent::Controller();
  $this->load_lng();//加载语言函数
}[/color][/align][align=left][color=#000000]function load_lng()
{
  define("ACKAGE", "d_system");//定义项目名称
  putenv("LANG = zh_CN");//定义服务器变量
  setlocale(LC_ALL, "zh_CN");//设置语言
  bindtextdomain(PACKAGE, APPPATH.'locale');//设置语言包位置
  bind_textdomain_codeset(PACKAGE, 'UTF-8');//设置编码,不设置会乱码
  textdomain(PACKAGE);//绑定
}
}
复制代码
   3      在控制类和视图中如果要输出语言的地方使用:_(‘this is a language!’);

  4      使用POEDIT 中新建消息目录文档:


搜索源代码获取语言标记进行翻译不同语言,保存.MO文件存放在相应语言的文件夹下,供系统调用。

Poedit工具的使用和.MO文件的说明,可以上百度查下具体的解释说明。各位大虾有什么好的意见,希望多多指教。

评分

参与人数 2威望 +9 收起 理由
Altair + 4 赞一个!
Hex + 5 很给力!

查看全部评分

本帖被以下淘专辑推荐:

发表于 2015-10-12 22:08:21 | 显示全部楼层
等用到这块的时候再回头仔细看下
发表于 2012-4-6 12:22:49 | 显示全部楼层
目前基本上都是只做国内软件
不过还是学习了
发表于 2012-4-6 12:51:11 | 显示全部楼层
//我把语言分为两类:1、供系统多处调用的语言文件(如系统名、版权等);2、单独模块语言文件(以类文单位)
  $this->CI =& get_instance();
  $RTR =& load_class('Router');

这里有点多余的工作了。
第一句
get_instance出来的就是$this
第二句
router已经加载过,直接用$this->router可以用
头像被屏蔽
发表于 2012-4-6 12:59:28 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
 楼主| 发表于 2012-4-6 21:50:58 | 显示全部楼层
jeongee 发表于 2012-4-6 12:51
//我把语言分为两类:1、供系统多处调用的语言文件(如系统名、版权等);2、单独模块语言文件(以类文单位 ...

受教了
 楼主| 发表于 2012-4-6 21:52:13 | 显示全部楼层
c361239752 发表于 2012-4-6 12:59
有情人终成家属

顶,是一种义务

兄弟你,让小弟很惆怅啊
 楼主| 发表于 2012-4-6 21:52:38 | 显示全部楼层
heykite 发表于 2012-4-6 20:21
任何的限制,都是从自己的内心开始的。

回一下

兄弟你也让小弟很惆怅啊
发表于 2012-4-9 17:57:09 | 显示全部楼层
非常好,等用到这块的时候再回头仔细看下
发表于 2012-4-17 23:15:58 | 显示全部楼层
为什么我看了之后 感觉还更复杂了点呢?
发表于 2012-7-23 21:21:10 | 显示全部楼层
这个不错的

本版积分规则