URL карты с идентификатором языка - PullRequest
2 голосов
/ 15 июля 2011

Есть ли хороший способ разрешить локаль на основе URL и других запросов карты без каких-либо дополнительных требований?

Например

http://example.com/ru/news    
http://example.com/iw/news

и в контроллере все еще используются стандартные сопоставления

@Controller
@RequestMapping(value = "/news")
public class NewsController {

    // Controller methods ...    

}

Ответы [ 3 ]

2 голосов
/ 15 июля 2011

Вы можете написать собственный перехватчик, который работает как LocaleChangeInterceptor

Вот пример реализации, в которой используется шаблон регулярного выражения (большая часть кода скопирована из LocaleChangeInterceptor):

public class CustomLocaleChangeInterceptor extends HandlerInterceptorAdapter {

    private Pattern localePattern;

    public void setLocalePattern(final String localePattern) {
        Assert.isTrue(localePattern.matches(".*\\(.*\\).*"), "Your pattern needs to define a match group");
        this.localePattern = Pattern.compile(localePattern);
    }

    @Override
    public boolean preHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler)
            throws ServletException {

        final String pathTranslated = request.getPathTranslated();
        if (pathTranslated != null) {

            final Matcher matcher = localePattern.matcher(pathTranslated);
            if (matcher.find()) {
                final String newLocale = matcher.group(1);
                if (newLocale != null) {
                    final LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
                    if (localeResolver == null) {
                        throw new IllegalStateException("No LocaleResolver found: not in a DispatcherServlet request?");
                    }
                    final LocaleEditor localeEditor = new LocaleEditor();
                    localeEditor.setAsText(newLocale);
                    localeResolver.setLocale(request, response, (Locale) localeEditor.getValue());
                }
            }
        }
        // Proceed in any case.
        return true;

    }

}

Подключите это так:

<bean id="localeChangeInterceptor"
      class="foo.bar.CustomLocaleChangeInterceptor">
    <property name="localePattern" value="\b([a-z]{2})\b"/>
</bean
1 голос
/ 15 июля 2011

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

Написать реализацию HandlerInterceptorкоторый реализует preHandle, так что строка языкового стандарта извлекается из URI запроса, а затем помечает запрос этим языковым стандартом ( см. исходный код для аналогичного LocalChangeInterceptor, что делает то жевам нужно, но вместо параметра пути используется параметр запроса.

Затем подключите его , используя <mvc:interceptor> например

<mvc:interceptors>
    <mvc:interceptor>
        <mapping path="/*"/>
        <bean class="x.y.MyInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>

Затем можно ослабитьотображение запроса на вашем контроллере для допуска (и игнорирования) языковой части URI:

@Controller
@RequestMapping(value = "*/news")
public class NewsController {

    // Controller methods ...    

}
0 голосов
/ 16 ноября 2011

Взгляните на http://lrkwz.github.com/URLManagedLocale/, вы можете просто удалить зависимость в вашем файле pom и настроить перехватчик и localeresolver.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...