目錄
安装
消息格式化
简单信息
多元化
选项
选择项
复杂情况
消息解析
结论
首頁 後端開發 php教程 [PHP](译)Localization Demystified: Php-Intl for Everyone

[PHP](译)Localization Demystified: Php-Intl for Everyone

Jun 20, 2016 pm 12:28 PM

原文地址: https://www.sitepoint.com/localization-demystified-understanding-php-intl/

大多数应用程序执行场可以识别类似处理文本,日期,时区等的操作。而 PHP Intl 的扩展功能可提供一个良好的 API ,用以连接广为人知的 ICU 库的功能。

安装

此扩展功能默认安装在 PHP 5.3 及以上的版本,你可以通过以下命令进行查找:

php -m | grep 'intl' 
登入後複製

如果此扩展功能不存在,你可以按照 安装指南 手动进行安装。如果你使用 Ubuntu,你可以直接使用以下命令安装:

sudoapt-getupdatesudoapt-getinstallphp5-intl 
登入後複製

如果你使用的是 PHP 7,你需要添加 PPA ( ppa:ondrej/php ),升级你的系统并且安装扩展功能 Intl。

# 添加 PPAsudoadd-apt-repositoryppa:ondrej/php-7.0# 升级索引库sudoapt-getupdate# 安装扩展功能sudoapt-getinstallphp7.0-intl 
登入後複製

消息格式化

大多数现代化应用在搭建的时候非常注意本地。有时候,这些消息是一个简单的拥有变量占位符的字符串,有时却是一个复杂的多元化的字符串。

简单信息

我们会从一个包含占位符的简单信息开始。占位符是被封闭在花括号中的字符。这里有一个示例:

var_dump(    MessageFormatter::formatMessage(        "en_US",        "I have {0, number, integer} apples.",        [ 3 ]    )); // output string(16) "I have 3 apples." 
登入後複製

传递提要给 MessageFormatter::formatMessage 的类函数如下:

  • 消息的语言环境
  • 消息字符串
  • 占位符数据

占位符 {0, number, integer} 会键入一个数——整数作为该数据库阵列的第一个项目(看看下面列出选项的表格)我们还可以在占位符中使用命名参数。下面的示例会输出同样的结果。

var_dump(    MessageFormatter::formatMessage(        "en_US",        "I have {number_apples, number, integer} apples.",        [ 'number_apples' => 3 ]    )); 
登入後複製

不同的语言有不同的数字写法,比如阿拉伯语、印度语等等。

先前的示例指向 en_US 环境,让我们换成 ar 环境并看看有什么不同。

var_dump(    MessageFormatter::formatMessage(        "ar",        "I have {number_apples, number, integer} apples.",        [ 'number_apples' => 3 ]    )); string(17) "I have ٣ apples." 
登入後複製

让我们再换成孟加拉语情景( bn ).

var_dump(    MessageFormatter::formatMessage(        "bn",        "I have {number_apples, number, integer} apples.",        [ 'number_apples' => 3 ]    )); string(18) "I have ৩ apples." 
登入後複製

到目前为止,我们只说明了数字。现在让我们看看其他可以使用的类型。

$time = time();var_dump( MessageFormatter::formatMessage(    "en_US",    "Today is {0, date, full} - {0, time}",    array( $time )) ); string(47) "Today is Wednesday, April 6, 2016 - 11:21:47 PM" 
登入後複製

var_dump( MessageFormatter::formatMessage(    "en_US",    "duration: {0, duration}",    array( $time )) ); string(23) "duration: 405,551:27:58" 
登入後複製

我们也可以表示分数。

var_dump( MessageFormatter::formatMessage(    "en_US",    "I have {0, spellout} apples",    array( 34 )) ); string(25) "I have thirty-four apples" 
登入後複製

这对不同的语言环境也适用。

var_dump( MessageFormatter::formatMessage(    "ar",    "لدي {0, spellout} تفاحة",    array( 34 )) ); string(44) "لدي أربعة و ثلاثون تفاحة" 
登入後複製

多元化

