cakephp中的多种语言在URL中使用2个字母而不是3个字母
我正在根据教程创建一个多语言网站: 但是,本教程对不同的语言使用了三个字母表示法(cakephp中的多种语言在URL中使用2个字母而不是3个字母,cakephp,internationalization,multilingual,Cakephp,Internationalization,Multilingual,我正在根据教程创建一个多语言网站: 但是,本教程对不同的语言使用了三个字母表示法(eng,rus),我只想使用两个字母 我更改了config/core.php Configure::write('Config.language', 'en'); Router::connect('/:language/:controller/:action/*', array(), array('language' => '[a-z]{2}')); 然后还要config/routes.php Confi
eng
,rus
),我只想使用两个字母
我更改了config/core.php
Configure::write('Config.language', 'en');
Router::connect('/:language/:controller/:action/*', array(), array('language' => '[a-z]{2}'));
然后还要config/routes.php
Configure::write('Config.language', 'en');
Router::connect('/:language/:controller/:action/*', array(), array('language' => '[a-z]{2}'));
以及通往以下目的的道路:
locale/en/LC_MESSAGES/default.po
locale/ru/LC_MESSAGES/default.po
但它仍然不起作用。字符串变成默认值,不会从.po
文件中读取
.po
文件,我通过运行cake i18n生成一个.pot
文件,然后重命名为.po
并复制到每种语言的每个目录中
.po
文件是utf-8编码的
我的config/bootstrap.php中也有:
Configure::write('Config.languages', array(
'en' => array(
'language' => 'English',
'locale' => 'en',
'localeFallback' => 'en',
'charset' => 'utf-8'
),
'bg' => array(
'language' => 'Bulgarian',
'locale' => 'bg',
'localeFallback' => 'bg',
'charset' => 'utf-8'
),
)
);
我遗漏了什么?您不必为了改变URL的外观而改变i18n的内部结构。除了路由配置之外,不要管其他任何东西,在\u setLanguage()
函数开始时,将两个字母的语言代码转换为三个字母的代码。(\u setLanguage()
是您链接到的教程中提到的函数。)
例如,如果您知道您将只支持2-3种语言,那么手动进行转换最简单:
function _setLanguage() {
if ($this->Cookie->read('lang') && !$this->Session->check('Config.language')) {
$this->Session->write('Config.language', $this->Cookie->read('lang'));
}
else if (isset($this->params['language']) && ($this->params['language']
!= $this->Session->read('Config.language'))) {
// ADD THIS
switch( $this->params['language'] ) {
case 'bg':
$lang = 'bul';
break;
case 'en':
default:
$lang = 'eng';
break;
}
$this->Session->write('Config.language', $lang);
$this->Cookie->write('lang', $lang, false, '20 days');
}
}
现在一切都可以在引擎盖下使用3个字母的语言代码,但您可以向用户提供2个字母的代码。我发现自动发现用户浏览器语言的可能性也非常有趣
您可以通过以下方式添加附加选项:
对不起,我该怎么做?我是一个新手,我也不确定我是否理解你,现在我已经改变了一切,使用两个字母不是更好吗?这听起来是更好的选择,不是吗?当然,如果它有效的话,但你问这个问题是因为它不起作用,对吗?:)请看编辑后的答案。好吧,我想如果我犯了一个小错误,但可以纠正,我宁愿一切都是两个字母。但是如果没有人知道问题出在哪里,我会同意你的解决方案。谢谢“三个字符的区域设置代码符合标准,尽管如果您创建区域性区域设置(en_US、en_GB等),蛋糕会在适当的情况下使用它们。”因此,看起来,在幕后,CakePHP不识别两个字母,只有3个字母或2个字母的区域设置。(例如,“locale”=>“en_us”
)