Codeigniter:如何使用数据库和用户会话数据构建多语言网站?

发布于 2024-12-09 01:28:13 字数 1198 浏览 0 评论 0原文

我需要在使用 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')?>

它会显示它使用配置文件中指定的语言。

现在我想通过单击链接更改语言。因此,我创建了一个“语言”控制器,其中包含此功能:

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?

I need to implement a way to switch languages in a website developed with Codeigniter. I know that Codeigniter has a library to manage language files and that's what I'm trying to use. But since I also need to be able to modify the translated text I'm storing the translations in the database and I'm generating the Codeigniter language files with a query, this way:

<?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 actually works, so when I call:

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

it displays it in the language specified in the config file.

Now I want to change the language clicking on a link. So I created a "languages" controller with this function inside:

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

it works and changes correctly both the session data and the config file. The problem is that I'm loading the language in a controller, this way:

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

and it just retrieve the language specified in the config file, without considering the language I set with my function.
So, after a while I figured it out I can load the language this way:

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

and it works. The problem is that I can't put this line in the autoload file. Actually, I can't put $this->lang->load('my'); either, since it says there's no DB object.

So, following this logic, is there another better approach to change language without messing with the url?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

樱花落人离去 2024-12-16 01:28:13

您可以尝试扩展控制器类。

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

然后,不要从控制器扩展 CI_Controller 类,而是从自定义类扩展。通过这种方式,您可以确保每次实例化控制器时都会加载您的语言。

有关详细信息,请参阅用户指南创建核心类

You could try extending the controller class.

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

Then instead of extending the CI_Controller class from your controllers extend from your custom class. In this way you are ensuring that each time a controller is instantiated it is loading your language.

See the User Guide Creating Core Classes for more information.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文