我的网站是一个托管服务提供商,它在服务器上提供了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提供的后备方法,该方法可以正常工作?
答案 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
方法,而无需修改类映射。