Geert,

IMO, i18n is needed at the element level, not only at the template level.

ATM only Crud Elements (others?) have access to a specific resource bundle, two in fact with:
- l10n/admin files common to all the crud elements
- l10n/admin-name_of_the_element_class files

Proposition (see patches below, tested with java 1.5): 1/ make available parameters "detect_client_locale" and "resourcesbundle_basename" in any element configuration file, i.e.

<element extends="authentication/memory.xml"
implementation="com.uwyn.ecalendar.authentication.elements.LocaleAuthenticated" > <property name="resourcebundle_basename">l10n/authentication/localization</property>
   <property name="detect_client_locale">true</property>
</element>

2/ add getResourceName and getClientLocales functions to ElementSupport (or in ElementContext? ElementInfo?):

3/ add a function getResourceBundles(List<String> basenames, List<Locale> locales) to Localization

4/ give to TemplateFactory the list of client locales, via ElementContext

5/ add to ElementSupport (or in ElementContext? ElementInfo?) the support of resource bundle final list:
- add a mResourceBundleList variable
- add functions to deal with ResourceBundles

7/ update CrudElement

Regards

Pierre



hmmm, good point, there is no solution for that at the moment.

This needs some thinking and I'd like to find a solution for it since it seems to be an important oversight. I don't have any real solutions in mind at the moment. If you think of something, shoot, I'll ponder about it too.

Index: C:/DEV/Rife/rife-svn/src/framework/com/uwyn/rife/tools/Localization.java
===================================================================
--- C:/DEV/Rife/rife-svn/src/framework/com/uwyn/rife/tools/Localization.java (revision 2717) +++ C:/DEV/Rife/rife-svn/src/framework/com/uwyn/rife/tools/Localization.java (working copy)
@@ -444,6 +444,40 @@
return null;
    }
+
+ public static List<ResourceBundle> getResourceBundles(List<String> baseNameList, List<Locale> localeList)
+    {
+        if (localeList == null) {
+            localeList = new ArrayList<Locale>();
+        }
+        localeList.add(null);  // to get the default locale
+ + List<ResourceBundle> bundles = new ArrayList<ResourceBundle>();
+        for (Locale locale : localeList)
+        {
+            for (String baseName : baseNameList)
+            {
+                if ( (baseName == null) || (baseName.length() == 0) )
+                {
+                    baseName = RifeConfig.Tools.getDefaultResourceBundle();
+                }
+                if ( (baseName != null) && (baseName.length() > 0) )
+                {
+ ResourceBundle bundle = Localization.getResourceBundle(baseName, locale);
+                    if (bundle != null)
+                    {
+                        bundles.add(bundle);
+                    }
+                }
+            }
+        }
+        if (bundles.isEmpty())
+        {
+            return null;
+        }
+        return bundles;
+    }
+
}

class ReloadingBundle extends ResourceBundle

Index: C:/DEV/Rife/rife-svn/src/framework/com/uwyn/rife/template/TemplateFactory.java
===================================================================
--- C:/DEV/Rife/rife-svn/src/framework/com/uwyn/rife/template/TemplateFactory.java (revision 2717) +++ C:/DEV/Rife/rife-svn/src/framework/com/uwyn/rife/template/TemplateFactory.java (working copy)
@@ -19,6 +19,8 @@
import com.uwyn.rife.tools.Localization;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.List;
+import java.util.Locale;
import java.util.ResourceBundle;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
@@ -387,6 +389,16 @@
    }