本地化应用程序的一个重要组成部分是管理多元信息使得用户界面尽可能直观。上面苹果的示例就能说明这一点。下面是这个示例中的信息表现:

  • (number_apples = 0) : 没有苹果。
  • (number_apples = 1) : 一个苹果。
  • (number_apples > 1) : 多个苹果。

var_dump( MessageFormatter::formatMessage(    "en_US",    'I have {number_apples, plural, =0{no apples} =1{one apple} other{# apples}}',    array('number_apples' => 10)) ); 
登入後複製

// number_apples = 0string(16) "I have no apples" // number_apples = 1string(16) "I have one apple" // number_apples = 10string(16) "I have 10 apples" 
登入後複製

这种语法真的很简单直接,并且大多数包都包含这种语法。跟多细节请见 此文件 。

{data, plural, offsetValue =value{message}... other{message}} 
登入後複製

  • data :价值指数
  • plural :事件参数类型
  • offsetValue :可选的( offset:value )。它从值中减去偏移量。
  • =value{message} :测试等价性,信息在花括号之内。我们可以重复多次 ( =0{no apples} =1{one apple} =2{two apple} )。
  • other{message} :默认情况,比如在 switch - case 声明。 # 符号可用于键入 data 值。

选项

有时候,我们需要列出每一个值域的不同信息。比如下面的示例:

var_dump( MessageFormatter::formatMessage(    "en_US",    'The value of {0,number} is {0, choice,                                        0 # between 0 and 19 |                                        20 # between 20 and 39 |                                        40 # between 40 and 59 |                                        60 # between 60 and 79 |                                        80 # between 80 and 100 |                                        100 < more than 100 }',    array(60)) ); string(38) "The value of 60 is between 60 and 79 " 
登入後複製

argType 在这里是为 choice 设定的,语法如下:

{value, choice, choiceStyle} 
登入後複製

ICU 文件 的官方定义如下:

choiceStyle = numberseparatormessage ('|' numberseparatormessage)* number = normal_number | ['-']  ∞ (U+221E, infinity)normal_number = double value (unlocalizedASCIIstring) separator = less_than | less_than_or_equalless_than = '<'less_than_or_equal = '#' |  ≤ (U+2264) 
登入後複製

注意: ICU 开发者不鼓励使用选择类型。

选择项

有时我们需要选择选项UI组件。个人资料页使用这种方法根据用户的性别等等更新 UI 信息。这里有一个例子:

var_dump( MessageFormatter::formatMessage(    "en_US",    "{gender, select, ".      "female {She has some apples} ".      "male {He has some apples.}".      "other {It has some apples.}".    "}",    array('gender' => 'female')) );string(19) "She has some apples" 
登入後複製

模式定义如下:

{value, select, selectStyle} // selectStyleselectValue {message} (selectValue {message})* 
登入後複製

message 提要会包括类似选项和复数的其他模式。下一个部分会解释一个被我们结合了多个模式的例子。

复杂情况

到目前为止,我们已经看过例如选择、多元化等等的简单示例。但很多情况会复杂的多。 ICU 文档 有一个很好的例子来说明这一点。为了便于理解,我们一段一段来看。

var_dump( MessageFormatter::formatMessage(    "en_US",    "{gender_of_host, select, ".      "female {She has a party} ".      "male {He has some apples.}".      "other {He has some apples.}".    "}",    array('gender_of_host' => 'female', "num_guests" => 5, 'host' => "Hanae", 'guest' => 'Younes' )) ); 
登入後複製

这是我们之前用的一个相同的例子,不同于之前使用简单信息,我们依赖 num_guests 值定制了下(讨论的是多元化的案例)。

var_dump( MessageFormatter::formatMessage(    "en_US",    "{gender_of_host, select, ".      "female {".        "{num_guests, plural, offset:1 ".          "=0 {{host} does not have a party.}".          "=1 {{host} invites {guest} to her party.}".          "=2 {{host} invites {guest} and one other person to her party.}".          "other {{host} invites {guest} and # other people to her party.}}}".      "male {He has some apples.}".      "other {He has some apples.}}",    array('gender_of_host' => 'female', "num_guests" => 5, 'host' => "Hanae", 'guest' => 'Younes' )) ); 
登入後複製

