多國語言支持,也被稱爲國際化,是現代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