Перейти к содержимому
Zone of Games Forum

Рекомендованные сообщения

144926-1.jpg

Товарищ Sneaksie выпустил русификатор для приключенческой игры Heaven’s Vault.


Товарищ Sneaksie выпустил русификатор для приключенческой игры Heaven’s Vault.

144926-1.jpg

Ее особенностью является использование необычной технологии повествования, опирающейся на нормы английского языка. Именно поэтому у игры нет ни одного официального перевода на другие языки.

В связи с этим, ряд фраз на русском языке будет смотреться чужеродно, исправить это невозможно.

Цитата

Это настоящая интерактивная книга (и большая). В итоговом переводе заменено около 44 тысяч фраз (!) состоящих почти из 220 тысяч слов (это чуть меньше двух томов «Войны и мира» Толстого), каждая из которых отредактирована вручную и по мере возможности подогнана под разные ситуации, где она может быть использована.

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

 

143903-3530689177_preview_1.jpg

143903-3530689177_preview_3.jpg

143903-3530689177_preview_2.jpg

143903-3530689177_preview_4.jpg

143902-3530689177_preview_5.jpg

143902-3530689177_preview_6.jpg

Поделиться сообщением


Ссылка на сообщение

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

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

Изменено пользователем 0wn3df1x

Поделиться сообщением


Ссылка на сообщение

@0wn3df1x геморрой, потому что нет нормальных ответвлений диалога для удобного перевода или там геморройно извлечь текст и запихнуть его обратно?

  • Лайк (+1) 1

Поделиться сообщением


Ссылка на сообщение
3 часа назад, Sudakov Pavel сказал:

@0wn3df1x геморрой, потому что нет нормальных ответвлений диалога для удобного перевода или там геморройно извлечь текст и запихнуть его обратно?

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

Первое и главное, что нужно понимать: Inkle - это не классическое диалоговое дерево “выберите вариант А, получите ветку А”. Inkle ткёт повествование из мелких фрагментов текста, переменных, функций и логических условий. Переводчик видит не цельные, готовые к переводу предложения, а их составные части - по сути, сырье, из которого движок будет склеивать финальный текст на лету. Это больше похоже на работу с ассемблером для текста, чем с привычными строковыми ресурсами. Как программист на ассемблере должен знать архитектуру процессора, так и локализатор Inkle обязан понимать внутреннюю логику его нарративной виртуальной машины.

К примеру, возьмём игру The Pale Beyond и её текстовый ФАЙЛИК на 33 мб.

Там есть функция ShortSentenceDeadClickTest:

"ShortSentenceDeadClickTest": [
    [
      "ev", "str", "^x", "/str", "/ev", { "temp=": "Xstring" },
      "ev", "str", "^y ", "/str", "/ev", { "temp=": "Ystring" },
      [
        "^Loop ", "ev", { "CNT?": ".^" }, "out", "/ev",
        "^. String X ", "ev", { "VAR?": "Xstring" }, "out", "/ev",
        "^. String Y ", "ev", { "VAR?": "Ystring" }, "out", "/ev", "\n",
        // ... логика выбора ...
        "ev", { "VAR?": "Xstring" }, "str", "^x", "/str", "+", { "temp=": "Xstring", "re": true }, "/ev",
        // ...
        "ev", { "VAR?": "Ystring" }, "str", "^y ", "/str", "+", { "temp=": "Ystring", "re": true }, "/ev",
      ],
    ],
]

Это квинтэссенция подхода Inkle. Там нет диалогов в привычном понимании. Это низкоуровневый программный код. Команды ev (evaluate), str (string), VAR? (get variable), out (output), temp= (assign to temporary variable), re= (reassign) - это инструкции для виртуальной машины движка. Этот код инициализирует две переменные и в цикле (CNT? - вероятно, счетчик цикла) конкатенирует (оператор +) к ним новые символы.

Для английского языка, где слова редко меняются, это нормально. Для русского - это катастрофа. Можно представить ситуацию, где вместо "x" нужно подставлять слово, которое должно меняться в зависимости от контекста (например, числа итераций цикла), а этот контекст определяется где-то в совершенно другой части кода. Это черный ящик, который невозможно перевести, не декомпилировав в уме логику его работы. Повествование управляется состоянием сотен переменных, и переводчик видит лишь разрозненные атомы текста, не зная, в какую молекулу-предложение они соберутся.

Так вот, раз уже я начал о конкатенации и связанном с ней грамматическом аде.

Конкатенация (простое склеивание строк) является в Inkle основным инструментом повествования. И именно в ней кроется дьявол для флективных языков, порождающий каскадные грамматические зависимости.

Гипотетический пример на английском:

itemCount = 1, itemAdjective = "red", itemName = "apple" -> "You have 1 red apple."

