2012-04-09 23 views
2

短いバージョン:言語固有のURL構造を実装する魅力的で簡単な方法はありますか。 Play 1.2.5のhost.com/en/またはhost.com/pt/?遊びのSEOフレンドリーなルーティング

すべてのコントローラを変更する必要がないソリューションを探しています。変更は、言語ごとに1つずつ、2セットの冗長なビューを必要としないので、ルーティングファイルのみにすることをお勧めします。

私はすでにmessage.ptとmessage.enを持っていますが、私は2つの間で切り替える方法がありますが、ルーティングに関してはnewbです。

私は、ルーティングファイルに "/(en | pt)/"のようなルートを含めることができることを認識していますが、私はここでちょっと固まっています。

質問が少しばかり曖昧であれば私は気にします。 必要が生じた場合は、喜んで解説します。

+0

チュートリアルでレンダリングするタスクを定義する方法と同様のものを試しましたか? 'POST/tasks /:id/delete controllers.Application.deleteTask(id:Long)'の行に何かがあります。 –

+0

フレームワークのバージョン? – sdespolit

+0

Dan:すべてのコントローラを変更する必要はありませんか?lang属性を受け入れるには? – DarkNeuron

答えて

1

Play 1.1のいくつかの古い変更ノートの解決策を見つけました: http://www.playframework.org/documentation/1.2/releasenotes-1.1(「グローバルルート引数」の下にあります)。奇妙なことに、他のどこにも言及されていません。

[全体の作業溶液含めるように編集] [EDIT2 - 問題を修正する]

私のルートは、このような外観をファイル:

# Home page 
GET  /{lang}/?       Application.index 
GET /         Application.redirect 
GET  /{lang}/woops/?      Application.underConstruction 

言語コントローラはこのATMのようになります。

public class Language extends Controller { 

@Before 
static void detectLangInURL() { 
    String url = request.url; 

    if (url.length() > 2 && isSupported(getFromUrl(url))) 
    { 
     String lang = getFromUrl(url); 
     if (!Lang.get().equals(lang)) { 
      Lang.change(lang); 
      response.setCookie("lang", lang, "60d"); 
     } 
     renderArgs.put("lang", Lang.get()); 
     routeArgs.put("lang", Lang.get()); 
    } 
} 

private static String getFromUrl(String url) { 
    String[] s = url.split("[/]"); 
    if (s.length > 1) 
     return s[1]; 
    else return ""; 
} 

private static boolean isSupported(String lang) { 
    if (lang.length() == 0) 
     return false; 

    String[] langList = Play.configuration.get("application.langs").toString().split(","); 
    for (int i = 0; i < langList.length; i++) { 
     if (langList[i].compareToIgnoreCase(lang) == 0) 
      return true; 
    } 

    return false; 
} 
} 

リダイレクト方法は次のようになります。

public static void redirect() { 
    Cookie lang = request.current().cookies.get("lang"); 
    if (lang != null && !lang.value.isEmpty()) 
     Lang.change(lang.value); 
    redirect(Lang.get() + "/"); 
} 

@With(Language.class)アノテーションを使用するか、コントローラーのスーパークラスを変更するかを選択する必要がありました。 @Withアノテーションを選択します。

私は満足しています、それは結局かなり簡単でした。 私は誰かが上記の恩恵を受けることを願っています。

1

私はそこに道があるとは思わないが、あなたはコントローラに何かする必要があるだろう。

私はこれをテストしていませんが、このような何かが動作するはずです:

public static class LanguageParams extends Controller 
{ 
    @Before 
    static void addLanguageParam(String language) 
    { 
     renderArgs.put("lang", language); 
    } 
} 

あなたはこのようなすべてのコントローラに@Withを追加する必要があります。

@With(LanguageParams.class) 
public class Foo extends Controller 
{ 
.... 
} 

...そして、あなたの中にあなたは次のようなものを持っています:

GET foo/{<en|pt>language>}/whatever  Foo.index() 

これを書いている間に、あなたはできることがありますhttp://www.playframework.org/documentation/api/1.2/play/PlayPlugin.html#beforeActionInvocation(java.lang.reflect.Method

関連する問題