yii实现多语言方法

发表于:2017-11-06 19:32 阅读:

一. yii在实现多语言的过程中有3种方法,即:
 
1.提供各语言的本地化数据
在framework/i18n/data目录中有各种语言的本地化数据,包括时间日期数字等的本地化格式;
 
例如:显示中文的月份名称可以这样:
$locale = Yii::app()->getLocale('zh_cn');
print_r($locale->monthNames);
 
 
2.文本消息(或称为文本信息)翻译:
使用方法 Yii::t('category', '要翻译的文字信息') 可实现文本信息翻译,具体过程是,先在项目的message目录中建立翻译内容文件(即"消息源"),再对要翻译的文字信息使用Yii::t()方法,然后在主配置文件中设置应用程序语言(如只想翻译某个页面,也可在对应页面的控制器中设置语言选项)。
 
例如:翻译登录表单中的label标签内容(即:将“username”和“password”翻译为中文的“用户名”和“密码”),具体步骤如下:
 
步骤1:在项目的message目录中创建以目标语言ID命名的文件夹 zh_cn ,在其中创建一个 default.php 文件,内容如下:
return array(
'Username' => '用户名',
'Password' => '密码',
);
 
此处的文件名default.php中的“default”是“类别”名称(即Yii::t()方法中的第一个参数"category"),此类别名称可自定义,但不能使用“yii”(系统保留)。使用“类别”可实现同一消息的不同翻译版本,例如在刚才创建的 zh_cn 文件夹中再建立一个 second.php 文件,内容如下:
return array(
'Username' => '输入用户名',
'Password' => '输入密码',
);
 
当调用 Yii::t() 方法执行翻译时,可使用不同的类别实现不同的翻译内容:
Yii::t('default', 'Username')  翻译结果为 “用户名”
Yii::t('second', 'Username')  翻译结果为 “输入用户名”
 
步骤2:打开 models/loginForm.php ,修改其中的 attributeLabels 方法为:
public function attributeLabels()
{
return array(
'username'=>Yii::t('default', 'Username'),
'password'=>Yii::t('default', 'Password'),
…… ……
);
}
 
注意:还可在 Yii::t() 方法中传递参数,步骤为:
 
1.在消息源中定义参数:
return array(
'The username {username} is not available.' => '用户名{username}无效',
);
 
2.调用翻译方法:
echo Yii::t('default', 'The username {username} is not available.', array('{username}' => $username));
 
步骤3:设置应用程序 language 属性的值,在应用程序主配置文件 config/main.php 中添加:
'language'=>'zh_cn',
 
此时访问登录页面可以看到表单中的相应标签已翻译为中文。
 
 
3.文件(视图文件)翻译:
举例说明,如需将 site/index 的视图文件翻译为中文,先在 protected/views/site 目录中创建名为 zh_cn 文件夹,再将 protected/views/site/index.php 复制到 zh_cn 目录中,然后对其进行翻译,当设置了应用程序目标语言为 zh_cn 后,系统会自动调用此翻译好的视图文件。
 
 
二. 实现过程示例:
1.目标:翻译 project/index 页为中文,并实现中英文点击切换
2.任务:翻译页面标题与描述、站名、主导航菜单、面包屑、侧导航、project中文名称、页脚
 
一. 页面标题(title)与描述(description)翻译 (知识点:自定义属性/视图文件翻译)
1.在 protected/components/Controller.php 中定义所需的元标签属性:
($pageTitle系统已定义,故无需再定义)
public $pageTitle_en;
public $pageTitle_cn;
public $pageDescription;
public $pageDescription_en;
public $pageDescription_cn;
 
2.在 ProjectController.php 的 actionIndex() 方法中定义中英文标题标签的值:
$this->pageTitle_cn='这是项目列表页的中文title';
$this->pageDescription_cn='这是项目列表页的中文description';
$this->pageTitle_en='This is English Title';
$this->pageDescription_en='This is the english description of the project index page';
 
