- 浏览: 113779 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
czqjay:
news/index/{pageNum}/{author} { ...
来谈谈REST、RBAC下的URL权限控制 -
csumck:
这也有一个在线时序图工具 http://echoma.git ...
推荐一个不错的在线“画”时序图的软件(通过文字生成图片) -
cpop:
...
如何将自己的jar包Release到Maven中央仓库中 -
yangzai911:
如果 accept-language中有值,那么也是默认取第一 ...
Play framework 国际化 -
wangyong8861850:
[color=darkred][/color][size=x- ...
EWeb4J 1.9.1 新版本发布 基于Servlet/JDBC的轻量级web开发框架
Play的国际化操作还是非常简单的。大概分为四步:
1. 首先在${project_home}/conf/application.conf中定义你要用到的哪些国际化语言
2. 在${project_home}/conf/下新建两个 message 文件,后缀名跟上面定义的语言一样。
message.en
message.zh
3. 在模板文件里调用这些message
4. 在你的程序启动的时候进行国际化的设置(如果不设置,Play框架会有一套自己的解决方案)
PS:启动程序之后,你可以在页面上写一个改变国际化语言的按钮,后台处理的时候也是调用这个 Lang.set(locale).
我们来看看Play.Lang类的源代码
不难看出,Play在获取国际化设置的时候大概是这么处理的:
1.首先从 ThreadLocal 中获取,这个地方是由开发者在代码手动 set 的,也就是 Lang.set("zh")这样的。
2.如果 ThreadLocal 没有,则框架会自己去尝试解决,首先会从 Cookie 中获取,如果没有就从 HTTP 请求中获取 Header 的 accept-language 。如果还没有,那么就会去做一个默认的设置。默认的设置规则是:如果 application.conf 有定义的话,那么取第一个,如果没有,那么设置为空字符串“”。
以上的整个过程仅是我个人见解,欢迎指正:)
PS:eweb4j也马上要支持国际化啦。
application.langs=en,zh
message.en message.zh
message.en
welcome = Welcome to China
message.zh
welcome = 欢迎来到中国
<h1>&{welcome}</h1>
Lang.set("zh")//设置为中文
PS:启动程序之后,你可以在页面上写一个改变国际化语言的按钮,后台处理的时候也是调用这个 Lang.set(locale).
package play.i18n; import java.util.Locale; import play.Logger; import play.Play; import play.mvc.Http; import play.mvc.Http.Request; import play.mvc.Http.Response; /** * Language support */ public class Lang { public static ThreadLocal<String> current = new ThreadLocal<String>(); /** * Retrieve the current language or null * @return The current language (fr, ja, it ...) or null */ public static String get() { String locale = current.get(); if (locale == null) { // don't have current locale for this request - must try to resolve it Http.Request currentRequest = Http.Request.current(); if (currentRequest!=null) { // we have a current request - lets try to resolve language from it resolvefrom( currentRequest ); } else { // don't have current request - just use default setDefaultLocale(); } // get the picked locale locale = current.get(); } return locale; } /** * Force the current language * @param locale (fr, ja, it ...) * @return false if the language is not supported by the application */ public static boolean set(String locale) { if (locale.equals("") || Play.langs.contains(locale)) { current.set(locale); return true; } else { Logger.warn("Locale %s is not defined in your application.conf", locale); return false; } } /** * Clears the current language - This wil trigger resolving language from request * if not manually set. */ public static void clear() { current.remove(); } /** * Change language for next requests * @param locale (fr, ja, it ...) */ public static void change(String locale) { if (set(locale)) { Response.current().setCookie(Play.configuration.getProperty("application.lang.cookie", "PLAY_LANG"), locale); } } /** * Guess the language for current request in the following order: * [list=1] * [*]if a <b>PLAY_LANG</b> cookie is set, use this value * [*]if <b>Accept-Language</b> header is set, use it only if the Play! application allows it.<br/>supported language may be defined in application configuration, eg : [i]play.langs=fr,en,de)[/i] * <li>otherwise, server's locale language is assumed * [/list] * @param request */ private static void resolvefrom(Request request) { // Check a cookie String cn = Play.configuration.getProperty("application.lang.cookie", "PLAY_LANG"); if (request.cookies.containsKey(cn)) { String localeFromCookie = request.cookies.get(cn).value; if (localeFromCookie != null && localeFromCookie.trim().length()>0) { if (set(localeFromCookie)) { // we're using locale from cookie return; } // could not use locale from cookie - clear the locale-cookie Response.current().setCookie(cn, ""); } } // Try from accept-language - look for an exact match for (String a: request.acceptLanguage()) { a = a.replace("-", "_").toLowerCase(); for (String locale: Play.langs) { if (locale.toLowerCase().equals(a)) { set(locale); return; } } } // now see if we have a country-only match for (String a: request.acceptLanguage()) { if (a.indexOf("-") > 0) { a = a.substring(0, a.indexOf("-")); } for (String locale: Play.langs) { if (locale.equals(a)) { set(locale); return; } } } // Use default setDefaultLocale(); } public static void setDefaultLocale() { if (Play.langs.isEmpty()) { set(""); } else { set(Play.langs.get(0)); } } /** * * @return the default locale if the Locale cannot be found otherwise the locale * associated to the current Lang. */ public static Locale getLocale() { String lang = get(); Locale locale = getLocale(lang); if (locale != null) { return locale; } return Locale.getDefault(); } public static Locale getLocale(String lang) { for (Locale locale : Locale.getAvailableLocales()) { if (locale.getLanguage().equals(lang)) { return locale; } } return null; } }
不难看出,Play在获取国际化设置的时候大概是这么处理的:
1.首先从 ThreadLocal 中获取,这个地方是由开发者在代码手动 set 的,也就是 Lang.set("zh")这样的。
2.如果 ThreadLocal 没有,则框架会自己去尝试解决,首先会从 Cookie 中获取,如果没有就从 HTTP 请求中获取 Header 的 accept-language 。如果还没有,那么就会去做一个默认的设置。默认的设置规则是:如果 application.conf 有定义的话,那么取第一个,如果没有,那么设置为空字符串“”。
以上的整个过程仅是我个人见解,欢迎指正:)
PS:eweb4j也马上要支持国际化啦。
评论
3 楼
yangzai911
2013-12-09
如果 accept-language中有值,那么也是默认取第一个么?
2 楼
kelepingzi
2012-05-03
,期待,速度真快。快跟不上了
1 楼
明心Xin
2012-05-03
发表评论
-
EWeb4J 1.9.1 新版本发布 基于Servlet/JDBC的轻量级web开发框架
2012-11-28 22:08 2694EWeb4J 是一个基于 Servlet/Jdbc 构建的轻量 ... -
EWeb4J-SolidBase 发布新版本
2012-07-08 12:41 2079SolidBase项目是采用 DWZ + EWeb4J 开发的 ... -
EWeb4J 框架迁移到 GitHub
2012-07-05 10:02 1838EWeb4J 框架: https://github.com/ ... -
发布一个EWeb4J-1.9的Demo
2012-07-04 16:38 26EWeb4J-1.9框架发布在即,在此之前,发布一个小Demo ... -
EWeb4J-1.9-文件上传下载和生成建表脚本
2012-06-09 12:11 2251毕业了。高兴一下,哈。 一直以来,eweb4j framew ... -
SolidBase 二次开发 GIS 截图
2012-05-07 16:12 1841有位大哥哥使用 EWeb4J 的项目 SolidBase 作为 ... -
EWeb4J 国际化支持出炉啦(有源码看)
2012-05-06 15:31 1991很荣幸也很开心地公布,EWeb4J 支持国际化了。并且有着它独 ... -
解决Dojo的Widget在创建ArcGIS的Map对象时出现ID已被Registered的错误
2012-04-25 19:23 3040今天在用Dojo的toolkit(Dijits)创建ArcGI ... -
eweb4j在线演示程序更新
2012-04-25 09:25 2040访问地址:SolidBase 增加菜单显示权限 ... -
EWeb4J-1.9-控制器更新
2012-04-13 16:56 1411主要增加以下更新: 验证器 声明式事务 7个默认Acti ... -
eweb4j-1.9-支持ActiveRecord模式
2012-04-06 20:46 1547@Entity @Table(name="t_ ... -
(不断更新)EWeb4J-1.9-SNAPSHOT最近进程
2012-03-28 23:33 1752经过奋战,终于有个稳定点的SNAPSHOT版本咯。 较之上个 ... -
eweb4j演示项目-SolidBase增加对菜单显隐的权限控制
2012-03-28 14:41 1849昨晚捣鼓到两点多才弄好,今天整理了下,大概把菜单权限控制做好了 ... -
(下篇)单例POJO实现CRUD+分页+搜索Demo
2012-03-23 23:14 2本篇程序特点: POJO式的控制器,无需继承、无需实 ... -
体验快速开发2:单例POJO实现CRUD+分页+搜索Demo
2012-03-23 22:54 29程序特点: POJO式的控制器,无需继承、无需实现接 ... -
体验快速开发:只有一个控制类实现的CRUD+分页+搜索Demo
2012-03-22 22:17 182╮(╯▽╰)╭,本来不想谈什么快速开发的,但是最近老是有人拿什 ... -
如何将自己的jar包Release到Maven中央仓库中
2012-03-20 17:17 4367PS:真正要发布到Maven中央库中是首先需要到https:/ ... -
EWeb4J-1.8.6 发布,同时带来一个演示项目
2012-03-08 17:44 2944距离上次1.7的发布已经过去5个月了。首先值得高兴的是EW ... -
推荐一个不错的在线“画”时序图的软件(通过文字生成图片)
2012-02-26 21:00 15590首先看看效果吧: 还有很多其他的风格可以选择。例如 VS ... -
eweb4j加进到Maven中央仓库啦,先发个快照版
2012-02-25 23:54 1640挺开心的。 先是注册好了 eweb4j.org。 然后是sv ...
相关推荐
play framework api,play! framework api,play api
Play Framework Cookbook.pdf
playframework javaweb playframework javaweb
1. Play Framework 介绍 2. 创建和发布 Play 应用 2.1 创建 Play 的工程 2.2 Play 常用指令 2.3 Play 应用的 JVM 调优 3. 如何读取静态资源 4. Play框架的配置文件 5. 使用 Play 框架开发 Java 应用 5.1 HTTP...
Play Framework最新教程(12年),play框架教程
Playframework 1.2.7 sdk zip包
Mastering Play Framework for Scala
Play framework框架
play framework2.01上半部分。
PlayFramework框架验证.pdf
Play Framework Cookbook
通过简单的代码和思路写了play framework的简单的小例子,包括添加页面进行的routes配置,页面跳转,页面之间的数据传递等方面。暂时未使用h2内置数据库及ArrayList、HashMap在页面之间的数据传递。
Play Framework Essentials 英文原版,学习 play 框架的最佳入门。
Leverage the awesome features of Play Framework to build scalable, resilient, and responsive applications First published: May 2015 274page
PlayFramework框架安全模块.pdf
12. Internationalization国际化支持 - 96 - 仅使用 UTF-8! - 96 - 国际化你的信息 - 96 - 通过应用程序定义支持的语言 - 96 - 依照你的区域定义日期格式 - 97 - 找回区域信息 - 97 - Message arguments - 97 - 模板...
Play框架肩负了臃肿的企业级java ee规范,易restful为目标专注于开发效率,是java敏捷开发的最佳参考方案
playframework,play! 书中范例代码下载地址: https://github.com/spinscale/play-cookbook 292 pages Publisher: Packt Publishing (September 4, 2011) Language: English ISBN-10: 1849515522 ISBN-13: 978-...
Play-Utils 是一个专门为 Play Framework 开发的实用工具包模块
play2-war-plugin, 用于 Play Framework 2.x的WAR插件 用于 Play Framework 2.x的 WAR插件Current versions: Play 2.2.x : 1.2.1 Play 2.3.0 -> 2.3.1 : 1.3-beta1 (Scala 2.1