itemCount = 5, itemAdjective = "red", itemName = "apples" -> "You have 5 red apples."

Всё просто. Сценарист готовит две формы существительного и одно прилагательное.

Тот же пример, но на русском:

"У вас есть " + itemCount + " " + itemAdjective + " " + itemName + "."

itemCount = 1, itemAdjective = "красное", itemName = "яблоко". Получаем: «У вас есть 1 красное яблоко».

itemCount = 2, itemAdjective = "красных", itemName = "яблока". Получаем: «У вас есть 2 красных яблока».

itemCount = 5, itemAdjective = "красных", itemName = "яблок". Получаем: «У вас есть 5 красных яблок**_**».

Прилагательное “красный” и существительное “яблоко” меняют свои окончания в зависимости от числа itemCount. Причем правила для 1, 2-4 и 5+ разные. Движок этого не знает. Он просто подставит переменные. Локализатору нужно переписать всю эту строку в отдельную функцию с громоздкой логикой. А теперь представим, что таких переменных в игре тысячи, и они могут быть не только предметами, но и статусами, именами, локациями.

Вот реальный пример из функции GetWeeklyTitleCardTextSubtitle:

"GetWeeklyTitleCardTextSubtitle": [
    // ...
    "ev", "str",
      "ev", { "VAR?": "TERRITORY_0_WEEKSHERE" }, "out", "/ev",
      "^ Week",
      "ev", { "VAR?": "TERRITORY_0_WEEKSHERE" }, 1, ">", "/ev",
      [ { "->": ".^.b", "c": true }, { "b": [ "^s", ... ] } ],
      "nop",
      "^ on the Temperance.",
    "/str", "/ev",
    "~ret",
    // ...
],

Этот код генерирует фразу типа “1 Week on the Temperance”. Логика примитивна: если переменная TERRITORY_0_WEEKSHERE больше единицы, то с помощью условного перехода { "->": ".^.b", "c": true } (по сути, goto) добавляется строка ^s. Команда ~ret означает, что эта собранная строка возвращается как результат функции. Куда? Возможно, она будет подставлена в другую строку, создавая новый виток грамматического ада.

Переводчик видит три изолированных куска: [число], Week, on the Temperance.
На русском это превращается в неразрешимую задачу: 1 неделя, 2 недели, 5 недель. Просто добавить окончание невозможно. Нужно полностью переписывать эту функцию на уровне кода.

И так - везде. Каждая такая строка - это мина замедленного действия.

Также Inkle обожает переиспользовать фразы. Одна и та же часть предложения может быть использована в десятках разных мест с разными подставляемыми существительными, прилагательными и глаголами.

Пример с родом:

"The " + objectName + " is broken."
  • objectName = "Engine" (двигатель, мужской род) → Двигатель сломан.
  • objectName = "Radio" (радио, средний род) → Радио сломано.
  • objectName = "Door" (дверь, женский род) → Дверь сломана.

Прилагательное “broken” в русском языке должно согласовываться с родом существительного. Переводчик видит строку " is broken" в отрыве от objectName. Он не знает, к чему она будет применяться. Единственный выход - создавать для каждого объекта метаданные (например, его род), а затем вместо простой строки " is broken" писать целую функцию, которая будет запрашивать род объекта и возвращать правильную форму прилагательного: “сломан”, “сломана” или “сломано”. Это уже не перевод, а программирование.

Вот, например, функция listSurnamesWithCommas.

"listSurnamesWithCommas": [
    { "temp=": "if_empty" }, { "temp=": "list" },
    "ev", { "VAR?": "list" }, "LIST_COUNT", "/ev",
    [ "du", "ev", 2, "==", "/ev", { "->": ".^.b", "c": true },
        { "b": [
            "pop", "\n",
            "ev", { "VAR?": "list" }, "LIST_MIN", { "f()": "CrewNameToSurname" }, "out", "/ev",
            "^ and ",
            "ev", { "VAR?": "list" }, { "VAR?": "list" }, "LIST_MIN", "-", { "f()": ".^.^.^" }, "out", "/ev",
            // ...
        ]}
    ],
    // ...
],

Этот код берет список фамилий и красиво форматирует его в строку: "Smith, Jones and Williams". Он просто вставляет запятые и слово "and". А теперь представим, что нам нужно сказать не “Вот Смит и Джонс” (Именительный падеж), а “Я вижу Смита и Джонса” (Винительный падеж) или “Я говорю со Смитом и Джонсом” (Творительный падеж). Переводчик не может просто перевести "and" как "и". Ему нужно знать падеж, в котором будут стоять все эти фамилии, и создать отдельную функцию для каждого падежа.

