Skip to content

Instantly share code, notes, and snippets.

@jasonkneen
Last active November 27, 2018 07:12
Show Gist options
  • Star 9 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jasonkneen/5283642701575ec3fcbd to your computer and use it in GitHub Desktop.
Save jasonkneen/5283642701575ec3fcbd to your computer and use it in GitHub Desktop.
Dynamically change languages in a Titanium Alloy app (for testing)
// add this to the Alloy.js file
// Set to run in ENV_DEV mode so it's used for testing withou
// having to change languages on device etc
// NO checks in place so assumes you know what you're doing, have
// the relevant strings files and specify the correct one!
// should work on Android - not tested yet!
if (ENV_DEV) {
Alloy.Globals.setLanguage = function(lang) {
lang = lang || "en";
var file = Ti.Filesystem.getFile(Ti.Filesystem.resourcesDirectory, lang + '/strings.xml'),
doc = Ti.XML.parseString(file.read().toString()),
nodes = doc.getElementsByTagName('string'),
strings = {};
for (var i = 0; i < nodes.length; i++) {
strings[nodes.item(i).getAttribute('name')] = nodes.item(i).text;
};
W = L;
// redefine L - NOT ideal but necessary to test
// languages without affecting existing code
L = function(key) {
return strings[key];
};
};
Alloy.Globals.setLanguage();
}
@jasonkneen
Copy link
Author

Feel free to pretty it up, suggest fixes etc - This was a quick workaround I needed to be able to switch languages when using TiShadow to test layouts

@jasonkneen
Copy link
Author

Doesn't work in Android. yet ;)

@Baharroth
Copy link

Hi.
This is a code who working with IOS 7 and Android 4.4.
http://pulkitgoyal.in/managing-multiple-languages-with-appcelerator-titanium/

Warning : Since sdk 3.5.0, you can't override L() ! It's annoying for me.

Little trick : check the path of your ressource file. Not the same between iOS 7 and Android with sdk 3.2.2

@john-dalsgaard
Copy link

I think the reason it does not work on Android is that you need to use nodes.item(i).textContent instead of nodes.item(i).text (which is deprecated - and does not work on Android according to the documentation).

I had the same issue in my snippet - but it is now working on Android as well: https://github.com/john-dalsgaard/Alloy/blob/master/language.js

@ketikutateladze
Copy link

ketikutateladze commented Nov 27, 2018

I think the reason it does not work on Android is that you need to use nodes.item(i).textContent instead of nodes.item(i).text (which is deprecated - and does not work on Android according to the documentation).

I had the same issue in my snippet - but it is now working on Android as well: https://github.com/john-dalsgaard/Alloy/blob/master/language.js
@john-dalsgaard Thank You. This helped me in Titanium sdk 7.0.0 (android version)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment