Jadual Kandungan
安装
消息格式化
简单信息
多元化
选项
选择项
复杂情况
消息解析
结论
Rumah pembangunan bahagian belakang tutorial 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' 
Salin selepas log masuk

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

sudoapt-getupdatesudoapt-getinstallphp5-intl 
Salin selepas log masuk

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

# 添加 PPAsudoadd-apt-repositoryppa:ondrej/php-7.0# 升级索引库sudoapt-getupdate# 安装扩展功能sudoapt-getinstallphp7.0-intl 
Salin selepas log masuk

消息格式化

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

简单信息

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

var_dump(    MessageFormatter::formatMessage(        "en_US",        "I have {0, number, integer} apples.",        [ 3 ]    )); // output string(16) "I have 3 apples." 
Salin selepas log masuk

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

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

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

var_dump(    MessageFormatter::formatMessage(        "en_US",        "I have {number_apples, number, integer} apples.",        [ 'number_apples' => 3 ]    )); 
Salin selepas log masuk

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

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

var_dump(    MessageFormatter::formatMessage(        "ar",        "I have {number_apples, number, integer} apples.",        [ 'number_apples' => 3 ]    )); string(17) "I have ٣ apples." 
Salin selepas log masuk

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

var_dump(    MessageFormatter::formatMessage(        "bn",        "I have {number_apples, number, integer} apples.",        [ 'number_apples' => 3 ]    )); string(18) "I have ৩ apples." 
Salin selepas log masuk

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

$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" 
Salin selepas log masuk

var_dump( MessageFormatter::formatMessage(    "en_US",    "duration: {0, duration}",    array( $time )) ); string(23) "duration: 405,551:27:58" 
Salin selepas log masuk

我们也可以表示分数。

var_dump( MessageFormatter::formatMessage(    "en_US",    "I have {0, spellout} apples",    array( 34 )) ); string(25) "I have thirty-four apples" 
Salin selepas log masuk

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

var_dump( MessageFormatter::formatMessage(    "ar",    "لدي {0, spellout} تفاحة",    array( 34 )) ); string(44) "لدي أربعة و ثلاثون تفاحة" 
Salin selepas log masuk

多元化

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

  • (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)) ); 
Salin selepas log masuk

// number_apples = 0string(16) "I have no apples" // number_apples = 1string(16) "I have one apple" // number_apples = 10string(16) "I have 10 apples" 
Salin selepas log masuk

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

{data, plural, offsetValue =value{message}... other{message}} 
Salin selepas log masuk

  • 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 " 
Salin selepas log masuk

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

{value, choice, choiceStyle} 
Salin selepas log masuk

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) 
Salin selepas log masuk

注意: 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" 
Salin selepas log masuk

模式定义如下:

{value, select, selectStyle} // selectStyleselectValue {message} (selectValue {message})* 
Salin selepas log masuk

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' )) ); 
Salin selepas log masuk

这是我们之前用的一个相同的例子,不同于之前使用简单信息,我们依赖 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' )) ); 
Salin selepas log masuk

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

string(53) "Hanae invites Younes and 4 other people to her party." 
Salin selepas log masuk

下面是示例的完整段。

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' )) ); 
Salin selepas log masuk

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

// 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." 
Salin selepas log masuk

消息解析

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

$messageFormater = new MessageFormatter("en_US", 'I have {0, number}');var_dump( $messageFormater->parse("I have 10 apples") ); array(1) {  [0]=>  int(10)} 
Salin selepas log masuk

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

结论

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

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

11 skrip pemendek URL terbaik PHP (percuma dan premium) 11 skrip pemendek URL terbaik PHP (percuma dan premium) Mar 03, 2025 am 10:49 AM

URL panjang, sering berantakan dengan kata kunci dan parameter penjejakan, boleh menghalang pelawat. Skrip pemendekan URL menawarkan penyelesaian, mewujudkan pautan ringkas yang sesuai untuk media sosial dan platform lain. Skrip ini sangat berharga untuk laman web individu a

Bekerja dengan Data Sesi Flash di Laravel Bekerja dengan Data Sesi Flash di Laravel Mar 12, 2025 pm 05:08 PM

Laravel memudahkan mengendalikan data sesi sementara menggunakan kaedah flash intuitifnya. Ini sesuai untuk memaparkan mesej ringkas, makluman, atau pemberitahuan dalam permohonan anda. Data hanya berterusan untuk permintaan seterusnya secara lalai: $ permintaan-

Bina aplikasi React dengan hujung belakang Laravel: Bahagian 2, React Bina aplikasi React dengan hujung belakang Laravel: Bahagian 2, React Mar 04, 2025 am 09:33 AM

Ini adalah bahagian kedua dan terakhir siri untuk membina aplikasi React dengan back-end Laravel. Di bahagian pertama siri ini, kami mencipta API RESTful menggunakan Laravel untuk aplikasi penyenaraian produk asas. Dalam tutorial ini, kita akan menjadi dev

Respons HTTP yang dipermudahkan dalam ujian Laravel Respons HTTP yang dipermudahkan dalam ujian Laravel Mar 12, 2025 pm 05:09 PM

Laravel menyediakan sintaks simulasi respons HTTP ringkas, memudahkan ujian interaksi HTTP. Pendekatan ini dengan ketara mengurangkan redundansi kod semasa membuat simulasi ujian anda lebih intuitif. Pelaksanaan asas menyediakan pelbagai jenis pintasan jenis tindak balas: Gunakan Illuminate \ Support \ Facades \ http; Http :: palsu ([ 'Google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

Curl dalam PHP: Cara Menggunakan Pelanjutan PHP Curl dalam API REST Curl dalam PHP: Cara Menggunakan Pelanjutan PHP Curl dalam API REST Mar 14, 2025 am 11:42 AM

Pelanjutan URL Pelanggan PHP (CURL) adalah alat yang berkuasa untuk pemaju, membolehkan interaksi lancar dengan pelayan jauh dan API rehat. Dengan memanfaatkan libcurl, perpustakaan pemindahan fail multi-protokol yang dihormati, php curl memudahkan execu yang cekap

12 skrip sembang php terbaik di codecanyon 12 skrip sembang php terbaik di codecanyon Mar 13, 2025 pm 12:08 PM

Adakah anda ingin memberikan penyelesaian segera, segera kepada masalah yang paling mendesak pelanggan anda? Sembang langsung membolehkan anda mempunyai perbualan masa nyata dengan pelanggan dan menyelesaikan masalah mereka dengan serta-merta. Ia membolehkan anda memberikan perkhidmatan yang lebih pantas kepada adat anda

Pengumuman Penyiasatan Situasi PHP 2025 Pengumuman Penyiasatan Situasi PHP 2025 Mar 03, 2025 pm 04:20 PM

Tinjauan Landskap PHP 2025 menyiasat trend pembangunan PHP semasa. Ia meneroka penggunaan rangka kerja, kaedah penempatan, dan cabaran, yang bertujuan memberi gambaran kepada pemaju dan perniagaan. Tinjauan ini menjangkakan pertumbuhan dalam PHP Versio moden

Pemberitahuan di Laravel Pemberitahuan di Laravel Mar 04, 2025 am 09:22 AM

Dalam artikel ini, kami akan meneroka sistem pemberitahuan dalam rangka kerja web Laravel. Sistem pemberitahuan di Laravel membolehkan anda menghantar pemberitahuan kepada pengguna melalui saluran yang berbeza. Hari ini, kami akan membincangkan bagaimana anda boleh menghantar pemberitahuan ov

See all articles