如何为每种语言设置不同的路线

Posted

技术标签:

【中文标题】如何为每种语言设置不同的路线【英文标题】:How to have differents routes for each languages 【发布时间】:2013-06-12 11:56:48 【问题描述】:

我正在使用 Play Framework 1.2.4,我想知道是否有办法为每种语言设置不同的路由,这些路由指向相同的控制器/动作(特别是针对 SEO)。

例如,我想要:

GET /en/how-it-works           myController.howItWorks
GET /fr/comment-ca-marche      myController.howItWorks

问题是反向路由从路由文件的顶部开始,所以如果我在网站的/fr 部分,链接@myController.howItWorks 将导致/en/how-it-works

为了完成我的案例,我使用参数lang 作为路由参数,这是我的路由文件:

GET /lang/how-it-works        myController.howItWorks

myController 有一个@Before 方法来设置lang routeArgs。此代码有效,我得到了/en/how-it-works,如果我将语言更改为 fr,我得到了 /fr/how-it-works

我已经在我的路由文件中尝试过这个,但它不起作用

%if (lang == 'fr')    %
GET /lang/comment-ca-marche  myController.howItWorks
%  else  %
GET /lang/how-it-work        myController.howItWorks
%  %

lang 参数似乎是null,所以我无法动态选择正确的路线。 我想知道是否有人遇到同样的问题,

感谢您的帮助

(对不起我的英语......)

【问题讨论】:

【参考方案1】:

它应该可以工作。

我有以下路线

GET     /lang/users/list                      Application.generateLink

及相关的控制器方法

public static void index(String lang)  ... 

在我看来

<li class=""><a href="@UserManager.index(lang)">&'navigation.users.view'</a></li>

在有点简单的 changeLanguage 代码中。如果它为空,您只需设置语言。

public static void changeLanguage(String lang) 
    if (lang != null) 
        String property = Play.configuration.getProperty("application.langs");
        if (property.contains(lang)) 
            Lang.change(lang);
        
     else 
        lang = "en";
        Lang.change(lang);
    
    String replacement = String.format("/%s/", lang);
    if (lang.equals("en")) 
        redirect(request.headers.get("referer").value().replace("/fr/", replacement));
     else 
        redirect(request.headers.get("referer").value().replace("/en/", replacement));
    

当您更改语言时,它适用于 URL。

您可以创建自定义 java 标签来生成链接。输入将是idtext,并生成具有正确属性的链接。看看http://www.playframework.com/documentation/1.2.5/templates(自定义 Java 标签部分)

希望对你有帮助。

【讨论】:

感谢您的帮助,但我已经编写了这部分代码(我在 routeArgs 中设置了语言,并在我的路由文件中获取了它)。我的问题是我想要一个 lang 的路由:lang/how-it-workslang/comment-ca-marche 指向同一个控制器/动作。目前我只有fr/how-it-worksen/how-it-works 啊,您需要插入某种 id 或常量,即可以是 lang/id/text - 根据 ID,您可以替换文本,但 ID 需要保持不变。除非使用此解决方案,否则您将需要自己维护一个映射,它可以转换(它的工作原理 commen-ca-marche 来回)。这涉及更多,但应该是可行的。重要的是,您将拥有一个通用控制器,并且文本会根据语言而变化。我怀疑你是否可以有多个静态路由。也许,其他人可以对此有所了解。 查看更新链接中的自定义 Java 文档。我认为它将提供中间层,您可以在其中生成正确的代码。

以上是关于如何为每种语言设置不同的路线的主要内容,如果未能解决你的问题,请参考以下文章

如何为指向两个不同域的一个 Laravel 应用程序设置不同的语言环境?

如何为端点上的不同请求设置单独的计数器指标?

如何为 iOS 应用设置默认本地化

如何更改将“editor.insertSpaces”设置为“auto”的每种语言配置

如何更改将“editor.insertSpaces”设置为“auto”的每种语言配置

Swift 如何为不同语言本地化数组