로그 또는 지원 담당자에게 문의하는 문장에서부터 회사 또는 제품 이름이 포함 된 브랜딩 같은 문자열에 이르기까지 동일한 하위 문자열이 포함 된 많은 문자열이있었습니다. 반복은 우리 자신을 위해 몇 가지 문제 (주로 오타 또는 복사/붙여 넣기 오류)를 일으키고 있었지만 번역사가 번역해야하는 텍스트 양이 증가한다는 문제가 있습니다.Java ResourceBundle 문자열에서 반복을 피하려면 어떻게합니까?
내가 생각 해낸 해결책은 다음과 같이 갔다 : 실제 자원 번들에
public class ExpandingResourceBundleControl extends ResourceBundle.Control {
public static final ResourceBundle.Control EXPANDING =
new ExpandingResourceBundleControl();
private ExpandingResourceBundleControl() { }
@Override
public ResourceBundle newBundle(String baseName, Locale locale, String format,
ClassLoader loader, boolean reload)
throws IllegalAccessException, InstantiationException, IOException {
ResourceBundle inner = super.newBundle(baseName, locale, format, loader, reload);
return inner == null ? null : new ExpandingResourceBundle(inner, loader);
}
}
ExpandingResourceBundle
대표를하지만 {{this.kind.of.thing}}에서 키를 조회 할의 변환을 수행 자원.
당신이 이들 중 하나를 얻을 할 때마다, 당신은 가야 :
ResourceBundle.getBundle("com/acme/app/Bundle", EXPANDING);
을 그리고이 잘 작동합니다 - 잠시 동안.
결국 어떤 새로운 코드 (우리의 경우 Matisse에서 자동 생성 된 코드)는 사용자 정의 컨트롤을 지정하지 않고 동일한 리소스 번들을 찾습니다. 이것은 함께 호출 한 후 간단한 호출을 수행하는 간단한 단위 테스트를 작성하면 재현 할 수없는 것처럼 보입니다. 그러나 응용 프로그램이 실제로 실행될 때 발생합니다. 아무래도 ResourceBundle
내부의 캐시가 좋은 값을 내보내고 깨진 값으로 바꿉니다. 이유와 Sun의 jar 파일이 디버그 정보없이 컴파일 되었기 때문에 디버깅 정보가 필요하지 않은지 아직 알지 못합니다.
내 질문 :
세계적으로 내가 인식하지 않을 수 있습니다 기본 같은, ResourceBundle.Control를 설정하는 몇 가지 방법이 있나요? 그것은 모든 것을 다소 우아하게 해결할 것입니다.
ResourceBundle 클래스를 전혀 변경하지 않고도 이런 종류의 것을 우아하게 처리 할 수있는 다른 방법이 있습니까?
자바가 가지고 있다면 그것은 메타 프로그래밍을 사용하여 쉽게 처리 할 수 있습니다. –