The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Компания Mozilla опубликовала систему локализации Fluent 1.0

17.04.2019 22:48

Представлен первый стабильный выпуск проекта Fluent 1.0, созданного для упрощения локализации продуктов Mozilla. Версия 1.0 ознаменовала стабилизацию спецификаций и синтаксиса разметки. Наработки проекта распространяются под лицензией Apache 2.0. Реализации Fluent подготовлены на языках Python, JavaScript и Rust. Для упрощения подготовки файлов в формате Fluent развиваются online-редактор и плагин для Vim.

Предложенная система локализации предоставляет возможности для создания естественно выглядящих переводов элементов интерфейса, не загнанных в жёсткие рамки и не ограничивающиеся переводом 1 в 1 эталонных фраз. С одной стороны Fluent позволяет предельно просто реализовывать простейшие переводы, но с другой предоставляет гибкий инструментарий для перевода сложных взаимодействий, учитывающих род, склонения множественных чисел, спряжения и другие языковые особенности.

Во Fluent допускается создание асинхронных переводов, в которых простая строка на английском языке может быть сопоставлена с достаточно сложным многовариантным переводом на другом языке (например, "Вера добавила фотографию", "Вася добавил пять фотографий"). При этом синтаксис Fluent, определяющий переводы, остаётся достаточно легко читаем и воспринимаем. Система изначально рассчитана на использование не техническими специалистами, что позволяет вовлекать в процесс перевода и рецензирования переводчиков без навыков программирования.


   shared-photos =
       В {$userGender ->
           [male] его 
           [female] её
          *[other] их
       } коллекцию
       {$userName} {$photoCount ->
           [one] добавлена новая фотография
           [few] добавлены {$photoCount} новые фотографии
          *[other] добавлено {$photoCount} новых фотографий
       }.

Основным элементом перевода во Fluent является сообщение. Каждое сообщение связывается с идентификатором (например, "hello = Hello, world!"), который прикрепляется к коду приложений в месте своего применения. Сообщения могут быть как простыми текстовыми фразами, так и многострочными сценариями, учитывающими разные варианты грамматики и включающие условные выражения (селекторы), переменные, атрибуты, термины и функции (форматирование чисел, преобразование дат и времени). Возможно использование категорий, например, селектор "few" охватывает значения 2~4, 22~24, 32~34 и т.п. Поддерживаются ссылки - одни сообщения могут включаться в состав других сообщений, причём допускаются ссылки между разными файлами. Перед сборкой файлы с сообщениями объединяются в наборы.

