package net.conselldemallorca.helium.webapp.mvc.util; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.Locale; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.conselldemallorca.helium.core.model.hibernate.UsuariPreferencies; import net.conselldemallorca.helium.core.model.service.PersonaService; import net.conselldemallorca.helium.core.util.GlobalProperties; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.propertyeditors.LocaleEditor; import org.springframework.web.servlet.LocaleResolver; import org.springframework.web.util.WebUtils; public class IdiomaResolver implements LocaleResolver, Serializable { private static final long serialVersionUID = 1L; public static final String SESSION_IDIOMA_ACTUAL = "idiomaActual"; public static final String SESSION_IDIOMES_DISPONIBLES = "idiomesDisponibles"; private PersonaService personaService; private Locale idiomaDefecte; private List<Locale> idiomesDisponibles = new ArrayList<Locale>(); public class ParellaCodiNom implements Serializable { private static final long serialVersionUID = 1L; private String codi; private String nom; public ParellaCodiNom() { } public ParellaCodiNom(String codi, String nom) { this.codi = codi; this.nom = nom; } public void setCodi(String codi) { this.codi = codi; } public String getCodi() { return codi; } public void setNom(String nom) { this.nom = nom; } public String getNom() { return nom; } } public IdiomaResolver() { setIdiomesDisponibles( GlobalProperties.getInstance().getProperty("app.idiomes.disponibles") ); setIdiomaDefecte( GlobalProperties.getInstance().getProperty("app.idioma.defecte") ); } public Locale resolveLocale(HttpServletRequest request) { Locale locale = null; LocaleEditor localeEditor = new LocaleEditor(); ParellaCodiNom parella = (ParellaCodiNom)WebUtils.getSessionAttribute(request, SESSION_IDIOMA_ACTUAL); if (parella != null) { localeEditor.setAsText(parella.getCodi()); locale = (Locale)localeEditor.getValue(); } else { if (request.getUserPrincipal() != null) { UsuariPreferencies preferencies = personaService.getUsuariPreferencies(); if (preferencies != null && preferencies.getIdioma() != null) { String idioma = preferencies.getIdioma(); localeEditor.setAsText(idioma); locale = (Locale)localeEditor.getValue(); } if (locale == null || !esIdiomaDisponible(locale)) { locale = determinarIdiomaDefecte(request); } } else { locale = determinarIdiomaDefecte(request); } setLocale(request, locale); } return locale; } private Locale determinarIdiomaDefecte(HttpServletRequest request) { Locale idiomaDefecte = request.getLocale(); if ( !esIdiomaDisponible(idiomaDefecte) ) idiomaDefecte = getIdiomaDefecte(); if ( idiomaDefecte==null ) return Locale.getDefault(); return idiomaDefecte; } private boolean esIdiomaDisponible(Locale locale) { for ( Locale disponible: getIdiomesDisponibles() ) if ( locale.equals(disponible) ) return true; return false; } private void setLocale(HttpServletRequest request, Locale idioma) { if ( esIdiomaDisponible(idioma) ) { ParellaCodiNom parella = new ParellaCodiNom( idioma.toString(), capitalize(idioma.getDisplayLanguage(idioma)) ); WebUtils.setSessionAttribute(request, SESSION_IDIOMA_ACTUAL, parella); List<ParellaCodiNom> parelles = new ArrayList<ParellaCodiNom>(); for (Locale disponible: getIdiomesDisponibles()) parelles.add(new ParellaCodiNom( disponible.toString(), capitalize(disponible.getDisplayLanguage(idioma)) )); WebUtils.setSessionAttribute(request, SESSION_IDIOMES_DISPONIBLES, parelles); } } public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) { setLocale(request, locale); } @Autowired public void setPersonaService(PersonaService personaService) { this.personaService = personaService; } public void setIdiomaDefecte(String idiomaDefecte) { if ( idiomaDefecte!=null ) { LocaleEditor localeEditor = new LocaleEditor(); localeEditor.setAsText(idiomaDefecte); this.idiomaDefecte = (Locale)localeEditor.getValue(); if ( ! esIdiomaDisponible(this.idiomaDefecte) ) this.idiomesDisponibles.add(0, this.idiomaDefecte); } } public Locale getIdiomaDefecte() { return idiomaDefecte; } public void setIdiomesDisponibles(String idiomesDisponibles) { if ( idiomesDisponibles!=null && idiomesDisponibles!="" ) { this.idiomesDisponibles = new ArrayList<Locale>(); LocaleEditor localeEditor = new LocaleEditor(); String idiomes[] = idiomesDisponibles.split(","); for ( String idioma: idiomes ) { localeEditor.setAsText(idioma); this.idiomesDisponibles.add( (Locale)localeEditor.getValue() ); } if ( this.idiomaDefecte==null ) this.idiomaDefecte = this.idiomesDisponibles.get(0); } } public List<Locale> getIdiomesDisponibles() { return idiomesDisponibles; } private String capitalize(String cadena) { if ( cadena==null || cadena.length()==0 ) return ""; if ( cadena.length()==1 ) return cadena.toUpperCase(); return cadena.substring(0,1).toUpperCase()+cadena.substring(1).toLowerCase(); } }