Назад

gt-react@10.18.0

Ernest McCarter avatarErnest McCarter
gt-reactдеривацияконтекстi18n

Обзор

В этом релизе появилась поддержка значений контекста с деривацией. Как и в нашей системе деривации для контента, теперь вы можете добавить вызов derive в свойство контекста. Это создаст отдельную запись перевода для каждого варианта контекста.

Мотивация

На раннем этапе мы допустили ошибку в нашей системе контекста. Система деривации использует взаимно-однозначное соответствие между контентом исходной записи и переводом: один исходный текст даёт один перевод. Это хорошо сочетается с нашей существующей системой перевода. Она предполагает, что на вход подаётся исходный текст, а на выходе получается один перевод. Это означает, что если создать n исходных записей, то получится n записей перевода. Однако мы не учли один простой факт: если у вас есть только контент исходной записи, для него может потребоваться несколько разных переводов.

Понимание проблемы

Представьте, что у нас есть множество исходных записей. Это множество включает все исходные записи, которые мы извлекли из вызова перевода. Затем у нас есть идеальное множество записей перевода. Это множество представляет собой идеальный набор всех переводов, необходимых для перевода всех исходных записей.

Это можно разбить на три случая: one-to-one, many-to-one и one-to-many. Важно понимать, что между множеством исходных записей и множеством переводов не всегда существует взаимно-однозначное сопоставление.

Случай 1: взаимно-однозначное сопоставление

Для каждой исходной записи можно сопоставить уникальную запись перевода.

Исходные записиЗаписи перевода
Мальчик красивый.El niño es hermoso.
Девочка красивая.La niña es hermosa.

Случай 2: Сопоставление «многие к одному»

Каждой исходной записи можно сопоставить запись перевода, при этом размер исходного набора больше размера набора переводов. Например, так можно перейти от английского к китайскому: в английском действуют правила плюрализации, а в китайском — нет. Это означает, что в китайском несколько исходных записей могут соответствовать одной записи перевода.

Исходные записиЗаписи перевода
I have cat.我有只猫。
I have cats.

Случай 3: сопоставление «один ко многим»

Для каждой исходной записи можно задать сопоставление на одну или несколько записей перевода. Например, в испанском языке есть согласование по мужскому и женскому роду, тогда как в английском его нет. Поэтому одной и той же исходной записи могут соответствовать две записи перевода.

Исходные записиЗаписи перевода
I am tiredEstoy cansado
Estoy cansada

Именно этот случай мы не учли в первоначальной реализации. Мы исходили из того, что между исходными записями и переводами всегда будет взаимно-однозначное сопоставление.

Решение

Эту проблему можно решить, используя нашу систему контекста вместе с системой деривации. Пользователь может выбрать значение контекста во время выполнения, чтобы устранить неоднозначность между двумя или несколькими записями перевода.

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

Затем это можно объединить с вызовом деривации, чтобы встроить логику времени выполнения для выбора правильной записи перевода.

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

В результате будут созданы две записи перевода:

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

Это (1) охватывает все необходимые сценарии перевода и (2) позволяет пользователю различать две записи перевода во время выполнения.

В итоге

Деривация контекста устраняет фундаментальный пробел в нашей модели перевода: невозможность представить сопоставления one-to-many между исходными строками и записями перевода.