论坛首页 Java企业应用论坛

WebWork2中i18n的怪异表现??

浏览 11596 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2004-08-10  
在WW2中多语言的资源文件(.properties)可以根据需要分别在写在不同的文件中,WW2会根据一定的顺序去找他们,在WW2文档中写道通过监听器,或者servlet的初始化方法,也可以支持像Struts那样的统一的资源文件。

但是,WW2的所有资源文件的载入都必须通过一个Aciton??也就是说一个jsp页面直接浏览的时候,页面中的<ww:text/>标签根本不起作用??必须通过一个Action的返回success或input之类页面中,这些标签的才能起到作用。

为什么要设计成这样?还是我的配置问题。有人遇到这样的问题吗?一起讨论一下!!!
   发表时间:2004-08-12  
没有遇到你这样的问题, 查文档看看:

http://wiki.opensymphony.com/display/WW/UI+Tags#UI+Tags-i18n
0 请登录后投票
   发表时间:2004-08-12  
用<ww:i18n/>
例:
<ww:i18n name="'com.opensymphony.webwork.example.i18n.Shop'">
  <ww:text name="'main.title'"/>
</ww:i18n>
0 请登录后投票
   发表时间:2004-08-12  
对,用了i18n标签后当然是可以了。只是这样写一是比较麻烦,二是资源文件的位置将不可配置,还是不太方便。

而且我用了WW2文档推荐的方法,将资源文件绑定的统一放在listener中,我只想用一个text标签搞定多语言文字输出问题,就像在struts中使用bean:message一样!



public class WebworkGlobalMessagesListener implements ServletContextListener {
    private static Logger log = Logger.getLogger(WebworkGlobalMessagesListener.class);;
    private static final String DEFAULT_RESOURCE = "global-messages";

    /**
     * Uses the LocalizedTextUtil to load messages from the global
     message bundle.
     * @see
     javax.servlet.ServletContextListener#contextInitialized(javax.servlet.Servle
     tContextEvent);
     */
    public void contextInitialized(ServletContextEvent arg0); {
        log.info("Loading global messages from " + DEFAULT_RESOURCE);;
        LocalizedTextUtil.addDefaultResourceBundle(DEFAULT_RESOURCE);;
        log.info("Global messages loaded.");;
    }

    /**
     * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent);
     */
    public void contextDestroyed(ServletContextEvent arg0); {

        // do nothing
    }

}

0 请登录后投票
   发表时间:2004-08-16  
问题出在WW的文档中。文档中描述textfield标签使用国际化资源的时候是使用text('key')。其实是通过OGNL去访问ActionSupport的getText(String key)方法。如下:
<ww:textfield />  
In this example, a text control is rendered. The label is retrieved from a ResourceBundle by calling ActionSupport's getText(); method. 
<ww:textfield label="text('user_name');" name="'user'"/>


但是,文档中写的这个方法其实是错误的,正确使用OGNL访问有参数method的方法是,方法的全称,getText('key')。上面这个实例应该是这样:

<ww:textfield label="getText('user_name');" name="'user'"/>


竟然是WW的文档错了!不知道我的理解对吗?
0 请登录后投票
   发表时间:2004-08-26  
还没有用ww。
但是对于ognl,如果getText()这个方法存在,且返回的是map,那么text('user_name')这个用法是正确的。
而getText则相当于直接调用一个带参数的方法了,它返回的一般直接是string了。
0 请登录后投票
   发表时间:2004-10-18  
今晚也遇到这个问题,看看源码就知道了
ActionSupport.java

    public String getText(String aTextName);
    {
        return textProvider.getText(aTextName);;
    }
...
    private final transient TextProvider textProvider = new TextProviderSupport(getClass();, this);;


I18nTag.java
    public int doStartTag(); throws JspException {
        // Get bundle
        try {
            String name = this.findString(nameAttr);;
            ResourceBundle bundle = (ResourceBundle); findValue("texts('" + name + "');");;

            if (bundle == null); {
                bundle = LocalizedTextUtil.findResourceBundle(name, (Locale); getStack();.getContext();.get(ActionContext.LOCALE););;
            }

            if (bundle != null); {
                final Locale locale = (Locale); getStack();.getContext();.get(ActionContext.LOCALE);;
                getStack();.push(new TextProviderSupport(bundle, new LocaleProvider(); {
                    public Locale getLocale(); {
                        return locale;
                    }
                }););;
            }
        } catch (Exception e); {
            LogFactory.getLog(getClass(););.error("Could not find the bundle " + nameAttr, e);;
            throw new JspException("Could not find the bundle " + nameAttr);;
        }

        return EVAL_BODY_INCLUDE;
    }


