From 29b8495d6dc3a0ef204079bd85ba6ba0c4327216 Mon Sep 17 00:00:00 2001 From: RadRussianRus Date: Mon, 7 Oct 2019 22:46:34 +0300 Subject: [PATCH] Remade JSON translation format --- Telegram/Resources/langs/rewrites/ru.json | 79 +++++---------------- Telegram/SourceFiles/lang/lang_instance.cpp | 70 +++++++++++------- 2 files changed, 63 insertions(+), 86 deletions(-) diff --git a/Telegram/Resources/langs/rewrites/ru.json b/Telegram/Resources/langs/rewrites/ru.json index 3ef121a7e..5fc425d8e 100644 --- a/Telegram/Resources/langs/rewrites/ru.json +++ b/Telegram/Resources/langs/rewrites/ru.json @@ -4,65 +4,20 @@ // Suggest any new translations or edits for existing here: // https://github.com/kotatogram/kotatogram-desktop/issues -[ - { - "key": "ktg_intro_about", - "value": "Добро пожаловать в неофициальный мессенджер\nна основе Telegram Desktop." - }, - { - "key": "ktg_about_text1", - "value": "Экспериментальный неофициальный форк {tdesktop_link}." - }, - { - "key": "ktg_about_text3", - "value": "Посетите {channel_link} или {faq_link} (англ.), чтобы узнать больше." - }, - { - "key": "ktg_about_text3_channel", - "value": "канал Kotatogram" - }, - { - "key": "ktg_copy_btn_callback", - "value": "Копировать callback-данные" - }, - { - "key": "ktg_profile_copy_id", - "value": "Копировать ID" - }, - { - "key": "ktg_profile_bot_id", - "value": "ID бота" - }, - { - "key": "ktg_profile_user_id", - "value": "ID пользователя" - }, - { - "key": "ktg_profile_group_id", - "value": "ID группы" - }, - { - "key": "ktg_profile_supergroup_id", - "value": "ID супергруппы" - }, - { - "key": "ktg_profile_channel_id", - "value": "ID канала" - }, - { - "key": "ktg_pinned_message_show", - "value": "Показать закреплённое сообщение" - }, - { - "key": "ktg_pinned_message_hide", - "value": "Скрыть закреплённое сообщение" - }, - { - "key": "ktg_settings_show_json_settings", - "value": "Показать файл настроек" - }, - { - "key": "ktg_settings_restart", - "value": "Перезапустить Kotatogram" - } -] \ No newline at end of file +{ + "ktg_intro_about": "Добро пожаловать в неофициальный мессенджер\nна основе Telegram Desktop.", + "ktg_about_text1": "Экспериментальный неофициальный форк {tdesktop_link}.", + "ktg_about_text3": "Посетите {channel_link} или {faq_link} (англ.), чтобы узнать больше.", + "ktg_about_text3_channel": "канал Kotatogram", + "ktg_copy_btn_callback": "Копировать callback-данные", + "ktg_profile_copy_id": "Копировать ID", + "ktg_profile_bot_id": "ID бота", + "ktg_profile_user_id": "ID пользователя", + "ktg_profile_group_id": "ID группы", + "ktg_profile_supergroup_id": "ID супергруппы", + "ktg_profile_channel_id": "ID канала", + "ktg_pinned_message_show": "Показать закреплённое сообщение", + "ktg_pinned_message_hide": "Скрыть закреплённое сообщение", + "ktg_settings_show_json_settings": "Показать файл настроек", + "ktg_settings_restart": "Перезапустить Kotatogram" +} diff --git a/Telegram/SourceFiles/lang/lang_instance.cpp b/Telegram/SourceFiles/lang/lang_instance.cpp index e8767866c..4af44b4ff 100644 --- a/Telegram/SourceFiles/lang/lang_instance.cpp +++ b/Telegram/SourceFiles/lang/lang_instance.cpp @@ -565,8 +565,8 @@ QString Instance::jsonLangDir() { void Instance::fillDefaultJson() { if (!QDir().exists(jsonLangDir())) QDir().mkpath(jsonLangDir()); - const auto path = jsonLangDir() + "ru.json"; - const auto pathRaw = jsonLangDir() + "ru-raw.json"; + const auto path = jsonLangDir() + "ru.default.json"; + const auto pathRaw = jsonLangDir() + "ru-raw.default.json"; auto input = QFile(":/ktg_lang/ru.json"); auto output = QFile(path); auto outputRaw = QFile(pathRaw); @@ -587,10 +587,14 @@ void Instance::fillDefaultJson() { void Instance::fillFromJson() { if (id() != baseId()) { + const auto langDefBaseDir = jsonLangDir() + (qsl("%1.default.json").arg(baseId())); + loadFromJson(langDefBaseDir); const auto langBaseDir = jsonLangDir() + (qsl("%1.json").arg(baseId())); loadFromJson(langBaseDir); } + const auto langDefCustomDir = jsonLangDir() + (qsl("%1.default.json").arg(id())); + loadFromJson(langDefCustomDir); const auto langCustomDir = jsonLangDir() + (qsl("%1.json").arg(id())); loadFromJson(langCustomDir); @@ -617,36 +621,54 @@ void Instance::loadFromJson(const QString &filename) { ).arg(filename ).arg(error.errorString())); return; - } else if (!document.isArray()) { - LOG(("Lang Info: file %1 has failed to parse. Error: array expected" + } else if (!document.isObject()) { + LOG(("Lang Info: file %1 has failed to parse. Error: object expected" ).arg(filename)); return; } - const auto langKeys = document.array(); + const auto langKeys = document.object(); auto limit = kLangValuesLimit; - for (auto i = langKeys.constBegin(), e = langKeys.constEnd(); i != e; ++i) { - if (!(*i).isObject()) { - LOG(("Lang Info: Bad entry in file %1, object expected" - ).arg(filename)); - continue; - } - const auto entry = (*i).toObject(); - const auto key = entry.constFind(qsl("key")); - const auto value = entry.constFind(qsl("value")); - if (key == entry.constEnd() - || value == entry.constEnd() - || !(*key).isString() - || !(*value).isString()) { - LOG(("Lang Info: Bad entry in file %1, %2 expected" - ).arg(filename).arg("{\"key\": \"...\", \"value\": \"...\" }" - )); - } else { - const auto name = QByteArray().append((*key).toString()); + const auto keyList = langKeys.keys(); + + for (auto i = keyList.constBegin(), e = keyList.constEnd(); i != e; ++i) { + const auto key = *i; + const auto value = langKeys.constFind(key); + + if ((*value).isString()) { + + const auto name = QByteArray().append(key); const auto translation = QByteArray().append((*value).toString()); applyValue(name, translation); + + } else if ((*value).isObject()) { + + const auto keyPlurals = (*value).isObject() + const auto pluralList = keyPlurals.keys(); + + for (auto pli = keyList.constBegin(), ple = keyList.constEnd(); pli != ple; ++pli) { + const auto plural = *pli; + const auto pluralValue = keyPlurals.constFind(plural); + + if (!(*pluralValue).isString()) { + LOG(("Lang Info: wrong value for key %1 in %2 in file %3, string expected" + ).arg(plural).arg(key).arg(filename)); + continue; + } + + const auto name = QByteArray(key + "#" + plural); + const auto translation = QByteArray((*pluralValue).toString()); + + applyValue(name, translation); + if (--limit <= 0) { + break; + } + } + } else { + LOG(("Lang Info: wrong value for key %1 in file %2, string or object expected" + ).arg(key).arg(filename)); } - if (!--limit) { + if (--limit <= 0) { break; } }