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/core/modules.cpp | 1 - src/mir_core/db.cpp | 5 +++ src/mir_core/langpack.cpp | 64 ++++++++++++++++++++++++++++----- src/modules/database/profilemanager.cpp | 2 -- src/modules/langpack/langpack.cpp | 53 ++------------------------- src/modules/langpack/langpack.h | 2 -- src/modules/langpack/lpopts.cpp | 4 +-- src/modules/langpack/lpservices.cpp | 2 -- src/modules/plugins/newplugins.cpp | 2 -- 9 files changed, 64 insertions(+), 71 deletions(-) (limited to 'src') diff --git a/src/core/modules.cpp b/src/core/modules.cpp index d0fd58359e..cea9906330 100644 --- a/src/core/modules.cpp +++ b/src/core/modules.cpp @@ -118,7 +118,6 @@ int LoadDefaultModules(void) if (LoadDatabaseModule()) return 1; // database is available here - Langpack_LoadLangpack(); if (LoadButtonModule()) return 1; if (LoadIcoLibModule()) return 1; if (LoadSkinIcons()) return 1; 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; } diff --git a/src/modules/database/profilemanager.cpp b/src/modules/database/profilemanager.cpp index 30704d902d..ea5b7e1a3b 100644 --- a/src/modules/database/profilemanager.cpp +++ b/src/modules/database/profilemanager.cpp @@ -800,8 +800,6 @@ static int AddProfileManagerPage(struct DetailsPageInit *opi, OPTIONSDIALOGPAGE int getProfileManager(PROFILEMANAGERDATA * pd) { - Langpack_LoadLangpack(); - DetailsPageInit opi = { 0 }; OPTIONSDIALOGPAGE odp = { sizeof(odp) }; diff --git a/src/modules/langpack/langpack.cpp b/src/modules/langpack/langpack.cpp index b0beb9c673..c378373e45 100644 --- a/src/modules/langpack/langpack.cpp +++ b/src/modules/langpack/langpack.cpp @@ -37,7 +37,7 @@ BOOL EnumLangpacks(ENUM_PACKS_CALLBACK callback, WPARAM wParam, LPARAM lParam) ptrT langpack(db_get_tsa(NULL, "Langpack", "Current")); LANGPACK_INFO pack; - PathToAbsoluteT(_T("\\langpack_*.txt"), pack.tszFullPath); + PathToAbsoluteT(_T("\\Languages\\langpack_*.txt"), pack.tszFullPath); BOOL fPackFound = FALSE; WIN32_FIND_DATA wfd; @@ -47,7 +47,7 @@ BOOL EnumLangpacks(ENUM_PACKS_CALLBACK callback, WPARAM wParam, LPARAM lParam) if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) continue; /* get data */ TCHAR tszFullPath[MAX_PATH]; - PathToAbsoluteT(_T("\\"), tszFullPath); + PathToAbsoluteT(_T("\\Languages\\"), tszFullPath); lstrcat(tszFullPath, wfd.cFileName); ZeroMemory(&pack, sizeof(pack)); @@ -93,52 +93,3 @@ BOOL EnumLangpacks(ENUM_PACKS_CALLBACK callback, WPARAM wParam, LPARAM lParam) return fPackFound; } - -///////////////////////////////////////////////////////////////////////////////////////// - -void Langpack_LoadLangpack(void) -{ - TCHAR szSearch[MAX_PATH]; - PathToAbsoluteT(_T("\\"), szSearch); - - // try to get the langpack's name from a profile first - ptrT langpack(db_get_tsa(NULL, "Langpack", "Current")); - if (langpack && langpack[0] != '\0') { - lstrcat(szSearch, langpack); - - DWORD dwAttrib = GetFileAttributes(szSearch); - if (dwAttrib != INVALID_FILE_ATTRIBUTES && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY)) - if (!LoadLangPack(szSearch)) - return; - } - - // look into mirandaboot.ini - TCHAR tszDefaultLang[100]; - if (GetPrivateProfileString(_T("Language"), _T("DefaultLanguage"), _T(""), tszDefaultLang, SIZEOF(tszDefaultLang), mirandabootini)) { - TCHAR tszLangPath[MAX_PATH]; - PathToAbsoluteT(tszDefaultLang, tszLangPath); - if (!LoadLangPack(tszLangPath)) - return; - } - - // finally try to load first file - lstrcat(szSearch, _T("langpack_*.txt")); - - WIN32_FIND_DATA fd; - HANDLE hFind = FindFirstFile(szSearch, &fd); - if (hFind != INVALID_HANDLE_VALUE) { - do { - /* search first langpack that could be loaded */ - if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) continue; - /* load langpack */ - PathToAbsoluteT(_T("\\"), szSearch); - lstrcat(szSearch, fd.cFileName); - if (!LoadLangPack(szSearch)) { - db_set_ws(NULL, "Langpack", "Current", fd.cFileName); - break; - } - } - while (FindNextFile(hFind, &fd)); - FindClose(hFind); - } -} diff --git a/src/modules/langpack/langpack.h b/src/modules/langpack/langpack.h index 47f44de94d..9d6401c71e 100644 --- a/src/modules/langpack/langpack.h +++ b/src/modules/langpack/langpack.h @@ -59,5 +59,3 @@ typedef BOOL(*ENUM_PACKS_CALLBACK) (LANGPACK_INFO *pack, WPARAM wParam, LPARAM l BOOL EnumLangpacks(ENUM_PACKS_CALLBACK callback, WPARAM wParam, LPARAM lParam); int LangpackOptionsInit(WPARAM wParam, LPARAM); - -void Langpack_LoadLangpack(void); diff --git a/src/modules/langpack/lpopts.cpp b/src/modules/langpack/lpopts.cpp index f52254afff..376f74fcc9 100644 --- a/src/modules/langpack/lpopts.cpp +++ b/src/modules/langpack/lpopts.cpp @@ -152,7 +152,7 @@ INT_PTR CALLBACK DlgLangpackOpt(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lP int idx = ComboBox_GetCurSel(hwndList); int count = ComboBox_GetCount(hwndList); for (int i = 0; i < count; i++) { - LANGPACK_INFO *pack = (LANGPACK_INFO*)ComboBox_GetItemData(hwndList, idx); + LANGPACK_INFO *pack = (LANGPACK_INFO*)ComboBox_GetItemData(hwndList, i); if (i == idx) { db_set_ws(NULL, "Langpack", "Current", pack->tszFileName); lstrcpy(tszPath, pack->tszFullPath); @@ -162,7 +162,7 @@ INT_PTR CALLBACK DlgLangpackOpt(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lP } if (tszPath[0]) { - CallService(MS_LANGPACK_RELOAD, 0, (LPARAM)tszPath); + ReloadLangpack(tszPath); CloseWindow(GetParent(hwndDlg)); DestroyWindow(GetParent(hwndDlg)); } diff --git a/src/modules/langpack/lpservices.cpp b/src/modules/langpack/lpservices.cpp index c686200e91..472ba43541 100644 --- a/src/modules/langpack/lpservices.cpp +++ b/src/modules/langpack/lpservices.cpp @@ -97,8 +97,6 @@ static INT_PTR srvGetPluginLangpack(WPARAM wParam, LPARAM lParam) ///////////////////////////////////////////////////////////////////////////////////////// -MIR_CORE_DLL(int)LoadLangPackModule(void); - int LoadLangpackModule(void) { LoadLangPackModule(); diff --git a/src/modules/plugins/newplugins.cpp b/src/modules/plugins/newplugins.cpp index 5a3ea6a735..5576865477 100644 --- a/src/modules/plugins/newplugins.cpp +++ b/src/modules/plugins/newplugins.cpp @@ -653,8 +653,6 @@ static int LaunchServicePlugin(pluginEntry *p) p->pclass |= PCLASS_LOADED; } - Langpack_LoadLangpack(); - INT_PTR res = CallService(MS_SERVICEMODE_LAUNCH, 0, 0); if (res != CALLSERVICE_NOTFOUND) return res; -- cgit v1.2.3