1

我用 Yii2 中的模型实现了 API Rest 的结构。一切都适用于操作(索引、创建、更新等...)和方法(GET、POST、PUT 等..),但我的ContentNegotiator课程有问题。具体来说,如果我将要翻译响应的语言作为 GET 的参数传递,则将被忽略。根据设置响应语言的文档,我们需要设置允许的语言ContentNegotiator(查看我的behaviors())并提出如下请求:

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

注意:我通过框架类进行调试yii\filters\ContentNegotiator,此时应用程序语言设置正确,但响应始终为英语。

协商()公共方法

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 
}
4

1 回答 1

2

看起来有些内置错误未翻译,例如yii\rest\Action:103抛出throw new NotFoundHttpException("Object not found: $id")未翻译。你有不同的方法来解决这个问题:

  1. 好办法。扩展此操作并使用翻译引发正确的异常
  2. 不好的方式。编辑框架文件本身。
  3. 最好的办法。为框架创建补丁并发送给维护者。

有关 i18n 的更多信息,请参阅文档

于 2017-12-07T14:17:14.573 回答