AS3: Dealing with multi-language data in your application
I'm a big fen of the MVC pattern. I like the idea to store my data in one place and be able to get it fast. In most of my projects I used a class called Storage for similar purpose. It supports a multi-language data saving, so I decided to share it with you.
I prefer to use the Storage class as a static one, so I can access it from anywhere. It has only four methods
and one property:
- addValue(key:String, value:*, language:String = "") - stores value associate with key for language
- getValue(key:String) - gets the value associate with key for the current language
- editValue(key:String, value:*, language:String = "") - edits value associate with key for language
- clear() - clears all the stored values
- language (getter/setter) - get/set the current language
// adding values
Storage.addValue("hello-text", "Hello, dear customers", "english");
Storage.addValue("hello-text", "Здравейте, скъпи клиенти", "bulgarian");
Storage.addValue("hello-text", "Hallo, liebe Kunden", "german");
Storage.addValue("hello-text", "Hola, queridos clientes", "spanish");
// setting the language
Storage.language = "spanish";
// getting the value
trace(Storage.getValue("hello-text"));
// prints "Hola, queridos clientes"
Normally I'm using the Storage class for different types of information. Not only for the text data, but for
urls, application settings and so on. It is obvious that such kind of information is the same for all the languages.
For example:
Storage.addValue("site-url", "http://www.site.com");
Storage.language = "english";
trace(Storage.getValue("site-url"));
Storage.language = "german";
trace(Storage.getValue("site-url"));
The code above will print out:
http://www.site.comhttp://www.site.com
That's because I didn't specify a language in addValue method. I.e. the value http://www.site.com is
associated with key site-url for language = "". The Storage firstly checks if there is a value for the
specific key, which matches the current language. If there is no such kind of record then simply returns the value
associated with the key but with empty language.The class is very useful when you have a multi-language application
and language switcher. What you have to do is to add the texts for all the languages and simply change the
language property.Storage.as:
package {
public class Storage {
private static
var _data: Array;
private static
var _language: String = "";
public static
function addValue(key: String, value: * , language: String = ""): void {
if (!_data) {
_data = [];
}
_data.push({
key: key,
value: value,
language: language
});
}
public static
function getValue(key: String): * {
if (_data) {
var numOfValues: int = _data.length;
for (var i: int = 0; i < numOfValues; i++) {
if (_data[i].key == key && _data[i].language == _language) {
return _data[i].value;
} else if (_data[i].key == key && _data[i].language == "") {
return _data[i].value;
}
}
}
return null;
}
public static
function editValue(key: String, value: * , language: String = ""): void {
if (_data) {
var numOfValues: int = _data.length;
for (var i: int = 0; i < numOfValues; i++) {
if (_data[i].key == key && _data[i].language == language) {
_data[i].value = value;
return;
}
}
Storage.addValue(key, value, language);
} else {
trace("Storage missing _objects !");
}
}
public static
function get language(): String {
return _language;
}
public static
function set language(l: String): void {
_language = l;
}
public static
function clear(): void {
_data = [];
}
}
}