0

こんにちは、言語マッピングに問題があります。私がそれを機能させたい方法は、言語が /appname/de/mycontroller/whatever のような URL でエンコードされることです

/appname/mycontroller/action に移動すると、セッションがチェックされます。セッションがない場合は、ブラウザーの設定に基づいて言語を選択し、言語のプレフィックスが付いたサイトにリダイレクトします。セッションがある場合は、英語が表示されます。英語には en 接頭辞がありません (難しくするため)。

だから私はこのようなマッピングを作成しました:

class UrlMappings {
    static mappings = {
        "/$lang/$controller/$action?/$id?"{
            constraints {
                lang(matches:/pl|en/)
            }
        }
        "/$lang/store/$category" {
            controller = "storeItem"
            action = "index"
            constraints {
                lang(matches:/pl|en/)
            }
        }
        "/$lang/store" {
            controller = "storeItem"
            action = "index"
            constraints {
                lang(matches:/pl|en/)
            }
        }


        "/$controller/$action?/$id?"{
            lang="en"
            constraints {
            }
        }
        "/store/$category" {
            lang="en"
            controller = "storeItem"
            action = "index"
        }
        "/store" {
            lang="en"
            controller = "storeItem"
            action = "index"
        }


      "/"(view:"/index")
      "500"(view:'/error')
    }
}

それは完全には機能しておらず、言語は今のところハードコードされています。私は何か間違ったことをしたと思います。逆マッピングの一部は機能しますが、一部は言語を追加しません。

リンク タグを使用して params:[lang:'pl'] を渡すと機能しますが、params:[lang:'pl', page:2] を追加すると機能しません。2 番目のケースでは、lang とページ番号の両方がクエリ文字列のパラメーターになります。さらに悪いことに、ロケールには影響しないため、ページは英語で表示されます。

逆マッピングのルールとは何か、またはそのような言語プレフィックスを適切に実装する方法について、ドキュメントを教えてください。

ありがとう

4

2 に答える 2

3

対処しなければならない最大の問題は、英語の接頭辞がないことです。あなたのマッピングのほとんどは完全に問題ないようです。名前付きマッピングを使用することをお勧めします。

ただし、最初に、すべてのユーザーの言語パラメーターを設定するためのフィルターを使用することをお勧めします。

def filters = {
    languageCheck(controller: '*', action: '*') {
        before = {
            if( params.lang == null) {
                redirect( controller: params.controller, action: params.action, params:[ "lang": request.locale.language.toString() ] + params )
            }
        }
    }
}

言語パラメーターが欠落しているユーザーがサイトに入ると、フィルターによって言語が設定され、言語パラメーターを使用してコントローラーにリダイレクトされます。リダイレクトも行うセキュリティ フレームワークを使用している場合は注意してください。リダイレクトできるのは 1 回だけです。その場合、それらの URL またはコントローラーをフィルターから除外する必要があります。

次に、マッピングの問題を見ていきます。Grails 1.2 以降、名前付き URL マッピングと呼ばれるものがあります。例えば

name storeCategory: "/$lang/store/$category" {
        controller = "storeItem"
        action = "index"
        constraints {
            lang(matches:/pl|en/)
        }
    }

GSP内で、名前付きマッピングを参照できます

<g:link mapping="storeCategory" params="[lang:'en', category:'new']">Category</g:link>

これで問題が解決するはずです。名前付きマッピングについては、Grails リファレンスを参照してください。

于 2010-06-22T19:53:37.760 に答える
0

これを追加したいと思います: ?param=value を使用して追加する必要がある追加のパラメーターがある場合、それらを URL マッピングに明示的に追加しないと問題が発生します。これは、URL マッピング リゾルバーがコントローラーとアクション パラメーターを特別な意味を持つパラメーターとして尊重し、リンクを生成するためのパラメーターのセットがまったく同じマッピングにのみ一致するためです。

ただし、ページネーションを使用していると、問題が発生します。

したがって、上記に加えて、次の操作を行います。

class LangAwareUrlMappingsHolderFactoryBean extends UrlMappingsHolderFactoryBean {

    @Override
    public UrlMappingsHolder getObject() throws Exception {
        def obj = super.object
        obj.DEFAULT_CONTROLLER_PARAMS = [UrlMapping.CONTROLLER, UrlMapping.ACTION,     "lang"] as Set
        obj
    }   
}

そしてresources.groovy を調整します:

"org.grails.internal.URL_MAPPINGS_HOLDER"(LangAwareUrlMappingsHolderFactoryBean) { bean ->
    bean.lazyInit = true
}

そして、あなたは得るでしょう

/en/controller/action?offset=10

それ以外の

/controller/action?offset=10&lang=en
于 2013-05-08T16:23:32.080 に答える