今天我们来聊一下 PHP 相较于其他语言的重要特点之一:国际化支持,更具体地说,是 PHP 的 Intl 模块。
国际化的意义在于,我们常用的编程语言大多数是英文,但世界上每个地方的人都有可能使用我们开发的程序,包括使用不同的语言、数字格式、时间格式。如果我们不注重国际化支持,就会出现这样的情况:输出的数字或日期格式是错误的或者不符因地制宜的习惯。为了解决这个问题,PHP 团队加入了 Intl 模块。
简单介绍完 Intl 模块的意义,下面我们通过一些例子来展示它的具体用法。
// 加载Intl扩展 extension=intl.so
我们需要使用 Intl 模块必需加载扩展。可以在 PHP.ini 文件中打开找到 extension=intl.so 打开,在不存在则需要手动添加。
// 处理时间 $date = new IntlDateFormatter( 'zh_CN', IntlDateFormatter::LONG, IntlDateFormatter::LONG, 'Asia/Shanghai', IntlDateFormatter::GREGORIAN ); $dateText = $date->format(new DateTime()); echo $dateText;
在 PHP 中处理时间,我们通常使用 date() 函数。但这是有问题的: 它只能在 Unix 时间戳上操作,如果你想支持不同的地区、使用不同的时间格式,你得写许多不同的格式化字符串。Intl模块提供了一个更智能的方式:IntlDateFormatter,帮助我们根据地区和风格设置日期格式。
// 处理货币 $formatter = new NumberFormatter('zh_CN', NumberFormatter::CURRENCY); $price = $formatter->formatCurrency(12345.67, 'USD'); echo $price;
另一个国际化的问题是货币格式化,不能仅将美元显示为美元。数字格式化和货币格式化情况类似。在 UTF-8 编码中,Intl 组件可以愉快地处理各种语言、货币、模式等格式,以及以不同语言书写的小数分隔号 (比如 1,098.25)。
// 处理数字格式 $formatter = new NumberFormatter('zh_CN', NumberFormatter::DECIMAL); $number = $formatter->format(12345.67); echo $number;
数字形式的格式化也难以进行处理,特别是当它们不遵循万国编码时。
这些例子或多或少地展示了 Intl 模块的使用,更多详情可以参看官网文档。
总体来说,国际化是一个超出我们个人、团队,甚至国际组织范围的任务,在这个任务中 Intl 模块在 PHP 中扮演着至关重要的角色。