2017-06-26 4 views
4

私は現在、yii2の国際化モジュールを手に入れていますが、好奇心をそそられた振る舞いを見て、さまよっていました。yii2の国際化モジュールで大文字と小文字が区別されるのはなぜですか?

なぜYii::t('app','NEXT'),Yii::t('app','next')およびYii::t('app','Next')は別々の翻訳が必要ですか?

私はデータベースに翻訳を保存しています。翻訳を大文字と小文字を区別することができますか?それともなぜこのような理由がありますか?

答えて

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); 
    } 
} 

そして代わりの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); 
    } 
} 

..Next、あなたのweb.php設定ファイルを開き、次のように「I18N」コンポーネントのクラスを設定します。

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

それで全部です!この2番目のアプローチでは、サードパーティのTranslatorクラスを使用する必要はありません。おなじみのYii::t()メソッドを呼び出すと、自動的に文字列が下がります。

+0

ありがとう、それは多くを助けます;) – natral

+0

あなたはようこそ=) – Yerke

関連する問題