Попытка реализовать мультиязычность

В общем, я вижу решение задачи следующим:
Программная часть:

  1. В настройках добавляется пункт Language, который имеет цифровое значение
  2. Все строковые константы выносятся в отдельный файл. Оформляются, например, “ittypdef_cpp_corpse_DSC” (описание трупа в файле ittypdef.cpp), указывая в названии имя файла, где использовалась константа. Для каждого языка соответственно имеется свой файл.
  3. Добавляется модуль, который выполняет две функции. Во-первых, при старте программы загружает языковые константы из соответствующего файла. Во-вторых, по требованию возвращает требуемый текст по идентификатору, т.е. вместо

получаем

  1. Для учета согласования слов и пола говорящих, фразы имеют несколько вариантов. Кроме того фраза может содержать спецсимвол указывающий, например, на необходимость следующую фразу взять во второй форме (Взять + зажигалка -> Взять + зажигалку). Перенос части логики в сами фразы обусловлен тем, чтобы не править код при переводе на разные языки, а править только текст. Что-то там + предмет и крутитесь, как хотите.

Текстовая часть:
Оформляется электронная таблица для перевода. Сожержит секции соответствующие исходным файлам, с колонками:

  • английский текст
  • русский текст
  • примечания (если кто-то не согласен и хочет поправить, то дописывает это в комментарии)
  • при необходимости код, который генерирует этот текст (статическую фразу перевести просто, сложности кроются в составлении предложений)
    Электронная таблица также может компоновать текст в блоки кода, которые можно будет сразу вставлять в программу. Мне так делать очень нравится=)

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

Готов заняться организационной и программной частью этой затеи. aiwant2tc, берешься за перевод?

Кнопки действий остаются английскими. То есть будет (Y)Да / (N)Нет.
Ну и предвижу сложность в том, что русские слова могут быть длиннее английских.

Я ещё сам хотел спросить про тебя в качестве программера :slight_smile: .
Я-то никуда не денусь. Мне в любом случае пришлось бы начать перевод, чтоб на случай появления поддержки не было долгого ожидания, собственно, русского языка.
Парни с IRC говорят, что не против патчей, если всё удастся. Меня только интересует, что с другими двумя версиями оО . Которая Curses (*nix) и SDL.

p.s. На третий день изучения C++ я почему-то сделал такой же механизм поддержки многих языков оО . Почти. У меня был класс, с кучей функций. И глобальная константа языка. Получался объект say.функция() :slight_smile: . say.youWin(); oO
Впрочем, это кодинг - 1. Оптимизированней, наверное, с подгрузкой только нужного оО, 2.

p.p.s. Они реально длиннее оО .

Где исходники поглядеть можно? Я скачал 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.функция() :slight_smile: . say.youWin(); oO
Впрочем, это кодинг - 1. Оптимизированней, наверное, с подгрузкой только нужного оО, 2.[/quote]
Я предполагаю, одну функцию для получения фразы и большой enum для их выбора. При этом загружается только один язык, если фраза отсутствует в текущем языке, она выбирается из дефолтного, если отсутствует и там, то дебажная. В общем количества текста остается примерно таким как сейчас, добавляется только количество цифровых констант равное количеству фраз текста.
Учитывая, что игровой уровень у нас один (весь мир), не вижу смысла делить загруженный текст на части.

Update3
Посмотрел как строятся фразы атак в Melee.cpp… задумался, как это переводить=)



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

Исходники для всех общие :slight_smile: . Просто компилируются другими командами и с дополнительными сложностями оО .
У меня вот нужно собирать mxe, судя по файлу COMPILING. Среда для кросскомпилирования оО .
А потом просто make CROSS=win32.i686-pc-mingw32-
В Windows не знаю как оО . Возможно, легче.

wincurse - эмуляция никсового ncurses. Как бы не было так, что нужной функции в папке с игрой нет. Более того - её нет оО .
Какой-то иной подход здесь нужен :slight_smile: . Может, я тоже порыскаю в файлах.

Ещё нужно не забыть про “гибкость” по Строуструпу :smiley: . Нужно будет оставить место для символов с диакритиками, если их кто будет добавлять. Возможно, потому и хотели Юникод, чтоб не добавлять каждый символ ручками. Тут и корейцы, и португальские, и французы с этими их é и прочими оО . Буквально половина всех игроков - не аглоязычны оО . Так что как-то так… Думаю, если патчи введут только поддержку русского, то они их не примут :slight_smile: .

