Expand my Community achievements bar.

localization in fds

Avatar

Level 2
I've managed to get localization working on a non fds flex
app using the command line mxmlc compiler. That took a while in
itself. Now I'm trying to do the same thing using fds. I've enabled
the locale en-US in the flex-config.xml file and restarted the
server. But when I go to run the app in flexbuilder I get this
message:

Multiple symbols named
'C:\fds2\jrun4\servers\default\samples\DSLessons\Bob.mxml'.

I have several files in play here:

Bob.mxml

locale/en_US/Bob.properties

locale/fr_FR/Bob.properties

I can get the same app to work not using fds. However I have
no control over command line parameters for the compiler since this
is handled by fds (from what I've been able to tell)

I know the code itself and the file/folder layout is fine
too. But there's little to no documentation on localization to
begin with, and I haven't found anything implementing this on FDS2.

I've tried adding the locale and/or the locale/en_US paths to
the run... options | source but that didn't work either.

I've also copied the contents of the en_US folder to a fr_FR
folder in the frameworks/locale folder (that got my basic app
working!)



Please help!
8 Replies

Avatar

Level 1
Hi, I'm not exactly sure why you are getting this error
message. Can you try changing the name of your resource bundle? So
change 'Bob' to 'BobRB' in Bob.mxml and then rename these files:



locale/en_US/Bob.properties

locale/fr_FR/Bob.properties



to:





locale/en_US/BobRB.properties

locale/fr_FR/BobRB.properties



Doing this may get rid of the error, but I'm guessing you'll
actually still have a problem. I think you may be running into an
existing issue with Flex Builder that's just showing up in a new
form. Here's the Flex Builder bug:



Flex Builder can show an error after updating a properties
file. You'll know you are encountering this problem if you see an
"Unable to resolve a class for ResourceBundle" error where the
class mentioned ends with "_properties". Clean the project in order
to remove the error.



So if you get this new error after renaming the properties
file, you're just going to have to live with this problem for the
moment. Sorry- it will be fixed in the next release.

Avatar

Level 2
hmm, ok let's dumb it down a bit. forget flex builder. ( i
renamed the properties several times before I posted this... it
made no difference)



using just fds and notepad.exe...



what do i need to do to create a simple mxml application
hosted in fds that uses a resource file.

It would be great if you could use the sample files from the
flex dev guide (page 790), but with an fds slant.

so...

I want the languages included to be fr_FR and en_US

I want just a simple mxml app that does hello world using a
resource string.



I'd like to know what changes have to be made to the flex
config files on fds to tell it which language to use.



this is critical to our application. We do realize the
language cannot be changed at runtime, however I think from what
I've read, that we can put different language versions in seperate
app folders on the fds server, which is fine.



I really appreciate the help.



Victor





Avatar

Level 2
Ok I followed my own advice and started over and after a
little bit of tweaking I got it working. Here's how.



To create a working flex app hosted on fds2 we'll use the
existing samples folder:



Step 1. Set the locale and add the path

In samples/web-inf/flex/flex-config.xml uncomment out the
locale parameter:

<!-- Specifies the locale for internationalization.
-->

<!-- not set -->

<!-- -->

<locale>en_US</locale>



and under source-path specify location of locale files:

<source-path>


<path-element>../../LocalApp/locale/{locale}</path-element>

</source-path>



Ste 2. Create the sample app

Create folder under samples called LocalApp

In here create a file called Myapp.mxml which contains the
following code:



<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx="
http://www.adobe.com/2006/mxml"
layout="absolute">

<mx:Label text="@Resource(key='hello',
bundle='Myapp')"/>

</mx:Application>



Step 3. Create the locale resource files



Create a folder in LocalApp folder called locale

In the locale folder create 2 folders called en_US and fr_FR

In each of these folders create a file called
Myapp.properties

In each of these files add the line: hello=Hello WOrld! and
hello=Salut le Monde (respectively)



step 4. Run the app

Make sure fds is running

Open browser and enter the address:




http://localhost:8700/samples/LocalApp/Myapp.mxml?recompile=true



recompile=true is important if you want to change the
flex-config.xml locale to fr_FR or

modify the resource string files.

