자동 복수형 처리

@lingo.dev/compiler는 텍스트에서 복수형을 자동으로 감지하고 언어별 올바른 복수형 처리를 위해 ICU MessageFormat으로 변환합니다.

기능

컴파일러는 AI를 사용하여 텍스트에 복수형(예: "1 item" 대 "5 items")이 포함되어 있는지 감지하고 ICU MessageFormat 구문으로 변환합니다.

변환 전 (작성한 코드):

<p>You have {count} items</p>

변환 후 (컴파일됨):

<p>{count, plural, one {You have 1 item} other {You have # items}}</p>

언어마다 복수형 규칙이 다릅니다. 아랍어는 6가지 형태, 러시아어는 4가지 형태, 영어는 2가지 형태를 가집니다. ICU MessageFormat은 이 모든 것을 올바르게 처리합니다.

작동 방식

  1. 컴파일러가 숫자 값이 포함된 보간을 감지합니다
  2. 복수형 감지를 위해 텍스트를 LLM에 전송합니다
  3. LLM이 복수형이 감지되면 ICU MessageFormat 패턴을 반환합니다
  4. 컴파일러가 복수형 인식 번역을 주입합니다

이 과정은 자동으로 진행되며 코드 변경이 필요하지 않습니다.

구성

{
  pluralization: {
    enabled: true, // Default: true
    model: "groq:llama-3.1-8b-instant", // Fast model for plural detection
  }
}

모델: 비용을 낮게 유지하기 위해 복수형 감지에 별도의 (빠른) 모델을 사용합니다. 기본값은 Groq의 가장 빠른 모델입니다.

예시

단순 복수형

<p>You have {count} items in your cart</p>

변환 결과:

{count, plural,
  one {You have 1 item in your cart}
  other {You have # items in your cart}
}

0 형태

<p>You have {unreadCount} unread messages</p>

변환 결과:

{unreadCount, plural,
  =0 {You have no unread messages}
  one {You have 1 unread message}
  other {You have # unread messages}
}

복잡한 복수형

<p>{days} days and {hours} hours remaining</p>

다음과 같이 변환됩니다:

{days, plural,
  one {1 day}
  other {# days}
} and {hours, plural,
  one {1 hour}
  other {# hours}
} remaining

언어별 규칙

ICU MessageFormat은 복잡한 복수형 규칙을 자동으로 처리합니다:

영어 (2가지 형태):

  • one: 1 item
  • other: 0 items, 2 items, 100 items

러시아어 (4가지 형태):

  • one: 1, 21, 31, 41... (оди́н элеме́нт)
  • few: 2-4, 22-24... (два элеме́нта)
  • many: 0, 5-20, 25-30... (пять элеме́нтов)
  • other: 1.5, 2.5... (1.5 элеме́нта)

아랍어 (6가지 형태):

  • zero: 0
  • one: 1
  • two: 2
  • few: 3-10
  • many: 11-99
  • other: 100+

컴파일러는 각 대상 로케일에 맞는 올바른 형태를 생성합니다.

복수형 비활성화

앱에서 복수형을 사용하지 않거나 수동으로 처리하려는 경우:

{
  pluralization: {
    enabled: false,
  }
}

이렇게 하면 복수형 감지를 완전히 건너뛰어 LLM 호출을 줄입니다.

수동 복수형

코드에서 직접 ICU MessageFormat을 작성할 수 있습니다:

<p>
  {formatMessage(
    { id: "items", defaultMessage: "{count, plural, one {# item} other {# items}}" },
    { count }
  )}
</p>

컴파일러는 복수형을 감지하지 않고 정확한 형식을 사용합니다.

성능

복수형 감지는 약간의 오버헤드를 추가합니다:

  • 숫자 보간이 있는 고유 텍스트당 추가 LLM 호출 1회
  • 빠른 모델 사용 (기본값: Groq llama-3.1-8b-instant)
  • 결과가 캐시됨—후속 빌드에서 감지 결과 재사용

비용: 무시할 수 있는 수준입니다. 빠른 모델은 요청당 1센트의 일부만 소요됩니다.

자주 묻는 질문

모든 언어에서 작동하나요? 예. ICU MessageFormat은 적절한 복수형 규칙을 가진 200개 이상의 언어를 지원합니다.

AI가 잘못 처리하면 어떻게 하나요? data-lingo-override를 사용하여 올바른 복수형이 포함된 정확한 번역을 지정하세요:

<p data-lingo-override={{
  es: "{count, plural, one {1 artículo} other {# artículos}}"
}}>
  {count} items
</p>

복수형 감지 모델을 사용자 정의할 수 있나요? 예. pluralization.model를 지원되는 LLM으로 설정하세요. 기본값은 속도와 비용에 최적화되어 있습니다.

번들 크기가 증가하나요? 약간 증가합니다. ICU MessageFormat 패턴은 단순 문자열보다 조금 더 큽니다. 영향은 미미합니다.

중첩된 복수형은 어떻게 되나요? 지원됩니다. 컴파일러는 동일한 문자열에서 여러 복수형 변수를 처리합니다.

복수형을 표시해야 하나요? 아니요. 컴파일러는 pluralization.enabled: true일 때 자동으로 감지합니다.

디버깅

감지된 복수형을 확인하려면 .lingo/metadata.json를 확인하세요:

{
  "translations": {
    "abc123": {
      "source": "You have {count} items",
      "pattern": "{count, plural, one {You have 1 item} other {You have # items}}",
      "locales": {
        "es": "{count, plural, one {Tienes 1 artículo} other {Tienes # artículos}}"
      }
    }
  }
}

pattern 필드는 컴파일러가 감지한 ICU MessageFormat을 표시합니다.

다음 단계