📄 i18n.cpp
字号:
while (pLangs->lid){
if (pLangs->bSupported && pLangs->lid == lid){
FreeLangDLL();
bool bLoadedLib = false;
if (pLangs->lid == LANGID_EN_US){
_hLangDLL = NULL;
bLoadedLib = true;
}
else{
CString strLangDLL = rstrLangDir;
strLangDLL += pLangs->pszISOLocale;
strLangDLL += _T(".dll");
if (CheckLangDLLVersion(strLangDLL)){
_hLangDLL = LoadLibrary(strLangDLL);
if (_hLangDLL)
bLoadedLib = true;
}
}
if (bLoadedLib)
return true;
break;
}
pLangs++;
}
}
return false;
}
void CPreferences::SetLanguage()
{
InitLanguages(GetLangDir());
bool bFoundLang = false;
if (m_wLanguageID)
bFoundLang = LoadLangLib(GetLangDir(), m_wLanguageID);
if (!bFoundLang){
LANGID lidLocale = (LANGID)::GetThreadLocale();
//LANGID lidLocalePri = PRIMARYLANGID(::GetThreadLocale());
//LANGID lidLocaleSub = SUBLANGID(::GetThreadLocale());
bFoundLang = LoadLangLib(GetLangDir(), lidLocale);
if (!bFoundLang){
LoadLangLib(GetLangDir(), LANGID_EN_US);
m_wLanguageID = LANGID_EN_US;
CString strLngEnglish = GetResString(IDS_MB_LANGUAGEINFO);
AfxMessageBox(strLngEnglish, MB_ICONASTERISK);
}
else
m_wLanguageID = lidLocale;
}
// if loading a string fails, set language to English
if (GetResString(IDS_MB_LANGUAGEINFO).IsEmpty()) {
LoadLangLib(GetLangDir(), LANGID_EN_US);
m_wLanguageID = LANGID_EN_US;
}
InitThreadLocale();
}
bool CPreferences::IsLanguageSupported(LANGID lidSelected, bool bUpdateBefore){
InitLanguages(GetLangDir(), bUpdateBefore);
if (lidSelected == LANGID_EN_US)
return true;
const SLanguage* pLang = _aLanguages;
for (;pLang->lid;pLang++){
if (pLang->lid == lidSelected && pLang->bSupported){
return CheckLangDLLVersion(GetLangDir()+CString(pLang->pszISOLocale) + _T(".dll"));
}
}
return false;
}
CString CPreferences::GetLangDLLNameByID(LANGID lidSelected){
const SLanguage* pLang = _aLanguages;
for (;pLang->lid;pLang++){
if (pLang->lid == lidSelected)
return CString(pLang->pszISOLocale) + _T(".dll");
}
ASSERT ( false );
return CString("");
}
void CPreferences::SetRtlLocale(LCID lcid)
{
const SLanguage* pLangs = _aLanguages;
while (pLangs->lid)
{
if (pLangs->lid == LANGIDFROMLCID(lcid))
{
if (pLangs->uCodepage)
{
CString strCodepage;
strCodepage.Format(_T(".%u"), pLangs->uCodepage);
_tsetlocale(LC_CTYPE, strCodepage);
}
break;
}
pLangs++;
}
}
void CPreferences::InitThreadLocale()
{
#ifdef _UNICODE
ASSERT( m_wLanguageID != 0 );
// NOTE: This function is for testing multi language support only.
// NOTE: This function is *NOT* to be enabled in release builds nor to be offered by any Mod!
if (theApp.GetProfileInt(_T("eMule"), _T("SetLanguageACP"), 0) != 0)
{
LCID lcidUser = GetUserDefaultLCID(); // Installation, or altered by user in control panel (WinXP)
// get the ANSI codepage which is to be used for all non-Unicode conversions.
LANGID lidSystem = m_wLanguageID;
// get user's sorting preferences
//UINT uSortIdUser = SORTIDFROMLCID(lcidUser);
//UINT uSortVerUser = SORTVERSIONFROMLCID(lcidUser);
// we can't use the same sorting paramters for 2 different Languages..
UINT uSortIdUser = SORT_DEFAULT;
UINT uSortVerUser = 0;
// set thread locale, this is used for:
// - MBCS->Unicode conversions (e.g. search results).
// - Unicode->MBCS conversions (e.g. publishing local files (names) in network, or savint text files on local disk)...
LCID lcid = MAKESORTLCID(lidSystem, uSortIdUser, uSortVerUser);
SetThreadLocale(lcid);
// if we set the thread locale (see comments above) we also have to specify the proper
// codepage for the C-RTL, otherwise we may not be able to store some strings as MBCS
// (Unicode->MBCS conversion may fail)
SetRtlLocale(lcid);
}
else if (theApp.GetProfileInt(_T("eMule"), _T("SetSystemACP"), 0) != 0)
{
LCID lcidSystem = GetSystemDefaultLCID(); // Installation, or altered by user in control panel (WinXP)
LCID lcidUser = GetUserDefaultLCID(); // Installation, or altered by user in control panel (WinXP)
// get the ANSI codepage which is to be used for all non-Unicode conversions.
LANGID lidSystem = LANGIDFROMLCID(lcidSystem);
// get user's sorting preferences
//UINT uSortIdUser = SORTIDFROMLCID(lcidUser);
//UINT uSortVerUser = SORTVERSIONFROMLCID(lcidUser);
// we can't use the same sorting paramters for 2 different Languages..
UINT uSortIdUser = SORT_DEFAULT;
UINT uSortVerUser = 0;
// create a thread locale which gives full backward compability for users which had run ANSI emule on
// a system where the system's code page did not match the user's language..
LCID lcid = MAKESORTLCID(lidSystem, uSortIdUser, uSortVerUser);
LCID lcidThread = GetThreadLocale();
if (lcidThread != lcid)
{
TRACE("+++ Setting thread locale: 0x%08x\n", lcid);
SetThreadLocale(lcid);
// if we set the thread locale (see comments above) we also have to specify the proper
// codepage for the C-RTL, otherwise we may not be able to store some strings as MBCS
// (Unicode->MBCS conversion may fail)
SetRtlLocale(lcid);
}
}
#endif //_UNICODE
}
void InitThreadLocale()
{
thePrefs.InitThreadLocale();
}
bool CheckThreadLocale()
{
#ifdef _UNICODE
if (theApp.GetProfileInt(_T("eMule"), _T("SetLanguageACP"), 0) != 0)
return true;
int iSetSysACP = theApp.GetProfileInt(_T("eMule"), _T("SetSystemACP"), -1);
if (iSetSysACP != -1)
return true;
iSetSysACP = 0;
LCID lcidSystem = GetSystemDefaultLCID(); // Installation, or altered by user in control panel (WinXP)
LCID lcidUser = GetUserDefaultLCID(); // Installation, or altered by user in control panel (WinXP)
// get the ANSI codepage which is to be used for all non-Unicode conversions.
LANGID lidSystem = LANGIDFROMLCID(lcidSystem);
// get user's sorting preferences
//UINT uSortIdUser = SORTIDFROMLCID(lcidUser);
//UINT uSortVerUser = SORTVERSIONFROMLCID(lcidUser);
// we can't use the same sorting paramters for 2 different Languages..
UINT uSortIdUser = SORT_DEFAULT;
UINT uSortVerUser = 0;
// create a thread locale which gives full backward compability for users which had run ANSI emule on
// a system where the system's code page did not match the user's language..
LCID lcid = MAKESORTLCID(lidSystem, uSortIdUser, uSortVerUser);
LCID lcidThread = GetThreadLocale();
if (lcidThread != lcid)
{
CString str =
_T("eMule has detected that your system's codepage is not the same as eMule's current codepage. Do you want eMule to use your system's codepage for converting non-Unicode data to Unicode?\r\n")
_T("\r\n")
_T("If you want eMule to use your system's codepage for converting non-Unicode data, click 'Yes'. (This will give you more backward compatibility when reading older *.met files created with non-Unicode eMule versions.)\r\n")
_T("\r\n")
_T("If you want eMule to use the current codepage for converting non-Unicode data, click 'No'. (If you are using eMule the first time or if you don't care about this issue at all, chose this option. This is recommended.)\r\n")
_T("\r\n")
_T("If you want to cancel and create backup of all your config files or visit our forum to learn more about this issue, click 'Cancel'.\r\n");
int iAnswer = AfxMessageBox(str, MB_ICONSTOP | MB_YESNOCANCEL | MB_DEFBUTTON2);
if (iAnswer == IDCANCEL)
return false;
if (iAnswer == IDYES)
iSetSysACP = 1;
}
theApp.WriteProfileInt(_T("eMule"), _T("SetSystemACP"), iSetSysACP);
#endif
return true;
}
CString CPreferences::GetHtmlCharset()
{
ASSERT( m_wLanguageID != 0 );
LPCTSTR pszHtmlCharset = NULL;
const SLanguage* pLangs = _aLanguages;
while (pLangs->lid)
{
if (pLangs->lid == m_wLanguageID)
{
pszHtmlCharset = pLangs->pszHtmlCharset;
break;
}
pLangs++;
}
if (pszHtmlCharset == NULL || pszHtmlCharset[0] == _T('\0'))
{
ASSERT(0); // should never come here
// try to get charset from codepage
LPCTSTR pszLcLocale = _tsetlocale(LC_CTYPE, NULL);
if (pszLcLocale)
{
TCHAR szLocaleID[128];
UINT uCodepage = 0;
if (_stscanf(pszLcLocale, _T("%[a-zA-Z_].%u"), szLocaleID, &uCodepage) == 2 && uCodepage != 0)
{
CString strHtmlCodepage;
strHtmlCodepage.Format(_T("windows-%u"), uCodepage);
return strHtmlCodepage;
}
}
}
return pszHtmlCharset;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -