Adobe AIR for iOS: Adding custom unsupported language for AppStore [Tutorial]

Share Button

languagepackTime to time I get requests for adding new custom language support in Adobe AIR. Unfortunately, officially you can use only English, Chinese, Czech, Dutch, French, German, Italian, Japanese, Korean, Polish, Portuguese, Russian, Spanish, Swedish and Turkish.

You can use any language inside your app but when you want to see your custom language in Apple AppStore market as supported – you need my help. From my statistics I see that AIR developers mostly required Danish, Hebrew and Norwegian languages as additional. In my own case I need Slovak language support :)

Technically (I don’t know why) all language support is embedded inside AIR SDK binaries and you can’t find simple solution (or I don’t know about it). But you can patch AIR SDK binaries to fix this.

Part 1: Software preparing

This tutorial for Windows users only. Produced patched version of AIR SDK will work on OSX also but patching can be done using Windows according to my tutorial.

First thing that you need it’s obtain latest AIR version. At time of this article it’s AIR 16.0.0.222 from the labs.

javabyteNow you need to download Java Bite software. Unfortunately, official web site don’t work anymore and this disassembler is outdated but still work perfectly! Many times I tried to contact it’s author but without any success so I’m posting link from my dropbox. Also it’s free.

Finally you need to download 7zip archiver. It’s also free to use.

Part2: Patching Adobe AIR SDK binaries

1. Go to Adobe Air SDK\air16_sdk_win\lib and open adt.jar file in 7zip

2. In adt.jar go to com\adobe\air\ and locate ApplicationDescriptor.class file

2014-11-21_031639

3. Extract it somewhere by a simple drag and drop out of jar archive. For ex. drag it to c:\

4. Execute jbloader.exe from JavaByte.zip (link above)

5. Go to Classes menu and select Add Java Class
2014-11-21_0145566. Select ApplicationDescriptor.class file

7. Find your language codes. For example I will add Danish, Hebrew, Slovak and Norwegian. I founded this page really useful with language codes for iOS. So my codes is da, he, sk and nb.

8. Back to disassembler and select Class Tools > Add new constant pool entry > CONSTANT_Utf8

2014-11-21_015606

9. Now add da string and press Ok. Do the same for the rest he, sk, nb

2014-11-21_015731

10. In previous step we created Utf8 constant. Now we must to create a String constant from that Utf8 constant. Go to Class Tools > Add new constant pool entry > CONSTANT_String

2014-11-21_020134

11. Select our first language da Utf8 entry from the end of list and press Ok. Do the same for the rest languages

2014-11-21_020303

12. Now we must to check everything is correct. Press on Constant Pool at the left of Java Byte class explorer and check that you have 4 new Utf8 records and 4 String that was linked to that Utf8

2014-11-21_020857

13. Ok, we almost finished with Java Byte disassembler. Now press on <clinit> entry in Methods entry. You will see disassembled Java virtual machine bytecode

2014-11-21_021459

14. Now we will work with the right side of this window. You must see bipush opcode with value 15. In our case this mean that AIR SDK support 15 language codes. We want to add new 4 language records so totally now we must have 19. Press right mouse button bipush 15 and select Edit instruction from context menu

2014-11-21_021846

15. Now make double-click on 15 value and input 19 instead. Press Ok, Ok and your bytecode window must reloads automatically.

2014-11-21_022208

16. Great! Now we have increased length of array with language strings from 15 to 19

2014-11-21_022351

17. After that we must fill new 4 indexes with some String data. Scroll down this window to position as on image and select last aastore opcode from that Array:

2014-11-21_022851

18. If you check all opcodes above you can understand what we must to do right now :) Right! We going to add new opcodes :)

Press right mouse button on selected aastore opcode and select Add instruction after

2014-11-21_023113

Select dup instruction and press Ok. If you want to know what is dup and the rest opcodes – click here. But you don’t required to know this for small things like we doing here :)

2014-11-21_023520

After each time you editing opcodes – wait for bytecode window refresh so each time you must scroll down to your opcode position. Now you can see that dup was added successfully

2014-11-21_023804

Now select that dup and press again right mouse button, select Add instruction after and insert bipush with 15 value. Than press Ok, Ok and after window refresh – scroll to this opcode

2014-11-21_024201

Now we added second opcode and currently we can see next state

2014-11-21_024552

As you can see – we need to add two new opcodes to finish adding 1 language :) Select bipush 15 > Add instruction after and select ldc_w instruction with String <da> value instead of 1.

2014-11-21_024922

Than press Ok, Ok and you will get this as result. Be careful and select String and not Utf8 because our Array is String typed Array.

2014-11-21_025118

Now we must store added value into the Array. On just added opcode press again mrb (mouse right button) > select Add instruction after and select aastore opcode. Actually you will receive same as on image:

2014-11-21_025405

Using same steps you must add last 3 languages from the list so your new bytecode will be like this:

2014-11-21_030219

Since in Java arrays indexes started from 0 – last language index is 18 and not 19.

Just for checkup - we just added this opcodes:

dup
bipush 15
ldc_w String<da>
aastore

dup
bipush 16
ldc_w String<he>
aastore

dup
bipush 17
ldc_w String<sk>
aastore

dup
bipush 18
ldc_w String<nb>
aastore

19. Now we must save patched ApplicationDescriptor.class. Go to Classes > Save Class and than close Java Byte editor. When you save the class – there is no any popups. But when you close editor – you will see “Save changes to Untitled” dialog. It’s ok, just press No.

2014-11-21_030600

20. Drag back patched ApplicationDescriptor.class to adt.jar at same place where it was located and press Yes when 7zip will ask about archive updating.

P.S. Actually Java Byte it’s Java Bite. But when I downloaded it from it’s authors website long long ago – it’s was called exactly the same as I’m writing here :)

Part 3: Preparing language localization files

1. Back to adt.jar in 7zip and locate folder com\adobe\air\ipa\

2. Drag out en.lproj folder anywhere you can access it

2014-11-21_032216

2014-11-21_0326093. Now you must to create 4 language .lproj folder with our languages using dragged en.lproj as template. You don’t need to translate anything inside that folder. Just leave as is and rename en.lproj to da.lproj, he.lproj, sk.lproj, nb.lproj so you will receive next folders

4. Select this 4 folders and drag they back into opened adt.jar in 7zip. When you dragging new folders – archiver will ask about coping. Press Yes.

Before – After

2014-11-21_033207

5. Now you can close your 7zip. We already done!

Part 4: Using new custom languages

1. Create your AIR app as you doing this usually

2. Open *-app.xml decriptor of your AIR application

3. Add to supportedLanguages section new values also don’t forget about name section and save it :)

2014-11-21_034718

Part 5: Device testing

Compile your app and install it on device. If your device language one from the list above – you will see Name of your app the same as you described in name section of *-app.xml. Also in AppStore market you can see now that languages you just added as supported!

IMG_1308

Flash Professional CC/2014

Users of IDE also can use this hack. Just must to know that custom languages will not appear in Language tab of AIR for iOS Settings panel but still will works because they described in *-app.xml

2014-11-21_035943

Hope this helps :)

Share Button

This Post Has Been Viewed 2,778 Times

3 thoughts on “Adobe AIR for iOS: Adding custom unsupported language for AppStore [Tutorial]

  1. Pingback: Adobe AIR for iOS: Adding custom unsupported la...

    1. TheRabbit Post author

      Hi,

      Thanks for you feedback. Actually I don’t know about Android because I don’t use it for publishing to the Google Play.

      Reply

Leave a Reply

Your email address will not be published.

Blue Captcha Image Refresh

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>