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 по умолчанию?


person smeeb    schedule 06.11.2014    source источник


Ответы (1)


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

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

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

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

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

Обновить

Дополнительная информация, которая поможет вам двигаться в правильном направлении.

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

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

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

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

person Joshua Moore    schedule 06.11.2014
comment
Спасибо @Joshua Moore (+1) - пожалуйста, посмотрите мое обновление и вопрос под ним. Вы правы: возможно, я над этим слишком много думаю. Это может быть очень просто: предположим, что в браузере пользователя будет установлен правильный заголовок Accept-Language, а если нет, то по умолчанию будет en_US. Звучит примерно так? - person smeeb; 06.11.2014
comment
Он использует локаль по умолчанию для JVM. Обычно это en_US. - person Joshua Moore; 06.11.2014