Oggi presento un custom tag java che permette facilmente di internazionalizzare il testo contenuto in qualunque JSP sviluppata con tecnologia JSP2.0 .
Il custom tag Dictionary è molto semplice, questo perchè la logica che sta alla base del funzionamento è incapsulata dalla classe di business Translator.
Il codice sorgente, il funzionamento e le caratteristiche della classe Translator sono state già affrontate ed ampiamente spiegate in questo precedente articolo.
Se hai bisogno di ripassare brevemente l'argomento custom tags puoi fare riferimento invece a questo link.
Il tag Dictionary
Visto che la logica per la traduzione e la cache dei vocaboli traducibili sono mutuati alla classe Translator, a questo componente rimane esclusivamente l'onere di carpire la lingua dell'utente che naviga nell'applicazione.
Per fare questo, basta estrarre il giusto header che qualunque browser invia nella head di ogni sua richiesta: nel caso particolare, il componente estrae dalla collection di informazioni, o headers, quella abbinata alla chiave "accept-language".
In questo articolo, è dato per scontato che vi sia una sola lingua utente (es: it per italiano), anche se in realtà è possibile che sia restituito un elenco di lingue separate da virgola (es: en, us).
Il tag ha solo un attributo chiamato name che è anche obbligatorio, di seguito la sua dichiarazione all'interno del Tag Library Descriptor file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems,
Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>ma</short-name>
<uri>http://java.ma.it/jsp/jstl/ma</uri>
<display-name>MA Tags Library</display-name>
<description>Mirko Agrati's Tags Library</description>
<tag>
<name>dictionary</name>
<tag-class>net.ma.java.tag.Dictionary</tag-class>
<body-content>empty</body-content>
<description>
Provvede alla traduzione di etichette e brevi testi.
</description>
<attribute>
<name>name</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
Rimane ora da analizzare il codice sorgente del componente.
package net.ma.java.tag;
/**
* Provvede alla traduzione di etichette e brevi testi.
*
* @author Mirko Agrati
* @version 02/mag/2011 - v1.1
*/
public final class Dictionary extends SimpleTagSupport {
private String name;
public Dictionary(){
super();
name = null;
}
@Override
public void doTag() throws JspException, IOException {
pageContext = (PageContext)getJspContext();
try{
String extraInfo = pageContext.getPage().getClass().getName();
HttpServletRequest req = (HttpServletRequest)pageContext.getRequest();
String language = req.getHeader("accept-language");
String translated = Translator.translate(language, name, extraInfo);
pageContext.getOut().write(translated);
}
catch ( Exception e ) {
throw new JspException(e);
}
}
public void setName(String n){
name = n;
}
}
Come avrai notato, il cuore del tag è l'estrazione del header con chiave accept-language , che contiene la lingua con cui è impostato il browser utente, e la chiamata al metodo translate , al quale si passa la lingua, il termine da tradurre ed eventuali note per tracciare richieste particolari.
Il termine tradotto viene infine scritto nel corpo della JSP.
Di seguito un esempio di utilizzo del tag Dictionary.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<%@page language="java" pageEncoding="UTF-8"
contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.ma.it/jsp/jstl/ma" prefix="ma" %>
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Pragma" content="no-cache">
<title>Custom tag Dictionary</title>
</HEAD>
<BODY>
<ma:dictionary name="Ciao" />
</BODY>
</HTML>
Il tutto risulta essere molto semplice e flessibile, potenzialmente utilissimo in tutte le java web app.
Alla prossima,
MA
0 commenti:
Posta un commento
Non ti è chiaro qualcosa?
No problem, posta il tuo dubbio ;)
..... e ricordati di firmarlo!