Indietro

gt-react@10.18.0

Ernest McCarter avatarErnest McCarter
gt-reactderivecontexti18n

Panoramica

Questo rilascio aggiunge il supporto per i valori di contesto derivabili. Analogamente al nostro sistema di derivazione per i contenuti, ora puoi aggiungere una derivazione a una proprietà di contesto. Questo genererà una voce di traduzione separata per ogni contesto distinto.

Motivazione

All'inizio abbiamo commesso un errore nel nostro sistema di contesto. Il sistema di derivazione usa una mappatura uno a uno tra il contenuto di una voce sorgente e una traduzione: una sorgente genera una traduzione. Questo funziona bene con il nostro sistema di traduzione esistente. Si aspetta di prendere una sorgente come input e produrre una singola traduzione. Questo significa che, se crei n voci sorgente, avrai n voci di traduzione. Tuttavia, non avevamo tenuto conto di un fatto semplice: partendo soltanto dal contenuto di una voce sorgente, potrebbero essere necessarie più traduzioni.

Comprendere il problema

Immagina di avere l'insieme delle voci sorgente. Questo insieme rappresenta tutte le voci sorgente che abbiamo estratto da un'invocazione di traduzione. Poi abbiamo un insieme ideale di voci di traduzione. Questo insieme rappresenta l'insieme ideale di tutte le traduzioni necessarie per tradurre tutte le voci sorgente.

Possiamo suddividerlo in tre casi: one-to-one, many-to-one e one-to-many. È importante capire che non esiste sempre una mappatura uno a uno tra l'insieme delle voci sorgente e l'insieme delle traduzioni.

Caso 1: mappatura uno a uno

A ogni voce sorgente può corrispondere una sola voce di traduzione.

Voci sorgenteVoci di traduzione
Il ragazzo è bello.El niño es hermoso.
La ragazza è bella.La niña es hermosa.

Caso 2: mappatura molti-a-uno

Per ogni voce sorgente, possiamo mappare una voce di traduzione, e la dimensione dell'insieme sorgente è maggiore di quella dell'insieme di traduzione. Per esempio, possiamo passare dall'inglese al mandarino, perché l'inglese segue regole di pluralizzazione, mentre il mandarino no. Questo significa che in mandarino possiamo rappresentare più voci sorgente con una singola voce di traduzione.

Voci sorgenteVoci di traduzione
I have cat.我有只猫。
I have cats.

Caso 3: Mappatura da uno a molti

Per ogni voce sorgente, possiamo associarne una o più voci di traduzione. Ad esempio, lo spagnolo rispetta la concordanza tra maschile e femminile, mentre l'inglese no. Possiamo quindi ritrovarci con due voci di traduzione per la stessa voce sorgente.

Voci sorgenteVoci di traduzione
I am tiredEstoy cansado
Estoy cansada

Questo è il caso che non avevamo considerato nell'implementazione iniziale. Avevamo dato per scontato che ci sarebbe sempre stato una mappatura uno a uno tra le voci sorgente e le traduzioni.

Soluzione

Questo problema si può risolvere sfruttando il nostro sistema di contesto insieme al sistema di derivazione. L'utente può scegliere un valore di contesto a runtime per distinguere tra due o più voci di traduzione.

condition
  ? gt("I am tired", { $context: "inflect as masculine" })
  : gt("I am tired", { $context: "inflect as feminine" })

Possiamo quindi combinarlo con una chiamata a derive per incorporare la logica runtime necessaria a individuare la voce di traduzione corretta.

gt("I am tired", { $context: derive(
  condition ? "inflect as masculine" : "inflect as feminine"
)})

Verranno ora generate due voci di traduzione:

"I am tired" -> "Estoy cansado"
"I am tired" -> "Estoy cansada"

Questo (1) copre tutti i casi di traduzione necessari e (2) consente all'utente di disambiguare le due voci di traduzione a runtime.

In sintesi

La derivazione in base al contesto colma una lacuna fondamentale del nostro modello di traduzione: l'impossibilità di rappresentare relazioni one-to-many tra le stringhe sorgente e le voci di traduzione.