From fae1e0e7993fff80ff24c320dc38b1d8ad510137 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Wed, 22 Jun 2016 10:38:12 +0200 Subject: [PATCH] Uses LocaleProvider and default TextProvider instead of evaluating expression --- .../org/apache/struts2/components/I18n.java | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/org/apache/struts2/components/I18n.java b/core/src/main/java/org/apache/struts2/components/I18n.java index 82d991ef3..4492fa16d 100644 --- a/core/src/main/java/org/apache/struts2/components/I18n.java +++ b/core/src/main/java/org/apache/struts2/components/I18n.java @@ -22,14 +22,12 @@ package org.apache.struts2.components; import java.io.Writer; -import java.util.Locale; import java.util.ResourceBundle; import org.apache.struts2.views.annotations.StrutsTag; import org.apache.struts2.views.annotations.StrutsTagAttribute; import org.apache.struts2.StrutsException; -import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.LocaleProvider; import com.opensymphony.xwork2.TextProviderFactory; import com.opensymphony.xwork2.TextProvider; @@ -95,6 +93,8 @@ public class I18n extends Component { protected String name; protected Container container; private TextProvider textProvider; + private TextProvider defaultTextProvider; + private LocaleProvider localeProvider; public I18n(ValueStack stack) { super(stack); @@ -105,26 +105,31 @@ public class I18n extends Component { this.container = container; } + @Inject + public void setTextProvider(TextProvider textProvider) { + this.defaultTextProvider = textProvider; + } + + @Inject + public void setLocaleProvider(LocaleProvider localeProvider) { + this.localeProvider = localeProvider; + } + public boolean start(Writer writer) { boolean result = super.start(writer); try { String name = this.findString(this.name, "name", "Resource bundle name is required. Example: foo or foo_en"); - ResourceBundle bundle = (ResourceBundle) findValue("getTexts('" + name + "')"); + ResourceBundle bundle = defaultTextProvider.getTexts(name); if (bundle == null) { - bundle = LocalizedTextUtil.findResourceBundle(name, (Locale) getStack().getContext().get(ActionContext.LOCALE)); + bundle = LocalizedTextUtil.findResourceBundle(name, localeProvider.getLocale()); } if (bundle != null) { - final Locale locale = (Locale) getStack().getContext().get(ActionContext.LOCALE); TextProviderFactory tpf = new TextProviderFactory(); container.inject(tpf); - textProvider = tpf.createInstance(bundle, new LocaleProvider() { - public Locale getLocale() { - return locale; - } - }); + textProvider = tpf.createInstance(bundle, localeProvider); getStack().push(textProvider); pushed = true; }