7

I have an android app and I want to translate to Serbian and I want both variants of the language: with Latin letters and with Cyrillic letters. I tried this variants: value-sr-rRS-Latn , value-sr-Latn , value-sr-rRS-Cyrl , value-sr-Cyrl but not of that is working. I get this error: android-apt-compiler: [NAMEOFAPP] invalid resource directory name: [path]\res/value-sr-rRS-Latn

On Android documentation about res dirs and Locale I can't find this option.

Can I make 2 dirs with 2 variants of the language? And how?

Thank you

Daniel Dudas
  • 2,972
  • 3
  • 27
  • 39
  • If you open Phone Settings -> Language & Input, there is only 1 serbian language and it is cyrillic. How are users supposed to choose the alphabet? They can't do this by using the phone settings. – vortexwolf Mar 20 '13 at 09:29
  • @vorrtex I want to make posible to change language in the app settings . And in the app I want to have a language (even phone is in other language). I know how to change the language in the app, but I don't know how to include 2 versions of the same language. – Daniel Dudas Mar 20 '13 at 13:06
  • If you use your own settings, then you should manage files yourself somehow. Maybe to store them in the data storage and rewrite all strings dynamically, but it doesn't seem to be easy. – vortexwolf Mar 20 '13 at 13:50

2 Answers2

6

Since Android 7.0, Serbian with Latin script has officially been included. values-sr is still used for the Cyrillic script, and values-b+sr+Latn is used for the Latin script.

values-sr for Cyrillic
values-b+sr+Latn for Latin

Liggliluff
  • 706
  • 1
  • 6
  • 22
1

I just tested Android localization and I found out that you can use any arbitrary region and it will work.

Add a folder to the project with name like values-sr-rZZ where ZZ is a fictitious region which never existed.

Then add the following code to the Application class, I got it from here and slightly changed:

public class MainApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        Resources res = this.getResources();
        Configuration conf = res.getConfiguration();
        boolean isLatinAlphabet = PreferenceManager.getDefaultSharedPreferences(this)... // get a value from the application settings

        if(conf.locale.getLanguage().equals("sr") && isLatinAlphabet) {
            conf.locale = new Locale("sr", "ZZ");
            res.updateConfiguration(conf, res.getDisplayMetrics());
        }
    }
}

In this code the locale will be changed only if the user has chosen the serbian language as the default (conf.locale.getLanguage().equals("sr")) and also checked some checkbox in the app preferences (isLatinAlphabet).

You can use a different condition and change it as you like.

Also such dynamic way of changing language can have bugs with menu items on older devices, but it isn't reproduced on newer devices.

Community
  • 1
  • 1
vortexwolf
  • 13,967
  • 2
  • 54
  • 72