Помимо этого, английский язык имеет строгий порядок слов (Subject-Verb-Object). Inkle-скрипты часто полагаются на это. В русском языке порядок слов гибкий и используется для расстановки смысловых акцентов. Попытка собрать русскую фразу из кусков в английском порядке приводит к уродливым, машинным конструкциям. Переводчик оказывается в ловушке: он не может изменить порядок сборки фразы, потому что он зашит в логику движка. Ему приходится либо жертвовать качеством языка, либо полностью переписывать логические блоки.


Короче говоря, ад Inkle для локализации заключается в том, что:

  • Движок собирает предложения из грамматических кубиков лего. Эти кубики в английском языке взаимозаменяемы, но в русском они намертво связаны правилами согласования. Каждый такой кубик - это потенциальная точка отказа для всей фразы.
  • Переводчик видит отдельный кубик (слово или фразу), не зная, с какими другими кубиками он будет склеен. Это как переводить слово, не показывая предложения. Контекст определяется не соседним текстом, а состоянием десятков игровых переменных.
  • Русский язык требует согласования слов по роду, числу и падежу. Inkle не предоставляет для этого встроенных инструментов. Вся эта сложнейшая грамматическая логика должна быть написана с нуля переводчиком, который, по сути, становится программистом. Каждый простой + (конкатенация) в оригинальном коде превращается в вызов сложной функции в локализованной версии.
  • Логика сборки фраз диктует порядок слов, который естественен для английского, но часто звучит чужеродно и коряво на русском.

Вот такие пироги. Вот такая красота:
JVmD7rZ.png

Изменено пользователем 0wn3df1x
  • +1 3

Поделиться сообщением


Ссылка на сообщение
22 часа назад, 0wn3df1x сказал:

Короче говоря, ад Inkle для локализации заключается в том, что:

Да уж, вероятно это надо ОЧЕНЬ сильно любить эту далеко не самую известную и мягко говоря не самую популярную (даже в узких кругах) игру.

