2009-02-09 6 views
3

우리는 ASP.NET 웹 사이트에 대한 다중 언어 지원을 추가 할 계획입니다. 현재 문화권을 기반으로 리소스 파일에서 문자열을 가져 오는 일반적인 과정을 이해하지만 다음과 같은 상황을 처리하는 가장 좋은 방법은 무엇입니까?다국어 ASP.NET 웹 사이트에 대한 동적 생성 문장

오늘 스택 오버플로 게시물의 개수를 사용자에게 표시하고 싶다고 가정 해 보겠습니다. 게시물 수는 i입니다. 그런 다음 영어로 작업하는 경우 다음 코드를 사용합니다.

if(i == 1) 
{ 
    postCountText = "You have made " + i + " post today"; 
} else { 
    postCountText = "You have made " + i + " posts today"; 
} 

그래서 우리가 단수형 또는 복수형 중 어느 것을 다루고 있는지에 따라 텍스트가 생성됩니다.

다른 언어로 게시물 개수 텍스트를 만들려면 어떻게해야합니까? 분명히 우리는 위와 같은 많은 조건문을 가질 수 없기 때문에 리소스 파일의 문자열은 자동으로 원하는 출력 텍스트를 생성해야합니다. 다른 언어에서는 변경되는 단어가 post(s) 일뿐만 아니라 단수형과 복수형 사이를 이동할 때 today이라는 단어가 사용 된 것일 수도 있습니다.

내가 가지고있는 유일한 아이디어는 외부 리소스 파일에 단 하나와 복수에 대한 문자열 두 개를 저장 한 다음 이들에 String.Format을 적용하여 올바른 위치에 게시물 개수를 삽입하는 것입니다.

영어 리소스 파일은 다음과 같은 두 개의 문자열을 포함하는 것, 즉 :

if(i == 1) 
{ 
    postCountText = String.Format(GetResourceString("singlePostCount"), i); 
} else { 
    postCountText = String.Format(GetResourceString("pluralPostCount"), i); 
} 

이 다음 텍스트를 허용합니다 :

singlePostCount : "You have made {0} post today" 

pluralPostCount : "You have made {0} posts today" 

을 그럼 난 출력 텍스트를 만들려면 다음 코드를 것 어떤 언어에 대해서나 바르게 바꿀 수있다. 그런데, 게시물이 없으면 특정 텍스트에 다른 텍스트가 필요한 경우 어떻게해야합니까?

답변

3

우리는 역동적으로 생성 된 많은 문장들도 (3 개 언어로) 다루고 있습니다.
우리는 항상 가능한 한 많은 조건문을 피하기 위해 가능한 한 중립적으로 문장을 만들려고 :

"게시물의 전화 번호 오늘 : {0}"

0

사용 StringTemplate, 그대로 최선의 방법을 이런 종류의 상황에 대처할 수 있습니다.

StringTemplateGroup group = new StringTemplateGroup("myGroup", "C:\\Templates", DefaultTemplateLexer.class); 
StringTemplate Message = group.getInstanceOf("sample"); 
Message.setAttribute("user", "Sam"); 
Message.setAttribute("amount", "100"); 
Message.toString(); 

편집 : 당신이 할 수있는

Dear $user$ you have exceeded the usage. Your current balance is $amount$ 

그냥 다음 코드를 추가합니다

당신이 sample.st 같은 템플릿 파일이 있다고 가정 :

그것은 다음과 같이 쉽게입니다 다음과 같이 복수형에 대한 함수를 사용하십시오.

Dear $user$ you have $posts$ post$plural$ 

StringTemplate Message = group.getInstanceOf("sample"); 
Message.setAttribute("user", "Sam"); 
Message.setAttribute("post", post); 

Message.setAttribute("plural", Getplural(post)); 
Message.toString(); 

String getplural(int i) 
{ 

If i >1 
Return “s“; 
} 

더 많은 정보 here.

+0

이것은 기본적으로 "당신은 {0} 게시물 오늘 만든 '질문에서, 나는 그게 아니라 생각처럼 동일 그가 알고 싶었다. 실제 질문은 문장이 $ amount $의 값에 따라 달라지는 경우입니다. –

1

당신은 확실히 다른 문자열로 단수 복수의 문장을 치료해야하고, 조각에서 그들을 구축하지 않습니다 (나는 Sachin 아래 게시,하지만 난 "전원"아직 :-)이없는 투표 할 것

haarrrgh는 "귀하의 게시물 수 : {0}"양식에 대한 권리입니다. 소리는 "컴퓨터와 유사"하지만, 가장 확장 성이 뛰어난 솔루션입니다.

매우 복잡한 복수 규칙이있는 언어가 있습니다 (아랍어는 0, 1, 2, 많은 형식이 서로 다르며 러시아어는 모듈로 10이 1 인 경우 단수를 사용합니다 (1, 51, 4231은 모두 단수형을 사용합니다) 모듈로 100이 20과 99 사이 일 경우 복수형). 자세한 예제 (및 정확한 규칙)는 CLDR 데이터의 supplemental \ plurals.xml 파일을 참조하십시오.

다른 고려 사항은 여기를보세요 (ftp://ftp.unicode.org/Public/cldr/1.6.1/에서 core.zip 내부) 는 : http://www.mihai-nita.net/article.php?artID=20060430a

관련 문제