2011-10-17 3 views
4

"1 분 남았음"또는 그 행에있는 내용이있는 곳으로 이전에 문제가 발생했다고 생각합니다. 나는이 관찰이 많은 프로그래머들이이 문제를 무시한다는 사실에 대한 증거라고 생각한다. 내 프로젝트에서명사를 복수화하기위한 모듈 방식

, 나는 일반적으로 복수화 명사를 설명하는이 라인을 따라 뭔가 일을했습니다

$Count = count($Items); 
$Noun = 'minute'; 
if ($Count != 1) 
{ 
    $Noun .= 's'; 
} 

echo sprintf('There are %u %s remaining.', $Count, $Noun); 

나는이 방법 몇 가지 문제가 있습니다

  1. 그것은에 부담을 배치 프로그래머는 문자열을 생성해야 할 때마다 복수형 검사를 수행하므로 코드를 결코 재사용 할 수 없습니다.
  2. 불필요하게 응용 프로그램 코드를 압축하고 가독성을 저해합니다.
  3. 일반 사항이 아닙니다. 이 예제는 "분"이 "분"의 복수이기 때문에 효과가있었습니다. "양", "황소"또는 "곰팡이"는 어떻습니까?

누구나이 문제를 해결하기위한 일반적인 모듈 식 접근법에 대한 아이디어가 있습니까? 나는 단 하나의 답 이상이 존재하는 것이 좋습니다.

답변

3

숫자와 단 복수형을 모두 허용하는 함수를 구현하는 것이 일반적입니다. http://translate.sourceforge.net/wiki/l10n/pluralforms

가 추신 : 내가 만든 propisal이 잘 작동하면 애플리케이션을 여러 개의 언어로 번역하기로 결정합니다 경우

그래서 샘플 호출이 링크가 제대로 복수형하는 데 도움이 될 것입니다

echo 'There are ' $count . ' ' . pluralize($count, array('minute', 'minutes')) . ' remaining'; 

수 사용할 복수 표현식을 지정하는 추가 제 3 매개 변수 language을 전달하는 경우 모든 언어가 지원됩니다.

+0

간단한 솔루션과 이상적인 솔루션을 제공해 주셔서 감사합니다. 나는 이것이 올바른 길이라고 생각합니다. –

2

일반적인 접근법을 사용하면이 작은 코드의 유용성을 상대로 성능이 과장 될 것입니다. 일반적인 접근 방법을 얻으려면 장점에 비하면 정말 불필요한 이력서 등을 사용해야합니다. 아마도 이와 같은 간단한 라인은 성능과 유용성 사이의 적절한 교환 일 것입니다. 숫자, 단어의 단수 철자, 단어의 복수로 맞춤법이를 처리 할 수 ​​

$Count = count($Items); 
$Noun = 'minute'; 
echo sprintf('There are %u %s(s) remaining.', $Count, $Noun); 
+1

그런 작은 것들이 소프트웨어를 뭔가 섹시하게 만듭니다. 그렇지 않으면 그것은 복수화가없고 올바른 "그/그녀의"사용법이 아닌 단순한 스케치 일뿐입니다. – zerkms

+0

@zerkms 우리가 이런 종류의 일을하는 것의 아름다움에 대해 말하면, 나는 당신과 매우 동의합니다. 조금/중간 정도의 소프트웨어로 이런 종류의 인쇄 최적화를하는 것에 대해 이야기한다면, 나는 실질적인 이익을 얻지 못합니다. –

1

한 가지 간단한 방법은 세 가지 인수를 함수를 작성하는 것입니다. 이 함수는 값에 따라 단어의 단수 또는 복수 버전을 반환합니다. 그것은 여전히 ​​프로그래머에게 부담을 주지만, 여기서 보여주는 것보다 더 깨끗합니다.

+0

그가 앱용으로 i18n을 구현하기로 결정하면 어떻게 될까요? 아랍어는 6 개의 복수형을 가지고 있으므로 함수는 2가 아닌 6 개의 인수를 받아 들일 필요가 있습니다. – zerkms

+0

@zerkms, 이것은 좋은 지적입니다. 당신이 그것을 해결하는 답변을 게시 한 좋은 점 ;-) – imm