Unf*_*hed 1 url multilingual codeigniter
我已经设法使用两种语言的CodeIgniter创建网站,当我从那里直接切换它时,URL工作正常:
localhost/projectname/en/index.php
Run Code Online (Sandbox Code Playgroud)
至:
localhost/projectname/it/index.php
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试创建两个小标志,单击时会导致URL切换.我似乎找不到办法做到这一点,我已经尝试了很多.如果您对此有任何经验,请帮助我!
首先,我们需要在开始使用语言支持之前配置必要的文件.config位于application/config目录中的CodeIgniter 文件包含一个名为language的选项,用于定义应用程序的默认语言.
$config['language'] = 'english';
Run Code Online (Sandbox Code Playgroud)
我们还需要创建包含不同语言消息的实际文件.这些文件需要放在application/language目录中,每个语言都有一个单独的目录.例如,English语言文件应驻留在application/language/english目录中,French语言文件应位于其中application/language/french.
让我们创建一些包含示例应用程序错误消息的语言文件.创建文件english/message_lang.php(所有语言文件都有后缀很重要_lang.php).以下代码包含我们语言文件内容的一些示例条目:
$lang["msg_first_name"] = "First Name";
$lang["msg_last_name"] = "Last Name";
$lang["msg_dob"] = "Date of Birth";
$lang["msg_address"] = "Address";
Run Code Online (Sandbox Code Playgroud)
当然,您可以在单个语言目录中包含多个语言文件.建议根据消息的上下文和用途将消息分组到不同的文件中,并在消息密钥前添加特定于文件的关键字以保持一致性.
另一种方法是为每个控制器创建单独的消息文件.此技术的优点是只加载了所需的消息而不是整个语言文件,这可能会产生一定程度的性能开销.
即使我们创建语言文件,在我们将它们加载到控制器中之前它们也无效.以下代码显示了我们如何在控制器中加载文件:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我们通常使用控制器和视图中的语言文件(使用模型中的语言文件并不是一件好事).这里我们使用控制器的构造函数来加载语言文件,以便它可以在整个类中使用,然后我们在类的index()方法中引用它.
该lang->load()方法的第一个参数是没有_lang后缀的语言文件名.第二个参数是可选的,是语言目录.config如果此处未提供,它将指向您的默认语言.
我们可以使用该lang->line()方法直接引用语言文件的条目,并将其返回给传递给视图模板的数据.在视图中,我们可以使用上面的语言消息$language_msg.
我们可能需要直接从视图中加载语言文件.例如,使用表单标签的语言项可能被认为是直接加载和访问视图内的消息的一个很好的理由.可以对视图内的这些文件使用与内部控制器相同的访问方法.
$this->lang->line("msg_hello_english");
Run Code Online (Sandbox Code Playgroud)
虽然它完美地工作,但是$this当我们的视图模板代码不是实际的类时,可能会令人困惑.我们还可以在语言助手的支持下使用以下代码在视图中加载语言条目,这为我们提供了更清晰的代码.
lang("msg_view_english");
Run Code Online (Sandbox Code Playgroud)
这基本上是您开始使用CodeIgniter语言文件时需要知道的全部内容.但即使这很简单,在每个控制器中加载必要的语言文件也是不必要和重复的工作,特别是如果你的项目包含数百个类.幸运的是,我们可以使用CodeIgniter钩子为每个控制器自动加载语言文件构建快速有效的解决方案.
CodeIgniter调用一些内置的钩子作为其执行过程的一部分.您可以在用户指南中找到完整的挂钩列表.我们将使用post_controller_constructor挂钩,它在我们的控制器被实例化之后立即调用,并且在任何其他方法调用之前.
我们通过enable_hooks在主config文件中设置参数来启用应用程序中的挂钩.
$config['enable_hooks'] = TRUE;
Run Code Online (Sandbox Code Playgroud)
然后我们可以打开目录中的hooks.php文件config并创建一个自定义hook,如下面的代码所示:
$hook['post_controller_constructor'] = array(
'class' => 'LanguageLoader',
'function' => 'initialize',
'filename' => 'LanguageLoader.php',
'filepath' => 'hooks'
);
Run Code Online (Sandbox Code Playgroud)
这定义了钩子并提供了执行它的必要信息.实际的实现将在application/hooks目录中的自定义类中创建.
class LanguageLoader
{
function initialize() {
$ci =& get_instance();
$ci->load->helper('language');
$ci->lang->load('message','english');
}
}
Run Code Online (Sandbox Code Playgroud)
在这里我们没有使用语言库的访问权限$this->lang,所以我们需要CI使用该get_instance()函数获取对象实例,然后我们像之前那样加载语言.现在,语言文件将可用于我们应用程序的每个控制器,而无需在控制器内手动加载.
一旦我们建立了对多种语言的支持,就可以为用户提供每种语言的链接,通常在我们的应用程序菜单中,用户可以单击并切换语言.A session或cookie值可用于跟踪活动语言.
让我们看看如何使用hooks我们之前生成的类来管理语言切换.首先,我们需要创建一个类来切换语言; 我们将为此使用单独的控制器,如下所示:
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());
}
}
Run Code Online (Sandbox Code Playgroud)
然后我们需要定义链接以切换每种可用语言.
<a href='<?php echo $base_url; ?>langswitch/switchLanguage/english'>English</a>
<a href='<?php echo $base_url; ?>langswitch/switchLanguage/french'>French</a>
Run Code Online (Sandbox Code Playgroud)
每当用户选择特定语言时,该类的switchLanguage()方法LangSwitch将所选语言分配给session用户并将用户重定向到主页.
现在,活动语言将在会话中更改,但在我们加载活动语言的特定语言文件之前,它仍然不会受到影响.我们还需要修改我们的钩子类来动态加载语言session.
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');
}
}
}
Run Code Online (Sandbox Code Playgroud)
在LanguageLoader类中,我们获取活动语言并加载必要的语言文件,或者如果会话密钥不存在,我们加载默认语言.我们可以在这个类中加载单个语言的多个语言文件.
从这里阅读更多CodeIgniter中的多语言支持
| 归档时间: |
|
| 查看次数: |
8559 次 |
| 最近记录: |