`
sinokaka
  • 浏览: 320328 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Locale存放的争执

阅读更多

         今天和经理争执了半天,主要就是关于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看看大家得意见,我也想听听大家得意见,因为经理说服不了我。看看自己到底是固执,还是认识有些狭隘。希望大家不要惜言。

分享到:
评论
20 楼 sinokaka 2007-02-12  
:)呵呵,说得有些道理,自己努力成为经理
19 楼 ahau205109 2007-02-12  
不妨再加入第3种方式
对这种情形,我觉得你们建数据模型的时候,就应该有用户的Locale对应物理表;至于实际应用中到底是取cookie,request,还是table,我觉得你们要定义一个规则;
没有绝对的事情,没有规矩不成方圆; 我觉得没有必要为个小问题斤斤计较;头想怎么做,就顺着他意思好了; 等你自己到那个位置,你来说得算;

18 楼 sinokaka 2007-02-12  
quaff     22 小时前
引用

sinokaka 写道
感觉大家还是没有看懂我问的,可能是我写的不是很清楚,我不是问如何取得客户端的Locale,而是问那种处理方式比较妥当一些

getLocales()
把指定的Locale设置为默认的放第一位,浏览器原有的Locale放第二


恩,你这么说,我有些同意。感觉有些合理一些。但也是要写注释说明一下了。
17 楼 quaff 2007-02-11  
sinokaka 写道
感觉大家还是没有看懂我问的,可能是我写的不是很清楚,我不是问如何取得客户端的Locale,而是问那种处理方式比较妥当一些

getLocales()
把指定的Locale设置为默认的放第一位,浏览器原有的Locale放第二
16 楼 sinokaka 2007-02-10  
引用

ihongye     23 小时前
1.开发人员不用知道新的方法
2.你说的需要还没出现,就算出现也有解决办法
基于上面理由选覆盖。


1:开发人员知道我说的新方法,因为队伍比较小
2:需求是没有出现,但是总是担心如果人员发生变动,这个会不会成为隐讳得地方
15 楼 nihongye 2007-02-09  
1.开发人员不用知道新的方法
2.你说的需要还没出现,就算出现也有解决办法
基于上面理由选覆盖。
14 楼 sinokaka 2007-02-09  
感觉大家还是没有看懂我问的,可能是我写的不是很清楚,我不是问如何取得客户端的Locale,而是问那种处理方式比较妥当一些
13 楼 codeutil 2007-02-07  
request.getheader("Accept-Language");

eg: Accept-Language: zh-cn,zh;q=0.5




quaff 写道
sinokaka 写道
也就是说大家都比较同意把Request里面的对象改变,而不是通过提供方法来获取,可是没有人觉得这样改变了一个request对象,有些不太妥当吗?如果后面的人真有要用到request里面原有的Locale时,要怎么做呢?

public Enumeration getLocales()
12 楼 quaff 2007-02-07  
sinokaka 写道
也就是说大家都比较同意把Request里面的对象改变,而不是通过提供方法来获取,可是没有人觉得这样改变了一个request对象,有些不太妥当吗?如果后面的人真有要用到request里面原有的Locale时,要怎么做呢?

public Enumeration getLocales()
11 楼 sinokaka 2007-02-07  
也就是说大家都比较同意把Request里面的对象改变,而不是通过提供方法来获取,可是没有人觉得这样改变了一个request对象,有些不太妥当吗?如果后面的人真有要用到request里面原有的Locale时,要怎么做呢?
10 楼 quaff 2007-02-06  
sinokaka 写道
引用

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



是的,我就是用Cookie操作得,可是从Cookie中获得Locale和Request里面得Locale是不一样得,Request.getLocale获得是用户本机语言得Locale。所以我强求大家调用我的方法获得Locale,而不能调用Request获得Locale得,并没有复杂化

上面有人给出了一个filter,在这个filter里面取得cookie的locale,然后包装request对象,acegi对request.isUserInRole(String role) 就是这么做的
9 楼 sinokaka 2007-02-05  
引用

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



是的,我就是用Cookie操作得,可是从Cookie中获得Locale和Request里面得Locale是不一样得,Request.getLocale获得是用户本机语言得Locale。所以我强求大家调用我的方法获得Locale,而不能调用Request获得Locale得,并没有复杂化
8 楼 jianfeng008cn 2007-02-05  
标准的本地化就是根据request.getlocal来处理的(webwork的i118大致也是这样),
如果是你们自己的东西也应该向标准靠齐,
按照标准是不能自己在页面上选择语言的,
如果有这样的需求我觉得处理的最好方式就是使用cookie,
因为这样处理不会影响server端任何的编码,
不违背i118的“本来面目”,
简单问题何必复杂化呢?
个人看法
7 楼 LucasLee 2007-02-05  
sinokaka 写道
我不是需要实现方法,只是想看看我们的思路到底是应该如何做,是否应该把Request里面得Locale修改,还是应该强制大家通过我提供得方法来做


我觉得,还是后者更合适。
6 楼 sinokaka 2007-02-04  
我不是需要实现方法,只是想看看我们的思路到底是应该如何做,是否应该把Request里面得Locale修改,还是应该强制大家通过我提供得方法来做
5 楼 LucasLee 2007-02-04  
自己的Locale类倒不一定需要实现,无非需要一个util方法,获得当前的Locale设置。
在Struts里已经有这样的util了。名称大约是RequestUtils.getLocale(),内部实现就是检查几个变量,先看Session里Locale变量,如没有设置,则看Request.getLocale().
4 楼 codeutil 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;
  }
3 楼 sinokaka 2007-02-03  
谢谢你,我更改了一下我写得。这样问题描述也就更加清晰一些了
2 楼 sinokaka 2007-02-03  
你说的很对,就是因为有别人使用了request得getLocale得方法,所以导致程序出现Bug,我想了一个方法,就是自己实现一个Locale类,这样所以翻译得地方都需要使用自定义得Locale这样就会防止了别人使用不当得问题,但是经理建议改request方法。现在不是项目末期。
1 楼 歆渊 2007-02-03  
Request.getLocale() 得到的是浏览器设置的语言, 就像我虽然是中文版的XP, 但是习惯把Opera的语言设成英文的. Spring用Cookie处理locale的方式, 我没用过, 不过想来应该是可以让浏览者在页面上点击切换的. 其实都是使用者作主选择的, 用它覆盖掉request的locale我觉得目标和手段上没什么不妥. 不过技术上可能显得拖沓一点.

另外其实引起这个争执有一个隐含的原因, 就是程序其它部分没有标准的获取Locale的途径, 可能用request的也有, 用你提供的方法(从session获得)的也有. 如果这个问题不解决, 就不可能得出一个你和你经理都觉得完美的方案. 因为如果其它程序都会用你的session方法, 你的经理也用不着要求去覆盖request; 如果其它程序都用request的locale, 你也就根本不会想去自己实现一个基于session的方法.

相关推荐

    C语言头文件 LOCALE.H

    C语言头文件 LOCALE.HC语言头文件 LOCALE.HC语言头文件 LOCALE.HC语言头文件 LOCALE.HC语言头文件 LOCALE.HC语言头文件 LOCALE.HC语言头文件 LOCALE.HC语言头文件 LOCALE.HC语言头文件 LOCALE.HC语言头文件 LOCALE....

    Locale详解

    Locale详解Locale详解Locale详解Locale详解

    locale-archive 和 locale-archive.tmpl

    locale-archive 和 locale-archive.tmpl 里面保存了这两个文件。这个是位于Linux系统 /usr/lib/locale 文件夹下的。 里面保存了比较全的字符集。

    Locale

    java.util.Locale

    Laravel开发-locale

    Laravel开发-locale Laravel 5本地化包

    Locale.Emulator.2.4.0.0

    官网搬的Locale.Emulator,地址http://pooi.moe/Locale-Emulator/,GIT地址https://github.com/xupefei/Locale-Emulator非常简洁好用的转区工具希望大家能关注一下

    linux中locale自用总结

    linux中locale自用总结 locale是根据计算机用户所使用的语言、所在国家或者地区、以及当地的文化传统所定义的一个软件运行时的语言环境。

    测试locale的java代码

    这是一个可运行的小例子,测试locale的java代码

    Laravel开发-laravel-locale

    Laravel开发-laravel-locale Laravel 5强大的本地化功能

    Locale Emulator 2.2.1.0

    Locale Emulator 可以提供类似 NTLEA 和 AppLocale 的转区功能,为访问github不便的人上传至csdn。访问github无碍的请戳 https://github.com/xupefei/Locale-Emulator/releases,

    C语言头文件 XLOCALE

    C语言头文件 XLOCALEC语言头文件 XLOCALEC语言头文件 XLOCALEC语言头文件 XLOCALEC语言头文件 XLOCALEC语言头文件 XLOCALEC语言头文件 XLOCALEC语言头文件 XLOCALEC语言头文件 XLOCALEC语言头文件 XLOCALEC语言...

    Apps.Locale.resources.dll

    Apps.Locale.resources.dll

    locale.properties,SciTE汉化文件

    SciTE汉化文件,将locale.properties文件放到SciTE目录下即可。如果提示替换,请替换之

    C语言中的locale

    C语言中的locale,使用C++标准库的iostream,可以方便地将控制台、文件、字符串以及其它可扩充的外部表示作为流来处理,但要处理中文,却会碰到很多问题。

    Laravel开发-locale-route

    Laravel开发-locale-route Laravel 5本地化的可测试路由包

    Locale.Emulator.1.2.0.1.zip

    Locale.Emulator.1.2.0.1.zip

    手机locale更改工具源代码

    自己做的更改locale工具,希望对大家有所帮助

    语言环境模拟器(locale emulator)v2.5.0.1

    语言环境模拟器(locale emulator)专门为广大玩家们打造的,当我们玩外服的游戏时候,出现的是其他国家的语言,很多人都看不懂,可以使用这款软件,将它们使用中文语言进行模拟安装或者运行,然后就可以得到中文的...

Global site tag (gtag.js) - Google Analytics