Grails i18n: настройка заголовка Accept-Language

Согласно документу по интернационализации Grails, i18n выполняется одним из следующих способов:

  • Настройка Accept-Language заголовок в запросе; или же
  • Клей на lang параметр строки запроса

Я выбираю первый, потому что он более HTTP-совместимый и, честно говоря, мне просто не нравится добавлять его в качестве параметра запроса.

Но как бы я установить Accept-Language на первом месте?!?

Я хочу, чтобы локаль моего приложения определялась по запрашиваемому TLD. Итак, запрос на http://myapp.example.com вернет en_US версия моего приложения, потому что *.com традиционно ассоциируется с английским / американским. Если http://myapp.example.fr был запрошен, то Grails должен служить обратно fr_FR версия моего приложения. И т.п.

Итак, мой настоящий вопрос:

Как я могу сопоставить запрошенный URL/TLD с переменной, которую Grails может установить на сервере, а затем внедрить в GSP, чтобы запросы на стороне клиента всегда имели совпадающие Accept-Language заголовок для данного URL/TLD?


Обновить

Я хочу подтвердить поведение браузера /Grails здесь: можно ли предположить, что когда пользователь настраивает свой браузер, браузер настраивает Accept-Language заголовок соответственно? Если да, могу ли я также предположить, что если Accept-Language не отправлено, а lang не указан в качестве параметра запроса, который использует Grails en_US по умолчанию?

1 ответ

Решение

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

Более простой и правильный подход будет заключаться в реализации вашей собственной логики внутри нового localeResolver бин внутри вашего приложения Grails.

Этот бин может сначала проверить ваш собственный пользовательский поиск на основе request.getRequestURI() и решите, к чему должен обратиться языковой стандарт. Вы могли бы даже заставить его вернуться к стандартному поведению и после этого.

Ключом к реализации этого, опять же, является понимание существующих localeResolver и понимание, как заменить его. Вы должны будете копаться во внутренностях Грааля (и Весны), чтобы обнаружить это.

Чтобы заменить реализацию по умолчанию, вам просто нужно переопределить bean-компонент внутри вашего resources.groovy, Повторная реализация полностью зависит от вас.

Обновить

Некоторая дополнительная информация, чтобы направить вас в правильном направлении.

По умолчанию ваш resources.groovy Файл не будет содержать определение этого компонента для вашего проекта. Вам решать создать там новую запись, которая заменит ту, что создана фреймворком.

Чтобы понять, какой компонент вы собираетесь реализовывать, вам нужно взглянуть на интерфейс LocaleResolver. В зависимости от того, как вы подходите к этой проблеме, вы будете либо реализовывать этот интерфейс, либо расширять реализацию Grails.

Реализация Grails подключаемого модуля i8n на Github и его настройки для преобразователя локали. Вы заметите, что реализацией по умолчанию является SessionLocaleResolver, предоставляемый Spring.

Надеюсь это поможет.

Другие вопросы по тегам