C++ 項目中的多語言字符串管理方案(支持自動提示與動態加載)

💬 C++ 項目中的多語言字符串管理方案(支持自動提示與動態加載)

在中大型 C++ 應用中,我們常常會面臨界面提示文本繁多、需要支持多語言切換的問題。為了解決字符串管理混亂、缺乏自動提示、難以維護等問題,本文將提供一種 高效、類型安全、支持 IDE 自動補全可動態加載 JSON 翻譯文件 的方案。


? 常見做法與問題

? 寫死字符串(不可維護)

std::wcout << L"選擇文件" << std::endl;
  • 🚫 不可復用,無法統一管理
  • 🚫 不支持多語言
  • 🚫 拼寫易錯,難以查找

? 字符串字典(無自動提示)

UIStrings::Get("ChooseFile");
  • ? 支持動態語言切換
  • 🚫 Key 是字符串,IDE 無法補全、編譯器無法校驗
  • 🚫 Key 拼寫錯誤只能運行時報錯

? 推薦方案:枚舉 UIKey + 字符串映射 + JSON 多語言加載

這種方式結合了 靜態類型的安全性動態加載的靈活性,核心點如下:

📌 UIKey 枚舉:自動提示 + 編譯期檢查

enum class UIKey {ChooseFile,SupportedFiles,SaveSuccess,// ...
};

📌 UIStrings 類:統一訪問接口

class UIStrings {
public:static bool LoadLanguage(const std::string& lang);        // 加載 JSON 文件static const std::wstring& Get(UIKey key);                // 獲取翻譯文本
};

使用示例:

UIStrings::LoadLanguage("zh");
std::wcout << UIStrings::Get(UIKey::ChooseFile);

? UIKey::ChooseFile 支持 IDE 自動補全
? 拼錯時編譯器報錯


