【问题标题】:Why is yii2's internationalization module case sensitive?为什么yii2的国际化模块区分大小写?
【发布时间】:2017-06-26 17:58:54
【问题描述】:

我目前一直在涉足 yii2 的国际化模块,但遇到了一个奇怪的行为,正在徘徊。

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

我将翻译存储在数据库中。有什么办法可以使翻译不区分大小写吗?或者有什么具体原因会这样吗?

【问题讨论】:

    标签: php yii2 internationalization


    【解决方案1】:

    我相信这是一种预期的行为,因为在某些页面中打印“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);
        }
    }
    

    然后您将使用Translator::t('app', 'Next') 而不是调用Yii::t('app', 'Next'),它会为您获取单词“next”的翻译


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

    是覆盖主要的 I18N 组件,该组件在您的 web.php 设置中配置。 首先你应该创建一个类并从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);
        }
    }
    

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

    'components' => [
        'i18n' => [
            'class' => 'app\components\NewI18N', // Here it is
            'translations' => [
                'app*' => [
                    'class' => 'yii\i18n\PhpMessageSource',
                    'basePath' => '@app/messages',
                ],
            ],
        ],
    ...
    

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

    【讨论】:

    • 谢谢,这很有帮助;)
    • 不客气 =)
    猜你喜欢
    • 2013-10-31
    • 2011-11-17
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 2011-11-14
    相关资源
    最近更新 更多