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

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

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)

Jelaskan JSON Web Tokens (JWT) dan kes penggunaannya dalam PHP API. Jelaskan JSON Web Tokens (JWT) dan kes penggunaannya dalam PHP API. Apr 05, 2025 am 12:04 AM

JWT adalah standard terbuka berdasarkan JSON, yang digunakan untuk menghantar maklumat secara selamat antara pihak, terutamanya untuk pengesahan identiti dan pertukaran maklumat. 1. JWT terdiri daripada tiga bahagian: header, muatan dan tandatangan. 2. Prinsip kerja JWT termasuk tiga langkah: menjana JWT, mengesahkan JWT dan muatan parsing. 3. Apabila menggunakan JWT untuk pengesahan di PHP, JWT boleh dijana dan disahkan, dan peranan pengguna dan maklumat kebenaran boleh dimasukkan dalam penggunaan lanjutan. 4. Kesilapan umum termasuk kegagalan pengesahan tandatangan, tamat tempoh, dan muatan besar. Kemahiran penyahpepijatan termasuk menggunakan alat debugging dan pembalakan. 5. Pengoptimuman prestasi dan amalan terbaik termasuk menggunakan algoritma tandatangan yang sesuai, menetapkan tempoh kesahihan dengan munasabah,

Bagaimanakah sesi merampas kerja dan bagaimana anda dapat mengurangkannya dalam PHP? Bagaimanakah sesi merampas kerja dan bagaimana anda dapat mengurangkannya dalam PHP? Apr 06, 2025 am 12:02 AM

Sesi rampasan boleh dicapai melalui langkah -langkah berikut: 1. Dapatkan ID Sesi, 2. Gunakan ID Sesi, 3. Simpan sesi aktif. Kaedah untuk mengelakkan rampasan sesi dalam PHP termasuk: 1. Gunakan fungsi Sesi_Regenerate_ID () untuk menjana semula ID Sesi, 2. Data sesi stor melalui pangkalan data, 3.

Huraikan prinsip -prinsip yang kukuh dan bagaimana ia memohon kepada pembangunan PHP. Huraikan prinsip -prinsip yang kukuh dan bagaimana ia memohon kepada pembangunan PHP. Apr 03, 2025 am 12:04 AM

Penerapan prinsip pepejal dalam pembangunan PHP termasuk: 1. Prinsip Tanggungjawab Tunggal (SRP): Setiap kelas bertanggungjawab untuk hanya satu fungsi. 2. Prinsip Terbuka dan Tutup (OCP): Perubahan dicapai melalui lanjutan dan bukannya pengubahsuaian. 3. Prinsip Penggantian Lisch (LSP): Subkelas boleh menggantikan kelas asas tanpa menjejaskan ketepatan program. 4. Prinsip Pengasingan Antara Muka (ISP): Gunakan antara muka halus untuk mengelakkan kebergantungan dan kaedah yang tidak digunakan. 5. Prinsip Inversi Ketergantungan (DIP): Modul peringkat tinggi dan rendah bergantung kepada abstraksi dan dilaksanakan melalui suntikan ketergantungan.

Bagaimana cara debug mod CLI dalam phpstorm? Bagaimana cara debug mod CLI dalam phpstorm? Apr 01, 2025 pm 02:57 PM

Bagaimana cara debug mod CLI dalam phpstorm? Semasa membangun dengan PHPStorm, kadang -kadang kita perlu debug PHP dalam mod Interface Line Command (CLI) ...

Bagaimana cara menetapkan kebenaran secara automatik UnixSocket selepas sistem dimulakan semula? Bagaimana cara menetapkan kebenaran secara automatik UnixSocket selepas sistem dimulakan semula? Mar 31, 2025 pm 11:54 PM

Bagaimana untuk menetapkan keizinan UnixSocket secara automatik selepas sistem dimulakan semula. Setiap kali sistem dimulakan semula, kita perlu melaksanakan perintah berikut untuk mengubahsuai keizinan UnixSocket: sudo ...

Terangkan pengikatan statik lewat dalam php (statik: :). Terangkan pengikatan statik lewat dalam php (statik: :). Apr 03, 2025 am 12:04 AM

Mengikat statik (statik: :) Melaksanakan pengikatan statik lewat (LSB) dalam PHP, yang membolehkan kelas panggilan dirujuk dalam konteks statik dan bukannya menentukan kelas. 1) Proses parsing dilakukan pada masa runtime, 2) Cari kelas panggilan dalam hubungan warisan, 3) ia boleh membawa overhead prestasi.

Bagaimana cara menghantar permintaan pos yang mengandungi data JSON menggunakan perpustakaan php curl? Bagaimana cara menghantar permintaan pos yang mengandungi data JSON menggunakan perpustakaan php curl? Apr 01, 2025 pm 03:12 PM

Menghantar data JSON menggunakan perpustakaan Curl PHP dalam pembangunan PHP, sering kali perlu berinteraksi dengan API luaran. Salah satu cara biasa ialah menggunakan perpustakaan curl untuk menghantar post ...

See all articles