Fluent — семейство спецификаций, реализаций и практик для локализации, разработанной Mozilla. Сейчас она применяется в браузере Firefox. Используя Fluent, переводчики могут писать более естественные переводы на родном языке. Сегодня мы представляем спецификацию формата файлов Fluent версии 1.0. Приглашаем разработчиков переводческих инструментов попробовать его и рассказать о ваших впечатлениях.
Какие проблемы решает Fluent
Браузер Firefox поддерживает около сотни языков, и это бросает разработчикам вызов с точки зрения локализации. Многие проблемы сложно решить используя традиционные подходы. В локализации ПО доминирует принцип разметки переводов «один к одному» с исходным текстом. Грамматика исходного языка (в случае с Mozilla — английского) накладывает серьёзные ограничения на доступность выразительных средств при переводе.
Рассмотрим следующее сообщение, которое появляется, когда пользователь пытается закрыть окно Firefox с несколькими вкладками.
tabs-close-warning-multiple = You are about to close {$count} tabs. Are you sure you want to continue?
Сообщение отображается только в том случае, если вкладок 2 или больше. В английском языке, слово tab будет всегда во множественном числе — tabs. Англоязычного разработчика устроит такое сообщение. Оно звучит корректно для любых значений $count.
В английском языке для всех значений $count достаточно одного варианта сообщения.
Многие же переводчики заметят, что слово tab может принять разные формы в зависимости от значения $count.
В традиционном подходе к локализации, ответственность за корректную обработку сообщения будет лежать на переводчиках. Они должны учитывать, что в других языках может существовать несколько множественных форм слова, даже если в английском она всего одна. Чем больше языков будет поддерживать приложение, тем серьёзнее будет становиться проблема.
- В некоторых языках существительные обладают родом, что потребует изменения прилагательных и причастий. Во французском слова connecté, connectée, connectés и connectées переводятся на английский как connected.
- Руководство по стилю может требовать использования определённых терминов в зависимости от платформы, на которой работает ПО. В английской версии Firefox, например, Settings используется на платформе Windows, а Preferences — на других системах, чтобы соответствовать стандартам, принятым в этих системах. В японском разница может быть ещё интереснее: от операционной системы зависит выбор система письма для некоторых компьютерных терминов.
- Контекст и целевая аудитория приложения может требовать дополнительных модификаций текста. Англоязычное приложение для работы с бухгалтерским учётом может использовать форматирование цифр отличное от того, что используют на обычных сайтах в интернете. Но в других языках такое разделение может быть необязательным.
Существует множество грамматических и стилистических вариаций, которые нельзя напрямую сопоставить между двумя языками. Поддержка всех этих нюансов с помощью традиционного подхода может быть затруднительной. В некоторых языках придётся идти на компромиссы, в других вообще не будет подходящего решения.
Асимметричная локализация
Fluent меняет распределение ролей в локализации. Вместо того, чтобы требовать от разработчиков учитывать все возможные нюансы всех языков, Fluent старается держать тексты на исходном языке в максимально простой форме.
Мы делаем возможным передачу грамматики и стиля других языков независимо от исходного текста. Всё происходит изолированно. То, что один язык может использовать более продвинутую логику в локализации, не влияет на другие языки перевода. Каждая локализация в программе сама решает, насколько сложным должен быть текст перевода.
К примеру, посмотрим на перевод сообщения о закрытии вкладок на чешский. Слово panel (вкладка) должно принимать одну из двух форм: panely для количества вкладок 2, 3 и 4, и panelů для всех остальных значений.
tabs-close-warning-multiple = {$count ->
[few] Chystáte se zavřít {$count} panely. Opravdu chcete pokračovat?
*[other] Chystáte se zavřít {$count} panelů. Opravdu chcete pokračovat?
}
Fluent даёт переводчикам возможность писать грамматически верные предложения и свободно использовать выразительные средства своего языка. Благодаря Fluent, чешский перевод использует правильные множественные формы для любых возможных значений $count.
В чешском языке, при значениях $count равным 2, 3 и 4, существительному требуется особая множественная форма.В то же время, в исходный текст или код не требуется вносить никаких изменений. Логика в чешской локализации никак не влияет на все остальные локализации программы. Во французском языке это предложение будет таким же простым, как и английское:
tabs-close-warning-multiple =
Vous êtes sur le point de fermer {$count} onglets.
Voulez-vous vraiment continuer ?
Концепция асимметричной локализации является ключевой инновацией Fluent, которая стала возможной благодаря опыту Mozilla в разработке многоязычного ПО на протяжении 20 лет. Многие ключевые идеи для Fluent были позаимствованы из MessageFormat от ICU (International Component for Unicode) и из формата XLIFF.
На первый взгляд, Fluent походит на другие решения для локализации, которые позволяют использовать варианты слов для множественных существительных и слов с грамматическим полом. В отличие от них, Fluent использует целостный подход к локализации. Fluent развивает эти идеи, определяя синтаксис для всего текстового файла, где хранятся переводы, и разрешая ссылаться из одних сообщений на другие.
Термины и ссылки
Файл Fluent может содержать в себе множество сообщений, каждое из которых переведено на язык переводчика. Сообщения могут ссылаться на другие сообщения внутри того же файла, или на сообщения из других файлов. Во время выполнения, Fluent объединяет файлы в наборы (bundles), и ссылки разрешаются внутри этого набора.
Ссылка на сообщения — это мощный инструмент для поддержки единообразия переводов. Однажды определённый перевод может многократно использоваться в других переводах. Fluent поддерживает специальный тип сообщения под названием термин (term), хорошо подходящий для многократного использования. Идентификатор термина всегда начинается с чёрточки.
-sync-brand-name = Аккаунт Firefox
После определения, термин -sync-brand-name может использоваться из других сообщений как переменная, всегда возвращая корректный текст. Термины помогают внедрить единообразие согласно руководству стилей. К примеру, их можно изменять для особого брендирования неофициальных сборок или бета-релизов.
sync-dialog-title = {-sync-brand-name}
sync-headline-title =
{-sync-brand-name}: The best way to bring
your data always with you
sync-signedout-account-title =
Подключитесь с помощью {-sync-brand-name}
Использование термина напрямую в середине предложения может вызвать проблемы во флективных языках, или в языках с другими правилами капитализации текста. Значение термина можно определить в нескольких аспектах в зависимости от контекста. Рассмотрим следующее определение термина -sync-brand-name на итальянском.
-sync-brand-name = {$capitalization ->
*[uppercase] Account Firefox
[lowercase] account Firefox }
Благодаря ассиметричной природе Fluent, переводчик на итальянский может определить две формы для написания бренда. Вариант с верхним регистром (по умолчанию) подходит для самостоятельного использования или для использования в начале предложения. Вариант в нижнем регистре может быть запрошен путём передачи параметра капитализации, когда термин используется внутри большого предложения.
sync-dialog-title = {-sync-brand-name}
sync-headline-title =
{-sync-brand-name}: il modo migliore
per avere i tuoi dati sempre con te
# Явный запрос варианта в нижнем регистре.
sync-signedout-account-title =
Connetti il tuo {-sync-brand-name(capitalization: "lowercase")}
Определение нескольких вариантов термина — это удобный приём, который позволяет соответствовать грамматическим правилам множества языков. В следующем примере, польский переводчик может использовать склонения для построения правильного предложения в сообщении sync-signedout-account-title.
-sync-brand-name = {$case ->
*[nominative] Konto Firefox
[genitive] Konta Firefox
[accusative] Kontem Firefox
}
sync-signedout-account-title =
Zaloguj do {-sync-brand-name(case: "genitive")}
Fluent позволяет внедрять сложную логику языковых конструкций там, где это необходимо. В то же время, просто перевод остаётся простым. Fluent не добавляет сложной реализации в простые конструкции.
sync-signedout-caption = Take Your Web With You
sync-signedout-caption = Il tuo Web, sempre con te
sync-signedout-caption = Zabierz swoją sieć ze sobą
sync-signedout-caption = So haben Sie das Web überall dabei.
Fluent Syntax
Сегодня мы объявляем о первом стабильном релизе Fluent Syntax. Это спецификация формата файла для хранения переводов, а так же бета-релиз парсеров на JavaScript, Python и Rust.
На примерах выше вы увидели, что из себя представляет синтаксис Fluent. Он создан быть понятным для людей с небольшими техническими познаниями, и позволяет делать проверку и редактирование текста с минимальным количеством ошибок. Восстановление после ошибки является важным моментом: один неверный перевод не сломает весь файл или прилегающие к нему переводы. Комментарии пригодятся для передачи контекста конкретного сообщения или целой группы. Переводы могут занимать несколько строк, что облегчает работу и разметку больших фрагментов текста.
Файлы Fluent можно открыть в любом текстовом редакторе, что снижает порог вхождения для разработчиков и локализаторов. Формат уже поддерживается открытой платформой для перевода ПО Pontoon от Mozilla.
Fluent Playground — это песочница для тестирования Fluent прямо в браузере.Подробности о синтаксисе можно узнать из материала Fluent Syntax Guide (англ). Формальное определение можно найти в материале Fluent Syntax specification (англ). А если вы хотите просто попробовать Fluent, используйте Fluent Playground — онлайновый редактор со сниппетами, которыми можно поделиться.
Обратная связь
Firefox является основным фактором развития Fluent. В Firefox уже используется более 3000 сообщений Fluent. Миграция на Fluent началась в прошлом году, и сейчас идёт полным ходом. Формат Fluent показал себя стабильным и гибким решением для сложных интерфейсов, вроде страницы настроек Firefox. Он так же используется на множестве веб-страниц Mozilla, таких как Firefox Send и Common Voice.
Мы считаем, что Fluent — это отличный выбор для приложений, в которых важны простота и скорость выполнения, но в то же время требующих отображения элементов интерфейса в зависимости от множества переменных. В частности, Fluent помогает создавать естественные предложения на разных языках в ограниченном пространстве мобильных интерфейсов; в информационно-насыщенных платформах социальных медиа; и в играх для передачи игровой статистики и объяснения механики игроку.
Мы будем рады услышать мнение о Fluent от разработчиков или вендоров. Fluent разрабатывается как стандарт будущего, поэтому мы приглашаем всех попробовать его и рассказать, с какими ещё проблемами вы сталкиваетесь в работе. С вашей помощью мы сможем усовершенствовать Fluent для работы на множестве платформ и в множестве ситуаций.
Мы открыты для конструктивной критики. Узнать больше о Fluent можно на сайте проекта. Если вам есть что рассказать, свяжитесь с нами на Fluent Discourse.
От переводчика: документация по синтаксису на русском языке.