`

Play framework 国际化

阅读更多
Play的国际化操作还是非常简单的。大概分为四步:

  • 1. 首先在${project_home}/conf/application.conf中定义你要用到的哪些国际化语言
  • application.langs=en,zh
    

  • 2. 在${project_home}/conf/下新建两个 message 文件,后缀名跟上面定义的语言一样。
  • message.en
    message.zh
    


      message.en
    welcome = Welcome to China
    

      message.zh
    welcome = 欢迎来到中国
    

  • 3. 在模板文件里调用这些message
  • <h1>&{welcome}</h1>
    

  • 4. 在你的程序启动的时候进行国际化的设置(如果不设置,Play框架会有一套自己的解决方案)
  • Lang.set("zh")//设置为中文
    


    PS:启动程序之后,你可以在页面上写一个改变国际化语言的按钮,后台处理的时候也是调用这个 Lang.set(locale).

  • 我们来看看Play.Lang类的源代码
  • 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也马上要支持国际化啦。
    1
    1
    分享到:
    评论
    3 楼 yangzai911 2013-12-09  
    如果 accept-language中有值,那么也是默认取第一个么?
    2 楼 kelepingzi 2012-05-03  
    ,期待,速度真快。快跟不上了
    1 楼 明心Xin 2012-05-03  

    相关推荐

      playframework中文教程.zip

      这个“playframework中文教程.zip”压缩包很可能是为了帮助中文用户更好地理解和学习Play Framework而准备的资源。 Play Framework 的主要特点包括: 1. **轻量级**:与传统的Java EE规范相比,Play Framework ...

      Play Framework2本教程

      9. **国际化与本地化**:Play提供了一套强大的i18n(国际化)和l10n(本地化)机制,允许你轻松地处理多语言内容。 10. **模块化设计**:Play允许你通过模块(Plugins)来扩展其功能,例如,你可以添加对WebSocket...

      PlayFramework框架验证.pdf

      为了支持国际化的错误消息,PlayFramework遵循Java的国际化惯例,错误消息可以从消息包(message bundle)中获取,其中包含的key可以指向一个消息包中的条目,使得错误消息可以针对不同的语言进行翻译。 在Play...

      Play Framework Cookbook

      - **国际化支持**:为了满足全球化的市场需求,Play Framework 提供了强大的国际化工具。书中会介绍如何为应用程序添加多语言支持。 #### 三、实践技巧与策略 - **单元测试与集成测试**:高质量的应用离不开完善的...

      Play-Utils是一个专门为PlayFramework开发的实用工具包模块

      7. **国际化与本地化**: 多语言支持是许多应用程序的需求。Play-Utils 可能增强了 Play 的 I18N 功能,使多语言切换更为简便。 8. **邮件服务**: 对于发送通知或验证邮件的需求,Play-Utils 可能封装了邮件发送...

      playframework学习资料

      9. **国际化与本地化**:Play 提供了强大的i18n(国际化)和l10n(本地化)功能,使得应用程序能轻松适应不同语言和文化环境。 10. **版本管理**:Play Framework 支持Scala和Java,两者可以混用。它使用 sbt ...

      Play Framework Cookbook.pdf

      6. **国际化与多语言支持**: - **消息资源文件**:通过定制化的消息资源文件来实现不同语言的界面展示。 - **日期时间格式化**:支持不同地区的日期时间和货币格式。 #### 四、Play Framework 实战经验分享 - *...

      play framework 学生信息管理系统

      9. **国际化(Internationalization, i18n)**:Play支持多语言应用,可以通过配置文件管理不同语言的文本资源。 10. **安全(Security)**:Play提供了基本的身份验证和授权机制,如`play-authenticate`插件,可以实现...

      Play Framework Cookbook 代码

      8. **国际化与本地化**:Play框架支持多语言环境,通过`conf/messages`文件可以设置不同语言的文本,代码中可能会使用`MessagesApi`来获取对应语言的消息。 9. **安全与身份验证**:Play框架提供了基础的安全组件,...

      playframework做的demo

      在这个“playframework做的demo”项目中,我们可以深入探讨Play Framework的一些核心特性,以及如何利用它来构建一个博客系统。 1. **路由(Routes)**:在Play Framework中,路由文件定义了URL模式到控制器方法的...

      Playframework 1.2.7 sdk zip包 play1.2.7.zip

      9. **国际化与本地化**:Play框架支持多语言,可以通过配置文件轻松实现内容的国际化和本地化。 10. **RESTful风格**:Play鼓励开发者使用RESTful架构设计Web服务,便于构建可扩展的、分布式的Web应用程序。 在...

      PlayFramework应用框架

      PlayFramework是一个广受欢迎的开源Java Web开发框架,它以其简洁、高效的特性深受开发者喜爱。该框架采用模型-视图-控制器(MVC)架构模式,旨在简化Web应用程序的开发过程,提高开发效率,并且支持敏捷开发。在...

      Play Framework应用程序框架 v2.7.9-源码.zip

      在分析源码的过程中,我们还可以发现Play对WebSocket、RESTful API、国际化(i18n)、静态资源处理等方面的处理方式,这些都是现代Web应用开发中不可或缺的部分。通过阅读`content来自存起来软件站...

      OA.rar_Oaplay_play_play framework_play框架_审批

      7. **国际化支持**:Play框架支持多语言,可以轻松实现应用的国际化。 在描述中提到的“审批”功能,意味着该OA系统可能包含工作流管理和审批流程的实现。这通常涉及到以下方面: 1. **工作流引擎**:系统可能使用...

      Learning Play!Framework 2

      4. **国际化**:通过配置多语言资源文件,轻松实现应用的国际化支持。 5. **性能优化**:利用缓存策略、压缩技术等手段提升应用性能。 6. **部署**:Play! Framework 支持多种部署方式,包括本地服务器、云服务提供...

      mastering play framework for scala

      8. **国际化与本地化**:介绍如何在Play应用中实现多语言支持,以及时间、货币等的本地化处理。 9. **性能优化与部署**:讨论如何优化Play应用的性能,包括缓存策略、压缩响应、负载均衡等,以及如何将应用部署到...

      playframework:playframework原始码阅读

      8. **国际化与本地化**:Play支持多语言,提供了i18n服务,可以轻松地切换不同地区的语言资源。 9. **插件系统**:Play有许多社区开发的插件,如Ebean ORM、Anorm SQL库等,可以快速集成到项目中,增强功能。 10. ...

      scaleua:Scala和Play Framework的一个简单的类似于gettext的国际化(aka i18n)库

      标题"scaleua:Scala和Play Framework的一个简单的类似于gettext的国际化(aka i18n)库"表明这是一个专为Scala和Play Framework设计的轻量级国际化库,灵感来源于gettext工具,用于处理应用程序中的多语言支持。...

      play框架手册

      12. Internationalization国际化支持 - 96 - 仅使用 UTF-8! - 96 - 国际化你的信息 - 96 - 通过应用程序定义支持的语言 - 96 - 依照你的区域定义日期格式 - 97 - 找回区域信息 - 97 - Message arguments - 97 - 模板...

      play2.0 for java developers.pdf

      - 支持多语言应用,实现文本的国际化。 ##### 13. 应用Global对象 - **应用全局设置** - 可以定义全局的行为和配置。 - **拦截请求** - 在请求到达控制器之前进行预处理。 ##### 14. 测试应用程序 - **编写...

    Global site tag (gtag.js) - Google Analytics