translateex.cpp
来自「一款密码保险箱源码」· C++ 代码 · 共 243 行
CPP
243 行
/*
KeePass Password Safe - The Open-Source Password Manager
Copyright (C) 2003-2007 Dominik Reichl <dominik.reichl@t-online.de>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "StdAfx.h"
#include "TranslateEx.h"
#include "StrUtil.h"
#include "MemUtil.h"
static BOOL m_bTableLoaded = FALSE;
static LPTSTR m_pTranslationStrings = NULL;
static DWORD m_dwNumTrlStrings = 0;
static LPTSTR m_pDefString[MAX_TRANSLATION_STRINGS];
static LPTSTR m_pTrlString[MAX_TRANSLATION_STRINGS];
C_FN_SHARE void _SortTrlTable();
static TCHAR m_szCurrentTranslationTable[2 * MAX_PATH];
C_FN_SHARE BOOL LoadTranslationTable(LPCTSTR pszTableName)
{
FILE *fp = NULL;
TCHAR szPath[2 * MAX_PATH];
size_t i = 0;
size_t dwLength = 0;
BOOL bMode = FALSE;
BOOL bScanning = FALSE;
if(m_bTableLoaded == TRUE) FreeCurrentTranslationTable();
ASSERT(pszTableName != NULL); if(pszTableName == NULL) return FALSE;
if(_tcslen(pszTableName) == 0) return TRUE;
if((_tcscmp(pszTableName, _T("Standard")) == 0) || (_tcscmp(pszTableName, _T("English")) == 0))
{
_tcscpy_s(m_szCurrentTranslationTable, _countof(m_szCurrentTranslationTable), pszTableName);
return TRUE;
}
GetModuleFileName(NULL, szPath, 2 * MAX_PATH);
i = _tcslen(szPath) - 1;
while(1)
{
if((szPath[i] == _T('\\')) || (szPath[i] == _T('/')))
{
szPath[i+1] = 0;
break;
}
i--;
if(i == 0) break;
}
_tcscat_s(szPath, _countof(szPath), pszTableName);
_tcscat_s(szPath, _countof(szPath), _T(".lng"));
_tfopen_s(&fp, szPath, _T("rb"));
if(fp == NULL) return FALSE;
fseek(fp, 0, SEEK_END);
dwLength = ftell(fp);
fseek(fp, 0, SEEK_SET);
UTF8_BYTE *pTranslationStrings8 = new UTF8_BYTE[dwLength + 1];
if(pTranslationStrings8 == NULL) { fclose(fp); fp = NULL; return FALSE; }
pTranslationStrings8[dwLength] = 0;
fread(pTranslationStrings8, 1, dwLength, fp);
fclose(fp); fp = NULL;
m_pTranslationStrings = _UTF8ToString(pTranslationStrings8);
SAFE_DELETE_ARRAY(pTranslationStrings8);
if(m_pTranslationStrings == NULL) return FALSE;
dwLength = _tcslen(m_pTranslationStrings);
m_dwNumTrlStrings = 0;
bMode = TRL_MODE_DEF;
bScanning = FALSE;
i = 0;
if(dwLength > 3)
if((m_pTranslationStrings[0] == 0xEF) && (m_pTranslationStrings[1] == 0xBB) &&
(m_pTranslationStrings[2] == 0xBF))
{
i += 3; // Skip UTF-8 initialization characters
}
for( ; i < dwLength; i++)
{
if(m_pTranslationStrings[i] == _T('|'))
{
if((bMode == TRL_MODE_DEF) && (bScanning == FALSE))
{
m_pDefString[m_dwNumTrlStrings] = &m_pTranslationStrings[i+1];
m_pTranslationStrings[i] = 0;
bScanning = TRUE;
continue;
}
if((bMode == TRL_MODE_DEF) && (bScanning == TRUE))
{
m_pTranslationStrings[i] = 0;
bMode = TRL_MODE_TRL;
bScanning = FALSE;
continue;
}
if((bMode == TRL_MODE_TRL) && (bScanning == FALSE))
{
m_pTrlString[m_dwNumTrlStrings] = &m_pTranslationStrings[i+1];
m_pTranslationStrings[i] = 0;
bScanning = TRUE;
continue;
}
if((bMode == TRL_MODE_TRL) && (bScanning == TRUE))
{
m_pTranslationStrings[i] = 0;
bMode = TRL_MODE_DEF;
bScanning = FALSE;
m_dwNumTrlStrings++;
if(m_dwNumTrlStrings == MAX_TRANSLATION_STRINGS) break;
continue;
}
// We should never get here
ASSERT(FALSE);
}
}
ASSERT(m_dwNumTrlStrings < MAX_TRANSLATION_STRINGS);
ASSERT(bMode == TRL_MODE_DEF);
ASSERT(bScanning == FALSE);
for(i = 0; i < m_dwNumTrlStrings; i++)
{
if(_tcslen(m_pTrlString[i]) == 0)
{
m_pTrlString[i] = m_pDefString[i];
}
}
_tcscpy_s(m_szCurrentTranslationTable, _countof(m_szCurrentTranslationTable), pszTableName);
_SortTrlTable();
m_bTableLoaded = TRUE;
return TRUE;
}
C_FN_SHARE BOOL FreeCurrentTranslationTable()
{
SAFE_DELETE_ARRAY(m_pTranslationStrings);
m_dwNumTrlStrings = 0;
_tcscpy_s(m_szCurrentTranslationTable, _countof(m_szCurrentTranslationTable), _T("English"));
if(m_bTableLoaded == FALSE) return FALSE;
return TRUE;
}
C_FN_SHARE void _SortTrlTable()
{
unsigned long i, j = 0, min;
TCHAR *v;
if(m_dwNumTrlStrings <= 1) return;
for(i = 0; i < (m_dwNumTrlStrings - 1); i++)
{
min = i;
for(j = i + 1; j < m_dwNumTrlStrings; j++)
{
if(_tcscmp(m_pDefString[j], m_pDefString[min]) < 0)
min = j;
}
v = m_pDefString[min];
m_pDefString[min] = m_pDefString[i];
m_pDefString[i] = v;
v = m_pTrlString[min];
m_pTrlString[min] = m_pTrlString[i];
m_pTrlString[i] = v;
}
}
C_FN_SHARE LPCTSTR _TRL(LPCTSTR pszDefString)
{
if(m_dwNumTrlStrings == 0) return pszDefString;
ASSERT(pszDefString != NULL); if(pszDefString == NULL) return _T("");
// Fast binary search on the sorted list of translation strings:
static int l, r, x, c;
l = 0; r = ((int)m_dwNumTrlStrings) - 1;
while(l != r)
{
x = (l + r) >> 1;
c = _tcscmp(m_pDefString[x], pszDefString);
if(c < 0) l = x + 1;
else r = x;
}
if(_tcscmp(m_pDefString[l], pszDefString) == 0) return m_pTrlString[l];
return pszDefString;
// Previous slow sequencial search (array doesn't have to be sorted):
/* static unsigned long i;
for(i = 0; i < m_dwNumTrlStrings; i++)
{
if(strcmp(m_pDefString[i], pszDefString) == 0) return m_pTrlString[i];
}
// String hasn't been found in the translation table -> return the input string
return pszDefString; */
}
C_FN_SHARE LPCTSTR GetCurrentTranslationTable()
{
return m_szCurrentTranslationTable;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?