А мне в melee.cpp понравилась проверка пола при составлении фразы :slight_smile:

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 для задания кодов псевдографики, в остальных файлах убрано излишнее переопределение констант.



RusTestFiles.7z (34.4 KB)

[quote=“aiwant2tc, post:7, topic:1744”]Ну… Никсы же свои ncurses используют оО . Можно, попробовать :slight_smile: . Я просто не знаю, о каком блоке кода ты говоришь оО .
Системная функция ? оО А как же пункт меню ? : ) И портируемость оО[/quote]
Есть проблема=)
wincurse.cpp начинается с.

#if ((!defined TILES) && (defined _WIN32 || defined WINDOWS))
Т.е не используется в SDL и не на Винде. Вопрос, а что же тогда используется?

Вот, я об этой проблеме с самого начала говорил. Только не достаточно прямо :smiley:
Сейчас потестю оО .
А ещё буду гуглить на тему How to implement Unicode Rogue-like. Вот уже нашёл что-то. Не обязательно связанное с How-to. Надо почитать :slight_smile:

p.s. В том-то и дело, что ncurses используются :slight_smile: . Настоящие, а не вот эти, псевдо :slight_smile:

Заменить char на wchar_t =)

aiwant2tc, попробуй вывести, например, в главном меню весь алфавит. Я так понимаю сейчас часть символов под никсами показывается?

Теперь не показывается :smiley:
Ну да. У меня не вышло даже чего-то похожего на бата?~@ейки :slight_smile: . Целая куча вопросительных знаков в ромбах. И ещё под пунктами меню белая полоса.

Показывалась она при изменении json файлов. Сейчас и их проверю.

p.s. wchar_t - портируем ? :slight_smile:

//up
Нужно гуглить тогда на тему adding unicode to ncurses и SDL тоже оО . Если так исправлять : ) .

//up
Да, кстати. Стены также заменились белыми полосами оО .

//up
Компилирую SDL версию. Посмотрю, что там. Никсы (Mac имею в виду) вряд ли чем-то отличаются оО .





Да, вспомнил, увидев. SDL версия все незнакомые ей знаки и вовсе не печатает :slight_smile: .
Причём, на этот раз вместе с файлами из json.
Выходит, в SDL механизм вывода общий. А вот в ncurses два вида оО . Один для игровых текстов, другой для интерфейса.

p.s. Какая у тебя версия Cataclysm-а ? Странно, правда, что у меня Professions пропадают…






У меня версия пишет 0.6-git, скачанная сегодня утром с репозитория и собранная. Почему версию пишет не такую крутую как у тебя не знаю.

Ну… скорее всего кросс-компилировать windows сборки у меня пока что выходить будет плохо :slight_smile: . Так что либо слать мне сразу готовые, либо вообще не слать :slight_smile: . Короче, для Windows я тогда компилировать не буду :slight_smile: .

//Ать, тьфу. Мне же показалось. Вон профессии, по-серёдке оО .
Тем более вон, SDL нативная сверху кажет 0.6-git

Выходит, всё у меня получается компилировать оО. Только у меня версию по-другому пишет отчего-то :slight_smile: . Но не страшно. Потому что у меня сборка с 8 июня. Мне лень было качать сегодняшнюю оО.
Сейчас скомпилю нынешнюю, дабы не увидеть разницы оО.
(скомпилировал, полоски стали зелёные оО)

//В любом случае половину логотипа мы оба “зохавали”. Слово Ahead

А версия такая крутая на первых трёх скринах, потому что в никсах так отображаются. Я компилировал win-сборку с твоим патчем, и там 0.6-git версия, как у тебя на скринах. Но там всё точно, как у тебя. Так что зачем мне было выкладывать то, что у тебя было оО.

Тогда можно начать с конца. То бишь с перевода слов и фраз.

Создам для этого тоже тему :smiley: . Чтобы аглицкие завидовали русской мощи :smiley:
Буду выкладывать там… строк по 50 переводов в день оО .

//Кстати, проверь json файлы на windows сборке. Возможно, если ты сделал меню, то и остальные линии будут отображаться правильно :slight_smile: .
Напомню, json-файлы находятся в data/raw/. Все файлы ,что относятся к предметам в items. Там переводить нужно только “name”: “слово для перевода” и “description”: “описание предмета”.
Возможно, до тех пор, пока нет нормальной поддержки языков, только в винде будет русская версия :smiley:

У меня в Виндовой версии (с моими правками) с линиями проблем нет. Описание из Json файлов показывается. Пример на скриншоте.