双语网站,国际化网站如何实现?

大家好,我想弄双语网站,可是看了说明知道 部分信息可以用1.Call Yii::t() 比如controller里边的

另一部分可以用view/zh_cn/ view里边

现在的问题:1,如何切换,就是说我点一个链接之后,系统能知道我使用的是哪个语言,然后接下来所有的信息都变了,包括链接啥的,指向这个语言的页面

2,翻译文件放哪,什么格式。

3,这种做法正确么?有没有更好的方法来实现双语或多语网站(我的意思是 t() 和File Translation具体在哪里用。

有人指导下,有例子么?

http://www.shotki.com/hezll/2009/12/yii如何实现双语化/

完整解决方法。

ui i18n在文档就有很详细的说明

model的i18n,可以看看这个扩展~

http://www.yiiframework.com/extension/multilingual-active-record/

我看了i18n的文档啊。可是真是才疏学浅。看不明白

我问的几个问题一个都没有讲啊

就是泛泛的介绍了一下。根本没有例子之类的。

有朋友棒棒忙么?

通常的做法是在网站的头部显示语言切换链接,里面包含一个语言参数。

一种做法是:你可以定义一个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里对此也有说明。

谢谢强的细心回答,我原本想得是给每个链接加上一个判断,现在看来不用这么麻烦了

那么语言放到session里边没有问题吧(访问量大或者并发高的时候)。我觉得这种解决办法是我目前觉得比较合适的

我个人更倾向于用cookie,原因是使用session的话,任何页面都需要打开session,这会造成一定的性能损失。

发现一个问题,按照您说的,我定义

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下面都是英文翻译成其他语种,没有其他语种翻译成英文

这个希望能解决下。要不然就得先把英文网站做好了,这样就影响进度了。我们都是先做中文版,上线后添加翻译

你有没有配置’sourceLanguage’=>‘zh_cn’ ?

好了,刚才通过

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了,翻译就起作用了

好了,基本上能够实现的,但是现在有两个问题。

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无效的时候)

  1. Yii::app()->controller->id, Yii::app()->controller->action->id

另外你如果用$controller ($this)来createUrl,那么你可以不用给出controller ID,缺省假设就是当前controller。例如$this->createUrl(‘view’)

  1. 是的。你可以重写CUrlManager::createUrl函数,或者用我说的另一个办法:让英语和中文拥有各自的hostname。后者不需要你重写createUrl。

关注~~~

留个印记,学习

建立

messages/zh_cn/app.php

config/main.php 中

‘sourceLanguage’=>‘en_us’,

‘language’=>‘zh_cn’,

  1. 在控制器中

public function init()

{

if( &#036;_GET['hl'] == 'en') 	


	Yii::app()-&gt;language ='en_us';


else 


	Yii::app()-&gt;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() 有点不便

直接在父级Controller复写init方法就可以不必每个都改了吧?

用cookie的方式会不会影响搜索引擎收录?

在父类 controller 中加上方法:




    public function init() {

    	if (Yii::app()->getRequest()->getServerName()=='cn.domain.com') {		

		Yii::app()->language='zh_cn';

    	}

    }



设置相应子域名就OK

不影响收录,还保持程序统一,不错!

正好用上,非常感谢!

学习了