Remade JSON translation format
This commit is contained in:
parent
e5e258134b
commit
29b8495d6d
2 changed files with 63 additions and 86 deletions
|
|
@ -4,65 +4,20 @@
|
||||||
// Suggest any new translations or edits for existing here:
|
// Suggest any new translations or edits for existing here:
|
||||||
// https://github.com/kotatogram/kotatogram-desktop/issues
|
// https://github.com/kotatogram/kotatogram-desktop/issues
|
||||||
|
|
||||||
[
|
{
|
||||||
{
|
"ktg_intro_about": "Добро пожаловать в неофициальный мессенджер\nна основе Telegram Desktop.",
|
||||||
"key": "ktg_intro_about",
|
"ktg_about_text1": "Экспериментальный неофициальный форк {tdesktop_link}.",
|
||||||
"value": "Добро пожаловать в неофициальный мессенджер\nна основе Telegram Desktop."
|
"ktg_about_text3": "Посетите {channel_link} или {faq_link} (англ.), чтобы узнать больше.",
|
||||||
},
|
"ktg_about_text3_channel": "канал Kotatogram",
|
||||||
{
|
"ktg_copy_btn_callback": "Копировать callback-данные",
|
||||||
"key": "ktg_about_text1",
|
"ktg_profile_copy_id": "Копировать ID",
|
||||||
"value": "Экспериментальный неофициальный форк {tdesktop_link}."
|
"ktg_profile_bot_id": "ID бота",
|
||||||
},
|
"ktg_profile_user_id": "ID пользователя",
|
||||||
{
|
"ktg_profile_group_id": "ID группы",
|
||||||
"key": "ktg_about_text3",
|
"ktg_profile_supergroup_id": "ID супергруппы",
|
||||||
"value": "Посетите {channel_link} или {faq_link} (англ.), чтобы узнать больше."
|
"ktg_profile_channel_id": "ID канала",
|
||||||
},
|
"ktg_pinned_message_show": "Показать закреплённое сообщение",
|
||||||
{
|
"ktg_pinned_message_hide": "Скрыть закреплённое сообщение",
|
||||||
"key": "ktg_about_text3_channel",
|
"ktg_settings_show_json_settings": "Показать файл настроек",
|
||||||
"value": "канал Kotatogram"
|
"ktg_settings_restart": "Перезапустить 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"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
|
||||||
|
|
@ -565,8 +565,8 @@ QString Instance::jsonLangDir() {
|
||||||
void Instance::fillDefaultJson() {
|
void Instance::fillDefaultJson() {
|
||||||
if (!QDir().exists(jsonLangDir())) QDir().mkpath(jsonLangDir());
|
if (!QDir().exists(jsonLangDir())) QDir().mkpath(jsonLangDir());
|
||||||
|
|
||||||
const auto path = jsonLangDir() + "ru.json";
|
const auto path = jsonLangDir() + "ru.default.json";
|
||||||
const auto pathRaw = jsonLangDir() + "ru-raw.json";
|
const auto pathRaw = jsonLangDir() + "ru-raw.default.json";
|
||||||
auto input = QFile(":/ktg_lang/ru.json");
|
auto input = QFile(":/ktg_lang/ru.json");
|
||||||
auto output = QFile(path);
|
auto output = QFile(path);
|
||||||
auto outputRaw = QFile(pathRaw);
|
auto outputRaw = QFile(pathRaw);
|
||||||
|
|
@ -587,10 +587,14 @@ void Instance::fillDefaultJson() {
|
||||||
|
|
||||||
void Instance::fillFromJson() {
|
void Instance::fillFromJson() {
|
||||||
if (id() != baseId()) {
|
if (id() != baseId()) {
|
||||||
|
const auto langDefBaseDir = jsonLangDir() + (qsl("%1.default.json").arg(baseId()));
|
||||||
|
loadFromJson(langDefBaseDir);
|
||||||
const auto langBaseDir = jsonLangDir() + (qsl("%1.json").arg(baseId()));
|
const auto langBaseDir = jsonLangDir() + (qsl("%1.json").arg(baseId()));
|
||||||
loadFromJson(langBaseDir);
|
loadFromJson(langBaseDir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const auto langDefCustomDir = jsonLangDir() + (qsl("%1.default.json").arg(id()));
|
||||||
|
loadFromJson(langDefCustomDir);
|
||||||
const auto langCustomDir = jsonLangDir() + (qsl("%1.json").arg(id()));
|
const auto langCustomDir = jsonLangDir() + (qsl("%1.json").arg(id()));
|
||||||
loadFromJson(langCustomDir);
|
loadFromJson(langCustomDir);
|
||||||
|
|
||||||
|
|
@ -617,36 +621,54 @@ void Instance::loadFromJson(const QString &filename) {
|
||||||
).arg(filename
|
).arg(filename
|
||||||
).arg(error.errorString()));
|
).arg(error.errorString()));
|
||||||
return;
|
return;
|
||||||
} else if (!document.isArray()) {
|
} else if (!document.isObject()) {
|
||||||
LOG(("Lang Info: file %1 has failed to parse. Error: array expected"
|
LOG(("Lang Info: file %1 has failed to parse. Error: object expected"
|
||||||
).arg(filename));
|
).arg(filename));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const auto langKeys = document.array();
|
const auto langKeys = document.object();
|
||||||
auto limit = kLangValuesLimit;
|
auto limit = kLangValuesLimit;
|
||||||
for (auto i = langKeys.constBegin(), e = langKeys.constEnd(); i != e; ++i) {
|
const auto keyList = langKeys.keys();
|
||||||
if (!(*i).isObject()) {
|
|
||||||
LOG(("Lang Info: Bad entry in file %1, object expected"
|
for (auto i = keyList.constBegin(), e = keyList.constEnd(); i != e; ++i) {
|
||||||
).arg(filename));
|
const auto key = *i;
|
||||||
continue;
|
const auto value = langKeys.constFind(key);
|
||||||
}
|
|
||||||
const auto entry = (*i).toObject();
|
if ((*value).isString()) {
|
||||||
const auto key = entry.constFind(qsl("key"));
|
|
||||||
const auto value = entry.constFind(qsl("value"));
|
const auto name = QByteArray().append(key);
|
||||||
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 translation = QByteArray().append((*value).toString());
|
const auto translation = QByteArray().append((*value).toString());
|
||||||
|
|
||||||
applyValue(name, translation);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue