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

相关推荐
小码哥_常2 小时前
一套自己部署的 IM,客户端是同一份 Flutter
前端·后端
蜗牛攻城狮4 小时前
微前端四大方案选型对比与最佳实践:qiankun、micro-app、wujie、Module Federation
前端·微前端·qiankun·前端架构·micro-app·wujie
学长毕设5 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
她说可以呀6 小时前
Vue插槽
前端·javascript·vue.js
qq_448011166 小时前
Vue + Jinja2两套模版与法冲突造成undefinedError
前端·javascript·vue.js
zzu123zsw6 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
aixingpan6 小时前
aixingpan.cn API开发文档:前端查询夏令时和时区接口指南
前端·php
2601_958352907 小时前
23.5×19mm 换掉一整条音频链?|A-68 集成了什么:ADC / DAC / 24.576MHz 时钟 / AEC / 波束降噪,主控仅需 6 根线
前端·音视频·ai降噪·回声消除·语音模块
源码集结号7 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
论文复现现场7 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算