目錄
1. 區域和語言
2. 翻譯
訊息翻譯
檔案翻譯
首頁 後端開發 php教程 Yii框架官方指南系列增補版48—專題:國際化 (I18N)

Yii框架官方指南系列增補版48—專題:國際化 (I18N)

Feb 16, 2017 am 09:42 AM



國際化(譯者註:即Internationalization,因為這個單字I 和n 之間有18個字母,因此常縮寫為I18N) 是指設計一種應用軟體的過程,這種軟體無需做大的工程改變就能適應不同的語言和地區的需要。 對 Web 應用來說,國際化尤其重要,因為潛在的使用者可能來自世界的各個角落。

Yii 在若干方面提供了對 I18N 的支援

  • 它為每種可能的語言和變數提供了本地化資料。

  • 它提了供資訊和文件的翻譯服務。

  • 它提供了基於本地化的日期和時間格式。

  • 它提供了基於本地話的數字格式。

在下面的小節中,我們將對以上幾個方面進行詳細說明。

1. 區域和語言

區域是一系列參數,它定義了使用者的語言、使用者所在國家以及使用者所有想要在他們的介面中看到的特殊參數。 它通常由一個包含了語言 ID 和區域 ID 的 ID 來識別。例如, ID en_US 表示英語區域和美國。 為維持一致性,Yii 中所有的區域 ID 被規範為小寫的 語言 ID 或 語言 ID_地區 ID(例如 enen_us)。

區域資料由一個 CLocale 實例表示。它提供了基於區域的信息,包括貨幣符號,數字符號, 日期和時間格式以及日期相關的名稱。由於語言資訊已經由區域 ID 實現,因此 CLocale 不再提供。 同理,我們通常會變換地使用字詞「區域」和「語言」。

透過一個區域 ID,就可以透過 CLocale::getInstance($localeID) 或CApplication::getLocale($localeID) 取得對應的 CLocale 實例。

資訊: Yii 幾乎包含所有語言和區域的區域化資料。 這些數據來自於 Common Locale Data Repository(CLDR)。在每個區域中, 只提供了 CLDR 中的部分數據,因為原始的 CLDR 數據中包含了大量不太常用的資訊。從版本 1.1.0 起, 使用者也可以使用他們自訂的區域資料。只需要配置CApplication::localeDataPath 屬性為包含了自訂區域資料的目錄即可。 請參考位於framework/i18n/data 目錄中的檔案建立自訂的區域資料檔案。

在一個 Yii 應用程式中,我們區分了它的 目標語言(target language) 和 來源語言(source language)。目標語言是應用程式的目標使用者的語言(區域), 而原始語言是指寫在應用程式原始碼中的語言(區域)。國際化只會在這兩種語言不同的情況下發生。

你可以設定 應用設定 中的 目標語言 ,或是在發生國際化之前動態設定此參數。

提示: 有時候,我們想要設定目標語言為使用者所使用的語言(就是在使用者的瀏覽器選項中指定的語言)。 只需使用 CHttpRequest::preferredLanguage 就可以取得到使用者設定的語言。

2. 翻譯

在 I18N 中用到的最多的可能就是翻譯了,包括 資訊翻譯 和 視圖翻譯。 前者將一則文字訊息翻譯為期望的語言,後者將整合文件翻譯為期望的語言。

一個翻譯請求包含要被翻譯的對象,對象所使用的源語言,和對象所需要翻譯到的目標語言。 在 Yii 中,原始語言預設為 應用程式原始語言 而目標語言預設為 應用程式語言。 如果兩者語言相同,翻譯將不會發生。

訊息翻譯

訊息翻譯是透過呼叫 Yii::t() 來實現的。此方法會將訊息從 源語言 翻譯為 目標語言。

當翻譯一條訊息時,必須指定它的分類(category),因為一條訊息在不同的分類或上下文中可能會有 不同的翻譯。分類 yii 保留為僅限 Yii 框架核心使用。

資訊可以包含參數佔位符,它們將會在呼叫 Yii::t() 時被實際的參數值取代。 例如,以下的資訊翻譯請求將會取代原始資訊中的 {alias} 佔位符為實際的別名(alias) 值。


