`
sinokaka
  • 浏览: 326352 次
  • 性别: 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的方法.

相关推荐

    locale-archive 和 locale-archive.tmpl

    在Linux操作系统中,`locale-archive`和`locale-archive.tmpl`是两个非常关键的文件,它们与系统的国际化(Internationalization,简称i18n)和本地化(Localization,简称l10n)设置密切相关。`locale`是系统用来...

    C语言头文件 LOCALE.H

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

    Laravel开发-locale

    在Laravel框架中,"locale"是一个至关重要的概念,它涉及到应用的多语言支持和国际化。Laravel 5本地化包则是为了帮助开发者更轻松地管理和实现应用的多语言功能。接下来,我们将深入探讨Laravel中的locale机制以及...

    Locale详解

    【Locale详解】 Locale是计算机系统中的一个重要概念,它关乎到软件如何适应不同地区的语言、文化和习惯。在国际化和本土化的过程中,locale起到了桥梁的作用,确保软件可以正确地处理和显示不同区域的语言信息。 ...

    Locale.Emulator.2.3.1.1.rar

    【Locale.Emulator.2.3.1.1.rar】是一个用于解决地区限制问题的工具,主要用于帮助用户在不改变系统区域设置的情况下运行特定地域版本的应用程序或游戏。这个压缩包包含的是“Locale Emulator”软件的版本2.3.1.1。...

    linux中locale自用总结

    Linux 中 locale 自用总结 locale 是根据计算机用户所使用的语言、所在国家或者地区、以及当地的文化传统所定义的一个软件运行时的语言环境。在 Linux 中,locale 把按照所涉及到的文化传统的各个方面分成 12 个...

    Locale

    java.util.Locale

    Locale.Emulator.2.5.0.1.zip

    标题 "Locale.Emulator.2.5.0.1.zip" 指的是 Locale Emulator 的一个特定版本,这是由 Microsoft 开发的一款实用工具,旨在帮助用户在不支持特定语言环境的操作系统上运行那些需要特定区域设置的应用程序。...

    Locale.Emulator.2.4.1.0.zip

    《区域模拟器(Locale Emulator)2.4.1.0:解决跨语言软件执行难题》 在IT领域,我们经常遇到这样的问题:某些软件或游戏由于设计时针对特定地区的语言环境,导致在非目标区域的系统上无法正常运行。为了解决这一...

    Spring MVC Locale 的使用 中文 英文 等语言 切换

    在Spring MVC框架中,`Locale`是用来处理应用程序中的多语言支持的关键组件。它定义了用户的语言和地区设置,例如中文(zh_CN)或英文(en_US)。这篇博客文章将深入探讨如何在Spring MVC应用中实现语言切换功能,以...

    Locale.Emulator.2.4.0.0

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

    fileinput_locale_zh.js

    `locale_zh`部分则表明这个版本是针对中文用户的,意味着它可能包含了中文语言包,以提供符合中文用户习惯的界面和提示信息。 Bootstrap是一款流行的开源前端开发框架,它提供了一套美观的响应式布局和组件,使得...

    Locale.Emulator.1.2.0.1.zip

    【Locale.Emulator.1.2.0.1.zip】是一个软件压缩包,其中包含的“Locale Emulator”是一款用于Windows系统的工具,旨在帮助用户在不改变系统全局区域设置的情况下,运行那些要求特定地区设置的应用程序。这个工具...

    Laravel开发-laravel-locale

    在Laravel框架中,`laravel-locale`是一个用于实现多语言功能的重要组件。这个项目主要是为了帮助开发者在他们的Laravel-5应用中构建全球化、多语言支持的网站。下面我们将详细探讨`laravel-locale`的核心概念和使用...

    Locale.Emulator.2.1.0.0

    Locale Emulator 是运行在 Windows 7 和 Windows 8/8.1 和WIN10系统下的一个软件,可以提供类似 NTLEA 和 AppLocale 的转区功能:即将系统区域设置(包括语言,时区,代码页等)虚拟为目标系统(例如日本区域)。...

    grid.locale-cn.rar

    首先,我们需要理解locale(本地化)在软件开发中的概念。本地化是指根据用户所在地区或语言环境调整软件的显示,使其更加符合用户的使用习惯。grid.locale-cn.js就是jqGrid针对中文环境的本地化文件,它包含了所有...

    grid.locale-cn.js

    《Jqgrid中文本地化文件grid.locale-cn.js详解》 Jqgrid是一款广泛应用于Web开发中的强大表格插件,它提供了丰富的数据展示、编辑、排序、分页等功能,深受开发者喜爱。在Jqgrid的使用过程中,为了实现中文界面,就...

    测试locale的java代码

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

Global site tag (gtag.js) - Google Analytics