跨多种人类语言统一enum.values()

时间:2013-10-30 18:19:15

标签: java android localization enums

我的Android应用使用枚举类型来定义某些API端点。

public static enum API_ENDPOINT{
        MISSION, FEATURED_MEDIA
}

对于依赖于API调用类型的方法,枚举类型似乎是一个合适的参数,但是我无法在使用不同语言配置的设备上将枚举转换为一致的字符串(即映射到API端点URL)。

土耳其语API_ENDPOINT.values()返回:mıssıon, featured_medıa

英文API_ENDPOINT.values()返回:mission, featured_media

一个明显的解决方案是将API_ENDPOINT映射到硬编码字符串端点的附加数据结构,但我很好奇enum.values()的这种行为是否有意和/或可以避免。

解决:感谢大家的洞察力。在没有指定Locale的情况下,将API_ENDPOINT转换为我使用String.toLowerCase()的URL字符串的逻辑更深入,这导致了不良行为。这已被String.toLowerCase(Locale.US)

取代

2 个答案:

答案 0 :(得分:2)

您可以定义两个属性文件。一个用于英语,一个用于土耳其语。
Enum可能看起来像这样:

public static enum API_ENDPOINT{
    MISSION("path.to.property.mission"), FEATURED_MEDIA("path.to.property.featured_media");

    private String propertyName;
    API_ENDPOINT(String propertyName){
        this.propertyName = propertyName;
    }

    // language could also be an enum which defines the language to be taken
    // and should contain the path to the file.
    public String getTranslatedText(Language language){
        Properties prop = new Properties();

        try {
            //load a properties file from class path
            prop.load(API_ENDPOINT.class.getClassLoader().getResourceAsStream(language.getPropertyFileName()));

            //get the translated value and raturn it.
            return prop.getProperty(propertyName);

        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

Property-File将如下所示( English ):

path.to.property.mission=Mission
path.to.property.featured_media=Featured Media

土耳其语也是如此。 希望有所帮助。

编辑:由于您使用的是Android,这可能是解决您问题的方法:

答案 1 :(得分:2)

您可以将字符串硬编码为枚举的一部分,而无需任何其他数据结构:

public static enum API_ENDPOINT{
    MISSION("mission"), FEATURED_MEDIA("featured_media");
    private final String value;
    API_ENDPOINT(String value) { this.value = value; }
    public String value() { return value; }
}

但如果只有一种方法可以控制自动生成的表示形式,那就太好了。

The JLS enum section并没有直接说出这样的语言差异,但强烈建议输出与枚举标识符完全匹配;我很惊讶你甚至会得到带有大写标识符的小写字符串。


经过进一步测试后,这是不可重复的,您的代码中必须还有其他内容。

这个最小程序显示的枚举标识符与键入的完全一致,无论语言环境如何:

public class MainActivity extends Activity {
    public enum ENUM {
        MISSION, FEATURED_MEDIA
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView textView = (TextView) findViewById(R.id.text);
        String enums = "";
        for (ENUM e : ENUM.values()) {
            enums += e + " ";
        }
        textView.setText(enums);
    }
}