2017-12-07 12 views
0

Yii2のモデルでAPI Restの構造を実装しました。すべては、アクション(インデックス、作成、更新など)とメソッド(GET、POST、PUTなど)に最適ですが、私はContentNegotiatorクラスに問題があります。 特に、応答を翻訳する言語をGETのパラメータとして渡すと、これは無視されます。 我々はContentNegotiatorの許可の言語を設定する(私のbehaviors()を見て)、このような要求をするために必要な応答の言語を設定するためのドキュメントによると:Yii2 RESTful:コンテンツネゴシエーション言語が機能しない

http://localhost/api/v1/users?_lang=it-IT

しかし、応答は英語であり続けています。なぜ???

これは私のActiveController子クラスで、yii\rest\Controllerから拡張されています。

use yii\rest\ActiveController; 
use yii\filters\VerbFilter; 

class AActiveController extends ActiveController 
{ 
    public function behaviors() 
    { 
     $behaviors = parent::behaviors(); 

     $behaviors['verbFilter'] = [ 
      'class' => VerbFilter::className(), 
      'actions' => $this->verbs(), 
     ]; 
     $behaviors['contentNegotiator']['languages'] = [ 
      'en-EN', 
      'it-IT', 
      'de-DE', 
      'ru-RU', 
     ]; 

     return $behaviors; 
    } 
... 

N.B.:フレームワークのyii\filters\ContentNegotiatorクラスでデバッグしましたが、この時点ではアプリケーション言語は正しく設定されていますが、レスポンスは常に英語です。

negotiate() public method

public function negotiate() 
{ 
    $request = $this->request ?: Yii::$app->getRequest(); 
    $response = $this->response ?: Yii::$app->getResponse(); 
    if (!empty($this->formats)) { 
     $this->negotiateContentType($request, $response); 
    } 
    if (!empty($this->languages)) { 
     Yii::$app->language = $this->negotiateLanguage($request); 
    } 
    debug(Yii::$app->language); // result OK!: it-IT 
} 
+0

「ただし、応答は引き続き英語で行われます」とはどういう意味ですか? ContentNegotiatorはlang appフィールドのみを設定できます。翻訳が必要な場合は、自分でそれを行う必要があります。 – Torv

+0

私は答えがイタリア語に翻訳されていないことを意味します – alvarofvr

+0

フレームワークはあなたのカスタムデータを翻訳できません。 – Torv

答えて

1

例えばyii\rest\Action:103throw new NotFoundHttpException("Object not found: $id")そのが翻訳されていないがスローされ、一部のビルドで翻訳されていないエラーのように見えます。この問題を解決するには、さまざまな方法があります。

  1. いいですね。このアクションを拡張し、正しい例外をスローする。
  2. 悪い。フレームワークファイル自体を編集します。
  3. ベストウェイ。フレームワークへのパッチを作成し、メンテナに送信します。

i18n see documentationの詳細については、こちらをご覧ください。

関連する問題