Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

XEEN RU Localization #3149

Closed
wants to merge 20 commits into from
Closed

XEEN RU Localization #3149

wants to merge 20 commits into from

Conversation

@Ardash
Copy link

@Ardash Ardash commented Jul 12, 2021

I've added support for Russian version of Clouds of Xeen

@sev-

This comment has been minimized.

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

This comment has been minimized.

Copy link
Owner Author

@Ardash Ardash replied Mar 18, 2021

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

Тут проблема в том, что в оригинале идет хардкод day и к нему передается %c char 's', а у нас надо передать %s строку "день"/"дня"/"дней". Поэтому, из-за разных типов параметра, пришлось продублировать.

This comment has been minimized.

Copy link

@sev- sev- replied Mar 18, 2021

Так всё в твоих руках: выкинь хардкод из английского, то есть, поменяй "day%c" на "%s". Тогда сможешь сделать getDayPlurals, внутри которой проверяй язык и для англ возвращай "day/days".

Только комментарий оставь, что поменял

This comment has been minimized.

Copy link
Owner Author

@Ardash Ardash replied Mar 18, 2021

Так всё в твоих руках: выкинь хардкод из английского, то есть, поменяй "day%c" на "%s". Тогда сможешь сделать getDayPlurals, внутри которой проверяй язык и для англ возвращай "day/days".

Только комментарий оставь, что поменял

Я думал об этом, но меня остановило вот что:
Сейчас движок можно собирать без использования ccs-файла. Если я поменяю, то получится, что в версии без ccs я в параметр %c передам const сhar*, что приведет к вылету.

This comment has been minimized.

Copy link

@sev- sev- replied Mar 18, 2021

Я немножко не понял, как это "без ccs". Движку этот файл нужен по-любому.

Так вот. строка 42 create_xeen.cpp, увеличиваешь номер версии на единичку. И, соответственно, меняешь в engines/xeen/files.cpp на строке 275.

This comment has been minimized.

Copy link
Owner Author

@Ardash Ardash replied Mar 18, 2021

Я немножко не понял, как это "без ccs". Движку этот файл нужен по-любому.

Так вот. строка 42 create_xeen.cpp, увеличиваешь номер версии на единичку. И, соответственно, меняешь в engines/xeen/files.cpp на строке 275.

Я оказался не прав. Когда только начинал изучать код, увидел в rc-файле #if PLUGIN_ENABLED_STATIC(XEEN) и подумал, что можно собрать без ccs (чтобы например выдернуть строки из exe/dat -файла).
Если мы всегда собираемся с ccs - это полностью меняет дело.

@sev-

This comment has been minimized.

Я бы назвал getPlurals(), и внутри делал проверку на язык.

This comment has been minimized.

Copy link
Owner Author

@Ardash Ardash replied Mar 18, 2021

Я бы назвал getPlurals(), и внутри делал проверку на язык.

Можно и так. getRuDayPlurals

@sev-

This comment has been minimized.

Copy link

@sev- sev- commented on engines/xeen/font.cpp in 1cf6d6c Mar 18, 2021

все эти переменные лучше засунуть в класс FontSurface, ты же только внутри него делаешь к ним доступ.

Ну, и назвать соответствующе. не offset_fntEn, а _offsetFntEn.

Про именование тут: https://wiki.scummvm.org/index.php?title=Code_Formatting_Conventions#Naming

@sev-

This comment has been minimized.

Copy link

@sev- sev- commented on engines/xeen/font.cpp in 1cf6d6c Mar 18, 2021

пробел затесался случайно

@sev-

This comment has been minimized.

Copy link

@sev- sev- commented on devtools/create_xeen/constants.cpp in 73a8839 Mar 18, 2021

чтобы всё это не переименовывать для одновременного присутствия рус/англ, засунь в два разных namespace.

@sev-

This comment has been minimized.

Copy link

@sev- sev- commented on devtools/create_xeen/constants.cpp in 96dbad8 Mar 19, 2021

Лучше разбей на два файла, просто перенеси содержимое как есть.

This comment has been minimized.

Copy link
Owner Author

@Ardash Ardash replied Mar 19, 2021

Да. Это еще не окончательный вариант. Просто залил рабочий вариант, чтобы не потерять большой объем проделанной работы.

Split language constants
Further sharpening ru translation
@sev-

This comment has been minimized.

Copy link

@sev- sev- commented on devtools/create_xeen/ru_constants.h in f9de073 Mar 19, 2021

Про кодировки тебе понятно, что я там на форме понаписал или нужна помощь?

This comment has been minimized.

Copy link
Owner Author

@Ardash Ardash replied Mar 19, 2021

Это я, похоже, в 1251 вместо utf-8 залил. Поправлю.

This comment has been minimized.

Copy link

@sev- sev- replied Mar 19, 2021

Не, я не это имел в виду. Нужно текст в строке перекинуть в hex (\xNN), а в комменте после каждой строки в UTF8 написать оригинал.

This comment has been minimized.

Copy link
Owner Author

@Ardash Ardash replied Mar 19, 2021

Ну сейчас почти так и есть, только коммент перед функцией

This comment has been minimized.

Copy link

@sev- sev- replied Mar 20, 2021

Не понимаю. Я имею в виду записать вот так:

"c\f35\xc8\x87\xde....\n" //  "c\f35Идея и руководство проектом:\n"
@sev-

This comment has been minimized.

Copy link

@sev- sev- commented on engines/xeen/party.h in e955f8c Apr 8, 2021

const char *getFoundForm(const Character &c);, и ниже тоже. Пробел перед оператором разыменования.

