Remade JSON translation format

This commit is contained in:
Eric Kotato 2019-10-07 22:46:34 +03:00
parent e5e258134b
commit 29b8495d6d
2 changed files with 63 additions and 86 deletions

View file

@ -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"
}
]
{
"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"
}

View file

@ -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;
}
}