2010-05-12 2 views
0

Привет, у меня проблемы с языковыми сопоставлениями. Способ, которым я хочу, чтобы он работал, заключается в том, что язык кодируется в URL-адресе, например/appname/de/mycontroller/whateverGrails - Префикс языка в сопоставлениях 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') 
    } 
} 

Его не полностью функционален и Langs жестко закодированы только сейчас. Я думаю, что я сделал что-то неправильно. Некоторые из обратных отображений работают, но некоторые не добавляют язык.

Если я использую тег ссылки и передаю параметры: [lang: 'pl'], то он работает, но если я добавлю параметры: [lang: 'pl', page: 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) 
      } 
     } 
    } 
} 

Если пользователь с параметром отсутствующего языка входит ваш сайт язык устанавливается фильтр, и он перенаправляется на контроллер с параметром языка. Будьте осторожны, если вы используете инфраструктуру безопасности, которая также перенаправляется. Вы можете перенаправлять только один раз. В этом случае вы должны исключить эти URL-адреса или контроллеры из фильтра.

Теперь мы рассмотрим вашу проблему с отображением. Начиная с Grails 1.2 есть так называемые Named URL Mappings. Например.

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 Reference

+0

awesome: -) благодаря названным сопоставлениям, похоже, это путь для меня. – Art79

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