From 88f6179361e5b378c2938c77674d28cd1dc9a4ed Mon Sep 17 00:00:00 2001 From: George Hazan Date: Tue, 25 Mar 2014 14:19:43 +0000 Subject: - language packs' directory is now %miranda_path%\Languages - lang pack loading code restructurization git-svn-id: http://svn.miranda-ng.org/main/trunk@8738 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- src/mir_core/db.cpp | 5 ++++ src/mir_core/langpack.cpp | 64 ++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 60 insertions(+), 9 deletions(-) (limited to 'src/mir_core') diff --git a/src/mir_core/db.cpp b/src/mir_core/db.cpp index f1aefcecce..e87c371898 100644 --- a/src/mir_core/db.cpp +++ b/src/mir_core/db.cpp @@ -354,6 +354,11 @@ MIR_CORE_DLL(MCONTACT) db_find_next(MCONTACT hContact, const char *szProto) extern "C" MIR_CORE_DLL(void) db_setCurrent(MIDatabase *_db) { currDb = _db; + + // try to get the langpack's name from a profile + ptrT langpack(db_get_tsa(NULL, "Langpack", "Current")); + if (langpack && langpack[0] != '\0') + LoadLangPack(langpack); } MIR_CORE_DLL(BOOL) db_set_resident(const char *szModule, const char *szService, BOOL bEnable) diff --git a/src/mir_core/langpack.cpp b/src/mir_core/langpack.cpp index 507eb06dc7..bebe9d6215 100644 --- a/src/mir_core/langpack.cpp +++ b/src/mir_core/langpack.cpp @@ -367,20 +367,39 @@ static int LoadLangDescr(LANGPACK_INFO &lpinfo, FILE *fp, char *line, int &start return 0; } -MIR_CORE_DLL(int) LoadLangPack(const TCHAR *szLangPack) +MIR_CORE_DLL(int) LoadLangPack(const TCHAR *ptszLangPack) { - if (!lstrcmp(szLangPack, langPack.tszFullPath)) + if (ptszLangPack == NULL) + return 1; + + // ensure that a lang's name is a full file name + TCHAR tszFullPath[MAX_PATH]; + if (!PathIsAbsoluteT(ptszLangPack)) { + PathToAbsoluteT(_T("\\Languages\\"), tszFullPath); + _tcsncat_s(tszFullPath, SIZEOF(tszFullPath), ptszLangPack, _TRUNCATE); + } + else _tcsncpy_s(tszFullPath, SIZEOF(tszFullPath), ptszLangPack, _TRUNCATE); + + // exists & not a directory? + DWORD dwAttrib = GetFileAttributes(tszFullPath); + if (dwAttrib == INVALID_FILE_ATTRIBUTES || (dwAttrib & FILE_ATTRIBUTE_DIRECTORY)) + return 3; + + // this lang is already loaded? nothing to do then + if (!lstrcmp(tszFullPath, langPack.tszFullPath)) return 0; + // ok... loading a new langpack. remove the old one if needed if (g_entryCount) UnloadLangPackModule(); - _tcsncpy_s(langPack.tszFullPath, SIZEOF(langPack.tszFullPath), szLangPack, _TRUNCATE); + // copy the full file name and extract a file name from it + _tcsncpy_s(langPack.tszFullPath, SIZEOF(langPack.tszFullPath), tszFullPath, _TRUNCATE); TCHAR *p = _tcsrchr(langPack.tszFullPath, '\\'); - _tcsncpy_s(langPack.tszFileName, SIZEOF(langPack.tszFullPath), (p == NULL) ? szLangPack : p + 1, _TRUNCATE); + _tcsncpy_s(langPack.tszFileName, SIZEOF(langPack.tszFullPath), (p == NULL) ? tszFullPath : p + 1, _TRUNCATE); CharLower(langPack.tszFileName); - FILE *fp = _tfopen(szLangPack, _T("rt")); + FILE *fp = _tfopen(ptszLangPack, _T("rt")); if (fp == NULL) return 1; @@ -403,17 +422,17 @@ MIR_CORE_DLL(int) LoadLangPack(const TCHAR *szLangPack) return 0; } -MIR_CORE_DLL(int) LoadLangPackDescr(const TCHAR *szLangPack, LANGPACK_INFO *lpInfo) +MIR_CORE_DLL(int) LoadLangPackDescr(const TCHAR *ptszLangPack, LANGPACK_INFO *lpInfo) { if (lpInfo == NULL) return 1; - _tcsncpy_s(lpInfo->tszFullPath, SIZEOF(lpInfo->tszFullPath), szLangPack, _TRUNCATE); + _tcsncpy_s(lpInfo->tszFullPath, SIZEOF(lpInfo->tszFullPath), ptszLangPack, _TRUNCATE); TCHAR *p = _tcsrchr(lpInfo->tszFullPath, '\\'); - _tcsncpy_s(lpInfo->tszFileName, SIZEOF(lpInfo->tszFullPath), (p == NULL) ? szLangPack : p+1, _TRUNCATE); + _tcsncpy_s(lpInfo->tszFileName, SIZEOF(lpInfo->tszFullPath), (p == NULL) ? ptszLangPack : p+1, _TRUNCATE); CharLower(lpInfo->tszFileName); - FILE *fp = _tfopen(szLangPack, _T("rt")); + FILE *fp = _tfopen(ptszLangPack, _T("rt")); if (fp == NULL) return 1; @@ -624,6 +643,33 @@ MIR_CORE_DLL(int) LoadLangPackModule(void) ZeroMemory(&langPack, sizeof(langPack)); hevChanged = CreateHookableEvent(ME_LANGPACK_CHANGED); + + // look into mirandaboot.ini + TCHAR tszDefaultLang[100], tszPath[MAX_PATH]; + PathToAbsoluteT(_T("\\mirandaboot.ini"), tszPath); + if (GetPrivateProfileString(_T("Language"), _T("DefaultLanguage"), _T(""), tszDefaultLang, SIZEOF(tszDefaultLang), tszPath)) + if (!LoadLangPack(tszDefaultLang)) + return 0; + + // finally try to load first file + PathToAbsoluteT(_T("\\Languages\\langpack_*.txt"), tszPath); + + WIN32_FIND_DATA fd; + HANDLE hFind = FindFirstFile(tszPath, &fd); + if (hFind != INVALID_HANDLE_VALUE) { + do { + /* search first langpack that could be loaded */ + if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + continue; + + if (!LoadLangPack(fd.cFileName)) { + db_set_ws(NULL, "Langpack", "Current", fd.cFileName); + break; + } + } + while (FindNextFile(hFind, &fd)); + FindClose(hFind); + } return 0; } -- cgit v1.2.3