Несколько языков в CakePHP, используя 2-буквенные вместо 3-буквенных в URL - PullRequest
0 голосов
/ 18 июля 2011

Я создаю многоязычный сайт в соответствии с руководством: http://nuts -and-bolts-of-cakephp.com / 2008/11/28 / cakephp-url-based-переключение языков i18n-и-l10n-интернационализация и локализация /

Однако в учебнике используются трехбуквенные обозначения для разных языков (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, которые я получил от запуска 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 ]

1 голос
/ 18 июля 2011

Вам не нужно менять внутренние компоненты i18n, чтобы просто изменить внешний вид URL. Оставьте все остальное в покое, кроме конфигурации маршрута, и в начале функции _setLanguage() преобразуйте двухбуквенные коды языка в трехбуквенные коды. (_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');
    }
}

Теперь все будет работать с использованием трехбуквенных языковых кодов, но вы можете предоставить пользователю двухбуквенные коды.

0 голосов
/ 14 ноября 2013

Мне также очень интересна возможность автоматического определения языка браузера пользователя.

Вы можете добавить дополнительную опцию следующим образом:

...

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