hezll
(Hezll)
1
大家好,我想弄双语网站,可是看了说明知道 部分信息可以用1.Call Yii::t() 比如controller里边的
另一部分可以用view/zh_cn/ view里边
现在的问题:1,如何切换,就是说我点一个链接之后,系统能知道我使用的是哪个语言,然后接下来所有的信息都变了,包括链接啥的,指向这个语言的页面
2,翻译文件放哪,什么格式。
3,这种做法正确么?有没有更好的方法来实现双语或多语网站(我的意思是 t() 和File Translation具体在哪里用。
有人指导下,有例子么?
http://www.shotki.com/hezll/2009/12/yii如何实现双语化/
完整解决方法。
jerry2801
(Jerry2801)
2
hezll
(Hezll)
3
我看了i18n的文档啊。可是真是才疏学浅。看不明白
我问的几个问题一个都没有讲啊
就是泛泛的介绍了一下。根本没有例子之类的。
有朋友棒棒忙么?
qiang
(Qiang Xue)
4
通常的做法是在网站的头部显示语言切换链接,里面包含一个语言参数。
一种做法是:你可以定义一个controller基类,在它的init()里检测这个语言参数。如果有这个参数,就把Yii::app()->language设成对应的语言,并且把该语言参数保存到session或cookie里;如果没有,你需要检查session或cookie,看看它们是否有类似的语言参数。这样做的好处是你的其它链接里不用再有这个语言参数。
另一种做法是:定义不同的hostname,对应不同的语言。然后通过hostname判断当前的语言参数。
一旦你设置对language后,yii就会根据它选取对应的view script或message进行多语言显示。
views/controller/zh_cn下的view和views/controller下的是一样的,除了静态文本需要翻译成不同的语言。
至于消息文件的格式,它就是一个php script,包含了一个数组。具体请参考framework/messages/zh_cn/yii.php。guide里对此也有说明。
hezll
(Hezll)
5
谢谢强的细心回答,我原本想得是给每个链接加上一个判断,现在看来不用这么麻烦了
那么语言放到session里边没有问题吧(访问量大或者并发高的时候)。我觉得这种解决办法是我目前觉得比较合适的
qiang
(Qiang Xue)
6
我个人更倾向于用cookie,原因是使用session的话,任何页面都需要打开session,这会造成一定的性能损失。
hezll
(Hezll)
7
发现一个问题,按照您说的,我定义
public function init()
{
Yii::app()->language='zh_cn';
}
然后main.php 里边array(‘label’=>Yii::t(‘site’,‘Home’), ‘url’=>array(’/site/index’)),
然后建立相应的messages/zh_cn/site.php
里边 return array(‘Home’=>‘首页’);这样是完全没有问题的,可以实现中文和英文的切换
[b]
但是[/b]
如果我反过来,以中文作为 source language 这样就不行了。因为我们的网站主要用户还是中文,因此可能需要先开发完成中文版,最后才需要去添加英文版的翻译。
比如main.php 里边array(‘label’=>Yii::t(‘site’,‘首页’), ‘url’=>array(’/site/index’)),
public function init()
{
Yii::app()->language='en_us';
}
messages/en_us/site.php
里边 return array(‘首页’=>‘Home’);这样就不行了。
怎么都翻译不成英文,请问这个是yii本身的原因么?我看framework下面都是英文翻译成其他语种,没有其他语种翻译成英文
这个希望能解决下。要不然就得先把英文网站做好了,这样就影响进度了。我们都是先做中文版,上线后添加翻译
qiang
(Qiang Xue)
8
你有没有配置’sourceLanguage’=>‘zh_cn’ ?
hezll
(Hezll)
9
好了,刚才通过
public function translate($category,$message,$language=null)
{
if($language===null)
$language=Yii::app()->getLanguage();
echo $this->getLanguage();
if($language!==$this->getLanguage())
return $this->translateMessage($category,$message,$language);
else
return $message;
}
发现原来系统语言默认是英文,所以翻译没有起作用
我在main.php里边加上了’sourceLanguage’=>‘zh_cn’ 之后,系统语言就换成zh_cn了,翻译就起作用了
hezll
(Hezll)
10
好了,基本上能够实现的,但是现在有两个问题。
1:echo CHtml::link(‘中文’,array(‘site/index’,‘hl’=>‘zh’));?>|<?php echo CHtml::link(‘English’,array(‘site/index’,‘hl’=>‘en’));?>
这是view 页面中的中文,英文选在,我想把’site/index’ 改成不固定的,而是根据原先这个页面的路径来定。有没有方法得到当前页面的路径呢?或者是当前cotrller和action?
2: 页面上的其他链接,为了防止在cookie被禁用的时候,仍然能够有英语,所以需要所有链接加上参数。那么是不是需要修改
createUrl函数呢?还是有别的方法呢?统一给所有链接加上语言参数(当cookie无效的时候)
qiang
(Qiang Xue)
11
- Yii::app()->controller->id, Yii::app()->controller->action->id
另外你如果用$controller ($this)来createUrl,那么你可以不用给出controller ID,缺省假设就是当前controller。例如$this->createUrl(‘view’)
- 是的。你可以重写CUrlManager::createUrl函数,或者用我说的另一个办法:让英语和中文拥有各自的hostname。后者不需要你重写createUrl。
runerror
(Runerror)
14
-
建立
messages/zh_cn/app.php
-
config/main.php 中
‘sourceLanguage’=>‘en_us’,
‘language’=>‘zh_cn’,
- 在控制器中
public function init()
{
if( $_GET['hl'] == 'en')
Yii::app()->language ='en_us';
else
Yii::app()->language='zh_cn'; //默认为 中文
}
视图文件中:
<?php
echo CHtml::link(‘简体中文’,array(‘site/index’));
echo ‘|’;
echo CHtml::link(‘English’,array(‘site/index’,‘hl’=>‘en’));
?>
<p>
<?php echo Yii::t(‘app’,‘test’);?>
</p>
我是这样子做的,不过 如此做法 就要 每个控制器中都要 加init() 有点不便
elsonwu
(Elsonwu)
15
直接在父级Controller复写init方法就可以不必每个都改了吧?
bitshine
(D Sunshine)
17
在父类 controller 中加上方法:
public function init() {
if (Yii::app()->getRequest()->getServerName()=='cn.domain.com') {
Yii::app()->language='zh_cn';
}
}
设置相应子域名就OK