Но сугубо объективно — мое почтение. Локализатор реально сверхчеловек. :)

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Похожие публикации

    • Автор: SerGEAnt

      @Atanvaron выпустил русификатор для Above the Snow — симулятора управления альпийским курортом.
      @Atanvaron выпустил русификатор для Above the Snow — симулятора управления альпийским курортом.

    • Автор: SerGEAnt

      @SerTidus выпустил русификатор текста для китайского хоррора 衔蝶 / Cat Carried Butterfly.
      @SerTidus выпустил русификатор текста для китайского хоррора 衔蝶 / Cat Carried Butterfly.
      На DTF есть огромная статья про процесс перевода.





  • Продвигаемые темы

  • Последние сообщения

    • Сам стим не выставляет цены, это делают издатели. Если меняется ндс, то цена автоматически не поменяется, вальвы просто больше начнут изымать с профита от продаж у издателей для уплаты ндс.
    • Это только у меня или после перевода часть пунктов меню тупо с ошибкой?
      https://postimg.cc/D8spw934
    • Прошел демку отличной головоломки: https://store.steampowered.com/app/4232550/Cages_Hidden_Worlds/ Релиз еще не скоро, к сожалению, но определенно буду ждать.
    • Вой внутренний Шерлок раскрывает это хитрое дело, указывая на то, что дома ты почти не двигаешься, а ещё куда легче одет. Ну а также, дома на тебя не светит солнце, согревая лучами на градус-два выше “по ощущениям”. Ещё б тебе не было холоднее, даже если температура примерно одинаковая. Если думаешь, что это ненадолго, то просто включи комфорку плиты, а лучше на час-два духовку. Станет теплее. Главное, не забудь выключить духовку через пару часов самое большое, т.к. это и вредно (может голова начать болеть, если газ слишком долго горит), и можно плиту испортить. Ещё можешь купить тепловую пушку, тёплый ветерок тебе твоя 5090 не сделает, так что это худо-бедно, но оправдано, ага.
    • Ток заметил стим поднял  НДС до 22%.  Но как и с 18% Габен все взял на себя(пока по крайней мере) . 
    • Ага, и ещё с FGx6 )  К счастью, нет. В нативе.  Это надо быть очень наглой мышью, чтобы с такой картинкой, нужно было бы ещё и длсс включать для такого fps )  Ну да, одно из двух - либо "дырки", либо проца не хватает ) Главное, что по ощущениям, в квартире холоднее чем на улице.  Скорее всего, тут дело ещё в самих хрущёвках, слишком они какие-то сырые и холодные. На улице, когда одетый и двигаешься, в целом норм. А вот в квартире очень зябко.    Каждый раз порываюсь идти за обогревателем, но останавливает мысль: а нахрена я тогда покупал 5090, если при этом ещё и обогреватель придётся покупать?  )) @vadik989 мышь прикольная, но уже чувствуется некоторая сложность, так как она очень ленивая и не хочет делать дэши, кувырки, и даже бегать.
    • chasm на ms-dos ещё выходил  зацени этот шутер 
    • Всё это уже Ромке говорилось ранее.  Но он либо вовсе не отвечает на неудобные для него тезисы, либо называет их пренебрежительными и несущественными (в т.ч. и примеры) и продолжает гнуть свою линию. Забавно то, что когда я ему давал статистику о соотношении игр в раннем к новинка в целом, то для него это были несущественные данные на фоне его выдуманной цифры, взятой с потолка, в виде 99%. А когда он сам соизволил их загуглить, то это для него стало железобетонным аргументом в разговоре с другим человеком. При этом он взял неполные данные и принял на веру вывод, о том, что значения не меняются, сделанный гугловским ИИ, не проверяя их совсем. Ну и он опять-таки прогнорировал вторую часть данных о соотношении доходности игр в раннем доступе к прочим новинкам. В общем, смысла тратить время на то, чтобы ему что-то доказать тут лично я не вижу. Будет сплошное переливание из пустого в порожнее.
    • https://store.steampowered.com/app/2061230/Chasm_The_Rift/ 75% Надо заценить
    • А я ещё в своё время, перед тем, как стать понаехавшим, всё шибко удивлялся: а чего это на многих объявлениях о продаже квартир в Питере стоят грелки напольные? Как говорится сначала не понял, а потом как понял. Теперь сам такой. С грелочкой.   
  • Изменения статусов

    • Jimmi Hopkins  »  SerGEAnt

      Это не просто перевод, а полноценная авторская сценарная адаптация. Диалоги переписаны так, чтобы персонажи звучали живо, остро и в характере. Добавлен чёрный юмор там, где авторы постеснялись. Убраны лорные противоречия, докручены мотивации. В результате игра стала умнее, злее и смешнее оригинала.
      · 0 ответов
    • ElikaStudio

      Долгожданный релиз полного сезона состоялся!
      https://youtu.be/mwBk2stm2OQ?si=qpJojB_XDABaC0We
      https://vk.com/video-48153754_456239394?sh=4&list=c62797c2b7d0725d6e
      Life is Strange: Before the Storm:
      Эпизод 1: "Прoбуждeниe"
      Эпизод 2: "О дивный новый мир"
      Эпизод 3: "Ад пуст"
      Бонусный эпизод: "Прощание"
      Русская озвучка уже доступна для скачивания!
      ElikaStudio выражает огромную благодарность всем, кто принял участие в создании проекта! 
      Группе Mechanics VoiceOver R.G. MVO , в частности их руководителю Дмитрию за неоценимую помощь в выпуске эпизода.
      Скачать для PC Classic (2018):
      GDrive: - https://drive.google.com/file/d/19CL_L80Mz0sIxcb54Ss64byAkeZmV22r/view?usp=sharing
      Скачать для PC Remastered (2022):
      GDrive: - https://drive.google.com/file/d/13q58Lpvw5_aYPYeZ7OGYZlAKOoS1gEbL/view?usp=sharing
      Скачать для Свитч(2022):
      GDrive: - https://drive.google.com/file/d/15e—T1LQiGQCYIHeNnj_C2qJA16Gvh1i/view?usp=sharing
      Ручная установка PC(оба издания):
      https://drive.google.com/drive/folders/1MJPd8965m4XxxAuOBt8enSHtv8_yy5xh?usp=sharing
      Баг репорт в обсуждении:
      https://vk.com/topic-48153754_55571577
      ___________________________________________
      Финансовый аппарат:
      www.donationalerts.com/r/elikastudio
      Пожертвовать средства на наши проекты:
      Кошелек ЮMoney 4100 1188 6818 3009
      карта Сбер банк 2202 2018 6334 1042
      карта Альфа банк 5559 4937 0209 8584
      Спасибо за вашу поддержку!
      #elikastudio #русскаяозвучка
      · 0 ответов
    • fox222  »  Siberian GRemlin

      Здравствуйте, хочу купить персональный доступ к переводам, сколько стоит?
      · 1 ответ
    • vitkach  »  eaZy

      Извините за беспокойство. Хотел спросить, а русификатор ещё когда-нибудь будет обновляться? Дело в том, что после его выхода выходили ещё обновления, в частности обновление 1.1, вышедшее летом 2023 года, где была добавлена целая сюжетная глава в конце если проходишь на лучшую концовку золотого пути, это где-то ещё полчаса диалогов. Также в игре присутсвуют иногда кракозябры вместо русского языка, это в основном связано с тем, что кое-где текст был изменён, в основном в обучающих сообщениях.
      · 0 ответов
    • TerryBogard  »  Siberian GRemlin

      C&C: RA: Retaliation (ПК) не работает.
      · 0 ответов
  • Лучшие авторы


×