All Downloads are FREE. Search and download functionalities are using the official Maven repository.

play.i18n.Messages Maven / Gradle / Ivy

There is a newer version: 1.5.0
Show newest version
package play.i18n;

import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import play.data.binding.Binder;

/**
 * I18n Helper
 * 

* translation are defined as properties in /conf/messages.locale files * with locale being the i18n country code fr, en, fr_FR * *

 * # /conf/messages.fr
 * hello=Bonjour, %s !
 * 
* * Messages.get( "hello", "World"); // => "Bonjour, World !" * * */ public class Messages { static public Properties defaults; static public Map locales = new HashMap(); static Pattern recursive = Pattern.compile("&\\{(.*?)\\}"); /** * Given a message code, translate it using current locale. * Notice that if the message can't be found, the string !code! is returned. * * @param key the message code * @param args optional message format arguments * @return translated message */ public static String get(Object key, Object... args) { String value = null; if( key == null ) { return ""; } if (locales.containsKey(Lang.get())) { value = locales.get(Lang.get()).getProperty(key.toString()); } if (value == null) { value = defaults.getProperty(key.toString()); } if (value == null) { value = key.toString(); } String message = String.format(value, coolStuff(value, args)); Matcher matcher = recursive.matcher(message); StringBuffer sb = new StringBuffer(); while(matcher.find()) { matcher.appendReplacement(sb, get(matcher.group(1))); } matcher.appendTail(sb); return sb.toString(); } static Pattern formatterPattern = Pattern.compile("%((\\d+)\\$)?([-#+ 0,(]+)?(\\d+)?([.]\\d+)?([bBhHsScCdoxXeEfgGaAtT])"); @SuppressWarnings("unchecked") static Object[] coolStuff(String pattern, Object[] args) { Class[] conversions = new Class[args.length]; Matcher matcher = formatterPattern.matcher(pattern); int incrementalPosition = 1; while(matcher.find()) { String conversion = matcher.group(6); Integer position; if(matcher.group(2) == null) { position = incrementalPosition++; } else { position = Integer.parseInt(matcher.group(2)); } if(conversion.equals("d") && position <= conversions.length) { conversions[position-1] = Long.class; } if(conversion.equals("f") && position <= conversions.length) { conversions[position-1] = Double.class; } } Object[] result = new Object[args.length]; for(int i=0; i primitive and object binder result[i] = Binder.directBind(args[i] + "", conversions[i]); } catch(Exception e) { result[i] = null; } } } return result; } /** * return all messages for a locale * @param locale the locale code eg. fr, fr_FR * @return messages as a {@link java.util.Properties java.util.Properties} */ public static Properties all(String locale) { return locales.get(locale); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy