# 國際化
國際化(I18N)是指在設計軟件時,使它可以無需做大的改變就能夠適應不同的語言和地區的需要。對于 Web 應用程序, 這有著特別重要的意義,因為潛在的用戶可能會在全球范圍內。 Yii 提供的國際化功能支持全方位信息翻譯,視圖翻譯,日期和數字格式化。
## 區域和語言
區域設置是一組參數以定義用戶希望能在他們的用戶界面所看到用戶的語言,國家和任何特殊的偏好。 它通常是由語言 ID 和區域 ID 組成。例如,ID “en-US” 代表英語和美國的語言環境。為了保持一致性, 在 Yii 應用程序中使用的所有區域 ID 應該規范化為?`ll-CC`,其中?`ll`?是根據兩個或三個字母的小寫字母語言代碼?[ISO-639](http://www.loc.gov/standards/iso639-2/)?和?`CC`?是兩個字母的國別代碼?[ISO-3166](http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html)。 有關區域設置的更多細節可以看?[ICU 項目文檔](http://userguide.icu-project.org/locale#TOC-The-Locale-Concept)。
在 Yii中,我們經常用 “language” 來代表一個區域。
一個 Yii 應用使用兩種語言:yii\base\Application::$sourceLanguage 和 yii\base\Application::$language 。前者指的是寫在代碼中的語言,后者是向最終用戶顯示內容的語言。 而信息翻譯服務主要是將文本消息從原語言翻譯到目標語言。
可以用類似下面的應用程序配置來配置應用程序語言:
~~~
return [
// 設置目標語言為俄語
'language' => 'ru-RU',
// 設置源語言為英語
'sourceLanguage' => 'en-US',
......
];
~~~
默認的 yii\base\Application::$sourceLanguage 值是?`en-US`,即美國英語。 建議你保留此默認值不變,因為通常讓人將英語翻譯成其它語言要比將其它語言翻譯成其它語言容易得多。
你經常需要根據不同的因素來動態地設置 yii\base\Application::$language ,如最終用戶的語言首選項。 要在應用程序配置中配置它,你可以使用下面的語句來更改目標語言:
~~~
// 改變目標語言為中文
\Yii::$app->language = 'zh-CN';
~~~
## 消息翻譯
消息翻譯服務用于將一條文本信息從一種語言(通常是 yii\base\Application::$sourceLanguage ) 翻譯成另一種語言(通常是 yii\base\Application::$language)。 它的翻譯原理是通過在語言文件中查找要翻譯的信息以及翻譯的結果。如果要翻譯的信息可以在語言文件中找到,會返回相應的翻譯結果; 否則會返回原始未翻譯的信息。
為了使用消息翻譯服務,需要做如下工作:
* 調用 Yii::t() 方法且在其中包含每一條要翻譯的消息;
* 配置一個或多個消息來源,能在其中找得到要翻譯的消息和翻譯結果;
* 讓譯者翻譯信息并將它們存儲在消息來源。
這個 Yii::t() 方法的用法如下,
~~~
echo \Yii::t('app', 'This is a string to translate!');
~~~
第一個參數指儲存消息來源的類別名稱,第二個參數指需要被翻譯的消息。
這個 Yii::t() 方法會調用?`i18n`?[應用組件](http://www.yiichina.com/doc/guide/2.0/structure-application-components)?來實現翻譯工作。這個組件可以在應用程序中按下面的代碼來配置,
~~~
'components' => [
// ...
'i18n' => [
'translations' => [
'app*' => [
'class' => 'yii\i18n\PhpMessageSource',
//'basePath' => '@app/messages',
//'sourceLanguage' => 'en-US',
'fileMap' => [
'app' => 'app.php',
'app/error' => 'error.php',
],
],
],
],
],
~~~
在上面的代碼中,配置了由 yii\i18n\PhpMessageSource 所支持的消息來源。模式?`app*`?表示所有以?`app`?開頭的消息類別名稱都使用這個翻譯的消息來源。該 yii\i18n\PhpMessageSource 類使用 PHP 文件來存儲消息翻譯。 每 PHP 文件對應單一類別的消息。默認情況下,文件名應該與類別名稱相同。但是,你可以配置 yii\i18n\PhpMessageSource::fileMap 來映射一個類別到不同名稱的 PHP 文件。在上面的例子中, 類別?`app/error`?被映射到PHP文件?`@app/messages/ru-RU/error.php`(假設?`ru-RU`?為目標語言)。如果沒有此配置, 該類別將被映射到?`@app/messages/ru-RU/app/error.php`?。
除了在PHP文件中存儲消息來源,也可以使用下面的消息來源在不同的存儲來存儲翻譯的消息:
* yii\i18n\GettextMessageSource 使用 GNU Gettext 的 MO 或 PO 文件保存翻譯的消息。
* yii\i18n\DbMessageSource 使用一個數據庫表來存儲翻譯的消息。
## 消息格式化
在要翻譯的消息里,你可以嵌入一些占位符,并讓它們通過動態的參數值來代替。你甚至可以根據目標語言格式的參數值來使用特殊的占位符。 在本節中,我們將介紹如何用不同的方式來格式化消息。
### 消息參數
在待翻譯的消息,可以嵌入一個或多個占位符,以便它們可以由給定的參數值取代。通過給不同的參數值,可以動態地改變翻譯內容的消息。 在下面的例子中,占位符?`{username}`?在?`“Hello, {username}!”`?中將分別被?`'Alexander'`和`'Qiang'`?所替換。
~~~
$username = 'Alexander';
// 輸出:“Hello, Alexander”
echo \Yii::t('app', 'Hello, {username}!', [
'username' => $username,
]);
$username = 'Qiang';
// 輸出:“Hello, Qiang”
echo \Yii::t('app', 'Hello, {username}!', [
'username' => $username,
]);
~~~
當翻譯的消息包含占位符時,應該讓占位符保留原樣。這是因為調用?`Yii::t()`?時,占位符將被實際參數值代替。
你可以使用?*名稱占位符*?或者?*位置占位符*,但不能兩者都用在同一個消息里。
前面的例子說明了如何使用名稱占位符。即每個占位符的格式為?`{參數名稱}`?,你所提供的參數作為關聯數組, 其中數組的鍵是參數名稱(沒有大括號),數組的值是對應的參數值。
位置占位符是使用基于零的整數序列,在調用?`Yii::t()`?時會參數值根據它們出現位置的順序分別進行替換。 在下面的例子中,位置占位符?`{0}`,`{1}`?和?`{2}`?將分別被?`$price`,`$count`?和?`$subtotal`?所替換。
~~~
$price = 100;
$count = 2;
$subtotal = 200;
echo \Yii::t('app', 'Price: {0}, Count: {1}, Subtotal: {2}', $price, $count, $subtotal);
~~~
> 提示:大多數情況下你應該使用名稱占位符。這是因為參數名稱可以讓翻譯者更好的理解要被翻譯的消息。
### 格式化參數
你可以在消息的占位符指定附加格式的規則,這樣的參數值可在替換占位符之前格式化它們。在下面的例子中, 價格參數值將視為一個數并格式化為貨幣值:
~~~
$price = 100;
echo \Yii::t('app', 'Price: {0, number, currency}', $price);
~~~
> 注意:參數的格式化需要安裝?[intl PHP 擴展](http://www.php.net/manual/en/intro.intl.php)。
可以使用縮寫的形式或完整的形式來格式化占位符:
~~~
short form: {PlaceholderName, ParameterType}
full form: {PlaceholderName, ParameterType, ParameterStyle}
~~~
請參閱?[ICU 文檔](http://icu-project.org/apiref/icu4c/classMessageFormat.html)?關于如何指定這樣的占位符的說明。
接下來我們會展示一些常用的使用方法。
#### 數字
參數值應該被格式化為一個數。例如,
~~~
$sum = 42;
echo \Yii::t('app', 'Balance: {0, number}', $sum);
~~~
你可以指定參數的格式為?`integer`(整型),`currency`?(貨幣),或者?`percent`?(百分數):
~~~
$sum = 42;
echo \Yii::t('app', 'Balance: {0, number, currency}', $sum);
~~~
你也可以指定一個自定義模式來格式化數字。 例如,
~~~
$sum = 42;
echo \Yii::t('app', 'Balance: {0, number, ,000,000000}', $sum);
~~~
[格式化參考](http://icu-project.org/apiref/icu4c/classicu_1_1DecimalFormat.html)。
#### 日期
該參數值應該被格式化為一個日期。 例如,
~~~
echo \Yii::t('app', 'Today is {0, date}', time());
~~~
你可以指定一個可選的參數格式?`short`?,`medium`?,`long`?,或?`full`?:
~~~
echo \Yii::t('app', 'Today is {0, date, short}', time());
~~~
你還可以指定一個自定義模式來格式化日期:
~~~
echo \Yii::t('app', 'Today is {0, date, yyyy-MM-dd}', time());
~~~
[格式化參考](http://icu-project.org/apiref/icu4c/classicu_1_1SimpleDateFormat.html)。
#### 時間
參數值應該被格式化為一個時間。 例如,
~~~
echo \Yii::t('app', 'It is {0, time}', time());
~~~
你可以指定一個可選的參數格式?`short`?,`medium`?,`long`?,或?`full`?:
~~~
echo \Yii::t('app', 'It is {0, time, short}', time());
~~~
你還可以指定一個自定義模式來格式化時間:
~~~
echo \Yii::t('app', 'It is {0, date, HH:mm}', time());
~~~
[格式化參考](http://icu-project.org/apiref/icu4c/classicu_1_1SimpleDateFormat.html)。
#### 拼寫
參數值為一個數并被格式化為它的字母拼寫形式。 例如,
~~~
// 輸出:"42 is spelled as forty-two"
echo \Yii::t('app', '{n,number} is spelled as {n, spellout}', ['n' => 42]);
~~~
#### 序數詞
參數值為一個數并被格式化為一個序數詞。 例如,
~~~
// 輸出:"You are the 42nd visitor here!"
echo \Yii::t('app', 'You are the {n, ordinal} visitor here!', ['n' => 42]);
~~~
#### 持續時間
參數值為秒數并被格式化為持續的時間段。 例如,
~~~
// 輸出:"You are here for 47 sec. already!"
echo \Yii::t('app', 'You are here for {n, duration} already!', ['n' => 47]);
~~~
#### 復數
不同的語言有不同的方式來表示復數。 Yii 提供一個便捷的途徑,即使是非常復雜的規則也使翻譯消息時不同的復數形式行之有效。 取之以直接處理詞形變化規則,它是足以面對某些詞形變化語言的翻譯。 例如,
~~~
// 當 $n = 0 時,輸出:"There are no cats!"
// 當 $n = 1 時,輸出:"There is one cat!"
// 當 $n = 42 時,輸出:"There are 42 cats!"
echo \Yii::t('app', 'There {n, plural, =0{are no cats} =1{is one cat} other{are # cats}}!', ['n' => $n]);
~~~
在上面的多個規則的參數中,?`=0`?意味著?`n`?的值是 0 ,`=1`?意味著?`n`?的值是 1 , 而?`other`?則是對于其它值,?`#`?會被?`n`?中的值給替代。
復數形式可以是某些非常復雜的語言。下面以俄羅斯為例,`=1`?完全匹配?`n = 1`,而?`one`?匹配?`21`?或?`101`:
~~~
Здесь {n, plural, =0{котов нет} =1{есть один кот} one{# кот} few{# кота} many{# котов} other{# кота}}!
~~~
注意,上述信息主要是作為一個翻譯的信息,而不是一個原始消息,除非設置應用程序的 yii\base\Application::$sourceLanguage 為`ru-RU`。
如果沒有找到一個翻譯的原始消息,復數規則 yii\base\Application::$sourceLanguage 將被應用到原始消息。
要了解詞形變化形式,你應該指定一個特定的語言,請參考?[rules reference at unicode.org](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html)。
#### 選擇
可以使用?`select`?參數類型來選擇基于參數值的短語。例如,
~~~
// 輸出:"Snoopy is a dog and it loves Yii!"
echo \Yii::t('app', '{name} is a {gender} and {gender, select, female{she} male{he} other{it}} loves Yii!', [
'name' => 'Snoopy',
'gender' => 'dog',
]);
~~~
在上面的表達中,?`female`?和?`male`?是可能的參數值,而?`other`?用于處理不與它們中任何一個相匹配的值。對于每一個可能的參數值, 應指定一個短語并把它放在在一對大括號中。
### 指定默認翻譯
你可以指定使用默認的翻譯,該翻譯將作為一個類別,用于不匹配任何其他翻譯的后備。這種翻譯應標有?`*`?。 為了做到這一點以下內容需要添加到應用程序的配置:
~~~
//配置 i18n 組件
'i18n' => [
'translations' => [
'*' => [
'class' => 'yii\i18n\PhpMessageSource'
],
],
],
~~~
現在,你可以使用每一個還沒有配置的類別,這跟 Yii 1.1 的行為有點類似。該類別的消息將來自在默認翻譯?`basePath`?中的一個文件, 該文件在?`@app/messages`?:
~~~
echo Yii::t('not_specified_category', 'message from unspecified category');
~~~
該消息將來自?`@app/messages/<LanguageCode>/not_specified_category.php`?。
### 翻譯模塊消息
如果你想翻譯一個模塊的消息,并避免使用單一翻譯文件的所有信息,你可以按照下面的方式來翻譯:
~~~
<?php
namespace app\modules\users;
use Yii;
class Module extends \yii\base\Module
{
public $controllerNamespace = 'app\modules\users\controllers';
public function init()
{
parent::init();
$this->registerTranslations();
}
public function registerTranslations()
{
Yii::$app->i18n->translations['modules/users/*'] = [
'class' => 'yii\i18n\PhpMessageSource',
'sourceLanguage' => 'en-US',
'basePath' => '@app/modules/users/messages',
'fileMap' => [
'modules/users/validation' => 'validation.php',
'modules/users/form' => 'form.php',
...
],
];
}
public static function t($category, $message, $params = [], $language = null)
{
return Yii::t('modules/users/' . $category, $message, $params, $language);
}
}
~~~
在上面的例子中,我們使用通配符匹配,然后過濾了所需的文件中的每個類別。取之使用?`fileMap`?,你可以簡單地使用類映射的同名文件。 現在你可以直接使用?`Module::t('validation', 'your custom validation message')`?或?`Module::t('form', 'some form label')`。
### 翻譯小部件消息
上述模塊的翻譯規則也同樣適用于小部件的翻譯規則,例如:
~~~
<?php
namespace app\widgets\menu;
use yii\base\Widget;
use Yii;
class Menu extends Widget
{
public function init()
{
parent::init();
$this->registerTranslations();
}
public function registerTranslations()
{
$i18n = Yii::$app->i18n;
$i18n->translations['widgets/menu/*'] = [
'class' => 'yii\i18n\PhpMessageSource',
'sourceLanguage' => 'en-US',
'basePath' => '@app/widgets/menu/messages',
'fileMap' => [
'widgets/menu/messages' => 'messages.php',
],
];
}
public function run()
{
echo $this->render('index');
}
public static function t($category, $message, $params = [], $language = null)
{
return Yii::t('widgets/menu/' . $category, $message, $params, $language);
}
}
~~~
你可以簡單地使用類映射的同名文件而不是使用?`fileMap`?。現在你直接可以使用?`Menu::t('messages', 'new messages {messages}', ['{messages}' => 10])`?。
> **提示**: 對于小部件也可以使用 i18n 視圖,并一樣以控制器的規則來應用它們。
### 翻譯框架信息
Yii 自帶了一些默認的信息驗證錯誤和其他一些字符串的翻譯。這些信息都是在?`yii`?類別中。有時候你想糾正應用程序的默認信息翻譯。 為了做到這一點,需配置?`i18n`?[應用組件](http://www.yiichina.com/doc/guide/2.0/structure-application-components)?如下:
~~~
'i18n' => [
'translations' => [
'yii' => [
'class' => 'yii\i18n\PhpMessageSource',
'sourceLanguage' => 'en-US',
'basePath' => '@app/messages'
],
],
],
~~~
現在可以把你修改過的翻譯放在?`@app/messages/<language>/yii.php`。
### 處理缺少的翻譯
如果翻譯的消息在消息源文件里找不到,Yii 將直接顯示該消息內容。這樣一來當你的原始消息是一個有效的冗長的文字時會很方便。 然而,有時它是不能實現我們的需求。你可能需要執行一些自定義處理的情況,這時請求的翻譯可能在消息翻譯源文件找不到。 這可通過使用 yii\i18n\MessageSource::EVENT_MISSING_TRANSLATION - yii\i18n\MessageSource 的事件來完成。
例如,你可能想要將所有缺失的翻譯做一個明顯的標記,這樣它們就可以很容易地在頁面中找到。 為此,你需要先設置一個事件處理程序。這可以在應用程序配置中進行:
~~~
'components' => [
// ...
'i18n' => [
'translations' => [
'app*' => [
'class' => 'yii\i18n\PhpMessageSource',
'fileMap' => [
'app' => 'app.php',
'app/error' => 'error.php',
],
'on missingTranslation' => ['app\components\TranslationEventHandler', 'handleMissingTranslation']
],
],
],
],
~~~
現在,你需要實現自己的事件處理程序:
~~~
<?php
namespace app\components;
use yii\i18n\MissingTranslationEvent;
class TranslationEventHandler
{
public static function handleMissingTranslation(MissingTranslationEvent $event)
{
$event->translatedMessage = "@MISSING: {$event->category}.{$event->message} FOR LANGUAGE {$event->language} @";
}
}
~~~
如果 yii\i18n\MissingTranslationEvent::translatedMessage 是由事件處理程序設置,它將顯示翻譯結果。
> 注意:每個消息源會單獨處理它缺少的翻譯。如果是使用多個消息源,并希望他們把缺少的翻譯以同樣的方式來處理, 你應該給它們每一個消息源指定相應的事件處理程序。
### 使用?`message`?命令
翻譯儲存在 yii\i18n\PhpMessageSource,[[yii\i18n\GettextMessageSource|.po 文件] 或者 yii\i18n\DbMessageSource。 具體見類的附加選項。
首先,你需要創建一個配置文件。確定應該保存在哪里,然后執行命令
~~~
./yii message/config path/to/config.php
~~~
打開創建的文件,并按照需求來調整參數。特別注意:
* `languages`: 代表你的應用程序應該被翻譯成什么語言的一個數組;
* `messagePath`: 存儲消息文件的路徑,這應與配置中?`i18n`?的?`basePath`?參數一致。
> 注意,這里不支持路徑別名,它們必須是配置文件相對路徑的位置
一旦你做好了配置文件,你就可以使用命令提取消息
~~~
./yii message path/to/config.php
~~~
然后你會發現你的文件(如果你已經選擇基于文件的翻譯)在?`messagePath`?目錄。
## 視圖的翻譯
有時你可能想要翻譯一個完整的視圖文件,而不是翻譯單條文本消息。為了達到這一目的,只需簡單的翻譯視圖并在它子目錄下保存一個名稱一樣的目標語言文件。 例如,如果你想要翻譯的視圖文件為?`views/site/index.php`?且目標語言是?`ru-RU`,你可以將視圖翻譯并保存為?`views/site/ru-RU/index.php`。現在 每當你調用 yii\base\View::renderFile() 或任何其它方法 (如 yii\base\Controller::render()) 來渲染?`views/site/index.php`?視圖, 它最終會使用所翻譯的?`views/site/ru-RU/index.php`。
> 注意:如果 yii\base\Application::$language 跟 yii\base\Application::$sourceLanguage 相同, 在翻譯視圖的存在下,將呈現原始視圖。
## 格式化日期和數字值
在?[格式化輸出數據](http://www.yiichina.com/doc/guide/2.0/output-formatting)?一節可獲取詳細信息。
## 設置 PHP 環境
Yii 使用?[PHP intl 擴展](http://php.net/manual/en/book.intl.php)?來提供大多數 I18N 的功能, 如日期和數字格式的 yii\i18n\Formatter 類和消息格式的 yii\i18n\MessageFormatter 類。 當?`intl`?擴展沒有安裝時,兩者會提供一個回調機制。然而,該回調機制只適用于目標語言是英語的情況下。 因此,當 I18N 對你來說必不可少時,強烈建議你安裝?`intl`。
[PHP intl 擴展](http://php.net/manual/en/book.intl.php)?是基于對于所有不同的語言環境提供格式化規則的?[ICU庫](http://site.icu-project.org/)。 不同版本的 ICU 中可能會產生不同日期和數值格式的結果。為了確保你的網站在所有環境產生相同的結果,建議你安裝與?`intl`?擴展相同的版本(和 ICU 同一版本)。
要找出所使用的 PHP 是哪個版本的 ICU ,你可以運行下面的腳本,它會給出你所使用的 PHP 和 ICU 的版本。
~~~
<?php
echo "PHP: " . PHP_VERSION . "\n";
echo "ICU: " . INTL_ICU_VERSION . "\n";
~~~
此外,還建議你所使用的 ICU 版本應等于或大于 49 的版本。這確保了可以使用本文檔描述的所有功能。例如, 低于 49 版本的 ICU 不支持使用?`#`?占位符來實現復數規則。請參閱?[http://site.icu-project.org/download](http://site.icu-project.org/download)?獲取可用 ICU 版本的完整列表。 注意,版本編號在 4.8 之后發生了變化(如 ICU4.8,ICU49,50 ICU 等)。
另外,ICU 庫中時區數據庫的信息可能過時。要更新時區數據庫時詳情請參閱?[ICU 手冊](http://userguide.icu-project.org/datetime/timezone#TOC-Updating-the-Time-Zone-Data)?。而對于 ICU 輸出格式使用的時區數據庫, PHP 用的時區數據庫可能跟它有關。你可以通過安裝?[pecl package?`timezonedb`](http://pecl.php.net/package/timezonedb)?的最新版本來更新它。
- 介紹(Introduction)
- 關于 Yii(About Yii)
- 從 Yii 1.1 升級(Upgrading from Version 1.1)
- 入門(Getting Started)
- 安裝 Yii(Installing Yii)
- 運行應用(Running Applications)
- 第一次問候(Saying Hello)
- 使用 Forms(Working with Forms)
- 玩轉 Databases(Working with Databases)
- 用 Gii 生成代碼(Generating Code with Gii)
- 更上一層樓(Looking Ahead)
- 應用結構(Application Structure)
- 結構概述(Overview)
- 入口腳本(Entry Scripts)
- 應用(Applications)
- 應用組件(Application Components)
- 控制器(Controllers)
- 模型(Models)
- 視圖(Views)
- 模塊(Modules)
- 過濾器(Filters)
- 小部件(Widgets)
- 前端資源(Assets)
- 擴展(Extensions)
- 請求處理(Handling Requests)
- 運行概述(Overview)
- 引導(Bootstrapping)
- 路由引導與創建 URL(Routing and URL Creation)
- 請求(Requests)
- 響應(Responses)
- Sessions and Cookies
- 錯誤處理(Handling Errors)
- 日志(Logging)
- 關鍵概念(Key Concepts)
- 組件(Components)
- 屬性(Properties)
- 事件(Events)
- 行為(Behaviors)
- 配置(Configurations)
- 別名(Aliases)
- 類自動加載(Class Autoloading)
- 服務定位器(Service Locator)
- 依賴注入容器(Dependency Injection Container)
- 配合數據庫工作(Working with Databases)
- 數據庫訪問(Data Access Objects): 數據庫連接、基本查詢、事務和模式操作
- 查詢生成器(Query Builder): 使用簡單抽象層查詢數據庫
- 活動記錄(Active Record): 活動記錄對象關系映射(ORM),檢索和操作記錄、定義關聯關系
- 數據庫遷移(Migrations): 在團體開發中對你的數據庫使用版本控制
- Sphinx
- Redis
- MongoDB
- ElasticSearch
- 接收用戶數據(Getting Data from Users)
- 創建表單(Creating Forms)
- 輸入驗證(Validating Input)
- 文件上傳(Uploading Files)
- 收集列表輸入(Collecting Tabular Input)
- 多模型同時輸入(Getting Data for Multiple Models)
- 顯示數據(Displaying Data)
- 格式化輸出數據(Data Formatting)
- 分頁(Pagination)
- 排序(Sorting)
- 數據提供器(Data Providers)
- 數據小部件(Data Widgets)
- 操作客戶端腳本(Working with Client Scripts)
- 主題(Theming)
- 安全(Security)
- 認證(Authentication)
- 授權(Authorization)
- 處理密碼(Working with Passwords)
- 客戶端認證(Auth Clients)
- 安全領域的最佳實踐(Best Practices)
- 緩存(Caching)
- 概述(Overview)
- 數據緩存(Data Caching)
- 片段緩存(Fragment Caching)
- 分頁緩存(Page Caching)
- HTTP 緩存(HTTP Caching)
- RESTful Web 服務
- 快速入門(Quick Start)
- 資源(Resources)
- 控制器(Controllers)
- 路由(Routing)
- 格式化響應(Response Formatting)
- 授權驗證(Authentication)
- 速率限制(Rate Limiting)
- 版本化(Versioning)
- 錯誤處理(Error Handling)
- 開發工具(Development Tools)
- 調試工具欄和調試器(Debug Toolbar and Debugger)
- 使用 Gii 生成代碼(Generating Code using Gii)
- TBD 生成 API 文檔(Generating API Documentation)
- 測試(Testing)
- 概述(Overview)
- 搭建測試環境(Testing environment setup)
- 單元測試(Unit Tests)
- 功能測試(Functional Tests)
- 驗收測試(Acceptance Tests)
- 測試夾具(Fixtures)
- 高級專題(Special Topics)
- 高級應用模版(Advanced Project Template)
- 從頭構建自定義模版(Building Application from Scratch)
- 控制臺命令(Console Commands)
- 核心驗證器(Core Validators)
- 國際化(Internationalization)
- 收發郵件(Mailing)
- 性能優化(Performance Tuning)
- 共享主機環境(Shared Hosting Environment)
- 模板引擎(Template Engines)
- 集成第三方代碼(Working with Third-Party Code)
- 小部件(Widgets)
- Bootstrap 小部件(Bootstrap Widgets)
- jQuery UI 小部件(jQuery UI Widgets)
- 助手類(Helpers)
- 助手一覽(Overview)
- Array 助手(ArrayHelper)
- Html 助手(Html)
- Url 助手(Url)