cocoon-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Andrew Stevens" <>
Subject RE: Need help to localize images
Date Wed, 14 Feb 2007 17:44:32 GMT
>From: "Thomas Detoux" <>
>Date: Wed, 14 Feb 2007 17:26:41 +0100
>Hello all,
>My point is to show different versions of a picture for different
>values of the users' locale, this will help for any picture with text
>in it.
>The first path explored was to have different picture for each locale :
>* my_picture_en.jpg
>* my_picture_fr.jpg
>and to have sitemap replace a reference to /my_picture.jpg/ to the
>correct localized version.
>In order to reduce the number of images nedded, only the language part
>of the locale is desired.
>The org.apache.cocoon.matching.LocaleMatcher documentation indicated
>that, among others, a *langage variable* was available within the
>matcher, so I tried this :
>========== BEGIN SITEMAP.XMAP SNAPSHOT ==============
><map:matcher logger="sitemap.matcher.locale" name="i18n"
>                      src="org.apache.cocoon.matching.LocaleMatcher">
>	<locale-attribute>locale</locale-attribute>
>	<use-locale>true</use-locale>
>	<default-locale language="fr"/>
>	<create-session>false</create-session>
>	<store-in-request>true</store-in-request>
>	<store-in-session>false</store-in-session>
>	<store-in-cookie>false</store-in-cookie>
><map:match pattern="**/images/*.gif">
>	<map:match type="i18n">
>		<map:read mime-type="image/gif"
>				src="{system-property:site.home}/images/{2}_{language}.gif"/>
>	</map:match>

Did you actually mean {2} in there, or {../2}?  I'd expect {2} to refer to a 
value set by the i18n matcher rather than the surrounding wildcard matcher.

I must admit I've not actually used the locale matcher myself as I generally 
use the locale action instead.  From reading its javadocs, though, my 
interpretation was that you must give it a pattern attribute as it will look 
for the resource which most closely matches that path or filename after 
expanding it with the locale-related values.  So in your case you would have 
something like
	<map:match type="i18n" 
		<map:read mime-type="image/gif" src="{source}"/>
({2} is intentional this time as the variable has moved up a level to the 
matcher's pattern instead of the reader's src).  The "*" will try to match 
language_country_variant, then language_country, then language, so if you 
only use the language code in your images' filenames then that is all that 
will be used.  Although you could use 
src="{system-property:site.home}/images/{../2}_{language}.gif" in the 
reader, since the {source} variable gets set with the entire URI that 
matched (after variable substitution) you might as well just use that 

Alternatively, instead of the locale matcher you could always use the locale 
<map:match pattern="**/images/*.gif">
	<map:act type="locale">
		<map:read mime-type="image/gif"

The locale action is configured with much the same settings as the matcher, 
and sets mostly the same variables (with the notable exception of {source} 
since it acts entirely from the request and doesn't refer to any other 

>================END OF SNAPSHOT=============
>Unfortunately, that doesn't work, server log sys :
>(date) DEBUG [] cocoon-ehcache-1Cache:
>MemoryStore miss for
>As you can see, the /language/ is missing to the filename. When I try
>to switch the two map:match, the log indicate that the server is
>trying to reach file named *_en.gif* or *_fr.gif*.
>Where is my mistake ? what's wrong ? Is there a better way to
>internationalize pictures ?

Aha, so presumably the above example you gave was with the two matchers 
already swapped over?  That explains my confusion over {2} and {../2}.  In 
that case, when you had the matchers nested the opposite way round I would 
expect {2} to return the base filename (my_picture) okay, but you would have 
needed to use {../language} for the language code otherwise you are 
referring to a variable set by the wildcard matcher (and the wildcard 
matcher sets no such variable in its map).  Variables aren't inherited by 
nested matchers/actions/etc. as that might make values from outer levels 
inaccessible.  Instead you use "../" as many times as necessary to get back 
out to the right level.

>Thanks for reading me through the end, and thanks in advance for any
>answer, clue or help.
>Thomas Detoux

You're welcome.

--  Open source java Sudoku application

Get Hotmail, News, Sport and Entertainment from MSN on your mobile.

To unsubscribe, e-mail:
For additional commands, e-mail:

View raw message