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

**URL:** <https://discourse.cataclysmdda.org/t/topic/1744>\
**Category:** Основное обсуждение "Катаклизма"\
**Created:** [June 11, 2013, 6:20pm UTC](https://discourse.cataclysmdda.org/t/topic/1744 "2013-06-11T18:20:14Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![Savidiy](https://avatars.discourse-cdn.com/v4/letter/s/a183cd/32.png) [@Savidiy](https://discourse.cataclysmdda.org/u/Savidiy)\
**Post date:** [June 11, 2013, 6:20pm UTC](https://discourse.cataclysmdda.org/t/topic/1744/1 "2013-06-11T18:20:14Z")

</div>

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

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

```auto

```

получаем

```auto

```

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

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

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

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

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

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

---

<div class="post-metadata">

**Author:** ![aiwant2tc](https://avatars.discourse-cdn.com/v4/letter/a/7cd45c/32.png) [@aiwant2tc](https://discourse.cataclysmdda.org/u/aiwant2tc)\
**Post date:** [June 11, 2013, 6:44pm UTC](https://discourse.cataclysmdda.org/t/topic/1744/2 "2013-06-11T18:44:57Z")

</div>

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

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

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

---

<div class="post-metadata">

**Author:** ![Savidiy](https://avatars.discourse-cdn.com/v4/letter/s/a183cd/32.png) [@Savidiy](https://discourse.cataclysmdda.org/u/Savidiy)\
**Post date:** [June 12, 2013, 4:31am UTC](https://discourse.cataclysmdda.org/t/topic/1744/3 "2013-06-12T04:31:11Z")

</div>

> [@aiwant2tc](#):
>
> Меня только интересует, что с другими двумя версиями оО . Которая Curses (\*nix) и SDL.

Где исходники поглядеть можно? Я скачал 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… задумался, как это переводить=)

* * *

![](https://us1.discourse-cdn.com/flex016/uploads/cataclysmdda/original/1X/bd6edbf0ea208d3be0838da6b38f8312aa02570e.png)

---

<div class="post-metadata">

**Author:** ![Savidiy](https://avatars.discourse-cdn.com/v4/letter/s/a183cd/32.png) [@Savidiy](https://discourse.cataclysmdda.org/u/Savidiy)\
**Post date:** [June 12, 2013, 7:46am UTC](https://discourse.cataclysmdda.org/t/topic/1744/4 "2013-06-12T07:46:59Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![aiwant2tc](https://avatars.discourse-cdn.com/v4/letter/a/7cd45c/32.png) [@aiwant2tc](https://discourse.cataclysmdda.org/u/aiwant2tc)\
**Post date:** [June 12, 2013, 8:03am UTC](https://discourse.cataclysmdda.org/t/topic/1744/5 "2013-06-12T08:03:23Z")

</div>

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

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

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

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

---

<div class="post-metadata">

**Author:** ![Savidiy](https://avatars.discourse-cdn.com/v4/letter/s/a183cd/32.png) [@Savidiy](https://discourse.cataclysmdda.org/u/Savidiy)\
**Post date:** [June 12, 2013, 9:50am UTC](https://discourse.cataclysmdda.org/t/topic/1744/6 "2013-06-12T09:50:34Z")

</div>

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

Видимо код работает и там=) Это наоборот лучше, для теста предлагаю следующее. Я тебе скидываю исправленные файлы, та компилируешь и смотрим на результат, такой же он как у меня или нет. Если да, то надо бы это и для Mac версии провернуть.

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

Мне кажется с юникодом дело только упростится. А сейчас расклад такой. Из второй половины ASCII таблицы (128 символов) используется 10 символов (│┤┐└┴┬├─┼┘┌), при этом эти символы рисуются программно, а не выбираются из шрифта (возможно, чтобы не было отличий при растягивании шрифта или потому, что в других кодовых таблицах их нет). Я предполагаю, что вторую страницу символов программа берет исходя из локальных настроек (системная функция), например, если я пишу исходники в СР1252, то игра показывает мне их в СР1251. 10 символов псевдографики, после некоторых изменений, имеют произвольные коды. Таким образом если, например, если для французского языка мы сможем выбрать 10 ненужных символов из второй половины таблицы ASCII, которые не совпадают с русским языком, то выбирая язык мы будем получать годный результат. При этом французский не будет работать под русской ОС и наоборот. Предполагаю, что при переходе на Юникод, надо будет модуль языка сохранить не в СР1251, а в юникоде и все. Без дополнительных правок кода (кроме самой поддержки юникода).

---

<div class="post-metadata">

**Author:** ![aiwant2tc](https://avatars.discourse-cdn.com/v4/letter/a/7cd45c/32.png) [@aiwant2tc](https://discourse.cataclysmdda.org/u/aiwant2tc)\
**Post date:** [June 12, 2013, 9:59am UTC](https://discourse.cataclysmdda.org/t/topic/1744/7 "2013-06-12T09:59:36Z")

</div>

> Видимо код работает и там=) Это наоборот лучше, для теста предлагаю следующее. Я тебе скидываю исправленные файлы, та компилируешь и смотрим на результат, такой же он как у меня или нет. Если да, то надо бы это и для Mac версии провернуть.

Ну... Никсы же свои ncurses используют оО . Можно, попробовать :) . Я просто не знаю, о каком блоке кода ты говоришь оО . 

> Мне кажется с юникодом дело только упростится. А сейчас расклад такой. Из второй половины ASCII таблицы (128 символов) используется 10 символов (│┤┐└┴┬├─┼┘┌), при этом эти символы рисуются программно, а не выбираются из шрифта (возможно, чтобы не было отличий при растягивании шрифта или потому, что в других кодовых таблицах их нет). Я предполагаю, что вторую страницу символов программа берет исходя из локальных настроек (системная функция), например, если я пишу исходники в СР1252, то игра показывает мне их в СР1251. 10 символов псевдографики, после некоторых изменений, имеют произвольные коды. Таким образом если, например, если для французского языка мы сможем выбрать 10 ненужных символов из второй половины таблицы ASCII, которые не совпадают с русским языком, то выбирая язык мы будем получать годный результат. При этом французский не будет работать под русской ОС и наоборот. Предполагаю, что при переходе на Юникод, надо будет модуль языка сохранить не в СР1251, а в юникоде и все. Без дополнительных правок кода (кроме самой поддержки юникода).

Системная функция ? оО А как же пункт меню ? : ) И портируемость оО 

Гах! Вместо того, чтобы ответить, изменил чужое сообщение оО Вроде вернул всё на место

---

<div class="post-metadata">

**Author:** ![Savidiy](https://avatars.discourse-cdn.com/v4/letter/s/a183cd/32.png) [@Savidiy](https://discourse.cataclysmdda.org/u/Savidiy)\
**Post date:** [June 12, 2013, 10:06am UTC](https://discourse.cataclysmdda.org/t/topic/1744/8 "2013-06-12T10:06:17Z")

</div>

Вот тестовые файлы для русской сборки. Если скомпилировать с ними, то стартовый экран должен быть как на скриншоте. Просьба проверить на Windows, Lunix и Mac в Curses и SDL версии.  
Основные изменения в wincurse.cpp, правка output.h для задания кодов псевдографики, в остальных файлах убрано излишнее переопределение констант.

* * *

![](https://us1.discourse-cdn.com/flex016/uploads/cataclysmdda/original/1X/f4a495f807470c64237b132fa5eb302258f3dd46.png)

[RusTestFiles.7z](https://us1.discourse-cdn.com/flex016/uploads/cataclysmdda/original/1X/afca56b35da7e0f29fcea9ffa442c23975b358a3.7z) (34.4 KB)

---

<div class="post-metadata">

**Author:** ![Savidiy](https://avatars.discourse-cdn.com/v4/letter/s/a183cd/32.png) [@Savidiy](https://discourse.cataclysmdda.org/u/Savidiy)\
**Post date:** [June 12, 2013, 10:10am UTC](https://discourse.cataclysmdda.org/t/topic/1744/9 "2013-06-12T10:10:23Z")

</div>

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

> #if ((!defined TILES) && (defined \_WIN32 || defined WINDOWS))

Т.е не используется в SDL и не на Винде. Вопрос, а что же тогда используется?

---

<div class="post-metadata">

**Author:** ![aiwant2tc](https://avatars.discourse-cdn.com/v4/letter/a/7cd45c/32.png) [@aiwant2tc](https://discourse.cataclysmdda.org/u/aiwant2tc)\
**Post date:** [June 12, 2013, 10:23am UTC](https://discourse.cataclysmdda.org/t/topic/1744/10 "2013-06-12T10:23:29Z")

</div>

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

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

---

<div class="post-metadata">

**Author:** ![Savidiy](https://avatars.discourse-cdn.com/v4/letter/s/a183cd/32.png) [@Savidiy](https://discourse.cataclysmdda.org/u/Savidiy)\
**Post date:** [June 12, 2013, 10:39am UTC](https://discourse.cataclysmdda.org/t/topic/1744/11 "2013-06-12T10:39:04Z")

</div>

Заменить char на wchar\_t =)

---

<div class="post-metadata">

**Author:** ![Savidiy](https://avatars.discourse-cdn.com/v4/letter/s/a183cd/32.png) [@Savidiy](https://discourse.cataclysmdda.org/u/Savidiy)\
**Post date:** [June 12, 2013, 11:09am UTC](https://discourse.cataclysmdda.org/t/topic/1744/12 "2013-06-12T11:09:29Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![aiwant2tc](https://avatars.discourse-cdn.com/v4/letter/a/7cd45c/32.png) [@aiwant2tc](https://discourse.cataclysmdda.org/u/aiwant2tc)\
**Post date:** [June 12, 2013, 11:10am UTC](https://discourse.cataclysmdda.org/t/topic/1744/13 "2013-06-12T11:10:30Z")

</div>

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

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

p.s. wchar\_t - портируем ? 🙂

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

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

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

* * *

![](https://us1.discourse-cdn.com/flex016/uploads/cataclysmdda/original/1X/e789486147fff118ebc6b4ae79ef3775724b5378.png)

![](https://us1.discourse-cdn.com/flex016/uploads/cataclysmdda/original/1X/0db48387c38fc679f72f6f246efceb58127359f9.png)

![](https://us1.discourse-cdn.com/flex016/uploads/cataclysmdda/original/1X/b26e23512f798701d47da2b1dcb9c7611b982b29.png)

---

<div class="post-metadata">

**Author:** ![aiwant2tc](https://avatars.discourse-cdn.com/v4/letter/a/7cd45c/32.png) [@aiwant2tc](https://discourse.cataclysmdda.org/u/aiwant2tc)\
**Post date:** [June 12, 2013, 11:48am UTC](https://discourse.cataclysmdda.org/t/topic/1744/14 "2013-06-12T11:48:13Z")

</div>

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

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

* * *

![](https://us1.discourse-cdn.com/flex016/uploads/cataclysmdda/original/1X/7d2c11375bce068373dd48b453cde041a2d9799f.png)

![](https://us1.discourse-cdn.com/flex016/uploads/cataclysmdda/original/1X/8ff4794a4649452a78ebb923771499c4bd191c2a.png)

![](https://us1.discourse-cdn.com/flex016/uploads/cataclysmdda/original/1X/70e0df88111de22969bfae1dfc99bfba64329d9b.png)

![](https://us1.discourse-cdn.com/flex016/uploads/cataclysmdda/original/1X/b8c80398f62004acb967f354316c8d7280291548.png)

---

<div class="post-metadata">

**Author:** ![Savidiy](https://avatars.discourse-cdn.com/v4/letter/s/a183cd/32.png) [@Savidiy](https://discourse.cataclysmdda.org/u/Savidiy)\
**Post date:** [June 12, 2013, 12:02pm UTC](https://discourse.cataclysmdda.org/t/topic/1744/15 "2013-06-12T12:02:38Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![aiwant2tc](https://avatars.discourse-cdn.com/v4/letter/a/7cd45c/32.png) [@aiwant2tc](https://discourse.cataclysmdda.org/u/aiwant2tc)\
**Post date:** [June 12, 2013, 12:24pm UTC](https://discourse.cataclysmdda.org/t/topic/1744/16 "2013-06-12T12:24:10Z")

</div>

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

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

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

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

---

<div class="post-metadata">

**Author:** ![aiwant2tc](https://avatars.discourse-cdn.com/v4/letter/a/7cd45c/32.png) [@aiwant2tc](https://discourse.cataclysmdda.org/u/aiwant2tc)\
**Post date:** [June 12, 2013, 12:39pm UTC](https://discourse.cataclysmdda.org/t/topic/1744/17 "2013-06-12T12:39:53Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Savidiy](https://avatars.discourse-cdn.com/v4/letter/s/a183cd/32.png) [@Savidiy](https://discourse.cataclysmdda.org/u/Savidiy)\
**Post date:** [June 12, 2013, 12:41pm UTC](https://discourse.cataclysmdda.org/t/topic/1744/18 "2013-06-12T12:41:21Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![aiwant2tc](https://avatars.discourse-cdn.com/v4/letter/a/7cd45c/32.png) [@aiwant2tc](https://discourse.cataclysmdda.org/u/aiwant2tc)\
**Post date:** [June 12, 2013, 12:42pm UTC](https://discourse.cataclysmdda.org/t/topic/1744/19 "2013-06-12T12:42:49Z")

</div>

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

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

---

<div class="post-metadata">

**Author:** ![Savidiy](https://avatars.discourse-cdn.com/v4/letter/s/a183cd/32.png) [@Savidiy](https://discourse.cataclysmdda.org/u/Savidiy)\
**Post date:** [June 12, 2013, 2:07pm UTC](https://discourse.cataclysmdda.org/t/topic/1744/20 "2013-06-12T14:07:08Z")

</div>

> [@aiwant2tc](#):
>
> //Кстати, проверь json файлы на windows сборке. Возможно, если ты сделал меню, то и остальные линии будут отображаться правильно 🙂 .

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

* * *

![](https://us1.discourse-cdn.com/flex016/uploads/cataclysmdda/original/1X/0e8383d80d1195ecabd74f803add4dba72fce870.png)

[Next page](https://discourse.cataclysmdda.org/t/topic/1744.md?page=2)
