2013-12-17 2 views
2

В частности, мне нужно разрешить передачу локали в URL-адресе, а затем изменить локаль. Это должно быть глобальным поведением и должно произойти до того, как будет вызвано какое-либо действие, так что изменение локали вступит в силу с текущего запроса.В игровой среде 2.x, как добавить глобальное действие/фильтр?

GlobalSettings.onRequest() еще не имеет Http.Context, и насколько я знаю, он не имеет API для изменения языка на этом этапе.

У меня могло бы быть какое-то действие, которое меняет локаль, но я не знаю, как сделать ее глобальной, чтобы все запросы переходили к этому действию в первую очередь, и я не хочу комментировать каждый контроллер, поскольку его очень легко забыть.

Я использую play framework 2.1.2, любой указатель будет оценен.

ответ

5

Есть несколько вариантов.

  1. Вы можете аннотировать классы контроллеров и использовать композицию Action

http://www.playframework.com/documentation/2.1.2/JavaActionsComposition

  1. Переопределить в GlobalSettings.onRequest со следующими

    @Override 
    public Action onRequest(Request request, Method actionMethod) { 
        return new Action.Simple() { 
         public Result call(Context ctx) throws Throwable { 
          **//do your lang changing stuff** 
          return delegate.call(ctx); 
         } 
        }; 
    } 
    
+1

спасибо за хорошее решение - переопределить onRequest. – user3054023

+0

для полноты Я бы просто предложил этот простой «материал для изменения языка»: 'String langString = request.getQueryString (" lang "); if (langString! = null) {ctx.changeLang (langString);} '. Это позволяет вам добавить '? Lang = de' в ваш URL-адрес и переключить сеанс на немецкий. И еще, большое спасибо за это решение. Искали слишком долго для этого! – Giszmo

0

Я не уверен, что вы используете scala или java.

Это один из способов выполнить обновление заголовка поля языка в Скале:

import play.api.mvc.{Headers, Handler, RequestHeader} 
import play.api.http.HeaderNames 
import play.api.GlobalSettings 

object Global extends GlobalSettings { 

    val LangQueryString = "lang" 

    def updateLanguageHeader(lang: String)(request: RequestHeader) = 
    request.copy(
     headers = new Headers { 
     val data = (request.headers.toMap + (HeaderNames.ACCEPT_LANGUAGE -> Seq(lang))).toList 
     }) 

    def remLangQueryString(request: RequestHeader) = 
    request.copy(
     queryString = request.queryString - LangQueryString) 

    def updateLangFromQueryString(request: RequestHeader) = 
    request.getQueryString(LangQueryString) match { 
     case Some(lang) => 
     (updateLanguageHeader(lang) _ andThen remLangQueryString)(request) 
     case _ => 
     request 
    } 

    override def onRouteRequest(request: RequestHeader): Option[Handler] = { 
    super.onRouteRequest(updateLangFromQueryString(request)) 
    } 
} 
+0

благодаря F или предложение, которое могло бы работать, но я думаю, что принятый ответ более уместен. Cheers – user3054023

+0

Разница в том, что ответ Ниланджана сосредоточен на Java. Этот ответ связан с scala. – tmbo

+0

Привет, ваша идея состоит в том, чтобы изменить заголовок Accept-Language запроса, в то время как Nilanjan использует стандартную композицию действия и изменяет локаль перед вызовом любого другого действия. Оба решения работают в java или scala в этом случае, но лично я предпочитаю композицию действий, поскольку ее можно расширить, чтобы легко добавлять другие глобальные действия. – user3054023

Смежные вопросы