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

问题描述 投票:7回答:1

我的网站是一个托管服务提供商,它在服务器上提供了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提供的后备方法,哪种方法可以正常工作?

php yii2 internationalization
1个回答
3
投票

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

yii\i18n\MessageFormatter代码复制到新文件。将其命名为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['yii\i18n\MessageFormatter'] = 'path/to/your/MessageFormatter.php';

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

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

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


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

© www.soinside.com 2019 - 2024. All rights reserved.