Yii::t('app', 'Path alias "{alias}" is redefined.',
    array('{alias}'=>$alias))
登入後複製

注意: 要翻譯的資訊必須是常數字串。它們不能包含可能會改變訊息內容的變數 (例如"Invalid {$message} content.")。如果一則訊息需要透過一些參數改變,請使用 參數佔位符。

翻译过的信息会存储在一个叫做 信息源(message source) 的库中。 信息源是一个 CMessageSource 或其子类的实例。当 Yii::t() 被调用时, 它将从信息源中查找相应的信息,如果找到了,就会返回翻译后的版本。

Yii 含有如下几种信息源。你也可以扩展 CMessageSource 创建自己的信息源类型。

  • CPhpMessageSource: 信息的翻译存储在一个 PHP 的 键值对 数组中。 原始信息为键,翻译后的信息为值。每个数组表示一个特定信息分类的翻译,分别存储在不同的 PHP 脚本文件中,文件名即分类名。 针对同一种语言的 PHP 翻译文件存储在同一个以区域 ID 命名的目录中。而所有的这些目录位于 basePath 指定的目录中。

  • CGettextMessageSource: 信息的翻译存储在 GNU Gettext 文件中。

  • CDbMessageSource: 信息的翻译存储在数据库的表中。

信息源是作为一个 应用程序组件 载入的。 Yii 预定义了一个名为 messages 的应用程序组件以存储用户程序中用到的信息。 默认情况下,此信息源的类型是 CPhpMessageSource ,而存储这些 PHP 翻译文件的目录是protected/messages

总体来说,要实现信息翻译,需要执行如下几步:

  1. 在合适的位置调用 Yii::t() ;

  2. 以 protected/messages/LocaleID/CategoryName.php 的格式创建 PHP 翻译文件。 每个文件简单的返回一个信息翻译数组。 注意,这是假设你使用默认的 CPhpMessageSource 存储翻译信息。

  3. 配置 CApplication::sourceLanguage 和 CApplication::language。

提示: 使用 CPhpMessageSource 作为信息源时,Yii 中的 yiic 工具可用于管理信息翻译。 它的message 命令可以自动从所选的源文件中提取要翻译的信息,并在需要时将其合并为现存的翻译。 关于使用 message 命令的更多信息,请执行 yiic help message

从版本 1.0.10 起,当使用 CPhpMessageSource 管理信息源时, 扩展类(例如一个 widget 小物件,一个模块)中的信息可以以一种特殊的方式管理并使用。 具体来说,如果一条信息属于一个类名为 Xyz 的扩展,那么分类的名字可以以 Xyz.categoryName 的格式指定。 相应的信息文件就是BasePath/messages/LanguageID/categoryName.php ,其中 BasePath 是指包含此扩展类文件的那个目录。 当使用 Yii::t() 翻译一条扩展信息时,需要使用如下格式:


Yii::t('Xyz.categoryName', '要翻译的信息');
登入後複製

从 1.0.2 起,Yi 添加了对 choice format 的支持。Choice format 是指选择按照一个给定数字的值选择一条翻译。例如,在英语中,视不同的数量,单词 'book' 可以有一个单数形式或者一个复数形式。而在其他语言中, 这个词可能就没有不同的形式(例如汉语)或者有更复杂的复数规则(例如俄语)。 Choice format 以一种简单而又高效的方式解决了这个问题。

要使用 choice format,翻译的信息必须包含一个由 | 分割的 “表达式-信息” 对序列。如下所示:


'expr1#message1|expr2#message2|expr3#message3'
登入後複製

其中 exprN 表示一个有效的 PHP 表达式,它会计算出一个布尔型的值,以确定相应的信息是否应该被返回。 只有第一个返回值为 true 的表达式对应的信息会被返回。 一个表达式可以包含一个特殊的变量 n (注意,它不是$n),它带有通过第一个信息参数传递的数字的值。 例如,假设有如下一条翻译信息:


'n==1#one book|n>1#many books'
登入後複製

而我们在调用 Yii::t() 时在参数数组中传递了数字值 2 , 我们就会得到 many books 作为最终的翻译信息。

