I tried out your example code. And I'm unable to reproduce any improper
caching by Cocoon.
I do occasionally see the previous language displayed when clicking the
link to the other test page after a locale switch. But in all these
cases it's due to client-side caching; I can verify this because (1) the
Cocoon log shows either no requests or just the first request in the
case of the redirect-to, and because (2) a hard-refresh (Ctrl-Shift-R in
Firefox) to force a server reload always shows the correct language.
One exception to this: a normal refresh (Ctrl-R) sometimes hits the
server and an access log entry is written, but the content is still not
updated. Oh my! But actually it turns out this is still due to
client-side caching, because the browser is just issuing an
If-Modified-Since request and gets a "304 Not Modified" response back.
This is easily verified by watching the headers with the LiveHTTPHeaders
Firefox extension. As soon as the browser issues a request without the
If-Modified-Since header the new content is downloaded and displayed.
Now, this last case may seem wrong at first glance, since you'd think
that Cocoon should not respond with a HTTP 304 since the locale has
changed. But as far as Cocoon is concerned it *hasn't* changed, since
it (meaning the current pipeline cache key, complete with the current
locale) was cached a while ago. So actually it's perfectly correct for
Cocoon to return a 304 if the browser asks for it.
I hope this helps explain what you're seeing. In terms of how to work
around it, I suppose you could try setting HTTP response headers (e.g.
with the set-header action) to prevent browser caching, since that seems
to be the root of the problem. I'm not sure what headers those would
need to be. Let us know if you figure it out, or if you disagree with
any of my assessment.
--Jason
Yves Zoundi wrote:
Hi everybody,
There is really a bug with the i18ntransformer! If you thing I'm doing
something wrong with the code below please help!
My test scenario
-----------------------------
I used an unmodified build of cocoon, no custom exclusions of some
blocs. I checked again my code based on the samples : copy and paste.
Guess wwhat? It doesn't work! I am pretty sure about my code, nothing
special straight from the samples.
I modified the welcome.xml file to include some i18n:text and I created
a test.html file with some i18n keys. I used the configuration from the
i18n samples and I believe there is a bug with the i18ntransformer.
I only used the root sitemap.xmap.
* Here are the relevant parts of the sitemap.xmap
...
<map:transformer name="i18n" logger="sitemap.transformer.i18n"
src="org.apache.cocoon.transformation.I18nTransformer">
<catalogues default="messages">
<catalogue id="messages" name="messages" location="translations"/>
<catalogue id="menu" name="menu" location="translations"/>
<catalogue id="tiered" name="messages">
<location>translations/tiered</location>
<location>translations</location>
</catalogue>
</catalogues>
<cache-at-startup>true</cache-at-startup>
</map:transformer>
...
<map:action name="locale" logger="sitemap.action.locale"
src="org.apache.cocoon.acting.LocaleAction">
<!-- Creates a new session if needed. Used with 'store-in-session'
param -->
<create-session>true</create-session>
<!-- Stores locale information in session. A session should be
created before,
otherwise 'create-session' should be true.
-->
<store-in-session>true</store-in-session>
<!-- Stores locale information in request attributes -->
<store-in-request>true</store-in-request>
<!-- Stores locale information in a client cookie -->
<store-in-cookie>false</store-in-cookie>
<default-locale language="en" country="US"/>
</map:action>
...
<!-- main pipeline -->
<map:pipeline type = "caching">
<map:act type = "locale">
<map:match pattern = "index.html">
<map:redirect-to uri = ""/>
</map:match>
<map:match pattern = "status.html">
<map:generate type = "status"/>
<map:transform src = "stylesheets/system/status2html.xslt"/>
<map:serialize type = "html"/>
</map:match>
<map:match pattern = "test.html">
<map:generate src = "test.html"/>
<map:transform type = "i18n">
<map:parameter name="locale" value="{../locale}"/>
</map:transform>
<map:serialize type = "html"/>
</map:match>
<!-- welcome page -->
<map:match pattern="">
<map:generate src="welcome.xml"/>
<map:transform type = "i18n">
<map:parameter name="locale" value="{../locale}"/>
</map:transform>
<map:transform src="welcome.xslt">
<map:parameter name="contextPath" value="{request:contextPath}"/>
</map:transform>
<map:serialize type="xhtml"/>
</map:match>
</map:act>
...
...
Here are the original welcome.xml(customized) and test.html files
*welcome.xml
<?xml version="1.0" encoding="UTF-8"?><!--
<welcome xmlns:i18n="http://apache.org/cocoon/i18n/2.1">
<message>
<p><i18n:text>francais</i18n:text></p>
<p><i18n:text>anglais</i18n:text></p>
<p><a href = "test.html">test</a></p>
Congratulations! If you are reading this page, it means that
your Apache Cocoon installation was successful.
</message>
<message id="samples">
To know more about Cocoon capabilities, look at the <link
href="samples/">samples</link>
</message>
</welcome>
* test.html
<html xmlns:i18n="http://apache.org/cocoon/i18n/2.1">
<head><title>test</title></head>
<body>
<p><i18n:text>francais</i18n:text></p>
<p><i18n:text>anglais</i18n:text></p>
<p><a href = "index.html">home</a></p>
</body>
</html>
* messages_en_US.xml
<catalogue xml:lang="en_US">
<message key="anglais">english</message>
<message key="francais">french</message>
</catalogue>
* messages_fr_FR.xml
<catalogue xml:lang="fr_FR">
<message key="anglais">anglais</message>
<message key="francais">francais</message>
</catalogue>
* messages.xml
<catalogue xml:lang="fr_FR">
<message key="anglais">anglais</message>
<message key="francais">francais</message>
</catalogue>
The catalogs are simple with only 2 keys.
I am switching the languages by manually appending a request parameter
?locale=fr_FR or ?locale=en_US to the current URL. Sometimes when I
navigate between index.html and test.html, I see that the locale is not
updated, Cocoon is serving the cache without analysing the session locale.
I tried using the session-attribute generator to see if the locale was
updated and It is. The cocoon status shows me that the catalog are in the
cache and the cache keys of the pages(i18ntransformer cache keys) seem all
right. The keys seem unique for a request.
Thanks in advance.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]