Кодигниторный язык - PullRequest
       7

Кодигниторный язык

1 голос
/ 08 февраля 2010

Я хочу создать мультиязычный сайт, но я не хочу, чтобы язык отображался в URI, например example.com/fr/about (я этого не хочу). Я просто хочу изменить язык текста. Моя проблема в том, что первый язык загрузки, который я делаю, это навсегда Зачем? Если я сделаю:

$this->config->set_item(‘language’,‘english’);
$this->lang->load(‘messages’);
$this->config->set_item(‘language’,‘french’);
$this->lang->load(‘messages’);

или

$this->lang->load(‘messages’,‘english’);
$this->lang->load(‘messages’,‘french’);

только английский появляется. Как я могу это исправить?

Автозагрузка моего языка конфигурации пуста.

Спасибо за вашу помощь.

Ответы [ 3 ]

16 голосов
/ 08 февраля 2010

Я использую крючок для этого.

function pick_language() {

    require_once(APPPATH.'/config/language.php');

    session_start();

    // Lang set in URL via ?lang=something
    if(!empty($_GET['lang']))
    {
        // Turn en-gb into en
        $lang = substr($_GET['lang'], 0, 2);
        $_SESSION['lang_code'] = $lang;
    }

    // Lang has already been set and is stored in a session
    elseif( !empty($_SESSION['lang_code']) )
    {
        $lang = $_SESSION['lang_code'];
    }

    // Lang has is picked by a user.
    // Set it to a session variable so we are only checking one place most of the time
    elseif( !empty($_COOKIE['lang_code']) )
    {
        $lang = $_SESSION['lang_code'] = $_COOKIE['lang_code'];
    }

    // Still no Lang. Lets try some browser detection then
    else if (!empty( $_SERVER['HTTP_ACCEPT_LANGUAGE'] ))
    {
        // explode languages into array
        $accept_langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);

        log_message('debug', 'Checking browser languages: '.implode(', ', $accept_langs));

        // Check them all, until we find a match
        foreach ($accept_langs as $lang)
        {
            // Turn en-gb into en
            $lang = substr($lang, 0, 2);

            // Check its in the array. If so, break the loop, we have one!
            if(in_array($lang, array_keys($config['supported_languages'])))
            {
                break;
            }
        }
    }

    // If no language has been worked out - or it is not supported - use the default
    if(empty($lang) or !in_array($lang, array_keys($config['supported_languages'])))
    {
        $lang = $config['default_language'];
    }

    // Whatever we decided the lang was, save it for next time to avoid working it out again
    $_SESSION['lang_code'] = $lang;

    // Load CI config class
    $CI_config =& load_class('Config');

    // Set the language config. Selects the folder name from its key of 'en'
    $CI_config->set_item('language', $config['supported_languages'][$lang]['folder']);

    // Sets a constant to use throughout ALL of CI.
    define('CURRENT_LANGUAGE', $lang);
}

Это не только установит правильный язык для вас, но и даст вам постоянную CURRENT_LANGUAGE, которая содержит язык, который они используют ('en', 'de' и т. Д.).

Доступные языки для этого поступают из элемента конфигурации:

/*
|--------------------------------------------------------------------------
| Supported Languages
|--------------------------------------------------------------------------
|
| Contains all languages your site will store data in. Other languages can
| still be displayed via language files, thats totally different.
| 
| Check for HTML equivalents for characters such as � with the URL below:
|    http://htmlhelp.com/reference/html40/entities/latin1.html
|
*/
$config['supported_languages'] = array(
    'en'=> array('name' => 'English', 'folder' => 'english'),
    'es'=> array('name' => 'Español', 'folder' => 'spanish'),
    'fr'=> array('name' => 'Français', 'folder' => 'french'),
    'de'=> array('name' => 'German', 'folder' => 'german')
);

/*
|--------------------------------------------------------------------------
| Default Language
|--------------------------------------------------------------------------
|
| If no language is specified, which one to use? Must be in the array above
|
|   en
|
*/
$config['default_language'] = 'en';

Это выберет правильный язык из GET (http://somesite.com/?lang=de),, затем проверит переменную сеанса (заполненную правильным соответствием), затем проверит браузер на наличие заголовка accept-lang.

Будет использовано первое совпадение.

5 голосов
/ 08 февраля 2010

Прочтите Руководство разработчика , есть несколько вещей, которые следует учитывать:

  • "Языковые файлы должны иметь имя _lang.php в качестве расширения файла." - ваш файл просто называется "message"
  • Используйте разные файлы для разных языков
  • Простое выполнение $this->lang->load("messages"); без второго аргумента загрузит язык по умолчанию
  • Показать переведенные тексты с $this->lang->line('some_key');
1 голос
/ 14 июня 2013

Вы можете очистить загруженные языки, используя:

$this->lang->is_loaded = array();
$this->lang->language = array();

Это позволит вам впоследствии загрузить другой язык, используя $ this-> lang-> load ('language_file', 'language').

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...