编程

PHP 8.5: 新增 locale_is_right_to_left function 以及 Locale::isRightToLeft 方法

15 2025-05-26 02:34:00

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: Arabic
  • dv: Dhivehi
  • he: Hebrew
  • ku-Arab: Kurshish Sorani
  • ps: Pashto
  • fa: Persian (Farsi)
  • sd: Sindhi
  • ur: Urdu
  • yi: 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 函数引入到旧版本中。