static INT_PTR CALLBACK Dialog_ChangeLanguage_Proc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { Dialog_ChangeLanguage_Data * data; HWND langList; if (WM_INITDIALOG == msg) { DIALOG_SIZER_START(sz) DIALOG_SIZER_ENTRY(IDOK, DS_MoveX | DS_MoveY) DIALOG_SIZER_ENTRY(IDCANCEL, DS_MoveX | DS_MoveY) DIALOG_SIZER_ENTRY(IDC_CHANGE_LANG_LANG_LIST, DS_SizeY | DS_SizeX) DIALOG_SIZER_END() DialogSizer_Set(hDlg, sz, TRUE); data = (Dialog_ChangeLanguage_Data*)lParam; assert(data); SetWindowLongPtr(hDlg, GWLP_USERDATA, (LONG_PTR)data); // for non-latin languages this depends on the correct fonts being installed, // otherwise all the user will see are squares win::SetText(hDlg, _TR("Change Language")); langList = GetDlgItem(hDlg, IDC_CHANGE_LANG_LANG_LIST); int itemToSelect = 0; for (int i = 0; i < trans::GetLangsCount(); i++) { const char *name = trans::GetLangNameByIdx(i); const char *langCode = trans::GetLangCodeByIdx(i); ScopedMem<WCHAR> langName(str::conv::FromUtf8(name)); ListBox_AppendString_NoSort(langList, langName); if (str::Eq(langCode, data->langCode)) itemToSelect = i; } ListBox_SetCurSel(langList, itemToSelect); // the language list is meant to be laid out left-to-right ToggleWindowStyle(langList, WS_EX_LAYOUTRTL, false, GWL_EXSTYLE); SetDlgItemText(hDlg, IDOK, _TR("OK")); SetDlgItemText(hDlg, IDCANCEL, _TR("Cancel")); CenterDialog(hDlg); SetFocus(langList); return FALSE; } switch (msg) { case WM_COMMAND: data = (Dialog_ChangeLanguage_Data*)GetWindowLongPtr(hDlg, GWLP_USERDATA); assert(data); if (HIWORD(wParam) == LBN_DBLCLK) { assert(IDC_CHANGE_LANG_LANG_LIST == LOWORD(wParam)); langList = GetDlgItem(hDlg, IDC_CHANGE_LANG_LANG_LIST); assert(langList == (HWND)lParam); int langIdx = (int)ListBox_GetCurSel(langList); data->langCode = trans::GetLangCodeByIdx(langIdx); EndDialog(hDlg, IDOK); return FALSE; } switch (LOWORD(wParam)) { case IDOK: { langList = GetDlgItem(hDlg, IDC_CHANGE_LANG_LANG_LIST); int langIdx = ListBox_GetCurSel(langList); data->langCode = trans::GetLangCodeByIdx(langIdx); EndDialog(hDlg, IDOK); } return TRUE; case IDCANCEL: EndDialog(hDlg, IDCANCEL); return TRUE; } break; } return FALSE; }
const char *translate(AMX *amx, const char *lang, const char *key) { auto pLangName = lang; int status; if (!pLangName || !isalpha(pLangName[0])) { pLangName = amxmodx_language->string; } auto def = g_langMngr.GetDef(pLangName, key, status); if (!amx_mldebug) { amx_mldebug = CVAR_GET_POINTER("amx_mldebug"); } auto debug = (amx_mldebug && amx_mldebug->string && (amx_mldebug->string[0] != '\0')); if (debug) { int debug_status; auto validlang = true; auto testlang = amx_mldebug->string; if (!g_langMngr.LangExists(testlang)) { AMXXLOG_Error("[AMXX] \"%s\" is an invalid debug language", testlang); validlang = false; } g_langMngr.GetDef(testlang, key, debug_status); if (validlang && debug_status == ERR_BADKEY) { AMXXLOG_Error("[AMXX] Language key \"%s\" not found for language \"%s\", check \"%s\"", key, testlang, GetFileName(amx)); } } if (!def) { if (debug && status == ERR_BADLANG) { ke::AString langName(pLangName); auto &err = BadLang_Table.AltFindOrInsert(ke::Move(langName)); if (err.last + 120.0f < gpGlobals->time) { AMXXLOG_Error("[AMXX] Language \"%s\" not found", pLangName); err.last = gpGlobals->time; } } if (strcmp(pLangName, amxmodx_language->string) != 0) { def = g_langMngr.GetDef(amxmodx_language->string, key, status); } if (!def && (strcmp(pLangName, "en") != 0 && strcmp(amxmodx_language->string, "en") != 0)) { def = g_langMngr.GetDef("en", key, status); } } return def; }