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): 欢迎使用该应用

相关推荐
向哆哆几秒前
Java与NoSQL数据库的集成与优化
java·开发语言·nosql
茂茂在长安3 分钟前
Linux 命令大全完整版(11)
java·linux·运维·服务器·前端·centos
songbaoxian15 分钟前
ElasticSearch
java·linux·elasticsearch
非 白30 分钟前
【Java】代理模式
java·开发语言·代理模式
知识分享小能手36 分钟前
Html5学习教程,从入门到精通,HTML5 简介语法知识点及案例代码(1)
开发语言·前端·javascript·学习·前端框架·html·html5
IT、木易39 分钟前
大白话React第二章深入理解阶段
前端·javascript·react.js
Good Note40 分钟前
Golang的静态强类型、编译型、并发型
java·数据库·redis·后端·mysql·面试·golang
晚安72044 分钟前
Ajax相关
前端·javascript·ajax
图书馆钉子户1 小时前
怎么使用ajax实现局部刷新
前端·ajax·okhttp
bin91531 小时前
DeepSeek 助力 Vue 开发:打造丝滑的单选按钮(Radio Button)
前端·javascript·vue.js·ecmascript·deepseek