PHP 8.5: 新增 locale_is_right_to_left function 以及 Locale::isRightToLeft 方法
PHP 8.5 中的 Intl
扩展添加了新功能,以确定给定的区域设置是否使用 RTL(从右向左)脚本。
阿拉伯语、希伯来语、乌尔都语和其他一些语言文字是从右向左书写的。虽然 RTL 脚本列表相对较小,而且很少添加新脚本,但新功能利用了 ICU 数据,这些数据在依赖 ICU 数据的其他软件中会持续更新。
新增加的函数 locale_is_right_to_left
以及静态方法 Locale::isRightToleft
都接收一个 string
类型的语言名称作为他们的唯一参数,并返回 true
或者 false
以表明脚本是否为 RTL。
新增的 locale_is_right_to_left
函数
/**
* Returns whether the given $locale has an RTL script.
* @param string $locale
* @return bool Whether the script is RTL
*/
function locale_is_right_to_left(string $locale): bool {}
locale_is_right_to_left
函数在全局命名空间中声明。- 未传入参数将抛出
ArgumentCountError
错误。 - 传入空字符串将返回
false
。 - 将传入无效的语言将返回
false
。
错误处理行为(例如,空字符串这种无效语言)与其他的 locale_
函数是一致的,即对无效输入返回 false。
locale_is_right_to_left('en'); // false
locale_is_right_to_left(''); // false
locale_is_right_to_left('ar'); // true
locale_is_right_to_left('ar-US'); // true
locale_is_right_to_left('he_IL'); // true
locale_is_right_to_left('ar-XY'); // true
新增的 Locale::isRightToLeft
静态方法
PHP 8.5 的 Intl 扩展中的 Locale
类中也新增了一个静态方法:Locale::isRightToLeft
,它提供了与 locale_is_right_to_left
完全相同的功能及行为。
class Locale {
// ...
/**
* Returns whether the given $locale has an RTL script.
* @param string $locale
* @return bool Whether the script is RTL
* @alias locale_is_right_to_left
*/
public static function isRightToLeft(string $locale): bool {}
}
Locale::isRightToLeft
是静态函数- 以下与
locale_is_right_to_left
函数完全相同的错误处理方式。
Locale::isRightToLeft('en'); // false
Locale::isRightToLeft(''); // false
Locale::isRightToLeft('ar'); // true
Locale::isRightToLeft('ar-US'); // true
Locale::isRightToLeft('ar-XY'); // true
用户空间 PHP Polyfill
可以用硬编码的语言环境列表来模仿 locale_is_right_to_left
函数功能。因为新的 RTL 脚本很少引入 ICU,所以这是一个相对安全的 polyfill。
以下 polyfill 检查给定的 $locale
参数是否与已知的 RTL 脚本列表匹配或前缀是否匹配:
ar
: Arabicdv
: Dhivehihe
: Hebrewku-Arab
: Kurshish Soranips
: Pashtofa
: Persian (Farsi)sd
: Sindhiur
: Urduyi
: Yiddish
/**
* Returns whether the given $locale has an RTL script.
* @param string $locale
* @return bool Whether the script is RTL
*/
function locale_is_right_to_left(string $locale): bool {
return (bool) preg_match('/^(?:ar|he|fa|ur|ps|sd|ug|ckb|yi|dv|ku_arab|ku-arab)(?:[_-].*)?$/i', $locale);
}
向后兼容性影响
locale_is_right_to_left
PHP 中新增到全局命名空间的函数。除非你在应用中使用了相同的名称来声明自己的函数,否则不会造成任何兼容性影响。Locale::isRightToleft
是一个新增到Locale
类的静态方法。它并没有被声明为final
。除非你的在应用中继承了Locale
类并使用了不匹配的方法名,否则不会带来任何向后兼容性影响
此外,可以使用 polyfill 将 locale_is_right_to_left
函数引入到旧版本中。