论坛首页 Java企业应用论坛

Locale存放的争执

浏览 15426 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-02-03  

         今天和经理争执了半天,主要就是关于locale的存放问题。项目使用的是Spring框架,要求多语言。页面好说,用Spring的标签库就可以了,还有一些其它的,主要是我们自己生成的Html代码等,这个时候,就需要自己翻译了。

          翻译呢,就需要Locale信息,取Locale信息就有多种方法了,我使用了Spring的Cookie,这样取Locale的时候,就不用使用Request.getLocale()方法了,因为getLocale取得是用户的本机Locale而不是用户请求的Locale,页面上有个链接选择中文版还是英文版的。这样我就需要把locale往后面传播。我在共同得Controller里面提供了一个方法用来获得Locale。

          在测试得时候,发现一个问题,就是有人没有通过我提供得方法获得Locale,直接调用得Request.getLocale方法,这样导致了翻译不正常。解决得方法,我和经理发生了分歧,我觉得所有得人必须从我提供的方法获得Locale,经理让我把Request得Locale给替换掉。这样就不会出现问题。我不同意,我宁愿新作一个自定义的Locale类,这样大家调用翻译得时候就不会传入Request.getLocale了。总觉得经理让我替换掉Request里面locale的做法,是一种隐讳的处理方式,虽然解决了问题,但是容易使后来的人产生迷惑。如果后面的人需要用到客户机Locale的时候,调用Request.getLocale的时候,就会遇到问题。

         经理觉得改变Request里面的Locale可以保证程序正确执行,而且这样做起来也比较好。

         个人觉得这样总是改变了Request.getLocale得API得含义,这样自己有些接收不了。经理就让我写这篇blog看看大家得意见,我也想听听大家得意见,因为经理说服不了我。看看自己到底是固执,还是认识有些狭隘。希望大家不要惜言。

   发表时间:2007-02-03  
Request.getLocale() 得到的是浏览器设置的语言, 就像我虽然是中文版的XP, 但是习惯把Opera的语言设成英文的. Spring用Cookie处理locale的方式, 我没用过, 不过想来应该是可以让浏览者在页面上点击切换的. 其实都是使用者作主选择的, 用它覆盖掉request的locale我觉得目标和手段上没什么不妥. 不过技术上可能显得拖沓一点.

另外其实引起这个争执有一个隐含的原因, 就是程序其它部分没有标准的获取Locale的途径, 可能用request的也有, 用你提供的方法(从session获得)的也有. 如果这个问题不解决, 就不可能得出一个你和你经理都觉得完美的方案. 因为如果其它程序都会用你的session方法, 你的经理也用不着要求去覆盖request; 如果其它程序都用request的locale, 你也就根本不会想去自己实现一个基于session的方法.
0 请登录后投票
   发表时间:2007-02-03  
你说的很对,就是因为有别人使用了request得getLocale得方法,所以导致程序出现Bug,我想了一个方法,就是自己实现一个Locale类,这样所以翻译得地方都需要使用自定义得Locale这样就会防止了别人使用不当得问题,但是经理建议改request方法。现在不是项目末期。
0 请登录后投票
   发表时间:2007-02-03  
谢谢你,我更改了一下我写得。这样问题描述也就更加清晰一些了
0 请登录后投票
   发表时间:2007-02-04  
过滤器处理:


 public void doFilter(ServletRequest request, ServletResponse response,
                       FilterChain filterChain) {
    try {
      if (request instanceof HttpServletRequest) {
        HttpServletRequest req = (HttpServletRequest) request;
        String queryString = req.getQueryString();
        if (queryString != null &&
            (queryString.indexOf("lc=") >= 0 ||
             queryString.indexOf("locale=") >= 0)) {
          String locale = request.getParameter("locale");
          if (locale == null) {
            locale = request.getParameter("lc");
          }
          if (locale != null && locale.length() > 0) {
            final Locale crtLocale = LocaleFilter.getloacle(locale,
                Locale.CHINA);
            request.setAttribute("javax.servlet.jsp.jstl.fmt.locale.request",
                                 crtLocale); //给jstl用
            request.setAttribute("org.apache.struts.action.LOCALE", crtLocale); //给Struts 用
            filterChain.doFilter(new javax.servlet.http.
                                 HttpServletRequestWrapper(req) {
              public Locale getLocale() {
                return crtLocale;
              }
            }, response);
            return;

          }
        }
      }
      filterChain.doFilter(request, response);

    }
    catch (ServletException sx) {
      filterConfig.getServletContext().log(sx.getMessage());
    }
    catch (IOException iox) {
      filterConfig.getServletContext().log(iox.getMessage());
    }
  }

  private static Locale getloacle(String lstr, Locale defaultLocale) {
    Locale locale = defaultLocale; //Locale.getDefault();
    if (lstr == null || lstr.length() < 1) {
      return locale;
    }
    try {
      StringTokenizer localeTokens = new StringTokenizer(lstr, "_");
      String lang = null;
      String country = null;
      if (localeTokens.hasMoreTokens()) {
        lang = localeTokens.nextToken();
      }
      if (localeTokens.hasMoreTokens()) {
        country = localeTokens.nextToken();
      }
      locale = new Locale(lang, country);
      Locale crtls[] = Locale.getAvailableLocales();
      for (int i = 0; i < crtls.length; i++) {
        if (crtls[i].equals(locale)) {
          return crtls[i];
        }
      }
    }
    catch (Throwable t) {
    }
    return locale;
  }
0 请登录后投票
   发表时间:2007-02-04  
自己的Locale类倒不一定需要实现,无非需要一个util方法,获得当前的Locale设置。
在Struts里已经有这样的util了。名称大约是RequestUtils.getLocale(),内部实现就是检查几个变量,先看Session里Locale变量,如没有设置,则看Request.getLocale().
0 请登录后投票
   发表时间:2007-02-04  
我不是需要实现方法,只是想看看我们的思路到底是应该如何做,是否应该把Request里面得Locale修改,还是应该强制大家通过我提供得方法来做
0 请登录后投票
   发表时间:2007-02-05  
sinokaka 写道
我不是需要实现方法,只是想看看我们的思路到底是应该如何做,是否应该把Request里面得Locale修改,还是应该强制大家通过我提供得方法来做


我觉得,还是后者更合适。
0 请登录后投票
   发表时间:2007-02-05  
标准的本地化就是根据request.getlocal来处理的(webwork的i118大致也是这样),
如果是你们自己的东西也应该向标准靠齐,
按照标准是不能自己在页面上选择语言的,
如果有这样的需求我觉得处理的最好方式就是使用cookie,
因为这样处理不会影响server端任何的编码,
不违背i118的“本来面目”,
简单问题何必复杂化呢?
个人看法
0 请登录后投票
   发表时间:2007-02-05  
引用

jianfeng008cn     2 小时前
标准的本地化就是根据request.getlocal来处理的(webwork的i118大致也是这样),
如果是你们自己的东西也应该向标准靠齐,
按照标准是不能自己在页面上选择语言的,
如果有这样的需求我觉得处理的最好方式就是使用cookie,
因为这样处理不会影响server端任何的编码,
不违背i118的“本来面目”,
简单问题何必复杂化呢?
个人看法



是的,我就是用Cookie操作得,可是从Cookie中获得Locale和Request里面得Locale是不一样得,Request.getLocale获得是用户本机语言得Locale。所以我强求大家调用我的方法获得Locale,而不能调用Request获得Locale得,并没有复杂化
0 请登录后投票
论坛首页 Java企业应用版

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