В общем, я вижу решение задачи следующим:
Программная часть:
В настройках добавляется пункт Language, который имеет цифровое значение
Все строковые константы выносятся в отдельный файл. Оформляются, например, “ittypdef_cpp_corpse_DSC” (описание трупа в файле ittypdef.cpp), указывая в названии имя файла, где использовалась константа. Для каждого языка соответственно имеется свой файл.
Добавляется модуль, который выполняет две функции. Во-первых, при старте программы загружает языковые константы из соответствующего файла. Во-вторых, по требованию возвращает требуемый текст по идентификатору, т.е. вместо
получаем
Для учета согласования слов и пола говорящих, фразы имеют несколько вариантов. Кроме того фраза может содержать спецсимвол указывающий, например, на необходимость следующую фразу взять во второй форме (Взять + зажигалка -> Взять + зажигалку). Перенос части логики в сами фразы обусловлен тем, чтобы не править код при переводе на разные языки, а править только текст. Что-то там + предмет и крутитесь, как хотите.
Текстовая часть:
Оформляется электронная таблица для перевода. Сожержит секции соответствующие исходным файлам, с колонками:
английский текст
русский текст
примечания (если кто-то не согласен и хочет поправить, то дописывает это в комментарии)
при необходимости код, который генерирует этот текст (статическую фразу перевести просто, сложности кроются в составлении предложений)
Электронная таблица также может компоновать текст в блоки кода, которые можно будет сразу вставлять в программу. Мне так делать очень нравится=)
Соответственно я против просто правки английского текста на русский в коде, я за добавление возможностей подключения разных языков.
Готов заняться организационной и программной частью этой затеи. aiwant2tc, берешься за перевод?
Кнопки действий остаются английскими. То есть будет (Y)Да / (N)Нет.
Ну и предвижу сложность в том, что русские слова могут быть длиннее английских.
Я ещё сам хотел спросить про тебя в качестве программера .
Я-то никуда не денусь. Мне в любом случае пришлось бы начать перевод, чтоб на случай появления поддержки не было долгого ожидания, собственно, русского языка.
Парни с IRC говорят, что не против патчей, если всё удастся. Меня только интересует, что с другими двумя версиями оО . Которая Curses (*nix) и SDL.
p.s. На третий день изучения C++ я почему-то сделал такой же механизм поддержки многих языков оО . Почти. У меня был класс, с кучей функций. И глобальная константа языка. Получался объект say.функция() . say.youWin(); oO
Впрочем, это кодинг - 1. Оптимизированней, наверное, с подгрузкой только нужного оО, 2.
Где исходники поглядеть можно? Я скачал master версию с github Clever Raven, но они там похоже только Windows версии. Кроме того, сейчас препятствие не в типичной для винды функции создания окна и загрузки шрифта, а уже в нашей структуре WINDOW, которая хранит массив окна с символами их цветом и фоном. Велика вероятность, что эта часть не особо отличается в разных версиях. Более того скажу, что код вывода второй половины ASCI символов не отсутствует, он просто закомментирован был. Возможно на это есть причины… Update
Часть символов, пересекающаяся с русским алфавитом, используется для рисования палочек псевдографики. Update2
Покажи мне, пожалуйста, функцию void DrawWindow(WINDOW *win), если такая используется на Linux. У меня она лежала в 0.5 в catcurse.cpp, в 0.6 переехала в wincurse.cpp.
[quote=“aiwant2tc, post:2, topic:1744”]Почти. У меня был класс, с кучей функций. И глобальная константа языка. Получался объект say.функция() . say.youWin(); oO
Впрочем, это кодинг - 1. Оптимизированней, наверное, с подгрузкой только нужного оО, 2.[/quote]
Я предполагаю, одну функцию для получения фразы и большой enum для их выбора. При этом загружается только один язык, если фраза отсутствует в текущем языке, она выбирается из дефолтного, если отсутствует и там, то дебажная. В общем количества текста остается примерно таким как сейчас, добавляется только количество цифровых констант равное количеству фраз текста.
Учитывая, что игровой уровень у нас один (весь мир), не вижу смысла делить загруженный текст на части.
Update3
Посмотрел как строятся фразы атак в Melee.cpp… задумался, как это переводить=)
В общем несложными манипуляциями можно перевести псевдографику на другие символы и получить чистый русский алфавит из 33 заглавных и 33 строчных букв. Предварительные препятствия убраны, перехожу к написанию файлов языка.
Исходники для всех общие . Просто компилируются другими командами и с дополнительными сложностями оО .
У меня вот нужно собирать mxe, судя по файлу COMPILING. Среда для кросскомпилирования оО .
А потом просто make CROSS=win32.i686-pc-mingw32-
В Windows не знаю как оО . Возможно, легче.
wincurse - эмуляция никсового ncurses. Как бы не было так, что нужной функции в папке с игрой нет. Более того - её нет оО .
Какой-то иной подход здесь нужен . Может, я тоже порыскаю в файлах.
Ещё нужно не забыть про “гибкость” по Строуструпу . Нужно будет оставить место для символов с диакритиками, если их кто будет добавлять. Возможно, потому и хотели Юникод, чтоб не добавлять каждый символ ручками. Тут и корейцы, и португальские, и французы с этими их é и прочими оО . Буквально половина всех игроков - не аглоязычны оО . Так что как-то так… Думаю, если патчи введут только поддержку русского, то они их не примут .
А мне в melee.cpp понравилась проверка пола при составлении фразы
wincurse - эмуляция никсового ncurses. Как бы не было так, что нужной функции в папке с игрой нет. Более того - её нет оО .
Какой-то иной подход здесь нужен :) . Может, я тоже порыскаю в файлах.
Видимо код работает и там=) Это наоборот лучше, для теста предлагаю следующее. Я тебе скидываю исправленные файлы, та компилируешь и смотрим на результат, такой же он как у меня или нет. Если да, то надо бы это и для Mac версии провернуть.
Ещё нужно не забыть про "гибкость" по Строуструпу :D . Нужно будет оставить место для символов с диакритиками, если их кто будет добавлять. Возможно, потому и хотели Юникод, чтоб не добавлять каждый символ ручками. Тут и корейцы, и португальские, и французы с этими их é и прочими оО . Буквально половина всех игроков - не аглоязычны оО . Так что как-то так... Думаю, если патчи введут только поддержку русского, то они их не примут :) .
Мне кажется с юникодом дело только упростится. А сейчас расклад такой. Из второй половины ASCII таблицы (128 символов) используется 10 символов (│┤┐└┴┬├─┼┘┌), при этом эти символы рисуются программно, а не выбираются из шрифта (возможно, чтобы не было отличий при растягивании шрифта или потому, что в других кодовых таблицах их нет).
Я предполагаю, что вторую страницу символов программа берет исходя из локальных настроек (системная функция), например, если я пишу исходники в СР1252, то игра показывает мне их в СР1251.
10 символов псевдографики, после некоторых изменений, имеют произвольные коды. Таким образом если, например, если для французского языка мы сможем выбрать 10 ненужных символов из второй половины таблицы ASCII, которые не совпадают с русским языком, то выбирая язык мы будем получать годный результат. При этом французский не будет работать под русской ОС и наоборот.
Предполагаю, что при переходе на Юникод, надо будет модуль языка сохранить не в СР1251, а в юникоде и все. Без дополнительных правок кода (кроме самой поддержки юникода).
Видимо код работает и там=) Это наоборот лучше, для теста предлагаю следующее. Я тебе скидываю исправленные файлы, та компилируешь и смотрим на результат, такой же он как у меня или нет. Если да, то надо бы это и для Mac версии провернуть.
Ну... Никсы же свои ncurses используют оО . Можно, попробовать :) . Я просто не знаю, о каком блоке кода ты говоришь оО .
Мне кажется с юникодом дело только упростится. А сейчас расклад такой. Из второй половины ASCII таблицы (128 символов) используется 10 символов (│┤┐└┴┬├─┼┘┌), при этом эти символы рисуются программно, а не выбираются из шрифта (возможно, чтобы не было отличий при растягивании шрифта или потому, что в других кодовых таблицах их нет).
Я предполагаю, что вторую страницу символов программа берет исходя из локальных настроек (системная функция), например, если я пишу исходники в СР1252, то игра показывает мне их в СР1251.
10 символов псевдографики, после некоторых изменений, имеют произвольные коды. Таким образом если, например, если для французского языка мы сможем выбрать 10 ненужных символов из второй половины таблицы ASCII, которые не совпадают с русским языком, то выбирая язык мы будем получать годный результат. При этом французский не будет работать под русской ОС и наоборот.
Предполагаю, что при переходе на Юникод, надо будет модуль языка сохранить не в СР1251, а в юникоде и все. Без дополнительных правок кода (кроме самой поддержки юникода).
Системная функция ? оО А как же пункт меню ? : ) И портируемость оО
Гах! Вместо того, чтобы ответить, изменил чужое сообщение оО Вроде вернул всё на место
Вот тестовые файлы для русской сборки. Если скомпилировать с ними, то стартовый экран должен быть как на скриншоте. Просьба проверить на Windows, Lunix и Mac в Curses и SDL версии.
Основные изменения в wincurse.cpp, правка output.h для задания кодов псевдографики, в остальных файлах убрано излишнее переопределение констант.
[quote=“aiwant2tc, post:7, topic:1744”]Ну… Никсы же свои ncurses используют оО . Можно, попробовать . Я просто не знаю, о каком блоке кода ты говоришь оО .
Системная функция ? оО А как же пункт меню ? : ) И портируемость оО[/quote]
Есть проблема=)
wincurse.cpp начинается с.
#if ((!defined TILES) && (defined _WIN32 || defined WINDOWS))
Т.е не используется в SDL и не на Винде. Вопрос, а что же тогда используется?
Вот, я об этой проблеме с самого начала говорил. Только не достаточно прямо
Сейчас потестю оО .
А ещё буду гуглить на тему How to implement Unicode Rogue-like. Вот уже нашёл что-то. Не обязательно связанное с How-to. Надо почитать
p.s. В том-то и дело, что ncurses используются . Настоящие, а не вот эти, псевдо
Теперь не показывается
Ну да. У меня не вышло даже чего-то похожего на бата?~@ейки . Целая куча вопросительных знаков в ромбах. И ещё под пунктами меню белая полоса.
Показывалась она при изменении json файлов. Сейчас и их проверю.
p.s. wchar_t - портируем ?
//up
Нужно гуглить тогда на тему adding unicode to ncurses и SDL тоже оО . Если так исправлять : ) .
//up
Да, кстати. Стены также заменились белыми полосами оО .
//up
Компилирую SDL версию. Посмотрю, что там. Никсы (Mac имею в виду) вряд ли чем-то отличаются оО .
Да, вспомнил, увидев. SDL версия все незнакомые ей знаки и вовсе не печатает .
Причём, на этот раз вместе с файлами из json.
Выходит, в SDL механизм вывода общий. А вот в ncurses два вида оО . Один для игровых текстов, другой для интерфейса.
p.s. Какая у тебя версия Cataclysm-а ? Странно, правда, что у меня Professions пропадают…
Ну… скорее всего кросс-компилировать windows сборки у меня пока что выходить будет плохо . Так что либо слать мне сразу готовые, либо вообще не слать . Короче, для Windows я тогда компилировать не буду .
//Ать, тьфу. Мне же показалось. Вон профессии, по-серёдке оО .
Тем более вон, SDL нативная сверху кажет 0.6-git
Выходит, всё у меня получается компилировать оО. Только у меня версию по-другому пишет отчего-то . Но не страшно. Потому что у меня сборка с 8 июня. Мне лень было качать сегодняшнюю оО.
Сейчас скомпилю нынешнюю, дабы не увидеть разницы оО.
(скомпилировал, полоски стали зелёные оО)
//В любом случае половину логотипа мы оба “зохавали”. Слово Ahead
А версия такая крутая на первых трёх скринах, потому что в никсах так отображаются. Я компилировал win-сборку с твоим патчем, и там 0.6-git версия, как у тебя на скринах. Но там всё точно, как у тебя. Так что зачем мне было выкладывать то, что у тебя было оО.
Создам для этого тоже тему . Чтобы аглицкие завидовали русской мощи
Буду выкладывать там… строк по 50 переводов в день оО .
//Кстати, проверь json файлы на windows сборке. Возможно, если ты сделал меню, то и остальные линии будут отображаться правильно .
Напомню, json-файлы находятся в data/raw/. Все файлы ,что относятся к предметам в items. Там переводить нужно только “name”: “слово для перевода” и “description”: “описание предмета”.
Возможно, до тех пор, пока нет нормальной поддержки языков, только в винде будет русская версия