Fix gettext on MSVC
parent
e102cbd840
commit
d302629392
|
@ -26,7 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
#include "log.h"
|
||||
|
||||
#if USE_GETTEXT && defined(_MSC_VER)
|
||||
#include <WinNls.h>
|
||||
#include <windows.h>
|
||||
#include <map>
|
||||
#include <direct.h>
|
||||
#include "filesys.h"
|
||||
|
|
|
@ -41,16 +41,19 @@ void init_gettext(const char *path, const std::string &configured_language);
|
|||
extern const wchar_t *narrow_to_wide_c(const char *mbs);
|
||||
extern std::wstring narrow_to_wide(const std::string &mbs);
|
||||
|
||||
|
||||
// You must free the returned string!
|
||||
inline const wchar_t *wgettext(const char *str)
|
||||
{
|
||||
return narrow_to_wide_c(gettext(str));
|
||||
}
|
||||
|
||||
// Gettext under MSVC needs this strange way. Just don't ask...
|
||||
inline std::wstring wstrgettext(const std::string &text)
|
||||
{
|
||||
return narrow_to_wide(gettext(text.c_str()));
|
||||
const wchar_t *tmp = wgettext(text.c_str());
|
||||
std::wstring retval = (std::wstring)tmp;
|
||||
delete[] tmp;
|
||||
return retval;
|
||||
}
|
||||
|
||||
inline std::string strgettext(const std::string &text)
|
||||
|
|
|
@ -99,11 +99,13 @@ const wchar_t *narrow_to_wide_c(const char *mbs)
|
|||
{
|
||||
wchar_t *wcs = NULL;
|
||||
#if defined(_WIN32)
|
||||
int wcl = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR) mbs, -1, NULL, 0);
|
||||
if (!wcl)
|
||||
return NULL;
|
||||
wcs = new wchar_t[wcl];
|
||||
MultiByteToWideChar(CP_UTF8, 0, (LPCSTR) mbs, -1, (WCHAR *) wcs, wcl);
|
||||
int nResult = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR) mbs, -1, 0, 0);
|
||||
if (nResult == 0) {
|
||||
errorstream << "gettext: MultiByteToWideChar returned null" << std::endl;
|
||||
} else {
|
||||
wcs = new wchar_t[nResult];
|
||||
MultiByteToWideChar(CP_UTF8, 0, (LPCSTR) mbs, -1, (WCHAR *) wcs, nResult);
|
||||
}
|
||||
#else
|
||||
size_t wcl = mbstowcs(NULL, mbs, 0);
|
||||
if (wcl == (size_t) -1)
|
||||
|
@ -121,12 +123,13 @@ const wchar_t *narrow_to_wide_c(const char *mbs)
|
|||
|
||||
std::wstring narrow_to_wide(const std::string& mbs)
|
||||
{
|
||||
const wchar_t *wcs = narrow_to_wide_c(mbs.c_str());
|
||||
if (!wcs)
|
||||
size_t wcl = mbs.size();
|
||||
Buffer<wchar_t> wcs(wcl + 1);
|
||||
size_t l = mbstowcs(*wcs, mbs.c_str(), wcl);
|
||||
if (l == (size_t)(-1))
|
||||
return L"<invalid multibyte string>";
|
||||
std::wstring wstr(wcs);
|
||||
delete [] wcs;
|
||||
return wstr;
|
||||
wcs[l] = 0;
|
||||
return *wcs;
|
||||
}
|
||||
|
||||
#ifdef __ANDROID__
|
||||
|
|
Loading…
Reference in New Issue