package br.com.citframework.util;
import java.text.MessageFormat;
import java.util.Properties;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.commons.lang.StringUtils;
import br.com.citframework.excecao.ServiceException;
/**
* @author CentralIT
*/
public class UtilI18N {
private static final String KEY_MUST_NOT_BE_NULL_OR_EMPTY = "Key must not be null or empty.";
private static final String LANGUAGE_MUST_NOT_BE_NULL = "Language/Locale must not be null.";
private static final String REQUEST_MUST_NOT_BE_NULL = "Request must not be null.";
public static final String ENGLISH_SIGLA = "en";
public static final String PORTUGUESE_SIGLA = "pt";
public static final String SPANISH_SIGLA = "es";
private static final String MENSAGENS_PREFFIX_NAME = "Mensagens";
private static String locale = PORTUGUESE_SIGLA;
private static final ConcurrentMap<String, String> ENGLISH_MAP = new ConcurrentHashMap<>();
private static final ConcurrentMap<String, String> PORTUGUESE_MAP = new ConcurrentHashMap<>();
private static final ConcurrentMap<String, String> SPANISH_MAP = new ConcurrentHashMap<>();
private static final ConcurrentMap<String, ConcurrentMap<String, String>> LANGUAGE_MAPS = new ConcurrentHashMap<>();
static {
LANGUAGE_MAPS.put(ENGLISH_SIGLA, ENGLISH_MAP);
LANGUAGE_MAPS.put(PORTUGUESE_SIGLA, PORTUGUESE_MAP);
LANGUAGE_MAPS.put(SPANISH_SIGLA, SPANISH_MAP);
}
/**
*
* Iniciliza o mapa de valores em portugu�s, por ser o padr�o. Os outros ser�o carregados on demmand
*
*/
public static void initialize() {
loadValuesOnMap(PORTUGUESE_SIGLA);
}
/**
* @param request
* � necessario para idenficar o locale na sess�o
* @param key
* Parametro para identificar arquivo no arquivo properties
* @return String da mensagem.
*/
public static String internacionaliza(final HttpServletRequest request, final String key) {
Assert.notNull(request, REQUEST_MUST_NOT_BE_NULL);
Assert.notNullAndNotEmpty(key, KEY_MUST_NOT_BE_NULL_OR_EMPTY);
String localKey = key.trim();
// FIXME n�o deve ser tratado aqui, refazer o m�todo internacionalizaString
if (!localKey.startsWith("$(")) {
localKey = key.replaceAll("\\$", "");
}
final HttpSession session = request.getSession(true);
final Object sessionLocale = session.getAttribute("locale");
if (sessionLocale != null && StringUtils.isNotBlank(sessionLocale.toString())) {
locale = sessionLocale.toString().trim();
}
return getValueBySiglaLinguaAndKey(locale, localKey);
}
/**
* @param locale
* identificador do pais ex: en (Ingl�s)
* @param Key
* parametro de busca arquivo properties
* @return String da mensagem.
* @throws Exception
* @throws ServiceException
*/
public static String internacionaliza(final String locale, final String key) {
Assert.notNull(locale, LANGUAGE_MUST_NOT_BE_NULL);
Assert.notNullAndNotEmpty(key, KEY_MUST_NOT_BE_NULL_OR_EMPTY);
final String localLocale = StringUtils.isBlank(locale) ? UtilI18N.PORTUGUESE_SIGLA : locale;
final String value = getValueBySiglaLinguaAndKey(localLocale, key);
return value.replaceAll("\n", "");
}
/**
* Busca e formata uma mensagem em um resource
*
* @param locale
* locale
* @param key
* chave de busca
* @param params
* par�metros para formata��o
* @return mensagem, se encontrada no resource, formatada com os par�metros
* @author bruno.ribeiro - <a href="mailto:bruno.ribeiro@centrait.com.br">bruno.ribeiro@centrait.com.br</a>
* @since 30/09/2014
*/
public static String internacionaliza(final String locale, final String key, final Object... params) {
final String keyValue = internacionaliza(locale, key);
String result = keyValue;
if (!keyValue.contains("???")) {
result = MessageFormat.format(keyValue, params);
}
return result;
}
public static String internacionalizaString(final String strParm, final HttpServletRequest request) {
if (strParm == null) {
return "";
}
final StringBuilder retorno = new StringBuilder();
String strTrata = new String(strParm);
boolean continua = true;
while (continua) {
final int indice = strTrata.indexOf("$");
if (strTrata.trim().equals("")) {
continua = false;
}
if (indice > -1 && !strTrata.trim().equals("")) {
if (indice > 0) {
retorno.append(strTrata.substring(0, indice));
}
final String palavra = pegaAteFinalToken(strTrata.substring(indice));
retorno.append(UtilI18N.internacionaliza(request, palavra));
strTrata = strTrata.substring(indice + palavra.length());
} else {
continua = false;
retorno.append(strTrata);
}
}
return retorno.toString().trim();
}
public static ConcurrentMap<String, String> getMapLanguage(final String language) {
final ConcurrentMap<String, String> map = LANGUAGE_MAPS.get(language);
if (map != null && map.isEmpty()) {
loadValuesOnMap(language);
}
return map;
}
private static String getValueBySiglaLinguaAndKey(final String siglaLingua, final String key) {
String value = key;
final ConcurrentMap<String, String> map = getMapLanguage(siglaLingua);
if (map != null) {
value = map.get(key);
// FIXME n�o deve ser tratado aqui, refazer o m�todo internacionalizaString
if (StringUtils.isBlank(value)) {
map.put(key, key);
value = map.get(key);
}
}
return value;
}
private static String pegaAteFinalToken(final String strParm) {
if (strParm == null) {
return "";
}
String palavraFormada = "";
for (int i = 0; i < strParm.length(); i++) {
if (strParm.charAt(i) != ' ' && strParm.charAt(i) != ':' && strParm.charAt(i) != '<' && strParm.charAt(i) != '\n' && strParm.charAt(i) != '\r'
&& strParm.charAt(i) != '\t' && strParm.charAt(i) != '\"' && strParm.charAt(i) != '\'' && strParm.charAt(i) != '[' && strParm.charAt(i) != ']') {
palavraFormada += strParm.charAt(i);
} else {
break;
}
}
return palavraFormada;
}
private static void loadValuesOnMap(final String language) {
final ConcurrentMap<String, String> map = LANGUAGE_MAPS.get(language);
final PropertyFile pFile = getPropertyFile(language);
final Properties pLanguage = pFile.getProperties();
final Set<String> propertyKeys = pLanguage.stringPropertyNames();
for (final String key : propertyKeys) {
map.put(key, pFile.getProperty(key));
}
}
private static PropertyFile getPropertyFile(final String language) {
String fileName = MENSAGENS_PREFFIX_NAME;
if (StringUtils.isNotBlank(language) && !language.trim().equalsIgnoreCase("pt")) {
fileName = fileName + "_" + language.toLowerCase().trim();
}
return PropertyFile.getPropertyFile(fileName);
}
public static String getLocale() {
return locale;
}
}