Aw: Re: User's language in URL

Ute Kaiser <[email protected]> Tue, 20 Jan 2026 10:26:23 +0000
Newsgroups gmane.comp.jakarta.struts.user
Message-ID <trinity-5073c451-ceea-44b7-aec3-b91cd5bc8fb7-1768904783459@trinity-msg-rest-webde-webde-live-589d84f6c9-7vht5>
Hi Florian,

my Interceptor to get language from URL https://myURL/myApp/<de/en>/myAction.xxx

package whatever.your.project;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.ActionContext;
import org.apache.struts2.ActionInvocation;
import org.apache.struts2.interceptor.Interceptor;
import org.apache.struts2.ServletActionContext;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import java.util.Locale;
/**
 * Extract language (de or en) from request und set struts constant WW_TRANS_I18N_LOCALE.
 * @param ActionInvocation invocation
 * @return String invocation.invoke()
 */
public class LocaleInterceptor implements Interceptor
{
	private Log log = LogFactory.getLog ( getClass () );
	@Override
	public void init() {}
	@Override
	public void destroy() {}
	@Override
	public String intercept(ActionInvocation invocation) throws Exception
	{
		HttpServletRequest request = ServletActionContext.getRequest();
		HttpSession session = request.getSession();
		//extract language from URL  /en/... or /de/... and set Locale. Default englisch
		String uri = request.getRequestURI();
		Locale myLocale = uri.contains("/de/") ? Locale.GERMANY : Locale.US;
		session.setAttribute("WW_TRANS_I18N_LOCALE", myLocale);
		// additionally for problems with a night batch job
		ActionContext.getContext().withLocale(myLocale);
		log.debug("Executing my LanguageGetterSetter: myLocale= " + myLocale.toString());
		return invocation.invoke();
	}
}

struts.xml:
	<constant name="struts.enable.SlashesInActionNames" value="true"/>
	<constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/>
	<package name="myApp" extends="struts-default">
		...
		<interceptors>
			<interceptor name="LocaleInterceptor" class="whatever.your.project.LocaleInterceptor" />
			<interceptor-stack name="myStack">
				<interceptor-ref name="LocaleInterceptor" />
				<interceptor-ref name="defaultStack">
		...
		<action name="{lang}/MyAction" class="whatever.your.project.MyAction" method="execute">
		...

MyAction.java:
@Namespace("/{lang}")
public final class MyAction extends ...

That was enough to get the language specific resource properties.
It was my first struts2/7 application, migrating from struts1, so there might be better solutions.
It worked only with the namespace.

In some jsp, I needed explicitly the language:
<s:set var="sprache" value="#attr['locale'].language.toUpperCase()"/> //sprache=German for language

And to add more complexity, I needed some language specific fields stored in database (e.g. descriptionDE or descriptionEN) instead of resource properties.
<s:myproperty value="something.description" ...
public class MypropertyTag extends PropertyTag {
	public void setValue(String value) {
		String sprache = ActionContext.getContext().getLocale().getLanguage().toUpperCase();
		super.setValue(value + sprache);
	}
}
I copied struts-tags.tld into my project and added the tag myproperty (mostly as a copy of the tag property).

Kind regards Ute
(inconsistency may be caused by hiding my application names)