Official: Russian | Русский

Started by AcDie, April 12, 2014, 09:10:13 PM

Previous topic - Next topic

Aragas

Есть тут моды, не поддерживающие перевод, но которые вы хотите увидеть на русском? Я уже перевёл Seeds Please, осталось уточнить только пару моментов.

Antonas

Надоели ваши "уже перевёл" кидайте ссылки даже на сырое.

Humort

Вот новая версия альтернативного перевода, если найдётся доброволец, который будет выкладывать это дело на Git от этого всем станет легче, а пока что, распространяю перевод, по старинке. Будут претензии к переводу - пишите в личку, чтобы другим было легче искать ссылку на перевод.

[attachment deleted due to age]
I speak Russian if you don't understand that I wrote, Google Translator is guilty of it

spivtt

Тем, кто устал ждать пока всякие официальные и неофициальные переводы раздуплятся https://yadi.sk/d/o8KrUNIPikwo3 Переведено вроде бы всё. По мере игры переводил. Если не нравится литературность и всё такое, правим сами, ну или ждём.

Dimonasdf

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

На гитхаб-то заглядывайте - https://github.com/Ludeon/RimWorld-ru

MassDefect

Quote from: Dimonasdf on September 26, 2015, 06:44:04 PM
Большая часть проблем, которые вы можете встретить, будет основана лишь на отсутствии возможности сделать нормально числа и падежи, из-за отсутствия этого в коде игры.
Думаю, склонение слов можно будет добавить, если достать и дописать метод Translate() у строк.
Судя по этому коду:
string droneLevelString = "Error";
switch( droneLevel )
{
case PsychicDroneLevel.BadLow: droneLevelString = "PsychicDroneLevelLow".Translate();
break;
case PsychicDroneLevel.BadMedium: droneLevelString = "PsychicDroneLevelMedium".Translate();
break;
case PsychicDroneLevel.BadHigh: droneLevelString = "PsychicDroneLevelHigh".Translate();
break;
case PsychicDroneLevel.BadExtreme: droneLevelString = "PsychicDroneLevelExtreme".Translate();
break;
}

str.AppendLine("PsychicDroneLevel".Translate( droneLevelString ) );

  <PsychicDroneLevel>Психозонд, уровень: {0}</PsychicDroneLevel>
  <PsychicDroneLevelLow>низкий</PsychicDroneLevelLow>
  <PsychicDroneLevelMedium>средний</PsychicDroneLevelMedium>
  <PsychicDroneLevelHigh>высокий</PsychicDroneLevelHigh>
  <PsychicDroneLevelExtreme>сверхвысокий</PsychicDroneLevelExtreme>

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

RawCode

Код всех методов можно достать ил спаем, там нигде нет обфускации.

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

Соответственно, эта часть должна быть внутри файла локализации.
Каким образом это сделать?
Достаточно просто Translate(1), Translate(2), Translate(3) - каждый вызов в коде имеет свой собственный уникальный номер, можно еще GUID туда запилить 128 битный если сильно надо.

А еще можно через костыли определять место в коде из которого вызван метод Translate() (про это есть методы)

Когда авторы локализации подозревают, что PsychicDroneLevel в одном месте переводится корректно, а в другом какая то шляпа, они кроме PsychicDroneLevel пишут дополнительные строки PsychicDroneLevel#998394 которая выдаёт результат с иным падежом или в ином числе.

выглядеть это будет как то так:
<PsychicDroneLevel#45345345>
45345345 - уникальный указатель данного вызова

<PsychicDroneLevel#Building_PsychicEmanator.*.2.2>

PsychicDroneLevel - ключ на который срабатывает ловушка
Building_PsychicEmanator - класс на который срабатывает ловушка
* - строка на которую срабатывает ловушка, в данном случае любая
2 - родительный падеж
2 - множественное число

соответственно предоставить автора часть кода можно, только никакого результата это не даст, так как кроме части кода еще надо все места где вызывается Translate() разметить а это 1420 случаев.

MassDefect

Quote from: RawCode on November 12, 2015, 07:45:00 AM
Код всех методов можно достать ил спаем, там нигде нет обфускации.
Да, я уже узнал как перекрыть нужные методы в коде. Правда, возникли кое-какие неприятности. Если разбираешься в dll-моддинге, загляни в мою тему.

Quote from: RawCode on November 12, 2015, 07:45:00 AM
Ситуация с падежами и числами следующая, когда автор вызывает Translate() из кода он не знает и не может знать какой падеж и число должны быть применены для конкретного языка именно в этом месте.
Еще важно отметить что не все языки имеют падежи и число, некоторые используют иные структуры.
У меня есть более универсальный вариант. Будет работать практически на всех языках, т.к. для каждого случая можно описать любые структуры (падеж, число, род...). Только с числительными пока нет универсального решения. Но, надеюсь, и с этим можно будет что-нибудь придумать.
В общем, не буду пока ничего расписывать и обещать. Попробую, получится - значит хорошо, не получится - и фиг с ним.

