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


    Кота с лампой – нет, держите мотылька.


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


    С чего все началось


    В 2016 году я еще не имел полноценной работы связанной с программированием. На тот момент я работал удаленно в технической поддержке по всяким бухгалтерским программам. Клиентов у нас было не много, поэтому у меня было достаточно свободного времени.
    Я брал некоторые заказы по сайтам, два раза в неделю посещал занятия по японскому языку. Очень уж мне нравилось звучание их языка (да чего уж таить — и сейчас нравится). Уже через полгода, имея «великое» знание азбук и горсти иероглифов, я хвастался этим в группах по аниме и визуальным новеллам. Наконец, в один из дней я получил сообщение от руководителя перевода одной визуальной новеллы с японского:



    Скриншот первого сообщения


    Для тех, кто не знаком с данным жанром игр, я вкратце опишу — это рассказ с картинками, с возможностью влиять на сюжет выбором реплик в диалогах. В некоторых экземплярах встречается какое-то подобие геймплея в перерывах между сюжетом, типа карточных игр, игр на ловкость и так далее. Зачастую, в подобных играх присутствуют «клубничные» моменты, а порой, и в значительном количестве. В русскоязычном сообществе особенно сильно прославилось «Бесконечное лето», с его героем-сычом и коммунистическим бэкграундом.


    Скрытый текст

    Ну и не забываем про Алису с бутылкой водки и Лену с ножом, да…


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



    Пример основного интерфейса


    Некоторое время поломавшись, я все-таки согласился помочь им с переводом, впрочем, толку от меня было мало. Работать переводчиком оказалось намного сложнее чем я мог себе представить. Если ранее, читая для себя, я мог просто пропускать то, что не понимал, то теперь приходилось обращаться к более опытным коллегам и выяснять: «а что там написано смесью иероглифов и двух азбук…?». Некоторое время я помучался со всем этим, но, когда нашел прибыльную подработку – забросил.


    Хоть я и забросил, но за процессом перевода все равно продолжал наблюдать, очень уж мне приглянулись некоторые персонажи в новелле, хотелось почитать их на русском. Итак, спустя несколько месяцев возник прецендент: сервер, хранящий на себе все переводы, пользовательские словари и кучу всего прочего – умер. Или, вернее сказать, создатель просто забыл заплатить за домен. Казалось бы чепуха, но его не продлевали несколько дней. В русскоязычном и зарубежном комьюнити начали возникать волнения и опасения по поводу сложившейся ситуации. Именно тогда у меня возникли первые мысли о создании собственного сервера, тем более, что все исходники лежали в открытом виде, главное — найти нужные места в коде. Но, спустя еще некоторое время, домен чудесным образом заработал, и все забыли об этой ситуации. Однако, всеобщее счастье продлилось недолго…


    Власть, которая и не снилась моему отцу…


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


    В таком режиме прошел чуть ли не месяц, сервер продолжал быть в мертвом состоянии, а о создателе ничего не было слышно с тех самых пор. Программой по-прежнему можно было пользоваться, но только в качестве инструмента для перевода. Для простых обывателей, ради которых задумывался перевод это было, по сути, бесполезное приложение. В итоге, все активные переводы через эту программу были остановлены, а значит — настало время создавать свой сервер!


    На тот момент моё понимание разработки было не выше уровня «чайника», и я понятия не имел о том, что такое IDE, фреймворки, да и вообще, мои познания были ограничены только вебом на уровне недо-джуна. И на тот момент для меня стояла неординарная задача – откопать в неизвестной мне архитектуре на неизвестном языке файл, который отвечает за отправку запросов на сервер, но в остальном я был абсолютно уверен в своих силах! Я не знал на какой домен отправляются запросы, а проверять подобного я еще не умел, но предположил, что домен в программе будет тем же, что и сам сайт, поэтому просто сделал поиск по всем файлам исходного кода программы. Подождав некоторое время, я получил немалый список упоминаний домена в коде и дальше, уже ручками, перебрал все файлы, пока не нашел нужное мне место. Подставил свой домен, запустил программу и убедился, что запросы идут куда нужно. Начало было положено!


    Теперь возник вопрос с тем, какие данные посылает клиент, и какие ожидает. Мне пришлось потратить немало времени на изучение всего этого, и, должен сказать, мне крупно повезло. Субтитры, комментарии, словари, пользователи, игры… все это сохранялось в кэше программы в виде обычных xml файлов в первозданном виде. Просто бери, копируй на сервер и все заведется. Потратив несколько дней на написание, как я думал, гениального кода на стороне сервера, создание базы данных и бесконечные перезагрузки программы (у меня был слабый ноутбук, и перезагрузка занимала по несколько минут), я наконец-таки закончил работу над минимальным функционалом, и отдал на тестирование знакомой команде переводчиков. В течение дня мы тестировали, исправляли появляющиеся баги и в конце концов констатировали – сервер готов к работе! Но в данный момент сервер был абсолютно пустым, а на предыдущем были сохранены драгоценные данные. Благо, у пользователей все данные были сохранены в кэше, поэтому решение было очевидное – создать на сайте сервера форму для загрузки собственных субтитров и словарей.


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


    Скрытый текст

    Что бы вы понимали весь ужас ситуации, этот глупец вместо того, чтобы создать отдельную базу данных, добавил таблицы в базу данных основного сайта. Я в то время думал создать многофункциональный портал… В итоге получился невероятный бардак, который теперь тяжело распутать. Даже я путаюсь, где используется логин основного сайта, а где логин VNR. Не будьте такими, как я :(


    Т.к. я понятия не имел о паролях других пользователей, то пришлось на веру дать возможность людям самостоятельно указать свой старый логин, который они использовали в VNR и с которым потом будет связан аккаунт. И должен сказать – я рад что мне никто так и не написал о том, что его аккаунт угнали, моя вера в человечество спасена!



    Разумеется, интерфейс также был переведен на английский язык, за что спасибо одному из переводчиков, ибо на тот момент в английский я не мог от слова совсем.


    А вот так выглядят минималистичные формы для загрузки пользовательских субтитров и словарей:



    Внимательный читатель заметит, что нигде нет кнопки выхода. Просто я поленился её добавлять…


    А еще там милое колесо загрузки


    Наконец, спустя пару недель разработки и отлова багов, сервер был отправлен в свободное плавание. Это был апогей того, что я делал до этого… Одно дело, когда ты делаешь что-то прикольное для своих соотечественников, но совсем другое, когда к ним подключаются еще и люди с остального мира! На форумах удивлялись тому, какую работу проделали русские, и самое главное – как у них это получилось?! Хотя ничего сложного в проделанной мною работе не было, я все же сильно возгордился своим достижением. Я – никто из «мухосранска», получил благодарности от иностранцев, я просто всемогущий!


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


    Брошенный на произвол судьбы


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


    Таким образом, прошло больше года и за это время я многому научился в программировании. В очередной раз открывая панель управления хостингом, я увидел поддомен сервера, на котором вертится VNR и решил, что его нужно передать другим, более достойным людям. Но, так как сервер был тесно связан с моим основным сайтом, который я тоже забросил, его было тяжело отделить. Но даже если и отделить, то возникает другая проблема: код, который я написал – полное дерьмо! Это самое мягкое что я могу о нем сказать. Все API-методы обрабатываются в единственном файле, написанном в процедурном стиле. Условия в условиях, добавляем туда циклы в несколько уровней, и получаем код, который невозможно читать. Даже сборка xml ответа происходит руками, потому что я где-то вычитал, что так будет менее ресурсоемко, нежели использовать для этого специальный инструмент. Я просто не мог выложить этот ужас в открытый доступ, мне глубоко стыдно за то, что там написано.


    Поэтому я решил переписать сервер с нуля на нормальном фреймворке, а также, добавить немного функционала, связанного с социализацией. Например, страницы групп переводчиков с их контактными данными и ссылками на пожертвования. В перспективе, даже подумывал дать возможность переводчикам делать свои субтитры платными, как это сделано на том же «rulate». В течение месяца я потихоньку пилил новый сервер, но в итоге столкнулся с большой проблемой. Я хотел, чтобы все было идеально! «Это же open source, я должен сделать все максимально красиво!» — думал я. И в итоге, выгорел в бесконечной шлифовке одного и того же. А потом произошло повышение на работе, и по вечерам уже было далеко не до спасения старого сервера.


    И вот, снова прошло полтора года и 11 мая серверу исполнится 3 года со дня его публикации. Я по-прежнему не переписал сервер на новый движок, а о создателе программы до сих пор ничего не слышно. Со мной все понятно, я ленивый мудак, который ничего не будет делать, если это не приносит ни выгоды, ни морального удовлетворения. Но вот насчет создателя, боюсь, что ничего радужного с ним не приключилось…


    К концу статьи хотелось бы сказать: «Не будьте такими мудаками, как я, которые бросают дело на полпути!», но кто я такой, чтобы это говорить. Меня только радует, что есть и другие специалисты, которые делают чтение визуальных новелл проще. Сейчас активно развивается упрощенный аналог VNR-а – «Textractor», у него пока что нет такого крутого функционала, но зато он очень шустрый и легко расширяемый (правда, расширения могут очень сильно конфликтовать друг с другом). Не так давно я сделал для него отдельное расширение для получения переводов с сервера VNR, так что переводчики вполне могут создавать переводы в более сложной программе, а читатели – читать в легкой. Хотел также начать перенос словарей, но ни в какую не могу завести MeCab библиотеку под плюсами, буду рад, если найдется эксперт, который поможет в этом вопросе.


    В заключение, немного статистики сервера на текущий момент:


    • Всего созданных субтитров: 1,555,653
    • Новых субтитров в месяц: 21 470,3
    • Количество игр, имеющих хоть один субтитр: 1759
    • Количество пользователей: 62 430


    Благодарности:


    gasparchik и анониму за редактуру текста


    Ссылка на гитхаб-аккаунт «создателя»

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 34

      +1
      Колесо загрузки милое.

      А так, ни кто долго не сможет заниматься тем, что не приносит ни денег, ни морального удовлетворения. Так что скоро будет еще один «пропавший человек».
        +2
        Я просто не мог выложить этот ужас в открытый доступ, мне глубоко стыдно за то, что там написано.

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

        Бро, это максимально деструктивная позиция по отношению к себе и своей работе (сам такой, знаю о чём говорю), если бы ты вдруг спросил моего совета, я бы посоветовал бежать записываться на приём к хорошему психологу вот уже сейчас, ну или когда надоест получать кайф от беспочвенного самоуничижения.
          0
          Да, есть такая проблемка… но я в некотором роде боюсь идти туда, где могут поднять больные темы. Посижу пока что так :)
            0

            Я бы задал немного другой вопрос: а проблема ли это? Вот есть нечто, что не приносит ни выгоды, ни морального удовлетворения… ну так и зачем этим заниматься?)

              0
              Мышки плакали, кололись, но продолжали есть кактус.
              +2
              Если оттягивать, то будет только хуже. Успехов Вам!
            +2

            Что-то я не совсем понял суть программы. Она какими-то хаками извлекала текст с экрана, отправляла запрос на сервер с этим текстом, сервер искал для него строку перевода, возвращал в программу, а она отрисовывала его в некотором оверлее? Я правильно понял?

              0
              То что вы описали — лишь малая часть.
              Полная цепочка выглядит примерно так:
              • Вытягиваем текст из новеллы через инъекцию
              • Ищем по этому тексту перевод на сервере, а так же переводим через машинные переводчики(гугл, бинг, и прочие)
              • Выводим результат пользователю, он уже смотрит, есть адекватный перевод с сервера, или нет. Если нет, то с помощью встроенного словаря и опираясь на перевод машинок пишет свой перевод.
              • Отправляем перевод пользователя на сервер
              • Заходит новый пользователь, и теперь помимо машинного видит и перевод предыдущего пользователя

              а она отрисовывала его в некотором оверлее

              И вот это кстати еще не все, в некоторые движки она вообще может вставлять перевод прямо в новеллу.
              +4
              Я хотел, чтобы все было идеально!
              Вот — то, что хоронит перспективы.

              По моим наблюдениям, почти все, кто в реальности что-то сделали (в том числе и вы), делают не идеально, а good enough.

              Nanika nasu mono to wa ayumitsuzukeru gusha de aru. Nasenu mono to wa ayumi wo tometa kenja de aru.

              Как-то так.

              А, да, и спасибо за проделанную работу, благодаря подобным вам, удалось поиграть во много что :)
                0
                Это вообще беда более-менее опытных разработчиков, слишком много мыслей в голове по архитектуре, и если за спиной не стоит какой-то дедлайн, то добраться до релиза это уже чудо :)
                Nanika nasu mono to wa ayumitsuzukeru gusha de aru. Nasenu mono to wa ayumi wo tometa kenja de aru.

                Да, и поэтому в нашем мире тонна говнокода на фунт бриллиантов.
                А, да, и спасибо за проделанную работу, благодаря подобным вам, удалось поиграть во много что :)

                Да меня то толком не за что благодарить, благодарите переводчиков, это они делают титаническую работу.
                  +1

                  "Да, и поэтому в нашем мире тонна работающего и приносящего пользу говнокода на фунт бриллиантов. "


                  Я тут немного уточнил фразу, теперь реальннее и позитивнее стало :)

                    +1
                    Да, и поэтому в нашем мире тонна говнокода на фунт бриллиантов.
                    Мне кажется, вам немного засрали мозги энтерпрайз-программисты. Код прежде всего должен решать проблему. Ваш — решает, если бы его не было, люди не смогли бы работать (ну или их жизнь была бы хуже). За это и благодарность.

                    Короче, вернитесь к реальности :)
                      –1
                      Не хочу к реальности, там короновирус…
                        0

                        Хотя бы не Gyo и не HSoD, и на том уже спасибо.

                      0
                      tometa
                      Разве не yameta?
                        0
                        В оригинале — tometa. Это цитата из Rokudenashi Majutsu Koushi to Akashic Records.
                    0
                    Подскажите, почему для перевода подобного типа игр обычно используют достаточно тяжелые программы вместо извлечения ресурсов, их перевода и обратного добавления?
                      0
                      Ну вообще это вкусовщина, есть переводчики которые работают как вы и описали.
                      В данном случае, самый большой плюс в том, что перевод делается в процессе игры. Это помогает лучше прочувствовать атмосферу, интонацию героев и прочее.
                      Мне например очень помогала озвучка, я вот что-то не понимаю в тексте, но по озвучке сразу вспоминаю перевод из какого-нибудь просмотренного аниме.

                      Да и в целом, в конце-концов этот перевод потом извлекается из VNR и переносится в новеллу самописными инструментами.
                        +3
                        самый большой плюс в том, что перевод делается в процессе игры. Это помогает лучше прочувствовать атмосферу, интонацию героев и прочее.

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

                          Профессиональный должен — читателю, заказчику. Да и самому себе, чтобы быть переводчиком.


                          Любитель — не должен, он учится в той мере, в какой получается. Но стремиться к этому очень даже стоит.

                            0
                            Просто если переводчик — любитель, то и то, что он делает, нельзя называть переводом. Но проблема в том, что такие переводы сейчас стали образцом качества. Иными словами, среднее качество переводного текста сейчас настолько низко, что его иначе как дилетанством не назовешь.
                              +1

                              Нельзя назвать профессиональным переводом. Любительским — очень точно называть. И иногда это единственный способ прочитать некий контент, почти вся манга, манхва и лайтновеллы тому пример… Тем более что они и переводят не только профессиональное, но и любительское же творчество, которое профессионалы не берут в рассмотрение.

                          0
                          Переводчик где-то тоже должен учиться писать, в идеале его должны перепроверять более опытные переводчики или редакторы.

                          Старший управляющий в проекте не обязательно должен уметь писать красиво, он и перевод может не понимать, это не его основная задача.

                          Тут вопрос к организации процесса скорее, поэтому и задал вопрос выше.

                          Можно было вытянуть текст для удобства работы, сделать скриншоты в порядке прохождения игры, размер сообщества это позволял,
                          соединив с текстом в нужном порядке, получили заготовку, которую перевести и добавить обратно патчем или заменой уже зависит от конкретной игры.
                          У каждого свои методы и опыт наверное.
                            0

                            Можете показать где что не так в тексте?

                              +1
                              Конечно. Вот как бы я написал.
                              Велика вероятность того, что не каждый из читателей знаком с понятием «визуальная новелла»… –> Наверняка не все читатели знакомы с японскими «визуальными новеллами»… / Скорее всего, вы не знакомы с «визуальными новеллами»…

                              … в комментариях восклицание по типу –> пишут гневные комментарии типа… (восклицания вроде как нельзя писать, их восклицают).

                              Но если вам просто интересно прочитать историю… то я вам её поведаю –> если вам интересна история… я ее расскажу. / Если вам интересно прочитать историю… вот она.

                              В 2016 году я еще не имел полноценной работы связанной с программированием. –> Я не работал/ не был полноценным программистом.
                              .
                              … технической поддержке по всяким бухгалтерским программам. –> техподдержке кое-каких бухгалтерских программ.

                              Я брал некоторые заказы по сайтам, два раза в неделю посещал занятия по японскому языку. –> Я подрабатывал разработкой сайтов, два раза в неделю ходил на уроки японского языка.

                              Для тех, кто не знаком с данным жанром игр, я вкратце опишу –> Поясню для тех, кто не знает эти игры. («данный» — стоп-слово, наряду с «является» должно быть вычеркнуто из лексикона).

                              В некоторых экземплярах встречается какое-то подобие геймплея в перерывах между сюжетом, типа карточных игр, игр на ловкость и так далее. Зачастую, в подобных играх присутствуют «клубничные» моменты, а порой, и в значительном количестве. –> В некоторых таких визуальных новеллах в перерывах между сюжетными действиями можно поиграть например, в игры на ловкость или карточные. Часто в них есть «клубничные» моменты; бывает и так, что вся игра эротическая.

                              … И так далее. Не стал указывать на грамматические ошибки. Попробуйте просто сами прочитать то, что написали. Вслух. Канцелярит и топорные словесные обороты станут очень заметны.
                              Представьте, что в игре няшная школьница, смущённо потупив глазки, говорит: «Я являюсь совершеннолетней и в данный момент не состою в отношениях с мужчинами». У вас желание не пропадет от этого? ^^

                                +1
                                наряду с «является» должно быть вычеркнуто из лексикона

                                Воистину. Ибо есть прекрасное слово "суть", с аналогичным смыслом.
                                Слово как слово, что то, что другое. Не стоит злоупотреблять, а то гуглотранслейтом может запахнуть, но вполне допустимо. Не суровый канцелярит же. Особенно если в переводе есть какая-нибудь математика, где "дано" и "положим" суть базовый язык.

                                  +1
                                  Слово «данный», если оно не в смысле вроде «данный нами обет» и пожожих случаях, отлично заменяется местоимениями или вообще выкидывается.
                                  Слово «является», если это не о призраке, вообще не нужно почти везде. Я перевожу не спеша одну американскую книжку и на 50 вордовских страницах использовал его лишь в одном месте: "… сначала разберёмся, чем он не является." И то, думал, как его избежать тут.
                                  А в переводах оно сплошь и рядом, потому что им обычно переводят формы глагола to be.
                                    +2

                                    Objection!
                                    Мир, данный нам в ощущения, явным образом показывает, что данные слова в данных условиях не являются чем-то из ряда вон выходящим или принадлежностью исключительно канцелярита, но суть устоявшиеся выражения. Во всём тексте всего два(прописью: 2) использования слова "данный" в столь зацепившей Вас форме "ну, тут можно и другое слово применить".
                                    А личные вкусы — это личные вкусы. Являются ли Ваши вкусы всеобщими?


                                    Вы бы ещё к "Иду на вы", "Нам не дано предугадать" или "Thou shalt not" придрались, ей-богу.

                                  0

                                  Я-то думал, что вы нашли грубейшие ошибки + грамматические, а вы придрались не пойми хрен к чему. Вы предложили ему варианты покороче, или вам не понравились нечастоиспользуемые обороты.
                                  Я читаю каждый день уже лет двадцать, на уроках по русскому мог писать грамотно чисто по памяти, при этом вертя на палочке все эти правила. Так вот могу уверенно сказать, что текст нормальный, ровно читается, а если встречаются опечатки, то я сразу отправляю их автору. Вы не редактор ли? И где вы были всё это время? Такой уровень "придирания" я еще нигде не встречал.

                                    0
                                    Нет, спасибо. Вы домотались до стилистики, да ещё и перевираете смысл. Вариант автора гораздо лучше понять о чём речь, а это именно то, чего я обычно жду от текста.

                                    В некоторых таких визуальных новеллах в перерывах между сюжетными действиями можно поиграть например, в игры на ловкость или карточные.
                                    Не «можно», а неотъемлимая часть геймплея.

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

                                Вот этого подхода я не понимаю. Что плохого произойдет в том, что люди узнают, вы N лет назад писали плохо? Ну увидят и увидят, кто-то поохает, кто-то посмеется, а кто-то возьмет да и перепишет сервер с нужными API. А сейчас получается, что и вы ничего не делаете, и другие не могут. Какая-то совершенно неконструктивная позиция…
                                  +1
                                  Я обожаю эту программу, спасибо Вам, что смогли дать ей второе дыхание!

                                  Only users with full accounts can post comments. Log in, please.