This solution works for T2 because the way modules are executed.
For T3, which I don't use yet, I think a solution based on valves could
replace the new screen impl.

On Wed, 2002-03-20 at 17:08, Leandro Rodrigo Saad Cruz wrote:
> > 
> > ----- Original Message -----
> > From: "Leandro Rodrigo Saad Cruz" <[EMAIL PROTECTED]>
> > To: "Turbine Users List" <[EMAIL PROTECTED]>
> > Sent: Tuesday, March 19, 2002 3:52 PM
> > Subject: Re: Localization
> > 
> > 
> > > You can use the Localization accessor with any locale you would like.
> > > Maybe you can change TLocalizationService.java or LocalizationTool.java
> > > to allow some order or user preference regarding localized objects.
> > > I created a class called LocaleHelper that has the business logic used
> > > to pick up a locale acording to values in user session and http headers.
> > > If you wnat I can send it to you.
> 
> Ok.. that's what I've done.
> I need to grab *localized objects and maybe choose between **localized
> templates
> 
> * to accomplish this I wrote LocalizationHelper, this class is used in
> behalf of *new* LocalizationTool and encapsulates the logic that chooses
> locales.
> 
> ** I wrote a new Screen that tries to find different templates accordign
> to some locale info. For example : locale=pt_BR, then
> SomeTemplate-pt_BR.vm is looked up, then SomeTemplate.vm
> 
> OBS : you will have to change the package of this files and possibly
> some code (chanbe ACCEPTED_LOACES for example) to make it work.
> 
> Want any help ??
> 
> To see it working visit
> http://www.intercontinental.ind.br:8180/inter/servlet/main
> this site is supposed to be viewed in English and Portuguese
> 
> -- 
> Leandro Rodrigo Saad Cruz
> IT - Inter Business Tecnologia e Servicos (IB)
> http://www.ibnetwork.com.br
> ----
> 

