我想在codeigniter中将param GET添加到URL。例如,用于检测网站中当前语言的param ?lang=en
。
如何在所有页面上使用此参数?
答案 0 :(得分:1)
试试这个..
首先,我们需要在开始使用语言支持之前配置必要的文件。 CodeIgniter配置文件位于application/config
目录中,包含一个名为language的选项,用于定义应用程序的默认语言。
<?php
$config['language'] = 'english';
我们还需要创建包含不同语言消息的实际文件。这些文件需要放在application/language
目录中,每个语言都有一个单独的目录。例如,英语语言文件应位于application/language/english
目录中,法语语言文件应位于application/language/french
。
让我们创建一些包含示例应用程序错误消息的语言文件。创建文件english / message_lang.php(所有语言文件都具有后缀_lang.php非常重要)。以下代码包含我们语言文件内容的一些示例条目:
<?php
$lang["msg_first_name"] = "First Name";
$lang["msg_last_name"] = "Last Name";
$lang["msg_dob"] = "Date of Birth";
$lang["msg_address"] = "Address";
当然,您可以在单个语言目录中包含多个语言文件。建议根据消息的上下文和目的将消息分组到不同的文件中,并在消息密钥前添加特定于文件的关键字以保持一致性。
另一种方法是为每个控制器创建单独的消息文件。这种技术的优点是只加载了所需的消息而不是整个语言文件,这可能会产生一定程度的性能开销。
加载语言文件 即使我们创建语言文件,在我们将它们加载到控制器中之前它们也无效。以下代码显示了我们如何在控制器中加载文件:
<?php
class TestLanguage extends CI_Controller
{
public function __construct() {
parent::__construct();
$this->lang->load("message","english");
}
function index() {
$data["language_msg"] = $this->lang->line("msg_hello_english");
$this->load->view('language_view', $data);
}
}
我们通常使用控制器和视图中的语言文件(使用模型中的语言文件并不是一件好事)。这里我们使用控制器的构造函数来加载语言文件,以便它可以在整个类中使用,然后我们在类“index()
方法中引用它。”
lang->load()
方法的第一个参数是没有_lang后缀的语言文件名。第二个参数是可选的,是语言目录。如果未在此处提供,它将指向配置中的默认语言。
我们可以使用lang->line()
方法直接引用语言文件的条目,并将其返回给传递给视图模板的数据。在视图中,我们可以将上述语言消息用作$ language_msg。
我们可能还需要直接从视图中加载语言文件。例如,使用表单标签的语言项可能被认为是直接加载和访问视图内的消息的一个很好的理由。可以对视图内的这些文件使用与内部控制器相同的访问方法。
<?php
$this->lang->line("msg_hello_english");
虽然它完美无缺,但当我们的视图模板代码不是实际类时,使用$ this会让人感到困惑。我们还可以在语言助手的支持下使用以下代码在视图中加载语言条目,这为我们提供了更清晰的代码。
<?php
lang("msg_view_english");
这基本上是您开始使用CodeIgniter语言文件时需要知道的全部内容。但即使这很简单,在每个控制器中加载必要的语言文件也是不必要和重复的工作,特别是如果你的项目包含数百个类。幸运的是,我们可以使用CodeIgniter钩子为每个控制器自动加载语言文件构建快速有效的解决方案。
指定语言加载对挂钩的责任 CodeIgniter调用一些内置的钩子作为其执行过程的一部分。您可以在用户指南中找到完整的挂钩列表。我们将使用post_controller_constructor挂钩,它在我们的控制器被实例化之后立即调用,并且在任何其他方法调用之前。
我们通过在主配置文件中设置enable_hooks参数来启用应用程序中的挂钩。
<?php
$config['enable_hooks'] = TRUE;
然后我们可以在config目录中打开hooks.php文件并创建一个自定义钩子,如下面的代码所示:
<?php
$hook['post_controller_constructor'] = array(
'class' => 'LanguageLoader',
'function' => 'initialize',
'filename' => 'LanguageLoader.php',
'filepath' => 'hooks'
);
这定义了钩子并提供了执行它所需的信息。实际的实现将在application / hooks目录中的自定义类中创建。
<?php
class LanguageLoader
{
function initialize() {
$ci =& get_instance();
$ci->load->helper('language');
$ci->lang->load('message','english');
}
}
在这里,我们无法使用$this->lang
访问语言库,因此我们需要使用get_instance()
函数获取CI对象实例,然后像我们一样加载语言早。现在语言文件将可用于我们应用程序的每个控制器,而无需在控制器内手动加载。
在不同语言之间切换
一旦我们建立了对多种语言的支持,就可以为用户提供每种语言的链接,通常在我们的应用程序菜单中,用户可以单击并切换语言。会话或cookie值可用于跟踪活动语言。
让我们看看如何使用我们之前生成的钩子类来管理语言切换。首先,我们需要创建一个类来切换语言;我们将使用一个单独的控制器,如下所示:
<?php
class LangSwitch extends CI_Controller
{
public function __construct() {
parent::__construct();
$this->load->helper('url');
}
function switchLanguage($language = "") {
$language = ($language != "") ? $language : "english";
$this->session->set_userdata('site_lang', $language);
redirect(base_url());
}
}
然后我们需要定义切换每种可用语言的链接。
<a href='<?php echo $base_url; ?>langswitch/switchLanguage/english'>English</a>
<a href='<?php echo $base_url; ?>langswitch/switchLanguage/french'>French</a>
每当用户选择特定语言时,LangSwitch类的switchLanguage()方法会将所选语言分配给会话并将用户重定向到主页。
现在,活动语言将在会话中更改,但在我们加载活动语言的特定语言文件之前,它仍然不会受到影响。我们还需要修改我们的hooks类,以便从会话中动态加载语言。
<?php
class LanguageLoader
{
function initialize() {
$ci =& get_instance();
$ci->load->helper('language');
$site_lang = $ci->session->userdata('site_lang');
if ($site_lang) {
$ci->lang->load('message',$ci->session->userdata('site_lang'));
} else {
$ci->lang->load('message','english');
}
}
}
在LanguageLoader类中,我们获取活动语言并加载必要的语言文件,或者如果会话密钥不存在,我们会加载默认语言。我们可以在这个类中加载单个语言的多个语言文件。
参考:http://www.sitepoint.com/multi-language-support-in-codeigniter/