[Seaside] Re: multilanguage

Sebastian Sastre sebastian at flowingconcept.com
Wed Nov 17 13:01:41 UTC 2010


Where do you cache the looked up phrases? in the session or somewhere (shared) else?


On Nov 17, 2010, at 10:50 AM, Levente Uzonyi wrote:

> On Wed, 17 Nov 2010, Sebastian Sastre wrote:
> 
>> Right. Here some points that I think you should have in mind (we did, and went well):
>> - you can't fail. An exception in string will get the image down. That's why  our version has a context wrapping all and capturing an error just to do nothing but return the same string.
> 
> It never failed in the last 2.5 years. :)
> 
>> - Our convention is that a session will take care of the translatable but we didn't assume things about its parent (nor its name) to make it application neutral.
> 
> That's right, our solution is not general in the sense that it has to use subclasses of specialized session and application classes.
> 
>> - We thought about using the context (of the text) to be defined by the component from where that text came but we decided not to do that unless is absolutely necessary. Turns out our lazy guess were right because we still managed to do everything without that (without relinquishing UI expressivity). But if things are going to evolve, something to provide contextual info is the way to go (as you guys did).
> 
> We needed the context, otherwise the translations were wrong.
> 
>> - Caching per session is largely suboptimal. I can't think of a situation where you need to cache translated stuff per session. Try to do that caching per application instead. You should get response times that are "slower" only for the first session. Once warm, everything that comes next for that app should be a lot faster.
> 
> You misunderstood this one or I wasn't clear. The translator objects are shared, but cached in the session. This way we save a dictionary lookup + a few message sends per phrase.
> 
> 
> Levente
> 
>> 
>> sebastian
>> 
>> o/
>> 
>> 
>> 
>> On Nov 17, 2010, at 12:18 AM, Levente Uzonyi wrote:
>> 
>>> On Tue, 16 Nov 2010, Sebastian Sastre wrote:
>>> 
>>>> Okay, here: Multiligual web applications design ala Smalltalk
>>> 
>>> We implemented this a bit differently (in Seaside 2.8). In Squeak String
>>>>> #translated is already used, so we're using #localized as the selector:
>>> 
>>> String >> localized
>>> 
>>> 	| session |
>>> 	(session := WACurrentSession value) ifNil: [ ^self ].
>>> 	^session translator
>>> 		translate: self
>>> 		inContext: session parent name
>>> 
>>> The context is important, because the same phrase may have different translations in different contexts. There's a default context which is used as a fallback during lookup. If a phrase doesn't have a translation in the requested context, the default context is used. There's also String
>>>>> #localizedInContext: which lets you pass a custom context if necessary.
>>> 
>>> There's a global Translator singleton that maps languages to translators (for that language). A translator for a language has a single dictionary which maps context-phrase pairs to their translations. All phrases are in english by default, so there's no lookup if the language is english.
>>> 
>>> The translator objects are cached by the session.
>>> 
>>> The db is looked up every time a translation is missing for a context-phrase pair. If there's a match in the database, then it's stored, otherwise not.
>>> 
>>> Concurrent access is implemented by copy-on-write. This may sound inefficient, but it works well with a few thousand phrases and less than 100 contexts.
>>> 
>>> We also have a decoration which collects translations on the current page. This allows the user (editor) to translate them during viewing. It's implemented with notifications.
>>> 
>>> 
>>> Levente
>>> 
>>> Btw, there's a bug in your blog app. It refreshes every second if there's no session data in the url when a post is viewed.
>>> 
>>>> 
>>>> sebastian
>>>> 
>>>> o/
>>>> 
>>>> 
>>>> On Nov 15, 2010, at 2:17 PM, Pablo Gancharov wrote:
>>>> 
>>>>> Yes me too!
>>>>> 
>>>>> 2010/11/15 <seaside-request at lists.squeakfoundation.org>
>>>>> Send seaside mailing list submissions to
>>>>>      seaside at lists.squeakfoundation.org
>>>>> 
>>>>> To subscribe or unsubscribe via the World Wide Web, visit
>>>>>      http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>>>>> or, via email, send a message with subject or body 'help' to
>>>>>      seaside-request at lists.squeakfoundation.org
>>>>> 
>>>>> You can reach the person managing the list at
>>>>>      seaside-owner at lists.squeakfoundation.org
>>>>> 
>>>>> When replying, please edit your Subject line so it is more specific
>>>>> than "Re: Contents of seaside digest..."
>>>>> 
>>>>> 
>>>>> Today's Topics:
>>>>> 
>>>>> 1. Re: multilanguage (AA)
>>>>> 2. Re: making a read-only checkbox (Gilles Schtickzelle)
>>>>> 3. Re: making a read-only checkbox (Diogenes Moreira)
>>>>> 
>>>>> 
>>>>> ----------------------------------------------------------------------
>>>>> 
>>>>> Message: 1
>>>>> Date: Mon, 15 Nov 2010 12:04:21 +0000
>>>>> From: AA <aa at serendip.demon.co.uk>
>>>>> Subject: Re: [Seaside] multilanguage
>>>>> To: seaside at lists.squeakfoundation.org
>>>>> Message-ID: <20101115120421.d4580e44.aa at serendip.demon.co.uk>
>>>>> Content-Type: text/plain; charset=US-ASCII
>>>>> 
>>>>> Yes, please! I'd love to hear details about how you did this...
>>>>> 
>>>>> Amir
>>>>> 
>>>>> 
>>>>> On Sat, 13 Nov 2010 14:34:25 -0200
>>>>> Sebastian Sastre <sebastian at flowingconcept.com> wrote:
>>>>> 
>>>>>> Hi Carlos,
>>>>>> 
>>>>>> our apps are trilingual and we basically implemented #translated in String to delegate what to do to the session. Then the session decides the destination language and delegates the translation to the polyglot helper we've made.
>>>>>> 
>>>>>> Once you have that, all you need is a little webapp that allows you to edit the phrases of each translation.
>>>>>> 
>>>>>> I can promise you that this is not big deal, maybe I should blog details about it
>>>>>> 
>>>>>> sebastian
>>>>> 
>>>>> 
>>>>> ------------------------------
>>>>> 
>>>>> Message: 2
>>>>> Date: Mon, 15 Nov 2010 12:17:07 +0100
>>>>> From: Gilles Schtickzelle <gschtick at gmail.com>
>>>>> Subject: Re: [Seaside] making a read-only checkbox
>>>>> To: Seaside - general discussion <seaside at lists.squeakfoundation.org>
>>>>> Message-ID:
>>>>>      <AANLkTi=T_Vy-y_h10EsATNUkXEK72VvDevLRZvzsFnqm at mail.gmail.com>
>>>>> Content-Type: text/plain; charset="iso-8859-1"
>>>>> 
>>>>> Ah yes thank you!
>>>>> 
>>>>> I had tried to add a 'disabled: true' but apparently I put it at the wrong
>>>>> place and it wasn't working.
>>>>> Now it's all good thanks.
>>>>> 
>>>>> On Mon, Nov 15, 2010 at 11:51 AM, Nick Ager <nick.ager at gmail.com> wrote:
>>>>> 
>>>>>> Hi Giles,
>>>>>> 
>>>>>> I have a form with a bunch of checkboxes. I want some of them to be
>>>>>>> disabled depending on wether some other are checked or not.
>>>>>>> I just can't figure out how to make a read-only checkbox (so that it would
>>>>>>> still show but would be greyed out).
>>>>>> 
>>>>>> 
>>>>>> Try:
>>>>>> 
>>>>>> html checkbox
>>>>>> value: true;
>>>>>> disabled: true;
>>>>>> with: 'a disabled checkbox'
>>>>>> 
>>>>>> 
>>>>>> #disabled: works for all form elements.
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>>> Is there such a thing in seaside (optimally with jquery so they can be
>>>>>>> updated on the fly when the user check/uncheck a box).
>>>>>>> 
>>>>>> 
>>>>>> html checkbox
>>>>>> id: #myDisabledCheckbox;
>>>>>> value: true;
>>>>>> disabled: true;
>>>>>> with: 'a disabled checkbox'.
>>>>>> html checkbox
>>>>>> value: true;
>>>>>> onClick: ((html jQuery: #myDisabledCheckbox) attributeAt: 'checked' put:
>>>>>> (html jQuery this attributeAt: 'checked'));
>>>>>> with: 'mirror the other checkbox'
>>>>>> 
>>>>>> 
>>>>>> To put this example together I Googled 'jQuery checkbox' - found
>>>>>> http://www.electrictoolbox.com/check-uncheck-checkbox-jquery/ then
>>>>>> translated the result into Seaside jQuery.
>>>>>> 
>>>>>> Hope this helps
>>>>>> 
>>>>>> Nick
>>>>>> 
>>>>>> 
>>>>>> _______________________________________________
>>>>>> seaside mailing list
>>>>>> seaside at lists.squeakfoundation.org
>>>>>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>>>>>> 
>>>>>> 
>>>>> -------------- next part --------------
>>>>> An HTML attachment was scrubbed...
>>>>> URL: http://lists.squeakfoundation.org/pipermail/seaside/attachments/20101115/68ef2694/attachment.html
>>>>> 
>>>>> ------------------------------
>>>>> 
>>>>> Message: 3
>>>>> Date: Mon, 15 Nov 2010 08:53:12 -0300
>>>>> From: Diogenes Moreira <diogenes.moreira at gmail.com>
>>>>> Subject: Re: [Seaside] making a read-only checkbox
>>>>> To: Seaside - general discussion <seaside at lists.squeakfoundation.org>
>>>>> Message-ID:
>>>>>      <AANLkTi=3aFRs-3vDi_m2v119SV527ZU5R++=L49EFGzn at mail.gmail.com>
>>>>> Content-Type: text/plain; charset=ISO-8859-1
>>>>> 
>>>>> Here the net, not only the fish...
>>>>> The next when you need knows a property in a seaside object, take a
>>>>> look to WAHtmlCanvas and WARenderCanvas, in that objects methods
>>>>> seaside builds the htmls components. In your case, in your case the
>>>>> object whon represent to checkbox is WACheckboxTag.
>>>>> Otherwise, if the standars object don't have the properties/messages
>>>>> (that is very extrange, but may be happend) that you need, you can use
>>>>> message attributesAt:put: to set an other properties
>>>>> 
>>>>> Best Regards
>>>>> 
>>>>> 2010/11/15, Gilles Schtickzelle <gschtick at gmail.com>:
>>>>>> Ah yes thank you!
>>>>>> 
>>>>>> I had tried to add a 'disabled: true' but apparently I put it at the wrong
>>>>>> place and it wasn't working.
>>>>>> Now it's all good thanks.
>>>>>> 
>>>>>> On Mon, Nov 15, 2010 at 11:51 AM, Nick Ager <nick.ager at gmail.com> wrote:
>>>>>> 
>>>>>>> Hi Giles,
>>>>>>> 
>>>>>>> I have a form with a bunch of checkboxes. I want some of them to be
>>>>>>>> disabled depending on wether some other are checked or not.
>>>>>>>> I just can't figure out how to make a read-only checkbox (so that it
>>>>>>>> would
>>>>>>>> still show but would be greyed out).
>>>>>>> 
>>>>>>> 
>>>>>>> Try:
>>>>>>> 
>>>>>>> html checkbox
>>>>>>> value: true;
>>>>>>> disabled: true;
>>>>>>> with: 'a disabled checkbox'
>>>>>>> 
>>>>>>> 
>>>>>>> #disabled: works for all form elements.
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>>> Is there such a thing in seaside (optimally with jquery so they can be
>>>>>>>> updated on the fly when the user check/uncheck a box).
>>>>>>>> 
>>>>>>> 
>>>>>>> html checkbox
>>>>>>> id: #myDisabledCheckbox;
>>>>>>> value: true;
>>>>>>> disabled: true;
>>>>>>> with: 'a disabled checkbox'.
>>>>>>> html checkbox
>>>>>>> value: true;
>>>>>>> onClick: ((html jQuery: #myDisabledCheckbox) attributeAt: 'checked' put:
>>>>>>> (html jQuery this attributeAt: 'checked'));
>>>>>>> with: 'mirror the other checkbox'
>>>>>>> 
>>>>>>> 
>>>>>>> To put this example together I Googled 'jQuery checkbox' - found
>>>>>>> http://www.electrictoolbox.com/check-uncheck-checkbox-jquery/ then
>>>>>>> translated the result into Seaside jQuery.
>>>>>>> 
>>>>>>> Hope this helps
>>>>>>> 
>>>>>>> Nick
>>>>>>> 
>>>>>>> 
>>>>>>> _______________________________________________
>>>>>>> seaside mailing list
>>>>>>> seaside at lists.squeakfoundation.org
>>>>>>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>>>>>>> 
>>>>>>> 
>>>>>> 
>>>>> 
>>>>> --
>>>>> Enviado desde mi dispositivo móvil
>>>>> 
>>>>> 
>>>>> ------------------------------
>>>>> 
>>>>> _______________________________________________
>>>>> seaside mailing list
>>>>> seaside at lists.squeakfoundation.org
>>>>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>>>>> 
>>>>> 
>>>>> End of seaside Digest, Vol 95, Issue 30
>>>>> ***************************************
>>>>> 
>>>>> _______________________________________________
>>>>> seaside mailing list
>>>>> seaside at lists.squeakfoundation.org
>>>>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>>>> 
>>> _______________________________________________
>>> seaside mailing list
>>> seaside at lists.squeakfoundation.org
>>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>> 
> _______________________________________________
> seaside mailing list
> seaside at lists.squeakfoundation.org
> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside



More information about the seaside mailing list