Default behavior seems to be some serious caching which even
a fds restart won't fix.



Step 5. Change locale, refresh browser

Open flex-config.xml and change the local parameter to fr_FR

Save, then refresh browser.

Avatar

Level 1
Glad to hear it's working now! Can you tell me what you were
doing when it wasn't working? I just want to make sure we enter any
bugs if there are any here. It is very strange that you have to use
"recompile=true", and that sounds like one bug.

Avatar

Level 2
The initial reason I couldn't get it to work is because I did
not set a source-path variable that pointed to the locale/{locale}
folder in the flex-config.xml - this was causing the rather obscure
multiple symbols error.



As far as what might be an actual bug, well... in the Flex
Build and Deploy.pdf on page 92, second last bullet point, it
states:

"Invalidate all items in the client cache by making a change
to the flex-config.xml file and

saving it. This file stores all the options that the web-tier
compiler uses. When the file

changes, Adobe Flex Data Services recompiles the application
SWF file the next time the

MXML file is requested."



I did not experience this. No matter what changes I made to
flex-config.xml, the locale never changed.

Steps to reproduce:

1. Start FDS

2. Open the localization application in a browser without any
querystring parameters.

3. Note the language of the hello world label.

4. Open the flex-config.xml and change the locale to the
other one, i.e. from en_US to fr_FR

5. Save the flex-config.xml and refresh the browser

6. Note the language has not changed to new locale

7. Stop FDS and restart FDS

8. Refresh the browser, language should still be the same

9. Close the browser and reopen to same page. Language still
the same.

10. Add the querystring ?recompile=true to the browser
address

11. You will notice the app takes longer to load... and the
locale will now be correct.



I found out about the recompile=true parameter in the same
pdf, on page 93, second paragraph.



Hope that helps.



Victor

Avatar

Level 2
More information...



There's a flex-webtier-config.xml file that contains the
following section:



<!-- specifies whether or not to use incremental compile
-->

<!-- with incremental compile is true, when an mxml
document is requested,

only that file and dependent files which have changed will
recompiled.

with incremental compile is false, when an mxml document is
requested,

that file and all dependent files are recompiled. -->

<incremental-compile>true</incremental-compile>



The default out of the box setting is true. If I change it to
false I no longer need the ?recompile=true argument.



Avatar

Level 1
Hi Victor, thanks for the information. That is definitely
helpful. I know we've fixed one issue with incremental compilation
and resource bundles after the release, but I'll enter this as a
bug as well so that we're sure it's fixed for the next
release.

Avatar

Level 2
Someone sent me a private message the other day and I'm going
to post my reply in here for anyone else that might stumble upon
this. Also, in case I'm wrong one of you adobe guru's can correct
me :)



A multi-language flex app:



Basically, you have to indicate which language you wish to
use at compile time. So if you wish to support 3 languages, you
will need to define 3 locales - and then compile 3 swf files and
then use an html/javascript wrapper to detect browser
region/language and then redirect the user to their respective swf.



When you create a project in flex you have 3 options - basic,
fds with server compile and fds with flexbuilder compile.



In a basic app you can access the compiler command arguments
by going to project properties and selecting Flex Compiler. You
will see the words -locale en_US . To compile your basic app with a
different language, change this line to something like -locale
fr_FR.



In a fds project where flexbuilder does the compiling (
compile application locally..) you have access to the compiler
arguments in the exact same place as a basic project.



In an fds project that is compiled on the server, Flexbuilder
no longer has any control over the compiler arguments... This is
the only time the flex-config.xml determines what the compile
arguments will be. That's why the Flex Compiler screen is greyed
out in Flexbuilder. Again you would change the locale tag to the
one you want i.e. fr_FR in flex-config.xml and then compile.



As far as folders goes.. for fds applications... you would
reference the string using this syntax:

<mx:Label text="@Resource(key='hello',
bundle='Localization')"/>

Then you would create the correpsonding resource file in a
subfolder called locale\fr_FR\Localization.properties with a list
of strings formatted like:

hello=Hello World!!

Finally, you would need to make a copy of the
web-inf\flex\locale\en_US folder in web-inf\flex\locale\fr_FR