2

简短版本:是否有一种有吸引力的简单方法来实现特定于语言的 url 结构,ala。玩 1.2.5 中的 host.com/en/ 或 host.com/pt/?

我正在寻找一种不需要更改所有控制器的解决方案,并且更改最好只针对路由文件,因为我不想要两组冗余视图 - 每种语言一个。

我已经有一个message.pt 和message.en,并且我有一种在两者之间切换的方法,但是在路由方面我是个新手。

我意识到路由文件可以包含如下路由:“/(en | pt)/”但我有点卡在这里。

如果问题有点含糊,我很抱歉。如果需要,我会很乐意澄清。

4

2 回答 2

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.反射.方法)

于 2012-04-10T08:19:54.327 回答
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)注释或更改 Controller 超类之间做出选择。我选择 @With 注释。

我很高兴,它最终变得非常简单。我希望有人可以从上述中受益。

于 2012-04-10T13:39:04.137 回答