RawCode

Ответил в той теме.

Сразу скажу - с твоими навыками в области C# лучше пиши, что ты хочешь, желательно с примерами и точными указаниями где что и как.

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

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

MassDefect

Quote from: RawCode on November 13, 2015, 05:56:11 AM
Сразу скажу - с твоими навыками в области C# лучше пиши, что ты хочешь, желательно с примерами и точными указаниями где что и как.
Я хочу написать функцию постобработки любой строки в игре перед выводом. В ней будет свёртка специально форматированной строки в правильное русское (или другое) предложение. Пример:
допустим есть строка "{0} укусил {1}" ("Лену укусила белка")
если описать её в файле перевода примерно так:
(~{0}~)*(Вп) (~;МрЕч;укусил%;МрЕч=;ЖрЕч=а;СрЕч=о;Мч=и~)*([2]^рч) [2](~{1}~)
а Лену и белку так:
(~Жр;ЕчИп;Лен%;ЕчИп=а;ЕчРп=ы;ЕчДп=е;ЕчВп=у;ЕчТп=ой;ЕчПп=е~)
(~Жр;Еч;Еч=белка;Мч=белки~)
// не стал расписывать падежи белки
То при замене {0} и {1} в конструкцию вставятся подконструкции. В общем, предложение будет выглядеть как формула, в которой одни элементы могут зависеть от других (пока не буду описывать все правила составления таких конструкций, и правила их работы). Итоговую "формулу" нужно будет один раз перед выводом выполнить/свернуть в нормальное предложение. Этим и должен был заниматься метод PostProcessed, который я никак не могу перегрузить.

RawCode

в экселе такое писал на визуал бейзике......

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

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



MassDefect

Quote from: RawCode on November 13, 2015, 08:15:31 AM
я сделал вывод с этого метода в консоль, так вот, Ты уверен что именно этот метод позволяет достигнуть указанной цели, у меня вообще кроме тестовых вызовов и парочки совершенно ниочёмных вызовов не произошло и я так и не понял откуда этот метод в принципе вызывается.
я конечно предполагаю что это будет для истории и скульптур, но всё равно.
Этот метод посоветовал мне Tynan. Я писал ему на почту, и он ответил:
QuoteThis postprocessing is actually already in the game. If you wrote a mod with a DLL, and made a new translation, you could use it. It's even used in English to fix things like "a animal" to "an animal".

To see the details of how the code works, use a C# decompiler  like dotPeek to look inside Assembly-CSharp.dll. The class you want to override is called Verse.LanguageWorker. Using that, and specially formatted translations, you could achieve almost anything.

MassDefect

Quote from: RawCode on November 13, 2015, 08:15:31 AM
регулярные выражения это конечно круто, но такое пишется сначала в большой столбик и только когда всё чотко складывается в регулярку.
То что привёл я - не регулярка. Регулярные выражения служат в основном для поиска и извлечения некоторых данных из текста. А я привёл нечто другое. Всё завязано на ключи (падежи, рода(ы), числа и т.д. в зависимости от языка). Конструкции можно "умножать" на нужные ключи и получать слова и словосочетания в нужной форме. Так-же можно извлекать нужные ключи из конструкции (например, извлечь ключ "р" (род) из конструкции "белка") и подставлять их в нужное место. Долго объяснять, если всё получится, то я обязательно распишу подробно формат описания и правила вычисления таких конструкций.

RawCode

        public override string PostProcessed(string str)
        {
            Log.Warning(str);
            return "TEST";
        }


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

первый раз когда я реально заметил его работу - название колонии
второй раз - имена скульптур (что собственно видно из кода)

белка это или "белка" или "недостаточно белка"

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

MassDefect

Quote from: RawCode on November 13, 2015, 09:40:23 PM
вот такой замечательный код, который вызывается и всё чотко, только это сделано для английского языка, но не суть.
Т.е. нужно будет подменять английский русским? Или нужно править саму Assembly-CSharp.dll? Как мне дальше то поступить? Я уже везде вставлял свою dll-ку и всяко описывал. Не работает она.
Quote from: RawCode on November 13, 2015, 09:40:23 PM
белка это или "белка" или "недостаточно белка"
извлечь падеж невозможно из слова, так как очень многие слова пересекаются.
Опять ты меня не понял. При переводе мы все слова описываем. Их падежи и прочее, формы которые они принимают. Всё это описывается тем, кто делает перевод. Да, труд огромный, но необходимый.