@sev-

This comment has been minimized.

Copy link

@sev- sev- commented on engines/xeen/party.cpp in e955f8c Apr 17, 2021

у нас оператор ссылки лепится к переменной, а не к типу, то есть const char *Party::get...

@sev-

This comment has been minimized.

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

This comment has been minimized.

Copy link

@sev- sev- replied Apr 17, 2021

Да, вижу ниже, что ты именно так и сделал, хорошо.

Пишу тут про другую проблему -- в комментарии не UTF-8, надо бы исправить. Получилась буква "Â"

This comment has been minimized.

Copy link
Owner Author

@Ardash Ardash replied Apr 18, 2021

Нет, не получается. Я сначала пытался совместить, но дальше много пересечений. Плюс тут кнопки реализованы так, что нажатие мышкой на кнопку порождает нажатие буквы (последний параметр у addButton)

@sev-

This comment has been minimized.

До меня только дошло, что меня цепляло. Все-все сравнения языка лучше писать как

if (g_vm->getLanguage() != Common::RU_RUS)

вместо постоянного выковыривания из ConfMan

This comment has been minimized.

Copy link
Owner Author

@Ardash Ardash replied Apr 18, 2021

Ок. Я как раз это и пытался найти

@sev-

This comment has been minimized.

Если это fall through, то нужно добавить коммент:

// fall through

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

@sev-

This comment has been minimized.

Походу в комментарии это не UTF-8 получился

@sev-

This comment has been minimized.

Та же беда с комментариями

@sev-

This comment has been minimized.

Чего-то меня эта копипаста смущает. Не проще ли сделать некую табличку маппинга для _buttonValue в зависимости от языка, а саму логику оставить как есть (ну, или с парой проверок так, где нужно), а не копировать целиком 200 строчек кода?

@sev-

This comment has been minimized.

Аналогичное замечание по кодировке комментариев и дублированию кода

@sev-

This comment has been minimized.

...и тут тоже

@sev-

This comment has been minimized.

И даже тут. Можно было сделать табличку.

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

Вот доки: https://wiki.scummvm.org/index.php?title=Keymapper

Пожалуй, самый развесистый пример в Wintermute: https://github.com/scummvm/scummvm/blob/master/engines/wintermute/keymapper_tables.h

Пример, как оно вкручивается в движок, вот тут: scummvm#2428 или тут: scummvm@cce713e

Hotkeys changed in char_info, control_panel, create_char, difficulty dialogs.
@sev-

This comment has been minimized.

Copy link

@sev- sev- commented on devtools/create_xeen/en_constants.h in 7a80ba7 May 27, 2021

Ой, а зачем так сложно? Ведь можно было просто сделать enum, табличку, и скормить KeyMapper. Вот пример: https://github.com/scummvm/scummvm/blob/master/engines/wintermute/keymapper_tables.h

Вот документация: https://wiki.scummvm.org/index.php?title=Keymapper

This comment has been minimized.

Copy link
Owner Author

@Ardash Ardash replied May 27, 2021

Я потратил огромное количество времени на изучение возможности интеграции этого в реализацию движка xeen. Это огромная работа, которая потребует радикального переписывания реализации кнопок в движке для использования этих Action'ов.
Моя текущая реализация мне кажется в разы проще

This comment has been minimized.

Copy link

@sev- sev- replied May 27, 2021

Твоя реализация просто несовместима с KeyMapper.

Концепция KeyMapper довольно прямолинейна -- искусственные события. Вот, у тебя есть такой код: case Common::KEYCODE_g: Вместо него пишешь case Common:: kMyActionGobber , предварительно его заведя заголовочных файлах.

Далее, создаёшь один метод

Common::Keymap *XeenEngine::initKeymap(const char *target) {
   ...
    act = new Action("GOBBER", _("Gobber"));
	act->setCustomEngineActionEvent(kMyActionGobber);
	act->addDefaultInputMapping("g");
	engineKeyMap->addAction(act);

И ловишь эти события не в KEYDOWN, а специальное событие Common::EVENT_CUSTOM_ENGINE_ACTION_START.

Всё. Может ты просто не знал куда смотреть, по поводу интеграции.

Если хочется иметь разные назначения клавиш по умолчанию в зависимости от языка, тебе на initKeyMap приходит target. Значит, просто пишешь: Common::Language lang = Common::parseLanguage(ConfMan.get("language", target)(; и далее заводишь кнопки в зависимости от языка.

This comment has been minimized.

Copy link
Owner Author

@Ardash Ardash replied May 27, 2021

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

Ardash added 3 commits May 28, 2021
Hotkeys changed in items dialogs.
Hotkeys changed in party, quests, quick_fight, spells dialogs and bank location.
Hotkeys changed in locations, CoX Menu.
@sev-

This comment has been minimized.

Copy link

@sev- sev- commented on a9ea383 Jul 12, 2021

Ну что, давай делать Pull Request?

This comment has been minimized.

Copy link
Owner Author

@Ardash Ardash replied Jul 12, 2021

Ну что, давай делать Pull Request?

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

This comment has been minimized.

Copy link

@sev- sev- replied Jul 12, 2021

Я закрыл Pull request.

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

Во-вторых, нужно сделать rebase на текущий master, потому что патч уже не прикладывается.

Ну, и без ссылок на варезные сайты, пожалуйста.

This comment has been minimized.

Copy link

@sev- sev- replied Jul 12, 2021

Напиши плиз http://www.questomania.ru/

@sev- sev- closed this Jul 12, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
2 participants