2013-10-30 2 views
2

내 Android 앱은 특정 API 끝점을 정의하기 위해 열거 형을 사용합니다.여러 인간 언어로 enum.values ​​() 통합

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()의 이러한 동작은 의도적이거나 피할 수 있습니다.

해결 : 통찰력을 위해 모두 감사합니다. API_ENDPOINT을 로케일을 지정하지 않고 String.toLowerCase() URL 문자열로 변환하는 논리가 더 깊어 져서 바람직하지 않은 동작이 발생했습니다. 이 파일은 String.toLowerCase(Locale.US)

+0

? URL 스키마는 언어를 선택한다고 생각 하겠지만 i11n은 렌더링 된 HTML (또는 json이 html로 삽입되는 등)과 같은 최종 사용자가 볼 수있는 요소를위한 것입니다. – yshavit

+0

API_ENDPOINT.values ​​()에서 생성 된 URL 문자열은 모든 언어에 대해 구성된 장치에서 동일해야합니다. 문제점은 * API_ENDPOINT.MISSION에서 끝점을 생성하는 터키 장치가 영어 장치에서 생성 된 장치와 다릅니다. – dbro

+0

아, 알겠습니다. 그건 내 머리에서 완전히 뒤집 혔어. :) – yshavit

답변

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은 이와 같은 언어 차이점을 직접적으로 나타내지는 않지만 출력물이 열거 형 식별자와 정확히 일치 할 것을 강력히 제안합니다. 나는 대문자 식별자를 사용하여 소문자 문자열을 얻을 수도 있다는 것에 놀랐다. 추가 테스트 후


, 가, 뭔가 다른 코드에서 진행되어야한다 재현 할 수 없습니다.

이 최소한의 프로그램은 정확하게에 관계없이 로케일의 입력으로 열거 식별자를 표시합니다

나는 아주 멀리 i11n 전문가의,하지만 그 URL을 i11n-이지는 것이 정상입니다
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); 
    } 
} 
+0

당신은 틀린입니다. 내가 로케일을 지정하지 않으면 내 논리의 다른 곳에서'toLowerCase() '가 발생했습니다! 날카로운 작품! – dbro

2

으로 바뀌 었습니다. 두 개의 등록 정보 파일을 정의 할 수 있습니다. 하나는 영어 용이고 다른 하나는 터키 용입니다.
열거는 다음과 같이 수 :

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

본 숙박-파일이 (영어)과 같이 표시됩니다 같은

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

터키에 간다. 도움이 되길 바랍니다.

편집 : 당신은 안드로이드를 사용으로 인해,이 문제에 대한 해결책이 될 수 있습니다

+2

안드로이드에서 getResources()로 컨텍스트에서 int (R.string.mission) 및로드를 가져오고 싶습니다. – njzk2

+0

네가 맞다. 안드로이드 태그를 보지 않았다. 편집 내 대답;) –