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

Java 跨多种人类语言统一enum.values(),java,android,localization,enums,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\u ENDPOINT.values()返回:missio

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

public static enum API_ENDPOINT{
        MISSION, FEATURED_MEDIA
}
枚举类型似乎是依赖于API调用类型的方法的合适参数,但我无法跨配置了不同语言的设备将枚举转换为一致字符串(即映射到API端点URL)

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

英语
API\u ENDPOINT.values()
返回:
mission,特色媒体

一个显而易见的解决方案是一个额外的数据结构,它将
API_端点
映射到硬编码字符串端点,但我很好奇
enum.values()
的这种行为是否是有意的和/或可避免的


已解决:感谢大家的洞察力。将
API\u ENDPOINT
转换为我使用的URL字符串
string.toLowerCase()
而不指定区域设置,这在逻辑上更为深入,导致了不希望出现的行为。这已替换为
String.toLowerCase(Locale.US)

您可以定义两个属性文件。一个用于英语,一个用于土耳其语。
然后枚举可以如下所示:

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();
        }
    }
}
属性文件如下所示(英文):

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

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


您可以定义两个属性文件。一个用于英语,一个用于土耳其语。
然后枚举可以如下所示:

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();
        }
    }
}
属性文件如下所示(英文):

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

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


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

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; }
}
但如果有一种方法可以控制自动生成的表示,那就太好了

不会像这样直接讨论语言差异,但强烈建议输出将与枚举标识符完全匹配;我很惊讶,您甚至会得到带有大写标识符的小写字符串


进一步测试后,这是不可复制的,您的代码中肯定有其他内容

此最小程序显示的枚举标识符与键入的完全相同,而与区域设置无关:

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);
    }
}

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

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; }
}
但如果有一种方法可以控制自动生成的表示,那就太好了

不会像这样直接讨论语言差异,但强烈建议输出将与枚举标识符完全匹配;我很惊讶,您甚至会得到带有大写标识符的小写字符串


进一步测试后,这是不可复制的,您的代码中肯定有其他内容

此最小程序显示的枚举标识符与键入的完全相同,而与区域设置无关:

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);
    }
}

在android中,它宁愿使用int(R.string.mission)并使用getResources()从上下文加载是的,你是对的,没有看到android标记。编辑我的答案;)在android中,它宁愿使用int(R.string.mission)并使用getResources()从上下文加载是的,你是对的,没有看到android标记。编辑我的答案;)我远非i11n专家,但i11n化URL是否正常?我认为URL方案只是选择了一种语言,而i11n只是针对最终用户可见的元素,如呈现的HTML(或插入HTML的json等)。我希望从API_ENDPOINT.values()生成的URL字符串在为每种语言配置的设备上都是相同的。我的问题是,从
API_endpoint.MISSION
生成端点的土耳其设备与在英语设备上生成的不同。啊,好的。完全颠倒了我的想法。:)我远非i11n专家,但i11n化URL是否正常?我认为URL方案只是选择了一种语言,而i11n只是针对最终用户可见的元素,如呈现的HTML(或插入HTML的json等)。我希望从API_ENDPOINT.values()生成的URL字符串在为每种语言配置的设备上都是相同的。我的问题是,从
API_endpoint.MISSION
生成端点的土耳其设备与在英语设备上生成的不同。啊,好的。完全颠倒了我的想法。:)你完全正确。原来我的逻辑中有一个
toLowerCase()
,没有指定语言环境!干得好!你完全正确。原来我的逻辑中有一个
toLowerCase()
,没有指定语言环境!干得好!