2

短いバージョン:言語固有のURL構造alaを実装する魅力的で簡単な方法はありますか。Play1.2.5のhost.com/en/またはhost.com/pt/?

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

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

ルーティングファイルに「/(en | pt)/」のようなルートを含めることができることに気付きましたが、ここで立ち往生しています。

質問が少し曖昧な場合はお詫び申し上げます。必要が生じた場合は、喜んで明確にします。

4

2 に答える 2

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 アノテーションを選択します。

とてもシンプルな仕上がりになったので満足です。誰かが上記の恩恵を受けることを願っています。

于 2012-04-10T13:39:04.137 に答える
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()

これを書いているときに、プラグインでこれを行うことができるかもしれないと思いました。 Reflect.Method )

于 2012-04-10T08:19:54.327 に答える