1 #pragma once 2 #include "CVariant.h" 3 class StrTable 4 { 5 public: 6 StrTable(); 7 ~StrTable(); 8 9 static const wstring error_str; // 键不存在时会返回此字符串常引用 10 11 struct LanguageInfo 12 { 13 wstring file_name; // ini文件名(与theApp.m_local_dir + L"language\\"拼接得到路径) 14 wstring display_name; // 在语言设置下拉菜单显示的字符串 15 wstring bcp_47; // BCP-47代码 16 wstring default_font_name; // 默认字体 17 vector<wstring> translator; 18 }; 19 public: 20 // 初始化string table,同时也负责处理语言相关设置 21 // 第二个参数传入语言设置引用,如果没有找到匹配的ini会被清空(恢复到“跟随系统”) 22 bool Init(const wstring& language_dir, wstring& language_tag_setting); 23 24 // 载入翻译字符串 25 const wstring& LoadText(const wstring& key) const; 26 // 载入翻译字符串,并将字符串中形如<%序号%>的字符串替换成可变参数列表中的参数 27 wstring LoadTextFormat(const wstring& key, const std::initializer_list<CVariant>& paras) const; 28 // 载入翻译字符串(菜单文本) 29 const wstring& LoadMenuText(const wstring& menu_name, const wstring& key) const; 30 // 获取scintilla使用的string table 31 const std::map<wstring, wstring>& GetScintillaStrMap() const; 32 33 // 获取默认字体名称 GetDefaultFontName()34 const wstring& GetDefaultFontName() const { return m_default_font_name; }; 35 // 获取CCommon::SetThreadLanguageList参数(无匹配语言时为空,对api来说表示重置线程语言设置) GetLanguageTag()36 const vector<wstring>& GetLanguageTag() const { return m_language_tag; }; 37 // 获取ini列表(即使完全没有ini时也会含有en-US) GetLanguageList()38 const vector<StrTable::LanguageInfo>& GetLanguageList() const { return m_language_list; }; 39 // 当前语言是否为简体中文(选择默认更新源以及更新信息语言) IsSimplifiedChinese()40 bool IsSimplifiedChinese() const { return !m_language_tag.empty() && m_language_tag.front() == L"zh-CN"; }; 41 42 // 这里记录的不一定完全,只能发现此次运行中执行到的代码发生的错误 GetUnKnownKey()43 const std::set<wstring>& GetUnKnownKey() const { return m_unknown_key; }; GetErrorParaKey()44 const std::set<wstring>& GetErrorParaKey() const { return m_error_para_key; }; 45 46 private: 47 std::atomic<bool> initialized; 48 wstring m_default_font_name; // 存储默认字体名 49 vector<wstring> m_language_tag; // 存储CCommon::SetThreadLanguageList使用的参数 50 vector<LanguageInfo> m_language_list; // 下拉菜单需要vector的索引访问所以不使用map 51 map<wstring, wstring> m_text_string_table; // 初始化之后保持只读(对外提供静态引用),不需要锁保护 52 map<wstring, map<wstring, wstring>> m_menu_string_table; 53 map<wstring, wstring> m_scintilla_string_table; 54 // 记录程序运行中的错误,程序退出时写入日志 55 mutable std::mutex error_mutex; // 存储错误的set不是只读的,写入需要使用锁保护 56 mutable std::set<std::wstring> m_unknown_key; 57 mutable std::set<std::wstring> m_error_para_key; 58 }; 59 60