Pluralisation automatique

@lingo.dev/compiler détecte automatiquement les formes plurielles dans votre texte et les convertit au format ICU MessageFormat pour une pluralisation correcte dans toutes les langues.

Fonctionnement

Le compilateur utilise l'IA pour détecter lorsque le texte contient des formes plurielles (par exemple, "1 élément" vs "5 éléments") et les convertit en syntaxe ICU MessageFormat.

Avant (votre code) :

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

Après (compilé) :

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

Différentes langues ont des règles de pluralisation différentes. L'arabe a 6 formes, le russe en a 4, l'anglais en a 2. ICU MessageFormat les gère toutes correctement.

Comment ça fonctionne

  1. Le compilateur détecte les interpolations avec des valeurs numériques
  2. Envoie le texte au LLM pour la détection des formes plurielles
  3. Le LLM renvoie un modèle ICU MessageFormat si une pluralisation est détectée
  4. Le compilateur injecte la traduction tenant compte du pluriel

Cela se produit automatiquement, aucune modification de code n'est nécessaire.

Configuration

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

Modèle : utilise un modèle séparé (rapide) pour la détection du pluriel afin de maintenir les coûts bas. Le modèle par défaut est le plus rapide de Groq.

Exemples

Pluriels simples

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

Devient :

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

Forme zéro

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

Devient :

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

Pluriels complexes

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

Devient :

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

Règles spécifiques aux langues

ICU MessageFormat gère automatiquement les règles de pluriel complexes :

Anglais (2 formes) :

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

Russe (4 formes) :

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

Arabe (6 formes) :

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

Le compilateur génère les formes correctes pour chaque locale cible.

Désactivation de la pluralisation

Si votre application n'utilise pas de formes plurielles ou si vous souhaitez les gérer manuellement :

{
  pluralization: {
    enabled: false,
  }
}

Cela ignore complètement la détection des pluriels, réduisant ainsi les appels LLM.

Formes plurielles manuelles

Vous pouvez écrire directement ICU MessageFormat dans votre code :

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

Le compilateur n'essaiera pas de détecter les pluriels — il utilise votre format exact.

Performance

La détection des pluriels ajoute une légère surcharge :

  • Un appel LLM supplémentaire par texte unique avec interpolations numériques
  • Utilise un modèle rapide (par défaut : Groq llama-3.1-8b-instant)
  • Les résultats sont mis en cache — les builds suivants réutilisent les détections

Coût : Négligeable. Les modèles rapides coûtent des fractions de centime par requête.

Questions fréquentes

Cela fonctionne-t-il pour toutes les langues ? Oui. ICU MessageFormat prend en charge plus de 200 langues avec des règles de pluriel appropriées.

Que se passe-t-il si l'IA se trompe ? Utilisez data-lingo-override pour spécifier des traductions exactes avec les formes plurielles correctes :

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

Puis-je personnaliser le modèle de détection des pluriels ? Oui. Définissez pluralization.model sur n'importe quel LLM pris en charge. La valeur par défaut est optimisée pour la vitesse et le coût.

Cela augmente-t-il la taille du bundle ? Légèrement. Les patterns ICU MessageFormat sont un peu plus volumineux que les chaînes simples. L'impact est minimal.

Qu'en est-il des pluriels imbriqués ? Pris en charge. Le compilateur gère plusieurs variables pluralisées dans la même chaîne.

Dois-je marquer les formes plurielles ? Non. Le compilateur les détecte automatiquement lorsque pluralization.enabled: true.

Débogage

Pour voir les formes plurielles détectées, consultez .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}}"
      }
    }
  }
}

Le champ pattern affiche l'ICU MessageFormat détecté par le compilateur.

Prochaines étapes