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

**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:** 2

<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, 2:37pm UTC](https://discourse.cataclysmdda.org/t/topic/1744/21 "2013-06-12T14:37:43Z")

</div>

Ну и решено 🙂 . Я как раз начал постепенно переводить файлы. Получится чисто русская сборка 😃 . Можно пождать меня, а можно грубо начать тырить переводы с [cataclysm.dfwk.ru/wiki](http://cataclysm.dfwk.ru/wiki) 🙂 .Там огромная часть предметов уже переведена.

---

<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, 3:47pm UTC](https://discourse.cataclysmdda.org/t/topic/1744/22 "2013-06-12T15:47:22Z")

</div>

Только я за то, чтобы это все-таки оформлять перевод на форуме.

[center]comestibles.json[/center] переведено 1 из 314  
[table]  
[tr][td]Английский[/td][td]Русский[/td][/tr]  
[tr][td][right]water||[/right][/td][td]вода[/td][/tr]  
[tr][td][right]Water, the stuff of life, the best thirst-quencher available.||[/right][/td][td]Вода это круто![/td][/tr]  
[tr][td][right]clean water||[/right][/td][td]чистая вода[/td][/tr]  
[tr][td][right]Fresh, clean water. Truly the best thing to quench your thirst.||[/right][/td][td]Это еще круче![/td][/tr]  
[/table]

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

* * *

[Подготовка перевода.ods](https://us1.discourse-cdn.com/flex016/uploads/cataclysmdda/original/1X/02b71b79c64a490f2a1ec1a5723e9e2e0f859ca6.ods) (26.3 KB)

[Обработка json.ods](https://us1.discourse-cdn.com/flex016/uploads/cataclysmdda/original/1X/e1f2e34172bad1012dbd33ff71a7b079011e0dbb.ods) (18.4 KB)

---

<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, 4:02pm UTC](https://discourse.cataclysmdda.org/t/topic/1744/23 "2013-06-12T16:02:10Z")

</div>

Ммм… Ну я уже просто чистым файлом пошёл 🙂 . Причём переименовываю пока только названия оО .  
Ладушки-оладушки. Сейчас переформатнёмся.

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:02pm UTC](https://discourse.cataclysmdda.org/t/topic/1744/24 "2013-06-12T16:02:46Z")

</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, 4:05pm UTC](https://discourse.cataclysmdda.org/t/topic/1744/25 "2013-06-12T16:05:34Z")

</div>

Ну вот 🙂 . Тут есть тема. “Перевод игровых файлов”. Я туда хотел выкладывать файлы.  
А насчёт вынуть оО … Я их очень легко всех вынул с помощью (например)  
sed -n -e ‘s/._"name":\ "//p’ tools.json | sed -n -e ‘s/",$//p’ \> tools\_names.txt Для названий  
sed -n -e 's/._"description":\ "//p’ tools.json | sed -n -e ‘s/",$//p’ \> tools\_descriptions.txt для описаний оО.

Можно было, впрочем, в один файл кинуть, чуть изменив команду…  
Но в любом случае, это уже не таблица 🙂 .

Возьму таблицу и буду выкладывать туда оО …

[//p.s](https://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:14pm UTC](https://discourse.cataclysmdda.org/t/topic/1744/26 "2013-06-12T16:14:40Z")

</div>

[quote=“aiwant2tc, post:25, topic:1744”]sed -n -e ‘s/._“name”:\ “//p’ tools.json | sed -n -e 's/”,$//p’ \> tools\_names.txt Для названий  
sed -n -e 's/._“description”:\ "//p’ tools.json | sed -n -e ‘s/",$//p’ \> tools\_descriptions.txt для описаний оО.[/quote]  
Спасибо за информацию, я узнал, что sed мультиплатформенный=)

---

<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, 4:19pm UTC](https://discourse.cataclysmdda.org/t/topic/1744/27 "2013-06-12T16:19:48Z")

</div>

Ну… Он как бы с самого начала был только для никсов 🙂 . Это потом вышел погулять оО.

---

<div class="post-metadata">

**Author:** ![x0m9k](https://sea2.discourse-cdn.com/flex016/user_avatar/discourse.cataclysmdda.org/x0m9k/32/939_2.png) [@x0m9k](https://discourse.cataclysmdda.org/u/x0m9k)\
**Post date:** [June 13, 2013, 2:37am UTC](https://discourse.cataclysmdda.org/t/topic/1744/28 "2013-06-13T02:37:52Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![x0m9k](https://sea2.discourse-cdn.com/flex016/user_avatar/discourse.cataclysmdda.org/x0m9k/32/939_2.png) [@x0m9k](https://discourse.cataclysmdda.org/u/x0m9k)\
**Post date:** [June 13, 2013, 5:33am UTC](https://discourse.cataclysmdda.org/t/topic/1744/29 "2013-06-13T05:33:39Z")

</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 13, 2013, 7:08am UTC](https://discourse.cataclysmdda.org/t/topic/1744/30 "2013-06-13T07:08:36Z")

</div>

Про раскладки сюда не писали, но я почитывал оО .  
Можно, конечно, и помогать, и репозиторий создавать 🙂 . Больше людей, быстрее работа оО .

Можно и репку создать… Я вот создал уже оО . Хочу ошибку одну исправить. Орфографическую 😃 . Научусь орудовать только оО. Минут 20…

---

<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 13, 2013, 11:05am UTC](https://discourse.cataclysmdda.org/t/topic/1744/31 "2013-06-13T11:05:34Z")

</div>

Ну… из пары вопросов в чате (какие только смог спросить оО ).

[spoiler] Guys, may I ask some questions ? 🙂  
 aiwant2tc: ask away  
 Basically, I want to know why multilanguage support is not impleneted yet oO  
 I mean, what obstacles should be eliminated oO  
 aiwant2tc: beacuse i18n and l10n is hard.  
 And because there are more pressing concerns.  
 But if we assume, that someone else will be occupied with the l10n  
 and i18n  
 So… The game should be rewritten in ncursesw or what oO  
 It’s a matter of implementing gettext.  
 And trawling through all of the source files and pulling all the literals out.  
 And replacing them with gettext calls.  
 And there are a lot of literals.  
 It’s just _a lot_ of work, but probably not particularly difficult.  
 “loterals”  
😃 … Then  
 Looks like we are on the right route oO  
 It’s likely not something that’s going to happen for the kickstarter version, probably after that.  
 Oh, hell, I know what I did wrong. I made a package called “site”, which was hiding the real site package.  
 yeah, the Kickstarter is also important : )  
 So… If we assume that we have all plain-text translated. I mean, all the text is translated. The next step would be implementing the gettext functions ?  
 aiwant2tc: implementing gettext comes first, I think.  
 But like I said, there’s also an issue with how to do l10n on item descriptions and other stuff from raws.  
 Multiple raws won’t work ?  
 Or…

- aiwant2tc thinks of smth  
 You wouldn’t want multiple raws – you might want raws not to contain displayable literals, but gettext keys.  
 narc: well, in that case you could just make gettext keys from the item names.  
 wito: Sounds about right.
- aiwant2tc listens  
 Probably item\_name + “\_name” and item\_name + “\_desc”, or something remotely similar.  
 Also… casual system oO  
 or case oO \*  
 Don’t remember the name oO  
 narc: Well, it might be useful to be able to specify a name directly in the raws as well, telling the text system to not go looking for a translation.  
 A Glock 19 is the same in every language.  
 Right. Try gettext first, then fall back to the values we already have in the raws.  
 This sounds reasonable.  
 narc: nah, other way around.  
 try the raws first.  
 If it has a name in the raws, don’t gettext.  
 Um?! I was thinking it more as a fallback for partial translations.  
 The value in the raws would give _some_ kind of value until one was added to the gettext data file.  
 Besides, a Glock 19 is _not_ the same in every language. aiwant2tc: Would you print “glock 19” transliterated to russian for us?  
 For you ? o\_O Transliterated it’d be: Глок 19  
 Translated it’s like Glock-19  
 Nah  
 So, if it has a name in the raws, and that overrides gettext, it’s a fail.  
 Глок-19  
 With a minus  
 Close enough.  
 Also, [translit.ru](http://translit.ru) is pretty awesome.[/spoiler]

Парни, можно задать пару вопросов ? 🙂  
 aiwant2tc: Валяй  
 В общем, я хочу узнать, почему поддержка многих языков ещё не была введена.  
 Я имею в виду, какие препятствия нужно устранить oO  
 aiwant2tc: Потому что i18n и l10n это сложно. //Интернационализация и локализация  
 И потому что есть более важные вещи  
 А если допустим, что кто-то другой будет заниматься l10n-ией  
 и i18n-ей  
 Тогда… Игра должна быть переписана на ncursesw или как оО  
 Это дело введения gettext  
 И перелопачивание всех исходников, вытаскиванием оттуда всех литералов  
 И заменой их на вызовы gettext  
 И там очень много литералов  
 Просто это ОЧЕНЬ много работы, но, в основном не сложной.  
 “лотералов” // лот = lot = много  
😃 … Тогда  
 Похоже , что мы на правильном пути //В этот момент я не знал, что такое gettext 😃  
 Это не что-то такое, что появится в месте с Kickstarter версией, может быть, после того.  
 да, Kickstarter тоже важен 🙂  
 Так… Если мы будет считать, что мы перевели весь “голый” текст. Следующим шагом будет введение gettext функций ? //теперь узнал оО.  
 aiwant2tc: введение gettext-ов должно быть первым шагом, я думаю.  
 Но как я уже сказал, ещё нужно разобраться, что делать с локализацией описаний предметов и других вещей из raws // json из data/raws он имел в виду оО  
 Много raws не сработают ?  
 Или…

- aiwant2tc о чём-то думает  
 Ты бы не хотел иметь много raw файлов, но мог бы захотеть, чтоб raws содержали не отображаемые литералы, а ключи gettext  
 narc: Ну, в этом случае можно просто сделать gettext ключи из имён предметов.  
 wito: Звучит правдоподобно
- aiwant2tc слушает  
 Может быть item\_name + “\_name” and item\_name + “\_desc”, или что-то отдалённо похожее.  
 narc: Ну, может быть полезной возможность задавать имена прямо в raws, говоря текстовой системе не искать перевод.  
 Glock 19 одинаков во всех языках.  
 Правильно. Попробуй сначала gettext, потому вернись к значениям, что уже есть в raws.  
 Звучит приемлимо.  
 narc: не, другой способ.  
 сначала попробовать raws.  
 Если есть имя в raws, не вызывать gettext.  
 Кхм?! Я думал об этом, как о запасном варианте для частичных переводов.  
 Значение из raws будет давать какие-то значения, до тех пор, пока другое не было добавлено в gettext дата-файл.  
 Кстати, Glock 19 НЕ одинаков на всех языка. aiwant2tc , не напишешь русскую транслитерацию Glock 19 для нас ?  
 Для вас ? о\_О Транслитерация будет: Глок 19 // я отходил, потому не сразу понял, о чём они.  
 Переведённый вариант будет Glock-19  
 Не  
 То есть, если есть имя в raws, и оно перехватывает значение gettext, это провал.  
 Глок-19  
 C дефисом.  
 Достаточно близко.  
 Кстати, [translit.ru](http://translit.ru) довольно крут.

---

<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 13, 2013, 11:23am UTC](https://discourse.cataclysmdda.org/t/topic/1744/32 "2013-06-13T11:23:30Z")

</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 13, 2013, 11:47am UTC](https://discourse.cataclysmdda.org/t/topic/1744/33 "2013-06-13T11:47:39Z")

</div>

Я что-то пропустил из чата… Но да ладно 🙂 . Значит, недаром я говорил, что

> Похоже , что мы на правильном пути

---

<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 13, 2013, 11:57am UTC](https://discourse.cataclysmdda.org/t/topic/1744/34 "2013-06-13T11:57:37Z")

</div>

aiwant2tc, Сейчас поиграю с sdlcurse.cpp, подготовлю его и мне нужна будет сборка SDL под линуксом. Но проблема вывода русского текста там такая же как и в winsurse.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 13, 2013, 12:07pm UTC](https://discourse.cataclysmdda.org/t/topic/1744/35 "2013-06-13T12:07:38Z")

</div>

Готово! Просьба сделать SDL сборку на Linux системе с заменой оригинальных файлов файлами из приложенного архива. И показать стартовый экран приложения, куда должен выводиться алфавит. Я сейчас проверну аналогичное действие под виндой и покажу результат.

* * *

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

---

<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 13, 2013, 12:45pm UTC](https://discourse.cataclysmdda.org/t/topic/1744/36 "2013-06-13T12:45:09Z")

</div>

Логотип по прежнему наполовину “зохаван” 🙂 .  
(То есть, символы для него нужные. А вместе с ними и рамочки для всплывающих сообщений… ну так, к слову оО)

* * *

![](https://us1.discourse-cdn.com/flex016/uploads/cataclysmdda/original/1X/b5f63ba59f466ad6f99e486bd49eb4631b12680c.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 13, 2013, 2:23pm UTC](https://discourse.cataclysmdda.org/t/topic/1744/37 "2013-06-13T14:23:48Z")

</div>

Ну так логотипа часть отсутствует потому, что там две строки просто закомментированы, чтобы русский алфавит влез.  
А вот с остальным вопрос. Я собрал SDL версию под Windows. Результат тот же. Английский алфавит вместо русского

---

<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 13, 2013, 5:26pm UTC](https://discourse.cataclysmdda.org/t/topic/1744/38 "2013-06-13T17:26:47Z")

</div>

Удалось получить русские буквы в SDL версии! Прикол в том, что SDL рассчитан на вывод юникода=)

* * *

![](https://us1.discourse-cdn.com/flex016/uploads/cataclysmdda/original/1X/b245e9ac117aa86335b3370cbee59c08d6d20655.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 13, 2013, 10:45pm UTC](https://discourse.cataclysmdda.org/t/topic/1744/39 "2013-06-13T22:45:45Z")

</div>

Вот в общем-то что-то похожее на то, как хотели бы перевести игру разработчики. Есть i18n папка. В ней переводы. Есть класс, в котором инициализируется gettext. Есть папка, куда все переводы скомпилировались… Да gettext это!  
Хотя и язык питоний, но всё достаточно “плоско”. И очень похоже на то, как бы это делалось в C++.

Ссылка на пример i18n с помощью gettext  
[https://pypi.python.org/pypi/typetrainer](https://pypi.python.org/pypi/typetrainer)

p.s. То что зачёркнуто. Папка с файлами .po (нужная по сути только переводящим, а не программе) была в старых версиях.

---

<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 14, 2013, 12:30pm UTC](https://discourse.cataclysmdda.org/t/topic/1744/40 "2013-06-14T12:30:50Z")

</div>

Кхм… Помимо букв на title-лого, не отрисовываются и анимации (взрыв гранат, нюков и т.д.). Может, так как основная версия curses, а остальные её имитируют, начать с переделки curses… Но это мне придётся экспериментировать. Включить вместо ncurses -  
ncursesw , как вариант, ибо парни не против этого оО . Плюс, ориентируясь на дебаги, узнать, что именно нужно переписать оО. Либо нужен кто-то, кто разбирается в курсах 🙂 .

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

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