2009-09-16 2 views
3

resx 파일을 사용하여 전역 화하려고하는 C# WPF 응용 프로그램이 있습니다. 그것은 훌륭하게 작동합니다. 그러나 나는 장애를 겪었다. 나는 내가 표현하고있는 문자열의 단수형과 복수형을 가지고 있고 내가 말하는 모든 것의 수를 기반으로 하나를 고르는 다원화에 대한 상대적으로 간단한 솔루션을 가지고있다.C#에서 문자열 pluralization 및 지역화

그러나 저는 최근에 일부 문화권에 여러 개의 복수형이 있다는 사실에 동의했습니다. 누구든지 WPF는 물론 C#에서이 문제에 대한 좋은 해결책을 찾아 왔습니까?

이 문제에 대해 본 적이있는 표준 예는 폴란드어에서 온 것입니다. 폴란드어는 단수, paucal 및 복수형을 가지고 있습니다. 이 예는 단어 "파일"의 번역이다 :

  • 1 plik
  • 2,3,4 pliki
  • 5-21 pliko'w
  • 22 ~ 24 pliki
  • (25) -31 pliko'w
+0

예를 들어주세요. –

+1

예 : 폴란드어에는 단수, 소문자의 domy, 복수의 domow가있는 집과 같은 단수, paucal 및 복수형 용어가 있습니다. 단수는 1, paucal은 범위 2-4, 22-24, 32-34, 그리고 복수는 그 밖의 모든 것입니다. 영어보다 다소 복잡합니다. – Sam

+0

@Sam - 저에게 예제를 추가해 주셔서 감사합니다.이 질문을 할 때 iPod Touch를 사용 했으므로 짧게 유지해야했습니다. – dustyburwell

답변

8

Mozilla는 Firefox 3에서이 기능을 구현했으며, 구현 방법을 설명하는 가이드 here을 가지고 있습니다. //gre/modules/PluralForm.jsm

구현의 소스 : 대부분 특히, Developing with PluralForm 섹션에서, 그들은 링크를

자원을 가지고있다. Firefox 3 이상에서 열어야합니다.

나는 모든 것을 읽지는 못했지만이 아이디어는 적어도 좋은 아이디어 인 것 같습니다.

HTH.

+0

나에게 이것을 지적 해 주셔서 고맙습니다! C# 솔루션은 아니지만 적어도 도움이 될 복수형 규칙 목록이 있습니다. – dustyburwell

4

문제를 그냥 피하는 것이 좋습니다. 문장을 작성하는 대신 UI를 작성하여 문제를 피하십시오. "5 페이지"라고 말하지 말고 "페이지 : 5"라고 말해보십시오.

+0

+1 재미있는 접근 –

+1

물론입니다! 피할 수있는 문제는 솔루션을 유지 관리하기가 쉽지 않다는 것입니다. 훌륭한 코드 솔루션을 사용하더라도 번역사는 모든 형태로 각 구문을 입력해야합니다. 모든 다양성과 불규칙성이 복수형으로 존재하기 때문에 많은 작업이 가능하며 실수를하기 쉽습니다. – peterchen

+9

불쾌감을 느끼지 않으려 고하지만 이것은 게으른 방법처럼 보입니다. 이것은 제품을 비인간 화하는 경향이 있으며 확실히 유용성을 떨어 뜨리는 것처럼 보입니다. – dustyburwell

2

이와 같은 현지화는 번역하려는 언어를 고려합니다. 여러 개의 복수형은 매우 드물며 대부분의 경우 상호 교환이 가능하거나 상황에 민감합니다. 응용 프로그램의 여러 위치에서 사용하지 않으면 걱정할 필요가 없습니다. 이 작업을 수행하고 특정 용도가 복수 사용법에서 문법적 오류를 만드는 경우 해당 인스턴스의 새로운 키 (모든 언어)를 추가해야합니다. 어쨌든 문화권을 탐지하고 있으므로 영향을받는 언어에 대한 조건부를 추가하고 단일 대체 복수형을 사용하십시오.

자연 언어의 흐름을 빨리 잃을 수 있으므로 회피 해주십시오. "Mins answered ago : 6".

어쩌면 당신은 처음에는 이것을 의미 했겠지만 훨씬 더 일반적인 시나리오는 다른 문화권에서 구문 배치의 변형입니다. 예를 들어, 현지화하려는 문자열입니다. "이 페이지는 X 번 조회되었습니다."이 3 지역화 문자열 수 있도록 할 수 있습니다 : 그럼 간단한 의사 구현 될 PageViewEnd = "시간" PageViewEndPlural는 = "시간"

을 "이 페이지를 볼 때"=

PageViewStart을

PageViewStart + pageCount.ToString() + pageCount == 1? PageViewEnd : PageViewEndPlural;

그러나 "Deze pagina는 {0} keer bekeken"이고 한국어는 "조회수 {0}"입니다. 따라서 여러 언어에서 여러 문장 구조의 형식을 지정하는 여러 가지 방법에 대한 구현 문제가 immediatley에서 발생하게됩니다.

내 솔루션을 암시하는 예로 의도적으로 {0}을 예제에 남겼습니다. 전체 문장에 대해 복수형 및 복수형으로 현지화를 사용하십시오.

PageView = "이 페이지를 한 번 보았습니다." PageViewPlural = "이 페이지는 {0} 번 보았습니다." 당신이 조건부 쓸 수

이 방법 (의사가 다시 구현에 따라) :

PAGECOUNT> 1? PageView : String.Format (PageViewPlural, pageCount.ToString());

유일하게 번역사가 resx 파일에 {0} 토큰의 의미와 위치를 지정해야합니다.

+0

첫 번째 단락의 경우 헝가리어 http://en.wiktionary.org/wiki/Category:Hungarian_nouns_with_multiple_plural_forms와 같은 언어를 생각하고있었습니다. –

+5

"복수형은 매우 드물며 대부분의 경우 상호 교환이 가능하거나 상황에 민감합니다." ... 예, 매우 드문 경우입니다. 드물게 모든 슬라브 언어처럼. – Jenda

1

gettext 님의 복수형 처리 알고 계십니다. 그러나 일반적으로, 나는 그것을 피하려고 노력한다 (Yuliy가 말했듯이).

그것의뿐만 아니라 명사 - 문구가 변경할 수 있습니다 (예를 들어, 독일어 에서 "1 Datei konnte nicht의 gelöscht의 werden"/"2 Dateien konnten의 nicht의 gelöscht의 werden").

그것은 훨씬 더 친절하고 우아한 문제 회피 보다 "Dateien는 nicht gelöscht의 werden의 konnten 사망 : 2"을,하지만 당신은 현지화를 위해 얼마나 많은 능숙의 트레이드 오프가있다.