Java 跨多种人类语言统一enum.values()
我的Android应用程序使用枚举类型来定义某些API端点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
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()
,没有指定语言环境!干得好!