锁定老帖子 主题:Locale存放的争执
精华帖 (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看看大家得意见,我也想听听大家得意见,因为经理说服不了我。看看自己到底是固执,还是认识有些狭隘。希望大家不要惜言。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-02-03
Request.getLocale() 得到的是浏览器设置的语言, 就像我虽然是中文版的XP, 但是习惯把Opera的语言设成英文的. Spring用Cookie处理locale的方式, 我没用过, 不过想来应该是可以让浏览者在页面上点击切换的. 其实都是使用者作主选择的, 用它覆盖掉request的locale我觉得目标和手段上没什么不妥. 不过技术上可能显得拖沓一点.
另外其实引起这个争执有一个隐含的原因, 就是程序其它部分没有标准的获取Locale的途径, 可能用request的也有, 用你提供的方法(从session获得)的也有. 如果这个问题不解决, 就不可能得出一个你和你经理都觉得完美的方案. 因为如果其它程序都会用你的session方法, 你的经理也用不着要求去覆盖request; 如果其它程序都用request的locale, 你也就根本不会想去自己实现一个基于session的方法. |
|
返回顶楼 | |
发表时间:2007-02-03
你说的很对,就是因为有别人使用了request得getLocale得方法,所以导致程序出现Bug,我想了一个方法,就是自己实现一个Locale类,这样所以翻译得地方都需要使用自定义得Locale这样就会防止了别人使用不当得问题,但是经理建议改request方法。现在不是项目末期。
|
|
返回顶楼 | |
发表时间:2007-02-03
谢谢你,我更改了一下我写得。这样问题描述也就更加清晰一些了
|
|
返回顶楼 | |
发表时间: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; } |
|
返回顶楼 | |
发表时间:2007-02-04
自己的Locale类倒不一定需要实现,无非需要一个util方法,获得当前的Locale设置。
在Struts里已经有这样的util了。名称大约是RequestUtils.getLocale(),内部实现就是检查几个变量,先看Session里Locale变量,如没有设置,则看Request.getLocale(). |
|
返回顶楼 | |
发表时间:2007-02-04
我不是需要实现方法,只是想看看我们的思路到底是应该如何做,是否应该把Request里面得Locale修改,还是应该强制大家通过我提供得方法来做
|
|
返回顶楼 | |
发表时间:2007-02-05
sinokaka 写道 我不是需要实现方法,只是想看看我们的思路到底是应该如何做,是否应该把Request里面得Locale修改,还是应该强制大家通过我提供得方法来做
我觉得,还是后者更合适。 |
|
返回顶楼 | |
发表时间:2007-02-05
标准的本地化就是根据request.getlocal来处理的(webwork的i118大致也是这样),
如果是你们自己的东西也应该向标准靠齐, 按照标准是不能自己在页面上选择语言的, 如果有这样的需求我觉得处理的最好方式就是使用cookie, 因为这样处理不会影响server端任何的编码, 不违背i118的“本来面目”, 简单问题何必复杂化呢? 个人看法 |
|
返回顶楼 | |
发表时间:2007-02-05
引用 jianfeng008cn 2 小时前 标准的本地化就是根据request.getlocal来处理的(webwork的i118大致也是这样), 如果是你们自己的东西也应该向标准靠齐, 按照标准是不能自己在页面上选择语言的, 如果有这样的需求我觉得处理的最好方式就是使用cookie, 因为这样处理不会影响server端任何的编码, 不违背i118的“本来面目”, 简单问题何必复杂化呢? 个人看法 是的,我就是用Cookie操作得,可是从Cookie中获得Locale和Request里面得Locale是不一样得,Request.getLocale获得是用户本机语言得Locale。所以我强求大家调用我的方法获得Locale,而不能调用Request获得Locale得,并没有复杂化 |
|
返回顶楼 | |