Fluent обеспечивает высокую стойкость к ошибкам - неверно оформленное сообщение не приводит к повреждению всего файла с переводами или рядом расположенных сообщений. Для добавления контекстной информации о назначении сообщений и групп возможно добавление комментариев. Fluent уже применяется для локализации сайтов проектов Firefox Send и Common Voice. В прошлом году началась миграция Firefox на Fluent, в настоящий момент уже подготовлено более 3000 сообщений с переводами (всего в Firefox около 13 тысяч строк для перевода).



  1. Главная ссылка к новости (https://hacks.mozilla.org/2019...)
  2. OpenNews: Уязвимость в gettext, позволяющая выполнить код при обработке po-файлов
  3. OpenNews: Компания Google добавила в Translator Toolkit поддержку GNU gettext
  4. OpenNews: Вышел релиз системы для организации процесса локализации Transifex 0.8
  5. OpenNews: Доступна новая версия проекта локализации l10n
  6. OpenNews: Доступна новая версия проекта локализации myl10n 1.2
Лицензия: CC-BY
Тип: Программы
Ключевые слова: translate, fluent
При перепечатке указание ссылки на opennet.ru обязательно
Обсуждение (43) Ajax/Линейный | Раскрыть все сообщения | RSS
 
  • 1.1, тот_же_анон_уже_без_мабилы (?), 23:14, 17/04/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • –8 +/
    больше велосипедов богу велосипедов
     
  • 1.3, Борщдрайвен бигдата (?), 23:16, 17/04/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +14 +/
    Хороший продукт, нужный. Будет альтернатива gettext.
     
     
  • 2.28, Аноним (28), 15:09, 18/04/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Для веба сгодится, пожалуй, а для остального — не вижу смысла отказываться от gettext.
     
  • 1.4, Xasd5 (?), 23:28, 17/04/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • –8 +/
    нашли на чём заморочиться
     
     
  • 2.9, KonstantinB (ok), 00:50, 18/04/2019 [^] [^^] [^^^] [ответить]  
  • +11 +/
    Очень правильно нашли. На результаты типичного gettext-перевода в большинстве случаев без слез смотреть нельзя. Классический пример - окно с двумя кнопками "Отменить" (undo) и "Отменить" (cancel). :-)
     
     
  • 3.13, Аноним (13), 07:26, 18/04/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    gettext поддерживает контексты, что позволяет переводить по разному в зависимости от ситуации.
     
  • 3.14, анонимус (??), 07:46, 18/04/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Можешь привести пример, когда "Отменить" (undo) и "Отменить" (cancel) могут вызвать путаницу?
     
     
  • 4.16, кккк (?), 09:04, 18/04/2019 [^] [^^] [^^^] [ответить]  
  • +2 +/
    >Можешь привести пример, когда "Отменить" (undo) и "Отменить" (cancel) могут вызвать путаницу?

    undo это отменить последнюю операцию, cancel это отменить текущее действие. Если "текущее действие" undo, то очень даже будет путаница.

     
  • 4.17, Аноним (17), 09:22, 18/04/2019 [^] [^^] [^^^] [ответить]  
  • +6 +/
    http://levfoto.ru/wp-content/uploads/2014/04/03.jpg
     
  • 4.24, ffirefox (?), 12:13, 18/04/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Одно это отменить, а другое - отклонить. Имеет смысл с толковым словарём переводить.
     
  • 4.25, Аноним (25), 12:22, 18/04/2019 [^] [^^] [^^^] [ответить]  
  • +/
    В gitg реверт коммита выводит диалог с двумя отменами
     
  • 3.29, Аноним (28), 15:11, 18/04/2019 [^] [^^] [^^^] [ответить]  
  • +/
    > На результаты типичного gettext-перевода в большинстве случаев без слез смотреть нельзя. Классический пример - окно с двумя кнопками "Отменить" (undo) и "Отменить" (cancel).

    Если кто-то не осилил gettext, то он и этот fluent вряд ли осилит.

     
     
  • 4.37, Аноним (37), 02:42, 19/04/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Более высокий входной порог я рассматриваю как преимущество. Отсеет совсем безнадёжных гуманитариев.
     
     
  • 5.40, Аноним (40), 07:13, 19/04/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Хорошо бы найти надежных гуманитариев, что бы подобрали лаконичные русские слова под Undo и Cancel
     
     
  • 6.42, Аноним84701 (ok), 12:04, 19/04/2019 [^] [^^] [^^^] [ответить]  
  • +/
    > Хорошо бы найти надежных гуманитариев, что бы подобрали лаконичные русские слова под Undo и Cancel

    Достаточно было найти одного "неоткосившего"   🙄
    "Отменить!" и "Отставить!" - лаконично и недвусмысленно.

     
  • 6.43, Аноним (43), 01:07, 22/04/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Откатить / Вернуть и Отменить / Прервать. Конечно, не во все контексты подходит, и обратно их можно перевести как Roll back / Return и Cancel / Undo / Abort. Но хотя бы не два одинаковые слова.
     
  • 1.5, Аноним (5), 23:38, 17/04/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А оно умеет в intltool-update?
     
     
  • 2.10, KonstantinB (ok), 00:55, 18/04/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Нет, там концептуальных отличий слишком много.

    https://github.com/projectfluent/fluent/wiki/Fluent-vs-gettext

     
     
  • 3.12, Аноним (5), 06:40, 18/04/2019 [^] [^^] [^^^] [ответить]  
  • +/
    И как же там синхронизировать переводы?
     
  • 1.6, Аноним (-), 23:40, 17/04/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    

