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;
}
Example #2
0
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;
}