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