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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Yii2:如何强制使用fallback MessageFormatter方法?相关的知识,希望对你有一定的参考价值。

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

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

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

...因为=1=2符号。

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

答案

有这种hacky方式你可以尝试。

yiii18nMessageFormatter代码复制到新文件。将其命名为MessageFormatter.php并将其放置在应用程序中的某处(但不在vendor文件夹中)。

在这个新文件中,将format()方法更改为:

public function format($pattern, $params, $language)
{
    $this->_errorCode = 0;
    $this->_errorMessage = '';

    if ($params === []) {
        return $pattern;
    }

    return $this->fallbackFormat($pattern, $params, $language);
}

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

现在让我们使用Yii映射。

当您可以在bootstrapping phase中放置将每次运行的代码时,在应用程序中找到一个位置。如果您使用“高级模板”式项目,那么common/config/bootstrap.php的好地方就是这个。

添加此行:

Yii::$classMap['yiii18nMessageFormatter'] = 'path/to/your/MessageFormatter.php';

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

在修改后的文件MessageFormatter方法中,从不检查intl库的存在,因此使用fallback作为默认值。

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


另一种方法是在您的应用程序中配置I18N组件以使用您的自定义MessageFormatter,您可以在其中扩展原始文件并在不修改类映射的情况下覆盖format()方法。

以上是关于Yii2:如何强制使用fallback MessageFormatter方法?的主要内容,如果未能解决你的问题,请参考以下文章

YII2调试 通过日志记录将变量保存到文件

使用`FALLBACK`时如何知道是不是返回左值?

SpringCloud-Hystrix-如何使用Fallback

Yii2学习笔记之场景

feign继承api如何加fallback

如何直接在 @FeignClient 中定义 Hystrix Client Fallback