0

0

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

php中文网

php中文网

发布时间:2016-06-20 12:28:07

|

1294人浏览过

|

来源于php中文网

原创

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

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

安装

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

php -m | grep 'intl' 

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

立即学习PHP免费学习笔记(深入)”;

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) "لدي أربعة و ثلاثون تفاحة" 

多元化

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

腾讯交互翻译
腾讯交互翻译

腾讯AI Lab发布的一款AI辅助翻译产品

下载
  • (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 的扩展功能来本地化我们的信息。接下来的部分会涉及格式化数字和日期,以及日历的使用。如果你对以上内容有任何疑惑,请给我们留言。

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

38

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

83

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

97

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

223

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

458

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

169

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

246

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

34

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号