자리 표시자가없는 현지화 된 메시지에 java.text.messageformat를 사용해야합니까?

StackOverflow https://stackoverflow.com/questions/495776

문제

우리는 Java 5에서 실행되는 웹 응용 프로그램에 대해 사용자 - 인터페이스 텍스트를 로컬로 만들고 있으며 속성 파일에 정의 된 메시지를 출력하는 방법에 대한 딜레마가 있습니다. java.util.properties.

일부 메시지에는 사용을 사용하여 채워진 자리 표시자가 포함됩니다. java.text.messageformat. 예를 들어:

search.summary = Your search for {0} found {1} items.

MessageFormat은 단일 인용문이 영어 텍스트에서 일반적이지만 특별한 캐릭터이기 때문에 성가신 일입니다. 문자 그대로의 단일 견적을 위해 2 형을 입력해야합니다.

warning.item = This item''s {0} is not valid.

그러나 응용 프로그램 1000 정도의 메시지의 3/4에는 자리 표시자가 포함되어 있지 않습니다. 이것은 우리가 직접 출력하여 MessageFormat을 피하고 단일 따옴표를 단독으로 남겨 둘 수 있음을 의미합니다.

help.url = The web page's URL

의문: 모든 메시지에 MessageFormat을 사용하거나 일관된 구문을 사용하거나 할 수있는 경우 MessageFormat을 피해야하므로 대부분의 메시지가 탈출 할 필요가 없습니까?

어느 쪽이든 장단점이 있습니다.

MessageFormat의 API 문서는 문제를 인정하고 해결이 아닌 것을 제안합니다.

메시지 형식 패턴 내에 따옴표를 사용하는 규칙은 불행히도 다소 혼란스러워하는 것으로 나타났습니다. 특히, 단일 따옴표를 두 배로 늘려야하는지 여부는 로컬라이저에게 항상 분명하지는 않습니다. Localizers에게 규칙에 대해 알리고 (예 : 리소스 번들 소스 파일에 주석을 사용하여) MessageFormat에 의해 처리 될 문자열을 알려주십시오.

도움이 되었습니까?

해결책

이 성가신 기능없이 자신만의 MessageFormat 구현을 작성하십시오. 코드를 볼 수 있습니다 SLF4J 로거.

다음과 같이 사용할 수있는 자체 버전의 Message Formatter가 있습니다.

logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);

빈 자리 소유자는 기본 순서와 함께 사용될 수 있으며 다른 언어가 단어 나 문장의 일부를 순열하는 일부 지역화 사례에 대해 번호가 매겨 질 수 있습니다.

다른 팁

결국 우리는 항상 'Curly'인용문을 사용하여 단일 견적 문제를 측면으로 결정했습니다.

warning.item = This item\u2019s {0} is not valid.

인용하려면 '문자'를 사용하십시오. 우리는 항상 문제없이 그것을 사용합니다.

필요할 때만 MessageFormat을 사용하십시오. 그렇지 않으면 코드를 부풀어 오르고 추가 값이 없습니다.

제 생각에는 이런 종류의 일에 일관성이 중요합니다. 속성 파일과 MessageFormat에는 이미 많은 제한이 있습니다. 이러한 문제를 발견하면 속성 파일을 "컴파일"하여 적절하게 형성된 파일을 생성 할 수 있습니다. 그러나 나는 모든 곳에서 MessageFormat을 사용하는 것과 함께 갈 것이라고 말하고 싶습니다. 이 방법으로 코드를 유지할 때 어떤 문자열이 형식화되어 있고 그렇지 않은지 걱정할 필요가 없습니다. 메시지 처리를 라이브러리에 전달할 수 있고 높은 수준의 세부 사항에 대해 걱정하지 않기 때문에 처리하는 것이 더 간단 해집니다.

또 다른 대안 ... 속성 파일을로드 할 때 입력 스트림을 FilterInpustream에 랩핑하는 모든 견적을 두 배로 늘리십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top