#pragma once #include #include #include #include #include #include #include #include #include #include #include #include #define translationLRUCacheCapacity 3000 using json = nlohmann::json; #ifndef EUI_SERVICE_API # if defined(EUI_SERVICE_LIBRARY) # define EUI_SERVICE_API Q_DECL_EXPORT # else # define EUI_SERVICE_API Q_DECL_IMPORT # endif #endif class EUI_SERVICE_API translationLRUCache { public: explicit translationLRUCache(int capacity); bool contains(const std::string& key, std::string& value); void put(const std::string& key, const std::string& value); bool remove(const std::string& key); int size(); int capacity(); bool isEmpty(); void clear(); private: using EntryList = std::list>; QMutex mutex; int maxCapacity; // 标准 LRU 结构:链表头部为最近使用项,哈希表提供 O(1) 查找 EntryList entries; std::unordered_map index; }; class Translation : public eui_frameworkSdk::ITranslation { public: Translation(); private: translationLRUCache translatedCache{ translationLRUCacheCapacity }; std::vector sections; std::vector, std::less<>>> basicTranslations; std::string currentLanguage = "zh-CN"; std::string translationFilePath_; mutable QMutex mutex; Translation(const Translation&) = delete; Translation& operator=(const Translation&) = delete; public: EUI_SERVICE_API bool loadFromFile(const std::string& filePath); EUI_SERVICE_API bool loadFromString(const std::string& jsonString); EUI_SERVICE_API bool loadFromJson(const json& j); EUI_SERVICE_API bool setLanguage(const std::string& lang) override; EUI_SERVICE_API std::string getCurrentLanguage() const override; EUI_SERVICE_API std::string translate(const std::string& key) override; EUI_SERVICE_API std::string translate(const std::string& key, const std::string& lang) override; EUI_SERVICE_API std::vector> getAllTranslateResult(const std::string& key); EUI_SERVICE_API void addSection(const std::string& lang); // 返回副本:返回引用会在 addSection 触发扩容时悬空 EUI_SERVICE_API std::vector getSections() const override; EUI_SERVICE_API bool hasTranslation(const std::string& key) const; EUI_SERVICE_API std::vector getAllKeys(); EUI_SERVICE_API bool saveToFile(const std::string& filePath); private: json originalJson; bool parseJson_unsafe(const json& j); void syncJson_unsafe(); std::string translate_unsafe(const std::string& key); std::string translate_unsafe(const std::string& key, const std::string& lang); bool addSection_unsafe(const std::string& lang); }; EUI_SERVICE_API Translation& appTranslation(); EUI_SERVICE_API eui_frameworkSdk::ITranslation& appTranslationService(); #define TR(key) QString::fromStdString(appTranslation().translate(key))