手头的项目需要国际化,一种常用的实现方式是搞两个语言文件,KEY-VALUE形式。Ini文件是常用的key-value实现。
比如 chinese_file.ini ID_LOGIN_SUCCESS = 成功
english_file.ini ID_LOGIN_SUCCESS= success
程序启动时,使用其中的某种文件,并加载到hashmap中。程序使用到多语言的地方使用GetTrueText(KEY) 。
这样无论哪国的语言,程序里面只有看到的key。
目前,程序里面都是中文写死的,第一步就是找到中文写死的地方,这个人工去找的话,肯定是崩溃了。因此写了个小程序。
#include <fstream> #include <string> #include <iostream> #include <assert.h> #include <windows.h> using namespace std; std::string outpath; bool HasChineseInFile(const std::string& filepath) { //不能读自己,否则有死循环 if (filepath.find(outpath)!=string::npos) { return true; } bool bRet = false; ifstream in(filepath.c_str(), ios::in); ofstream out(outpath.c_str(), ios::out | ios::app); assert(out); std::string buff; if (in && in.is_open()) { int line = 0; while (getline(in, buff)) { for (size_t u = 0; u < buff.length();u++) { if (buff[u] & 0x80) { out << filepath << ":" << line << endl; bRet = true; break; } } ++line; } } in.close(); out.close(); return bRet; } bool IsDirectory(const std::string& pstrPath) { DWORD dw = GetFileAttributesA(pstrPath.c_str()); if (dw == INVALID_FILE_ATTRIBUTES) { return false; } return (dw & FILE_ATTRIBUTE_DIRECTORY) != 0; } bool RecursiveFind(const std::string& pstrFolder) { /*检查输入目录是否是合法目录*/ if (!IsDirectory(pstrFolder)) { return false; } std::string strFind = pstrFolder; if (*strFind.rbegin() != '\\' && *strFind.rbegin() != '/') { strFind.append("\\"); } strFind.append("*.*"); /*打开文件查找,查看源目录中是否存在匹配的文件*/ /*调用FindFile后,必须调用FindNextFile才能获得查找文件的信息*/ WIN32_FIND_DATAA wfd; HANDLE hFind = FindFirstFileA(strFind.c_str(), &wfd); if (hFind == INVALID_HANDLE_VALUE) { return false; } do { std::string strSubFolder; if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if (wfd.cFileName[0] == L'.') { continue; } else { strSubFolder = strFind.substr(0, strFind.length() - 3) + wfd.cFileName; RecursiveFind(strSubFolder); } } else { strSubFolder = strFind.substr(0, strFind.length() - 3) + wfd.cFileName; HasChineseInFile(strSubFolder.c_str()); } } while (FindNextFileA(hFind, &wfd)); FindClose(hFind); return true; } //支持命令行加入参数,1、输入路径、2、输出路径 int _tmain(int argc, char *argv[]) { std::string inpath; if (argc>1) { inpath = argv[1]; } if (argc>2) { outpath = argv[2]; } while (inpath.empty()) { cout << "请输入查找的目录或者文件" << endl; cin >> inpath; if (GetFileAttributesA(inpath.c_str()) == INVALID_FILE_ATTRIBUTES) { cout << "文件的路径有误" << endl; inpath.clear(); } } while (outpath.empty()) { cout << "请输入输出结果的文件" << endl; cin >> outpath; ofstream out(outpath); if (!out) { cout << "文件的路径有误" << endl; outpath.clear(); } out.close(); } //这里有遍历目录的概念 if (IsDirectory(inpath)) { RecursiveFind(inpath); } else { HasChineseInFile(inpath); } return 0; }