我们正在努力本地化我们的应用程序,现在已经把所有的硬编码string固定到LoadString()等等。
我已经快速浏览了这个课程,但是想知道是否有人使用过其他好的包装材料。
一些要求/很好拥有:
编辑更多的信息 – 硬编码的string都在整个代码。 有时他们被编译器转换为CString,有时转换为std :: string,有时候只是普通的旧char *。
我们希望最小化对代码库(250k +代码行)的更改 – 而且对于所有string被用作不同types的地方都不会太多。
因此类/方法必须做多个职责,如wchar,CString,std :: string等…
我认为一个班级对此是过度的。 我使用这个:
inline const wchar_t * LoadResourceString(UINT resourceId) { wchar_t * buff; int requiredLen = LoadStringW( GetmoduleeHandle(0), // Replace this with your HINSTANCE if // using a resource DLL of course :) resourceId, reinterpret_cast<LPWSTR>(&buff), 0); if (requiredLen == 0) { THROW_LAST_WINDOWS_ERROR(); } return buff; }
编辑:当然,如果你打算在资源DLL中使用这个,你需要把HINSTANCE
放在某个地方。 这假设资源字符串被作为一个单一的二进制文件的一部分。
以下是我使用的:
extern HINSTANCE GetResourceInstance(); //Define elsewhere, or use a global hInst template<int N> class LoadStringRes { TCHAR tszString[N+1]; public: LoadStringRes(int ID) { ::LoadString(GetResourceInstance(), ID, tszString, sizeof(tszString)/sizeof(tszString[0])); } operator const TCHAR*() const { return tszString; } };
如此使用:
MyFunctionThatNeedsAString(LoadStringRes<100>(IDS_HELLO));
它看起来像一个函数调用,但它确实是一个对象的构建/使用/销毁/使用。
缺点是你必须知道弦乐的弹跳长度。 这是自动/堆栈内存分配的价格。
看看wxWidgets 。 它会增加你的可分配的设置文件,但它是非常强大的,并提供了很多的功能(除了你正在寻求的)以一个非常优雅和有效的方式(是的,它是免费的和免版税的)。