Yes, that's the approach taken for Laszlo Webtop. You have a build.properties
file for the ANT build, where the locale is set:
locale=en-us
Then the ANT compile target looks for a CSS file with that locale:
<target name="compile-app" description="Compile application">
<echo message="tempdir: ${buildlocaletemp.dir}" />
<echo message="Application dir: ${app-basename}" />
<copy file="${basedir}/main.lzx"
tofile="${basedir}/_main.lzx" overwrite="yes" />
<if>
<available file="locale_${localename}.css"/>
<then>
<replaceregexp file="${basedir}/_main.lzx"
match="</canvas>" replace='<stylesheet
src="locale_${localename}.css"/></canvas>' flags="g" />
</then>
</if>
Then the closing </canvas> tag is replaced through a regexp, adding a
<stylesheet src="locale_${localename}.css... But remember, this is Webtop using
4.0.18!!!! No idea how that is handled with a DHTML version of Webtop running
4.3+
You would still have a mechanism for selecting the correct SWF file for each
language. If you have Tomcat, use a servlet filter to detect the locale, have a
look here for some example code:
http://svn.openlaszlo.org/labs/lzproject/trunk/src/org/openlaszlo/lzproject/i18n/I18NFilter.java
I haven't tested if it works to compile a LZO referencing a CSS for different
languages. Someone would have to try that, do you think that will work, Tucker?
Best,
Raju
On Feb 16, 2010, at 8:12 PM, P T Withington wrote:
> I believe Raju is speculating here. Currently, you cannot change your
> stylesheet dynamically at run time. This is a limitation of the CSS
> approach. I believe Raju was saying that where the CSS approach is used, the
> app is compiled (as a SOLO app) for each possible language and the correct
> version is somehow selected by the app server.
>
> On 2010-02-16, at 06:02, cem sonmez wrote:
>
>> Raju has mentioned it before about how to do this.
>> as far as i understand, i think he says that generate swf's for each
>> stylesheet and then use the related swf depend on the language selection, is
>> it right ?
>> If it is, isnT this so laborious, bec. in this case i need to change the
>> stylesheet src in each lzx on my application.
>> Thanks
>> Cem
>>
>> 2010/2/16 cem sonmez <[email protected]>
>>
>>> Today, I have looked at the css page of developer doc [1] and decided to
>>> use the css style:) Bec. it looks more lucid than using dataset.
>>>
>>> my css' are :
>>> *turkish.css*
>>> ---------------------
>>> [text_id="1"] {
>>> string: "giriş";
>>> }
>>> [text_id="2"] {
>>> string: "kaydol";
>>> }
>>> [text_id="3"] {
>>> string: "gönder";
>>> }
>>> *english.css*
>>> ---------------------
>>> [text_id="1"] {
>>> string: "login";
>>> }
>>> [text_id="2"] {
>>> string: "register";
>>> }
>>> [text_id="3"] {
>>> string: "submit";
>>> }
>>>
>>> and i use one of it in my class like
>>>
>>> <canvas debug="true">
>>> <stylesheet src="turkish.css"/>
>>> <simplelayout />
>>> <button>change css
>>> <handler name="onclick">
>>> * <!--how to change the stylesheet here during runtime-->*
>>> </handler>
>>> </button>
>>> <button text="$style{'string'}">
>>> <attribute name="text_id" value="3"/>
>>> </button>
>>> </canvas>
>>>
>>> as i commented in the canvas code, is it possible to change the stylesheet
>>> src during runtime?
>>> Thanks in advance
>>>
>>> [1] - http://www.openlaszlo.org/lps4.7/docs/developers/css.html
>>>
>>>
>>> Cem
>>>
>>> 2010/2/16 P T Withington <[email protected]>
>>>
>>>> I never get datasets myself. Just to verify that the CSS way works, I did
>>>> test the following:
>>>>
>>>> <canvas layout="axis: y; spacing: 5">
>>>> <stylesheet>
>>>> i18nbutton[name='submit'] { text: "gönder"; }
>>>> i18nbutton[name="reset"] { text: "reset"; }
>>>> </stylesheet>
>>>>
>>>> <class name="i18nbutton" extends="button">
>>>> <attribute name="text" style="text" />
>>>> </class>
>>>>
>>>> <i18nbutton name="submit" />
>>>> <i18nbutton name="reset" />
>>>>
>>>> </canvas>
>>>>
>>>> and it works for me.
>>>>
>>>> On 2010-02-15, at 19:01, cem sonmez wrote:
>>>>
>>>>> i am sorry, maybe this thread has become so long bec. of me but donT
>>>>> understand why this happens
>>>>>
>>>>> <canvas>
>>>>> <dataset name="localized">
>>>>> <string name="submit" value="gönder"/>
>>>>> <string name="reset" value="reset"/>
>>>>> </dataset>
>>>>>
>>>>> <button text="$path{'localized:/stri...@name=\'submit\']/@value'}" />
>>>>>
>>>>> </canvas>
>>>>>
>>>>> I am just trying this code and see nothing.
>>>>>
>>>>> Cem
>>>>>
>>>>> 2010/2/16 P T Withington <[email protected]>
>>>>>
>>>>>> The value of the expression in the $path{} statement needs to be a
>>>> string,
>>>>>> so I think you would need to say:
>>>>>>
>>>>>> <button text="$path{'localized:/stri...@name=\'submit\']/@value'}"
>>>>>>
>>>>>> but I have not tested this.
>>>>>>
>>>>>> On 2010-02-15, at 18:38, cem sonmez wrote:
>>>>>>
>>>>>>> jamesr, I have used your same notation, but i m getting error
>>>>>>> *Syntax error: the token ":" was not expected at this position.*
>>>>>>> I have made lots of changes at the $path expression. Still nothing
>>>>>> happens
>>>>>>> Another error that i m getting
>>>>>>> *Lexical error. The source location is for the element that contains
>>>> the
>>>>>>> erroneous script. The error may come from an unterminated comment.*
>>>>>>> Do you have an idea why this happens? Did you used this code snippet
>>>>>> before
>>>>>>> you post it?
>>>>>>> And also does anyone have an idea about this issue?
>>>>>>>
>>>>>>> Regards
>>>>>>> Cem
>>>>>>>
>>>>>>> 2010/2/15 cem sonmez <[email protected]>
>>>>>>>>
>>>>>>>> Yes i have seen $path before, but i have never used it for any
>>>>>> constraint.
>>>>>>> $path usage has been explained well at [1].
>>>>>>>> I will take a look at it again and try this form.
>>>>>>>> Thanks a lot
>>>>>>>> Cem
>>>>>>>>
>>>>>>>> [1] -
>>>>>>>
>>>>>>
>>>> http://www.openlaszlo.org/lps4.7/docs/developers/databinding.html#d0e96468
>>>>>>>>
>>>>>>>>> 2010/2/15 jamesr <[email protected]>
>>>>>>>>>>
>>>>>>>>>> Sure! as PT mentioned, there may be overhead for using the $path
>>>>>> method
>>>>>>> i'll direct you toward, for very large applications. There are a few
>>>>>>> manager/registry based ways around this overhead, no problem, but the
>>>>>>> conversation is out of scope to your direct question to get into -- in
>>>>>> this
>>>>>>> email.
>>>>>>>>>>
>>>>>>>>>> Have you ever used the $path{} form of constraints? they take a
>>>>>>> dataset:datapath pair and bind to a specific location in a dataset,
>>>> which
>>>>>>> will update when the dataset changes. From your code snippets i'm
>>>>>> guessing
>>>>>>> you haven't seen them.
>>>>>>>>>>
>>>>>>>>>> if you have a dataset thus,
>>>>>>>>>>
>>>>>>>>>> <dataset name="localized">
>>>>>>>>>> <string name="submit" value="(submit in another language)"/>
>>>>>>>>>> <string name="resest" value="(reset in another language)"/>
>>>>>>>>>> </dataset>
>>>>>>>>>>
>>>>>>>>>> then you can set up a path constraint by saying,
>>>>>>>>>>
>>>>>>>>>> <button text="$path{localized:/stri...@name='submit']/@value}"
>>>>>>>>>>
>>>>>>>>>> and this will *find* the string node with name "submit" (be sure to
>>>>>> have
>>>>>>> unique names or you'll get mulitple nodes back and the expression will
>>>> be
>>>>>>> invalid) and use its value attribute as the text for the button.
>>>>>>>>>>
>>>>>>>>>> more info is in the laszlo docs... i don't have a link to it handy,
>>>>>>> sorry
>>>>>>>>>>
>>>>>>>>>> -j
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> cem sonmez wrote:
>>>>>>>>>>>
>>>>>>>>>>> Thanks all for your replies.
>>>>>>>>>>> But i just can say that i am inexperienced about css. So all along
>>>> i
>>>>>>> have thought to use dataset. The problem is to change the texts
>>>>>> dynamically
>>>>>>> when i set the datapath's src attribute during runtime.
>>>>>>>>>>> But as you said ptw, itS more about skinning, css is more
>>>> convenient
>>>>>> to
>>>>>>> use. I will look at it as well.
>>>>>>>>>>> For the dataset usage. It may looks like :
>>>>>>>>>>>
>>>>>>>>>>> <dataset name="dset" src="words.xml" />
>>>>>>>>>>> <datapointer id="dpointer" xpath="dset:/language">
>>>>>>>>>>> <method name="getMessage" args="textId">
>>>>>>>>>>> this.setAttribute('xpath', 'dset:/language');
>>>>>>>>>>> this.selectChild();
>>>>>>>>>>> do {
>>>>>>>>>>> if (this.xpathQuery('@id') == textId) {
>>>>>>>>>>> var message = this.xpathQuery('value/text()');
>>>>>>>>>>> if ($debug)
>>>>>>>>>>> Debug.write("datapointer : " + message);
>>>>>>>>>>> return message;
>>>>>>>>>>> }
>>>>>>>>>>> } while (this.selectNext());
>>>>>>>>>>> </method>
>>>>>>>>>>> </datapointer>
>>>>>>>>>>>
>>>>>>>>>>> and i also can use it
>>>>>>>>>>> <button name="button1" text="${dpointer.getMessage(1)}" />
>>>>>>>>>>>
>>>>>>>>>>> I havenT just tried, but the problem is going to occur when i want
>>>> to
>>>>>>> change the dataset src at runtime. jamesr, the way that u mentioned
>>>> likes
>>>>>>> mine. Can you instruct a bit more please.
>>>>>>>>>>>
>>>>>>>>>>> thanks all again .
>>>>>>>>>>> Kind regards
>>>>>>>>>>> Cem
>>>>>>>>>>>
>>>>>>>>>>> 2010/2/15 P T Withington <[email protected] <mailto:[email protected]>>
>>>>>>>>>>>
>>>>>>>>>>> Using a dataset is an equally valid approach, but I think it was
>>>>>>>>>>> tried and found to require too much overhead. Of course, if CSS
>>>>>>>>>>> is made dynamic, perhaps it will have equivalent overhead.
>>>>>>>>>>>
>>>>>>>>>>> Perhaps the reason some people think of CSS first is because it
>>>>>>>>>>> seems i18n is like "skinning" or styling your app.
>>>>>>>>>>>
>>>>>>>>>>> On 2010-02-15, at 12:09, jamesr wrote:
>>>>>>>>>>>
>>>>>>>>>>>> Would it not be more expedient to write a class, called perhaps
>>>>>>>>>>> localtext, that takes a single field to index inside of a dataset
>>>>>>>>>>> wherein a given real-world language sentence is kept, so that by
>>>>>>>>>>> changing datasets you change all displayed localized text?
>>>>>>>>>>>>
>>>>>>>>>>>> Why use CSS?
>>>>>>>>>>>>
>>>>>>>>>>>> P T Withington wrote:
>>>>>>>>>>>>> There are two improvements targeted for 5.0 that will help this
>>>>>>>>>>> situation:
>>>>>>>>>>>>>
>>>>>>>>>>>>> LPP-8556 Add default CSS style properties to <view>
>>>>>>>>>>>>> LPP-7359 Make CSS attribute selectors dynamic
>>>>>>>>>>>>>
>>>>>>>>>>>>> There should also be one to make it so you can load a
>>>>>>>>>>> stylesheet at runtime, but I can't seem to find that. Maybe Max
>>>>>>>>>>> and I only talked about it...
>>>>>>>>>>>>>
>>>>>>>>>>>>> With all three of those, it should be possible to have a single
>>>>>>>>>>> app that will be localized when it is loaded. For now, you are
>>>>>>>>>>> correct, you need to compile your app for each language.
>>>>>>>>>>>>>
>>>>>>>>>>>>> ---
>>>>>>>>>>>>>
>>>>>>>>>>>>> With LPP-7184 Binary libraries don't work in swf9 resolved (and
>>>>>>>>>>> integrated to 4.7), we believe that LZO's are now fully supported
>>>>>>>>>>> in swf9 for 4.7.1 (soon to be released) and 5.0.x (in
>>>>>>>>>>> development). We'd welcome testing by anyone who needs this
>>>>>>>>>>> feature. Grab the latest 4.7.1 here:
>>>>>>>>>>>>>
>>>>>>>>>>>>> http://download.openlaszlo.org/nightly/4.7/
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> On 2010-02-15, at 11:39, Raju Bitter wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>> All the internationalization based on CSS for Webtop (at least
>>>>>>>>>>> with
>>>>>>>>>>>>>> the version I've used) requires you to recompile the app for a
>>>>>>>>>>>>>> different language. That's not too much of a problem, just
>>>>>>>>>>> generate
>>>>>>>>>>>>>> different versions of the app for different languages.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> It would be good to have dynamic CSS support at runtime, but a
>>>>>>>>>>>>>> workaround could be to put all the strings into an LZO, with
>>>>>>>>>>> different
>>>>>>>>>>>>>> LZOs for different languages. That should work, shouldn't it?
>>>> Of
>>>>>>>>>>>>>> course you are limited to SWF8 and DHTML then, since there's
>>>>>>>>>>> still no
>>>>>>>>>>>>>> support for LZOs with AS3 based runtimes, as far as I know.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> 2010/2/15 P T Withington <[email protected] <mailto:[email protected]
>>>>>> :
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> I believe some use CSS styles to achieve
>>>>>>>>>>> internationalization, although currently LZX does not support
>>>>>>>>>>> dynamically changing styles, so I'm not sure exactly how this is
>>>>>>>>>>> handled. Currently, styles need to be pre-processed by the
>>>>>>>>>>> compiler. Ideally, you would have your application server
>>>> looking
>>>>>>>>>>> at the browser request language preference and serve up different
>>>>>>>>>>> style sheets based on that. It may be that people are using a
>>>>>>>>>>> .jsp to do this kind of dispatching.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> In theory, you would write something like:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> <!-- supply style sheet based on browser language -->
>>>>>>>>>>>>>>> <stylesheet>
>>>>>>>>>>>>>>> i18ntext [label="hi"] { text: "hello" }
>>>>>>>>>>>>>>> </stylesheet>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> <class name="i18ntext" extends="text">
>>>>>>>>>>>>>>> <attribute name="label" type="string" />
>>>>>>>>>>>>>>> <attribute name="text" style="text" />
>>>>>>>>>>>>>>> </class>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> <i18ntext label="hi" />
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> [...]
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> --
>>>>>>>>>>> Cem SONMEZ
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> Cem SONMEZ
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> Cem SONMEZ
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Cem SONMEZ
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Cem SONMEZ
>>>>
>>>>
>>>
>>>
>>> --
>>> Cem SONMEZ
>>>
>>
>>
>>
>> --
>> Cem SONMEZ
>
>