Hi all,

I'm writing a chapter on internationalization/ localization, and found
out the message loading works differently from what I expected (and
I'm quite sure how it used to work pre 1.2?).

The first thing I stumbled on was the fact that messages are located
searching from parent to child instead of the inverse. What is the
point of doing that? I would expect something like this to work:

MyPage.properties:
my.property=some value

MyPanel.properties:
my.properties=override

If MyPanel is added to MyPage, currently my.property would resolve to
'some value', while I would expect it to resolve to 'override'.

This patch would fix that:
Index: 
/Users/eelcohillenius/Documents/workspace/wicket-2.0/src/main/java/wicket/Localizer.java
===================================================================
--- 
/Users/eelcohillenius/Documents/workspace/wicket-2.0/src/main/java/wicket/Localizer.java
    (revision
476204)
+++ 
/Users/eelcohillenius/Documents/workspace/wicket-2.0/src/main/java/wicket/Localizer.java
    (working
copy)
@@ -325,7 +325,8 @@

                // Build the search stack
                final List<Class> searchStack = new ArrayList<Class>();
-               searchStack.add(component.getClass());
+               Class<? extends Component> componentClass = 
component.getClass();
+               searchStack.add(componentClass);

                if (!(component instanceof Page))
                {
@@ -333,7 +334,8 @@
                        MarkupContainer container = component.getParent();
                        while (container != null)
                        {
-                               searchStack.add(container.getClass());
+                               componentClass = container.getClass();
+                               searchStack.add(componentClass);
                                if (container instanceof Page)
                                {
                                        break;
@@ -409,7 +411,11 @@
                        if ((searchStack != null) && (searchStack.size() > 0))
                        {
                                // Walk the component hierarchy down from page 
to the component
-                               for (int i = searchStack.size() - 1; (i >= 0) 
&& (string == null); i--)
+                               // for (int i = searchStack.size() - 1; (i >= 0) 
&& (string ==
+                               // null); i--)
+                               // {
+                               int len = searchStack.size();
+                               for (int i = 0; (i < len) && (string == null); 
i++)
                                {
                                        Class clazz = (Class)searchStack.get(i);


But I'm wondering whether there was a reason to do it starting from
the parent, as treating it like a stack seems to be deliberate.

Another thing I found out is that resolving using inheritance gives up
too quickly in some cases. For example:

[Base.properties]
[Base_nl.properties]
 s1=invoer
Foo.properties
 s1=input

If Foo extends Base, and you try to get s1 for the Dutch (nl) locale
relative to Foo, it will never actually reach Base_nl.properties but
instead get the value in Foo.properties (the English default in this
case). I think this is wrong too, though the fix might be nasty.

WDYT? Anyone noticed some other unexpected behavior here?

Eelco

Reply via email to