gt-react@10.18.0
Обзор
В этом релизе появилась поддержка значений контекста с деривацией. Как и в нашей системе деривации для контента, теперь вы можете добавить вызов 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 tired | Estoy 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 между исходными строками и записями перевода.