You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不依赖外部库的情况下为C++程序添加双语言切换支持?

无外部库实现C++双语言切换最简方案

实现思路

双语言场景下不需要复杂的i18n框架,仅通过枚举定义所有UI字符串的唯一标识,配合数组存储两种语言的对应文本,运行时根据用户选择的语言索引读取对应文本即可,全程只使用C++标准库,无额外依赖。

具体实现步骤

1. 定义语言类型和字符串ID枚举

// 语言类型枚举
enum class Lang {
    ZH_CN, // 简体中文
    EN_US, // 英文
    COUNT  // 标记语言总数,用于定义数组长度
};

// 所有需要展示的UI字符串ID枚举,所有文本都要先在这里定义
enum class StrId {
    GREETING,
    EXIT_PROMPT,
    LANG_SELECT_SUCCESS,
    // 新增字符串在这里加ID
    COUNT // 标记字符串总数,用于定义数组长度
};

2. 预定义多语言字符串映射表

用二维数组存储所有语言的所有字符串内容,枚举值天然是连续整数,直接作为数组下标使用,性能极高:

#include <array>
#include <string_view>

// 第一维是语言索引,第二维是字符串ID索引
constexpr std::array<std::array<std::string_view, static_cast<size_t>(StrId::COUNT)>, static_cast<size_t>(Lang::COUNT)> g_strTable = {{
    // 简体中文文本组,顺序和StrId定义顺序完全对应
    {
        "欢迎使用程序",
        "确定要退出吗?",
        "语言选择成功"
    },
    // 英文文本组,顺序和StrId定义顺序完全对应
    {
        "Welcome to the program",
        "Are you sure to exit?",
        "Language selected successfully"
    }
}};

注:如果使用C++17以下版本,把std::string_view替换为const char*即可兼容。

3. 封装字符串获取工具

// 全局存储当前选中的语言,默认可以设为任意一种
Lang g_currentLang = Lang::ZH_CN;

// 所有UI显示文本统一调用这个函数获取
std::string_view getStr(StrId id) {
    return g_strTable[static_cast<size_t>(g_currentLang)][static_cast<size_t>(id)];
}

4. 启动时加入用户语言选择逻辑

#include <iostream>

int main() {
    // 启动首先提示语言选择,该提示直接写死双语言即可
    std::cout << "请选择语言 / Please select language:\n1 - 简体中文\n2 - English\n";
    
    int select;
    std::cin >> select;
    g_currentLang = (select == 2) ? Lang::EN_US : Lang::ZH_CN;
    std::cout << getStr(StrId::LANG_SELECT_SUCCESS) << "\n";

    // 后续所有展示文本的逻辑统一用getStr获取
    std::cout << getStr(StrId::GREETING) << "\n";
    std::cout << getStr(StrId::EXIT_PROMPT) << "\n";

    return 0;
}

方案优势

  • 零外部依赖,全程使用C++标准库实现,兼容性极强
  • 逻辑简单易维护,新增字符串只需要在StrId加枚举值,再给两个语言的文本组补对应内容即可
  • 性能极高,仅为数组下标取值操作,无额外运行开销
  • 编译期即可检查是否漏写对应字符串,避免运行时缺字问题

注意事项

  • 中文乱码问题:Windows控制台默认编码为GBK,需要保证源码编码和控制台编码匹配,或者主动设置控制台编码为UTF-8即可解决
  • 动态拼接文本:如果需要插入变量,可在字符串里加占位符,取出文本后用std::format(C++20)或者snprintf做参数拼接即可
  • 后续拓展多语言:只需要在Lang枚举加新语言类型,再给g_strTable加一组对应语言的文本数组即可

内容的提问来源于stack exchange,提问作者ellefgh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 23:15:04