作为一种简便写法,如果一个表达式是一个数字,它将被视为等同于 n==Number。因此,上面的翻译信息也可以写为如下格式:


'1#one book|n>1#many books'
登入後複製

檔案翻譯

檔案翻譯是透過呼叫 CApplication::findLocalizedFile() 完成的。 給定一個要翻譯的檔案的路徑,此方法就會在區域 ID 子目錄中尋找相同檔案名稱的檔案。 如果找到了,就會返回此文件的路徑;否則,將返回原始文件的路徑。

檔案翻譯主要用於渲染一個視圖。 當在控制器或小對像中呼叫任一渲染方法時,視圖檔案將會自動翻譯。例如,若 目標語言 是 zh_cn 而 來源語言 是 en_us,而渲染一個名為 edit 的視圖時,程式將會尋找protected/views/Controller 如果此檔案找到,就會透過此翻譯版本渲染。否則,就會使用檔案 protected/views/ControllerID/edit.php 渲染。

檔案翻譯也可以用於其他目的,例如,顯示一個翻譯過的圖片,或載入一個基於區域的資料檔案。

關於資訊翻譯和文件翻譯的實戰示例可參考這篇文章:Yii框架中如何使用Yii::t()實現文本信息翻譯和文件翻譯

3. 日期和時間格式化

日期和時間在不同的國家和地區通常會有不同的格式。 日期和時間格式和的任務就是產生一個符合指定區域格式的日期或時間字串。 為實現此目的,Yii 提供了CDateFormatter。

每個 CDateFormatter 實例關聯到一個目標區域。要取得關聯到整個應用程式的目標區域的格式器(formatter), 只需簡單的存取 應用程式的 dateFormatter 屬性。

CDateFormatter 類別主要提供了兩個方法以格式化 UNIX 時間戳記。

  • format: 此方法可透過自訂的模式格式化給定的 UNIX 時間戳為字串 (例如 

    $dateFormatter->format('yyyy-MM-dd',$timestamp))。

  • formatDateTime: 此方法透過一個在目標區域資料中預先定義的模式格式化給定的 UNIX 時間戳為一個字串 (例如日期的 

    short 格式,時間的 long 格式)。

4. 數位格式化

與日期和時間類似,數字在不同的國家或地區之間也可能有不同的格式。 數位格式化包括十進制格式化,貨幣格式化和百分比格式化。 Yii 提供了 CNumberFormatter 以完成這些任務。

要取得關聯到整個應用程式的目標區域的格式器(formatter), 只需簡單的存取 應用程式的 numberFormatter屬性。

CNumberFormatter 提供的以下方法可以用於格式化integer 或double 值

  • format: 此方法透過一個自訂的模式格式化給定的數字為一個字串(例如 

    $numberFormatter->format(' #,##0.00',$number))。

  • formatDecimal: 此方法透過在目標區域資料中預先定義的十進位模式格式化給定的數字。

  • formatCurrency: 此方法使用目標區域資料中預先定義的貨幣模式格式化給定的數字。

  • formatPercentage: 此方法使用目標區域資料中預先定義的百分比模式格式化給定的數字。

 以上就是Yii框架官方指南系列增補版48-專題:國際化 (I18N)的內容,更多相關內容請關注PHP中文網(www.php.cn)!



本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

使用FastAPI框架建構國際化的Web應用 使用FastAPI框架建構國際化的Web應用 Sep 29, 2023 pm 03:53 PM

使用FastAPI框架建立國際化的Web應用FastAPI是一個高效能的PythonWeb框架,它結合了Python類型註解和效能較好的非同步支持,使得開發Web應用變得更加簡單、快速和可靠。在建構一個國際化的網路應用程式時,FastAPI提供了方便的工具和理念,讓應用程式能夠輕鬆支援多種語言。下面我將給一個具體的程式碼範例,介紹如何使用FastAPI框架構

Yii框架中間件:為應用程式提供多重資料儲存支持 Yii框架中間件:為應用程式提供多重資料儲存支持 Jul 28, 2023 pm 12:43 PM