> package br.com.ibnetwork.intercontinental.modules.screens;
> 
> //APP
> import br.com.ibnetwork.intercontinental.services.localization.LocalizationHelper;
> 
> //T2
> import org.apache.turbine.util.RunData;
> import org.apache.turbine.util.Log;
> import org.apache.turbine.modules.screens.VelocityScreen;
> import org.apache.turbine.services.template.TurbineTemplate;
> import org.apache.turbine.services.velocity.TurbineVelocity;
> import org.apache.velocity.context.Context;
> import org.apache.velocity.app.Velocity;
> import org.apache.ecs.ConcreteElement;
> 
> //JAVA
> import java.util.Locale;
> import java.io.File;
> 
> /**
>  * This module is responsible for searching a template file accordign to 
>LocalizationHelper.getLocale()
>  * <br>
>  * This way we can stil use links like $link.setPage("SomeTemplate.vm") and this 
>module will handle the template engine the right template. For Example : 
>  * <br> 
>  * <b>USER_LOCALE = pt_BR</b>
>  * <br>
>  * search for : SomeTemplate-pt_BR.vm, then SomeTemplate.vm ....
>  *
>  * @author <a href="mailto:[EMAIL PROTECTED]";>Leandro Rodrigo Saad Cruz</a>
>  */
> public class IntercontinentalVelocityScreen extends VelocityScreen
> {
> 
>     /**
>      * Este metodo sera executado apos os metodos dos screens que estendem esta 
>classe<br>
>      * Sua funcao eh tentar localizar um template com o mesmo nome do presente em 
>RunData, mas com conteudo sensivel ao locale correto.
>      * O locale pesquisado pode variar de acordo com as regras em 
>LocalizationHelper. 
>      * Este m�dulo apenas faz uma tentativa de mudar o template, caso o 
>template-locale n�o exista, o template original ser� executado
>      */
>     public void setTemplateLocalizationExtension(RunData data)
>     {
>         Locale locale = LocalizationHelper.getLocale(data);
>         Log.debug("debug","IntercontinentalScreen - Searching for new template for 
>locale["+locale+"]");
>         if(locale != null)
>         {
>             try
>             {
>                 //caso algum locale esteja disponivel nos tentaremos achar outros 
>template
>                 String templateName = 
>TurbineTemplate.getScreenTemplateName(data.getTemplateInfo().getScreenTemplate());
>                 Log.debug("debug","IntercontinentalScreen - original 
>template["+templateName+"]");
>                 
>data.setScreenTemplate(composeLocaleInfoAndTemplateName(templateName,locale));
>             }
>             catch(Exception e)
>             {
>                 Log.debug("Erro",e);
>                 //em caso de erro, o template original sera pesquisado
>             }
>         }
>     }
> 
>     /**
>      * This method is called by the Screenloader to construct the
>      * Screen.
>      *
>      * @param data Turbine information.
>      * @return A ConcreteElement.
>      * @exception Exception, a generic exception.
>      */
>     public ConcreteElement doBuild( RunData data )
>         throws Exception
>     {
>         Log.debug("debug","IntercontinentalScreen - Executing doBuild(data)");
>         ConcreteElement out = null;
>         
>         try
>         {
>             doBuildTemplate(data);
>             setTemplateLocalizationExtension(data);
>             out = buildTemplate(data);
>         }
>         finally
>         {
>             doPostBuildTemplate(data);
>         }
> 
>         return out;
>     }
>     
>     private String composeLocaleInfoAndTemplateName(String templateName,Locale 
>locale)
>     {
>         int pathSeparatorPosition = templateName.lastIndexOf("/");
>         if(pathSeparatorPosition >= 0)
>         {
>             
>             String minusPath = templateName.substring(pathSeparatorPosition + 1);
>             String path = templateName.substring(0,pathSeparatorPosition+1);
>             Log.debug("debug","IntercontinentalScreen - path["+path+"] 
>name["+minusPath+"]");
>             int dotPosition = minusPath.lastIndexOf(".");
>             StringBuffer sb = new StringBuffer();
>             sb.append(path)
>                 .append(minusPath.substring(0,dotPosition))
>                 .append("-")
>                 .append(locale)
>                 .append(minusPath.substring(dotPosition));
>             String newTemplateName = sb.toString();
>             if(Velocity.templateExists("/screens"+newTemplateName))
>             {
>                 Log.info("debug","IntercontinentalScreen - localizedTemplateName 
>found ["+newTemplateName+"] ");
>                 return newTemplateName;
>             }
>         }
>         Log.info("debug","IntercontinentalScreen - localizedTemplateName found 
>["+templateName+"] ");
>         return templateName;
>     }
> 
> }
> ----
> 

> package br.com.ibnetwork.intercontinental.services.localization;
> 
> //T2
> import org.apache.turbine.util.Log;
> import org.apache.turbine.util.RunData;
> import org.apache.turbine.services.localization.Localization;
> 
> //JAVA
> import java.util.Locale;
> import java.util.StringTokenizer;
> 
> /**
>  * This class is a helper tool to be used when you have to decide which Locale to 
>choose.
>  * This implementation follows this criteria : <br>
>  * i - first it checks to see if there is locale in the user session <br>
>  * ii - then it tries to build a locale from HTTP headers <br>
>  * iii - then it uses the default locale in TR.conf <br>
>  *
>  * @author <a href="mailto:[EMAIL PROTECTED]";>Leandro Rodrigo Saad Cruz</a>
>  */
> public class LocalizationHelper
> {
>     /** 
>      * Key used to put a Locale Object 
>      * into the session and used as a form field name 
>      * OBS : if you want this to work between user logins you will have to patch 
>Turbine.java to not exclude this key/val from Session
>      */
>     public static final String USER_LOCALE = "user.locale";
> 
> 
>     /**
>      * Key used to define the locale separator char
>      */
>     public static final String SEPARATOR = "_";
> 
> 
>     /**
>      * All locales that we are prepard to handle PORTUGUES and ENGLISH
>      * <br>
>      * OBS : Remenber, if you want do add the locales to this array you will have to 
>add new templates to your system too
>      */
>     public static Locale[] ACCEPTED_LOCALES = { new Locale("pt","BR"), 
>Locale.US,Locale.ENGLISH };
> 
>     /**
>      * Performs Locale selection
>      */
>     public static Locale getLocale(RunData data)
>     {
>         //Session
>         Locale locale = (Locale) ((RunData)data).getSession().getValue(USER_LOCALE);
>         
>         //HEADERS HTTP
>         if(locale == null)
>         {
>             locale = Localization.getLocale( ((RunData) data).getRequest() );
>             boolean accepted = false;
>             for(int i=0 ; i < ACCEPTED_LOCALES.length ; i++)
>             {
>                 Log.debug("debug","LocalizationHelper: searching 
>locale["+ACCEPTED_LOCALES[i]+"] in ACCEPTED list");
>                 if(locale.equals(ACCEPTED_LOCALES[i]))
>                 {
>                     accepted = true;
>                     break;
>                 }
>             }
>             locale = (accepted == false ? null : locale);
>         }
>         
>         //TR.conf
>         if(locale == null)
>         {
>             locale = 
>Localization.getBundle(Localization.getDefaultBundleName()).getLocale();
>         }
>         return locale;
>     }
> 
>     /**
>      * helper method used to build a locale from HTTP HEADERS
>      * @return a new locale obj or null when an error occur 
>      */
>     public static Locale buildLocaleFromParameter(String param)
>     {
>         if(param != null)
>         {
>             Locale locale;
>             StringTokenizer st = new StringTokenizer(param,SEPARATOR);
>             int total = st.countTokens(); 
>             String tokens[] = new String[total];
>             while (st.hasMoreTokens()) 
>             {
>                 String token = st.nextToken();
>                 Log.debug("debug","TOKEN ["+token+"]");
>                 tokens[--total] = token;
>             }
>             if(tokens.length == 2)
>             {
>                 return new Locale(tokens[1],tokens[0]);
>             }
>             if(tokens.length == 3)
>             {
>                 return new Locale(tokens[2],tokens[1],tokens[0]);
>             }
>         }
>         return null;
>     }
> }
> ----
> 

> package br.com.ibnetwork.intercontinental.services.localization;
> 
> //APP
> 
> //T2
> import org.apache.turbine.services.localization.Localization;
> import org.apache.turbine.services.pull.ApplicationTool;
> import org.apache.turbine.om.security.User;
> import org.apache.turbine.util.Log;
> import org.apache.turbine.util.RunData;
> 
> 
> //JAVA
> import java.util.Locale;
> import java.util.MissingResourceException;
> import java.util.ResourceBundle;
> 
> /**
>  * Localization Tool usado nos templates para disponibilizar conte�do localizado com 
>ajuda de 
>  * {@link br.com.ibnetwork.intercontinental.services.localization.LocalizationHelper}
>  *
>  * @author <a href="mailto:[EMAIL PROTECTED]";>Leandro Rodrigo Saad Cruz</a>
>  */
> public class LocalizationTool implements ApplicationTool
> {
> 
> 
>     /**
>      * The language and country information parsed from the request's
>      * <code>Accept-Language</code> header.  Reset on each request.
>      */
>     protected Locale locale;
> 
>     /**
>      * The bundle for this request.
>      */
>     private ResourceBundle bundle;
> 
>     /**
>      * The name of the bundle for this tool to use.
>      */
>     private String bundleName;
> 
>     /**
>      * Creates a new instance.  Used by <code>PullService</code>.
>      */
>     public LocalizationTool()
>     {
>         locale = null;
>         bundle = null;
>         bundleName = null;
>     }
> 
>     /**
>      * <p>Performs text lookups for localization.</p>
>      *
>      * <p>Assuming there is a instance of this class with a HTTP
>      * request set in your template's context named <code>l10n</code>,
>      * the VTL <code>$l10n.HELLO</code> would render to
>      * <code>hello</code> for English requests and <code>hola</code>
>      * in Spanish (depending on the value of the HTTP request's
>      * <code>Accept-Language</code> header).</p>
>      *
>      * @param key The identifier for the localized text to retrieve.
>      * @return The localized text.
>      */
>     public String get(String key)
>     {
>         try
>         {
>             //Log.debug("service","Localization tool 
>:Bundle["+bundleName+"]=["+bundle+"] used for key["+key+"] and locale["+locale+"]");
>             return bundle.getString(key);
>         }
>         catch (MissingResourceException noKey)
>         {
>             Log.warn("service","Missing Resource",noKey);
>             return null;
>         }
>     }
> 
>     /**
>      * The return value of this method is used to set the name of the
>      * bundle used by this tool.  Useful as a hook for using a
>      * different bundle than specifed in your
>      * <code>LocalizationService</code> configuration.
>      *
>      * @param data The inputs passed from {@link #init(Object)}.
>      * (ignored by this implementation).
>      */
>     protected String getBundleName(Object data)
>     {
>         return Localization.getDefaultBundleName();
>     }
> 
>     
>     /**
>      * Tool initialization
>      * <BR>
>      * GLOBAL
>      * <blockquote>
>      * Locale comes from TR.conf
>      * </blockquote>
>      * <BR>
>      * REQUEST
>      * <blockquote>
>      *  Check if user.locale is in Session, otherwise build a locale from HTTP 
>HEADERS
>      * </blockquote>
>      *
>      */
>     public final void init(Object data)
>     {
>         if(data == null)
>         {
>             Log.debug("service","Localization tool initializing with scope GLOBAL");
>          
>             //bundle default em TR.conf since no request data is available
>             bundle = Localization.getBundle(Localization.getDefaultBundleName());
>         }
> 
>         if(data instanceof User)
>         {
>             Log.debug("service","Localization tool initializing with scope SESSION");
>             // Pull necessary information out of Session.
>         }
>         
>         if (data instanceof RunData)
>         {
>             Log.debug("service","Localization tool initializing with scope REQUEST");
>             
>             // Pull necessary information out of RunData while we have a reference 
>to it.
>             locale = LocalizationHelper.getLocale((RunData)data);
>             bundleName = getBundleName(data);
> 
>             //bundle acoording to request information
>             bundle = Localization.getBundle(bundleName, locale);
>             Log.debug("service","Localization tool initialized with 
>bundleName["+bundleName+"] locale["+locale+"]");
>         }
>     }
> 
>     /**
>      * No-op.
>      */
>     public void refresh()
>     {
>         Log.debug("service","Localization tool refreshing...");
>     }
>     
>     /**
>      * helper method to be used inside templates
>      */
>     public String getUserLocale()
>     {
>         return LocalizationHelper.USER_LOCALE;
>     }
> 
> }
> 
> ----
> 

> --
> To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
-- 
Leandro Rodrigo Saad Cruz
IT - Inter Business Tecnologia e Servicos (IB)
http://www.ibnetwork.com.br


--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to