xingch 发表于 2012-4-6 11:58:57

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

本帖最后由 xingch 于 2012-4-6 12:01 编辑

   首先大吼一声:我又回来了{:soso_e113:}
   做PHP的多语言系统,我一直使用的是单独的语言文件中用数组来实现。使用CI后发现也是这种设计,这样使用CI也用了2年了。其中对CI中语言文件的加载也做了些修改。
      最近下载PHPMYADMIN新版的时候发现它里面的语言文件是.MO格式,百度下了解是符合L18n标准的多语言软件的实现方式,对此感觉非常不错。可以使用工具从源码中自动抽取需要翻译的标识。进一步把程序员从语言翻译中脱离出来,结构也简单很多。下面分别对CI原有语言系统修改和标准化语言方式我自己的使用方法写下,也是抛砖引玉。一、 原有的框架中是用数组形式存储在语言文件中调用。在每次使用语言文件的时候都要加载一次,本人比较喜欢自动加载。于是最次做了些修改。如下:(CI版本1.7.2)         (1)扩展核心类CI_Controllerclass 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.phpclass class_name extends DK_Controller {
function class_name()
{
parent::DK_Controller();
$lang_system = $this->lang_system;
$lang_page= $this->lang_page;
}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_Controllerclass DK_Controller extends Controller {
/**
      * __construct
      */
function DK_Controller()
{
parent::Controller();
$this->load_lng();//加载语言函数
}function load_lng()
{
define("PACKAGE", "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 中新建消息目录文档:
http://codeigniter.org.cn/forums/data/attachment/album/201204/06/114641ss2at7tw72j7t7o7.jpghttp://codeigniter.org.cn/forums/data/attachment/album/201204/06/114644aoxh2hwewzwia2rt.jpg
搜索源代码获取语言标记进行翻译不同语言,保存.MO文件存放在相应语言的文件夹下,供系统调用。http://codeigniter.org.cn/forums/data/attachment/album/201204/06/114648caanjmykpfjqjbnm.jpg
Poedit工具的使用和.MO文件的说明,可以上百度查下具体的解释说明。各位大虾有什么好的意见,希望多多指教。

elileo 发表于 2015-10-12 22:08:21

等用到这块的时候再回头仔细看下

kissgxd 发表于 2012-4-6 12:22:49

目前基本上都是只做国内软件
不过还是学习了

jeongee 发表于 2012-4-6 12:51:11

//我把语言分为两类:1、供系统多处调用的语言文件(如系统名、版权等);2、单独模块语言文件(以类文单位)
$this->CI =& get_instance();
$RTR =& load_class('Router');

这里有点多余的工作了。
第一句
get_instance出来的就是$this
第二句
router已经加载过,直接用$this->router可以用

c361239752 发表于 2012-4-6 12:59:28

xingch 发表于 2012-4-6 21:50:58

jeongee 发表于 2012-4-6 12:51 static/image/common/back.gif
//我把语言分为两类:1、供系统多处调用的语言文件(如系统名、版权等);2、单独模块语言文件(以类文单位 ...

受教了

xingch 发表于 2012-4-6 21:52:13

c361239752 发表于 2012-4-6 12:59 static/image/common/back.gif
有情人终成家属

顶,是一种义务

兄弟你,让小弟很惆怅啊{:1_1:}

xingch 发表于 2012-4-6 21:52:38

heykite 发表于 2012-4-6 20:21 static/image/common/back.gif
任何的限制,都是从自己的内心开始的。

回一下


兄弟你也让小弟很惆怅啊{:1_1:}

^淡如清风 发表于 2012-4-9 17:57:09

非常好,等用到这块的时候再回头仔细看下

as3291363 发表于 2012-4-17 23:15:58

为什么我看了之后 感觉还更复杂了点呢?

liangpz521 发表于 2012-7-23 21:21:10

这个不错的
页: [1] 2
查看完整版本: 多语言设计——使用了L18n国际标准