根据教程我正在组建一个多语言网站:http://nuts-and-bolts-of-cakephp.com/2008/11/28/cakephp-url-based-language-switching-for-i18n-and-l10n-internationalization-and-localization/
但是,本教程对不同语言(eng
,rus
)使用三个字母表示法,我只想使用两个字母。
我更改了config/core.php
Configure::write('Config.language', 'en');
然后还config/routes.php
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
文件,我从runing 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'
),
)
);
我缺少什么?
答案 0 :(得分:1)
您无需更改i18n内部,只需更改网址的外观。除路由配置外,其他所有内容都保持不变,并且在_setLanguage()
函数的开头将2个字母的语言代码转换为3个字母的代码。 (_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个字母的语言代码,但您可以为用户提供双字母代码。
答案 1 :(得分:0)
我发现自动发现用户浏览器的可能性非常有趣。
您可以通过以下方式添加其他选项:
...
}elseif(isset($_SERVER["HTTP_ACCEPT_LANGUAGE"])){
if (ereg("bg", $_SERVER["HTTP_ACCEPT_LANGUAGE"]))
$lang = 'bul';
if (ereg("en", $_SERVER["HTTP_ACCEPT_LANGUAGE"]))
$lang = 'eng';
}