TextProviderSupport.java
    public TextProviderSupport(Class clazz, LocaleProvider provider);
    {
        this.clazz = clazz;
        localeProvider = provider;
    }

    public TextProviderSupport(ResourceBundle bundle, LocaleProvider provider);
    {
        this.bundle = bundle;
        localeProvider = provider;
    }

    public String getText(String aTextName);
    {
        if(clazz != null);
            return LocalizedTextUtil.findText(clazz, aTextName, getLocale(););;
        else
            return LocalizedTextUtil.findText(bundle, aTextName, getLocale(););;
    }


自己的改进:
MyProjectActionSupport extends ActionSupport

public String getText(String aTextName);
    {
        String text = super.getText(aTextName);;
        if (text == null || text.length(); == 0); {
            text = textProvider.getText(aTextName);;
        }
        return text;
    }

这里面的textProvider就是自己创建的,当然使用bundle创建了,灵活点都可以把这个全局的resourcebundle写到配置文件中
0 请登录后投票
   发表时间:2004-10-23  
刚才实际使用了一下,才发现<ww:text name="aaa" />调用的是getText(String aTextName, String defaultValue, List args)的方法所以改getText(String aTextName) 只对java文件有效,那么为了实现原来的想法,我又修改了一下,已测试通过


MyProjectActionSupport extends ActionSupport
    // for <ww:text name="xxx" />
    public String getText(String key, String defaultValue, List values); {
        String text = super.getText(key, defaultValue, values);;
        if (text.equals(defaultValue);); {
            text = getTextProvider();.getText(key);;
            if(values != null && text != null && text.length(); != 0 ); {
                text = MessageFormat.format(text, values.toArray(););;
            }
        }
        return text;
    }
    
    // for calling getText method in action
    public String getText(String key); {
        String text = super.getText(key);;
        if (text == null || text.length(); == 0 || text.equals(key);); {
            text = getTextProvider();.getText(key);;
        }
        return text;
    }

    // get my bundle, you should have yours
    private ResourceBundle getBundle(); {
        if (bundle == null); {
            bundle = LocalizedTextUtil.findResourceBundle(CaryoSetup.getInstance();.getProperty(
                    "default.i18n.filename");, getLocale(););;
        }
        return bundle;
    }

    private TextProvider getTextProvider(); {
        if (textProvider == null); {
            textProvider = new TextProviderSupport(getBundle();, new LocaleProvider(); {
                public Locale getLocale(); {
                    return CaryoSetup.getInstance();.getLocale();;
                }
            });;
        }
        return textProvider;
    }

    private static ResourceBundle bundle;

    private static transient TextProvider textProvider;
0 请登录后投票
   发表时间:2004-10-25  
刚看了ww代码,太古怪了

资源文件在action里是用class,在tag里用bundle,so strange!
0 请登录后投票
   发表时间:2004-10-25  
youcai 写道
还没有用ww。
但是对于ognl,如果getText()这个方法存在,且返回的是map,那么text('user_name')这个用法是正确的。
而getText则相当于直接调用一个带参数的方法了,它返回的一般直接是string了。


text('user_name')不正确吧

    public void test2(); {
        OgnlValueStack stack = new OgnlValueStack();;
        stack.push(this);;
        System.out.println("text('1'); = " + stack.findValue("text('1');"););;
        System.out.println("getText('1'); = " + stack.findValue("getText('1');"););;
        System.out.println("text = " + stack.findValue("text"););;
        System.out.println("text(); = " + stack.findValue("text();"););;
        System.out.println("getText(); = " + stack.findValue("getText();"););;
    }

    public String getText(String name); {
        return "带参数的返回值";
    }

    public String getText();{
        return "不带参数的返回值";
    }


运行test2后,返回结果为:

text('1'); = null
getText('1'); = 带参数的返回值
text = 不带参数的返回值
text(); = null
getText(); = 不带参数的返回值
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics