• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.430
Благодарности
4.770
Баллы
625
  • Первое сообщение
  • #1
1767600363729.png

RU EN

 

Вложения

  • Union_Primary_Universal 12.02.2022.zip
    44 MB · Просмотры: 28.369
  • Union 1.0m 26.06.2022.zip
    11,8 MB · Просмотры: 950
  • Union 1.0m 26.06.2022 v2.zip
    11,8 MB · Просмотры: 610
  • Union 1.0m 26.06.2022 v3.zip
    11,8 MB · Просмотры: 30.699

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.430
Благодарности
4.770
Баллы
625
ElderGamer, изначально у меня было две идеи реализации:
1. В начале скриптовой строки указывать имя символа, который в словаре будет иметь несколько реализаций
2. Читать датник и автоматически проставлять каждой строковой переменной свой префикс и создавать на их основе болванку для словаря

Сейчас мне уже кажется, что правильнее будет отталкиваться, в первую очередь, тупо от текста, например строки или предложения без конкретной привязки:
Код:
Source:"I will exchange three pieces of ore for an meatbug."
Ru:"Я обменяю три куска руды на мясного жука."
Pl: ... to do
Ge: ... to do
Если словарь найдет совпадение со строкой source, то он заменит ее на ту, которая лежит под соответствующим языком, в нашем случае Юнион переведет ее как текст под Ru.
Такой вариант словаря наиболее универсален, поскольку достаточно кинуть VDF том к нужному моду и он автоматом будет переведен вне зависимости от его начинки или версии скриптов.
 

Goth_Man

Участник форума
Регистрация
27 Окт 2014
Сообщения
196
Благодарности
33
Баллы
190
достаточно кинуть VDF том к нужному моду и он автоматом будет переведен вне зависимости от его начинки или версии скриптов
А как в таком случае быть когда на разных языках диалог занимает разное количество символов и может тупо не уместится в диалоговое окно, всегда раздражает когда не влазит из за того что русский на 10-15% длиннее *anger*
 

Vain

Участник форума
Регистрация
19 Сен 2008
Сообщения
441
Благодарности
135
Баллы
205
А как в таком случае быть когда на разных языках диалог занимает разное количество символов и может тупо не уместится в диалоговое окно, всегда раздражает когда не влазит из за того что русский на 10-15% длиннее
Автомасштабирование текста, если количество символов превышает N(max) ?
 

Goth_Man

Участник форума
Регистрация
27 Окт 2014
Сообщения
196
Благодарности
33
Баллы
190
Автомасштабирование текста, если количество символов превышает N(max) ?
На мой взгляд лучше во второе диалоговое окно перенести, чем глаза потом ломать. Например привычный шифт+ентер (знак разрыв строки)
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.430
Благодарности
4.770
Баллы
625
Автомасштабирование текста, если количество символов превышает N(max) ?
На мой взгляд лучше во второе диалоговое окно перенести, чем глаза потом ломать. Например привычный шифт+ентер (знак разрыв строки)
Да я лучше просто увеличу его в ширину и высоту :)
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.648
Благодарности
3.423
Баллы
525
он автоматом будет переведен вне зависимости от его начинки или версии скриптов.
Не очень понял, что значит "автоматом будет переведён".

Я смутно представляю, как происходит процесс перевода сейчас. Но думаю, было бы удобно переводить прямо в Соурсере. Насколько я знаю, Соурсер не ломает кодировку, а просто показывает особые символы, вытаскивая их не из той таблицы. Для переводчика это некомфортный режим. Ему было бы удобно, наверное, если бы имелась возможность видеть правильное отображение символов в окне Соурсера. Можно ли реализовать такой режим?
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.430
Благодарности
4.770
Баллы
625
Не очень понял, что значит "автоматом будет переведён"
То и значит, что при загрузке датника в память программа будет сравнивать строки со словарем, представляющим из себя обычный тхт в юникоде. Нашлась идентичная строка? Значит плагин заменит его на указанную.


