Welcome!

Adobe Flex Authors: Liz McMillan, RealWire News Distribution, Maureen O'Gara, Yakov Fain, Keith Swenson

Related Topics: Adobe Flex, Java, ColdFusion, AJAX & REA

Adobe Flex: Article

Internationalizing Adobe Flex Apps

One of the many features available in Flex 2.0 is a ResourceBundle class

One of the many features available in Flex 2.0 is a ResourceBundle class, which allows for a standardized approach for internationalizing applications. Many recent projects of mine have required that applications be built that can easily be ported to other languages. Traditionally, I've used a series of XML files for this, one for each of the various languages that need to be supported. This strategy is still viable, and I still use it on some of my projects. However, I've recently discovered a different approach, which is available natively in Flex. Flex provides a ResourceBundle class, which allows you to set up your text in properties files (the identical structure that you would use for internationalizing Java applications). These properties files are arranged in a folder structure, relating to the language and country, so the properties file for US English would be in a folder called en_US, the file for the UK would be en_UK, while the French would be in fr_FR. The structure of the files is very simple; they look like this:

hello = Hello World
welcome = Welcome!

Or, in the French version:

hello = Bonjour Monde
welcome = Bienvenue

To use these in an application, you have two options: you can use the @Resource command each time you need a value, or you can declare a variable for the ResourceBundle and use the getString(), getNumber(), getBoolean(), etc., methods. In Listing 1, you can see both being used. In this example, the top label uses the @Resource directive to specifically pull the hello key from the helloWorld bundle. If the application is compiled for en_US, that key will show "Hello World," compile the same app for fr_FR, and read "Bonjour Monde."

The remaining trick is to tell the compiler which language to use, and where to find the files. You can do this from the command line like this:

   mxmlc -locale en_UK -sp ../locales/{locale} -o HelloWorld_en_UK.swf I18N_HelloWorld.mxml

   mxmlc -locale fr_FR -sp ../locales/{locale} -o HelloWorld_fr_FR.swf I18N_HelloWorld.mxml

Or, you can specifiy compiler arguments in Flex Builder:

-locale en_US -sp ../locales/{locale}

Now let's explore how you can use XML files as an alternative to this. We will explore the use of multiple instances of the ResourceBundle class to allow for runtime switching of locales.

As we have already discussed, the native use of the ResourceBundle class requires separate compiled SWFs for each language. This is not always desirable, and there are times when you may want to allow for switching of languages at runtime. One strategy I've used successfully for this is to trick the Flex compiler and have several different properties in the same locale folder, and to create separate instances of the ResourceBundle class for each of them. This way, it's a fairly simple process to determine what the current locale is, and to pull the labels from that ResourceBundle.

To start, I took three properties files and placed them in a single directory. Listing 2 is a simple example of how to get it working.

I named each file based on the language it was there to support (helloWorld_fr.properties, helloWorld_uk.properties, helloWorld_us.properties). Notice that there is ResourceBundle instance for each of the three files. I've also added some simple functions to get the data from these files (geti18nText, geti18nDate). Keep in mind, this is a simplistic example. In real world apps, I tend to have a singleton responsible for embedding and retrieving the data from the files. But, even in this simple case, you can see the power of it - switching the selected language in the combo box instantly translates the labels and dates to the appropriate format.

Remember to add a compiler argument to specify the proper directory for the locale files. In my case, all three files were in a locales/multi directory, so I added the argument:

-sp ../locales/multi

Look for the follow-up parts to this article in the next issue of Web Developer's & Designer's Journal.

More Stories By Jeff Tapper

Jeff Tapper, co-founder of Tapper, Nimer and Associates, is an Editorial Board member of Web Developer's & Designer's Journal. He has been developing Internet-based applications since 1995, for a myriad of clients including Toys R Us, IBM, Allaire, Dow Jones, American Express, M&T Bank, Verizon, Allied Office Supplies, and many others. As an Instructor, he is certified to teach all of Adobe's courses on Flex, ColdFusion and Flash development. He has worked as author and technical editor for several books on technologies including Flex, Flash and ColdFusion, such as "Object Oriented Programming with ActionScript 2.0", and "Flex 2 Training from the Source."

Comments (0)

Share your thoughts on this story.

Add your comment
You must be signed in to add a comment. Sign-in | Register

In accordance with our Comment Policy, we encourage comments that are on topic, relevant and to-the-point. We will remove comments that include profanity, personal attacks, racial slurs, threats of violence, or other inappropriate material that violates our Terms and Conditions, and will block users who make repeated violations. We ask all readers to expect diversity of opinion and to treat one another with dignity and respect.