Yii框架中間件:為應用程式提供多重資料儲存支援介紹中間件(middleware)是Yii框架中的重要概念,它為應用程式提供了多重資料儲存支援。中間件的作用類似於一個過濾器,它能夠在應用程式的請求和回應之間插入自訂程式碼。透過中間件,我們可以對請求進行處理、驗證、過濾,然後將處理後的結果傳遞給下一個中間件或最終的處理程序。 Yii框架中的中間件使用起來非常

用 PHP 建立多語言網站:消除語言障礙 用 PHP 建立多語言網站:消除語言障礙 Feb 19, 2024 pm 07:10 PM

1.準備資料庫為多語言資料建立新資料表,包括下列欄位:CREATETABLEtranslations(idINTNOTNULLAUTO_INCREMENT,localeVARCHAR(255)NOTNULL,keyVARCHAR(255)NOTNULL,valueTEXTNOTNULL,PRIMARYKEY(id));2.pid));頂部或側邊欄新增語言切換器,讓使用者可以選擇首選語言。 //取得目前語言$current_locale=isset($_GET["locale"])?$_

如何使用Webman框架實現國際化與多語言支援? 如何使用Webman框架實現國際化與多語言支援? Jul 09, 2023 pm 03:51 PM

如今,隨著網路技術的不斷發展,越來越多的網站和應用程式需要支援多語言和國際化。在網路開發中,使用框架可以大幅簡化開發流程。本文將介紹如何使用Webman框架實現國際化和多語言支持,同時提供了一些程式碼範例。一、什麼是Webman框架? Webman是一個基於PHP的輕量級框架,提供了豐富的功能和易於使用的工具,用於開發Web應用程式。其中之一就是國際化和多

使用Yii框架實現網頁快取和頁面分塊的步驟 使用Yii框架實現網頁快取和頁面分塊的步驟 Jul 30, 2023 am 09:22 AM

使用Yii框架實現網頁快取和頁面分塊的步驟引言:在Web開發過程中,為了提升網站的效能和使用者體驗,常常需要對頁面進行快取和分塊處理。 Yii框架提供了強大的快取和佈局功能,可以幫助開發者快速實現網頁快取和頁面分塊,本文將介紹如何使用Yii框架進行網頁快取和頁面分塊的實作。一、網頁快取開啟網頁快取在Yii框架中,可以透過設定檔來開啟網頁快取。開啟主設定檔co

PHP開發中如何處理多語言和國際化問題 PHP開發中如何處理多語言和國際化問題 Oct 09, 2023 pm 04:24 PM

PHP開發中如何處理多語言和國際化問題,需要具體程式碼範例隨著互聯網的發展,人們對於多語言和國際化的需求越來越高。在PHP開發中,如何有效地處理多語言和國際化問題成為了開發者需要解決的重要任務。字元編碼的處理在PHP開發中,我們首先要確保正確處理字元編碼。在多語言環境中,使用UTF-8編碼是最常見的選擇。可以在PHP檔案的頭部添加如下程式碼:header('C

Vue中如何使用路由實現國際化的多語言切換? Vue中如何使用路由實現國際化的多語言切換? Jul 22, 2023 pm 12:17 PM

Vue中如何使用路由實現國際化的多語言切換?在開發多語言網站時,我們的一個重要需求是能夠根據使用者選擇的語言,實現網站內容的切換。 Vue.js是一款受歡迎的JavaScript框架,透過使用VueRouter插件,我們可以很方便地實現路由功能。在本文中,我將介紹如何使用路由實現Vue中的國際化多語言切換。首先,我們需要安裝VueRouter插件。可以通過np

如何使用Hyperf框架進行國際化支持 如何使用Hyperf框架進行國際化支持 Oct 22, 2023 am 08:14 AM

如何使用Hyperf框架進行國際化支援隨著全球化的快速發展,許多應用程式都需要具備多語言支援的功能,以滿足不同國家和地區使用者的需求。 Hyperf框架作為一個輕量級的高效能框架,提供了國際化支援的功能,能夠幫助開發者快速實現多語言應用的開發。本文將介紹如何在Hyperf框架中使用國際化功能,並提供對應的程式碼範例。一、設定多語言支援首先,需要在Hyperf的設定文件

See all articles