From 794a820be9d26115d1d549fd3cace8b4bbfe8d86 Mon Sep 17 00:00:00 2001 From: Vladislav Khorev Date: Sun, 5 Jul 2026 21:52:37 +0300 Subject: [PATCH] Working on translations for dialogs and cutscenes --- dialogue_translations_from_xlsx.py | 61 + dialogue_translations_to_xlsx.py | 66 + proj-web/CMakeLists.txt | 4 + proj-windows/CMakeLists.txt | 4 + resources/dialogue/dorm_dialogues003.json | 2 +- resources/dialogue/translate_cutscenes.json | 134 + resources/dialogue/translate_dialogues.json | 2259 +++++++++++++++++ .../dialogue/uni_exterior_dialogues002.json | 2 +- .../dialogue/uni_interior_dialogues_009.json | 210 +- src/Game.cpp | 6 + src/Localization.cpp | 38 + src/Localization.h | 23 + src/Location.cpp | 3 +- src/MenuManager.cpp | 11 +- src/cutscene/CutsceneRuntime.cpp | 14 +- src/cutscene/CutsceneRuntime.h | 5 + src/dialogue/DialogueRuntime.cpp | 28 +- src/dialogue/DialogueRuntime.h | 4 + src/dialogue/DialogueSystem.cpp | 10 + src/dialogue/DialogueSystem.h | 4 + src/dialogue/TranslationDatabase.cpp | 80 + src/dialogue/TranslationDatabase.h | 26 + sync_cutscene_translations.py | 54 + sync_dialogue_translations.py | 52 + translation_sync_common.py | 38 + 25 files changed, 3015 insertions(+), 123 deletions(-) create mode 100644 dialogue_translations_from_xlsx.py create mode 100644 dialogue_translations_to_xlsx.py create mode 100644 resources/dialogue/translate_cutscenes.json create mode 100644 resources/dialogue/translate_dialogues.json create mode 100644 src/Localization.cpp create mode 100644 src/Localization.h create mode 100644 src/dialogue/TranslationDatabase.cpp create mode 100644 src/dialogue/TranslationDatabase.h create mode 100644 sync_cutscene_translations.py create mode 100644 sync_dialogue_translations.py create mode 100644 translation_sync_common.py diff --git a/dialogue_translations_from_xlsx.py b/dialogue_translations_from_xlsx.py new file mode 100644 index 0000000..87a7cc2 --- /dev/null +++ b/dialogue_translations_from_xlsx.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python3 +""" +dialogue_translations_from_xlsx.py - Import a translated XLSX spreadsheet back +into dialogue_translations.json. + +Reads a spreadsheet with a "key" header column followed by one column per +language (as produced by dialogue_translations_to_xlsx.py, possibly edited by a +translator), and writes it back out as {"dialogue_translations": [{"key":..., +"":...}, ...]}. Rows with an empty key are skipped. Cell values are +stripped; missing/empty cells become "". + +Usage: + python dialogue_translations_from_xlsx.py +""" + +import json +import os +import sys + +try: + from openpyxl import load_workbook +except ImportError: + raise SystemExit("openpyxl is required: pip install openpyxl") + + +def import_from_xlsx(xlsx_path: str, json_path: str) -> None: + wb = load_workbook(xlsx_path, read_only=True, data_only=True) + ws = wb.active + + rows = ws.iter_rows(values_only=True) + header = next(rows, None) + if not header or header[0] != "key": + raise SystemExit(f"Expected first column header to be 'key', got: {header}") + + languages = [str(col) for col in header[1:] if col is not None] + + entries = [] + for row in rows: + key = row[0] + if key is None or str(key).strip() == "": + continue + + entry = {"key": str(key)} + for i, lang in enumerate(languages): + value = row[i + 1] if i + 1 < len(row) else None + entry[lang] = str(value).strip() if value is not None else "" + entries.append(entry) + + os.makedirs(os.path.dirname(os.path.abspath(json_path)), exist_ok=True) + with open(json_path, 'w', encoding='utf-8') as f: + json.dump({"dialogue_translations": entries}, f, indent=4, ensure_ascii=False) + + print(f"Saved: {json_path} ({len(entries)} row(s), languages: {', '.join(languages)})") + + +if __name__ == '__main__': + if len(sys.argv) != 3: + print(f"Usage: {sys.argv[0]} ") + sys.exit(1) + + import_from_xlsx(sys.argv[1], sys.argv[2]) diff --git a/dialogue_translations_to_xlsx.py b/dialogue_translations_to_xlsx.py new file mode 100644 index 0000000..b3daabf --- /dev/null +++ b/dialogue_translations_to_xlsx.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 +""" +dialogue_translations_to_xlsx.py - Export dialogue_translations.json to an XLSX +spreadsheet for translators. + +Reads a translation file shaped as {"dialogue_translations": [{"key":..., "ru":..., +"en":...}, ...]}, and writes one row per entry with a "key" column followed by one +column per language found in the file (order: ru, en, then any others found, +alphabetically). Missing values are written as empty cells. + +Usage: + python dialogue_translations_to_xlsx.py +""" + +import json +import sys + +try: + from openpyxl import Workbook + from openpyxl.utils import get_column_letter +except ImportError: + raise SystemExit("openpyxl is required: pip install openpyxl") + +PREFERRED_LANGUAGE_ORDER = ("ru", "en") + + +def collect_languages(entries: list[dict]) -> list[str]: + found = set() + for entry in entries: + found.update(k for k in entry.keys() if k != "key") + + ordered = [lang for lang in PREFERRED_LANGUAGE_ORDER if lang in found] + ordered += sorted(found - set(ordered)) + return ordered + + +def export_to_xlsx(json_path: str, xlsx_path: str) -> None: + with open(json_path, 'r', encoding='utf-8') as f: + data = json.load(f) + + entries = data.get("dialogue_translations", []) + languages = collect_languages(entries) + + wb = Workbook() + ws = wb.active + ws.title = "dialogue_translations" + + ws.append(["key"] + languages) + for entry in entries: + ws.append([entry.get("key", "")] + [entry.get(lang, "") for lang in languages]) + + ws.freeze_panes = "A2" + ws.column_dimensions["A"].width = 50 + for col_index in range(len(languages)): + ws.column_dimensions[get_column_letter(col_index + 2)].width = 50 + + wb.save(xlsx_path) + print(f"Saved: {xlsx_path} ({len(entries)} row(s), languages: {', '.join(languages)})") + + +if __name__ == '__main__': + if len(sys.argv) != 3: + print(f"Usage: {sys.argv[0]} ") + sys.exit(1) + + export_to_xlsx(sys.argv[1], sys.argv[2]) diff --git a/proj-web/CMakeLists.txt b/proj-web/CMakeLists.txt index eb7c92d..1373cd4 100644 --- a/proj-web/CMakeLists.txt +++ b/proj-web/CMakeLists.txt @@ -69,6 +69,8 @@ set(SOURCES ../src/CharacterState.h ../src/Environment.cpp ../src/Environment.h + ../src/Localization.cpp + ../src/Localization.h ../src/render/Renderer.cpp ../src/render/Renderer.h ../src/render/ShaderManager.cpp @@ -133,6 +135,8 @@ set(SOURCES ../src/dialogue/DialogueOverlay.cpp ../src/dialogue/DialogueSystem.h ../src/dialogue/DialogueSystem.cpp + ../src/dialogue/TranslationDatabase.h + ../src/dialogue/TranslationDatabase.cpp ../src/quest/QuestTypes.h ../src/quest/QuestJournal.h ../src/quest/QuestJournal.cpp diff --git a/proj-windows/CMakeLists.txt b/proj-windows/CMakeLists.txt index 7b56de5..6f5275f 100644 --- a/proj-windows/CMakeLists.txt +++ b/proj-windows/CMakeLists.txt @@ -20,6 +20,8 @@ add_executable(witcher001 ../src/CharacterState.h ../src/Environment.cpp ../src/Environment.h + ../src/Localization.cpp + ../src/Localization.h ../src/render/Renderer.cpp ../src/render/Renderer.h ../src/render/ShaderManager.cpp @@ -84,6 +86,8 @@ add_executable(witcher001 ../src/dialogue/DialogueOverlay.cpp ../src/dialogue/DialogueSystem.h ../src/dialogue/DialogueSystem.cpp + ../src/dialogue/TranslationDatabase.h + ../src/dialogue/TranslationDatabase.cpp ../src/quest/QuestTypes.h ../src/quest/QuestJournal.h ../src/quest/QuestJournal.cpp diff --git a/resources/dialogue/dorm_dialogues003.json b/resources/dialogue/dorm_dialogues003.json index 197d9b2..84fbf9e 100644 --- a/resources/dialogue/dorm_dialogues003.json +++ b/resources/dialogue/dorm_dialogues003.json @@ -92,7 +92,7 @@ "type": "Line", "speaker": "Айпери", "portrait": "resources/dialogue/portrait_phone.png", - "text": "Бекзат, помнишь мы скидывались на торт для Аиды Джаныбековой? Я тогда еще приносила скатерть, тарелки и нож для торта. И я до сих пор не получила назад ничего.", + "text": "Бекзат, помнишь мы скидывались на торт для Аиды Джаныбековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.", "next": "line_2", "chatBubble": "in" }, diff --git a/resources/dialogue/translate_cutscenes.json b/resources/dialogue/translate_cutscenes.json new file mode 100644 index 0000000..e8b3447 --- /dev/null +++ b/resources/dialogue/translate_cutscenes.json @@ -0,0 +1,134 @@ +{ + "dialogue_translations": [ + { + "key": "Аида Джаныбековна", + "ru": "Аида Джаныбековна", + "en": "Aida Dzhanybekovna" + }, + { + "key": "Опаздывающие, заходите скорее и занимайте свои места! Лекция начинается!", + "ru": "Опаздывающие, заходите скорее и занимайте свои места! Лекция начинается!", + "en": "Latecomers, come in quickly and take your seats! The lecture is about to begin!" + }, + { + "key": "В эпизоде \"Семетей\" трилогии \"Манас\", изменники Канчоро и Кыяз захватывают власть над кыргызами.", + "ru": "В эпизоде \"Семетей\" трилогии \"Манас\", изменники Канчоро и Кыяз захватывают власть над кыргызами.", + "en": "In the episode \"Semetey\" of the trilogy \"Manas\", the traitors Kanchoro and Kyyaz seize power over the Kyrgyz." + }, + { + "key": "Чтобы спасти раненого богатыря Семетея, фея Кёкмончок с помощью заклинания уводит его в иной мир.", + "ru": "Чтобы спасти раненого богатыря Семетея, фея Кёкмончок с помощью заклинания уводит его в иной мир.", + "en": "To save the wounded hero Semetey, the fairy Kyokmonchok uses a spell to take him to another world." + }, + { + "key": "Этот мир описан в эпосе Манас как Кайып или Аль-Гайб, но некоторые ученые называют его миром теней.", + "ru": "Этот мир описан в эпосе Манас как Кайып или Аль-Гайб, но некоторые ученые называют его миром теней.", + "en": "This world is described in the Manas epic as Kayip or Al-Ghayb, but some scholars call it the dark lands." + }, + { + "key": "В этом мире обитают феи, духи и джинны. Простым смертным в этот мир дорога закрыта.", + "ru": "В этом мире обитают феи, духи и джинны. Простым смертным в этот мир дорога закрыта.", + "en": "This world is inhabited by fairies, spirits, and genies. Mere mortals are barred from entering." + }, + { + "key": "Время там течет по другому - за один день в теневом мире могут пройти годы жизни обычного мира.", + "ru": "Время там течет по другому - за один день в теневом мире могут пройти годы жизни обычного мира.", + "en": "Time flows differently there - in one day in the dark lands, years of life in the ordinary world can pass." + }, + { + "key": "Обычно, мир теней никак не пересекается с нашим миром живых людей.", + "ru": "Обычно, мир теней никак не пересекается с нашим миром живых людей.", + "en": "Usually, the world of dark lands does not intersect with our world of living people." + }, + { + "key": "Но в критические моменты для народа, обитатели теневого мира могут приходить в наш мир.", + "ru": "Но в критические моменты для народа, обитатели теневого мира могут приходить в наш мир.", + "en": "But in critical moments for the people, the inhabitants of the dark lands can come to our world." + }, + { + "key": "Совсем недавно закончилась пандемия, а сегодня мир захлестнули кровавые войны.", + "ru": "Совсем недавно закончилась пандемия, а сегодня мир захлестнули кровавые войны.", + "en": "The pandemic just ended, and today the world is engulfed in bloody wars." + }, + { + "key": "В такие кризисные моменты истории, грань между мирами становится особенно тонкой.", + "ru": "В такие кризисные моменты истории, грань между мирами становится особенно тонкой.", + "en": "At such critical moments in history, the line between worlds becomes especially thin." + }, + { + "key": "На сегодня лекция завершена. Все свободны! Задания на этот модуль вы получите индивидуально!", + "ru": "На сегодня лекция завершена. Все свободны! Задания на этот модуль вы получите индивидуально!", + "en": "This lecture is over for today. Everyone is free to go! You will receive assignments for this module individually!" + }, + { + "key": "Я сел за компьютер и начал писать эссе по книге", + "ru": "Я сел за компьютер и начал писать эссе по книге", + "en": "I sat down at the computer and started writing an essay on the book." + }, + { + "key": "Книга была очень скучной. Как будто кто-то наложил на книгу чары сна.", + "ru": "Книга была очень скучной. Как будто кто-то наложил на книгу чары сна.", + "en": "The book was very boring. It was as if someone had cast a sleeping spell on it." + }, + { + "key": "Неудивительно что я стал понемногу засыпать...", + "ru": "Неудивительно что я стал понемногу засыпать...", + "en": "It's no wonder that I started to fall asleep little by little..." + }, + { + "key": "Мгновенно как я упал без сил, что-то сверкнуло.", + "ru": "Мгновенно как я упал без сил, что-то сверкнуло.", + "en": "The moment I fell down without strength, something flashed." + }, + { + "key": "Я очнулся и понял, что я по-прежнему в универе.", + "ru": "Я очнулся и понял, что я по-прежнему в универе.", + "en": "I woke up and realized that I was still at university." + }, + { + "key": "Все тело болело, как будто я всю ночь таскал мешки с цементом.", + "ru": "Все тело болело, как будто я всю ночь таскал мешки с цементом.", + "en": "My whole body ached, as if I had been carrying bags of cement all night." + }, + { + "key": "А еще мне сильно хотелось спать...", + "ru": "А еще мне сильно хотелось спать...", + "en": "And I also really wanted to sleep..." + }, + { + "key": "Я лег спать и уснул.", + "ru": "Я лег спать и уснул.", + "en": "I went to bed and fell asleep." + }, + { + "key": "Долгожданный сон полностью восстановил мои силы.", + "ru": "Долгожданный сон полностью восстановил мои силы.", + "en": "The long-awaited sleep completely restored my strength." + }, + { + "key": "Я проснулся на следующий день уже после обеда.", + "ru": "Я проснулся на следующий день уже после обеда.", + "en": "I woke up the next day after lunch." + }, + { + "key": "Все призраки исчезли, вокруг стало тихо.", + "ru": "Все призраки исчезли, вокруг стало тихо.", + "en": "All the ghosts disappeared and it became quiet around." + }, + { + "key": "Кажется, у меня получилось изгнать призрака.", + "ru": "Кажется, у меня получилось изгнать призрака.", + "en": "I think I've exorcised the ghost." + }, + { + "key": "Теперь надо добавить этот пункт к себе в резюме.", + "ru": "Теперь надо добавить этот пункт к себе в резюме.", + "en": "Now I need to add this item to my resume." + }, + { + "key": "В тот момент я еще не знал, что мои приключения еще только начинаются...", + "ru": "В тот момент я еще не знал, что мои приключения еще только начинаются...", + "en": "At that moment, I didn't yet know that my adventures were just beginning..." + } + ] +} \ No newline at end of file diff --git a/resources/dialogue/translate_dialogues.json b/resources/dialogue/translate_dialogues.json new file mode 100644 index 0000000..887714e --- /dev/null +++ b/resources/dialogue/translate_dialogues.json @@ -0,0 +1,2259 @@ +{ + "dialogue_translations": [ + { + "key": "Бекзат", + "ru": "Бекзат", + "en": "Bekzat" + }, + { + "key": "Новый день! Я проснулся, позавтракал и готов поехать в универ! Надо проверить телефон, и не забыть взять свою записную книжку.", + "ru": "Новый день! Я проснулся, позавтракал и готов поехать в универ! Надо проверить телефон, и не забыть взять свою записную книжку.", + "en": "A new day! I woke up, had breakfast, and am ready to go to university! I need to check my phone and remember to take my address book." + }, + { + "key": "Я не буду никуда идти без своего телефона и записной книжки!", + "ru": "Я не буду никуда идти без своего телефона и записной книжки!", + "en": "I won't go anywhere without my phone and address book!" + }, + { + "key": "Отец", + "ru": "Отец", + "en": "Father" + }, + { + "key": "Бекзат, сынок, мы c мамой тебе отправили немного денег, постарайся прожить на эти деньги до конца недели!", + "ru": "Бекзат, сынок, мы c мамой тебе отправили немного денег, постарайся прожить на эти деньги до конца недели!", + "en": "Bekzat, son, your mom and I sent you some money, try to live on this money until the end of the week!" + }, + { + "key": "Спасибо!", + "ru": "Спасибо!", + "en": "Thanks!" + }, + { + "key": "Жители Бишкека все чаще жалуются на депрессию и апатию. Смотрите свежее видео об этом на нашем канале!", + "ru": "Жители Бишкека все чаще жалуются на депрессию и апатию. Смотрите свежее видео об этом на нашем канале!", + "en": "Bishkek residents are increasingly complaining of depression and apathy. Watch the latest video about this on our channel!" + }, + { + "key": "Айпери", + "ru": "Айпери", + "en": "Aiperi" + }, + { + "key": "Бекзат, помнишь мы скидывались на торт для Аиды Джаныбековой? Я тогда еще приносила скатерть, тарелки и нож для торта. И я до сих пор не получила назад ничего.", + "ru": "Бекзат, помнишь мы скидывались на торт для Аиды Джаныбековой? Я тогда еще приносила скатерть, тарелки и нож для торта. И я до сих пор не получила назад ничего.", + "en": "Bekzat, remember we chipped in for a cake for Aida Dzhanybekova? I brought a tablecloth, plates, and a cake knife back then. And I still haven't gotten anything back." + }, + { + "key": "Скатерть и тарелки вроде бы лежат в студзоне.", + "ru": "Скатерть и тарелки вроде бы лежат в студзоне.", + "en": "The tablecloth and plates seem to be in the student area." + }, + { + "key": "А нож?", + "ru": "А нож?", + "en": "What about the knife?" + }, + { + "key": "Нож, наверное, так и остался в учительской.", + "ru": "Нож, наверное, так и остался в учительской.", + "en": "The knife probably remained in the teachers' room." + }, + { + "key": "А давай не \"наверное\"?", + "ru": "А давай не \"наверное\"?", + "en": "How about not \"probably\"?" + }, + { + "key": "А давай ты приедешь в универ, зайдешь в учительскую, заберешь нож и отдашь мне?", + "ru": "А давай ты приедешь в универ, зайдешь в учительскую, заберешь нож и отдашь мне?", + "en": "How about you come to the university, go into the teachers' room, pick up the knife and give it to me?" + }, + { + "key": "У вас сегодня как раз Аида ведет лекцию. После лекции попросишь у нее ключи от учительской и заберешь нож.", + "ru": "У вас сегодня как раз Аида ведет лекцию. После лекции попросишь у нее ключи от учительской и заберешь нож.", + "en": "Aida is giving a lecture today. Afterward, ask her for the keys to the teachers' lounge and take the knife." + }, + { + "key": "Почему ты сама не можешь забрать?", + "ru": "Почему ты сама не можешь забрать?", + "en": "Why can't you pick it up yourself?" + }, + { + "key": "Ты же знаешь, если я встречу Аиду, она 100% даст мне какое-нибудь сложное задание.", + "ru": "Ты же знаешь, если я встречу Аиду, она 100% даст мне какое-нибудь сложное задание.", + "en": "You know, if I meet Aida, she will 100% give me some difficult task." + }, + { + "key": "И потом, это ты у меня брал нож, с чего я должна ходить искать его по всему универу?", + "ru": "И потом, это ты у меня брал нож, с чего я должна ходить искать его по всему универу?", + "en": "And besides, it was you who took the knife from me, why should I have to go looking for it all over the university?" + }, + { + "key": "Так что жду тебя в универе! Не вздумай прогулять!", + "ru": "Так что жду тебя в универе! Не вздумай прогулять!", + "en": "So I'm waiting for you at the university! Don't even think about skipping!" + }, + { + "key": "Бекзат, ты где? Я жду тебя возле лестницы.", + "ru": "Бекзат, ты где? Я жду тебя возле лестницы.", + "en": "Bekzat, where are you? I'm waiting for you by the stairs." + }, + { + "key": "Я сейчас не хочу спать.", + "ru": "Я сейчас не хочу спать.", + "en": "I don't want to sleep now." + }, + { + "key": "Отлично, вот и мой телефон! Надо проверить новые сообщения.", + "ru": "Отлично, вот и мой телефон! Надо проверить новые сообщения.", + "en": "Great, here's my phone! I need to check for new messages." + }, + { + "key": "Здесь у меня душ и туалет.", + "ru": "Здесь у меня душ и туалет.", + "en": "I have a shower and toilet here." + }, + { + "key": "Я не буду лезть в ванную комнату к Алику.", + "ru": "Я не буду лезть в ванную комнату к Алику.", + "en": "I won't go into Alik's bathroom." + }, + { + "key": "Дверь закрыта. Кажется, сюда все еще никто не заселился.", + "ru": "Дверь закрыта. Кажется, сюда все еще никто не заселился.", + "en": "The door is closed. It seems no one has moved in yet." + }, + { + "key": "Возьму журнал с собой! Там все мои записи.", + "ru": "Возьму журнал с собой! Там все мои записи.", + "en": "I'll take the journal with me! All my notes are in it." + }, + { + "key": "Прежде чем выходить наружу, я должен заказать такси до универа.", + "ru": "Прежде чем выходить наружу, я должен заказать такси до универа.", + "en": "Before going outside, I have to order a taxi to the university." + }, + { + "key": "Я заказал такси до универа, машина уже ждет!", + "ru": "Я заказал такси до универа, машина уже ждет!", + "en": "I ordered a taxi to the university, the car is already waiting!" + }, + { + "key": "Я уже заказал такси, машина уже ждет!", + "ru": "Я уже заказал такси, машина уже ждет!", + "en": "I've already ordered a taxi, the car is already waiting!" + }, + { + "key": "На втором этаже женское общежитие, мне там делать нечего.", + "ru": "На втором этаже женское общежитие, мне там делать нечего.", + "en": "There is a women's dormitory on the second floor, I have nothing to do there." + }, + { + "key": "Алик", + "ru": "Алик", + "en": "Alik" + }, + { + "key": "Привет Бекзат! Давно я не видел тебя на парах!", + "ru": "Привет Бекзат! Давно я не видел тебя на парах!", + "en": "Hi Bekzat! I haven't seen you in class for a long time!" + }, + { + "key": "Тук тук!", + "ru": "Тук тук!", + "en": "Knock knock!" + }, + { + "key": "Заходи!", + "ru": "Заходи!", + "en": "Come in!" + }, + { + "key": "Не стоит сейчас беспокоить Алика, лучше я зайду к нему днем.", + "ru": "Не стоит сейчас беспокоить Алика, лучше я зайду к нему днем.", + "en": "There's no point in disturbing Alik now, I'd better go see him during the day." + }, + { + "key": "Привет Алик! Я бы хотел задать тебе несколько вопросов.", + "ru": "Привет Алик! Я бы хотел задать тебе несколько вопросов.", + "en": "Hi Alik! I'd like to ask you a few questions." + }, + { + "key": "Давай валяй, я буду рад тебе помочь!", + "ru": "Давай валяй, я буду рад тебе помочь!", + "en": "Go ahead, I'll be happy to help you!" + }, + { + "key": "Обсудить призрака Бегимай", + "ru": "Обсудить призрака Бегимай", + "en": "Discuss the ghost of Begimai" + }, + { + "key": "Обсудить манасоведение", + "ru": "Обсудить манасоведение", + "en": "Discuss Manas studies" + }, + { + "key": "Обсудить Айпери", + "ru": "Обсудить Айпери", + "en": "Discuss Aiperi" + }, + { + "key": "Неважно", + "ru": "Неважно", + "en": "No matter" + }, + { + "key": "Напомни еще раз, где я могу найти курсовую работу Бегимай?", + "ru": "Напомни еще раз, где я могу найти курсовую работу Бегимай?", + "en": "Remind me again where I can find Begimai's coursework?" + }, + { + "key": "С тобой на курсе училась Бегимай, ты ее помнишь?", + "ru": "С тобой на курсе училась Бегимай, ты ее помнишь?", + "en": "Begimai was in your class, do you remember her?" + }, + { + "key": "Конечно помню! Я тебе даже больше расскажу.", + "ru": "Конечно помню! Я тебе даже больше расскажу.", + "en": "Of course I remember! I'll tell you even more." + }, + { + "key": "В тот день она принесла свою курсовую, чтобы сдать.", + "ru": "В тот день она принесла свою курсовую, чтобы сдать.", + "en": "That day she brought her coursework to hand in." + }, + { + "key": "Но в тот день в учительской происходила генеральная уборка.", + "ru": "Но в тот день в учительской происходила генеральная уборка.", + "en": "But that day, a general cleaning was taking place in the teachers' room." + }, + { + "key": "И получилось так, что ее курсовая оказалась в стопке бумаг на выброс.", + "ru": "И получилось так, что ее курсовая оказалась в стопке бумаг на выброс.", + "en": "And so it happened that her coursework ended up in a pile of papers to be thrown out." + }, + { + "key": "Курсовая работа пропала, Бегимай получила за нее ноль баллов, и не прошла отбор в Германию.", + "ru": "Курсовая работа пропала, Бегимай получила за нее ноль баллов, и не прошла отбор в Германию.", + "en": "The coursework was lost, Begimai received zero points for it, and did not pass the selection to go to Germany." + }, + { + "key": "Поэтому с горя она выпрыгнула из окна лекционного зала и убилась.", + "ru": "Поэтому с горя она выпрыгнула из окна лекционного зала и убилась.", + "en": "So, out of grief, she jumped out of the lecture hall window and killed herself." + }, + { + "key": "А ты откуда все это знаешь?", + "ru": "А ты откуда все это знаешь?", + "en": "How do you know all this?" + }, + { + "key": "Я видел как ее курсовую уносили вместе с другой макулатурой из учительской.", + "ru": "Я видел как ее курсовую уносили вместе с другой макулатурой из учительской.", + "en": "I saw her coursework being taken away along with other waste paper from the teachers' room." + }, + { + "key": "И где сейчас ее курсовая работа?", + "ru": "И где сейчас ее курсовая работа?", + "en": "And where is her coursework now?" + }, + { + "key": "За зданием универа есть контейнер с кучей бумажного мусора и макулатурой.", + "ru": "За зданием универа есть контейнер с кучей бумажного мусора и макулатурой.", + "en": "Behind the university building there is a container with a pile of paper trash and waste." + }, + { + "key": "Скорее всего, курсовая до сих пор лежит где-то там.", + "ru": "Скорее всего, курсовая до сих пор лежит где-то там.", + "en": "Most likely, the coursework is still lying around there somewhere." + }, + { + "key": "Спасибо Алик! Ты мне очень помог.", + "ru": "Спасибо Алик! Ты мне очень помог.", + "en": "Thank you, Alik! You helped me a lot." + }, + { + "key": "Да без проблем! У тебя есть еще вопросы?", + "ru": "Да без проблем! У тебя есть еще вопросы?", + "en": "No problem! Do you have any other questions?" + }, + { + "key": "Спасибо Алик! Я узнал все, что мне нужно.", + "ru": "Спасибо Алик! Я узнал все, что мне нужно.", + "en": "Thanks Alik! I found out everything I needed." + }, + { + "key": "Без проблем, Бекзат! Обращайся если что!", + "ru": "Без проблем, Бекзат! Обращайся если что!", + "en": "No problem, Bekzat! Contact me if you need anything!" + }, + { + "key": "Что ты мне можешь рассказать про манасоведение?", + "ru": "Что ты мне можешь рассказать про манасоведение?", + "en": "What can you tell me about Manas studies?" + }, + { + "key": "Я по-моему еще ни разу тебя не видел на парах по манасоведению.", + "ru": "Я по-моему еще ни разу тебя не видел на парах по манасоведению.", + "en": "I don't think I've ever seen you in a Manas studies class." + }, + { + "key": "А ведь у нас в этом году новая преподавательница, Аида Джаныбековна!", + "ru": "А ведь у нас в этом году новая преподавательница, Аида Джаныбековна!", + "en": "But we have a new teacher this year, Aida Dzhanybekovna!" + }, + { + "key": "Она конечно не сахар, но если ты ходишь на пары и вовремя сдашь ей задание на модуль, то ты считай сдал экзамен.", + "ru": "Она конечно не сахар, но если ты ходишь на пары и вовремя сдашь ей задание на модуль, то ты считай сдал экзамен.", + "en": "She's certainly not a piece of cake, but if you go to class and hand in your module assignments on time, you've practically passed the exam." + }, + { + "key": "Предыдущий преподаватель конечно вообще зверь был, всех валил, курсовые ему с трудом сдавали.", + "ru": "Предыдущий преподаватель конечно вообще зверь был, всех валил, курсовые ему с трудом сдавали.", + "en": "The previous teacher was a real beast, he failed everyone, and we had a hard time passing our coursework." + }, + { + "key": "Так что Аида Джаныбековна еще норм. Подойди к ней, возьми задание на модуль, и начни ходить на пары. Тогда ты сдашь экзамен успешно.", + "ru": "Так что Аида Джаныбековна еще норм. Подойди к ней, возьми задание на модуль, и начни ходить на пары. Тогда ты сдашь экзамен успешно.", + "en": "So Aida Dzhanybekovna is still okay. Go to her, take the assignment for the module, and start going to class. Then you'll pass the exam successfully." + }, + { + "key": "Спасибо за информацию!", + "ru": "Спасибо за информацию!", + "en": "Thanks for the information!" + }, + { + "key": "Что ты можешь рассказать мне про Айпери?", + "ru": "Что ты можешь рассказать мне про Айпери?", + "en": "What can you tell me about Aiperi?" + }, + { + "key": "О, она староста на нашем курсе! Она отличница, она приходит в универ раньше всех, а потом еще и на курсы успевает.", + "ru": "О, она староста на нашем курсе! Она отличница, она приходит в универ раньше всех, а потом еще и на курсы успевает.", + "en": "Oh, she's the class monitor in our year! She's an excellent student, she comes to university before everyone else, and then she even manages to attend her classes." + }, + { + "key": "Учителя ей настолько доверяют, что у нее даже есть ключи от всех кабинетов в универе! Вот настолько она ответственная.", + "ru": "Учителя ей настолько доверяют, что у нее даже есть ключи от всех кабинетов в универе! Вот настолько она ответственная.", + "en": "The teachers trust her so much that she even has keys to every classroom at the university! That's how responsible she is." + }, + { + "key": "Но она обидчивая, ты постарайся ее не злить. Сам же себе проблемы создашь.", + "ru": "Но она обидчивая, ты постарайся ее не злить. Сам же себе проблемы создашь.", + "en": "But she's touchy, try not to anger her. You'll only create problems for yourself." + }, + { + "key": "Говорят, ей не очень нравится наша новая преподавательница по манасоведению, Аида Джаныбековна.", + "ru": "Говорят, ей не очень нравится наша новая преподавательница по манасоведению, Аида Джаныбековна.", + "en": "They say she doesn't really like our new Manas studies teacher, Aida Dzhanybekovna." + }, + { + "key": "Привет Бекзат! Надеюсь ты нашел то что ищешь.", + "ru": "Привет Бекзат! Надеюсь ты нашел то что ищешь.", + "en": "Hi Bekzat! I hope you found what you were looking for." + }, + { + "key": "Ого, пока я залипал в телефоне, уже наступила ночь!", + "ru": "Ого, пока я залипал в телефоне, уже наступила ночь!", + "en": "Wow, while I was on my phone, the night had already come!" + }, + { + "key": "Я не буду сейчас смотреть видеоролики, давай лучше пойдем спать.", + "ru": "Я не буду сейчас смотреть видеоролики, давай лучше пойдем спать.", + "en": "I won't watch videos now, let's go to bed." + }, + { + "key": "Мне некогда деградировать сегодня, у меня много дел!", + "ru": "Мне некогда деградировать сегодня, у меня много дел!", + "en": "I have no time to degrade today, I have a lot to do!" + }, + { + "key": "Это мой холодильник. Но я уже позавтракал, поэтому я не буду туда лезть.", + "ru": "Это мой холодильник. Но я уже позавтракал, поэтому я не буду туда лезть.", + "en": "This is my refrigerator. But I've already had breakfast, so I won't open it." + }, + { + "key": "Это моя блютус колонка. Пусть она останется здесь, я не буду ее брать с собой.", + "ru": "Это моя блютус колонка. Пусть она останется здесь, я не буду ее брать с собой.", + "en": "This is my Bluetooth speaker. Let it stay here, I won't take it with me." + }, + { + "key": "Здесь лежит моя одежда и обувь. Я уже одет, и я не буду переодеваться.", + "ru": "Здесь лежит моя одежда и обувь. Я уже одет, и я не буду переодеваться.", + "en": "My clothes and shoes are here. I'm already dressed, and I'm not going to change." + }, + { + "key": "Это стиральные машины. Здесь мы стираем нашу одежду в общежитии.", + "ru": "Это стиральные машины. Здесь мы стираем нашу одежду в общежитии.", + "en": "These are washing machines. This is where we wash our clothes in the dorm." + }, + { + "key": "Это кухонная плита. Здесь я готовлю себе завтрак перед тем, как поехать по делам.", + "ru": "Это кухонная плита. Здесь я готовлю себе завтрак перед тем, как поехать по делам.", + "en": "This is the kitchen stove. This is where I make myself breakfast before going out on business." + }, + { + "key": "На этих вешалках мы сушим свои вещи.", + "ru": "На этих вешалках мы сушим свои вещи.", + "en": "We dry our clothes on these hangers." + }, + { + "key": "Я уже умылся с утра, мне не нужно заново мыться.", + "ru": "Я уже умылся с утра, мне не нужно заново мыться.", + "en": "I already washed my face this morning, I don’t need to wash again." + }, + { + "key": "Я сейчас не хочу в туалет.", + "ru": "Я сейчас не хочу в туалет.", + "en": "I don't want to go to the toilet right now." + }, + { + "key": "Я уже принял душ с утра.", + "ru": "Я уже принял душ с утра.", + "en": "I already took a shower this morning." + }, + { + "key": "Дверь закрыта на ключ.", + "ru": "Дверь закрыта на ключ.", + "en": "The door is locked." + }, + { + "key": "Это куча строительного мусора, я не буду в ней копаться!", + "ru": "Это куча строительного мусора, я не буду в ней копаться!", + "en": "This is a pile of construction debris and junk, I'm not going to dig through it!" + }, + { + "key": "Я уже забрал курсовую работу Бегимай, больше мне незачем сюда лезть.", + "ru": "Я уже забрал курсовую работу Бегимай, больше мне незачем сюда лезть.", + "en": "I've already picked up Begimai's coursework, I don't need to get into this pile anymore." + }, + { + "key": "Если Алик не соврал, курсовая работа Бегимай лежит где-то тут.", + "ru": "Если Алик не соврал, курсовая работа Бегимай лежит где-то тут.", + "en": "If Alik wasn't lying, Begimai's coursework is somewhere here." + }, + { + "key": "Сейчас посмотрю...", + "ru": "Сейчас посмотрю...", + "en": "I'll take a look now..." + }, + { + "key": "Ага, нашел! Вот и она!", + "ru": "Ага, нашел! Вот и она!", + "en": "Aha, I found it! Here it is!" + }, + { + "key": "Я уже нашел в этой куче мусора то, что мне нужно.", + "ru": "Я уже нашел в этой куче мусора то, что мне нужно.", + "en": "I've already found what I need in this pile of junk." + }, + { + "key": "Прежде чем выходить за ворота, я должен заказать такси до общаги.", + "ru": "Прежде чем выходить за ворота, я должен заказать такси до общаги.", + "en": "Before I leave the gate, I have to order a taxi to the dorm." + }, + { + "key": "Я заказал такси до общаги, машина уже ждет!", + "ru": "Я заказал такси до общаги, машина уже ждет!", + "en": "I ordered a taxi to the dorm, the car is already waiting!" + }, + { + "key": "Ого, пока я залипал в приложении, уже наступила ночь!", + "ru": "Ого, пока я залипал в приложении, уже наступила ночь!", + "en": "Wow, while I was on my phone, the night had already come!" + }, + { + "key": "Я не буду сейчас смотреть видеоролики, давай лучше вернемся в общагу и пойдем спать.", + "ru": "Я не буду сейчас смотреть видеоролики, давай лучше вернемся в общагу и пойдем спать.", + "en": "I won't watch videos now, let's go back to the dorm and go to bed." + }, + { + "key": "Машина заперта.", + "ru": "Машина заперта.", + "en": "The car is locked." + }, + { + "key": "Кажется, на этой машине в универ приезжает Аида Джаныбековна.", + "ru": "Кажется, на этой машине в универ приезжает Аида Джаныбековна.", + "en": "It seems that Aida Dzhanybekovna arrives at the university in this car." + }, + { + "key": "Это заклинание не работает днем.", + "ru": "Это заклинание не работает днем.", + "en": "This spell does not work during the day." + }, + { + "key": "Чтобы перейти в теневой мир, мне нужно дождаться ночи.", + "ru": "Чтобы перейти в теневой мир, мне нужно дождаться ночи.", + "en": "To go into the dark lands, I need to wait until night." + }, + { + "key": "Чтобы время пролетело быстро, я могу посидеть в телефоне и позалипать в короткие видео.", + "ru": "Чтобы время пролетело быстро, я могу посидеть в телефоне и позалипать в короткие видео.", + "en": "To make time fly by, I can use my phone and watch short videos." + }, + { + "key": "У меня силы закончились и мне спать хочется. Достаточно теневого мира на сегодня, поехали в общагу.", + "ru": "У меня силы закончились и мне спать хочется. Достаточно теневого мира на сегодня, поехали в общагу.", + "en": "I'm exhausted and sleepy. Enough of the dark lands for today, let's go to the dorm." + }, + { + "key": "Ты куда собрался, Бекзат?", + "ru": "Ты куда собрался, Бекзат?", + "en": "Where are you going, Bekzat?" + }, + { + "key": "Вот тебе ключ от учительской. Иди туда и забери нож.", + "ru": "Вот тебе ключ от учительской. Иди туда и забери нож.", + "en": "Here's the key to the teachers' room. Go there and get the knife." + }, + { + "key": "Пока ты не принесешь мне нож из учительской, никуда я тебя не выпущу.", + "ru": "Пока ты не принесешь мне нож из учительской, никуда я тебя не выпущу.", + "en": "Until you bring me a knife from the teachers' room, I won't let you go anywhere." + }, + { + "key": "Ты еще не забыл, что я писала тебе, насчет ножа?", + "ru": "Ты еще не забыл, что я писала тебе, насчет ножа?", + "en": "Have you forgotten what I wrote to you about the knife?" + }, + { + "key": "Напомни, что случилось?", + "ru": "Напомни, что случилось?", + "en": "Remind me what happened?" + }, + { + "key": "Да, я помню", + "ru": "Да, я помню", + "en": "Yes, I remember." + }, + { + "key": "Что случилось?", + "ru": "Что случилось?", + "en": "What's happened?" + }, + { + "key": "Ты почему мои сообщения не читаешь?", + "ru": "Ты почему мои сообщения не читаешь?", + "en": "Why don't you read my messages?" + }, + { + "key": "Помнишь мы скидывались на торт для Аиды Джаныбековой? Я тогда еще приносила скатерть, тарелки и нож для торта. И я до сих пор не получила назад ничего.", + "ru": "Помнишь мы скидывались на торт для Аиды Джаныбековой? Я тогда еще приносила скатерть, тарелки и нож для торта. И я до сих пор не получила назад ничего.", + "en": "Remember when we chipped in for a cake for Aida Dzhanibekova? I even brought a tablecloth, plates, and a cake knife. And I still haven't gotten anything back." + }, + { + "key": "Скатерть и тарелки вроде бы лежат в комнате отдыха для студентов", + "ru": "Скатерть и тарелки вроде бы лежат в комнате отдыха для студентов", + "en": "The tablecloth and plates seem to be in the student lounge." + }, + { + "key": "Так сходи в учительскую, забери нож и принеси мне!", + "ru": "Так сходи в учительскую, забери нож и принеси мне!", + "en": "So go to the teachers' room, take the knife and bring it to me!" + }, + { + "key": "Почему ты сама не сходишь?", + "ru": "Почему ты сама не сходишь?", + "en": "Why don't you go yourself?" + }, + { + "key": "Во-первых, ты у меня эти вещи брал, ты и должен вернуть.", + "ru": "Во-первых, ты у меня эти вещи брал, ты и должен вернуть.", + "en": "First of all, you took these things from me, and you have to return them." + }, + { + "key": "А во вторых, мне как-то не хочется попадаться на глаза Аиде. Я даже лекцию пропустила.", + "ru": "А во вторых, мне как-то не хочется попадаться на глаза Аиде. Я даже лекцию пропустила.", + "en": "And secondly, I really don't want to catch Aida's eye. I even missed the lecture." + }, + { + "key": "У меня есть ощущение что если я ее встречу, она даст мне какое-то очень сложное задание.", + "ru": "У меня есть ощущение что если я ее встречу, она даст мне какое-то очень сложное задание.", + "en": "I have a feeling that if I meet her, she will give me some very difficult task." + }, + { + "key": "То-то я не видел тебя на лекции. Прогуляла?", + "ru": "То-то я не видел тебя на лекции. Прогуляла?", + "en": "No wonder I didn't see you at the lecture. Did you skip?" + }, + { + "key": "Да... Только не говори Аиде Джаныбековой что я здесь.", + "ru": "Да... Только не говори Аиде Джаныбековой что я здесь.", + "en": "Yes... Just don't tell Aida Dzhanibekova that I'm here." + }, + { + "key": "По тихому сходи в учительскую и забери нож.", + "ru": "По тихому сходи в учительскую и забери нож.", + "en": "Quietly go to the teachers' room and take the knife." + }, + { + "key": "Как я попаду в учительскую, если там закрыто?", + "ru": "Как я попаду в учительскую, если там закрыто?", + "en": "How can I get into the teachers' room if it's closed?" + }, + { + "key": "Постарайся только Аиде Джаныбековой особо на глаза не попадаться. ", + "ru": "Постарайся только Аиде Джаныбековой особо на глаза не попадаться.", + "en": "Just try not to catch Aida Dzhanibekova's eye." + }, + { + "key": "И не говори ей, что я тут. Я сегодня специально ее пару прогуляла.", + "ru": "И не говори ей, что я тут. Я сегодня специально ее пару прогуляла.", + "en": "And don't tell her I'm here. I skipped her class today on purpose." + }, + { + "key": "Почему?", + "ru": "Почему?", + "en": "Why?" + }, + { + "key": "Она меня ищет, я уверена, она хочет мне какое-то задание дать.", + "ru": "Она меня ищет, я уверена, она хочет мне какое-то задание дать.", + "en": "She is looking for me, I am sure she wants to give me some task." + }, + { + "key": "Так бы я сама нож забрала, но блин, не хочу чтобы она меня увидела.", + "ru": "Так бы я сама нож забрала, но блин, не хочу чтобы она меня увидела.", + "en": "I would have taken the knife myself, but damn, I don’t want her to see me." + }, + { + "key": "Хорошо, давай ключи, я заберу твой нож.", + "ru": "Хорошо, давай ключи, я заберу твой нож.", + "en": "Okay, give me the keys, I'll take your knife." + }, + { + "key": "Да, давай быстрее только. Я не могу тебя тут вечно ждать, мне тоже ехать пора.", + "ru": "Да, давай быстрее только. Я не могу тебя тут вечно ждать, мне тоже ехать пора.", + "en": "Yes, just hurry up. I can't wait here forever, I have to go too." + }, + { + "key": "Куда Айпери убежала?", + "ru": "Куда Айпери убежала?", + "en": "Where did Aiperi run away?" + }, + { + "key": "Ладно, я отдам ей нож завтра.", + "ru": "Ладно, я отдам ей нож завтра.", + "en": "Okay, I'll give her the knife tomorrow." + }, + { + "key": "Хорошо, что у меня уже есть ключ от этой двери.", + "ru": "Хорошо, что у меня уже есть ключ от этой двери.", + "en": "It's good that I already have a key to this door." + }, + { + "key": "Видимо когда я спал, охранник запер дверь.", + "ru": "Видимо когда я спал, охранник запер дверь.", + "en": "Apparently, while I was sleeping, the security guard locked the door." + }, + { + "key": "Это уже не смешно, как я отсюда выберусь?", + "ru": "Это уже не смешно, как я отсюда выберусь?", + "en": "This is not funny anymore, how will I get out of here?" + }, + { + "key": "Аида Джаныбековна", + "ru": "Аида Джаныбековна", + "en": "Aida Dzhanybekovna" + }, + { + "key": "Бекзат, что тебе нужно?", + "ru": "Бекзат, что тебе нужно?", + "en": "Bekzat, what do you need?" + }, + { + "key": "Сдать модуль", + "ru": "Сдать модуль", + "en": "Submit the module" + }, + { + "key": "Ничего", + "ru": "Ничего", + "en": "Nothing" + }, + { + "key": "Попасть в учительскую", + "ru": "Попасть в учительскую", + "en": "Get into the teachers' room" + }, + { + "key": "Вы не могли бы открыть учительскую для меня?", + "ru": "Вы не могли бы открыть учительскую для меня?", + "en": "Could you open the teachers' room for me?" + }, + { + "key": "Аида Джаныбекова", + "ru": "Аида Джаныбекова", + "en": "Aida Dzhanybekovna" + }, + { + "key": "Зачем тебе в учительскую?", + "ru": "Зачем тебе в учительскую?", + "en": "Why do you need to go to the teachers' room?" + }, + { + "key": "Мне нужно забрать оттуда нож...", + "ru": "Мне нужно забрать оттуда нож...", + "en": "I need to get the knife from there..." + }, + { + "key": "Это разве твой нож? Этот нож мне одолжила Айпери.", + "ru": "Это разве твой нож? Этот нож мне одолжила Айпери.", + "en": "Is this your knife? Aiperi lent me this knife." + }, + { + "key": "Пусть она сама лично и приходит.", + "ru": "Пусть она сама лично и приходит.", + "en": "Let her come in person." + }, + { + "key": "А ты даже не смей заходить в учительскую без моего разрешения!", + "ru": "А ты даже не смей заходить в учительскую без моего разрешения!", + "en": "And don't you even dare enter the teachers' room without my permission!" + }, + { + "key": "Хорошо....", + "ru": "Хорошо....", + "en": "Okay…" + }, + { + "key": "Ничего...", + "ru": "Ничего...", + "en": "Nothing…" + }, + { + "key": "Тогда не отвлекай меня, я занята!", + "ru": "Тогда не отвлекай меня, я занята!", + "en": "Then don't distract me, I'm busy!" + }, + { + "key": "Кстати, если встретишь Айпери, передай ей, чтобы она подошла ко мне.", + "ru": "Кстати, если встретишь Айпери, передай ей, чтобы она подошла ко мне.", + "en": "By the way, if you meet Aiperi, tell her to come to me." + }, + { + "key": "Я ей отдам нож, и заодно я дам ей новоен задание на модуль.", + "ru": "Я ей отдам нож, и заодно я дам ей новоен задание на модуль.", + "en": "I'll give her the knife, and at the same time I'll give her a new assignment for the module." + }, + { + "key": "Хорошо, извините, я пойду....", + "ru": "Хорошо, извините, я пойду...", + "en": "Okay, excuse me, I'll go..." + }, + { + "key": "Можете пожалуйста дать мне задание на этот модуль?", + "ru": "Можете пожалуйста дать мне задание на этот модуль?", + "en": "Can you please give me an assignment for this module?" + }, + { + "key": "Я же сказала, дай мне сначала найти книги в библиотеке.", + "ru": "Я же сказала, дай мне сначала найти книги в библиотеке.", + "en": "I told you, let me find books in the library first." + }, + { + "key": "Когда я закончу с книжными делами, подойдешь ко мне и получишь задание.", + "ru": "Когда я закончу с книжными делами, подойдешь ко мне и получишь задание.", + "en": "When I'm done with the book business, come to me and get the task." + }, + { + "key": "Я тебя сегодня впервые вижу на парах.", + "ru": "Я тебя сегодня впервые вижу на парах.", + "en": "I see you in class for the first time today." + }, + { + "key": "Ну да, извините, я теперь буду ходить постоянно.", + "ru": "Ну да, извините, я теперь буду ходить постоянно.", + "en": "Well, yes, sorry, I will now be going to classes regularly." + }, + { + "key": "Хорошо, я дам тебе какое-нибудь задание, но не сейчас.", + "ru": "Хорошо, я дам тебе какое-нибудь задание, но не сейчас.", + "en": "Okay, I'll give you some task, but not now." + }, + { + "key": "Я занята, как видишь, я пытаюсь разобраться в каталоге книг в этой библиотеке.", + "ru": "Я занята, как видишь, я пытаюсь разобраться в каталоге книг в этой библиотеке.", + "en": "I'm busy, as you can see, trying to figure out the book catalog in this library." + }, + { + "key": "Когда я закончу, можешь подойти.", + "ru": "Когда я закончу, можешь подойти.", + "en": "When I'm done, you can come over." + }, + { + "key": "Бекзат, ты что делаешь в учительской?", + "ru": "Бекзат, ты что делаешь в учительской?", + "en": "Bekzat, what are you doing in the teachers' room?" + }, + { + "key": "Тебя не предупреждали, что без моего разрешения в учительскую заходить нельзя?", + "ru": "Тебя не предупреждали, что без моего разрешения в учительскую заходить нельзя?", + "en": "Didn't anyone warn you that you can't enter the teachers' room without my permission?" + }, + { + "key": "Как ты вообще сюда попал?", + "ru": "Как ты вообще сюда попал?", + "en": "How did you even get here?" + }, + { + "key": "Айпери дала мне ключ от учительской, чтобы я забрал нож и отдал ей...", + "ru": "Айпери дала мне ключ от учительской, чтобы я забрал нож и отдал ей...", + "en": "Aiperi gave me the key to the teachers' room so I could take the knife and give it to her..." + }, + { + "key": "Вот лиса! Я же сказала ей, чтобы она лично забрала нож. А она взяла и тебя отправила.", + "ru": "Вот лиса! Я же сказала ей, чтобы она лично забрала нож. А она взяла и тебя отправила.", + "en": "What a fox! I told her to take the knife myself. But she just went and sent you away." + }, + { + "key": "Ты точно отдашь этот нож Айпери?", + "ru": "Ты точно отдашь этот нож Айпери?", + "en": "Are you sure you'll give this knife to Aiperi?" + }, + { + "key": "Да, конечно!", + "ru": "Да, конечно!", + "en": "Yes, sure!" + }, + { + "key": "Хорошо. Когда встретишь ее, отдай нож и передай ей, что я ее жду.", + "ru": "Хорошо. Когда встретишь ее, отдай нож и передай ей, что я ее жду.", + "en": "Okay. When you meet her, give her the knife and tell her I'm waiting for her." + }, + { + "key": "Извините, Аида Джаныбековна, я могу пойти уже?", + "ru": "Извините, Аида Джаныбековна, я могу пойти уже?", + "en": "Excuse me, Aida Dzhanybekovna, can I go now?" + }, + { + "key": "Нет, Бекзат. Ты вломился в учительскую, и теперь хочешь просто так уйти? Не получится.", + "ru": "Нет, Бекзат. Ты вломился в учительскую, и теперь хочешь просто так уйти? Не получится.", + "en": "No, Bekzat. You barged into the staff room and now you just want to leave? That won't work." + }, + { + "key": "Я придумала для тебя особенное задание на этот модуль.", + "ru": "Я придумала для тебя особенное задание на этот модуль.", + "en": "I have come up with a special assignment for you for this module." + }, + { + "key": "Подготовь эссе по теме \"Манас в изложении Жусупа Мамая\".", + "ru": "Подготовь эссе по теме \"Манас в изложении Жусупа Мамая\".", + "en": "Prepare an essay on the topic \"Manas as presented by Zhusup Mamai\"." + }, + { + "key": "Ты не сможешь найти ничего по этой теме в интернете. Даже и не пытайся. Тебе придется писать эссе по книге.", + "ru": "Ты не сможешь найти ничего по этой теме в интернете. Даже и не пытайся. Тебе придется писать эссе по книге.", + "en": "You won't be able to find anything on this topic online. Don't even try. You'll have to write an essay based on the book." + }, + { + "key": "Книга про Жусупа Мамая лежит в библиотеке, но забирать ее из библиотеки нельзя.", + "ru": "Книга про Жусупа Мамая лежит в библиотеке, но забирать ее из библиотеки нельзя.", + "en": "The book about Zhusup Mamai is in the library, but you can’t take it out of the library." + }, + { + "key": "Как же я буду писать эссе, если книгу забирать нельзя?", + "ru": "Как же я буду писать эссе, если книгу забирать нельзя?", + "en": "How can I write an essay if I can’t take the book?" + }, + { + "key": "Там в библиотеке есть компьютер, напиши презентацию прямо на нем.", + "ru": "Там в библиотеке есть компьютер, напиши презентацию прямо на нем.", + "en": "There's a computer in the library, write your essay right on it." + }, + { + "key": "До какого числа мне нужно будет сдать это эссе?", + "ru": "До какого числа мне нужно будет сдать это эссе?", + "en": "What date do I have to submit this essay?" + }, + { + "key": "До завтра.", + "ru": "До завтра.", + "en": "The essay is due by tomorrow." + }, + { + "key": "До завтра? Я же не успею!", + "ru": "До завтра? Я же не успею!", + "en": "By tomorrow? I won't make it!" + }, + { + "key": "В твоих интересах успеть. Завтра покажешь мне, что у тебя получилось.", + "ru": "В твоих интересах успеть. Завтра покажешь мне, что у тебя получилось.", + "en": "It's in your best interest to get it done in time. Show me what you've done tomorrow." + }, + { + "key": "Не сдашь модуль - пойдешь на второй год. В другой раз не будешь трогать вещи в учительской без разрешения.", + "ru": "Не сдашь модуль - пойдешь на второй год. В другой раз не будешь трогать вещи в учительской без разрешения.", + "en": "If you fail the module, you'll have to repeat the year. Next time, you won't touch things in the teachers' room without permission." + }, + { + "key": "Ладно...", + "ru": "Ладно...", + "en": "Okay…" + }, + { + "key": "Аида Джаныбековна, вы помните Бегимай? Она вам курсовую хотела сдать.", + "ru": "Аида Джаныбековна, вы помните Бегимай? Она вам курсовую хотела сдать.", + "en": "Aida Dzhanybekovna, do you remember Begimai? She wanted to submit her term paper to you." + }, + { + "key": "Да, она говорила что приносила курсовую, но у меня ее нигде нет.", + "ru": "Да, она говорила что приносила курсовую, но у меня ее нигде нет.", + "en": "Yes, she said that she brought the coursework, but I don’t have it anywhere." + }, + { + "key": "Если ты найдешь и покажешь мне ее курсовую работу, я выставлю ей оценку.", + "ru": "Если ты найдешь и покажешь мне ее курсовую работу, я выставлю ей оценку.", + "en": "If you find and show me her coursework, I will give her a grade." + }, + { + "key": "Бекзат, зачетка Бегимай у тебя. Отправляйся в теневой мир и покажи зачетку призраку Бегимай, чтобы она освободилась.", + "ru": "Бекзат, зачетка Бегимай у тебя. Отправляйся в теневой мир и покажи зачетку призраку Бегимай, чтобы она освободилась.", + "en": "Bekzat, you have Begimai's grade book. Go to the shadow world and show the grade book to Begimai's ghost so she can be released." + }, + { + "key": "Хорошо!", + "ru": "Хорошо!", + "en": "Good!" + }, + { + "key": "Аида Джаныбековна, здравствуйте!", + "ru": "Аида Джаныбековна, здравствуйте!", + "en": "Aida Dzhanybekovna, hello!" + }, + { + "key": "Я принес вам зачетку Бегимай и ее курсовую работу, посмотрите пожалуйста.", + "ru": "Я принес вам зачетку Бегимай и ее курсовую работу, посмотрите пожалуйста.", + "en": "I brought you Begimai's grade book and her coursework, please take a look." + }, + { + "key": "Хорошо, давай посмотрим.", + "ru": "Хорошо, давай посмотрим.", + "en": "Okay, let's see." + }, + { + "key": "Да, я вижу что курсовая написана хорошо, я ставлю ей максимальный балл.", + "ru": "Да, я вижу что курсовая написана хорошо, я ставлю ей максимальный балл.", + "en": "Yes, I see that the coursework is well written, I give it the highest score." + }, + { + "key": "Вот держи зачетку с оценкой.", + "ru": "Вот держи зачетку с оценкой.", + "en": "Here, take the grade book with the grade." + }, + { + "key": "Теперь иди в теневой мир и покажи зачетку Бегимай. Расскажи ей, что она сдала курсовую работу.", + "ru": "Теперь иди в теневой мир и покажи зачетку Бегимай. Расскажи ей, что она сдала курсовую работу.", + "en": "Now go to the shadow world and show Begimai her grade book. Tell her she passed her coursework." + }, + { + "key": "Мне стоит вернуть книгу на место, прежде чем уходить из библиотеки.", + "ru": "Мне стоит вернуть книгу на место, прежде чем уходить из библиотеки.", + "en": "I should return the book to its place before leaving the library." + }, + { + "key": "Иначе Аида Джаныбековна меня убъет.", + "ru": "Иначе Аида Джаныбековна меня убъет.", + "en": "Otherwise Aida Dzhanybekovna will kill me." + }, + { + "key": "Куда я попал?", + "ru": "Куда я попал?", + "en": "Where did I end up?" + }, + { + "key": "Я что, сплю?", + "ru": "Я что, сплю?", + "en": "Am I sleeping?" + }, + { + "key": "Я вижу какие-то тени!", + "ru": "Я вижу какие-то тени!", + "en": "I see some shadows!" + }, + { + "key": "Мне лучше держать нож наготове.", + "ru": "Мне лучше держать нож наготове.", + "en": "I better keep my knife ready." + }, + { + "key": "Призрак", + "ru": "Призрак", + "en": "Ghost" + }, + { + "key": "Ты посмел заговорить со мной?", + "ru": "Ты посмел заговорить со мной?", + "en": "You dare to talk to me?" + }, + { + "key": "Напомни пожалуйста, кто ты?", + "ru": "Напомни пожалуйста, кто ты?", + "en": "Please remind me who you are?" + }, + { + "key": "Ты кто?", + "ru": "Ты кто?", + "en": "Who are you?" + }, + { + "key": "Бегимай", + "ru": "Бегимай", + "en": "Begimai" + }, + { + "key": "Меня зовут Бегимай, мне нужно сдать курсовую по манасоведению.", + "ru": "Меня зовут Бегимай, мне нужно сдать курсовую по манасоведению.", + "en": "My name is Begimai, I need to pass a coursework on Manas studies." + }, + { + "key": "Я появляюсь здесь каждую ночь, чтобы сдать курсовую.", + "ru": "Я появляюсь здесь каждую ночь, чтобы сдать курсовую.", + "en": "I show up here every night to submit my coursework." + }, + { + "key": "И как я могу заставить тебя уйти отсюда?", + "ru": "И как я могу заставить тебя уйти отсюда?", + "en": "And how can I make you leave here?" + }, + { + "key": "Я уйду на покой только когда увиду оценку по курсовой в своей зачетке.", + "ru": "Я уйду на покой только когда увиду оценку по курсовой в своей зачетке.", + "en": "I will retire only when I see the grade for my coursework in my grade book." + }, + { + "key": "А до тех пор, я буду появлятся здесь каждую ночь.", + "ru": "А до тех пор, я буду появлятся здесь каждую ночь.", + "en": "Until then, I'll be here every night." + }, + { + "key": "Ладно, я что-нибудь придумаю.", + "ru": "Ладно, я что-нибудь придумаю.", + "en": "Okay, I'll think of something." + }, + { + "key": "Эй простыня, посмотри сюда.", + "ru": "Эй простыня, посмотри сюда.", + "en": "Hey bedsheet, look here." + }, + { + "key": "Что это?", + "ru": "Что это?", + "en": "What is this?" + }, + { + "key": "Это твоя зачетка.", + "ru": "Это твоя зачетка.", + "en": "This is your grade book." + }, + { + "key": "Тебе поставили за курсовую максимальный балл!", + "ru": "Тебе поставили за курсовую максимальный балл!", + "en": "You got the highest score for your coursework!" + }, + { + "key": "Неужели! Наконец-то, мое предназначение исполнено.", + "ru": "Неужели! Наконец-то, мое предназначение исполнено.", + "en": "Really! At last, my destiny is fulfilled." + }, + { + "key": "Теперь я могу уйти на покой.", + "ru": "Теперь я могу уйти на покой.", + "en": "Now I can rest in peace." + }, + { + "key": "Давай, иди отдыхай.", + "ru": "Давай, иди отдыхай.", + "en": "Sure, go and rest." + }, + { + "key": "Здесь написано: \"Привет собрату теней от собрата теней!\"", + "ru": "Здесь написано: \"Привет собрату теней от собрата теней!\"", + "en": "It says here: \"Greetings to a fellow shadow from a fellow shadow!\"" + }, + { + "key": "\"Дарю тебе способ пройти через любую запертую дверь!\"", + "ru": "\"Дарю тебе способ пройти через любую запертую дверь!\"", + "en": "\"I give you a way to get through any locked door!\"" + }, + { + "key": "\"Коснись рукой серебра и прочитай вслух это заклинание!\"", + "ru": "\"Коснись рукой серебра и прочитай вслух это заклинание!\"", + "en": "\"Touch the silver with your hand and read this spell out loud!\"" + }, + { + "key": "\"Заклинание работает только ночью.\"", + "ru": "\"Заклинание работает только ночью.\"", + "en": "\"The spell only works at night.\"" + }, + { + "key": "Это что, чья-то шутка? Или может стоит попробовать прочитать это заклинание?", + "ru": "Это что, чья-то шутка? Или может стоит попробовать прочитать это заклинание?", + "en": "Is this some kind of joke? Or maybe I should try casting this spell?" + }, + { + "key": "Я воспользуюсь этим компьютером, но сначала мне нужно найти книгу в библиотеке.", + "ru": "Я воспользуюсь этим компьютером, но сначала мне нужно найти книгу в библиотеке.", + "en": "I'll use this computer, but first I need to find a book in the library." + }, + { + "key": "Да, я нашел книгу, вот она! С виду это самая скучная книга во всей библиотеке.", + "ru": "Да, я нашел книгу, вот она! С виду это самая скучная книга во всей библиотеке.", + "en": "Yes, I found the book, here it is! It looks like the most boring book in the whole library." + }, + { + "key": "Я вернул книгу на место.", + "ru": "Я вернул книгу на место.", + "en": "I returned the book to its place." + }, + { + "key": "На этой полке лежат самые скучные книги в этом кабинете.", + "ru": "На этой полке лежат самые скучные книги в этом кабинете.", + "en": "The most boring books in this room are on this shelf." + }, + { + "key": "Я надеюсь, мне эта книга больше не пригодится.", + "ru": "Я надеюсь, мне эта книга больше не пригодится.", + "en": "I hope I won't need this book anymore." + }, + { + "key": "Это старый библиотечный компьютер, он даже не подключен к интернету.", + "ru": "Это старый библиотечный компьютер, он даже не подключен к интернету.", + "en": "It's an old library computer, it's not even connected to the internet." + }, + { + "key": "От этого компьютера сейчас не будет никакого толку.", + "ru": "От этого компьютера сейчас не будет никакого толку.", + "en": "This computer is of no use now." + }, + { + "key": "Надеюсь мне больше не придется притрагиваться к этому компьютеру.", + "ru": "Надеюсь мне больше не придется притрагиваться к этому компьютеру.", + "en": "I hope I never have to touch this computer again." + }, + { + "key": "Похоже, компьютеры в теневом режиме не функционируют никак.", + "ru": "Похоже, компьютеры в теневом режиме не функционируют никак.", + "en": "It appears that computers in dark lands do not function at all." + }, + { + "key": "Тут лежат зачетные книжки студентов.", + "ru": "Тут лежат зачетные книжки студентов.", + "en": "Students' grade books are kept here." + }, + { + "key": "Здесь лежит зачетка Бегимай. Я пожалуй, возьму ее.", + "ru": "Здесь лежит зачетка Бегимай. Я пожалуй, возьму ее.", + "en": "Begimai's grade book is here. I think I'll take it." + }, + { + "key": "Мне еще рано возвращать зачетку Бегимай обратно в шкаф.", + "ru": "Мне еще рано возвращать зачетку Бегимай обратно в шкаф.", + "en": "It's too early for me to return Begimai's grade book back to the shelf." + }, + { + "key": "Чтобы заказать такси, я сначала должен выйти на улицу.", + "ru": "Чтобы заказать такси, я сначала должен выйти на улицу.", + "en": "To order a taxi, I first have to go outside." + }, + { + "key": "Стоит ли написать Айпери?", + "ru": "Стоит ли написать Айпери?", + "en": "Should I write to Aiperi?" + }, + { + "key": "Попросить помощь", + "ru": "Попросить помощь", + "en": "Ask for help" + }, + { + "key": "Айпери, ты в сети?", + "ru": "Айпери, ты в сети?", + "en": "Aiperi, are you online?" + }, + { + "key": "Я уже спать собираюсь. Что случилось?", + "ru": "Я уже спать собираюсь. Что случилось?", + "en": "I'm about to go to bed. What happened?" + }, + { + "key": "Я уснул в универе, и меня заперли тут!", + "ru": "Я уснул в универе, и меня заперли тут!", + "en": "I fell asleep at university and they locked me in here!" + }, + { + "key": "Пхахахх лашара", + "ru": "Пхахахх лашара", + "en": "Phahahahh loser" + }, + { + "key": "Это не смешно!", + "ru": "Это не смешно!", + "en": "This is not funny!" + }, + { + "key": "Я знаю у тебя есть ключи от всех кабинетов. Ты можешь приехать, открыть библиотеку и выпустить меня?", + "ru": "Я знаю у тебя есть ключи от всех кабинетов. Ты можешь приехать, открыть библиотеку и выпустить меня?", + "en": "I know you have the keys to all the rooms. Can you come over, open the library, and let me out?" + }, + { + "key": "Время уже позднее.", + "ru": "Время уже позднее.", + "en": "It's already late." + }, + { + "key": "Там в библиотеке есть мягкий диван. Ляг поспи, а я приеду утром и выпущу тебя.", + "ru": "Там в библиотеке есть мягкий диван. Ляг поспи, а я приеду утром и выпущу тебя.", + "en": "There's a soft sofa in the library. Lie down and sleep, and I'll come in the morning and let you out." + }, + { + "key": "Айпери, ну пожалуйста!", + "ru": "Айпери, ну пожалуйста!", + "en": "Aiperi, please!" + }, + { + "key": "Я пойду спать. Доброй ночи!", + "ru": "Я пойду спать. Доброй ночи!", + "en": "I'm going to bed. Good night!" + }, + { + "key": "Стоит ли написать родителям?", + "ru": "Стоит ли написать родителям?", + "en": "Should I write to my parents?" + }, + { + "key": "Привет, ата! Меня заперли в универе ночью!", + "ru": "Привет, ата! Меня заперли в универе ночью!", + "en": "Hi, dad! I was locked out of the university last night!" + }, + { + "key": "Сынок, ты же знаешь я живу далеко", + "ru": "Сынок, ты же знаешь я живу далеко", + "en": "Son, you know I live far away." + }, + { + "key": "Пока мы приедем, настанет утро!", + "ru": "Пока мы приедем, настанет утро!", + "en": "By the time we get there, it'll be morning!" + }, + { + "key": "Да, точно, извнините", + "ru": "Да, точно, извнините", + "en": "Yeah, right, sorry." + }, + { + "key": "Напиши своей стартосте, может она придумает что сделать?", + "ru": "Напиши своей стартосте, может она придумает что сделать?", + "en": "Write to your class monitor, maybe she'll think of something to do?" + }, + { + "key": "Айпери! Ты где сейчас?", + "ru": "Айпери! Ты где сейчас?", + "en": "Aiperi! Where are you now?" + }, + { + "key": "Я приехала в университет чтобы тебя освободить.", + "ru": "Я приехала в университет чтобы тебя освободить.", + "en": "I came to the university to free you." + }, + { + "key": "Я только что приехала в универ. Что случилось?", + "ru": "Я только что приехала в универ. Что случилось?", + "en": "I just arrived at university. What happened?" + }, + { + "key": "Ты будешь смеяться, но мне снова нужна помощь. Открой дверь и выпусти меня из кабинета пожалуйста!", + "ru": "Ты будешь смеяться, но мне снова нужна помощь. Открой дверь и выпусти меня из кабинета пожалуйста!", + "en": "You'll laugh, but I need your help again. Open the door and let me out of the classroom, please!" + }, + { + "key": "Твое счастье что я всегда прихожу в универ раньше всех.", + "ru": "Твое счастье что я всегда прихожу в универ раньше всех.", + "en": "You're lucky that I always arrive at university before everyone else." + }, + { + "key": "Я заперт в кабинете. Открой мне дверь пожалуйста!", + "ru": "Я заперт в кабинете. Открой мне дверь пожалуйста!", + "en": "I'm locked in the classroom. Open the door for me, please!" + }, + { + "key": "Как ты там оказался?", + "ru": "Как ты там оказался?", + "en": "How did you end up there?" + }, + { + "key": "Это долгая история...", + "ru": "Это долгая история...", + "en": "It's a long story..." + }, + { + "key": "Отойди от двери, я сейчас тебя освобожу!", + "ru": "Отойди от двери, я сейчас тебя освобожу!", + "en": "Get away from the door, I'll free you now!" + }, + { + "key": "Спасибо большое!", + "ru": "Спасибо большое!", + "en": "Thanks a lot!" + }, + { + "key": "Айпери!", + "ru": "Айпери!", + "en": "Aiperi!" + }, + { + "key": "Ты опять застрял в универе ночью, потому что решаешь свои дела?", + "ru": "Ты опять застрял в универе ночью, потому что решаешь свои дела?", + "en": "Are you stuck at university at night again because you're dealing with your own business?" + }, + { + "key": "Дааа, спасибо что вытащила меня снова", + "ru": "Дааа, спасибо что вытащила меня снова", + "en": "Yeah, thanks for getting me out again." + }, + { + "key": "Ого, Бекзат! Как хорошо, что я тебя встретила!", + "ru": "Ого, Бекзат! Как хорошо, что я тебя встретила!", + "en": "Wow, Bekzat! How good that I met you!" + }, + { + "key": "Я не знаю какие у тебя там дела, Бекзат, но ты должен вернуть мне нож как можно скорее!", + "ru": "Я не знаю какие у тебя там дела, Бекзат, но ты должен вернуть мне нож как можно скорее!", + "en": "I don’t know what business you have there, Bekzat, but you must return the knife to me as soon as possible!" + }, + { + "key": "У меня есть один вопрос.", + "ru": "У меня есть один вопрос.", + "en": "I have one question." + }, + { + "key": "Хорошо, я скоро верну тебе твой нож.", + "ru": "Хорошо, я скоро верну тебе твой нож.", + "en": "Okay, I'll give you back your knife soon." + }, + { + "key": "Во-первых, постарайся сделать так, чтобы этого больше не повторялось. Мне вовсе не в кайф вытаскивать твою задницу из проблем.", + "ru": "Во-первых, постарайся сделать так, чтобы этого больше не повторялось. Мне вовсе не в кайф вытаскивать твою задницу из проблем.", + "en": "First of all, try to make sure this doesn't happen again. I don't enjoy bailing you out of trouble." + }, + { + "key": "Во-вторых, какого хрена ты в универе делаешь ночью?", + "ru": "Во-вторых, какого хрена ты в универе делаешь ночью?", + "en": "Secondly, what the hell are you doing at university at night?" + }, + { + "key": "Рассказать про записку", + "ru": "Рассказать про записку", + "en": "Tell about the note" + }, + { + "key": "Умолчать", + "ru": "Умолчать", + "en": "Don't tell" + }, + { + "key": "Ко мне попала странная записка, где было написано заклинание. Я прочитал его, и попал в потусторонний мир.", + "ru": "Ко мне попала странная записка, где было написано заклинание. Я прочитал его, и попал в потусторонний мир.", + "en": "I received a strange note containing a spell. I read it and found myself in the dark lands." + }, + { + "key": "Ты что опять в свои игры переиграл? Какой потусторонний мир?", + "ru": "Ты что опять в свои игры переиграл? Какой потусторонний мир?", + "en": "Are you playing your video games too much? What dark lands?" + }, + { + "key": "Но это правда! Там все было по-другому, и я видел призраков...", + "ru": "Но это правда! Там все было по-другому, и я видел призраков...", + "en": "But it's true! Everything was different there, and I saw ghosts..." + }, + { + "key": "Тебе еще и не такое привидется. Езжай в общагу и выспись.", + "ru": "Тебе еще и не такое привидется. Езжай в общагу и выспись.", + "en": "You'll see worse things than that. Go to the dorm and get some sleep." + }, + { + "key": "Аида Джаныбекова увидела меня в учительской, и заставила писать эссе по этой тупой книге.", + "ru": "Аида Джаныбекова увидела меня в учительской, и заставила писать эссе по этой тупой книге.", + "en": "Aida Dzhanybekovna saw me in the teachers' room and made me write an essay on this stupid book." + }, + { + "key": "Я писал, писал и уснул.", + "ru": "Я писал, писал и уснул.", + "en": "I wrote and wrote and fell asleep." + }, + { + "key": "Дааа, она такая. Видишь как хорошо, что именно ты пошел за ножом, а не я.", + "ru": "Дааа, она такая. Видишь как хорошо, что именно ты пошел за ножом, а не я.", + "en": "Yeah, that's how she is. See, it's a good thing it was you who went for the knife and not me." + }, + { + "key": "Да, кстати.", + "ru": "Да, кстати.", + "en": "Oh, by the way." + }, + { + "key": "Отдавай нож.", + "ru": "Отдавай нож.", + "en": "Give me the knife." + }, + { + "key": "Да, насчет этого. Боюсь, что я не могу тебе пока что отдать нож.", + "ru": "Да, насчет этого. Боюсь, что я не могу тебе пока что отдать нож.", + "en": "Yes, about that. I'm afraid I can't give you the knife yet." + }, + { + "key": "Какого черта?", + "ru": "Какого черта?", + "en": "What the hell?" + }, + { + "key": "Оказывается, я могу убивать призраков только этим ножом, без него я буду беззащитен.", + "ru": "Оказывается, я могу убивать призраков только этим ножом, без него я буду беззащитен.", + "en": "It turns out I can only kill ghosts with this knife, without it I will be defenseless." + }, + { + "key": "Но ты не переживай, я сделаю кое-какое дело и верну тебе этот нож.", + "ru": "Но ты не переживай, я сделаю кое-какое дело и верну тебе этот нож.", + "en": "But don't worry, I'll do some work and return this knife to you." + }, + { + "key": "Постарайся сделать свои дела быстрее, иначе это я тебе голову оторву!", + "ru": "Постарайся сделать свои дела быстрее, иначе это я тебе голову оторву!", + "en": "Try to do your business faster, otherwise I'll rip your head off!" + }, + { + "key": "Да, и еще кое что.", + "ru": "Да, и еще кое что.", + "en": "Yes, and one more thing." + }, + { + "key": "Ты знаешь про студентку Бегимай с прошлого курса?", + "ru": "Ты знаешь про студентку Бегимай с прошлого курса?", + "en": "Do you know about the student Begimai from the last year?" + }, + { + "key": "Я слышала она не смогла сдать курсовую по манасоведению, прыгнула с окна и разбилась насмерть.", + "ru": "Я слышала она не смогла сдать курсовую по манасоведению, прыгнула с окна и разбилась насмерть.", + "en": "I heard she couldn't pass her coursework on Manas studies, jumped out of a window and died." + }, + { + "key": "Менты приезжали, следователи допрашивали ректора, такой скандал был. Прежнего преподавателя по манасоведению отстранили.", + "ru": "Менты приезжали, следователи допрашивали ректора, такой скандал был. Прежнего преподавателя по манасоведению отстранили.", + "en": "The cops came, investigators questioned the university rector, and there was such a scandal. The previous Manas studies professor was suspended." + }, + { + "key": "Поэтому, с этого года у нас этот предмет ведет Аида Джаныбековна.", + "ru": "Поэтому, с этого года у нас этот предмет ведет Аида Джаныбековна.", + "en": "Therefore, starting this year, Aida Dzhanybekovna has been teaching this subject." + }, + { + "key": "Ты не знаешь кого-нибудь, кто был знаком с Бегимай?", + "ru": "Ты не знаешь кого-нибудь, кто был знаком с Бегимай?", + "en": "Do you know anyone who knew Begimai?" + }, + { + "key": "У тебя в общаге живет Алик, в комнате напротив тебя. Он с того же курса. Можешь у него поспрашивать.", + "ru": "У тебя в общаге живет Алик, в комнате напротив тебя. Он с того же курса. Можешь у него поспрашивать.", + "en": "Alik lives in your dorm, in the room across from you. He's in the same year. You could ask him." + }, + { + "key": "Нож мне нужен для кое-каких дел.", + "ru": "Нож мне нужен для кое-каких дел.", + "en": "I need a knife for some things." + }, + { + "key": "Я не буду писать Айпери, она опять будет издеваться надо мной.", + "ru": "Я не буду писать Айпери, она опять будет издеваться надо мной.", + "en": "I won't write to Aiperi, she'll make fun of me again." + }, + { + "key": "Я лучше прочитаю заклинание, перейду в теневой мир и так выберусь наружу.", + "ru": "Я лучше прочитаю заклинание, перейду в теневой мир и так выберусь наружу.", + "en": "I'd rather cast a spell, go into the dark lands, and get out that way." + }, + { + "key": "Я не буду беспокоить Айпери. Я могу выбраться из универа и без ее помощи.", + "ru": "Я не буду беспокоить Айпери. Я могу выбраться из универа и без ее помощи.", + "en": "I won't bother Aiperi. I can get out of the university without her help." + }, + { + "key": "Айпери ты куда убежала?", + "ru": "Айпери ты куда убежала?", + "en": "Aiperi, where did you run off to?" + }, + { + "key": "Ты достал уже, я не могу тебя ждать вечно! Возишься как сонная муха.", + "ru": "Ты достал уже, я не могу тебя ждать вечно! Возишься как сонная муха.", + "en": "You've already had enough, I can't wait for you forever! You're fidgeting like a sleepy fly." + }, + { + "key": "У меня нет времени ждать тебя, мне уже пора на курсы ехать.", + "ru": "У меня нет времени ждать тебя, мне уже пора на курсы ехать.", + "en": "I don't have time to wait for you, it's time for me to go to courses." + }, + { + "key": "Так когда я тебе нож верну?", + "ru": "Так когда я тебе нож верну?", + "en": "So when will I give you back the knife?" + }, + { + "key": "Приходи завтра в универ! Я каждый день в унике с раннего утра.", + "ru": "Приходи завтра в универ! Я каждый день в унике с раннего утра.", + "en": "Come to the university tomorrow! I'm at the university every day from early morning." + }, + { + "key": "Хорошо, встретимся завтра.", + "ru": "Хорошо, встретимся завтра.", + "en": "Okay, see you tomorrow." + }, + { + "key": "Алтынай", + "ru": "Алтынай", + "en": "Altynai" + }, + { + "key": "Бекзат, отстань!", + "ru": "Бекзат, отстань!", + "en": "Bekzat, leave me alone!" + }, + { + "key": "На этой полке лежит литература по ИТ и математике.", + "ru": "На этой полке лежит литература по ИТ и математике.", + "en": "This shelf contains literature on IT and mathematics." + }, + { + "key": "На этой полке лежат учебники по немецкому языку.", + "ru": "На этой полке лежат учебники по немецкому языку.", + "en": "This shelf contains German language textbooks." + }, + { + "key": "Здесь лежат книги по экономике и менеджменту.", + "ru": "Здесь лежат книги по экономике и менеджменту.", + "en": "This shelf contains books on economics and management." + }, + { + "key": "Книга, которую я ищу, точно не здесь лежит.", + "ru": "Книга, которую я ищу, точно не здесь лежит.", + "en": "The book I'm looking for is definitely not here." + }, + { + "key": "Книга, которую я ищу, находится точно не здесь.", + "ru": "Книга, которую я ищу, находится точно не здесь.", + "en": "The book I'm looking for is definitely not here." + }, + { + "key": "Увы, но на этой полке я не найду книгу, которую ищу.", + "ru": "Увы, но на этой полке я не найду книгу, которую ищу.", + "en": "Unfortunately, I won't find the book I'm looking for on this shelf." + }, + { + "key": "Здесь находится лекционный зал. Но дверь сейчас закрыта на ключ.", + "ru": "Здесь находится лекционный зал. Но дверь сейчас закрыта на ключ.", + "en": "The lecture hall is here, but the door is currently locked." + }, + { + "key": "Здесь находится университетская библиотека. Но дверь сейчас закрыта на ключ.", + "ru": "Здесь находится университетская библиотека. Но дверь сейчас закрыта на ключ.", + "en": "The university library is here, but the door is currently locked." + }, + { + "key": "Здесь находится учительская. Но дверь сейчас закрыта на ключ.", + "ru": "Здесь находится учительская. Но дверь сейчас закрыта на ключ.", + "en": "The teachers' room is here, but the door is currently locked." + }, + { + "key": "Айпери должна дать мне ключи от учительской, чтобы я смог забрать нож.", + "ru": "Айпери должна дать мне ключи от учительской, чтобы я смог забрать нож.", + "en": "Aiperi needs to give me the keys to the teachers' lounge so I can retrieve the knife." + }, + { + "key": "Здесь находится студзона, также известная как комната отдыха для студентов. Но дверь сейчас закрыта на ключ.", + "ru": "Здесь находится студзона, также известная как комната отдыха для студентов. Но дверь сейчас закрыта на ключ.", + "en": "This is where the student lounge, also known as the student room, is located. But the door is currently locked." + }, + { + "key": "Здесь находится учебная аудитория. Но дверь сейчас закрыта на ключ.", + "ru": "Здесь находится учебная аудитория. Но дверь сейчас закрыта на ключ.", + "en": "There's a classroom here, but the door is currently locked." + }, + { + "key": "Дверь, естественно, закрыта.", + "ru": "Дверь, естественно, закрыта.", + "en": "The door is closed, of course." + }, + { + "key": "Я попал в теневой мир, чтобы выбраться из запертого кабинета.", + "ru": "Я попал в теневой мир, чтобы выбраться из запертого кабинета.", + "en": "I entered the dark lands to escape from the locked room." + }, + { + "key": "Но по злой иронии, когда я вернулся из теневого мира, я снова оказался за запертой дверью.", + "ru": "Но по злой иронии, когда я вернулся из теневого мира, я снова оказался за запертой дверью.", + "en": "But by a cruel irony, when I returned from the dark lands, I found myself behind a locked door again." + }, + { + "key": "Хорошо, что уже утро. Надо написать Айпери, может она уже скоро приедет в универ?", + "ru": "Хорошо, что уже утро. Надо написать Айпери, может она уже скоро приедет в универ?", + "en": "It's good that it's already morning. I need to text to Aiperi; maybe she'll be arriving at the university soon?" + }, + { + "key": "Бекзат, ты подготовил эссе на тему \"Манас в изложении Жусупа Мамая\"?", + "ru": "Бекзат, ты подготовил эссе на тему \"Манас в изложении Жусупа Мамая\"?", + "en": "Bekzat, have you prepared an essay on the topic \"Manas as presented by Zhusup Mamai\"?" + }, + { + "key": "Еще нет...", + "ru": "Еще нет...", + "en": "Not yet..." + }, + { + "key": "Найди книгу про Жусупа Мамая в библиотеке, а потом садись за компьютер и пиши!", + "ru": "Найди книгу про Жусупа Мамая в библиотеке, а потом садись за компьютер и пиши!", + "en": "Find a book about Zhusup Mamai in the library, and then sit down at the computer and write!" + }, + { + "key": "Пока не выполнишь свое задание на модуль, можешь даже и не подходить ко мне.", + "ru": "Пока не выполнишь свое задание на модуль, можешь даже и не подходить ко мне.", + "en": "Until you complete your assignment for the module, you don't even have to come near me." + }, + { + "key": "Здравствуйте Аида Джаныбековна!", + "ru": "Здравствуйте Аида Джаныбековна!", + "en": "Hello Aida Dzhanybekovna!" + }, + { + "key": "Ну что Бекзат, эссе про Жусупа Мамая готово к сдаче?", + "ru": "Ну что Бекзат, эссе про Жусупа Мамая готово к сдаче?", + "en": "So, Bekzat, is your essay about Zhusup Mamai ready for submission?" + }, + { + "key": "Прощу прощения Аида Джаныбековна, я правда старался, но у меня возникли обстоятельства непреодолимой силы.", + "ru": "Прощу прощения Аида Джаныбековна, я правда старался, но у меня возникли обстоятельства непреодолимой силы.", + "en": "I apologize, Aida Zhanybekovna, I really tried, but I encountered force majeure circumstances." + }, + { + "key": "И что же помешало тебе написать эссе?", + "ru": "И что же помешало тебе написать эссе?", + "en": "So what stopped you from writing the essay?" + }, + { + "key": "Ну я честно сел писать, но книга была такая скучная, что я уснул.", + "ru": "Ну я честно сел писать, но книга была такая скучная, что я уснул.", + "en": "Well, I honestly sat down to write, but the book was so boring that I fell asleep." + }, + { + "key": "А когда я проснулся, оказывается, уже наступила ночь. И я оказался заперт в кабинете.", + "ru": "А когда я проснулся, оказывается, уже наступила ночь. И я оказался заперт в кабинете.", + "en": "And when I woke up, it turned out that night had already fallen. And I found myself locked in the library." + }, + { + "key": "А еще я обнаружил на столе записку. Там было написано какое-то заклинание.", + "ru": "А еще я обнаружил на столе записку. Там было написано какое-то заклинание.", + "en": "I also found a note on the table. It had some kind of spell written on it." + }, + { + "key": "Какое еще заклинание? У тебя эта записка с собой?", + "ru": "Какое еще заклинание? У тебя эта записка с собой?", + "en": "What spell? Do you have this note with you?" + }, + { + "key": "Да, вот, посмотрите.", + "ru": "Да, вот, посмотрите.", + "en": "Yes, here, take a look." + }, + { + "key": "Надеюсь, ты не читал это заклинание?", + "ru": "Надеюсь, ты не читал это заклинание?", + "en": "I hope you didn't read this spell?" + }, + { + "key": "Вообще-то прочитал, а что мне еще оставалось делать. ", + "ru": "Вообще-то прочитал, а что мне еще оставалось делать.", + "en": "Actually, I read it, but what else could I do?" + }, + { + "key": "Когда я прочитал записку, я оказался в странном мире. Дверей вокруг не было, но был черный туман и призраки.", + "ru": "Когда я прочитал записку, я оказался в странном мире. Дверей вокруг не было, но был черный туман и призраки.", + "en": "When I read the note, I found myself in a strange world. There were no doors around, but there was black fog and ghosts." + }, + { + "key": "Это заклинание переместило тебя в мир теней. ", + "ru": "Это заклинание переместило тебя в мир теней.", + "en": "This spell transported you to the dark lands." + }, + { + "key": "Этот мир предназначен для фей и джиннов. Обычные люди туда попасть не могут. Но у тебя это как-то получилось.", + "ru": "Этот мир предназначен для фей и джиннов. Обычные люди туда попасть не могут. Но у тебя это как-то получилось.", + "en": "These lands are meant for fairies and genies. Ordinary people can't get there. But somehow you made it." + }, + { + "key": "А вы откуда все это знаете?", + "ru": "А вы откуда все это знаете?", + "en": "How do you know all this?" + }, + { + "key": "Не забывай, я изучаю фольклор в целом и Манас в частности. Если бы ты не засыпал над книгами, ты бы тоже много интересного узнал про мир от наших предков.", + "ru": "Не забывай, я изучаю фольклор в целом и Манас в частности. Если бы ты не засыпал над книгами, ты бы тоже много интересного узнал про мир от наших предков.", + "en": "Don't forget, I study folklore in general and Manas in particular. If you hadn't fallen asleep over books, you too would have learned many interesting things about the world from our ancestors." + }, + { + "key": "Я освобождаю тебя от задания по эссе. И взамен я дам тебе другое задание. Если хочешь сдать модуль, тебе придется выполнить его.", + "ru": "Я освобождаю тебя от задания по эссе. И взамен я дам тебе другое задание. Если хочешь сдать модуль, тебе придется выполнить его.", + "en": "I'm exempting you from the essay assignment. And in exchange, I'll give you another assignment. If you want to pass the module, you'll have to complete it." + }, + { + "key": "Какое другое задание?", + "ru": "Какое другое задание?", + "en": "What other task?" + }, + { + "key": "В универе завелся призрак. Конечно, его не получится увидеть вживую.", + "ru": "В универе завелся призрак. Конечно, его не получится увидеть вживую.", + "en": "There's a ghost haunting the university. Of course, you won't be able to see it in person." + }, + { + "key": "Но иногда по вечерам я слышу плач из лекционного зала.", + "ru": "Но иногда по вечерам я слышу плач из лекционного зала.", + "en": "But sometimes in the evenings I hear crying from the lecture hall." + }, + { + "key": "А на утро бывает так, что все зачетки в шкафу раскиданы как попало.", + "ru": "А на утро бывает так, что все зачетки в шкафу раскиданы как попало.", + "en": "And in the morning it happens that all the grade books in the closet are scattered all over the place." + }, + { + "key": "Призрак обитает где-то в теневом мире. Попади туда и наладь с ним диалог. Узнай, кто он и что ему нужно.", + "ru": "Призрак обитает где-то в теневом мире. Попади туда и наладь с ним диалог. Узнай, кто он и что ему нужно.", + "en": "The ghost dwells somewhere in the dark lands. Get there and establish a dialogue with him. Find out who he is and what he wants." + }, + { + "key": "Если ты успешно избавишься от призрака, я поставлю тебе максимальный балл за модуль.", + "ru": "Если ты успешно избавишься от призрака, я поставлю тебе максимальный балл за модуль.", + "en": "If you successfully get rid of the ghost, I will give you full marks for the module." + }, + { + "key": "У тебя есть еще вопросы, Бекзат?", + "ru": "У тебя есть еще вопросы, Бекзат?", + "en": "Do you have any more questions, Bekzat?" + }, + { + "key": "Обсудить призрака", + "ru": "Обсудить призрака", + "en": "Discuss the ghost" + }, + { + "key": "Обсудить задание", + "ru": "Обсудить задание", + "en": "Discuss the assignment" + }, + { + "key": "Обсудить теневой мир", + "ru": "Обсудить теневой мир", + "en": "Discuss the dark lands" + }, + { + "key": "Обсудить записку", + "ru": "Обсудить записку", + "en": "Discuss the note" + }, + { + "key": "Что это вообще за теневой мир? Откуда он взялся?", + "ru": "Что это вообще за теневой мир? Откуда он взялся?", + "en": "What is this dark lands anyway? Where did it come from?" + }, + { + "key": "Теневой мир это мир, в котором обитают феи, духи и джинны. Он существовал всегда.", + "ru": "Теневой мир это мир, в котором обитают феи, духи и джинны. Он существовал всегда.", + "en": "The Dark Lands is a world inhabited by fairies, spirits, and genies. It has always existed." + }, + { + "key": "Обычные люди, не воители, туда не попадают обычно. Кроме тебя, тебе это как-то удалось.", + "ru": "Обычные люди, не воители, туда не попадают обычно. Кроме тебя, тебе это как-то удалось.", + "en": "Ordinary people, not warriors, don't usually get there. Except you, you somehow managed it." + }, + { + "key": "Спрашивай что хочешь, я попробую объяснить.", + "ru": "Спрашивай что хочешь, я попробую объяснить.", + "en": "Ask whatever you want, I'll try to explain." + }, + { + "key": "Время в теневом мире", + "ru": "Время в теневом мире", + "en": "Time in the dark lands" + }, + { + "key": "Призраки в теневом мире", + "ru": "Призраки в теневом мире", + "en": "Ghosts in the dark lands" + }, + { + "key": "Двери в теневом мире", + "ru": "Двери в теневом мире", + "en": "Doors in the dark lands" + }, + { + "key": "Выход из теневого мира", + "ru": "Выход из теневого мира", + "en": "Exit from the dark lands" + }, + { + "key": "Достаточно", + "ru": "Достаточно", + "en": "Enough" + }, + { + "key": "Почему в теневом мире нет дверей?", + "ru": "Почему в теневом мире нет дверей?", + "en": "Why are there no doors in the dark lands?" + }, + { + "key": "Я думаю, в мир теней проецируются только фундаментальные объекты, типа зданий, деревьев, рельефа.", + "ru": "Я думаю, в мир теней проецируются только фундаментальные объекты, типа зданий, деревьев, рельефа.", + "en": "I think that only fundamental objects, such as buildings, trees, and terrain, are projected into the dark lands." + }, + { + "key": "Это происходит потому, что в теневом мире время течет сильно медленнее, чем в нашем мире.", + "ru": "Это происходит потому, что в теневом мире время течет сильно медленнее, чем в нашем мире.", + "en": "This happens because in the dark lands time flows much slower than in our world." + }, + { + "key": "Двери у нас слишком часто открываются и закрываются, поэтому в теневом мире они \"размываются\" или попадают в суперпозицию.", + "ru": "Двери у нас слишком часто открываются и закрываются, поэтому в теневом мире они \"размываются\" или попадают в суперпозицию.", + "en": "Our doors open and close too often, so in the dark lands they become \"blurred\" or fall into some sort of superposition." + }, + { + "key": "Поэтому в мире теней ты можешь спокойно пройти через дверной проем. Но сквозь стены ты пройти не сможешь, они более плотные.", + "ru": "Поэтому в мире теней ты можешь спокойно пройти через дверной проем. Но сквозь стены ты пройти не сможешь, они более плотные.", + "en": "So, in the dark lands, you can easily pass through a doorway. But you won't be able to pass through walls; they're denser." + }, + { + "key": "Откуда в теневом мире призраки?", + "ru": "Откуда в теневом мире призраки?", + "en": "Where do ghosts come from in the dark lands?" + }, + { + "key": "Это их мир, и они там живут. Я думаю что увидев тебя, обитатели теневого мира тоже были шокированы.", + "ru": "Это их мир, и они там живут. Я думаю что увидев тебя, обитатели теневого мира тоже были шокированы.", + "en": "This is their world, and they live there. I think the inhabitants of the dark lands were also shocked when they saw you." + }, + { + "key": "Но кое в чем ты прав. Здесь в универе, призраков раньше не было. Всякая чертовщина начала происходить совсем недавно.", + "ru": "Но кое в чем ты прав. Здесь в универе, призраков раньше не было. Всякая чертовщина начала происходить совсем недавно.", + "en": "But you're right about one thing. There weren't any ghosts here at the university before. All this weird stuff just started happening recently." + }, + { + "key": "Ты должен узнать, откуда здесь появился призрак, и заставить его исчезнуть.", + "ru": "Ты должен узнать, откуда здесь появился призрак, и заставить его исчезнуть.", + "en": "You must find out where the ghost came from and make it disappear." + }, + { + "key": "Помимо призрака, есть еще и тени. Но ты не беспокойся, это всего лишь проекции негативных мыслей.", + "ru": "Помимо призрака, есть еще и тени. Но ты не беспокойся, это всего лишь проекции негативных мыслей.", + "en": "Besides ghosts, there are also shadows. But don't worry, these are just projections of negative thoughts." + }, + { + "key": "Просто избавляйся от теней, когда встретишь их. А когда ты изгонишь призрака, тени исчезнут сами. ", + "ru": "Просто избавляйся от теней, когда встретишь их. А когда ты изгонишь призрака, тени исчезнут сами.", + "en": "Just get rid of the shadows when you encounter them. And when you exorcise the ghost, the shadows will disappear on their own." + }, + { + "key": "Каждый раз, когда я выпадаю из теневого мира, наступает утро. Хотя я там был всего несколько минут.", + "ru": "Каждый раз, когда я выпадаю из теневого мира, наступает утро. Хотя я там был всего несколько минут.", + "en": "Every time I emerge from the dark lands, morning comes, even though I was only there for a few minutes." + }, + { + "key": "Время в мире теней течет значительно медленнее, чем в нашем.", + "ru": "Время в мире теней течет значительно медленнее, чем в нашем.", + "en": "Time in the dark lands flows much slower than in ours." + }, + { + "key": "И похоже, что течение времени там нелинейное.", + "ru": "И похоже, что течение времени там нелинейное.", + "en": "And it seems that the flow of time there is non-linear." + }, + { + "key": "Это объясняет, почему в теневом мире есть деревья и строения, но отсутствуют двери, автомобили, и прочее.", + "ru": "Это объясняет, почему в теневом мире есть деревья и строения, но отсутствуют двери, автомобили, и прочее.", + "en": "This explains why the dark lands has trees and buildings, but no doors, cars, etc." + }, + { + "key": "Объекты в нашем мире должны долго находится на одном месте, прежде чем их проекция появится в мире теней.", + "ru": "Объекты в нашем мире должны долго находится на одном месте, прежде чем их проекция появится в мире теней.", + "en": "Objects in our world must remain in one place for a long time before their projection appears in the dark lands." + }, + { + "key": "Меня постоянно выкидывает из теневого мира. Как я могу там остаться подольше?", + "ru": "Меня постоянно выкидывает из теневого мира. Как я могу там остаться подольше?", + "en": "I'm constantly being thrown out of the dark lands. How can I stay there any longer?" + }, + { + "key": "Если ты потеряешь сознание в теневом мире, то ты принудительно вернешься в наш мир.", + "ru": "Если ты потеряешь сознание в теневом мире, то ты принудительно вернешься в наш мир.", + "en": "If you lose consciousness in the dark lands, you will be forcibly returned to our world." + }, + { + "key": "Также избегай света луны, луна тоже может вернуть тебя в мир людей. Лучше вообще не выходи из помещения. ", + "ru": "Также избегай света луны, луна тоже может вернуть тебя в мир людей. Лучше вообще не выходи из помещения.", + "en": "Also, avoid moonlight; it can also bring you back to the human world. It's best to stay indoors altogether." + }, + { + "key": "Если ты задержишься, и в человеческом мире настанет утро, тебя тоже выбросит из теневого мира.", + "ru": "Если ты задержишься, и в человеческом мире настанет утро, тебя тоже выбросит из теневого мира.", + "en": "If you stay too long and morning comes in the human world, you will be thrown out of the dark lands too." + }, + { + "key": "Но ты не беспокойся. Даже если тебя выбросит из теневого мира, ты всегда сможешь повторить свою попытку на следующую ночь.", + "ru": "Но ты не беспокойся. Даже если тебя выбросит из теневого мира, ты всегда сможешь повторить свою попытку на следующую ночь.", + "en": "But don't worry. Even if you're thrown out of the dark lands, you can always try again the next night." + }, + { + "key": "У тебя есть еще вопросы про теневой мир?", + "ru": "У тебя есть еще вопросы про теневой мир?", + "en": "Do you have any more questions about the dark lands?" + }, + { + "key": "Ладно, я узнал достаточно.", + "ru": "Ладно, я узнал достаточно.", + "en": "Okay, I've learned enough." + }, + { + "key": "Ты хочешь что-нибудь еще обсудить?", + "ru": "Ты хочешь что-нибудь еще обсудить?", + "en": "Is there anything else you want to discuss?" + }, + { + "key": "Это вы мне подложили записку?", + "ru": "Это вы мне подложили записку?", + "en": "Was it you who slipped me that note?" + }, + { + "key": "Нет, это не я. И на самом деле, я немного обеспокоена этим.", + "ru": "Нет, это не я. И на самом деле, я немного обеспокоена этим.", + "en": "No, it's not me. And actually, I'm a little worried about it." + }, + { + "key": "Когда я узнала, что в университете начались паранормальные явления, я сразу поняла что это призрак в теневом мире.", + "ru": "Когда я узнала, что в университете начались паранормальные явления, я сразу поняла что это призрак в теневом мире.", + "en": "When I learned that paranormal phenomena had begun at the university, I immediately realized that it was a ghost in the dark lands." + }, + { + "key": "Я знаю заклинание, которое тебе дали. У этого заклинания есть еще одно условие - оно сработает только на людей, которые чисты сердцем.", + "ru": "Я знаю заклинание, которое тебе дали. У этого заклинания есть еще одно условие - оно сработает только на людей, которые чисты сердцем.", + "en": "I know the spell you were given. This spell has one more condition: it will only work on people who are pure of heart." + }, + { + "key": "Я взяла серебряный нож Айпери и пробовала прочитать заклинание, и у меня не получилось.", + "ru": "Я взяла серебряный нож Айпери и пробовала прочитать заклинание, и у меня не получилось.", + "en": "I took Aiperi's silver knife and tried to cast the spell, but it didn't work." + }, + { + "key": "Тогда я предположила, что Айпери уж точно сможет прочитать заклинание и попасть в теневой мир.", + "ru": "Тогда я предположила, что Айпери уж точно сможет прочитать заклинание и попасть в теневой мир.", + "en": "Then I assumed that Aiperi would definitely be able to cast the spell and enter the dark lands." + }, + { + "key": "Как раз поэтому я хотела вернуть нож ей лично. И заодно отправить ее в теневой мир.", + "ru": "Как раз поэтому я хотела вернуть нож ей лично. И заодно отправить ее в теневой мир.", + "en": "That's exactly why I wanted to return the knife to her personally. And at the same time, ask her to go to the dark lands." + }, + { + "key": "Но ты смешал все мои планы. Сначала ты забрал нож, а потом кто-то подсунул тебе записку.", + "ru": "Но ты смешал все мои планы. Сначала ты забрал нож, а потом кто-то подсунул тебе записку.", + "en": "But you messed up all my plans. First you took the knife, and then someone slipped you a note." + }, + { + "key": "Это очень странно. Как будто кто-то играет против меня, и кто-то специально ввел тебя в игру заместо Айпери.", + "ru": "Это очень странно. Как будто кто-то играет против меня, и кто-то специально ввел тебя в игру заместо Айпери.", + "en": "It's really weird. It's like someone's playing against me, and someone deliberately brought you into the game instead of Aiperi." + }, + { + "key": "Хорошо, я постараюсь узнать, откуда появилась эта записка.", + "ru": "Хорошо, я постараюсь узнать, откуда появилась эта записка.", + "en": "Okay, I'll try to find out where this note came from." + }, + { + "key": "В чем заключается мое задание на модуль?", + "ru": "В чем заключается мое задание на модуль?", + "en": "What is my assignment for the module?" + }, + { + "key": "Узнай что нужно призраку, и постарайся уговорить его покинуть университет.", + "ru": "Узнай что нужно призраку, и постарайся уговорить его покинуть университет.", + "en": "Find out what the ghost wants and try to persuade him to leave the university." + }, + { + "key": "Или ты хочешь вместо этого писать эссе про Жусупа Мамая?", + "ru": "Или ты хочешь вместо этого писать эссе про Жусупа Мамая?", + "en": "Or do you want to write an essay about Zhusup Mamai instead?" + }, + { + "key": "Ой, нет, я лучше пойду изгонять призрака, чем опять притронусь к этой скучной книге.", + "ru": "Ой, нет, я лучше пойду изгонять призрака, чем опять притронусь к этой скучной книге.", + "en": "Oh no, I'd rather go exorcise a ghost than touch that boring book again." + }, + { + "key": "Я встретил призрака и поговорил с ним, точнее с ней.", + "ru": "Я встретил призрака и поговорил с ним, точнее с ней.", + "en": "I met a ghost and talked to him, or rather to her." + }, + { + "key": "Напомните пожалуйста, что мне нужно сделать?", + "ru": "Напомните пожалуйста, что мне нужно сделать?", + "en": "Please remind me what I need to do?" + }, + { + "key": "Она говорит, что ее зовут Бегимай, и что она должна сдать курсовую работу по манасоведению.", + "ru": "Она говорит, что ее зовут Бегимай, и что она должна сдать курсовую работу по манасоведению.", + "en": "She says that her name is Begimai and that she has to submit a coursework on Manas studies." + }, + { + "key": "Я не знаю ни одной студентки по имени Бегимай.", + "ru": "Я не знаю ни одной студентки по имени Бегимай.", + "en": "I don't know any students named Begimai." + }, + { + "key": "Но с другой стороны, я здесь преподаю только с этого года. Возможно, Бегимай училась у предыдущего преподавателя?", + "ru": "Но с другой стороны, я здесь преподаю только с этого года. Возможно, Бегимай училась у предыдущего преподавателя?", + "en": "But then again, I've only been teaching here since this year. Perhaps Begimai studied with the previous teacher?" + }, + { + "key": "И что же мне делать?", + "ru": "И что же мне делать?", + "en": "So what should I do?" + }, + { + "key": "Опроси студентов и узнай подробнее, кто эта призрак Бегимай и откуда она взялась.", + "ru": "Опроси студентов и узнай подробнее, кто эта призрак Бегимай и откуда она взялась.", + "en": "Ask the students and find out more about who this ghost Begimai is and where she came from." + }, + { + "key": "Потом возвращайся ко мне, и мы обсудим, что делать дальше.", + "ru": "Потом возвращайся ко мне, и мы обсудим, что делать дальше.", + "en": "Then come back to me and we'll discuss what to do next." + }, + { + "key": "Хорошо.", + "ru": "Хорошо.", + "en": "Okay." + }, + { + "key": "У тебя есть еще вопросы?", + "ru": "У тебя есть еще вопросы?", + "en": "Do you have any more questions?" + }, + { + "key": "Обсудить тему", + "ru": "Обсудить тему", + "en": "Discuss a topic" + }, + { + "key": "Вопросов нет", + "ru": "Вопросов нет", + "en": "No questions" + }, + { + "key": "Вопросов нет, я пошел!", + "ru": "Вопросов нет, я пошел!", + "en": "I don't have questions, I'm off!" + }, + { + "key": "Где я могу найти призрака?", + "ru": "Где я могу найти призрака?", + "en": "Where can I find a ghost?" + }, + { + "key": "Переходи в теневой мир, а затем иди в лекционный зал.", + "ru": "Переходи в теневой мир, а затем иди в лекционный зал.", + "en": "Go to the dark lands and then go to the lecture hall." + }, + { + "key": "Постарайся поговорить с призраком, и узнать, что ему нужно.", + "ru": "Постарайся поговорить с призраком, и узнать, что ему нужно.", + "en": "Try to talk to the ghost and find out what he wants." + }, + { + "key": "Потом возвращайся ко мне, и мы обсудим, как можно его изгнать.", + "ru": "Потом возвращайся ко мне, и мы обсудим, как можно его изгнать.", + "en": "Then come back to me and we will discuss how to drive him out." + }, + { + "key": "Я хочу еще кое-что обсудить", + "ru": "Я хочу еще кое-что обсудить", + "en": "I want to discuss something else." + }, + { + "key": "Найди курсовую работу Бегимай и принеси мне ее. Я проверю курсовую вместо предыдущего преподавателя и выставлю ей оценку.", + "ru": "Найди курсовую работу Бегимай и принеси мне ее. Я проверю курсовую вместо предыдущего преподавателя и выставлю ей оценку.", + "en": "Find Begimai's coursework and bring it to me. I'll check it for the previous teacher and give her a grade." + }, + { + "key": "Иди к шкафу в учительской. Среди зачетных книжек найти зачетку Бегимай и принеси мне. Я поставлю ей оценку за курсовую работу.", + "ru": "Иди к шкафу в учительской. Среди зачетных книжек найти зачетку Бегимай и принеси мне. Я поставлю ей оценку за курсовую работу.", + "en": "Go to the cabinet in the teachers' room. Find Begimai's grade book among the grade books and bring it to me. I'll give her a grade for her coursework." + }, + { + "key": "Ты уже нашел курсовую работу Бегимай?", + "ru": "Ты уже нашел курсовую работу Бегимай?", + "en": "Have you found Begimai's coursework yet?" + }, + { + "key": "Я узнал подробности про призрака.", + "ru": "Я узнал подробности про призрака.", + "en": "I learned the details about the ghost." + }, + { + "key": "Она была студенткой по имени Бегимай, и она хотела сдать курсовую работу.", + "ru": "Она была студенткой по имени Бегимай, и она хотела сдать курсовую работу.", + "en": "She was a student named Begimai, and she wanted to submit her coursework." + }, + { + "key": "По несчастливой случайности, ее курсовая работа затерялась среди мусора, и затем была выброшена.", + "ru": "По несчастливой случайности, ее курсовая работа затерялась среди мусора, и затем была выброшена.", + "en": "By an unfortunate accident, her coursework was lost in the trash and then thrown away." + }, + { + "key": "Преподаватель не нашел ее курсовую работу и поставил ей ноль баллов.", + "ru": "Преподаватель не нашел ее курсовую работу и поставил ей ноль баллов.", + "en": "The teacher didn't find her coursework and gave her zero grade." + }, + { + "key": "С горя Бегимай выбросилась из окна. И с тех пор каждую ночь она появляется в универе и хочет сдать курсовую работу.", + "ru": "С горя Бегимай выбросилась из окна. И с тех пор каждую ночь она появляется в универе и хочет сдать курсовую работу.", + "en": "In her grief, Begimai jumped out of the window. Since then, she's been haunting up at the university every night, eager to submit her coursework." + }, + { + "key": "Печальная история.", + "ru": "Печальная история.", + "en": "A sad story." + }, + { + "key": "Судя по всему, чтобы освободить ее, нужно найти ее курсовую работу и поставить ей оценку.", + "ru": "Судя по всему, чтобы освободить ее, нужно найти ее курсовую работу и поставить ей оценку.", + "en": "Apparently, to free her, we need to find her coursework and grade it." + }, + { + "key": "Ты нашел ее курсовую работу?", + "ru": "Ты нашел ее курсовую работу?", + "en": "Did you find her coursework?" + }, + { + "key": "Да, вот она.", + "ru": "Да, вот она.", + "en": "Yes, here it is." + }, + { + "key": "Да, вижу. Курсовая работа написана очень хорошо. Пожалуй, я могу выставить за нее максимальный балл.", + "ru": "Да, вижу. Курсовая работа написана очень хорошо. Пожалуй, я могу выставить за нее максимальный балл.", + "en": "Yes, I see. The coursework is very well written. I think I can give it a full mark." + }, + { + "key": "Теперь поищи в шкафу зачетку Бегимай, и принеси мне, я выставлю ей оценку.", + "ru": "Теперь поищи в шкафу зачетку Бегимай, и принеси мне, я выставлю ей оценку.", + "en": "Now look in the cabinet for Begimai's grade book and bring it to me, I'll give her a grade." + }, + { + "key": "Еще нет.", + "ru": "Еще нет.", + "en": "Not yet." + }, + { + "key": "Найди и принеси мне ее. Я проверю работу за предыдущего преподавателя и выставлю ей оценку.", + "ru": "Найди и принеси мне ее. Я проверю работу за предыдущего преподавателя и выставлю ей оценку.", + "en": "Find it and bring it to me. I'll check the previous teacher's work and give her a grade." + }, + { + "key": "Ммм, тортик.", + "ru": "Ммм, тортик.", + "en": "Mmm, cake." + }, + { + "key": "Но если я возьму кусочек, Аида Джаныбековна меня убьет.", + "ru": "Но если я возьму кусочек, Аида Джаныбековна меня убьет.", + "en": "But if I take a piece, Aida Dzhanybekovna will kill me." + }, + { + "key": "Здесь лежат книги по юриспруденции и праву.", + "ru": "Здесь лежат книги по юриспруденции и праву.", + "en": "There are books on jurisprudence and law here." + }, + { + "key": "Бекзат, помнишь мы скидывались на торт для Аиды Джаныбековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.", + "ru": "Бекзат, помнишь мы скидывались на торт для Аиды Джаныбековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.", + "en": "Bekzat, remember how we chipped in for a cake for Aida Dzhanybekovna? ​​I even brought a tablecloth, plates, and a silver cake knife. And I still haven't gotten anything back." + }, + { + "key": "Помнишь мы скидывались на торт для Аиды Джаныбековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.", + "ru": "Помнишь мы скидывались на торт для Аиды Джаныбековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.", + "en": "Remember when we chipped in for a cake for Aida Dzhanybekovna? ​​I even brought a tablecloth, plates, and a silver cake knife. And I still haven't gotten anything back." + }, + { + "key": "А во вторых, мне как-то не хочется попадаться на глаза Аиде.", + "ru": "А во вторых, мне как-то не хочется попадаться на глаза Аиде.", + "en": "And secondly, I somehow don’t want to catch Aida’s eye." + }, + { + "key": "Да... Только не говори Аиде Джаныбековной что я здесь.", + "ru": "Да... Только не говори Аиде Джаныбековной что я здесь.", + "en": "Yes... Just don't tell Aida Dzhanybekovna that I'm here." + }, + { + "key": "Постарайся только Аиде Джаныбековной особо на глаза не попадаться. ", + "ru": "Постарайся только Аиде Джаныбековной особо на глаза не попадаться.", + "en": "Just try not to catch Aida Dzhanibekovna's eye." + }, + { + "key": "Это разве твой нож? Этот нож принадлежит Айпери.", + "ru": "Это разве твой нож? Этот нож принадлежит Айпери.", + "en": "Is this your knife? This knife belongs to Aiperi." + }, + { + "key": "Хорошо...", + "ru": "Хорошо...", + "en": "Okay…" + }, + { + "key": "Я ей отдам нож, и заодно я дам ей новое задание на модуль.", + "ru": "Я ей отдам нож, и заодно я дам ей новое задание на модуль.", + "en": "I'll give her the knife, and at the same time I'll give her a new assignment for the module." + }, + { + "key": "Хорошо, извините, я пойду...", + "ru": "Хорошо, извините, я пойду...", + "en": "Okay, excuse me, I'll go..." + }, + { + "key": "Там в библиотеке есть компьютер, напиши эссе прямо на нем.", + "ru": "Там в библиотеке есть компьютер, напиши эссе прямо на нем.", + "en": "There's a computer in the library, write your essay right on it." + }, + { + "key": "Я уйду на покой только когда увижу оценку по курсовой в своей зачетке.", + "ru": "Я уйду на покой только когда увижу оценку по курсовой в своей зачетке.", + "en": "I will rest in peace only when I see the grade for my coursework in my grade book." + }, + { + "key": "А до тех пор, я буду появляться здесь каждую ночь.", + "ru": "А до тех пор, я буду появляться здесь каждую ночь.", + "en": "Until then, I'll be here every night." + }, + { + "key": "Тебе еще и не такое привидится. Езжай в общагу и выспись.", + "ru": "Тебе еще и не такое привидится. Езжай в общагу и выспись.", + "en": "You'll see worse things than that. Go to the dorm and get some sleep." + }, + { + "key": "Аида Джаныбековна увидела меня в учительской, и заставила писать эссе по этой тупой книге.", + "ru": "Аида Джаныбековна увидела меня в учительской, и заставила писать эссе по этой тупой книге.", + "en": "Aida Dzhanybekovna saw me in the teachers' room and made me write an essay on this stupid book." + }, + { + "key": "Прошу прощения Аида Джаныбековна, я правда старался, но у меня возникли обстоятельства непреодолимой силы.", + "ru": "Прошу прощения Аида Джаныбековна, я правда старался, но у меня возникли обстоятельства непреодолимой силы.", + "en": "I apologize, Aida Dzhanybekovna, I really tried, but I encountered force majeure circumstances." + } + ] +} \ No newline at end of file diff --git a/resources/dialogue/uni_exterior_dialogues002.json b/resources/dialogue/uni_exterior_dialogues002.json index 0a5c7f0..3c059d5 100644 --- a/resources/dialogue/uni_exterior_dialogues002.json +++ b/resources/dialogue/uni_exterior_dialogues002.json @@ -271,7 +271,7 @@ "type": "Line", "speaker": "Айпери", "portrait": "resources/dialogue/portrait_phone.png", - "text": "Бекзат, помнишь мы скидывались на торт для Аиды Джаныбековой? Я тогда еще приносила скатерть, тарелки и нож для торта. И я до сих пор не получила назад ничего.", + "text": "Бекзат, помнишь мы скидывались на торт для Аиды Джаныбековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.", "next": "line_2", "chatBubble": "in" }, diff --git a/resources/dialogue/uni_interior_dialogues_009.json b/resources/dialogue/uni_interior_dialogues_009.json index 37f7a25..ebcffbc 100644 --- a/resources/dialogue/uni_interior_dialogues_009.json +++ b/resources/dialogue/uni_interior_dialogues_009.json @@ -156,7 +156,7 @@ "type": "Line", "speaker": "Айпери", "portrait": "resources/dialogue/portrait_aiperi.png", - "text": "Помнишь мы скидывались на торт для Аиды Джаныбековой? Я тогда еще приносила скатерть, тарелки и нож для торта. И я до сих пор не получила назад ничего.", + "text": "Помнишь мы скидывались на торт для Аиды Джаныбековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.", "next": "line_7" }, { @@ -212,7 +212,7 @@ "type": "Line", "speaker": "Айпери", "portrait": "resources/dialogue/portrait_aiperi.png", - "text": "А во вторых, мне как-то не хочется попадаться на глаза Аиде. Я даже лекцию пропустила.", + "text": "А во вторых, мне как-то не хочется попадаться на глаза Аиде.", "next": "line_14" }, { @@ -236,7 +236,7 @@ "type": "Line", "speaker": "Айпери", "portrait": "resources/dialogue/portrait_aiperi.png", - "text": "Да... Только не говори Аиде Джаныбековой что я здесь.", + "text": "Да... Только не говори Аиде Джаныбековной что я здесь.", "next": "line_18" }, { @@ -268,7 +268,7 @@ "type": "Line", "speaker": "Айпери", "portrait": "resources/dialogue/portrait_aiperi.png", - "text": "Постарайся только Аиде Джаныбековой особо на глаза не попадаться. ", + "text": "Постарайся только Аиде Джаныбековной особо на глаза не попадаться. ", "next": "line_23" }, { @@ -527,7 +527,7 @@ { "id": "line_8", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Зачем тебе в учительскую?", "next": "line_9" @@ -543,15 +543,15 @@ { "id": "line_10", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", - "text": "Это разве твой нож? Этот нож мне одолжила Айпери.", + "text": "Это разве твой нож? Этот нож принадлежит Айпери.", "next": "line_11" }, { "id": "line_11", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Пусть она сама лично и приходит.", "next": "line_12" @@ -559,7 +559,7 @@ { "id": "line_12", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "А ты даже не смей заходить в учительскую без моего разрешения!", "next": "condition_3" @@ -569,7 +569,7 @@ "type": "Line", "speaker": "Бекзат", "portrait": "resources/dialogue/portrait_hero_neutral.png", - "text": "Хорошо....", + "text": "Хорошо...", "next": "line_5" }, { @@ -596,7 +596,7 @@ { "id": "line_3", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Тогда не отвлекай меня, я занята!", "next": "condition_2" @@ -617,7 +617,7 @@ { "id": "line_5", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Кстати, если встретишь Айпери, передай ей, чтобы она подошла ко мне.", "next": "line_6" @@ -625,9 +625,9 @@ { "id": "line_6", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", - "text": "Я ей отдам нож, и заодно я дам ей новоен задание на модуль.", + "text": "Я ей отдам нож, и заодно я дам ей новое задание на модуль.", "next": "setflag_1" }, { @@ -646,7 +646,7 @@ "type": "Line", "speaker": "Бекзат", "portrait": "resources/dialogue/portrait_hero_neutral.png", - "text": "Хорошо, извините, я пойду....", + "text": "Хорошо, извините, я пойду...", "next": "end_1" }, { @@ -677,7 +677,7 @@ { "id": "line_20", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Я же сказала, дай мне сначала найти книги в библиотеке.", "next": "line_21" @@ -685,7 +685,7 @@ { "id": "line_21", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Когда я закончу с книжными делами, подойдешь ко мне и получишь задание.", "next": "line_4" @@ -693,7 +693,7 @@ { "id": "line_15", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Я тебя сегодня впервые вижу на парах.", "next": "line_16" @@ -709,7 +709,7 @@ { "id": "line_17", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Хорошо, я дам тебе какое-нибудь задание, но не сейчас.", "next": "line_18" @@ -717,7 +717,7 @@ { "id": "line_18", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Я занята, как видишь, я пытаюсь разобраться в каталоге книг в этой библиотеке.", "next": "line_19" @@ -725,7 +725,7 @@ { "id": "line_19", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Когда я закончу, можешь подойти.", "next": "setflag_2" @@ -759,7 +759,7 @@ { "id": "line_7", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Тебя не предупреждали, что без моего разрешения в учительскую заходить нельзя?", "next": "line_8" @@ -767,7 +767,7 @@ { "id": "line_8", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Как ты вообще сюда попал?", "next": "line_9" @@ -783,7 +783,7 @@ { "id": "line_10", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Вот лиса! Я же сказала ей, чтобы она лично забрала нож. А она взяла и тебя отправила.", "next": "line_11" @@ -791,7 +791,7 @@ { "id": "line_11", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Ты точно отдашь этот нож Айпери?", "next": "line_21" @@ -807,7 +807,7 @@ { "id": "line_22", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Хорошо. Когда встретишь ее, отдай нож и передай ей, что я ее жду.", "next": "line_12" @@ -823,7 +823,7 @@ { "id": "line_13", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Нет, Бекзат. Ты вломился в учительскую, и теперь хочешь просто так уйти? Не получится.", "next": "line_14" @@ -831,7 +831,7 @@ { "id": "line_14", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Я придумала для тебя особенное задание на этот модуль.", "next": "line_2" @@ -847,7 +847,7 @@ { "id": "line_15", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Ты не сможешь найти ничего по этой теме в интернете. Даже и не пытайся. Тебе придется писать эссе по книге.", "next": "line_3" @@ -873,7 +873,7 @@ "type": "Line", "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", - "text": "Там в библиотеке есть компьютер, напиши презентацию прямо на нем.", + "text": "Там в библиотеке есть компьютер, напиши эссе прямо на нем.", "next": "line_16" }, { @@ -887,7 +887,7 @@ { "id": "line_17", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "До завтра.", "next": "line_18" @@ -903,7 +903,7 @@ { "id": "line_19", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "В твоих интересах успеть. Завтра покажешь мне, что у тебя получилось.", "next": "line_20" @@ -911,7 +911,7 @@ { "id": "line_20", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Не сдашь модуль - пойдешь на второй год. В другой раз не будешь трогать вещи в учительской без разрешения.", "next": "line_6" @@ -974,7 +974,7 @@ { "id": "line_1", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Бекзат, зачетка Бегимай у тебя. Отправляйся в теневой мир и покажи зачетку призраку Бегимай, чтобы она освободилась.", "objectiveComplete": "", @@ -1046,7 +1046,7 @@ { "id": "line_7", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Теперь иди в теневой мир и покажи зачетку Бегимай. Расскажи ей, что она сдала курсовую работу.", "next": "line_6" @@ -1214,7 +1214,7 @@ "type": "Line", "speaker": "Бегимай", "portrait": "resources/dialogue/portrait_ghost.png", - "text": "Я уйду на покой только когда увиду оценку по курсовой в своей зачетке.", + "text": "Я уйду на покой только когда увижу оценку по курсовой в своей зачетке.", "next": "line_7" }, { @@ -1222,7 +1222,7 @@ "type": "Line", "speaker": "Бегимай", "portrait": "resources/dialogue/portrait_ghost.png", - "text": "А до тех пор, я буду появлятся здесь каждую ночь.", + "text": "А до тех пор, я буду появляться здесь каждую ночь.", "next": "line_8" }, { @@ -2228,7 +2228,7 @@ "type": "Line", "speaker": "Айпери", "portrait": "resources/dialogue/portrait_aiperi.png", - "text": "Тебе еще и не такое привидется. Езжай в общагу и выспись.", + "text": "Тебе еще и не такое привидится. Езжай в общагу и выспись.", "next": "setflag_1" }, { @@ -2252,7 +2252,7 @@ "type": "Line", "speaker": "Бекзат", "portrait": "resources/dialogue/portrait_hero_neutral.png", - "text": "Аида Джаныбекова увидела меня в учительской, и заставила писать эссе по этой тупой книге.", + "text": "Аида Джаныбековна увидела меня в учительской, и заставила писать эссе по этой тупой книге.", "next": "line_9" }, { @@ -2508,7 +2508,7 @@ "type": "Line", "speaker": "Айпери", "portrait": "resources/dialogue/portrait_phone.png", - "text": "Бекзат, помнишь мы скидывались на торт для Аиды Джаныбековой? Я тогда еще приносила скатерть, тарелки и нож для торта. И я до сих пор не получила назад ничего.", + "text": "Бекзат, помнишь мы скидывались на торт для Аиды Джаныбековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.", "next": "line_2", "chatBubble": "in" }, @@ -3058,7 +3058,7 @@ { "id": "line_1", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Бекзат, ты подготовил эссе на тему \"Манас в изложении Жусупа Мамая\"?", "objectiveComplete": "", @@ -3075,7 +3075,7 @@ { "id": "line_4", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Найди книгу про Жусупа Мамая в библиотеке, а потом садись за компьютер и пиши!", "next": "line_3" @@ -3123,7 +3123,7 @@ { "id": "line_99", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Ну что Бекзат, эссе про Жусупа Мамая готово к сдаче?", "next": "line_2" @@ -3133,7 +3133,7 @@ "type": "Line", "speaker": "Бекзат", "portrait": "resources/dialogue/portrait_hero_neutral.png", - "text": "Прощу прощения Аида Джаныбековна, я правда старался, но у меня возникли обстоятельства непреодолимой силы.", + "text": "Прошу прощения Аида Джаныбековна, я правда старался, но у меня возникли обстоятельства непреодолимой силы.", "next": "line_3" }, { @@ -3171,7 +3171,7 @@ { "id": "line_6", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Какое еще заклинание? У тебя эта записка с собой?", "next": "line_7" @@ -3187,7 +3187,7 @@ { "id": "line_8", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Надеюсь, ты не читал это заклинание?", "next": "line_9" @@ -3211,7 +3211,7 @@ { "id": "line_12", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Это заклинание переместило тебя в мир теней. ", "next": "line_13" @@ -3219,7 +3219,7 @@ { "id": "line_13", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Этот мир предназначен для фей и джиннов. Обычные люди туда попасть не могут. Но у тебя это как-то получилось.", "next": "line_14" @@ -3235,7 +3235,7 @@ { "id": "line_15", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Не забывай, я изучаю фольклор в целом и Манас в частности. Если бы ты не засыпал над книгами, ты бы тоже много интересного узнал про мир от наших предков.", "next": "line_16" @@ -3243,7 +3243,7 @@ { "id": "line_16", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Я освобождаю тебя от задания по эссе. И взамен я дам тебе другое задание. Если хочешь сдать модуль, тебе придется выполнить его.", "next": "line_17" @@ -3259,7 +3259,7 @@ { "id": "line_18", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "В универе завелся призрак. Конечно, его не получится увидеть вживую.", "next": "line_19" @@ -3267,7 +3267,7 @@ { "id": "line_19", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Но иногда по вечерам я слышу плач из лекционного зала.", "next": "line_20" @@ -3275,7 +3275,7 @@ { "id": "line_20", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "А на утро бывает так, что все зачетки в шкафу раскиданы как попало.", "next": "line_21" @@ -3283,7 +3283,7 @@ { "id": "line_21", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Призрак обитает где-то в теневом мире. Попади туда и наладь с ним диалог. Узнай, кто он и что ему нужно.", "next": "line_22" @@ -3291,7 +3291,7 @@ { "id": "line_22", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Если ты успешно избавишься от призрака, я поставлю тебе максимальный балл за модуль.", "next": "setflag_4" @@ -3310,7 +3310,7 @@ { "id": "line_23", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "У тебя есть еще вопросы, Бекзат?", "next": "choice_1" @@ -3359,7 +3359,7 @@ { "id": "line_25", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Теневой мир это мир, в котором обитают феи, духи и джинны. Он существовал всегда.", "next": "line_26" @@ -3367,7 +3367,7 @@ { "id": "line_26", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Обычные люди, не воители, туда не попадают обычно. Кроме тебя, тебе это как-то удалось.", "next": "line_31" @@ -3375,7 +3375,7 @@ { "id": "line_31", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Спрашивай что хочешь, я попробую объяснить.", "next": "choice_2" @@ -3430,7 +3430,7 @@ { "id": "line_30", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Я думаю, в мир теней проецируются только фундаментальные объекты, типа зданий, деревьев, рельефа.", "next": "line_27" @@ -3438,7 +3438,7 @@ { "id": "line_27", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Это происходит потому, что в теневом мире время течет сильно медленнее, чем в нашем мире.", "next": "line_32" @@ -3446,7 +3446,7 @@ { "id": "line_32", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Двери у нас слишком часто открываются и закрываются, поэтому в теневом мире они \"размываются\" или попадают в суперпозицию.", "next": "line_28" @@ -3454,7 +3454,7 @@ { "id": "line_28", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Поэтому в мире теней ты можешь спокойно пройти через дверной проем. Но сквозь стены ты пройти не сможешь, они более плотные.", "next": "line_49" @@ -3474,7 +3474,7 @@ { "id": "line_34", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Это их мир, и они там живут. Я думаю что увидев тебя, обитатели теневого мира тоже были шокированы.", "next": "line_35" @@ -3482,7 +3482,7 @@ { "id": "line_35", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Но кое в чем ты прав. Здесь в универе, призраков раньше не было. Всякая чертовщина начала происходить совсем недавно.", "next": "line_36" @@ -3490,7 +3490,7 @@ { "id": "line_36", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Ты должен узнать, откуда здесь появился призрак, и заставить его исчезнуть.", "next": "line_37" @@ -3498,7 +3498,7 @@ { "id": "line_37", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Помимо призрака, есть еще и тени. Но ты не беспокойся, это всего лишь проекции негативных мыслей.", "next": "line_38" @@ -3506,7 +3506,7 @@ { "id": "line_38", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Просто избавляйся от теней, когда встретишь их. А когда ты изгонишь призрака, тени исчезнут сами. ", "next": "line_49" @@ -3522,7 +3522,7 @@ { "id": "line_40", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Время в мире теней течет значительно медленнее, чем в нашем.", "next": "line_41" @@ -3530,7 +3530,7 @@ { "id": "line_41", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "И похоже, что течение времени там нелинейное.", "next": "line_42" @@ -3538,7 +3538,7 @@ { "id": "line_42", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Это объясняет, почему в теневом мире есть деревья и строения, но отсутствуют двери, автомобили, и прочее.", "next": "line_43" @@ -3546,7 +3546,7 @@ { "id": "line_43", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Объекты в нашем мире должны долго находится на одном месте, прежде чем их проекция появится в мире теней.", "next": "line_49" @@ -3562,7 +3562,7 @@ { "id": "line_45", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Если ты потеряешь сознание в теневом мире, то ты принудительно вернешься в наш мир.", "next": "line_46" @@ -3570,7 +3570,7 @@ { "id": "line_46", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Также избегай света луны, луна тоже может вернуть тебя в мир людей. Лучше вообще не выходи из помещения. ", "next": "line_47" @@ -3578,7 +3578,7 @@ { "id": "line_47", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Если ты задержишься, и в человеческом мире настанет утро, тебя тоже выбросит из теневого мира.", "next": "line_48" @@ -3586,7 +3586,7 @@ { "id": "line_48", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Но ты не беспокойся. Даже если тебя выбросит из теневого мира, ты всегда сможешь повторить свою попытку на следующую ночь.", "next": "line_49" @@ -3594,7 +3594,7 @@ { "id": "line_49", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "У тебя есть еще вопросы про теневой мир?", "next": "choice_2" @@ -3610,7 +3610,7 @@ { "id": "line_51", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Ты хочешь что-нибудь еще обсудить?", "next": "choice_1" @@ -3626,7 +3626,7 @@ { "id": "line_53", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Нет, это не я. И на самом деле, я немного обеспокоена этим.", "next": "line_56" @@ -3634,7 +3634,7 @@ { "id": "line_56", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Когда я узнала, что в университете начались паранормальные явления, я сразу поняла что это призрак в теневом мире.", "next": "line_54" @@ -3642,7 +3642,7 @@ { "id": "line_54", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Я знаю заклинание, которое тебе дали. У этого заклинания есть еще одно условие - оно сработает только на людей, которые чисты сердцем.", "next": "line_57" @@ -3650,7 +3650,7 @@ { "id": "line_57", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Я взяла серебряный нож Айпери и пробовала прочитать заклинание, и у меня не получилось.", "next": "line_55" @@ -3658,7 +3658,7 @@ { "id": "line_55", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Тогда я предположила, что Айпери уж точно сможет прочитать заклинание и попасть в теневой мир.", "next": "line_58" @@ -3666,7 +3666,7 @@ { "id": "line_58", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Как раз поэтому я хотела вернуть нож ей лично. И заодно отправить ее в теневой мир.", "next": "line_59" @@ -3674,7 +3674,7 @@ { "id": "line_59", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Но ты смешал все мои планы. Сначала ты забрал нож, а потом кто-то подсунул тебе записку.", "next": "line_60" @@ -3682,7 +3682,7 @@ { "id": "line_60", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Это очень странно. Как будто кто-то играет против меня, и кто-то специально ввел тебя в игру заместо Айпери.", "next": "line_61" @@ -3706,7 +3706,7 @@ { "id": "line_63", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Узнай что нужно призраку, и постарайся уговорить его покинуть университет.", "next": "line_64" @@ -3714,7 +3714,7 @@ { "id": "line_64", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Или ты хочешь вместо этого писать эссе про Жусупа Мамая?", "next": "line_65" @@ -3780,7 +3780,7 @@ { "id": "line_72", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Я не знаю ни одной студентки по имени Бегимай.", "next": "line_73" @@ -3788,7 +3788,7 @@ { "id": "line_73", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Но с другой стороны, я здесь преподаю только с этого года. Возможно, Бегимай училась у предыдущего преподавателя?", "next": "line_74" @@ -3804,7 +3804,7 @@ { "id": "line_75", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Опроси студентов и узнай подробнее, кто эта призрак Бегимай и откуда она взялась.", "next": "line_76" @@ -3812,7 +3812,7 @@ { "id": "line_76", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Потом возвращайся ко мне, и мы обсудим, что делать дальше.", "next": "setflag_1" @@ -3839,7 +3839,7 @@ { "id": "line_78", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "У тебя есть еще вопросы?", "next": "choice_4" @@ -3884,7 +3884,7 @@ { "id": "line_67", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Переходи в теневой мир, а затем иди в лекционный зал.", "next": "line_68" @@ -3892,7 +3892,7 @@ { "id": "line_68", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Постарайся поговорить с призраком, и узнать, что ему нужно.", "next": "line_69" @@ -3900,7 +3900,7 @@ { "id": "line_69", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Потом возвращайся ко мне, и мы обсудим, как можно его изгнать.", "next": "line_77" @@ -3963,7 +3963,7 @@ { "id": "line_95", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Найди курсовую работу Бегимай и принеси мне ее. Я проверю курсовую вместо предыдущего преподавателя и выставлю ей оценку.", "next": "line_77" @@ -3984,7 +3984,7 @@ { "id": "line_97", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Иди к шкафу в учительской. Среди зачетных книжек найти зачетку Бегимай и принеси мне. Я поставлю ей оценку за курсовую работу.", "next": "line_77" @@ -3992,7 +3992,7 @@ { "id": "line_96", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Ты уже нашел курсовую работу Бегимай?", "next": "line_92" @@ -4040,7 +4040,7 @@ { "id": "line_87", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Печальная история.", "next": "line_88" @@ -4048,7 +4048,7 @@ { "id": "line_88", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Судя по всему, чтобы освободить ее, нужно найти ее курсовую работу и поставить ей оценку.", "next": "line_89" @@ -4056,7 +4056,7 @@ { "id": "line_89", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Ты нашел ее курсовую работу?", "next": "condition_4" @@ -4085,7 +4085,7 @@ { "id": "line_93", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Да, вижу. Курсовая работа написана очень хорошо. Пожалуй, я могу выставить за нее максимальный балл.", "next": "line_98" @@ -4093,7 +4093,7 @@ { "id": "line_98", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Теперь поищи в шкафу зачетку Бегимай, и принеси мне, я выставлю ей оценку.", "next": "setflag_3" @@ -4120,7 +4120,7 @@ { "id": "line_91", "type": "Line", - "speaker": "Аида Джаныбекова", + "speaker": "Аида Джаныбековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Найди и принеси мне ее. Я проверю работу за предыдущего преподавателя и выставлю ей оценку.", "next": "setflag_2" diff --git a/src/Game.cpp b/src/Game.cpp index 36752df..1a44c71 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -1,5 +1,6 @@ #include "Game.h" #include "AnimatedModel.h" +#include "Localization.h" #include "utils/Utils.h" #include #include "items/ItemRegistry.h" @@ -150,6 +151,11 @@ namespace ZL { std::cout << "Load resurces step 12x1" << std::endl; + // Must happen before createLocations() below: some location scripts + // (e.g. resources/start_dorm.lua) start a dialogue as soon as they're + // loaded, so the language needs to be known before that first load. + ZL::loadLanguageSetting(); + #ifdef EMSCRIPTEN renderer.shaderManager.AddShaderFromFiles("env_sky", "resources/shaders/env_sky.vertex", "resources/shaders/env_sky_web.fragment", CONST_ZIP_FILE); diff --git a/src/Localization.cpp b/src/Localization.cpp new file mode 100644 index 0000000..81121f7 --- /dev/null +++ b/src/Localization.cpp @@ -0,0 +1,38 @@ +#include "Localization.h" + +#include "external/nlohmann/json.hpp" +#include "utils/Utils.h" +#include + +namespace ZL { + +Language g_currentLanguage = Language::Russian; + +std::string languageToCode(Language lang) { + switch (lang) { + case Language::English: return "en"; + case Language::Russian: + default: return "ru"; + } +} + +Language languageFromCode(const std::string& code) { + if (code == "en") return Language::English; + return Language::Russian; +} + +void loadLanguageSetting() { + const std::string content = readTextFile("settings.json"); + if (content.empty()) return; + + try { + const nlohmann::json root = nlohmann::json::parse(content); + if (root.contains("language")) { + g_currentLanguage = languageFromCode(root["language"].get()); + } + } catch (const std::exception& e) { + std::cerr << "[settings] Failed to parse settings.json: " << e.what() << std::endl; + } +} + +} // namespace ZL diff --git a/src/Localization.h b/src/Localization.h new file mode 100644 index 0000000..78b3b76 --- /dev/null +++ b/src/Localization.h @@ -0,0 +1,23 @@ +#pragma once +#include + +namespace ZL { + +enum class Language { + Russian, + English +}; + +// Currently selected language for in-game text. Defaults to Russian. +extern Language g_currentLanguage; + +std::string languageToCode(Language lang); +Language languageFromCode(const std::string& code); + +// Reads the "language" field from settings.json (if present) and updates +// g_currentLanguage. Safe to call even if settings.json doesn't exist yet. +// Must run before any location/dialogue content is loaded, since some +// location scripts start dialogues eagerly as soon as they're loaded. +void loadLanguageSetting(); + +} // namespace ZL diff --git a/src/Location.cpp b/src/Location.cpp index 5354fe2..d929574 100644 --- a/src/Location.cpp +++ b/src/Location.cpp @@ -164,12 +164,13 @@ namespace ZL std::cout << "Shadow map initialized" << std::endl; //#endif - setupNavigation(params.navigationJsonPaths); dialogueSystem.init(renderer, CONST_ZIP_FILE); dialogueSystem.loadDatabase(params.dialoguesJsonPath); dialogueSystem.loadCutsceneDatabase("resources/dialogue/cutscenes008.json"); + dialogueSystem.loadTranslations("resources/dialogue/translate_dialogues.json"); + dialogueSystem.loadCutsceneTranslations("resources/dialogue/translate_cutscenes.json"); dialogueSystem.setQuestJournal(journal); npcNameText = std::make_unique(); diff --git a/src/MenuManager.cpp b/src/MenuManager.cpp index 1fbb765..afe4a50 100644 --- a/src/MenuManager.cpp +++ b/src/MenuManager.cpp @@ -1,5 +1,6 @@ #include "MenuManager.h" #include "Game.h" +#include "Localization.h" #include "render/TextRenderer.h" #include "utils/Utils.h" #include @@ -412,10 +413,10 @@ namespace ZL { }); uiManager.setTextButtonCallback("languageRussianButton", [this](const std::string&) { - + ZL::g_currentLanguage = ZL::Language::Russian; }); uiManager.setTextButtonCallback("languageEnglishButton", [this](const std::string&) { - + ZL::g_currentLanguage = ZL::Language::English; }); } @@ -1821,6 +1822,7 @@ namespace ZL { root["musicEnabled"] = audioPlayer_.isMusicEnabled(); root["soundEnabled"] = audioPlayer_.isSoundEnabled(); root["fullscreen"] = Environment::isFullscreen; + root["language"] = ZL::languageToCode(ZL::g_currentLanguage); std::ofstream file("settings.json"); if (file.is_open()) { @@ -1835,6 +1837,11 @@ namespace ZL { // directly in the right fullscreen state (see WIN32 main() in main.cpp) to avoid // a windowed -> fullscreen flash. The block below just keeps Environment::isFullscreen // in sync in case this is ever called from a path that didn't pre-apply it. + // Language is loaded separately, even earlier (see ZL::loadLanguageSetting() + // callers), because some location scripts start a dialogue as soon as they're + // loaded, before this function ever runs. + ZL::loadLanguageSetting(); + const std::string content = ZL::readTextFile("settings.json"); if (content.empty()) return; try { diff --git a/src/cutscene/CutsceneRuntime.cpp b/src/cutscene/CutsceneRuntime.cpp index 5f982f6..a3953dc 100644 --- a/src/cutscene/CutsceneRuntime.cpp +++ b/src/cutscene/CutsceneRuntime.cpp @@ -10,6 +10,14 @@ void CutsceneRuntime::setDatabase(const CutsceneDatabase* value) { database = value; } +void CutsceneRuntime::setTranslationDatabase(const ZL::Dialogue::TranslationDatabase* value) { + translations = value; +} + +std::string CutsceneRuntime::tr(const std::string& s) const { + return translations ? translations->translate(s, ZL::g_currentLanguage) : s; +} + void CutsceneRuntime::setOnFinished(std::function cb) { onFinished = std::move(cb); } @@ -329,9 +337,9 @@ void CutsceneRuntime::refreshPresentation() { } const CutsceneLine& line = activeCutscene->lines[currentCutsceneLine]; - presentation.speaker = line.speaker; - presentation.fullText = line.text; - presentation.visibleText = line.text; + presentation.speaker = tr(line.speaker); + presentation.fullText = tr(line.text); + presentation.visibleText = presentation.fullText; presentation.selectedChoice = 0; } diff --git a/src/cutscene/CutsceneRuntime.h b/src/cutscene/CutsceneRuntime.h index 9f8d4cf..4295667 100644 --- a/src/cutscene/CutsceneRuntime.h +++ b/src/cutscene/CutsceneRuntime.h @@ -2,6 +2,8 @@ #include "cutscene/CutsceneDatabase.h" #include "dialogue/DialogueTypes.h" +#include "dialogue/TranslationDatabase.h" +#include "Localization.h" #include #include @@ -10,6 +12,7 @@ namespace ZL::Cutscene { class CutsceneRuntime { public: void setDatabase(const CutsceneDatabase* value); + void setTranslationDatabase(const ZL::Dialogue::TranslationDatabase* value); void setOnFinished(std::function cb); void setOnLineStarted(std::function cb); @@ -27,6 +30,7 @@ public: private: const CutsceneDatabase* database = nullptr; + const ZL::Dialogue::TranslationDatabase* translations = nullptr; const StaticCutsceneDefinition* activeCutscene = nullptr; std::string activeCutsceneId; @@ -50,6 +54,7 @@ private: void syncLineToElapsedTime(); void advanceLine(); void refreshPresentation(); + std::string tr(const std::string& s) const; std::vector evaluateImages() const; diff --git a/src/dialogue/DialogueRuntime.cpp b/src/dialogue/DialogueRuntime.cpp index 1c20a7f..32ba69a 100644 --- a/src/dialogue/DialogueRuntime.cpp +++ b/src/dialogue/DialogueRuntime.cpp @@ -15,6 +15,14 @@ void DialogueRuntime::setDatabase(const DialogueDatabase* value) { database = value; } +void DialogueRuntime::setTranslationDatabase(const TranslationDatabase* value) { + translations = value; +} + +std::string DialogueRuntime::tr(const std::string& s) const { + return translations ? translations->translate(s, g_currentLanguage) : s; +} + bool DialogueRuntime::startDialogue(const std::string& dialogueId) { if (!database) { std::cerr << "[dialogue] No database assigned to runtime\n"; @@ -295,14 +303,14 @@ void DialogueRuntime::presentLine(const Node& node) { mode = Mode::PresentingLine; revealCharacters = 0.0f; presentation.mode = PresentationMode::Dialogue; - presentation.speaker = node.speaker; - presentation.fullText = node.text; + presentation.speaker = tr(node.speaker); + presentation.fullText = tr(node.text); presentation.visibleText.clear(); presentation.portraitPath = node.portrait; presentation.choices.clear(); presentation.selectedChoice = -1; - presentation.revealCompleted = node.text.empty(); + presentation.revealCompleted = presentation.fullText.empty(); presentation.showCutsceneSubtitle = false; presentation.cutsceneSkippable = false; @@ -311,8 +319,8 @@ void DialogueRuntime::presentLine(const Node& node) { presentation.cutsceneBlackAlpha = 0.0f; if (presentation.revealCompleted) { - presentation.visibleText = node.text; - revealCharacters = static_cast(node.text.size()); + presentation.visibleText = presentation.fullText; + revealCharacters = static_cast(presentation.fullText.size()); } applyQuestActions(node.questUnlock, node.questComplete, node.questFail, @@ -321,7 +329,7 @@ void DialogueRuntime::presentLine(const Node& node) { onDialogueLineStarted(node.luaCallback); } if (!node.chatBubble.empty() && onChatBubbleReady) { - onChatBubbleReady(node.text, node.chatBubble == "in"); + onChatBubbleReady(presentation.fullText, node.chatBubble == "in"); } } @@ -333,7 +341,7 @@ void DialogueRuntime::presentChoices(const Node& node) { if (!choice.id.empty() && consumedChoices.count(choice.id) > 0) continue; if (!evaluateConditions(choice.conditions)) continue; visibleChoices.push_back(choice); - presentation.choices.push_back({ choice.id, choice.text, choice.kind }); + presentation.choices.push_back({ choice.id, tr(choice.text), choice.kind }); } if (visibleChoices.empty()) { @@ -349,9 +357,9 @@ void DialogueRuntime::presentChoices(const Node& node) { mode = Mode::WaitingForChoice; selectedChoice = -1; presentation.mode = PresentationMode::Choice; - presentation.speaker = node.speaker; - presentation.fullText = node.text; - presentation.visibleText = node.text; + presentation.speaker = tr(node.speaker); + presentation.fullText = tr(node.text); + presentation.visibleText = presentation.fullText; presentation.portraitPath = node.portrait; presentation.selectedChoice = -1; diff --git a/src/dialogue/DialogueRuntime.h b/src/dialogue/DialogueRuntime.h index 793c26b..8321e1f 100644 --- a/src/dialogue/DialogueRuntime.h +++ b/src/dialogue/DialogueRuntime.h @@ -1,6 +1,7 @@ #pragma once #include "dialogue/DialogueDatabase.h" +#include "dialogue/TranslationDatabase.h" #include "quest/QuestJournal.h" #include "external/nlohmann/json.hpp" #include "ISaveable.h" @@ -15,6 +16,7 @@ namespace ZL::Dialogue { class DialogueRuntime : public ZL::ISaveable { public: void setDatabase(const DialogueDatabase* value); + void setTranslationDatabase(const TranslationDatabase* value); bool startDialogue(const std::string& dialogueId); void stop(); @@ -62,6 +64,7 @@ private: std::function onChatBubbleReady; const DialogueDatabase* database = nullptr; + const TranslationDatabase* translations = nullptr; Quest::QuestJournal* questJournal = nullptr; const DialogueDefinition* activeDialogue = nullptr; @@ -86,6 +89,7 @@ private: bool enterNode(const std::string& nodeId); void presentLine(const Node& node); void presentChoices(const Node& node); + std::string tr(const std::string& s) const; }; } // namespace ZL::Dialogue diff --git a/src/dialogue/DialogueSystem.cpp b/src/dialogue/DialogueSystem.cpp index 0be9a59..cc1767b 100644 --- a/src/dialogue/DialogueSystem.cpp +++ b/src/dialogue/DialogueSystem.cpp @@ -4,7 +4,9 @@ namespace ZL::Dialogue { bool DialogueSystem::init(Renderer& renderer, const std::string& zipFile) { dialogueRuntime.setDatabase(&database); + dialogueRuntime.setTranslationDatabase(&translationDatabase); cutsceneRuntime.setDatabase(&cutsceneDatabase); + cutsceneRuntime.setTranslationDatabase(&cutsceneTranslationDatabase); // When dialogue hits a CutsceneStart node, hand off to cutsceneRuntime. dialogueRuntime.setOnCutsceneStartNeeded([this](const std::string& cutsceneId, const std::string& nextNodeId) { @@ -30,6 +32,14 @@ bool DialogueSystem::loadCutsceneDatabase(const std::string& path) { return cutsceneDatabase.loadFromFile(path); } +bool DialogueSystem::loadTranslations(const std::string& path) { + return translationDatabase.loadFromFile(path); +} + +bool DialogueSystem::loadCutsceneTranslations(const std::string& path) { + return cutsceneTranslationDatabase.loadFromFile(path); +} + void DialogueSystem::update(int deltaMs) { dialogueRuntime.update(deltaMs); cutsceneRuntime.update(deltaMs); diff --git a/src/dialogue/DialogueSystem.h b/src/dialogue/DialogueSystem.h index 848edc3..028aa0b 100644 --- a/src/dialogue/DialogueSystem.h +++ b/src/dialogue/DialogueSystem.h @@ -20,6 +20,8 @@ public: bool loadDatabase(const std::string& path); bool loadCutsceneDatabase(const std::string& path); + bool loadTranslations(const std::string& path); + bool loadCutsceneTranslations(const std::string& path); void update(int deltaMs); void draw(Renderer& renderer); @@ -64,10 +66,12 @@ public: private: DialogueDatabase database; + TranslationDatabase translationDatabase; DialogueRuntime dialogueRuntime; DialogueOverlay dialogueOverlay; ZL::Cutscene::CutsceneDatabase cutsceneDatabase; + TranslationDatabase cutsceneTranslationDatabase; ZL::Cutscene::CutsceneRuntime cutsceneRuntime; ZL::Cutscene::CutsceneOverlay cutsceneOverlay; diff --git a/src/dialogue/TranslationDatabase.cpp b/src/dialogue/TranslationDatabase.cpp new file mode 100644 index 0000000..8efcbc9 --- /dev/null +++ b/src/dialogue/TranslationDatabase.cpp @@ -0,0 +1,80 @@ +#include "dialogue/TranslationDatabase.h" + +#include "utils/Utils.h" +#include + +namespace ZL +{ + extern const char* CONST_ZIP_FILE; +} + +namespace ZL::Dialogue { + +bool TranslationDatabase::loadFromFile(const std::string& path) { + entries.clear(); + + std::string raw; + try { + if (strlen(CONST_ZIP_FILE) == 0) { + raw = readTextFile(path); + } + else { + auto buf = readFileFromZIP(path, CONST_ZIP_FILE); + if (buf.empty()) { + std::cerr << "[translation] Failed to read " << path << " from zip\n"; + return false; + } + raw.assign(buf.begin(), buf.end()); + } + } + catch (const std::exception& e) { + std::cerr << "[translation] Failed to open " << path << ": " << e.what() << "\n"; + return false; + } + + json root; + try { + root = json::parse(raw); + } + catch (const std::exception& e) { + std::cerr << "[translation] JSON parse error in " << path << ": " << e.what() << "\n"; + return false; + } + + if (root.contains("dialogue_translations") && root["dialogue_translations"].is_array()) { + for (const auto& item : root["dialogue_translations"]) { + const std::string key = item.value("key", ""); + if (key.empty()) continue; + + std::unordered_map langMap; + for (auto it = item.begin(); it != item.end(); ++it) { + if (it.key() == "key") continue; + if (it.value().is_string()) { + langMap[it.key()] = it.value().get(); + } + } + entries[key] = std::move(langMap); + } + } + + return !entries.empty(); +} + +std::string TranslationDatabase::translate(const std::string& key, Language lang) const { + if (key.empty()) return key; + + auto it = entries.find(key); + if (it == entries.end()) return key; + + const auto& langMap = it->second; + + auto langIt = langMap.find(languageToCode(lang)); + if (langIt != langMap.end() && !langIt->second.empty()) return langIt->second; + + auto ruIt = langMap.find("ru"); + if (ruIt != langMap.end() && !ruIt->second.empty()) return ruIt->second; + + return key; +} + +} // namespace ZL::Dialogue diff --git a/src/dialogue/TranslationDatabase.h b/src/dialogue/TranslationDatabase.h new file mode 100644 index 0000000..8f8a364 --- /dev/null +++ b/src/dialogue/TranslationDatabase.h @@ -0,0 +1,26 @@ +#pragma once + +#include "Localization.h" +#include "external/nlohmann/json.hpp" +#include +#include + +namespace ZL::Dialogue { + +// Loads a shared translation file mapping dialogue "key" strings (the literal +// speaker/text/choice text found in dialogue config files) to per-language text. +class TranslationDatabase { +public: + using json = nlohmann::json; + + bool loadFromFile(const std::string& path); + + // Returns the translated text for `key` in `lang`, falling back to Russian, + // then to `key` itself if no entry or translation exists. + std::string translate(const std::string& key, Language lang) const; + +private: + std::unordered_map> entries; +}; + +} // namespace ZL::Dialogue diff --git a/sync_cutscene_translations.py b/sync_cutscene_translations.py new file mode 100644 index 0000000..d86d541 --- /dev/null +++ b/sync_cutscene_translations.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +""" +sync_cutscene_translations.py - Sync a cutscene config's strings into a translation file. + +Reads , collects every non-empty "speaker" and "text" string +from its lines, and appends any string not already present as a "key" in + as a new entry with an empty "en" slot ready for a translator +to fill in. New entries are always appended at the end of the list so missing +translations are easy to locate. + +Cutscene translations are intentionally kept in their own file/database, separate +from dialogue translations - point at a dedicated file such as +resources/dialogue/cutscene_translations.json. + +Usage: + python sync_cutscene_translations.py +""" + +import json +import sys + +from translation_sync_common import sync_translations + + +def collect_strings(cutscene_config: dict) -> list[str]: + seen = set() + ordered = [] + + def add(value): + if value and value not in seen: + seen.add(value) + ordered.append(value) + + for cutscene in cutscene_config.get("cutscenes", []): + for line in cutscene.get("lines", []): + add(line.get("speaker", "")) + add(line.get("text", "")) + + return ordered + + +def sync(cutscene_path: str, translations_path: str) -> None: + with open(cutscene_path, 'r', encoding='utf-8') as f: + cutscene_config = json.load(f) + + sync_translations(collect_strings(cutscene_config), translations_path) + + +if __name__ == '__main__': + if len(sys.argv) != 3: + print(f"Usage: {sys.argv[0]} ") + sys.exit(1) + + sync(sys.argv[1], sys.argv[2]) diff --git a/sync_dialogue_translations.py b/sync_dialogue_translations.py new file mode 100644 index 0000000..03fa60f --- /dev/null +++ b/sync_dialogue_translations.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +sync_dialogue_translations.py - Sync a dialogue config's strings into a translation file. + +Reads , collects every non-empty "speaker" and "text" string +from its nodes (and "text" from any node's "choices"), and appends any string not +already present as a "key" in as a new entry with an empty +"en" slot ready for a translator to fill in. New entries are always appended at +the end of the list so missing translations are easy to locate. + +Usage: + python sync_dialogue_translations.py +""" + +import json +import sys + +from translation_sync_common import sync_translations + + +def collect_strings(dialogue_config: dict) -> list[str]: + seen = set() + ordered = [] + + def add(value): + if value and value not in seen: + seen.add(value) + ordered.append(value) + + for dialogue in dialogue_config.get("dialogues", []): + for node in dialogue.get("nodes", []): + add(node.get("speaker", "")) + add(node.get("text", "")) + for choice in node.get("choices", []): + add(choice.get("text", "")) + + return ordered + + +def sync(dialogue_path: str, translations_path: str) -> None: + with open(dialogue_path, 'r', encoding='utf-8') as f: + dialogue_config = json.load(f) + + sync_translations(collect_strings(dialogue_config), translations_path) + + +if __name__ == '__main__': + if len(sys.argv) != 3: + print(f"Usage: {sys.argv[0]} ") + sys.exit(1) + + sync(sys.argv[1], sys.argv[2]) diff --git a/translation_sync_common.py b/translation_sync_common.py new file mode 100644 index 0000000..afcc5d4 --- /dev/null +++ b/translation_sync_common.py @@ -0,0 +1,38 @@ +""" +translation_sync_common.py - Shared merge/write logic for the *_translations sync +scripts (sync_dialogue_translations.py, sync_cutscene_translations.py). + +Each sync script collects strings from its own JSON shape (dialogue nodes/choices, +cutscene lines, ...) and hands the ordered list of unique strings to +sync_translations(), which merges them into a translations JSON file shaped as +{"dialogue_translations": [{"key":..., "ru":..., "en":...}, ...]}. New entries are +always appended at the end so missing translations are easy to locate. +""" + +import json +import os + + +def sync_translations(strings: list[str], translations_path: str) -> None: + if os.path.isfile(translations_path): + with open(translations_path, 'r', encoding='utf-8') as f: + translations = json.load(f) + else: + translations = {} + + entries = translations.setdefault("dialogue_translations", []) + existing_keys = {entry.get("key") for entry in entries} + + added = 0 + for text in strings: + if text in existing_keys: + continue + entries.append({"key": text, "ru": text, "en": ""}) + existing_keys.add(text) + added += 1 + + os.makedirs(os.path.dirname(os.path.abspath(translations_path)), exist_ok=True) + with open(translations_path, 'w', encoding='utf-8') as f: + json.dump(translations, f, indent=4, ensure_ascii=False) + + print(f"Saved: {translations_path} ({added} new key(s) added, {len(entries)} total)")