typeof programmer
typeof programmer

Reputation: 1609

Display String based on user system language in Android

I have an enum class, but I want to display string based on user system language. For example, If the system is English , it should display 1 , 2 ,3 . But if the System is Chinese, the display should totally be different like "一", “二”, “三”. (一 means 1 in Chinese, 二 means 2 in Chinese).

Here is my code

public enum OrderType {


    ONE("1"), TWO("2"), THREE("3")

    private String name;

    private OrderType(String name) {
        this.name = name;
    }

    public String toString() {
        return name;
    }

    public static String getEnumByString(String code) {
        for (OrderType e : OrderType.values()) {
            if (code.equals(e.name)) {
                return e.name();
            }
        }
        return null;
    }

}

The enum works fine in android, Can I define the String in the value folder,

Like values-iw, values-ru... And how can I use that?

UPDATE: I also want to use constructor to initialize the enum string. Just like

private OrderType(String name) {
    String temp = getResources().getString(R.string.name);
    this.name = temp ;
}

But I do not know how to pass parameter of R.string.parameter.. Second, how Can I use getResources() function in enum class

Upvotes: 1

Views: 313

Answers (5)

Urchin
Urchin

Reputation: 474

public enum OrderType {

    One(mActivity.getString(R.string.One)), Two(mActivity.getString(R.string.Two));

    private String name;

    private OrderType(String name) {
        this.name = name;
    }

    public String toString() {
        return name;
    }

    public static String getEnumByString(String code) {
        for (OrderType e : OrderType.values()) {
            if (code.equals(e.name)) {
                return e.name();
            }
        }
        return null;
    }
}

also Here is the link, which I think is best way solve the porblem. This developing for API level 11 currently, however this code should run on higher versions. After a quick review in API 16 I did not see an existing core Android solution to this problem, if you know of one please post below and share.

Upvotes: -1

kiruwka
kiruwka

Reputation: 9480

You must know that enums are initialized statically. Each of ONE, TWO, THREE is static.

In android to use resources, such as strings, you need a context.

Generally, you can not access Android context in static methods or initializes, therefore you can't use them with enums.

Even if you could use a hack to make android context statically available you would still have issues :

  • you'd need to ensure none of your OrderType enums accessed before Application#onCreate
  • strings in your enums won't reflect runtime language changes

Edit
I hope it is clear that you can not reliably initialize your enums with string resources.
You could, however, associate static id of a string (R.string.string_name) with your enum and obtain needed resource string later using a context, as proposed in kcoppock's answer.

Upvotes: 2

Kevin Coppock
Kevin Coppock

Reputation: 134714

Just provide the String resource ID as a parameter to your Enum:

public enum OrderType {
    ONE(R.string.order_type_one),
    TWO(R.string.order_type_two)

    private final int mTextResourceId;

    OrderType(int resourceId) {
        mTextResourceId = resourceId;
    }

    public int getTextResourceId() {
        return mTextResourceId;
    }
}

Provide these strings in each desired resource folder, e.g.:

res/values/strings.xml
res/values-es/strings.xml
res/values-fr/string.xml

Then, when you want to consume this in a TextView somewhere:

myTextView.setText(myOrderType.getTextResourceId()); 

No Context passing required, and it is determined at runtime based on the current locale.

Upvotes: 4

Puh
Puh

Reputation: 305

For tasks of that kind use localizations.

"google on i18n java"

and

"android app localization"

Upvotes: 0

Christoffer
Christoffer

Reputation: 7787

You should keep the strings in your string xml resource. That way you can get it from there into your code. For example like this:

String one = getResources().getString(R.string.num_one);

Then you just put a strings.xml file with overloading values in the language folders you want (values-ru, values-sv etc.)

Upvotes: 1

Related Questions