Я создаю эту тему в помощь переводчикам, которые испытывают различные трудности при переводе модов и скриптов Скайрима.
Полагаю, раз вы состоите в группе переводчиков, то вы обладаете базовыми навыками, необходимыми для перевода модов. Все же я упомяну все эффективные и знакомые мне способы перевода esp и esm файлов модов.
Во многих случаях, мне очень помогал английский и русский экспорт текстов игры. Допустим, при переводе мода вам попались имя, фраза, название, часть текста книги, описание зачарования и т.д, которые автоматически не перевелись, так как имеют отличный от оригинального id, а вы хотите, чтобы их перевод соответствовал официальному переводу, или же таких записей так много, что просто глупо переводить их заново самому, когда их перевод сделали 1С. Но где же взять этот перевод 1С? Не лезть же в игру и не искать. Потому я сделал для себя английский и русский экспорт игровых текстов.
Допустим, при переводе я встретил такое описание зачарования "For <dur> seconds you automatically become invisible while sneaking."
Я открываю текстовый файл с экспортом и с помощью поиска нахожу это описание:
For <dur> seconds you automatically become invisible while sneaking.
Подкрадываясь, вы автоматически становитесь невидимы в течение <dur> с.
Вот сделанный мной экспорт
Экспорт Dawnguard.txt 1,19МБ
12535 Количество загрузок:
Экспорт Dragonborn.txt 2,01МБ
12141 Количество загрузок:
Экспорт Hearthfire.txt 237,92К
4806 Количество загрузок:
Экспорт Skyrim.txt 14,24МБ
12180 Количество загрузок:
Я выделю лишь следующие особенности программы, которые сделали ее для меня любимой.
1. При переводе вы видите и оригинальный английский текст и переведенный русский. Это сильно помогает в различных ситуациях.
2. Программа позволяет создать словарь из strings файлов оригинальной игры.
Options - Set options and Languages
Суть в том, что мы создаем эдакий англо-русский словарь в программе, который базируется на русских и английских strings файлах оригинальной игры (английские strings можно скачать на странице программы на нексусе, а русские у вас и так быть должны). Когда мы создали этот англо-русский словарь [english] -> [russian] мы можем загрузить некий мод, который затрагивает записи оригинальной игры, так вот при загрузке все эти записи будут автоматически переведены на русский язык.
Приведу пример на моде Relighting Skyrim. У меня открыта программа, создан и выбран англо-русский словарь на основе русских и английских strings файлов skyrim, herthfire, dawnguard, dragonborn.
Теперь при загрузке мода (file -> load esp/esm) происходит автоматический перевод всех записей оригинальной игры, содержащихся в моде. Таким образом, мне не надо ничего искать или подгружать самому. А любые несоответствия, которые могли возникнуть по каким-либо причинам, очень легко вычислить благодаря наличию на экране одновременно русского перевода и оригинального английского текста.
Чтобы открыть в программе мод на русском языке, вам следует создать русско-русский словарь, да именно так, вам надо создать [russian] - [russian] словарь перед загрузкой мода, иначе вы получите абракадабру.
Видите? Я перевел Relighting Skyrim на русский, сохранил файл, а затем загрузил в программе уже переведенный мод, абракадабра возникла из-за того, что был выбран англо-русский словарь [english] -> [russian]. Как я и сказал, надо создать исключительно русский словарь. Делается это так же, как и создание английского, но в этот раз исходным языком так же назначается русский.
Кстати, чтобы не создавать словарь каждый раз при его смене, вы можете добавить его в пресеты.
Проделайте это и для english - russian словаря и для russian - russian, а затем будете просто быстро выбирать подходящий под ситуацию.
Теперь, когда у нас выбран russian-russian словарь, мы свободно можем загрузить мод на русском языке.
3. Сравнение, вот еще одна функция, за которую я люблю эту программу, в ней можно сравнивать файлы. Это функция очень удобна, когда версия мода обновилась и вам необходимо перекинуть перевод со старой версии мода на новую. Допустим, некий переведенный вами мод обновился и надо как-то перебросить перевод со старой версии на новую, тогда вы делаете следующее, берете есп файл старой версии (relightingskyrim.esp), изменяете его название на OLD.esp (к примеру) и помещаете в папку Data. Затем скачиваете новую версию мода и помещаете есп новой версии (relightingskyrim.esp) в папку Data.
Далее открываете программу и загружаете есп новой версии (словарь english-russian). У вас загрузится новая английская версия вашего мода, теперь необходимо провести сравнение между названием строк в новой версии и в старой, переведенной вами. Нажмите tools и выберите Load esp (Compare), затем выберите есп старой версии (OLD.esp). Программа предложит выбрать вам метод замены и перезаписи:
Все строки (Everything)
Только непереведенные строки (Everything but already translated strings)
Только непереведенные и обработанные (Everything but already translated and validated strings) - никогда не пользовался
Только выбранные строки (Selection only)
Ситуации бывают разные, я обычно выбираю между первыми двумя методами, но в данном конкретном случае при переброске перевода нам надо выбрать метод (Everything).
Если id не изменились, то при нахождении совпадений в качестве перевода строки будет вписываться перевод из старой версии мода. И тут нам снова пригодится одновременный просмотр оригинального текста записи и перевода, ведь может так случится, что id не изменился, но автор изменил название у парочки предметов, и вот ваш перевод перенесся, и в нем эти предметы называются, как в старой версии. Просмотрите внимательно все записи, если где-то перевод не соответствует оригинальному тексту, то просто внесите нужные изменения, мод можно сохранять.
Также программа позволяет создавать словарь для мода (SSTstrings dictionary), эта функция работает в режиме english-russian, но не будет работать в russian->russian, таким образом, вы не сможете создать словарь мода из уже переведенного русского мода. А если попытаться загрузить русский мод в режиме english-russian, то получите кракозябру. Решение простое, вам надо взять английский оригинальный есп и провести сравнение с русским в режиме english-russian, таким образом все строки переведутся и вы сможете создать словарь. Очень полезная функция, всегда создавайте словари переведенных модов, поскольку это сильно поможет упростить перевод модов со схожим текстом в будущем.
Кстати, при выделении какого-либо слова, программа услужливо предложит вам его перевод, встречающийся в официальном переводе игры. Это очень удобно, если вам попадаются имена или названия из оригинальной игры, вы сразу видите, как звали персонажа или еще что-то.
Чуть позже расскажу о переводе скриптов и MCM.
1. Самый простой и ограниченный способ заключается в том, чтобы перевести сообщения в исходнике скрипта и затем скомпилировать исходник в полноценный скрипт. Сей метод плох тем, что в очень многих случаях у вас не будет исходников скрипта. Но по порядку, давайте сначала обсудим данный способ.
Во множестве модов есть скрипты, бывает так, что скрипты содержат текст, вы бы хотели его перевести, но не знаете как. Этого текста нет внутри есп? Все верно, текст находится внутри скриптов (одного или нескольких), относящихся к моду. Скрипты мода лежат в папке scripts, скомпилированные скрипты имеют формат .pex, просмотреть их в специальной программе можно, но бесполезно. Но как же нам тогда перевести текст?
Тут нам и пригодятся исходники. Внутри папки scripts может находиться (если автор не поленился и положил) папка source. Внутри этой папки вы увидите файлы все с теми же названиями, что и у скриптов, но они будут иметь формат .psc. Такой формат имеют исходники скриптов, и вы сможете их прочесть при помощи Notepad++. Вероятно, вы поначалу растеряетесь и не сможете ничего понять из написанного внутри, но не отчаивайтесь, со временем вы научитесь быстро определять, что именно вам нужно перевести, даже не заглядывая в игру.
Но приведу пример:
Я очень рекомендую вам открывать скрипты программой Notepad++, она обладает множеством полезных и необходимых функций, с ней легко и приятно работать, да и документ она отображает 100% верно, в отличие от стандартного блокнота.
Открыв исходник, вы увидите нечто подобное:
int newDamage = armeModel.getbasedamage()
int newGoldvalue = armeModel.getGoldvalue()
Miscobject Lingot = Rep.Get_Material(armeCasse)
bool IsEnchanted = DegWeaponEnchanted.Hasform(armeCasse)
float IsToPay = Rep.TestPerk(Lingot)
int NbreMarteau = player.GetItemCount(marteau)
int PerkSmithEffect = (Player.GetActorValue("Smithing") / 10) as int ;
if(armeCasse.getbaseDamage() >= newDamage) ;
debug.messagebox("This weapon doesn't need to be repaired !")
menu1()
elseif(NbreMarteau == 0) ;
debug.messagebox("I first need a whetstone...")
elseif IsEnchanted && (player.hasPerk(arcaneBlacksmith) == false) ;
debug.messagebox("I do not have the required skill to repair enchanted weapons!")
menu1()
else
if(armeCasse.getbaseDamage() + PerksmithEffect >= newDamage) ;
;RepSound2.play(PLAYER)
player.removeitem(Lingot,1)
armeCasse.setbasedamage(newDamage)
armeCasse.setgoldvalue(newGoldvalue)
debug.messagebox("I need the material: " + Lingot.getName())
Вот он, наш клиент:
debug.messagebox("This weapon doesn't need to be repaired !")
debug.messagebox("I first need a whetstone...")
debug.messagebox("I do not have the required skill to repair enchanted weapons!")
- Нужные вам сообщения часто имеют приписку messagebox или лишь message, но иногда и не имеют, просто по слову message их легче всего отличить.
- Нужные вам сообщения обычно имеют определенный смысл, по этому смыслу их легко отличить от прочего технического мусора. Глядите, сообщение "I do not have the required skill to repair enchanted weapons!" явно предназначено игроку в отличие от (player.hasPerk(arcaneBlacksmith).
- Нужные вам сообщения заключены в кавычки "I first need a whetstone..." и при переводе вы не должны ни в коем случае убирать эти кавычки. Возьмем, к примеру, debug.messagebox("I need the material: " + Lingot.getName()). Как мы видим, здесь требуется перевести фразу "I need the material: ".
Вы уже заметили, что между двоеточием и закрывающей кавычкой есть пропуск, так вот при переводе вы обязательно должны сохранить этот пропуск, поскольку после пропуска будет вставлено название некоего материала, а если пропуск убрать, то двоеточие и название сольются вместе. В итоге у вас получится "Мне нужен материал: ", а целиком строка будет выглядеть так:
debug.messagebox("Мне нужен материал: " + Lingot.getName())
Таким образом, вы просматриваете все исходники и находите в них строки, требующие перевода, после чего вы их аккуратно переводите.
Итак, вы перевели все необходимые сообщения, теперь просто сохраните скрипты.
Я надеюсь, у вас лицензионная копия игра и вы уже установили Creation Kit в стиме, поскольку без CK дело дальше не двинется.
Вы установили CK, и перевели исходники скриптов. Теперь вы должны взять переведенные исходники и положить их в папку Skyrim\Data\Scripts\Source.
Включайте CK, нажимайте вкладку Gameplay и выберите Compile Papyrus Scripts. Программа может зависнуть на несколько минут. Дальше откроется окно "Pick Script to Compile" (окно может открыться, но будет скрыто из виду другими окнами, так что вы можете не заметить его, но если программа отвисла после нажатия кнопки. то значит окно открылось, поищите его).
Рассмотрим окно "Pick Script to Compile". В нем перечислены все исходники скриптов, лежащие в папке Source. Полистайте список и отыщите свои переведенные скрипты, отметьте их галочкой, когда отметите все, нажмите кнопку Compile. Откроется другое окошко, где будет виден прогресс компиляции. Думаю, вы обладаете достаточным знанием языка, чтобы понять, что означают тамошние надписи, если скрипт обработался успешно, то справа от названия будет написано Success и окошко закроется после компиляции, если что-то пошло не так, то будет написано Failed и снизу выведена информация о неудаче. Успешно скомпилированные скрипты будут находиться в папке Skyrim\Data\Scripts и иметь формат .pex. Замените нашими переведенными и скомпилированными скриптами оригинальные англоязычные. Теперь в игре все сообщения, зашитые в скрипты, будут на русском языке.
Помните, что для теста скриптов, вы должны грузить сохранение игры, сделанное без использования модов, поскольку Skyrim кеширует скрипты и хранит их внутри сохранения. Иными словами, если вы сделали сохранение с включенным модом, то чтобы скрипты стали русскими, вам придется полностью удалить мод, сделать сохранение без него, установить уже полностью русскую версию мода и загрузить последнее сохранение
Вот вы и перевели скриптовые сообщения мода. Поздравляю!
Чем плох и опасен этот метод? Исходники могут оказаться недоделанными, старыми, их может не хватать. Авторы частенько кладут их, чтобы поделиться с другими скриптерами информацией, но забывают обновлять и добавлять.
2. Но что делать, если скрипт никак не желает успешно компилироваться, или если автор не положил исходников, или вы подозреваете, что они некачественные и старые - как же быть тогда? Здесь, друзья, я расскажу вам о втором методе перевода скриптов, это мой любимый метод.
Вам обязательно понадобится: установленный Creation Kit, программа Notepad++, а также программа, разработанная нашим добрым другом Кербером. Эта программа является уникальной разработкой специально для tesall.ru, так что вновь прошу вас, не распространяйте ее на других сайтах. Программу вы можете скачать в рабочем разделе базы файлов, она видна лишь определенным группам.
Поговорим о программе. Она имеет 3 функции:
Ассемблер
Дизассемблер
Компилятор
Нас более всего интересуют первые две функции (Ассемблер и Дизассемблер).
Третья функция "Компилятор", является по сути тем же самым компилятором скриптов, который мы использовали в первом методе, она работает точно так же. Я немного расскажу об этой функции и больше мы к ней возвращаться не будем. Чтобы с ее помощью скомпилировать нужные нам скрипты, вам надо положить исходники в папку source, в самой программе нажать кнопку "Добавить файлы", выбрать перемещенные исходники, в строке результат нажать кнопку "обзор" и выбрать папку Data\Scripts. Затем нажмите кнопку "Компилировать". Если скрипты сами по себе нормальные и вы не допустили ошибок при переводе (например, случайно стерли кавычку), то исходник скомпилируется в .pex и окажется в папке Data\Scripts. По сути, это просто еще один вариант компилятор из первого метода, и ничем от него не отличается. И да, вам все также нужен CK, иначе Papyrus Assembler GUI не заработает.
Но вернемся к куда более важным функциям, а именно функциям Ассемблер и Дизассемблер. Уверяю, они не раз вас выручат в будущем.
Предположим, автор не положил в архив с модом исходников своих скриптов, и вы никак не можете перевести их теперь. В таком случае на помощь вам придет функция дизассемблирования скрипта.
Создадим отдельную папку для программы, положим в нее программу, а теперь перетащим все скрипты мода (.pex) в эту папку. Откроем программу, выберем функцию "Дизассемблер", затем нажмем кнопку "Добавить файлы" и в открывшемся окошке выберем все перетащенные скрипты и нажмем "открыть". В окне "исходные файлы" отобразятся все выбранные нами скрипты. Нажмите кнопку "Дизассемблировать", тогда все выбранные вами скрипты будут дизассемблированы в то же место, где находятся программа и .pex скрипты. Дизассемблированные скрипты имеют формат .pas, а в их названии перед форматом файла заодно содержится приписка .disassemble.
Дизассемблированные скрипты выглядят примерно так же, как и исходники:
ISubtract ::temp23 newAR ::temp23 ;@line 142
IMultiply ::temp23 ::temp23 50 ;@line 142
Cast ::temp29 ::temp23 ;@line 142
Assign IsToPay ::temp29 ;@line 142
Jump _label19 ;@line 142
_label19:
CompareLT ::temp31 indic 0 ;@line 145
JumpF ::temp31 _label20 ;@line 145
CallStatic debug messagebox ::NoneVar "Sorry. Error: Your equipment can't be repaired." ;@line 146
Jump _label21 ;@line 146
_label20:
CallMethod getArmorRating armureCasse ::temp23 ;@line 147
CompareGTE ::temp28 ::temp23 newAR ;@line 147
JumpF ::temp28 _label22 ;@line 147
CallStatic debug messagebox ::NoneVar "This piece of armor doesn't need to be repaired !" ;@line 148
CallMethod menu1 self ::NoneVar ;@line 149
Jump _label21 ;@line 149
_label22:
Cast ::temp25 Lingot
Как видите, принципы определения нужных вам строк все те же, часто они содержат слова message и messagebox, а фраза, требующая перевода, имеет в этом случае даже еще больше смысла, чем технический мусор ее окружающий. Все так же мы переводим сообщение в кавычках, сохраняя сами кавычки. ПОМНИТЕ, вы можете, как угодно переводить фразу внутри кавычек, но вы не должны ничего изменять за пределами кавычек, вы не должны изменять сами кавычки, как то стирать кавычки, случайно ставить лишние кавычки. Да, стоит это упомянуть, сообщение в кавычках не должно содержать прочих кавычек, вместо этого используйте апостроф (код: alt+39 на numpad). Приведу пример
Исходное сообщение:
"This piece of armor doesn't need to be repaired !"
Если вам требуется выделить нечто в сообщении, то используйте апостроф:
"Эта 'часть брони' не требует починки!"
Неправильно делать так:
"Эта "часть брони" не требует починки!"
В этом случае ваш скрипт не скомпилируется. В кавычки должно быть заключено исключительно само сообщение.
Итак, вы просмотрели весь документ, отыскали все сообщения и перевели их. Дизассемблированный скрипт куда больше исходника. Возможно, вам будет сложно просмотреть весь скрипт и отыскать все сообщения, требующие перевода. Лично я поступаю так: открываю дизассемблированный скрипт в notepad++, нажимаю ctrl+f, открывается окошко поиска, в поле "найти" я просто вписываю кавычку " и нажимаю кнопку "найти все в текущем документе", таким образом, мне выдаст окно со всеми строками, содержащими кавычки. Оно все еще может быть большим, но все же информации в нем куда меньше, чем в полном документе. Я сейчас работаю со скриптом, и поиск выдает мне 154 строки вместо 1300 в полном документе, то есть разница в количестве строк, которые надо просмотреть, весьма существенная.
Итак, вы дезассемблировали скрипты мода, просмотрели их на предмет сообщений, перевели их, просто сохраните их. Дальше мы будем ассемблировать их и превращать обратно в формат .pex.
Перво-наперво вы должны удалить из названия дизасссемблированных скриптов часть .disassemble, поскольку, чтобы скрипты ассемблировались, они должны называться своим оригинальным именем, то есть так, как они назывались до дизассемблирования.
Пример:
Оригинальный скрипт называется
DegRepairBenchScript.pex
Дизасемблированный скрипт
DegRepairBenchScript.disassemble.pas
Чтобы ассемблировать этот скрипт, он должен выглядеть так
DegRepairBenchScript.pas
Видите? Мы удалили из названия часть .disassemble, появившуюся после дизассемблирования.
Теперь мы вновь открываем нашу программу, между этим вы можете убрать из папки с программой оригинальные скрипты, поскольку они нам там только помешают, ведь мы будем превращать наши переведенные в них же с тем же именем, в общем, от греха подальше.
Итак, мы открыли программу, выберите функцию "Ассемблер", а дальше все по старому сценарию. Нажмите кнопку "Добавить файлы" выберите ваши переведенные .pas и нажмите кнопку "Ассемблировать", если вы в процессе перевода нигде не задели кавычек, не поставили лишних кавычек, а строго вписывали свой перевод внутри существующих кавычек, то скрипт в 100% случаев ассемблируется обратно в .pex.
Вот ваши переведенные скрипты обратно ассемблированы в формат .pex, теперь осталось заменить ими оригинальные скрипты и проверить все в игре, возможно, вы что-то забыли перевести или совершили опечатку, тогда вы со спокойной душой можете дизассемблировать ваш переведенный скрипт, исправить свою ошибку, и ассемблировать скрипт обратно в .pex.
Ура! Вы только что перевели скрипт, не имеющий исходников. Теперь вы способны на перевод большинства модов.
Лично я перевожу данным методом любые скрипты, даже если автор положил исходники. Поскольку с данным методом работать куда быстрее, чем с компилятором, да и скрипты всегда ассемблируются обратно в pex, если конкретно я не допустил никаких ошибок, в отличие от метода компилятора, когда скрипт может не компилироваться по непонятной мне причине.
Чуть позже я расскажу о переводе скриптов MCM меню мода SkyUI. Авторы далеко не всегда создают текстовый файл для перевода и не всегда кладут исходники скриптов, но вот в переводе mcm скриптов посредством дизассемблирования есть своя небольшая хитрость. Я пока что попью чаю, а вы попрактикуйтесь с первыми двумя методами, особенно со вторым, он вам жизненно необходим.
1. Это когда автор озаботился создать специальный текстовый файл для перевода mcm меню из своего мода. Этот файл находится в папке Interface\Translations
Он называется следующим образом:
Название мода_Название языка.txt
К примеру вот
achievethat_RUSSIAN.txt
Я рекомендую писать название языка капсом, может это и ошибочно, точно не знаю, но парочку раз у меня не работал файл перевода без этого.
Итак, мы открываем этот файл перевода, а если для нашего языка его нет (есть только английский), то создаем его, затем копируем в него информацию из английского
Вот английский achievethat_ENGLISH.txt
$Achievement Points Achievement Points
$Achievements Achievements
$Settings Settings
$Progress Progress
$AT_QN Enable Completed notifications
$AT_DN Enable upper left corner notifications
$Character Character
$Attributes Attributes
Мы копируем данный текст в achievethat_RUSSIAN.txt
и переводим
$Achievement Points Очки достижений
$Achievements Достижения
$Settings Настройки
$Progress Прогресс
$AT_QN Включить уведомления о выполнении
$AT_DN Включить уведомления в верхнем левом углу
$Character Персонаж
$Attributes Характеристики
Как видите, тут все крайне просто. Переводим, сохраняем, проверяем в игре, меню переведено, все счастливы.
Дальше существует масса различных ситуаций.
Может случиться так, что автор пропустил одну строку и не добавил ее в файл перевода, то есть мы никак не можем перевести с помощью файла перевода. Здесь у нас есть следующие возможности.
Если автор положил исходник скрипта mcm меню, то вы можете изменить сам скрипт, делается это точно так же, как и перевод скрипта. Вы находите строку, которая не была помещена в файл перевода и дальше вы имеете различные варианты действия:
1. Перевести саму строку в скрипте и скомпилировать скрипт.
2. Заменить сообщение в кавычках на некий ключ, например, сообщение в кавычках "cake is lie", вы можете заменить это сообщение на ключ cake и поставить перед ним символ $, таким образом выйдет "$Cake", а затем вы просто добавляете этот $cake в свой файл перевода и нажав tab, пишите рядом перевод оригинальной фразы
$AT_DN Включить уведомления в верхнем левом углу
$Character Персонаж
$Attributes Характеристики
$Cake Торт — это ложь
2. Но предположим, файла перевода нет, и исходника скрипта mcm меню тоже нет. Тогда нам лишь остается обратиться к дизассемблеру и ассемблеру скриптов. Выше я уже объяснял вам, как это делается, так что рассчитываю, что вы уже знаете. Должен однако заранее предупредить, что не существует 100% гарантии, что у вас выйдет целиком перевести MCM меню, поскольку некоторые авторы создают скрипт таким образом, что название страниц перевести невозможно. К счастью, это достаточно редкое явление.
Итак, как и в случае с обычным скриптом, мы дезассемблируем скрипт нашего меню. Создавать файл перевода мы не будем (лично мне лень), так что будем переводить сразу сам скрипт. Перво-наперво надо запомнить, что перед переводом вы должны переключить кодировку документа в UTF-8 (без BOM), вы открываете дизассемблированный скрипт в notepad++ и выбираете закладку "Кодировки", где выбираете указанную кодировку, затем вы начинаете переводить скрипт. Смысл этого я объясню чуть позже.
Должен сказать, что МКМ скрипт содержит куда больше технического мусора, а также ложных сообщений, которые не нуждаются в переводе, но выглядят осмысленно.
Приведу пример:
Line 513: CallMethod AddSliderOption self ::temp3 "Stamina Threshold" ::temp5 "{0}%" 0 ;@line 76
Line 521: .docString "Called when the user selects a slider option"
Line 599: CallMethod SetInfoText self ::NoneVar "Potions will only be automatically used on combat." ;@line 234
Line 111: Assign ::ModName_var "Swift Potion" ;@line 29
Line 114: Assign ::temp1 "Options" ;@line 31
Line 120: .docString "Function that returns the current state"
Line 132: .docString "Function that switches this object to the specified state"
Line 148: .docString "Called when the user selects a non-dialog option"
Line 303: CallMethod SetSliderOptionValue self ::NoneVar a_option a_value "{1}" False ;@line 174
Line 310: .docString "Called when a key has been remapped"
Line 339: CompareEQ ::temp19 a_conflictName "" ;@line 186
Line 342: StrCat ::temp20 "This key is already mapped to:\n'" a_conflictControl ;@line 187
Line 343: StrCat ::temp20 ::temp20 "'\n(" ;@line 187
Line 345: StrCat ::temp20 ::temp20 ")\n\nAre you sure you want to continue?" ;@line 187
Line 349: StrCat ::temp20 "This key is already mapped to:\n'" a_conflictControl ;@line 189
Строки
.docString "Called when the user selects a slider option"
.docString "Function that returns the current state"
.docString "Function that switches this object to the specified state"
.docString "Called when a key has been remapped"
Как вы видите, эти сообщения явно не для игрока.
а вот эти строки следует перевести
Assign ::ModName_var "Swift Potion" - название мода
Assign ::temp1 "Options" - название страницы с настройками
StrCat ::temp20 ::temp20 ")\n\nAre you sure you want to continue?" - еще одно сообщение. Кстати, видите скобку и \n внутри кавычек? Вы ни в коем случае не должны их удалять
Итак, пользуясь знаниями языка и логикой, мы находим сообщения требующие перевода, помните, кодировка у нас выставлена UTF-8 (без BOM) при этом, мы переводим все эти сообщения как обычны. А затем мы вновь меняем кодировку документа, в этот раз мы кодируем в ANSI. И что же происходит? Все наше переведенные сообщения превращаются в абракадабру. Но это нам и нужно.
Зачем это нам нужно? Посмотрите на следующее изображение
Видите названия страниц в красной рамке? Дело в том, что эти названия являются (как это понимаю я) ссылками, а ссылки не работают, если написаны кириллицой, потому мы используем такую хитрость, мы пишем русское название в utf-8, а потом переводим в ansi, таким образом, ссылки работают, а в игре отображает русское название. Для остальной части документа (зеленые и синие рамки) кодировка utf-8 (без BOM) необязательна, но лично я перевожу весь документ целиком в utf и затем кодирую в ANSI. Если не использовать хитрость с кодировкой, то страницы не будут работать и не будут ничего отображать.
К сожалению, бывает ситуация, когда автор создает меню таким образом, что перевести названия страниц невозможно. К счастью, содержание страниц переводится так же, как написано выше. Но почему названия страниц перевести невозможно? Приведу пример из моей практики, дизассемблированный скрипт содержал строки с названием этих страниц, при их переводе в кодировке utf-8 ничего не произошло, а если говорить точнее, названия остались на английском, а вот страницы работать перестали. Я решил копать глубже и выяснил, что название страниц находится properties скрипта (что это такое я объясню позже), который можно изменить с помощью CK. Но проблема в том, что у нас идет, как бы, ссылка на ссылку, мы не можем использовать в скрипте кириллицу и потому создаем удобоваримую игрой абракадабру, но в properties мы ее создать не в состоянии, мы можем использовать там либо кириллицу, либо латиницу, и в любом случае выходит, что название, оставленное в properties, не соответствует названию в скрипте, так что единственный найденный мною выход, это не переводить в таком случае названия страниц. Хоть это и слегка некрасиво, но главное, что сами настройки мы в состоянии перевести, а они ведь куда важнее.
Вот таким образом, можно переводить скрипты MCM меню. Скрипты бывают разные, временами встречаются весьма нестандартные. В некоторых скриптах есть обманчивые сообщения, которые почти невозможно отличить от тех, которые следует перевести, но если перевести эти обманчивые сообщения, то какая-то часть МКМ меню может перестать работать.
Например, мод TK Combat, в нем есть настройка горячих клавиш в МКМ, когда я открыл скрипт, то увидел следующее
Line 60: .initialValue "Back"
Line 88: .initialValue "Right"
Line 116: .initialValue "Neutral"
Line 140: .initialValue "forward"
Line 192: .initialValue "Left"
Line 198: .docString ""
Line 240: CallMethod SetSliderOptionValue self ::nonevar MagickaCostID MagickaCost "Стоимость: {0.0}" False ;@line 351
Перевод строк с initialValue привел к поломке скрипта и неработоспособности горячих клавиш. В общем, после перевода не забывайте хорошенько протестировать меню.
3. Какие еще существуют способы перевода скриптов вообще и МКМ меню в частности?
В первом сообщении темы я рассказывал о программе TESVTranslator - SkyrimStringTranslator. Так вот помимо перевода есп и есм, эта программа также умеет переводить скрипты и файлы перевода MCM меню.
Давайте рассмотрим подробнее:
1. Допустим, у вас есть файл перевода, выберите вкладку file и нажмите "Load MCM/Translate file.
Программа может читать файл перевода как из BSA архива, если файлы мода упакованы в него, так и просто txt файл, если файл находится в папке interface/translations. Когда я писал этот мануал, то файлы используемого мною для примера мода были упакованы в BSA, я просто выбрал и открыл его.
Передо мной предстала знакомая картина
Если вы уже научились пользоваться программой и знакомы с файлами перевода МКМ меню, то здесь для вас будет все более чем очевидно. Кстати, помните функцию сравнения есп и есм? Так вот она доступна и для файлов перевода МКМ (tools - load mcm/translate (compare)), все так же, как и в случае сравнения есп. Очень удобно.
2. TESVTranslator также умеет переводить скрипты. Да, да, вы не ослышались. Программа и правда умеет переводить .pex файлы, данная функция все еще в зачаточном состоянии, но ею вполне можно пользоваться, я уже перевел с ее помощью несколько скриптов, как обычных, так и МКМ.
Открываем программу, нажимаем file -> load PapyrusPex (Experimental/Alpha) и выбираем наш скрипт из папки Data\Scripts. Открываем его, соглашаемся с предупреждением. А дальше мы видим вот такую картинку (это мкм скрипт)
Программа сама пытается отделить строки, которые вам следует переводить, от строк, которые не следует переводить (помечены замочком). Надо сказать, программа справляется весьма успешно в большинстве случаев, но все же она не человек, а потому изредка может закрыть замочком строку, которая все-таки нуждается в переводе, тогда используйте метод дезассемблирования. Переведите все непомеченное замочком, сохраните скрипт, а затем дезассемблируйте и допереведите. Весьма экономит время.
Также стоит отметить приятное дополнение. Допустим, у вас обновился мод и скрипты соответственно, положите старый и новый скрипт в папку scripts, откройте два окна программы, в одном загрузите новый скрипт, в другом загрузите старый скрипт, таким образом можно легко сравнивать и переносить перевод из скрипта в скрипт.
Теперь что касается перевода обычных скриптов, то есть не МКМ скриптов, с помощью TESVTranslator. Тут все чуточку сложнее. Видите ли, программа при переводе скриптов кодирует их в UTF-8. В случае MCM скриптов с этим нет никаких проблем. Но вот если закодировать обычные месседж боксы и всплывающие месседжи в UTF-8, то в игре их большая часть будет выглядеть, как абракадабра. Обычные скрипты, переведенные на русский язык, должны быть в ANSI.
Таким образом, есть 2 варианта развития событий:
1. Вы отказываетесь от перевода обычных скриптов с помощью программы.
2. Вы используете программу для перевода, а потом дизассемблирование и преобразование.
Мы, конечно же, рассмотрим второй метод.
Открываем наш скрипт в программе, переводим, эта стадия ничем не отличается от перевода МКМ скрипта, все то же самое, даже замочки. Перевели скрипт, сохранили. Теперь берем переведенный скрипт pex и дизассемблируем его в pas. Открываем скрипт в notepad++, выбираем закладку "Кодировки" и нажимаем "Преобразовать в ANSI", именно преобразовать, а не кодировать.
Теперь наш обычный скрипт с месседжбоксами имеет правильную кодировку. Сохраняем его. Затем ассемблируем обратно в pex.
Вот и все! Скрипт переведен и будет правильно отображаться в игре. Вам лишь остается пробовать, практиковаться и экспериментировать, набираться опыта, а через какое-то время вы начнете щелкать все эти скрипты, как орешки.
Мне осталось рассказать только одно о МКМ меню и скриптах, а конкретно перевод названий мода в списке MCM, да и вообще properties в целом, я же выше обещал. Но это в следующем сообщении.
Как видите, в списке 4 мода, лишь название одного переведено. Авторы по разному пишут скрипт МКМ. Если вам повезет, то вы сможете перевести название при переводе скрипта меню, но в большинстве случаев не везет, и название находится в другом месте.
Помните, я упоминал properties? Вот и мы дошли до них.
Итак, чтобы перевести название мода в списке, вам понадобится Creation Kit. Открываем CK. Грузим мод. Мод загрузился. Слева выбираем вкладку "Quest", затем сортируем записи, чтобы записи со звездочкой оказались вверху, вам нужна всего одна из этих записей, отвечающая за MCM, в моем случае такая запись только одна, в целом их не бывает много.
Открываем эту запись. Выбираем вкладку "Scripts". Видите, к записи прикреплен скрипт? Он нам и нужен, именно в этом скрипте содержится строка с названием мода.
А теперь самое главное! Если вы попробуете открыть этот скрипт, то получите вот такую ошибку.
Вы будете всегда получать эту ошибку, если не будете следовать определенным правилам. Я специально решил ее показать заранее, чтобы вы запомнили ее. Как избежать этой ошибки? Как заставить скрипт открыться.
Есть 2 ВАЖНЫХ правила, которые необходимо выполнить, чтобы открыть этот скрипт МКМ меню без ошибки:
1. Скрипты мода, который вы переводите, должны лежать в папке Data\Scripts, скрипты в архиве BSA не подходят! Конечно, на самом деле нужны не все скрипты, а конкретно тот, который связан с тем, что мы пытаемся открыть, но легче и надежнее положить ВСЕ скрипты. Запомните, скрипты мода должны лежать в соответствующей папке игры незапакованными.
2. Скрипты SkyUI ТАКЖЕ должны лежать в соответствующей папке игры незапакованными, только соблюдая оба этих правила, вы сможете открыть тот скрипт в CK. Если не будет скриптов SkyUI в папке Scripts, то вы получите приведенную выше ошибку или схожую с ней, но вы не откроете скрипт.
Итак, я получил ошибку и вспомнил о двух вышеописанных правилах, я сделал все, как надо, поместил незапакованные скрипты обоих модов в соответствующую папку (Data\Scripts). Теперь я перезапускаю CK, вновь загружаю мод, дохожу до скрипта, нажимаю на него, и у меня он открывается.
Вот они наши properties скрипта. И как вы уже догадались, наша цель "ModName" тип String. Выбираем данную строку, в правой части окошка есть поле, вписываем туда русское название мода. Стоит учесть, что меню SkyUI весьма ограничено по ширине, а надпись будет в одну строку, так что придумайте моду название покороче, дабы оно уместилось в границах.
Вы ввели название, нажмите ОК, чтобы закрыть все окна. Затем сохраните мод. Обязательно проверьте его на работоспособность в игре. Да и вообще рекомендую делать бэкап файла перед всей этой операцией. Как бы там ни было, а название мода на русский вы перевели. Поздравляю!
Бывает так, что мод дарует нашему герою некоторые способности, а эти способности в свою очередь при использовании выводят сообщение в левом верхнем углу, очень часто этого сообщения нет ни в есп/есм, ни в скриптах. Как вы уже догадались, эти сообщения находятся в properties, подобно названию мода в MCM. Вот пример из мода "Основные потребности"
При активации мода герой получает способность "Проверить потребности", когда герой ее использует, то в левом верхнем углу выводится информация о потребностях. Чтобы перевести такую информацию нам вновь потребуется сделать то же самое, что и выше, но в этом случае скрипты SkyUI не требуются, хотя и рекомендую переводчикам их всегда держать в распакованном виде в папке scripts. А вот распакованные скрипты мода все так же необходимы. Итак, вы распаковали скрипты в соответствующую папку, включили СK, загрузили мод. Теперь вам необходимо найти способность.
В моем случае это вкладка "Magic Effect". Я сортирую способности, чтобы добавленные модов оказались вверху. Нахожу нужную мне (я уже знаю какая мне нужна, но вот вам в первый раз, возможно, придется и поискать ее, это не всегда очевидно, но в большинстве случаев поиски не занимают много времени).
Открываем способность. Видим, что она связана с неким скриптом.
Помните, что для открытия скрипты все скрипты мода должны быть распакованы в папку Data\Scripts. Открываем скрипт и видим
Нам нужны строки типа string, именно они отображаются в игре при использовании способности, и именно их мы будем переводить. Выбираем каждую строку и вписываем перевод в форму String Value справа. Затем кликаем ОК, чтобы закрыть окно properties и снова ОК, чтобы закрыть окно магического эффекта. Сохраняем мод и проверяем в игре. Вот и вся наука.
Сообщение, выводимое при использовании способности, теперь переведено на русский язык. Ура!
На этом я закачиваю. Спасибо всем, кто прочел от начала и до конца. Надеюсь, этот мануал научил вас чему-то новому, и в будущем вам будет легче переводить моды.