- 浏览: 116141 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
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 2812EWeb4J 是一个基于 Servlet/Jdbc 构建的轻量 ... -
EWeb4J-SolidBase 发布新版本
2012-07-08 12:41 2124SolidBase项目是采用 DWZ + EWeb4J 开发的 ... -
EWeb4J 框架迁移到 GitHub
2012-07-05 10:02 1884EWeb4J 框架: https://github.com/ ... -
发布一个EWeb4J-1.9的Demo
2012-07-04 16:38 26EWeb4J-1.9框架发布在即,在此之前,发布一个小Demo ... -
EWeb4J-1.9-文件上传下载和生成建表脚本
2012-06-09 12:11 2299毕业了。高兴一下,哈。 一直以来,eweb4j framew ... -
SolidBase 二次开发 GIS 截图
2012-05-07 16:12 1907有位大哥哥使用 EWeb4J 的项目 SolidBase 作为 ... -
EWeb4J 国际化支持出炉啦(有源码看)
2012-05-06 15:31 2045很荣幸也很开心地公布,EWeb4J 支持国际化了。并且有着它独 ... -
解决Dojo的Widget在创建ArcGIS的Map对象时出现ID已被Registered的错误
2012-04-25 19:23 3137今天在用Dojo的toolkit(Dijits)创建ArcGI ... -
eweb4j在线演示程序更新
2012-04-25 09:25 2091访问地址:SolidBase 增加菜单显示权限 ... -
EWeb4J-1.9-控制器更新
2012-04-13 16:56 1441主要增加以下更新: 验证器 声明式事务 7个默认Acti ... -
eweb4j-1.9-支持ActiveRecord模式
2012-04-06 20:46 1616@Entity @Table(name="t_ ... -
(不断更新)EWeb4J-1.9-SNAPSHOT最近进程
2012-03-28 23:33 1812经过奋战,终于有个稳定点的SNAPSHOT版本咯。 较之上个 ... -
eweb4j演示项目-SolidBase增加对菜单显隐的权限控制
2012-03-28 14:41 1897昨晚捣鼓到两点多才弄好,今天整理了下,大概把菜单权限控制做好了 ... -
(下篇)单例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 4432PS:真正要发布到Maven中央库中是首先需要到https:/ ... -
EWeb4J-1.8.6 发布,同时带来一个演示项目
2012-03-08 17:44 2986距离上次1.7的发布已经过去5个月了。首先值得高兴的是EW ... -
推荐一个不错的在线“画”时序图的软件(通过文字生成图片)
2012-02-26 21:00 15670首先看看效果吧: 还有很多其他的风格可以选择。例如 VS ... -
eweb4j加进到Maven中央仓库啦,先发个快照版
2012-02-25 23:54 1691挺开心的。 先是注册好了 eweb4j.org。 然后是sv ...
相关推荐
这个“playframework中文教程.zip”压缩包很可能是为了帮助中文用户更好地理解和学习Play Framework而准备的资源。 Play Framework 的主要特点包括: 1. **轻量级**:与传统的Java EE规范相比,Play Framework ...
9. **国际化与本地化**:Play提供了一套强大的i18n(国际化)和l10n(本地化)机制,允许你轻松地处理多语言内容。 10. **模块化设计**:Play允许你通过模块(Plugins)来扩展其功能,例如,你可以添加对WebSocket...
为了支持国际化的错误消息,PlayFramework遵循Java的国际化惯例,错误消息可以从消息包(message bundle)中获取,其中包含的key可以指向一个消息包中的条目,使得错误消息可以针对不同的语言进行翻译。 在Play...
- **国际化支持**:为了满足全球化的市场需求,Play Framework 提供了强大的国际化工具。书中会介绍如何为应用程序添加多语言支持。 #### 三、实践技巧与策略 - **单元测试与集成测试**:高质量的应用离不开完善的...
7. **国际化与本地化**: 多语言支持是许多应用程序的需求。Play-Utils 可能增强了 Play 的 I18N 功能,使多语言切换更为简便。 8. **邮件服务**: 对于发送通知或验证邮件的需求,Play-Utils 可能封装了邮件发送...
9. **国际化与本地化**:Play 提供了强大的i18n(国际化)和l10n(本地化)功能,使得应用程序能轻松适应不同语言和文化环境。 10. **版本管理**:Play Framework 支持Scala和Java,两者可以混用。它使用 sbt ...
6. **国际化与多语言支持**: - **消息资源文件**:通过定制化的消息资源文件来实现不同语言的界面展示。 - **日期时间格式化**:支持不同地区的日期时间和货币格式。 #### 四、Play Framework 实战经验分享 - *...
9. **国际化(Internationalization, i18n)**:Play支持多语言应用,可以通过配置文件管理不同语言的文本资源。 10. **安全(Security)**:Play提供了基本的身份验证和授权机制,如`play-authenticate`插件,可以实现...
8. **国际化与本地化**:Play框架支持多语言环境,通过`conf/messages`文件可以设置不同语言的文本,代码中可能会使用`MessagesApi`来获取对应语言的消息。 9. **安全与身份验证**:Play框架提供了基础的安全组件,...
在这个“playframework做的demo”项目中,我们可以深入探讨Play Framework的一些核心特性,以及如何利用它来构建一个博客系统。 1. **路由(Routes)**:在Play Framework中,路由文件定义了URL模式到控制器方法的...
9. **国际化与本地化**:Play框架支持多语言,可以通过配置文件轻松实现内容的国际化和本地化。 10. **RESTful风格**:Play鼓励开发者使用RESTful架构设计Web服务,便于构建可扩展的、分布式的Web应用程序。 在...
PlayFramework是一个广受欢迎的开源Java Web开发框架,它以其简洁、高效的特性深受开发者喜爱。该框架采用模型-视图-控制器(MVC)架构模式,旨在简化Web应用程序的开发过程,提高开发效率,并且支持敏捷开发。在...
在分析源码的过程中,我们还可以发现Play对WebSocket、RESTful API、国际化(i18n)、静态资源处理等方面的处理方式,这些都是现代Web应用开发中不可或缺的部分。通过阅读`content来自存起来软件站...
7. **国际化支持**:Play框架支持多语言,可以轻松实现应用的国际化。 在描述中提到的“审批”功能,意味着该OA系统可能包含工作流管理和审批流程的实现。这通常涉及到以下方面: 1. **工作流引擎**:系统可能使用...
4. **国际化**:通过配置多语言资源文件,轻松实现应用的国际化支持。 5. **性能优化**:利用缓存策略、压缩技术等手段提升应用性能。 6. **部署**:Play! Framework 支持多种部署方式,包括本地服务器、云服务提供...
8. **国际化与本地化**:介绍如何在Play应用中实现多语言支持,以及时间、货币等的本地化处理。 9. **性能优化与部署**:讨论如何优化Play应用的性能,包括缓存策略、压缩响应、负载均衡等,以及如何将应用部署到...
8. **国际化与本地化**:Play支持多语言,提供了i18n服务,可以轻松地切换不同地区的语言资源。 9. **插件系统**:Play有许多社区开发的插件,如Ebean ORM、Anorm SQL库等,可以快速集成到项目中,增强功能。 10. ...
标题"scaleua:Scala和Play Framework的一个简单的类似于gettext的国际化(aka i18n)库"表明这是一个专为Scala和Play Framework设计的轻量级国际化库,灵感来源于gettext工具,用于处理应用程序中的多语言支持。...
12. Internationalization国际化支持 - 96 - 仅使用 UTF-8! - 96 - 国际化你的信息 - 96 - 通过应用程序定义支持的语言 - 96 - 依照你的区域定义日期格式 - 97 - 找回区域信息 - 97 - Message arguments - 97 - 模板...
- 支持多语言应用,实现文本的国际化。 ##### 13. 应用Global对象 - **应用全局设置** - 可以定义全局的行为和配置。 - **拦截请求** - 在请求到达控制器之前进行预处理。 ##### 14. 测试应用程序 - **编写...