YII应用的国际化

  • 作者:scsidisk
  • 最后编辑:2014年07月21日
  • 标签: PHP, Yii

一、区域和语言

YII定义了常见的区域标识,可以认为是表示区域的唯一ID。

YII中通过CLocale类存放区域数据(包括货币,日期,数字格式等等)。

通过一个区域唯一ID,然后就可以通过 CLocale::getInstance($localeID) 或者CApplication::getLocale($localeID) 获取相应的 CLocale 实例。通过CLocale实例,就能够判断用户所在的国家,使用的语言。然后可以根据CLocale的数据进行相应的翻译,让web应用更适于当前用户使用和阅读。最根本的就是为了用户进行特定的翻译。

在一个 Yii 应用程序中,我们区分了它的 目标语言(target language) 和 源语言(source language)。目标语言是应用程序的目标用户的语言(区域), 而源语言是指写在应用程序源代码中的语言(区域)。国际化仅会在这两种语言不同的情况下发生。

你可以设定 应用配置 中的 目标语言 ,或者在发生国际化之前动态设定此参数。

1
2
'sourceLanguage'=>'en_us',
'language'=>'zh_cn',

动态获取和设置

1
2
3
4
5
取得当前的语言:
$lang = Yii::app()->language;

设置当前的语言,可以在切换语言的时候保存或者用于一个方法内:
Yii::app()->language = 'en';

二、翻译

制作语言包

  1. 复制 framework/messages/config.php 文件到 protected/messages/ 下
  2. 更改 config.php 文件中的 ‘languages’=>array(‘zh_cn’,)
  3. 打开命令行工具 ,进入 protected/yii 目录 ,执行 php yiic message messages/config.php

    1
    
     在 protected/messages/ 下会生产 zh_cn 目录,若发现为空,是因为你没有需要翻译的内容。
    
  4. 找到你需要翻译的视图文件 如:Yii 自带blog 例子 post/_view.php 中 Tags: 改为 再执行命令上述命令 就可以看到zh_cn 目录下post.php 文件了。翻译之。
  5. 更改protected/config/main.php

    1
    2
    
     'sourceLanguage'=>'en_us',
     'language'=>'zh_cn',
    

在页面写入测试内容

在view/site/index.php里写入以下内容:

1
<?php echo Yii::t('Home','Test');?>

其中 ‘Home’ 为类别,会生成一个 Home.php 如果应用比较小,统一使用 ‘app’ 就可以了,最后所有的翻译文件都会到 app.php 更好的利用资源,不用每一个文件都生成翻译文件。

翻译

再次使用yiic翻译 php yii/framework/yiic message message/config.php

最后修改message 目录下的 zh_cn 包里的内容,刷新页面就可以了。

三、日期和时间格式化

CDateFormatter 类主要提供了两个方法以格式化 UNIX 时间戳。

  • format: 此方法可通过一个自定义的模式格式化给定的 UNIX 时间戳为一个字符串 (例如 $dateFormatter->format(‘yyyy-MM-dd’,$timestamp))。
  • formatDateTime: 此方法通过一个在目标区域数据中预定义的模式格式化给定的 UNIX 时间戳为一个字符串 (例如日期的 short 格式,时间的 long 格式)。

四、数字格式化

CNumberFormatter 提供的如下方法可以用于格式化 integer 或 double 值

  • format: 此方法通过一个自定义的模式格式化给定的数字为一个字符串 (例如 $numberFormatter->format(‘#,##0.00’,$number))。
  • formatDecimal: 此方法通过在目标区域数据中预定义的十进制模式格式化给定的数字。
  • formatCurrency: 此方法使用目标区域数据中预定义的货币模式格式化给定的数字。
  • formatPercentage: 此方法使用目标区域数据中预定义的百分比模式格式化给定的数字。

五、yii做双语网站

在学习过程中,要做中文网站,在生成模版时是可以直接生成中文的,但要是涉及到双语的,就要另外配置了。步骤如下:

首先在配置文件main.php中添加’language’=>’zh_cn’,此时默认为简体中文

1
2
3
4
5
6
7
return array(
   'language'=>'zh_cn',
   'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
   'name'=>'My Web Application',
   'theme'=>'base',
    ......
);

然后在/protected/messages/下添加

1
zh_cn
,
1
zh_tw
简体中文或繁体中文语言包,例如
1
zh_cn
下创建Base.php文件 里面的的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
return array(
    'Wellcome To:'=>'欢迎访问:',
    'Copyright&copy;'=>'版权所有&copy;',
    'Home'=>'主页',
    'Models'=>'模型',
    'Guestbook'=>'留言本',
    'About'=>'关于我们',
    'Contact'=>'联系我们',
    'Login'=>'登录',
    'Logout'=>'注销',
    'News'=>'新闻中心',
    ......
);
?>

接着在控制器中添加如下代码:

例如在/protected/controllers/SiteController.php中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public function init()
{
    if ( isset($_REQUEST['lang']) && $_REQUEST['lang']!="" ) {
        //通过lang参数识别语言
        Yii::app()->language=$_REQUEST['lang'];
        setcookie('lang',$_REQUEST['lang']);
    } elseif ( isset($_COOKIE['lang'])&&$_COOKIE['lang']!="" ) {
        //通过$_COOKIE['lang']识别语言
        Yii::app()->language=$_COOKIE['lang'];
    } else {
        //通过系统或浏览器识别语言
        $lang=explode(',',$_SERVER['HTTP_ACCEPT_LANGUAGE']);
        var_dump($lang);
        Yii::app()->language=strtolower(str_replace('-','_',$lang[0]));
    }
}

如果这一步有问题 就添加一个简单的初始方法:

1
2
3
4
public function init()
{
    Yii::app()->language='zh_cn';
}

改变整个站点的语言为中文,不用在控制器中加init方法。但如果做双语网站,

1
'language'=>'zh_cn'
注释掉,在控制器中根据用户点击判断调用哪个语言配置文件,即加入init方法。

最后在视图/views/layouts/main.php中调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<divid="mainmenu">
    <?php$this->widget('zii.widgets.CMenu',array(
        'items'=>array(
            array('label'=>Yii::t('Base','Home'),'url'=>array('/site/index')),
            array('label'=>Yii::t('Base','Models'),'url'=>array('/models')),
            array('label'=>Yii::t('Base','Guestbook'),'url'=>array('/guestbook')),
            array('label'=>'About','url'=>array('/site/page','view'=>'about')),
            array('label'=>'Contact','url'=>array('/site/contact')),
            array('label'=>'Login','url'=>array('/site/login'),'visible'=>Yii::app()->user->isGuest),
            array('label'=>'Logout('.Yii::app()->user->name.')','url'=>array('/site/logout'),'visible'=>!Yii::app()->user->isGuest)
        ),
    ));?>
</div>
<!-- mainmenu -->

Yii::t(‘Base’,’Home’) //Base是语言文件名称具体存在:

1
protected/messages/zh_cn/Base.php
在Base文件里要添加这个单词的中文