Retour

gt-next@6.3.0

Ernest McCarter avatarErnest McCarter
gt-next6.3.0Développement IATraduction de chaînes de caractères

Vue d’ensemble

Dans gt-next 6.3.0, nous nous rapprochons d’une bibliothèque adaptée aussi bien aux développeurs humains qu’aux développeurs IA. Notre principe directeur pour cette version a été de minimiser l’impact sur le code existant tout en introduisant les fonctionnalités essentielles nécessaires à l’i18n.

Pour y parvenir, nous introduisons une nouvelle fonction msg() pour traduire des chaînes n’importe où dans votre base de code. Auparavant, les développeurs devaient transmettre la fonction t() obtenue via useGT() ou getGT() le long de la pile d’appels afin de traduire une chaîne. Avec msg(), il vous suffit d’envelopper la chaîne une fois, puis de la passer à m() au moment du rendu.


Une comparaison

Historiquement, les chaînes de caractères devaient être enveloppées en faisant passer la fonction t() à travers plusieurs couches :

export const greeting1 = 'Bonjour, monde !'
export const getGreeting2 = (t: any) => t('Bonjour, monde !')
import { greeting1, getGreeting2 } from './constants'

export default function Page() {
  const t = useGT()
  return (
    <div>
      {greeting1}
      {getGreeting2(t)}
    </div>
  )
}

Désormais, avec msg(), les chaînes peuvent être déclarées directement comme constantes. La seule contrainte est de les faire passer par m() (via useMessages() ou getMessages()) au moment de l’affichage.

export const greeting1 = 'Bonjour, monde !'
export const greeting2 = msg('Bonjour, monde !')
import { greeting1, greeting2 } from './constants'

export default function Page() {
  const m = useMessages()
  return (
    <div>
      {greeting1}
      {m(greeting2)}
    </div>
  )
}

Encodage et décodage

Pour prendre en charge l’interpolation, la fonction msg() renvoie un message encodé au lieu d’une simple chaîne de caractères. Le format est le suivant :

<contenu interpolé> : <chaîne encodée en base64>

La portion encodée en base64 contient un objet JSON avec :

  • $_hash : Hachage de la chaîne d’origine
  • $_source : Paramètres interpolés dans le message
  • $id : Identifiant unique personnalisé (le cas échéant)
  • $context : Contexte du message (si spécifié)
  • Toutes les variables incluses dans l’interpolation

Cette conception modifie légèrement la façon dont les chaînes sont comparées directement, mais garantit un impact minimal sur le typage et la structure du code. Pour accéder au contenu interpolé, utilisez decodeMsg().

Pourquoi une chaîne encodée ?

L’alternative à l’utilisation d’une chaîne encodée impliquerait que msg() doive renvoyer un type d’objet personnalisé contenant les métadonnées supplémentaires. Bien que cela fonctionne pour le paradigme encode/decode, cela pose des problèmes lorsqu’on travaille avec un typage strict.

Nous avons conclu que la meilleure façon de minimiser l’impact de l’i18n dans ce scénario serait simplement de renvoyer une chaîne qui contient les métadonnées.

Exemple

Code original sans i18n :

const name = 'John'
const message = `Hello, ${name}!`

if (message.length > 10) {
  console.log('Le message est trop long')
} else {
  console.log('Le message a la bonne longueur')
}

Avec msg() et decodeMsg() :

import { msg, decodeMsg } from 'gt-next'

const name = 'John'
const message = msg('Bonjour {name} !', { name })

if (decodeMsg(message).length > 10) {
  console.log('Le message est trop long')
} else {
  console.log('Le message a exactement la bonne longueur')
}

Autre

Vous pouvez également surcharger des paramètres dans la fonction t(), même s’ils ont déjà été interpolés lors de l’appel à msg().

import { msg, useMessages } from 'gt-next'

const message = msg('Bonjour {name} !', { name: 'John' })

export default function Page() {
  const m = useMessages()
  return <div>{m(message, { name: 'Jane' })}</div> // Cela retournera "Bonjour Jane !"
}

Résumé

Cette version vise à rendre gt-next plus ergonomique pour les développeurs tout en minimisant la surcharge liée à l’i18n. En supprimant la nécessité de faire passer la fonction t() dans la pile d’appels, la nouvelle fonction msg() offre un moyen plus clair et plus intuitif de traduire les chaînes et simplifie grandement le processus d’i18n.