Codeigniter: как создать многоязычный веб-сайт, используя базу данных и данные сеанса пользователя? - PullRequest
1 голос
/ 10 октября 2011

Мне нужно реализовать способ переключения языков на веб-сайте, разработанном с помощью Codeigniter. Я знаю, что у Codeigniter есть библиотека для управления языковыми файлами, и это то, что я пытаюсь использовать. Но так как мне также нужно иметь возможность изменять переведенный текст, я храню переводы в базе данных и генерирую языковые файлы Codeigniter с помощью запроса следующим образом:

<?php
$LANGCI =& get_instance();

$lang_query = $LANGCI->db->where('lang', 'italian')->get('my_lang');

foreach ($lang_query->result() as $language_data) {

$lang[$language_data->index] = $language_data->translation;
}

Это на самом деле работает, поэтому, когда я звоню:

<?=$this->lang->line('label_about_us')?>

отображается на языке, указанном в файле конфигурации.

Теперь я хочу изменить язык, нажав на ссылку. Поэтому я создал контроллер "languages" с этой функцией внутри:

public function set_language($lang)
{
    $this->session->set_userdata('language', $lang);
    $this->config->set_item('language', $lang);
    redirect('');
}

работает и корректно меняет как данные сеанса, так и файл конфигурации. Проблема в том, что я загружаю язык в контроллер следующим образом:

$this->lang->load('my');

и он просто получает язык, указанный в файле конфигурации, без учета языка, который я установил с помощью своей функции. Итак, через некоторое время я понял, что могу загрузить язык следующим образом:

    $this->lang->load('my', $this->session->userdata('language'));

и это работает. Проблема в том, что я не могу поместить эту строку в файл автозагрузки. На самом деле, я не могу поставить $ this-> lang-> load ('my'); либо, так как он говорит, что нет объекта БД.

Итак, следуя этой логике, есть ли другой лучший способ изменить язык, не шутя с URL?

1 Ответ

1 голос
/ 01 ноября 2011

Вы можете попробовать расширить класс контроллера.

class MY_Controller extends CI_Controller
{
    function __construct()
    {
        parent::__construct();
        $this->lang->load('my', $this->session->userdata('language'));
    }
}

Тогда вместо того, чтобы расширять класс CI_Controller из ваших контроллеров, продолжайте из вашего пользовательского класса. Таким образом вы гарантируете, что каждый раз, когда создается экземпляр контроллера, он загружает ваш язык.

См. Руководство пользователя Создание базовых классов для получения дополнительной информации.

...