cakephp中的多种语言在URL中使用2个字母而不是3个字母

时间:2011-07-18 15:09:11

标签: cakephp internationalization multilingual

根据教程我正在组建一个多语言网站:http://nuts-and-bolts-of-cakephp.com/2008/11/28/cakephp-url-based-language-switching-for-i18n-and-l10n-internationalization-and-localization/

但是,本教程对不同语言(engrus)使用三个字母表示法,我只想使用两个字母。

我更改了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'
    ),
)
);

我缺少什么?

2 个答案:

答案 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';
}