# Simple things are simple.
    hello-user = Привет, {$userName}!

    # Complex things are possible.
    shared-photos =
        {$userName} {$userGender ->
            [male] добавил
            [female] добавила
           *[other] добавили
        } {$photoCount ->
            [1] новую фотографию
            [2] {$photoCount} новые фотографии
            [3] {$photoCount} новые фотографии
            [4] {$photoCount} новые фотографии
           *[other] {$photoCount} новых фотографий
        } в свою ленту.

    Ещё бы понять, как оно со сложными числительными вроде 21 и 25. И гендер только гендер или полноценные именные категории может. И как оно вообще для сложных случаяев в произвольных языках. Если может, то нужно.

     
     
  • 2.8, KonstantinB (ok), 00:45, 18/04/2019 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Там все намного лучше. Оно поддерживает CLDR plural rules. В квадратных скобках можно указать имя категории: http://www.unicode.org/cldr/charts/30/supplemental/language_plural_rules.html
     
  • 2.18, trolleybus (?), 10:49, 18/04/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > например, селектор "few" охватывает значения 2~4, 22~24, 32~34

    Даже тут написано, что может

     
  • 2.36, smit (??), 00:31, 19/04/2019 [^] [^^] [^^^] [ответить]  
  • +/
    [21] {$photoCount} новую фотографию
    [22] {$photoCount} новые фотографии
    [23] {$photoCount} новые фотографии
    [24] {$photoCount} новые фотографии

    [31] {$photoCount} новую фотографию
    [32] {$photoCount} новые фотографии
    [33] {$photoCount} новые фотографии
    [34] {$photoCount} новые фотографии

    [41] {$photoCount} новую фотографию
    ...

     
     
  • 3.38, Аноним (37), 02:43, 19/04/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Это вариант для Хинди.
     
  • 1.7, Аноним (7), 00:04, 18/04/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Выглядит круто. Я думаю и всякие *1,*2-4,*5-9 можно будет без проблем вылавливать отдельно
     
     
  • 2.19, MrClon (ok), 10:56, 18/04/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Оно там из коробки, если я правильно понял о чём ты. Смотри тред выше
     
     
  • 3.31, Аноним (28), 16:37, 18/04/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Он ещё, небось, не в курсе, что оно из коробки во всех сколько-нибудь развитых системах интернационализации.
     
     
  • 4.35, Аноним (7), 22:09, 18/04/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Ну ты то, гений, небойсь не сразу заметил остальной тред
     
  • 1.11, необновленец (?), 01:15, 18/04/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +4 +/
    > и плагин для Vim.

    хитрый план ловить вимом локализаторов же! Коварная мозилла!

     
     
  • 2.15, A.Stahl (ok), 08:13, 18/04/2019 [^] [^^] [^^^] [ответить]  
  • +7 +/
    И ловушки даже не нужно регулярно проверять: жертва сама выдаст себя жалобным бибиканьем.
     
     
  • 3.41, Аноним (40), 07:15, 19/04/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Не буду ставить плюс, что бы не поощрать болтовню стахла. Хоть _иногда_ и остроумно.
     
  • 1.20, Аноним (20), 11:14, 18/04/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    >[оверквотинг удален]
    > В {$userGender ->
    > [male] его
    > [female] её
    > *[other] их
    > } коллекцию
    > {$userName} {$photoCount ->
    > [one] добавлена новая фотография
    > [few] добавлены {$photoCount} новые фотографии
    > *[other] добавлено {$photoCount} новых фотографий
    > }.

    Ну, чот, не знаю.

     
     
  • 2.21, Аноним (20), 11:14, 18/04/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Опеннет, ну ё-моё. Там было «изначально рассчитана на использование не техническими специалистами».
     
     
  • 3.23, Аноним (23), 12:01, 18/04/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Предпросмотр, ну ё-моё. Там изначально кто-то про него забыл.
     
  • 1.22, Аноним (23), 11:59, 18/04/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > Система изначально рассчитана на использование
    > не техническими специалистами
    > В {$userGender ->
    >
    > *[other] их

    Всё, что нужно знать об этих специалистах.

     
     
  • 2.44, Аноним (43), 01:09, 22/04/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Это скорее нужно тогда когда пользователь не выбрал пол в профиле. Либо когда пол таки "другой"...
     
  • 1.26, Аноним (26), 12:30, 18/04/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Есть ли в нём возможность импорта файлов в формате PO?
    Имхо ссылки и устойчивость к ошибкам - это хорошо, но добавление логических операторов излишне. Как работать с POEdit можно объяснить за пять минут.
     
  • 1.27, Ваня Бевзюк сетевик (?), 13:09, 18/04/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    теперь будет два флюента
     
     
  • 2.32, freehck (ok), 17:04, 18/04/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Ну второй, он как бы не fluent, а fluentd... Но таки да, я тоже слегка прифигел, когда прочитал, что Mozilla флюент выпустила. =)
     
  • 1.30, Аноним (30), 16:10, 18/04/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Не осилили http://userguide.icu-project.org/formatparse/messages ?
     
     
  • 2.39, Аноним (37), 02:46, 19/04/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Осилили.

    https://github.com/projectfluent/fluent/wiki/Fluent-and-ICU-MessageFormat

     
  • 1.33, Георгий (??), 19:57, 18/04/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Не понял, откуда взялось деление на one, few и other. Почему именно few означает то что означает? Как определить перевод на язык, где правила кардинально другие? А если там 5 категорий, а не три?
     
     
  • 2.34, Георгий (??), 20:03, 18/04/2019 [^] [^^] [^^^] [ответить]  
  • +/
    А, всё, открыл ссылку про категории. Оказывается, есть стандарт.
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:


    Закладки на сайте
    Проследить за страницей
    Created 1996-2019 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру
    Hosting by Ihor