XML 版本的 ControlManager 实现

<languages>

<language id="en">

<text key="greeting">Hello</text>

<text key="farewell">Goodbye</text>

<text key="welcome">Welcome to the application</text>

</language>

<language id="zh">

<text key="greeting">你好</text>

<text key="farewell">再见</text>

<text key="welcome">欢迎使用该应用</text>

</language>

</languages>

#include <tinyxml2.h>

#include <string>

#include <unordered_map>

#include <iostream>

class XmlControlManager : public ControlManager {

private:

std::unordered_map<std::string, std::unordered_map<std::string, std::string>> languageData; // 存储语言数据

std::string currentLanguage; // 当前语言

public:

// 加载语言包

bool loadLanguagePack(const std::string& filePath) override {

tinyxml2::XMLDocument doc;

if (doc.LoadFile(filePath.c_str()) != tinyxml2::XML_SUCCESS) {

std::cerr << "Failed to load XML file: " << filePath << std::endl;

return false;

}

tinyxml2::XMLElement* root = doc.FirstChildElement("languages");

if (!root) {

std::cerr << "Invalid XML format: Missing <languages> root element" << std::endl;

return false;

}

// 遍历所有 <language> 元素

tinyxml2::XMLElement* languageElement = root->FirstChildElement("language");

while (languageElement) {

const char* langId = languageElement->Attribute("id");

if (!langId) {

std::cerr << "Invalid XML format: Missing language id attribute" << std::endl;

languageElement = languageElement->NextSiblingElement("language");

continue;

}

std::string lang = langId;

languageDatalang = {}; // 初始化语言数据

// 遍历 <text> 元素

tinyxml2::XMLElement* textElement = languageElement->FirstChildElement("text");

while (textElement) {

const char* key = textElement->Attribute("key");

const char* value = textElement->GetText();

if (key && value) {

languageDatalangkey = value;

}

textElement = textElement->NextSiblingElement("text");

}

languageElement = languageElement->NextSiblingElement("language");

}

return true;

}

// 切换语言

void setLanguage(const std::string& language) override {

if (languageData.find(language) != languageData.end()) {

currentLanguage = language;

} else {

std::cerr << "Language not found: " << language << std::endl;

}

}

// 获取文本内容

std::string getText(const std::string& key) const override {

auto langIt = languageData.find(currentLanguage);

if (langIt != languageData.end()) {

auto textIt = langIt->second.find(key);

if (textIt != langIt->second.end()) {

return textIt->second;

}

}

return "Missing Text";

}

// 检查键是否存在

bool hasKey(const std::string& key) const override {

auto langIt = languageData.find(currentLanguage);

if (langIt != languageData.end()) {

return langIt->second.find(key) != langIt->second.end();

}

return false;

}

};

Greeting (en): Hello

Farewell (en): Goodbye

Greeting (zh): 你好

Farewell (zh): 再见

Welcome (zh): 欢迎使用该应用

相关推荐
伍一5112 分钟前
hiprint-spring-boot打印组件介绍
java·hiprint
Wang's Blog5 小时前
Java 接入Redis: 服务启动停止与后台运行配置
java·服务器·redis
此时不提桶,更待何时6 小时前
01-04-B-垃圾回收面试与生产事故实战
java·jvm·面试
GreenTea6 小时前
GrokBot 核心成员 Lauren Tan:每月交付 2000 个 PR 的人,是怎么用 AI 的
前端·后端·架构
mCell7 小时前
用 Knip 清理 AI Coding 留下的冗余代码
前端·ai编程·前端工程化
鹿角片ljp8 小时前
KV Cache 解析
java·算法
captain3768 小时前
网络原理(9)-数据链路层
java·网络协议·java-ee
笃行3508 小时前
使用Rokid AIUI做了一个童年推箱子游戏
前端
惊讶的猫8 小时前
意图识别置信度和检索重排的分数
java