2014-02-14 18 views
4

如何在playframework 2.2(java)中設置語言(i18n)不僅來自用戶瀏覽器設置,而且還來自子域名(應具有更高優先級)?playframework 2.2 java:如何從子域設置語言(i18n)

下面應該工作:

  • example.com - >英語或德語,這取決於瀏覽器設置
  • en.example.com - >力英語
  • de.example.com - > force german

用戶應該能夠在不丟失會話的情況下在子域之間切換。

因爲我有很多java控制器,如果解決方案在一個集中的地方工作(比如Global.java帶有一個可能在scala中的過濾器),那將會很棒。

回答

4

您可以使用play.mvc.Controller這個超類的changeLang(String code)方法。

然後,你需要告訴你的語言解析器,哪個域使用我們默認的語言,探索性地使用application.conf或數據庫記錄。下一步取決於你想要達到的目標,只需使用Global類來攔截你的所有請求,或者創建一個簡單的動作來改變語言,他們將返回到同一頁面(這樣用戶可以決定自己使用哪種語言) 。

這是一種基於cookie的機制,所以我不確定是否不需要執行強制頁面重新加載(即通過重定向到相同的路徑),無論如何,我假設你會告訴我們, LL檢查;)

編輯:

,可能是即。像

public Action onRequest(final Http.Request request, final Method actionMethod) { 

    if (request.host().equals("de.yourdomain.tld") 
      && (request.cookie("PLAY_LANG") == null || !request.cookie("PLAY_LANG").value().equals("de"))) { 
     return new Action.Simple() { 
      public Result call(Http.Context ctx) throws Throwable { 
       ctx.changeLang("de"); 
       return redirect(request.path()); 
      } 
     }; 
    } else { 
     return super.onRequest(request, actionMethod); 
    } 
} 

只要確保你有deapplication.conf加入,否則你會得到美麗,無盡的重定向循環。 PLAY_LANG是典型的Play用於存儲所選語言的cookie名稱。

+1

但是,如何從Global類和java中更改語言?我什至不知道如何在onRequest中設置cookie。這些東西應該是真的很容易在一個web框架... –

+0

檢查我的編輯...它是從我的頭頂寫的,所以請親自驗證它反對錯誤 – biesior