多国语言支持,也被称为国际化,是现代Web应用程序的一个重要特征。大多数全栈PHP框架都带有多语言支持,这使我们能够动态地以不同语言呈现应用程序的界面,而无需重复使用每种语言的现有源代码。今天我们要讨论如何使用CodeIgniter启用多种语言,以及如何定制核心功能。
配置多语言支持
首先,我们需要配置必要的文件之前,我们就可以开始使用语言支持。位于application/config目录中的CodeIgniter配置文件包含一个名为language的选项,该选项定义应用程序的默认语言。
<?php
$config['language'] = 'english';
我们还需要创建包含我们不同语言信息的实际文件。这些文件需要放置在应用程序/语言目录内,每个语言都有一个单独的目录。例如,英语语言文件应驻留在应用程序/语言/英语目录中,法语语言文件应位于应用程序/语言/法语中。
让我们创建一些包含示例应用程序错误消息的语言文件。创建文件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钩子为每个控制器自动加载语言文件构建快速有效的解决方案。
指定语言加载的责任对钩
笨调用一些内置的钩子作为其执行过程的一部分。您可以在用户指南中找到完整的挂钩列表。我们将使用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');
}
}
在这里,我们没有获得使用$这个 - >郎的语言库,所以我们需要使用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()方法。
现在,活动语言会在会话中更改,但在加载活动语言的特定语言文件之前,它仍然不会受到影响。我们还需要修改我们的钩子类以从会话中动态加载语言。
<?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类中,我们得到了积极的语言,并加载必要的语言文件,或者我们加载默认语言,如果会话密钥不存在。我们可以在这个类中加载多种单一语言的语言文件。 ref:http://www.sitepoint.com/multi-language-support-in-codeigniter/
我把什么放What goes in here user2814461
– Dino
要给它以前 – user2814461