локализация struts2 путем встраивания кода локали в имя действия, а не с помощью ...? request_locale = <код_ локали> - PullRequest
0 голосов
/ 19 января 2011

Привет всем,

Я хочу сделать функцию локализации на веб-сайте написанной в стойках 2. Насколько я знаю, стандартный способ сделать это - использовать get в следующемманера: http: //.../namespace/action_name? request_locale = <код локали>

однако мой босс не любит такой волосатый URL.вместо этого я должен написать это следующим образом:

http: //.../namespace/a_param/ code> / another_param ...

я пытался изменить отображение действий в моем struts.xml на что-то вроде

>param name = "locale"> {2} ...

не работает

после того, как я изменил его на

{2} ...

тоже не работает T_T

кстати, я знаю, что есть хитрость в установке ActionContext.getContext (). SetLocale (new Locale (...));в действии, которое в основном меняет локаль для этого экземпляра.однако, кажется, что эффект будет только временным (в отличие от этого, i18n сохраняет выбранную локаль в сеансе, что в основном делает ее довольно устойчивой.

так, как изменить локаль путем встраивания кода локали вurl?

Ваша помощь высоко ценится = D

Ответы [ 3 ]

1 голос
/ 19 января 2011

Я мало что сделал с локальными, но i18n должен автоматически определять правильный локальный из браузера через заголовки, нет необходимости, чтобы что-то было в URL. Пока есть языковой пакет для конкретной локали, он будет пытаться получить свойства из этого файла.

На этой странице показан пример использования базового i18n (я только посмотрел на него, лично я всегда начинаю с http://struts.apache.org/2.x/, но учебник / руководства немного суховаты.

Почему вы должны ссылаться на что-либо в URL вообще относительно языка? Лично, если пользователь хочет переопределить локаль по умолчанию, я бы предоставил некоторую форму управления (меню) для этого. Затем я установил бы переменную в сеансе, затем я бы создал перехватчик, который вызвал бы setLocale для действия, используя локальный параметр в сеансе (если, конечно, есть набор значений). Таким образом, не будет никакой необходимости встраивать параметры в отдельные страницы, а локальный вне URL все вместе.

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

Редактировать : Принимая во внимание то, что вы пытаетесь достичь, я вижу два совершенно разных решения.

1) Вы можете использовать прокси, входящие URL-адреса www.example.com/en/ и www.example.com/fr/ могут быть сопоставлены с различными веб-приложениями или даже с одним и тем же веб-приложением, но URL-адрес записано в форме, которая подходит для вашего приложения. Инструменты, которые могут сделать это, включают в себя: iptables, apache mod_rewrite, squid ... и множество других. Решение такого типа более ценно, если вы обрабатываете несколько IP-адресов / URL-адресов / приложений на одном сервере.

2) Вы можете установить свойство struts2 struts.enable.SlashesInActionNames , затем с помощью подстановочных знаков вы можете сделать что-то вроде:

<action name="*/*">
  <result>/WEB-INF/content/{1}/{2}.jsp</result>
<action>

Вы также можете передавать параметры действиям, каждая звездочка в названии действия становится {1}, {2} и т. Д. Похоже, вам может понадобиться эта функция. Если кто-то еще знает, что в данный момент мне удается избежать того, как вы будете захватывать части URL-адреса, например, с помощью struts2 -ventionstions-plugin, чтобы действие могло использовать их, я нахожу это интересным.

0 голосов
/ 07 мая 2018

Определенно, я бы оставил ответственность за обработку Locale на перехватчик .

Вот учебник для Создание перехватчика .

Этот перехватчик может быть помещен в общий стек, общий для всех (или большинства) входящих запросов, и он назначит языковой стандарт

ActionContext.getContext().setLocale(locale);

с правильной логикой, которая может учитывать:

  • параметры строки запроса
  • сохраненные пользовательские настройки
  • куки
  • сессия
  • настройки браузера (находятся в запросе)
0 голосов
/ 20 января 2011

@ Quaternion

В основном предполагается, что веб-сайт имеет несколько национальных «суб-сайтов». в зависимости от IP-адреса пользователя он / она будет перенаправлен на национальный «суб-сайт». это как при открытии www.google.com вы можете быть перенаправлены на www.google.com.country_domain.

каждый национальный «суб-сайт» имеет несколько языков, с одним языком по умолчанию. Это так же, как когда вы открываете веб-сайт google israel, по умолчанию вы увидите веб-сайт, написанный на иврите, хотя вы можете изменить этот выбор по умолчанию, выбрав его на английском языке.

на моем запланированном веб-сайте, следуя примеру isreal для веб-сайта и иврита, он должен выглядеть следующим образом:

  1. пользователь в Израиле
  2. он открывает www.abcdef.com
  3. сервер распознает, что клиент находится в Израиле. Для израильского «под-сайта» можно выбрать 3 языка: иврит, арабский, английский. по умолчанию используется иврит, но клиент может изменить этот выбор
  4. Затем пользователь перенаправляется на www.abcdef.com/il/he («иль» означает израильскую страну, а «он» - иврит)
  5. но пользователь, по-видимому, британский турист, не имеющий знаний по ивриту или арабскому языку. поэтому он / она выбрал английский язык
  6. он / она будет перенаправлен на www.abcdef.com/il/en («en» означает английский язык)
  7. в следующий раз, когда клиент снова откроет www.abcdef.com в Израиле (при условии, что файлы cookie и сеансы все еще существуют), он / она будет перенаправлен на www.abcdef.com/il/en

Спасибо за вашу помощь = D

...