From 01fc8ea1c113e3b28d5f939d88287df8ee51713d Mon Sep 17 00:00:00 2001 From: AlexeyZavar Date: Sat, 13 Dec 2025 19:59:43 +0300 Subject: [PATCH] feat: cache localizations --- Telegram/SourceFiles/ayu/ayu_lang.cpp | 63 +++++++++++++++++++++++ Telegram/SourceFiles/ayu/ayu_lang.h | 6 +++ Telegram/SourceFiles/ayu/ayu_settings.cpp | 10 ++-- 3 files changed, 75 insertions(+), 4 deletions(-) diff --git a/Telegram/SourceFiles/ayu/ayu_lang.cpp b/Telegram/SourceFiles/ayu/ayu_lang.cpp index e9d0aad7c4..31409c6f7f 100644 --- a/Telegram/SourceFiles/ayu/ayu_lang.cpp +++ b/Telegram/SourceFiles/ayu/ayu_lang.cpp @@ -6,10 +6,14 @@ // Copyright @Radolyn, 2025 #include "ayu_lang.h" +#include +#include + #include "qjsondocument.h" #include "core/application.h" #include "core/core_settings.h" #include "lang/lang_instance.h" +#include "storage/localstorage.h" // hard-coded languages std::map langMapping = { @@ -35,14 +39,72 @@ AyuLanguage::AyuLanguage() = default; void AyuLanguage::init() { if (!instance) instance = new AyuLanguage; + instance->loadCachedLanguage(); } AyuLanguage *AyuLanguage::currentInstance() { return instance; } +QString AyuLanguage::getCacheDir() const { + return cWorkingDir() + u"tdata/ayu/languages/"_q; +} + +QString AyuLanguage::getCachePath(const QString &langId) const { + return getCacheDir() + langId + u".json"_q; +} + +void AyuLanguage::loadCachedLanguage() { + const auto langPackId = Lang::GetInstance().id(); + const auto langPackBaseId = Lang::GetInstance().baseId(); + auto finalLangPackId = langMapping.contains(langPackId) ? langMapping[langPackId] : langPackId; + + if (finalLangPackId.isEmpty()) { + finalLangPackId = langPackBaseId; + } + if (finalLangPackId.isEmpty()) { + return; + } + + const auto cachePath = getCachePath(finalLangPackId); + QFile file(cachePath); + if (!file.exists()) { + const auto basePath = getCachePath(langPackBaseId); + if (!QFile::exists(basePath)) { + return; + } + file.setFileName(basePath); + } + + if (file.open(QIODevice::ReadOnly)) { + const auto data = file.readAll(); + file.close(); + + QJsonParseError error{}; + const auto doc = QJsonDocument::fromJson(data, &error); + if (error.error == QJsonParseError::NoError) { + LOG(("Loading cached AyuGram language: %1").arg(finalLangPackId)); + applyLanguageJson(doc); + } + } +} + +void AyuLanguage::saveCachedLanguage(const QByteArray &json, const QString &langId) { + const auto cacheDir = getCacheDir(); + QDir().mkpath(cacheDir); + + const auto cachePath = getCachePath(langId); + QFile file(cachePath); + if (file.open(QIODevice::WriteOnly)) { + file.write(json); + file.close(); + LOG(("Cached AyuGram language: %1").arg(langId)); + } +} + void AyuLanguage::fetchLanguage(const QString &id, const QString &baseId) { auto finalLangPackId = langMapping.contains(id) ? langMapping[id] : id; + _currentLangId = finalLangPackId.isEmpty() ? baseId : finalLangPackId; if (Core::App().settings().proxy().isEnabled()) { const auto proxy = Core::App().settings().proxy().selected(); @@ -84,6 +146,7 @@ void AyuLanguage::fetchFinished() { QJsonParseError error{}; const auto doc = QJsonDocument::fromJson(result, &error); if (error.error == QJsonParseError::NoError) { + saveCachedLanguage(result, _currentLangId); applyLanguageJson(doc); } else { LOG(("Incorrect language JSON File.")); diff --git a/Telegram/SourceFiles/ayu/ayu_lang.h b/Telegram/SourceFiles/ayu/ayu_lang.h index d80ca2d4d0..3a9960a9c0 100644 --- a/Telegram/SourceFiles/ayu/ayu_lang.h +++ b/Telegram/SourceFiles/ayu/ayu_lang.h @@ -30,7 +30,13 @@ private: AyuLanguage(); ~AyuLanguage() override = default; + void loadCachedLanguage(); + void saveCachedLanguage(const QByteArray &json, const QString &langId); + [[nodiscard]] QString getCacheDir() const; + [[nodiscard]] QString getCachePath(const QString &langId) const; + QNetworkAccessManager networkManager; QNetworkReply *_chkReply = nullptr; bool needFallback = false; + QString _currentLangId; }; diff --git a/Telegram/SourceFiles/ayu/ayu_settings.cpp b/Telegram/SourceFiles/ayu/ayu_settings.cpp index 3c7afa705c..f217e26842 100644 --- a/Telegram/SourceFiles/ayu/ayu_settings.cpp +++ b/Telegram/SourceFiles/ayu/ayu_settings.cpp @@ -25,8 +25,6 @@ using json = nlohmann::json; namespace AyuSettings { -const std::string filename = "tdata/ayu_settings.json"; - std::optional settings = std::nullopt; rpl::variable sendReadMessagesReactive; @@ -155,8 +153,12 @@ AyuGramSettings &getInstance() { return settings.value(); } +std::string getSettingsPath() { + return (cWorkingDir() + u"tdata/ayu_settings.json"_q).toStdString(); +} + void load() { - std::ifstream file(filename); + std::ifstream file(getSettingsPath()); if (!file.good()) { return; } @@ -194,7 +196,7 @@ void save() { json p = settings.value(); std::ofstream file; - file.open(filename); + file.open(getSettingsPath()); file << p.dump(4); file.close();