Ему было бы удобно, наверное, если бы имелась возможность видеть правильное отображение символов в окне Соурсера. Можно ли реализовать такой режим?
Сорсер работает с ansi и поставляет символы согласно системному языку. Отсюда и каракули, устранить которые через сорсер невозможно.
Но из вышесказанного делаем вывод, что ему даже исходник мода иметь не обязательно, разве что в качестве шпаргалки. Все тексты с переводом будут лежать в открытом виде, в отдельном файле, в юникоде.

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

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.648
Благодарности
3.423
Баллы
525
Нашлась идентичная строка? Значит плагин заменит его на указанную.
Гм, а переводчику, как я понимаю, придётся составлять текстовый файл с исходными текстами и их переводами. Возможно, это неплохое решение. Но не вызовет ли это тормозов при работе плагина?

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

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.430
Благодарности
4.770
Баллы
625
Но не вызовет ли это тормозов при работе плагина?
Нет, потому что значения переменных
1. Будут составляться только один раз в момент инициализации игры.
2. Будет использован массив с быстрой сортировкой и поиском.

Прям любых-любых? И названий предметов, и прочей мелочи?
Ну да
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.377
Благодарности
7.860
Баллы
995
По переводам еще у гансов было всякой мелочевки по этой части, даже здесь Саргон выкладывал тулзы..
 

Goth_Man

Участник форума
Регистрация
27 Окт 2014
Сообщения
196
Благодарности
33
Баллы
190
Но из вышесказанного делаем вывод, что ему даже исходник мода иметь не обязательно, разве что в качестве шпаргалки
Все тексты с переводом будут лежать в открытом виде, в отдельном файле, в юникоде.

Полностью согласен (за исключением того нюанса что некоторые фразы например на английском для "Хорошо вчера погулял?" и "Хорошо вчера погуляла?" разници никакой, а в русском есть!), а вот по поводу 2-го пункта, хранить фразы в виде блакнота тоже нареканий нет, а вод редактировать их (так сказать финишный прогон) хотелось бы прямо в игре, и чтобы можно было по всей ветке диалога пройтись.
Сорсер работает с ansi и поставляет символы согласно системному языку.

выб.png
Ну так в таком случае пусть по умолчанию и открывает виндозную кодировку (я про будущий Union Spacer), а мы уж как нибудь сами поменяем на нужную *blush* (только разные окна мутить придётся). А буфер обмена системный вроде по умолчани и так юникод роземеет?
А да совсем забыл, а еще составление глоссариев в один клик для уже переведённых модов
 
Последнее редактирование модератором:

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.430
Благодарности
4.770
Баллы
625
Goth_Man, ElderGamer,
Ну вот к примеру попробуйте такой небольшой плаг.
Использовать его можно как обычно, так и в VDF. Последний вариант имеет смысл в релизной версии перевода. При этом первично файл перевода будет читаться с физического потока.

Алгоритм работы: zGlossary запаковывается в VDF том вместе с .gls файлом-словарем и .patch файлом для автозапуска.
Итак, поясняю поэтапно:
1. На диске создается файл с расширением .gls с кодировкой Unicode LE
Файл имеет определенный синтаксис:
Код:
Пустая строка - пропускается
; - комментарий строки
Text: - тег, в котором будет описана оригинальная строка
OneMore: - тег, который добавит еще один последовательный вариант перевода фразы (к предыдущему языку), имеющей такое же содержимое, как в теге Text.

Все остальное - это языковые теги, например:
Rus:
Eng:
Pol:
и так далее

а исключением того нюанса что некоторые фразы например на английском для "Хорошо вчера погулял?" и "Хорошо вчера погуляла?" разници никакой, а в русском есть!
В этом случае как раз должен будет использоваться тег OneMore. Если в скриптах имеется 3 последовательно идущие одинаковые фразы, но имеющие разный смысл, то синтаксис словаря будет примерно такой:
1579297956683.png
2. Запуск словаря производится через .patch файл вместе с библиотекой. Для этого создается файл патча с кодировкой ANSI (расширение .dll и .gls указывать не обязательно).
1579296727533.png
3. Упаковка в VDF
Файл словаря должен иметь определенное имя, чтобы в случае чего не быть затертым другим словарем, имеющим больший приоритет VDF тома. Хорошее имя - имя мода, для которого он создан. Аналогично с патч файлом.
Поскольку словарь работает со строками, то можно упаковать шрифты с разной локализацией.
А скриптом выбрать, какие файлы необходимо использовать.
1579296987545.png
Для поддерживаемых юнионом языков настройка произойдет автоматически (см. список в шапке темы).
Для ручного выбора языка (в основном это надо для переводчиков), после первого запуска игры с плагином, необходимо открыть Union.ini и выставить нужное значение в GLOSSARY::Language
zGlossary.dll - сам плагин
zGlossary.patch - пример патча автозапуска
TestGlossary.gls - пример словаря
patch.xml - синтаксис .patch файлов для notepad++
glossary.xml - синтаксис .gls файлов для notepad++
Собственно тут все ок. Автоматически будет выбрана любая актуальная версия zGlossary.dll из томов-словарей. Друг другу они никак не помешают ;) Поэтому важно, чтобы именно имя библиотеки оставалось исходным, чтобы не нарушить целостность логики.

Если будут какие идеи или замечания - отписывайте. Надеюсь что хотя бы потестите немного :)
И да, этот плагин полностью дружелюбен с режимом 'чистого сп'

З.Ы. Не забудьте убрать из тестового скрипта теги для Font_old_20_white.tga, если у вас нет шрифтов с необходимым суффиксом :D
З.Ы.Ы. В память можно загружать сколь угодно .gls словарей, достаточно произвести еще один или более вызовов LoadGlossary из любых .patch файлов
З.Ы.Ы.Ы. Пример изменения текста меню на транслит (не имею русских шрифтов на г1 :D)
1579298705617.png

1579298686589.png
 

Вложения

  • zGlossaryTest.7z
    41,6 KB · Просмотры: 72
Последнее редактирование:

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.377
Благодарности
7.860
Баллы
995
Круто *thumbs up*
Но в качестве "OneMore" я бы добавил инстанцию(имя NPC или его ID) к которой относиться текст.

для обычного текста.:
Text: "You're an idiot!"
Rus: "Ты идиот"

для контекстных фраз
Text: "You're an idiot!"
Rus: "Ты идиот"
Rus:Lotar: "Ты идиот"
Rus:Sara: "Ты идиотка"
Rus:1025: "Ты идиотка"

Хотя все это тестить надо в работе, да.. ::)
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.430
Благодарности
4.770
Баллы
625
MaGoth, в датнике нет привязки строк к инстанциям или диалогам. Как такое парсить?
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.979
Благодарности
582
Баллы
275

zeratul47

Участник форума
Регистрация
10 Янв 2020
Сообщения
21
Благодарности
0
Баллы
60
Здравствуйте! Подскажите, а в какой класс мне нужно смотреть, если я хочу сделать новое окно (скажем как со статистикой персонажа) по нажатию на F1?
 

alexeich2019

Участник форума
Регистрация
28 Июн 2019
Сообщения
191
Благодарности
73
Баллы
175
zeratul47, zCView. Что-то вроде того.

C++:
zCView * pView = NULL;

void InitView() {
    if (!pView) {
        // xPos, yPos, xSize, ySize
        // в данном случае, растягиваем на весь экран
        pView = new zCView(0, 0, 8192, 8192);
        // font
        pView->SetFont("FONT_OLD_20_WHITE.TGA");
    }
}

void ToDoFunc() {
    if (pView) {
        // если хочется вывести изображение
        // pView->InsertBack("Название_текстуры.tga");

        // xPos, yPos, Text
        // в данном случае, отступаем на 10% от левого края и на 10% от верхнего края.
        pView->Print(81.92 * 10, 81.92 * 10, "Hello World");
        // вставляем вью в рабочее вью вывода, чтобы наши действия отображались на экране.
        screen->InsertItem(pView);
   
        // когда захочется убрать
        // screen->RemoveItem(pView);
    }
}
 

neromont


Модостроитель
Регистрация
12 Мар 2011
Сообщения
684
Благодарности
667
Баллы
245
Здравствуйте! Подскажите, а в какой класс мне нужно смотреть, если я хочу сделать новое окно (скажем как со статистикой персонажа) по нажатию на F1?
Можешь немного здесь почитать: Класс zCView - ZenGin справочник - Gothic Library
Документация потихоньку заполняется.
 
Сверху Снизу