Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
Copyright (c) 2011-2013, James Zhan 詹波 (jfinal@126.com). Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
 
 
 package com.jfinal.i18n;
 
 
I18N support.

1: Config parameters in JFinalConfig 2: Init I18N in JFinal 3: I18N support text with Locale 4: Controller use I18N.getText(...) with Local setting in I18nInterceptor 5: The resource file in WEB-INF/classes

important: Locale can create with language like new Locale("xxx");

need test Using String get Locale was learned from Strus2

 
 public class I18N {
 
     private static String baseName;
     private static Locale defaultLocale = Locale.getDefault();
     private static int i18nMaxAgeOfCookie = .;
     private static final NullResourceBundle NULL_RESOURCE_BUNDLE = new NullResourceBundle();
     private static final ConcurrentMap<StringResourceBundlebundlesMap = new ConcurrentHashMap<StringResourceBundle>();
 
     private static volatile I18N me;
 
     private I18N() {
     }
 
     public static I18N me() {
         if ( == null)
             synchronized (I18N.class) {
                 if ( == null)
                      = new I18N();
             }
         return ;
     }
 
     public static void init(String baseNameLocale defaultLocaleInteger i18nMaxAgeOfCookie) {
         . = baseName;
         if (defaultLocale != null)
             . = defaultLocale;
         if (i18nMaxAgeOfCookie != null)
             . = i18nMaxAgeOfCookie;
     }
 
     public static Locale getDefaultLocale() {
         return ;
     }
 
     static public int getI18nMaxAgeOfCookie() {
         return ;
     }
 
     private static ResourceBundle getResourceBundle(Locale locale) {
         String resourceBundleKey = getresourceBundleKey(locale);
         ResourceBundle resourceBundle = .get(resourceBundleKey);
         if (resourceBundle == null) {
             try {
                 resourceBundle = ResourceBundle.getBundle(locale);
                 .put(resourceBundleKeyresourceBundle);
             } catch (MissingResourceException e) {
                 resourceBundle = ;
             }
         }
         return resourceBundle;
     }

    
将来只改这里就可以了: resourceBundleKey的生成规则
 
     private static String getresourceBundleKey(Locale locale) {
         // return baseName + "_" + locale.toString();	// "_" 貌似与无关, 为了提升性能, 故去掉
        return  + locale.toString();
    }
    public static String getText(String key) {
        return getResourceBundle().getString(key);
    }
    public static String getText(String keyString defaultValue) {
        String result = getResourceBundle().getString(key);
        return result != null ? result : defaultValue;
    }
    public static String getText(String keyLocale locale) {
        return getResourceBundle(locale).getString(key);
    }
    public static String getText(String keyString defaultValueLocale locale) {
        String result = getResourceBundle(locale).getString(key);
        return result != null ? result : defaultValue;
    }
    // public static Locale localeFromString(String localeStr, Locale defaultLocale) {
    public static Locale localeFromString(String localeStr) {
        if ((localeStr == null) || (localeStr.trim().length() == 0) || (..equals(localeStr))) {
            // return (defaultLocale != null) ? defaultLocale : Locale.getDefault();	// 原实现被注掉
            return ;
        }
        int index = localeStr.indexOf('_');
        if (index < 0) {
            return new Locale(localeStr);
        }
        String language = localeStr.substring(0, index);
        if (index == localeStr.length()) {
            return new Locale(language);
        }
        localeStr = localeStr.substring(index + 1);
        index = localeStr.indexOf('_');
        if (index < 0) {
            return new Locale(languagelocaleStr);
        }
        String country = localeStr.substring(0, index);
        if (index == localeStr.length()) {
            return new Locale(languagecountry);
        }
        localeStr = localeStr.substring(index + 1);
        return new Locale(languagecountrylocaleStr);
    }
    private static class NullResourceBundle extends ResourceBundle {
        public Enumeration<StringgetKeys() {
            return null// dummy
        }
        protected Object handleGetObject(String key) {
            return null// dummy
        }
    }
    // 可惜的是使用Local可以被 new 出来, 造成了无法判断相等,后来测试,可以使用 equals方法来判断是否相等
    public static void main(String[] args) {
        // Locale.getDefault();
        // Locale en = Locale.US;
        // Locale us = Locale.US;
        // System.out.println(l.toString());
        // System.out.println(en == us);
        // System.out.println(en.equals(us));
        // 下面的 taiwan.getLanguage()值仍为 zh,所以可以确定i18n实现有缺陷,即 language不能唯一确定Local对象
        // 造成了无法通过 language不好还原
        Locale shoudong = new Locale("en");
        ..println(shoudong.getLanguage().equals(..getLanguage()));
        ..println(shoudong.getLanguage().equals(..getLanguage()));
    }
New to GrepCode? Check out our FAQ X