public Template get(String name, String encoding, TemplateTransformer transformer)
+    throws TemplateException
+    {
+        return get(name, encoding, transformer, null);
+    }
+ + public Template get( String name
+                       , String encoding
+                       , TemplateTransformer transformer
+                       , List<Locale> locales
+                       )
    throws TemplateException
    {
if (null == name) throw new IllegalArgumentException("name can't be null.");
@@ -402,21 +414,14 @@

            assert template != null;

- Collection<String> default_resourcebundles = RifeConfig.Template.getDefaultResourcebundles(this);
-            if (default_resourcebundles != null)
+            List<String> default_resourcebundles =
+ (List<String>) RifeConfig.Template.getDefaultResourcebundles(this); + if ((default_resourcebundles != null) && (default_resourcebundles.size() > 0))
            {
- ArrayList<ResourceBundle> default_bundles = new ArrayList<ResourceBundle>();
-                for (String bundle_name : default_resourcebundles)
-                {
-                    // try to look it up as a filename in the classpath
- ResourceBundle bundle = Localization.getResourceBundle(bundle_name);
-                    if (bundle != null)
-                    {
-                        default_bundles.add(bundle);
-                        continue;
-                    }
-                }
-                template.setDefaultResourceBundles(default_bundles);
+                template.setDefaultResourceBundles(
+ (ArrayList<ResourceBundle>) Localization.getResourceBundles( default_resourcebundles + , locales + ));
            }

            template.initialize();


Index: C:/DEV/Rife/rife-svn/src/framework/com/uwyn/rife/engine/ElementContext.java
===================================================================
--- C:/DEV/Rife/rife-svn/src/framework/com/uwyn/rife/engine/ElementContext.java (revision 2717) +++ C:/DEV/Rife/rife-svn/src/framework/com/uwyn/rife/engine/ElementContext.java (working copy)
@@ -1090,14 +1090,28 @@
    {
        return mOutputs;
    }
- + + protected Template getTemplate(TemplateFactory factory, String name, String encoding, TemplateTransformer transformer)
+    {
+ Template template = factory.get(name, encoding, transformer, mElement.getClientLocales());
+
+ List<ResourceBundle> template_bundles = (List<ResourceBundle>)template.getResourceBundles(); + mElement.addResourceBundle(mElement.getResourceName(), true); // top priority to specific element bundle + mElement.addResourceBundles(template_bundles, true); + mElement.addResourceBundle(RifeConfig.Tools.getDefaultResourceBundle(), true); //bottom priority to global bundle
+        template_bundles.clear();
+        template_bundles.addAll(mElement.getResourceBundles());
+
+        return template;
+    }
+
Template getHtmlTemplate(String name, String encoding, TemplateTransformer transformer)
    throws TemplateException
    {
if (null == name) throw new IllegalArgumentException("name can't be null."); if (0 == name.length()) throw new IllegalArgumentException("name can't be empty.");

-        return TemplateFactory.ENGINEHTML.get(name, encoding, transformer);
+ return getTemplate(TemplateFactory.ENGINEHTML, name, encoding, transformer);
    }
Template getXhtmlTemplate(String name, String encoding, TemplateTransformer transformer)

Index: C:/DEV/Rife/rife-svn/src/framework/com/uwyn/rife/engine/ElementSupport.java
===================================================================
--- C:/DEV/Rife/rife-svn/src/framework/com/uwyn/rife/engine/ElementSupport.java (revision 2717) +++ C:/DEV/Rife/rife-svn/src/framework/com/uwyn/rife/engine/ElementSupport.java (working copy)
@@ -16,10 +16,13 @@
import javax.servlet.http.HttpServletResponse;

import com.uwyn.rife.engine.exceptions.*;
+import com.uwyn.rife.config.RifeConfig;
import com.uwyn.rife.template.Template;
import com.uwyn.rife.template.TemplateTransformer;
import com.uwyn.rife.template.exceptions.TemplateException;
import com.uwyn.rife.tools.ArrayUtils;
+import com.uwyn.rife.tools.Convert;
+import com.uwyn.rife.tools.Localization;
import com.uwyn.rife.tools.ObjectUtils;
import com.uwyn.rife.tools.ServletUtils;
import com.uwyn.rife.tools.StringUtils;
@@ -46,7 +49,101 @@
    private Class                   mDeploymentClass = null;
    private boolean                 mProhibitRawAccess = true;
    private boolean                 mCloneContinuations = true;
+    private List<ResourceBundle>    mResourceBundleList = null;
+ + public String getResourceName()
+    {
+        return getPropertyString("resourcebundle_basename", null);
+    }

+    public boolean isWithClientLocales()
+    {
+ return Convert.toBoolean(getProperty("detect_client_locale"), false);
+    }
+ + public List<Locale> getClientLocales()
+    {
+        if (isWithClientLocales())
+        {
+            List<Locale> locales = new ArrayList<Locale>();
+ for (Enumeration el=getRequestLocales(); el.hasMoreElements(); )
+            {
+                locales.add((Locale) el.nextElement());
+            }
+            return locales;
+        }
+        return null;
+    }
+
+    public List<ResourceBundle> getResourceBundles()
+    {
+        if (mResourceBundleList == null)
+        {
+            setResourceBundles();
+        }
+        return mResourceBundleList;
+    }
+
+    protected void setResourceBundles()
+    {
+        mResourceBundleList = new ArrayList<ResourceBundle>();
+        addResourceBundle(null, true, true);
+    }
+
+    public void addResourceBundle(String baseName, boolean atTheEnd)
+    {
+        addResourceBundle(baseName, atTheEnd, false);
+    }
+ + public void addResourceBundle(String baseName, boolean atTheEnd, boolean withDefault)
+    {
+ addResourceBundles(new String[] {baseName}, atTheEnd, withDefault);
+    }
+
+    public void addResourceBundles(String[] baseNameList, boolean atTheEnd)
+    {
+        addResourceBundles(baseNameList, atTheEnd, false);
+    }
+ + public void addResourceBundles(String[] baseNames, boolean atTheEnd, boolean withDefault)
+    {
+ + List<String> baseNameList = new ArrayList<String>();
+        boolean isDefault = false;
+        for (int i = 0; i < baseNames.length; i++)
+        {
+            if (baseNames[i] != null)
+            {
+                baseNameList.add(baseNames[i]);
+            }
+            else
+            {
+                isDefault = true;
+            }
+        }
+ if (withDefault && isDefault) // it's the default case, so bottom priority
+        {
+            baseNameList.add(null);
+        }
+ List<ResourceBundle> bundles = Localization.getResourceBundles(baseNameList, getClientLocales());
+        if (( bundles != null) && (bundles.size() > 0) )
+        {
+            addResourceBundles(bundles, atTheEnd);
+        }
+    }
+
+ public void addResourceBundles(List<ResourceBundle> bundles, boolean atTheEnd)
+    {
+        if (atTheEnd)
+        {
+            getResourceBundles().addAll(bundles);
+        }
+        else
+        {
+            getResourceBundles().addAll(0, bundles);
+        }
+    }
+
    protected ElementSupport()
    {
    }


Index: C:/DEV/Rife/rife-crud-svn/src/implementations/com/uwyn/rife/crud/elements/admin/CrudElement.java
===================================================================
--- C:/DEV/Rife/rife-crud-svn/src/implementations/com/uwyn/rife/crud/elements/admin/CrudElement.java (revision 2717) +++ C:/DEV/Rife/rife-crud-svn/src/implementations/com/uwyn/rife/crud/elements/admin/CrudElement.java (working copy)
@@ -5,10 +5,14 @@
 */
package com.uwyn.rife.crud.elements.admin;

-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.ResourceBundle;

import com.uwyn.rife.config.Config;
-import com.uwyn.rife.config.RifeConfig;
import com.uwyn.rife.crud.CrudPropertyNames;
import com.uwyn.rife.crud.CrudSiteProcessor;
import com.uwyn.rife.crud.CrudTemplateFactory;
@@ -17,11 +21,16 @@
import com.uwyn.rife.database.Datasource;
import com.uwyn.rife.database.Datasources;
import com.uwyn.rife.engine.Element;
-import com.uwyn.rife.site.*;
+import com.uwyn.rife.site.Constrained;
+import com.uwyn.rife.site.ConstrainedBean;
+import com.uwyn.rife.site.ConstrainedProperty;
+import com.uwyn.rife.site.ConstrainedUtils;
+import com.uwyn.rife.site.SelectResourceBundle;
import com.uwyn.rife.template.Template;
import com.uwyn.rife.tools.Convert;
import com.uwyn.rife.tools.Localization;
import com.uwyn.rife.tools.StringUtils;
+import com.uwyn.rife.tools.exceptions.ConversionException;

public abstract class CrudElement extends Element
{
@@ -105,36 +114,35 @@
        return mContentQueryManager;
    }

-    public Template getTemplate()
+    public boolean isWithClientLocales()
+    {
+        boolean isWithClientLocales = false;
+        try {
+ isWithClientLocales = Convert.toBoolean(getProperty(CrudPropertyNames.DETECT_CLIENT_LOCALE));
+        }
+        catch (ConversionException ce)
+        {
+            isWithClientLocales = super.isWithClientLocales();
+        }
+        return isWithClientLocales;
+    }
+
+    public Template getTemplate()
    {
        if (null == mTemplate)
        {
Template template = CrudTemplateFactory.CRUD.get(getTransformer()); + + List<String> bundleNames = new ArrayList<String>(); + bundleNames.add("l10n/crud/admin-"+StringUtils.encodeClassname(mBeanClassName));
+            bundleNames.add("l10n/crud/admin");
+ List<ResourceBundle> bundles = Localization.getResourceBundles(bundleNames, getClientLocales());
+            if ( (bundles != null) && (bundles.size() > 0) )
+            {
+ ((List<ResourceBundle>) template.getResourceBundles()).addAll(0, bundles); // top priority
+                getResourceBundles().addAll(0, bundles);
+            }

- boolean detect_client_locale = Convert.toBoolean(getProperty(CrudPropertyNames.DETECT_CLIENT_LOCALE), false);
-            if (detect_client_locale)
-            {
-                Enumeration locales = getRequestLocales();
-                while (locales.hasMoreElements())
-                {
-                    Locale locale = (Locale)locales.nextElement();
- template.addResourceBundle(Localization.getResourceBundle("l10n/crud/admin-"+StringUtils.encodeClassname(mBeanClassName), locale));
-                }
-            }
-            String language = RifeConfig.Tools.getDefaultLanguage();
- template.addResourceBundle(Localization.getResourceBundle("l10n/crud/admin-"+StringUtils.encodeClassname(mBeanClassName), language));
-
-            if (detect_client_locale)
-            {
-                Enumeration locales = getRequestLocales();
-                while (locales.hasMoreElements())
-                {
-                    Locale locale = (Locale)locales.nextElement();
- template.addResourceBundle(Localization.getResourceBundle("l10n/crud/admin", locale));
-                }
-            }
- template.addResourceBundle(Localization.getResourceBundle("l10n/crud/admin", language));
-
            mTemplate = template;
        }




_______________________________________________
Rife-users mailing list
Rife-users@uwyn.com
http://www.uwyn.com/mailman/listinfo/rife-users

Reply via email to