需要注意我们使用了 offset:1 从 num_guests 中移除一个 guest。

string(53) "Hanae invites Younes and 4 other people to her party." 
登入後複製

下面是示例的完整段。

var_dump( MessageFormatter::formatMessage(    "en_US",    "{gender_of_host, select, ".      "female {".        "{num_guests, plural, offset:1 ".          "=0 {{host} does not have a party.}".          "=1 {{host} invites {guest} to her party.}".          "=2 {{host} invites {guest} and one other person to her party.}".          "other {{host} invites {guest} and # other people to her party.}}}".      "male {".        "{num_guests, plural, offset:1 ".          "=0 {{host} does not have a party.}".          "=1 {{host} invites {guest} to his party.}".          "=2 {{host} invites {guest} and one other person to his party.}".          "other {{host} invites {guest} and # other people to his party.}}}".      "other {".        "{num_guests, plural, offset:1 ".          "=0 {{host} does not have a party.}".          "=1 {{host} invites {guest} to their party.}".          "=2 {{host} invites {guest} and one other person to their party.}".          "other {{host} invites {guest} and # other people to their party.}}}}",    array('gender_of_host' => 'female', "num_guests" => 5, 'host' => "Hanae", 'guest' => 'Younes' )) ); 
登入後複製

改变客人的数量来测试所有的信息类型:

// num_guests = 2string(55) "Hanae invites Younes and one other person to her party." // num_guests = 1string(34) "Hanae invites Younes to her party." // num_guests = 0string(28) "Hanae does not have a party." 
登入後複製

消息解析

对于解析信息没有太多可以说;我们使用之前的模式从输出信息中来格式化额外信息。

$messageFormater = new MessageFormatter("en_US", 'I have {0, number}');var_dump( $messageFormater->parse("I have 10 apples") ); array(1) {  [0]=>  int(10)} 
登入後複製

查看 文档 以获取更多关于信息解析的内容。

结论

在这篇介绍性的文章中,我们了解了使用 PHP Intel 的扩展功能来本地化我们的信息。接下来的部分会涉及格式化数字和日期,以及日历的使用。如果你对以上内容有任何疑惑,请给我们留言。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

會話如何劫持工作,如何在PHP中減輕它? 會話如何劫持工作,如何在PHP中減輕它? Apr 06, 2025 am 12:02 AM

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

PHP 8.1中的枚舉(枚舉)是什麼? PHP 8.1中的枚舉(枚舉)是什麼? Apr 03, 2025 am 12:05 AM

PHP8.1中的枚舉功能通過定義命名常量增強了代碼的清晰度和類型安全性。 1)枚舉可以是整數、字符串或對象,提高了代碼可讀性和類型安全性。 2)枚舉基於類,支持面向對象特性,如遍歷和反射。 3)枚舉可用於比較和賦值,確保類型安全。 4)枚舉支持添加方法,實現複雜邏輯。 5)嚴格類型檢查和錯誤處理可避免常見錯誤。 6)枚舉減少魔法值,提升可維護性,但需注意性能優化。

描述紮實的原則及其如何應用於PHP的開發。 描述紮實的原則及其如何應用於PHP的開發。 Apr 03, 2025 am 12:04 AM

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

在PHPStorm中如何進行CLI模式的調試? 在PHPStorm中如何進行CLI模式的調試? Apr 01, 2025 pm 02:57 PM

在PHPStorm中如何進行CLI模式的調試?在使用PHPStorm進行開發時,有時我們需要在命令行界面(CLI)模式下調試PHP�...

如何用PHP的cURL庫發送包含JSON數據的POST請求? 如何用PHP的cURL庫發送包含JSON數據的POST請求? Apr 01, 2025 pm 03:12 PM

使用PHP的cURL庫發送JSON數據在PHP開發中,經常需要與外部API進行交互,其中一種常見的方式是使用cURL庫發送POST�...

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

See all articles