【问题标题】:Multiple languages in cakephp using 2-letter instead of 3-letter in URLcakephp 中的多种语言在 URL 中使用 2 个字母而不是 3 个字母
【发布时间】:2011-07-18 15:09:11
【问题描述】:

我正在按照教程整理一个多语言网站: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 文件,我从运行 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'
    ),
)
);

我错过了什么?

【问题讨论】:

    标签: cakephp internationalization multilingual


    【解决方案1】:

    您不必更改 i18n 的内部结构就可以更改 URL 的外观。除了路由配置和 _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 个字母的语言代码进行,但您可以向用户提供 2 个字母的代码。

    【讨论】:

    • 对不起,我该怎么做?我是一个新手,我不确定我是否理解你
    • 另外,既然我已经更改了所有内容,那么使用所有两个字母不是更好吗?这听起来像是更好的选择,不是吗?
    • 当然,如果它有效,但你问这个问题是因为它不起作用,对吧? :) 查看编辑后的答案。
    • 好吧,我想如果我犯了一个小错误,但可以修复,我希望所有内容都是 2 个字母。但是,如果没有人知道问题出在哪里,我会选择您的解决方案。谢谢!
    • 来自documentation:“三字符区域设置代码符合ISO 639-2 标准,但如果您创建区域区域设置(en_US、en_GB 等),如果合适,蛋糕将使用它们。 "所以看起来,在引擎盖下,CakePHP 不能识别两个字母,只有 3 个字母或 2 个带有 _locale 的字母。 (例如'locale' => 'en_us'
    【解决方案2】:

    我发现自动发现用户浏览器语言的可能性也很有趣。

    您可以通过这种方式添加附加选项:

    ...

    }elseif(isset($_SERVER["HTTP_ACCEPT_LANGUAGE"])){
        if (ereg("bg", $_SERVER["HTTP_ACCEPT_LANGUAGE"]))
            $lang = 'bul';
        if (ereg("en", $_SERVER["HTTP_ACCEPT_LANGUAGE"]))
            $lang = 'eng';
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      • 2020-07-25
      • 1970-01-01
      • 2022-01-23
      • 2019-03-18
      • 2016-09-02
      相关资源
      最近更新 更多