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;

languageData[lang] = {}; // 初始化语言数据

// 遍历 <text> 元素

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

while (textElement) {

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

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

if (key && value) {

languageData[lang][key] = 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): 欢迎使用该应用

相关推荐
咸鱼2.026 分钟前
【java入门到放弃】跨域
java·开发语言
木斯佳27 分钟前
前端八股文面经大全:bilibili生态技术方向二面 (2026-03-25)·面经深度解析
前端·ai·ssd·sse·rag
indexsunny33 分钟前
互联网大厂Java求职面试实战:微服务与Spring生态全攻略
java·数据库·spring boot·安全·微服务·面试·消息队列
沐苏瑶34 分钟前
Java 搜索型数据结构全解:二叉搜索树、Map/Set 体系与哈希表
java·数据结构·算法
不会写DN38 分钟前
Gin 日志体系详解
前端·javascript·gin
冬夜戏雪1 小时前
实习面经记录(十)
java·前端·javascript
skiy1 小时前
java与mysql连接 使用mysql-connector-java连接msql
java·开发语言·mysql
平生不喜凡桃李1 小时前
浅谈 Linux 中 namespace 相关系统调用
java·linux·服务器
zb200641201 小时前
CVE-2024-38819:Spring 框架路径遍历 PoC 漏洞复现
java·后端·spring
2401_895521342 小时前
spring-ai 下载不了依赖spring-ai-openai-spring-boot-starter
java·人工智能·spring