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”