3.在 views/project/index.php 和 views/project/zh_cn/index.php 中分别添加如下语句:
$this->pageTitle=$this->pageTitle_en;
$this->pageDescription=$this->pageDescription_en;
 
$this->pageTitle=$this->pageTitle_cn;
$this->pageDescription=$this->pageDescription_cn;
 
4.在 views/layouts/main.php 中添加如下语句:
(title标签系统已有)
<meta name="description" content="<?php echo CHtml::encode($this->pageDescription); ?>" />
 
二. 站名(Yii::app()->name)翻译 (知识点:文本消息翻译)
1.在 protected/messages/zh_ch/default.php 中添加数组项:
return array(
'TrackStar'=>'跟踪之星',
);
 
2.在 views/layouts/main.php 中修改显示站名的代码为:
echo CHtml::encode(Yii::t('default',Yii::app()->name));
(注:Yii::app()->name 即主配置文件main.php中定义的 'name'=>'TrackStar')
 
三. 主导航菜单翻译 (知识点:文本消息翻译)
1.在 protected/messages/zh_ch/default.php 中添加数组项:
return array(
'Home'=>'首页',
'About'=>'关于我们',
'Contact'=>'联系方式',
'Login'=>'登录',
'Logout'=>'退出',
);
 
2.修改 views/layouts/main.php 中相应的菜单项:
array('label'=>Yii::t('default', 'Home'), 'url'=>array('/project')),
…… ……
 
 
四. 面包屑翻译 (知识点:视图文件翻译)
修改 views/project/zh_cn/index.php 中的面包屑代码为:
$this->breadcrumbs=array(
'项目',
);
 
五. 侧导航翻译 (知识点:文本消息翻译/视图文件翻译)
1.在 protected/messages/zh_ch/default.php 中添加数组项:
'Operations'=>'管理操作',
 
2.修改 views/layouts/column2.php 中的相应代码为:
$this->beginWidget('zii.widgets.CPortlet', array(
'title'=>Yii::t('default', 'Operations'),
));
 
3.修改 views/project/zh_cn/index.php 中的菜单代码为:
$this->menu=array(
array('label'=>'创建项目', 'url'=>array('create')),
array('label'=>'管理项目', 'url'=>array('admin')),
);
 
六. project中文名称显示 (知识点:视图文件翻译/显示数据库相应字段的值)
复制 views/project/_view.php 文件到 views/project/zh_cn/ 目录中,并修改相应代码为显示中文字段的值。
 
七. 页脚翻译 (知识点:文本消息翻译)
1.在 protected/messages/zh_ch/default.php 中添加数组项:
'Copyright ©'=>'版权所有',
 
2.修改 views/layouts/main.php 中的页脚代码为:
<?php echo Yii::t('default', 'Copyright ©'); ?>
 
八. 语言切换链接
使用“languageSelector”扩展实现,步骤为:
1.将 languageSelector 扩展文件夹复制到 protected/extensions 目录中;
 
2.将 availableLanguages 数组添加到主配置文件的 params 数组中:
'params'=>array(
'availableLanguages' => array(
        'en_us'=>'English',
        'zh_cn'=>'中文',
),
),
 
3.在 components/Controller.php 中添加以下方法:
public function init()
{
Yii::import('ext.languageSelector.LsWidget');
LsWidget::loadLanguage();
parent::init();
}
 
4.在视图文件中添加以下代码:
<?php $this->widget('ext.languageSelector.LsWidget'); ?>
 
5.语言切换链接的样式调整:
先在 LsWidget 类中重定义portlet的相关css类以便修改其样式:
public $htmlOptions=array('class'=>'portlet-languages');
public $contentCssClass='portlet-content-languages';
 
再添加自定义css(使链接置于页面右上角):
.portlet-languages
{
width:130px;
float:right;
}
.portlet-content-languages
{
font-size:14px;
margin: 0;
padding: 12px 8px;
background:#fff;
}


灵石网络专注于营销型网站设计、SEO搜索引擎优化、PHP开发、企业网络营销服务。


扫描二维码加我微信!