为什么yii2的国际化模块区分大小写?

nat*_*ral 4 php internationalization yii2

我目前正在涉足yii2的国际化模块,但遇到了一种奇怪的行为并且正在徘徊.

为什么Yii::t('app','NEXT'),Yii::t('app','next')Yii::t('app','Next')要求单独的翻译?

我正在将翻译存储在数据库中.有什么办法可以让翻译不区分大小写吗?或者有一个特定的原因,为什么会这样?

Yer*_*rke 6

我认为这是一种预期的行为,因为在某些页面中打印"NEXT"和"next"看起来确实不同.因此,举例来说,如果我想看某个地方'КЕЛЕСІ'而不是'келесі',而我只会收到小写的结果,那么首先会让我感到困惑.

无论如何,最好将该功能初始化区分大小写,并且您可以根据需要对其进行不区分大小写(或创建任何字符串运算符).

容易但不推荐

最简单的方法是使用静态函数定义一个类,在这里你可以降低任何输入,然后调用前一个Yii::t()函数.

namespace app\components; // your namespace here

class Translator {
    public static function t($category, $message, $params = [], $language = null)
    {
        return \Yii::t($category, strtolower($message), $params, $language);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,而不是打电话给Yii::t('app', 'Next')你,它将使用Translator::t('app', 'Next')它,它将为你提取"下一个"一词的翻译


第二个(更优雅)解决方案:

是覆盖在您的web.php设置中配置的主I18N组件.首先,您应该创建一个类并从yii\i18n\I18N组件继承它:

namespace app\components;

use yii\i18n\I18N;

class NewI18N extends I18N
{
    public function translate($category, $message, $params, $language)
    {
        return parent::translate($category, strtolower($message), $params, $language);
    }
}
Run Code Online (Sandbox Code Playgroud)

..接下来,打开您的web.php设置文件并配置'i18n'组件类如下:

'components' => [
    'i18n' => [
        'class' => 'app\components\NewI18N', // Here it is
        'translations' => [
            'app*' => [
                'class' => 'yii\i18n\PhpMessageSource',
                'basePath' => '@app/messages',
            ],
        ],
    ],
...
Run Code Online (Sandbox Code Playgroud)

就这样!在第二种方法中,您不必使用第三方Translator类,只需调用您熟悉的Yii::t()方法,它就会自动降低字符串.