📁 JSON 多語言翻譯文件格式(如 locales/zh.json

{"ChooseFile": "選擇文件","SupportedFiles": "僅支持 PNG, JPG, JPEG, PDF 文件","SaveSuccess": "保存成功"
}

🛠 自動生成 UIKey.hUIKeyToString()(Python 腳本)

為了避免手動同步 JSON 和 C++ 枚舉,我們提供一個自動生成腳本:

generate_keys.py

import json, sysjson_path = sys.argv[1]
output_dir = sys.argv[2]with open(json_path, encoding="utf-8") as f:keys = json.load(f).keys()with open(f"{output_dir}/UIKey.h", "w", encoding="utf-8") as h:h.write("#pragma once\n\nenum class UIKey {\n")for k in keys:h.write(f"    {k},\n")h.write("};\n")with open(f"{output_dir}/UIStrings_KeyMap.cpp", "w", encoding="utf-8") as cpp:cpp.write('#include "UIKey.h"\n#include <string>\n\n')cpp.write("std::string UIKeyToString(UIKey key) {\n    switch (key) {\n")for k in keys:cpp.write(f'        case UIKey::{k}: return "{k}";\n')cpp.write('        default: return "";\n    }\n}\n')

? CMake 集成自動生成步驟

CMakeLists.txt 中加入如下配置,構建時自動生成頭文件和映射函數:

find_package(Python3 REQUIRED)set(LOCALE_JSON ${CMAKE_SOURCE_DIR}/locales/zh.json)
set(GENERATE_SCRIPT ${CMAKE_SOURCE_DIR}/generate_keys.py)
set(GENERATED_DIR ${CMAKE_BINARY_DIR}/generated)add_custom_command(OUTPUT ${GENERATED_DIR}/UIKey.h ${GENERATED_DIR}/UIStrings_KeyMap.cppCOMMAND ${Python3_EXECUTABLE} ${GENERATE_SCRIPT} ${LOCALE_JSON} ${GENERATED_DIR}DEPENDS ${LOCALE_JSON} ${GENERATE_SCRIPT}
)add_custom_target(generate_keys ALLDEPENDS ${GENERATED_DIR}/UIKey.h ${GENERATED_DIR}/UIStrings_KeyMap.cpp
)include_directories(${GENERATED_DIR})add_executable(MyAppsrc/main.cppsrc/UIStrings.cpp${GENERATED_DIR}/UIKey.h${GENERATED_DIR}/UIStrings_KeyMap.cpp
)add_dependencies(MyApp generate_keys)

🧠 優勢總結

特性說明
? 自動提示使用 UIKey::XXX 支持 IDE 補全
? 編譯期檢查Key 拼錯編譯時報錯
? JSON 動態加載支持多語言切換,無需重新編譯
? 自動生成腳本支持無需手動維護 Key 列表
? 易于維護和團隊協作清晰的結構,適合多人開發

🧩 示例調用

std::wcout << UIStrings::Get(UIKey::ChooseFile);  // 輸出:選擇文件

📌 小結

這種方式可以在不犧牲類型安全與開發體驗的前提下實現靈活的多語言支持,是 C++ 項目中管理 UI 字符串的推薦方式。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/79161.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79161.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/79161.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數控滑臺:將制造業推向智能化的關鍵裝備

隨著制造業的不斷發展和智能化進程的加速推進&#xff0c;數控滑臺作為一種關鍵的裝備&#xff0c;在各種工業生產中發揮著越來越重要的作用。數控滑臺不僅提高了生產效率&#xff0c;節約了人力物力資源&#xff0c;還大大降低了生產過程中的錯誤率&#xff0c;保障了產品的質…

【STM32】定時器輸入捕獲

STM32 定時器輸入捕獲功能筆記 一、什么是輸入捕獲&#xff08;Input Capture&#xff09; 輸入捕獲是利用定時器的輸入通道&#xff0c;在檢測到信號電平變化&#xff08;如上升沿或下降沿&#xff09;時&#xff0c;立即將當前計數器的值捕獲并保存到捕獲寄存器&#xff08…

Qt通過QXlsx庫文件寫入到excl文件,讀取excl文件

第一&#xff1a;下載QXlsx庫文件 https://download.csdn.net/download/qq_32663053/90739425 第二&#xff1a;在Qt項目中引入QXlsx庫&#xff0c;需要把QXlsx庫文件放在項目文件夾下 第三&#xff1a;將tableview中的數據存入到excl文件 代碼&#xff1a; void MainWindow…

【KWDB 創作者計劃】一款面向 AIoT 的多模數據庫實戰體驗

一、KWDB&#xff1a;AIoT 時代的數據庫新選擇 KWDB 是由開放原子開源基金會孵化的分布式多模數據庫&#xff0c;專為物聯網、工業互聯網等場景設計。其核心價值在于時序與關系數據融合處理能力&#xff1a; ?多模統一引擎?&#xff1a;單個實例可同時建立時序庫&#xff08…

【教學類-102-22】蝴蝶彩色1——通義萬相“彩色蝴蝶”透明切邊基礎圖片制作(五款板式、批量下載、修圖、透明、切邊)

一、下載圖片 關鍵詞&#xff1a;卡通簡筆畫&#xff0c;白色背景&#xff0c;黑白輪廓線&#xff0c;、鮮艷&#xff0c;彩色&#xff0c;一只蝴蝶&#xff0c;簡單&#xff0c;可愛&#xff0c;矢量圖&#xff0c;大。 簡筆畫 強度1 4:3(長方形適配A4紙&#xff09; 五…

【JAVA】方法定義與重載:JVM方法調用機制(8)

核心知識點詳細解釋 Java方法的定義和使用 在Java中&#xff0c;方法是一段具有特定功能的代碼塊&#xff0c;它可以接受參數并返回一個值。方法的定義包括方法的修飾符、返回類型、方法名、參數列表和方法體。其基本語法如下&#xff1a; 修飾符 返回類型 方法名(參數列表)…

基于STM32的帶恒溫系統智能外賣柜設計

標題:基于STM32的帶恒溫系統智能外賣柜設計 內容:1.摘要 隨著外賣行業的迅速發展&#xff0c;對外賣存放設備的智能化和功能性要求日益提高。本設計的目的是開發一種基于STM32的帶恒溫系統智能外賣柜。方法上&#xff0c;以STM32微控制器為核心&#xff0c;結合溫度傳感器、加…

【綜述】相位解包裹算法對比分析

引言 相位解包裹是基于干涉的位相測量技術中的重要環節&#xff0c;如合成孔徑雷達干涉、光學干涉測量技術、醫學成像技術、數字全息三維成像、相干衍射成像等技術中都涉及位相解包裹。位相解包裹也稱為位相展開、位相解截斷、位相解纏繞等。與之相反的過程謂之包裹位相、截斷…

Rust 學習筆記:關于枚舉與模式匹配的練習題

Rust 學習筆記&#xff1a;關于枚舉與模式匹配的練習題 Rust 學習筆記&#xff1a;關于枚舉與模式匹配的練習題以下程序能否通過編譯&#xff1f;若能&#xff0c;輸出是什么&#xff1f;考慮這兩種表示結果類型的方式&#xff0c;若計算成功&#xff0c;則包含值 T&#xff1b…

C++負載均衡遠程調用學習之QPS性能測試

目錄 1.昨日回顧 2.QPS_TEST_PROTOBUF協議的集成 3.QPS_TEST_SERVER端實現 4.QPS_TEST_QPS簡單介紹 5.QPS_TEST_QPS客戶端工具編寫和性能測試 1.昨日回顧 2.QPS_TEST_PROTOBUF協議的集成 ## 14) Reactor框架QPS性能測試 ? 接下來我們寫一個測試用例來測一下我們…

【MySQL數據庫】視圖

1&#xff0c;視圖的基本介紹 視圖是一個虛擬表&#xff0c;其內容由查詢定義。與真實表一樣的是&#xff0c;視圖包含帶有名稱的列和行數據&#xff1b;與真實表不一樣的是&#xff0c;視圖本身并不在數據庫中存儲數據。視圖的數據變化會影響到基表&#xff0c;基表的數據變化…

Linux系統安裝方式+適合初學者的發行版本

Linux系統安裝方式適合初學者發行版—目錄 一、Linux系統的安裝方式1. 物理機直接安裝2. 虛擬機安裝3. 雙系統安裝4. Live USB試用5. 云服務器安裝 二、適合初學者的Linux發行版1. Ubuntu2. Linux Mint3. Zorin OS4. Pop!_OS5. Elementary OS6. Fedora7. Manjaro 三、選擇建議場…

Linux C++ JNI封裝、打包成jar包供Java調用詳細介紹

在前面 Android專欄 中詳細介紹了如何在Android Studio中調用通過jni封裝的c庫。 在Android使用 opencv c代碼&#xff0c;需要準備opencv4android&#xff0c;也就是c的任何代碼&#xff0c;是使用Android NDK編譯的&#xff0c;相當于在windows/mac上使用Android stdido交叉…

4.1 模塊概述

1.Python結構 工程 > 包 > 模塊 Python工程: “Python項目中最大的文件夾(本質就是一個文件夾)” --- 左側的 CODE文件夾 為Python工程 Python包: 本質就是一個文件夾,但是python包中具備具體的標識,如果沒有標識則不能導入 --- 左側的 01.Python基礎 文件夾為python包 P…

AJAX 實例

AJAX 實例 引言 Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;是一種在無需重新加載整個頁面的情況下&#xff0c;與服務器交換數據并更新部分網頁的技術。Ajax通過在后臺與服務器交換數據&#xff0c;實現了頁面的動態更新&#xff0c;從而提高了用戶體驗和…

相機的基礎架構

&#x1f4f7; 相機相關基礎架構學習路徑 一、了解手機相機系統架構 Android Camera HAL&#xff08;如果你是做 Android 平臺&#xff09; 學習 Camera HAL3 架構&#xff08;基于 camera_device_t, camera3_device_ops 接口&#xff09; 熟悉 CameraService → CameraProvid…

MLX Chat - 基于 Streamlit 的 MLX 前端界面

本文翻譯整理自&#xff1a;https://github.com/da-z/mlx-ui 一、關于 MLX Chat 一個基于 Streamlit 的簡單 UI/網頁前端&#xff0c;用于 MLX mlx-lm 項目。 相關鏈接資源 github : https://github.com/da-z/mlx-uiMLX 社區模型庫&#xff1a;https://huggingface.co/mlx-co…

el-table 自定義列、自定義數據

一、對象數組格式自定義拆分為N列 1-1、數據格式&#xff1a; const arrayList ref([{"RACK_NO": "A-1-001"},{"RACK_NO": "A-1-002"},{ "RACK_NO": "A-1-003"},//省略多個{"RACK_NO": "A-1-100…

JVM 如何使用性能分析工具定位代碼中的性能問題?

核心思想&#xff1a; 通過工具觀察程序在特定負載下的運行狀態&#xff0c;識別消耗資源最多的代碼段&#xff08;熱點代碼&#xff09;、異常的內存分配模式或線程阻塞情況&#xff0c;然后針對性的優化代碼。 通用步驟&#xff1a; 確定問題&#xff1a; 首先明確遇到了什…

Python虛假新聞檢測識別

程序示例精選 Python虛假新聞檢測識別 如需安裝運行環境或遠程調試&#xff0c;見文章底部個人QQ名片&#xff0c;由專業技術人員遠程協助&#xff01; 前言 這篇博客針對《Python虛假新聞檢測識別》編寫代碼&#xff0c;代碼整潔&#xff0c;規則&#xff0c;易讀。 學習與應…