Yii2:如何强制使用fallback MessageFormatter方法?

时间:2018-02-07 20:48:58

标签: php yii2 internationalization

我的网站是一个托管服务提供商,它在服务器上提供了MessageFormatter类(Linux,PHP 7.0.27),但它是一个旧的ICU版本(4.2.1),它不支持我的消息{{ 1}}并给出错误:

  

消息模式无效:构造函数失败

     

msgfmt_create:消息格式化程序创建失败:U_ILLEGAL_CHARACTER

...因为{number,plural,=0{# available} =1{# available} other{# available}}=1表示法。

我无法对服务器进行更改,因此如何强制使用Yii2提供的后备方法,该方法可以正常工作?

1 个答案:

答案 0 :(得分:3)

你可以尝试这种黑客方式。

--right-of代码复制到新文件。将其命名为yii\i18n\MessageFormatter并将其放在应用程序中的某处(但不在MessageFormatter.php文件夹中)。

在此新文件中,将vendor方法更改为:

format()

不要更改任何其他内容(包括命名空间)。

现在让我们使用Yii映射。

在每次bootstrapping phase中放置将运行的代码时,在应用程序中找到一个位置。如果你正在使用类似“高级模板”的项目,那么这个地方的好地方是public function format($pattern, $params, $language) { $this->_errorCode = 0; $this->_errorMessage = ''; if ($params === []) { return $pattern; } return $this->fallbackFormat($pattern, $params, $language); }

在这行添加:

common/config/bootstrap.php

显然改变了你选择的路径。现在,Yii自动加载器将从您的文件而不是原始的Yii供应商文件夹中加载此类(如本指南的Class Autoloading部分所述)。

在修改后的文件Yii::$classMap['yii\i18n\MessageFormatter'] = 'path/to/your/MessageFormatter.php'; 中,永远不会检查MessageFormatter库的存在,因此将使用回退作为默认值。

这个技巧的缺点是每次更改原始Yii文件时都需要手动更新文件(因此几乎每次升级Yii版本时都是如此)。

另一种方法是在应用程序中配置I18N组件以使用自定义intl,您可以在其中扩展原始文件,只需覆盖MessageFormatter方法,而无需修改类映射。