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水解1 分钟前
Java 中间件:Dubbo 服务降级(Mock 机制)
java·后端
FansUnion2 分钟前
我如何用 Next.js + Supabase + Cloudflare R2 搭建壁纸销售平台——月成本接近 $0
javascript
喝水的长颈鹿3 分钟前
【大白话前端 03】Web 标准与最佳实践
前端
爱泡脚的鸡腿5 分钟前
Node.js 拓展
前端·后端
左夕1 小时前
分不清apply,bind,call?看这篇文章就够了
前端·javascript
Zha0Zhun2 小时前
一个使用ViewBinding封装的Dialog
前端
兆子龙2 小时前
从微信小程序 data-id 到 React 列表性能优化:少用闭包,多用 data-*
前端
滕青山2 小时前
文本行过滤/筛选 在线工具核心JS实现
前端·javascript·vue.js
时光不负努力2 小时前
编程常用模式集合
前端·javascript·typescript
大雨还洅下2 小时前
前端JS: 跨域解决
javascript