diff --git a/Contrib/MakeLangId/MakeLangId.cpp b/Contrib/MakeLangId/MakeLangId.cpp index ee18e736..8d4b4c8d 100644 --- a/Contrib/MakeLangId/MakeLangId.cpp +++ b/Contrib/MakeLangId/MakeLangId.cpp @@ -1,300 +1,367 @@ -// Unicode support by Jim Park -- 08/23/2007 +/********* +MakeLangID +********** + +History +======= +20161207 - anders_k +* Rewritten from scratch to support languages from EnumSystemLocales ++ New icon ("Swerica" by anders_k, ZLib & CC BY-SA 4.0 dual license) + +20130906 - anders_k ++ 64-bit support + +20100326 - wizou & anders_k ++ Unicode support + +20040818 - kichik +* Initial release + +Reference +========= +https://msdn.microsoft.com/en-us/library/windows/desktop/dd318693(v=vs.85).aspx#Language Identifier Constants and Strings +https://wayback.archive.org/web/20021221200122/http://msdn.microsoft.com/library/en-us/intl/nls_8rse.asp#LOCALE_* (95/98/ME/NT4/2000/XP) + +*/ #include "../../Source/Platform.h" #include #include "resource.h" -#ifndef LANG_SCOTTISH_GAELIC -#define LANG_SCOTTISH_GAELIC 0x91 -#define SUBLANG_SCOTTISH_GAELIC 0x01 +#ifndef LOCALE_SNAME +#define LOCALE_SNAME 0x005C #endif -#ifndef LANG_CHEROKEE -#define LANG_CHEROKEE 0x5C -#define SUBLANG_CHEROKEE_CHEROKEE 0x01 +#ifndef LOCALE_SENGLISHDISPLAYNAME +#define LOCALE_SENGLISHDISPLAYNAME 0x0072 #endif -#ifndef LANG_CORSICAN -#define LANG_CORSICAN 0x83 -#define SUBLANG_CORSICAN_FRANCE 0x01 +#ifndef LOCALE_SNATIVEDISPLAYNAME +#define LOCALE_SNATIVEDISPLAYNAME 0x0073 #endif -#ifndef LANG_FILIPINO -#define LANG_FILIPINO 0x64 -#define SUBLANG_FILIPINO_PHILIPPINES 0x01 -#endif -#ifndef LANG_HAWAIIAN -#define LANG_HAWAIIAN 0x75 -#define SUBLANG_HAWAIIAN_US 0x01 -#endif -#ifndef LANG_KHMER -#define LANG_KHMER 0x53 -#define SUBLANG_KHMER_CAMBODIA 0x01 -#endif -#ifndef LANG_LAO -#define LANG_LAO 0x54 -#define SUBLANG_LAO_LAO 0x01 -#endif -#ifndef LANG_MALTESE -#define LANG_MALTESE 0x3A -#define SUBLANG_MALTESE_MALTA 0x01 -#endif -#ifndef LANG_TIBETAN -#define LANG_TIBETAN 0x51 -#define SUBLANG_TIBETAN_PRC 0x01 -#endif -#ifndef LANG_WELSH -#define LANG_WELSH 0x52 -#define SUBLANG_WELSH_UNITED_KINGDOM 0x01 +#ifndef CB_SETCUEBANNER +#define CB_SETCUEBANNER (0x1700+3) #endif - -#define CBL(x) {x,_T(#x)} - -struct line { - unsigned short id; - const TCHAR *name; -}; - -line primary[] = { - CBL(LANG_NEUTRAL), - CBL(LANG_INVARIANT), - CBL(LANG_AFRIKAANS), - CBL(LANG_ALBANIAN), - CBL(LANG_ARABIC), - CBL(LANG_ARMENIAN), - CBL(LANG_ASSAMESE), - CBL(LANG_AZERI), - CBL(LANG_BASQUE), - CBL(LANG_BELARUSIAN), - CBL(LANG_BENGALI), - CBL(LANG_BULGARIAN), - CBL(LANG_CATALAN), - CBL(LANG_CHEROKEE), - CBL(LANG_CHINESE), - CBL(LANG_CORSICAN), - CBL(LANG_CROATIAN), - CBL(LANG_CZECH), - CBL(LANG_DANISH), - CBL(LANG_DIVEHI), - CBL(LANG_DUTCH), - CBL(LANG_ENGLISH), - CBL(LANG_ESTONIAN), - CBL(LANG_FAEROESE), - CBL(LANG_FARSI), // AKA LANG_PERSIAN - CBL(LANG_FILIPINO), - CBL(LANG_FINNISH), - CBL(LANG_FRENCH), - CBL(LANG_GALICIAN), - CBL(LANG_GEORGIAN), - CBL(LANG_GERMAN), - CBL(LANG_GREEK), - CBL(LANG_GUJARATI), - CBL(LANG_HAWAIIAN), - CBL(LANG_HEBREW), - CBL(LANG_HINDI), - CBL(LANG_HUNGARIAN), - CBL(LANG_ICELANDIC), - CBL(LANG_INDONESIAN), - CBL(LANG_ITALIAN), - CBL(LANG_JAPANESE), - CBL(LANG_KANNADA), - CBL(LANG_KASHMIRI), - CBL(LANG_KAZAK), - CBL(LANG_KHMER), - CBL(LANG_KONKANI), - CBL(LANG_KOREAN), - CBL(LANG_KYRGYZ), - CBL(LANG_LAO), - CBL(LANG_LATVIAN), - CBL(LANG_LITHUANIAN), - CBL(LANG_MACEDONIAN), - CBL(LANG_MALAY), - CBL(LANG_MALAYALAM), - CBL(LANG_MALTESE), - CBL(LANG_MANIPURI), - CBL(LANG_MARATHI), - CBL(LANG_MONGOLIAN), - CBL(LANG_NEPALI), - CBL(LANG_NORWEGIAN), - CBL(LANG_ORIYA), - CBL(LANG_POLISH), - CBL(LANG_PORTUGUESE), - CBL(LANG_PUNJABI), - CBL(LANG_ROMANIAN), - CBL(LANG_RUSSIAN), - CBL(LANG_SANSKRIT), - CBL(LANG_SCOTTISH_GAELIC), - CBL(LANG_SERBIAN), - CBL(LANG_SINDHI), - CBL(LANG_SLOVAK), - CBL(LANG_SLOVENIAN), - CBL(LANG_SPANISH), - CBL(LANG_SWAHILI), - CBL(LANG_SWEDISH), - CBL(LANG_SYRIAC), - CBL(LANG_TAMIL), - CBL(LANG_TATAR), - CBL(LANG_TELUGU), - CBL(LANG_THAI), - CBL(LANG_TIBETAN), - CBL(LANG_TURKISH), - CBL(LANG_UKRAINIAN), - CBL(LANG_URDU), - CBL(LANG_UZBEK), - CBL(LANG_VIETNAMESE), - CBL(LANG_WELSH) -}; - -line sub[] = { - CBL(SUBLANG_NEUTRAL), - CBL(SUBLANG_DEFAULT), - CBL(SUBLANG_SYS_DEFAULT), - CBL(SUBLANG_ARABIC_SAUDI_ARABIA), - CBL(SUBLANG_ARABIC_IRAQ), - CBL(SUBLANG_ARABIC_EGYPT), - CBL(SUBLANG_ARABIC_LIBYA), - CBL(SUBLANG_ARABIC_ALGERIA), - CBL(SUBLANG_ARABIC_MOROCCO), - CBL(SUBLANG_ARABIC_TUNISIA), - CBL(SUBLANG_ARABIC_OMAN), - CBL(SUBLANG_ARABIC_YEMEN), - CBL(SUBLANG_ARABIC_SYRIA), - CBL(SUBLANG_ARABIC_JORDAN), - CBL(SUBLANG_ARABIC_LEBANON), - CBL(SUBLANG_ARABIC_KUWAIT), - CBL(SUBLANG_ARABIC_UAE), - CBL(SUBLANG_ARABIC_BAHRAIN), - CBL(SUBLANG_ARABIC_QATAR), - CBL(SUBLANG_AZERI_LATIN), - CBL(SUBLANG_AZERI_CYRILLIC), - CBL(SUBLANG_CHINESE_TRADITIONAL), - CBL(SUBLANG_CHINESE_SIMPLIFIED), - CBL(SUBLANG_CHINESE_HONGKONG), - CBL(SUBLANG_CHINESE_SINGAPORE), - CBL(SUBLANG_CHINESE_MACAU), - CBL(SUBLANG_DUTCH), - CBL(SUBLANG_DUTCH_BELGIAN), - CBL(SUBLANG_ENGLISH_US), - CBL(SUBLANG_ENGLISH_UK), - CBL(SUBLANG_ENGLISH_AUS), - CBL(SUBLANG_ENGLISH_CAN), - CBL(SUBLANG_ENGLISH_NZ), - CBL(SUBLANG_ENGLISH_EIRE), - CBL(SUBLANG_ENGLISH_SOUTH_AFRICA), - CBL(SUBLANG_ENGLISH_JAMAICA), - CBL(SUBLANG_ENGLISH_CARIBBEAN), - CBL(SUBLANG_ENGLISH_BELIZE), - CBL(SUBLANG_ENGLISH_TRINIDAD), - CBL(SUBLANG_ENGLISH_ZIMBABWE), - CBL(SUBLANG_ENGLISH_PHILIPPINES), - CBL(SUBLANG_FRENCH), - CBL(SUBLANG_FRENCH_BELGIAN), - CBL(SUBLANG_FRENCH_CANADIAN), - CBL(SUBLANG_FRENCH_SWISS), - CBL(SUBLANG_FRENCH_LUXEMBOURG), - CBL(SUBLANG_FRENCH_MONACO), - CBL(SUBLANG_GERMAN), - CBL(SUBLANG_GERMAN_SWISS), - CBL(SUBLANG_GERMAN_AUSTRIAN), - CBL(SUBLANG_GERMAN_LUXEMBOURG), - CBL(SUBLANG_GERMAN_LIECHTENSTEIN), - CBL(SUBLANG_ITALIAN), - CBL(SUBLANG_ITALIAN_SWISS), - CBL(SUBLANG_KASHMIRI_INDIA), - CBL(SUBLANG_KOREAN), - CBL(SUBLANG_LITHUANIAN), - CBL(SUBLANG_MALAY_MALAYSIA), - CBL(SUBLANG_MALAY_BRUNEI_DARUSSALAM), - CBL(SUBLANG_NEPALI_INDIA), - CBL(SUBLANG_NORWEGIAN_BOKMAL), - CBL(SUBLANG_NORWEGIAN_NYNORSK), - CBL(SUBLANG_PORTUGUESE), - CBL(SUBLANG_PORTUGUESE_BRAZILIAN), - CBL(SUBLANG_SCOTTISH_GAELIC), - CBL(SUBLANG_SERBIAN_LATIN), - CBL(SUBLANG_SERBIAN_CYRILLIC), - CBL(SUBLANG_SPANISH), - CBL(SUBLANG_SPANISH_MEXICAN), - CBL(SUBLANG_SPANISH_MODERN), - CBL(SUBLANG_SPANISH_GUATEMALA), - CBL(SUBLANG_SPANISH_COSTA_RICA), - CBL(SUBLANG_SPANISH_PANAMA), - CBL(SUBLANG_SPANISH_DOMINICAN_REPUBLIC), - CBL(SUBLANG_SPANISH_VENEZUELA), - CBL(SUBLANG_SPANISH_COLOMBIA), - CBL(SUBLANG_SPANISH_PERU), - CBL(SUBLANG_SPANISH_ARGENTINA), - CBL(SUBLANG_SPANISH_ECUADOR), - CBL(SUBLANG_SPANISH_CHILE), - CBL(SUBLANG_SPANISH_URUGUAY), - CBL(SUBLANG_SPANISH_PARAGUAY), - CBL(SUBLANG_SPANISH_BOLIVIA), - CBL(SUBLANG_SPANISH_EL_SALVADOR), - CBL(SUBLANG_SPANISH_HONDURAS), - CBL(SUBLANG_SPANISH_NICARAGUA), - CBL(SUBLANG_SPANISH_PUERTO_RICO), - CBL(SUBLANG_SWEDISH), - CBL(SUBLANG_SWEDISH_FINLAND), - CBL(SUBLANG_URDU_PAKISTAN), - CBL(SUBLANG_URDU_INDIA), - CBL(SUBLANG_UZBEK_LATIN), - CBL(SUBLANG_UZBEK_CYRILLIC) -}; - -static void SelectDefaultSublanguage(HWND hwndDlg) +static INT_PTR StrToIntptr(LPCTSTR s, bool ForceHex = false) { - SendDlgItemMessage(hwndDlg, IDC_SUB, CB_SELECTSTRING, -1, (LPARAM) _T("SUBLANG_DEFAULT")); + UINT_PTR val = 0; + int sign = 1, base = 10, numtop = '9'; + if (*s == TEXT('-')) s++, sign = -1; + if (*s == TEXT('0')) + { + s++; + if ((s[0] & ~0x20) == TEXT('X')) ++s, base = 16; + } + if (ForceHex) base = 16; + for (;;) + { + int c = *s++; + if (c >= _T('0') && c <= numtop) c -= TEXT('0'); + else if (base == 16 && (c & ~0x20) >= TEXT('A') && (c & ~0x20) <= TEXT('F')) c = (c & 7) + 9; + else break; + val *= base, val += c; + } + return ((INT_PTR)val) * sign; } -INT_PTR CALLBACK DialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) { - size_t i; - switch (uMsg) { - case WM_INITDIALOG: - SendMessage(hwndDlg, WM_SETICON, 0, 0); - for (i = 0; i < sizeof(primary)/sizeof(line); i++) - SendDlgItemMessage(hwndDlg, IDC_PRIMARY, CB_ADDSTRING, 0, (LPARAM)primary[i].name); - for (i = 0; i < sizeof(sub)/sizeof(line); i++) - SendDlgItemMessage(hwndDlg, IDC_SUB, CB_ADDSTRING, 0, (LPARAM)sub[i].name); - SelectDefaultSublanguage(hwndDlg); - break; - case WM_COMMAND: - if (LOWORD(wParam) == IDCANCEL) { - EndDialog(hwndDlg, 0); - PostQuitMessage(0); - } - else if (HIWORD(wParam) == CBN_SELCHANGE) { - // When the language changes you probably need to update the sublanguage as well - // so we set it to something safe. - if (LOWORD(wParam) == IDC_PRIMARY) - SelectDefaultSublanguage(hwndDlg); +typedef struct { WORD id; LPCSTR name; } INTLNG; // Storing the names as ASCII saves 4 KiB - if (SendDlgItemMessage(hwndDlg, IDC_PRIMARY, CB_GETCURSEL, 0, 0) != CB_ERR && SendDlgItemMessage(hwndDlg, IDC_SUB, CB_GETCURSEL, 0, 0) != CB_ERR) { - TCHAR lidbuf[50+11+!0], cpdispbuf[50+11+!0], cpbuf[11+!0]; - WORD langid = MAKELANGID(primary[SendDlgItemMessage(hwndDlg, IDC_PRIMARY, CB_GETCURSEL, 0, 0)].id, sub[SendDlgItemMessage(hwndDlg, IDC_SUB, CB_GETCURSEL, 0, 0)].id); - wsprintf(lidbuf, _T("Language ID: %d"), langid); - SetDlgItemText(hwndDlg, IDC_RESULT, lidbuf); - if (!GetLocaleInfo(MAKELCID(langid, SORT_DEFAULT), LOCALE_IDEFAULTANSICODEPAGE, cpbuf, 11+!0)) - wsprintf(cpbuf, _T("N/A")); - else if (!lstrcmp(cpbuf, _T("0"))) - wsprintf(cpbuf, _T("1200 (Unicode-only)")); - wsprintf(cpdispbuf, _T("Codepage: %s"), cpbuf); - SetDlgItemText(hwndDlg, IDC_CODEPAGE, cpdispbuf); - } +#define IL(p, s, pn, sn) { MAKELANGID(p, s), #pn ":" #sn } +static const INTLNG g_IntLoc[] = { + //(0x00, 0x00, NEUTRAL, NEUTRAL), + //(0x00, 0x01, NEUTRAL, DEFAULT), + IL(0x7f, 0x00, INVARIANT, NEUTRAL), // Invariant locale + IL(0x36, 0x01, AFRIKAANS, AFRIKAANS_SOUTH_AFRICA), + IL(0x1c, 0x01, ALBANIAN, ALBANIAN_ALBANIA), + IL(0x01, 0x01, ARABIC, ARABIC_SAUDI_ARABIA), + IL(0x01, 0x02, ARABIC, ARABIC_IRAQ), + IL(0x01, 0x03, ARABIC, ARABIC_EGYPT), + IL(0x01, 0x04, ARABIC, ARABIC_LIBYA), + IL(0x01, 0x05, ARABIC, ARABIC_ALGERIA), + IL(0x01, 0x06, ARABIC, ARABIC_MOROCCO), + IL(0x01, 0x07, ARABIC, ARABIC_TUNISIA), + IL(0x01, 0x08, ARABIC, ARABIC_OMAN), + IL(0x01, 0x09, ARABIC, ARABIC_YEMEN), + IL(0x01, 0x0a, ARABIC, ARABIC_SYRIA), + IL(0x01, 0x0b, ARABIC, ARABIC_JORDAN), + IL(0x01, 0x0c, ARABIC, ARABIC_LEBANON), + IL(0x01, 0x0d, ARABIC, ARABIC_KUWAIT), + IL(0x01, 0x0e, ARABIC, ARABIC_UAE), + IL(0x01, 0x0f, ARABIC, ARABIC_BAHRAIN), + IL(0x01, 0x10, ARABIC, ARABIC_QATAR), + IL(0x2b, 0x01, ARMENIAN, ARMENIAN_ARMENIA), + IL(0x4d, 0x01, ASSAMESE, ASSAMESE_INDIA), + IL(0x2c, 0x01, AZERI, AZERI_LATIN), + IL(0x2c, 0x02, AZERI, AZERI_CYRILLIC), + IL(0x2d, 0x01, BASQUE, BASQUE_BASQUE), + IL(0x23, 0x01, BELARUSIAN, BELARUSIAN_BELARUS), + IL(0x45, 0x01, BENGALI, BENGALI_INDIA), + IL(0x45, 0x02, BENGALI, BENGALI_BANGLADESH), + IL(0x02, 0x01, BULGARIAN, BULGARIAN_BULGARIA), + IL(0x03, 0x01, CATALAN, CATALAN_CATALAN), + IL(0x5c, 0x01, CHEROKEE, CHEROKEE_CHEROKEE), + IL(0x04, 0x01, CHINESE, CHINESE_TRADITIONAL), + IL(0x04, 0x02, CHINESE, CHINESE_SIMPLIFIED), + IL(0x04, 0x03, CHINESE, CHINESE_HONGKONG), + IL(0x04, 0x04, CHINESE, CHINESE_SINGAPORE), + IL(0x04, 0x05, CHINESE, CHINESE_MACAU), + IL(0x83, 0x01, CORSICAN, CORSICAN_FRANCE), + IL(0x1a, 0x01, CROATIAN, CROATIAN_CROATIA), + IL(0x1a, 0x04, CROATIAN, CROATIAN_BOSNIA_HERZEGOVINA_LATIN), + IL(0x05, 0x01, CZECH, CZECH_CZECH_REPUBLIC), + IL(0x06, 0x01, DANISH, DANISH_DENMARK), + IL(0x65, 0x01, DIVEHI, DIVEHI_MALDIVES), + IL(0x13, 0x01, DUTCH, DUTCH), + IL(0x13, 0x02, DUTCH, DUTCH_BELGIAN), + IL(0x09, 0x01, ENGLISH, ENGLISH_US), + IL(0x09, 0x02, ENGLISH, ENGLISH_UK), + IL(0x09, 0x03, ENGLISH, ENGLISH_AUS), + IL(0x09, 0x04, ENGLISH, ENGLISH_CAN), + IL(0x09, 0x05, ENGLISH, ENGLISH_NZ), + IL(0x09, 0x06, ENGLISH, ENGLISH_EIRE), + IL(0x09, 0x07, ENGLISH, ENGLISH_SOUTH_AFRICA), + IL(0x09, 0x08, ENGLISH, ENGLISH_JAMAICA), + IL(0x09, 0x09, ENGLISH, ENGLISH_CARIBBEAN), + IL(0x09, 0x0a, ENGLISH, ENGLISH_BELIZE), + IL(0x09, 0x0b, ENGLISH, ENGLISH_TRINIDAD), + IL(0x09, 0x0c, ENGLISH, ENGLISH_ZIMBABWE), + IL(0x09, 0x0d, ENGLISH, ENGLISH_PHILIPPINES), + IL(0x09, 0x10, ENGLISH, ENGLISH_INDIA), + IL(0x09, 0x11, ENGLISH, ENGLISH_MALAYSIA), + IL(0x09, 0x12, ENGLISH, ENGLISH_SINGAPORE), + IL(0x25, 0x01, ESTONIAN, ESTONIAN_ESTONIA), + IL(0x38, 0x01, FAEROESE, FAEROESE_FAROE_ISLANDS), + IL(0x29, 0x01, FARSI, PERSIAN_IRAN), // LANG_FARSI AKA LANG_PERSIAN + IL(0x64, 0x01, FILIPINO, FILIPINO_PHILIPPINES), + IL(0x0b, 0x01, FINNISH, FINNISH_FINLAND), + IL(0x0c, 0x01, FRENCH, FRENCH), + IL(0x0c, 0x02, FRENCH, FRENCH_BELGIAN), + IL(0x0c, 0x03, FRENCH, FRENCH_CANADIAN), + IL(0x0c, 0x04, FRENCH, FRENCH_SWISS), + IL(0x0c, 0x05, FRENCH, FRENCH_LUXEMBOURG), + IL(0x0c, 0x06, FRENCH, FRENCH_MONACO), + IL(0x56, 0x01, GALICIAN, GALICIAN_GALICIAN), + IL(0x37, 0x01, GEORGIAN, GEORGIAN_GEORGIA), + IL(0x07, 0x01, GERMAN, GERMAN), + IL(0x07, 0x02, GERMAN, GERMAN_SWISS), + IL(0x07, 0x03, GERMAN, GERMAN_AUSTRIAN), + IL(0x07, 0x04, GERMAN, GERMAN_LUXEMBOURG), + IL(0x07, 0x05, GERMAN, GERMAN_LIECHTENSTEIN), + IL(0x08, 0x01, GREEK, GREEK_GREECE), + IL(0x47, 0x01, GUJARATI, GUJARATI_INDIA), + IL(0x75, 0x01, HAWAIIAN, HAWAIIAN_US), + IL(0x0d, 0x01, HEBREW, HEBREW_ISRAEL), + IL(0x39, 0x01, HINDI, HINDI_INDIA), + IL(0x0e, 0x01, HUNGARIAN, HUNGARIAN_HUNGARY), + IL(0x0f, 0x01, ICELANDIC, ICELANDIC_ICELAND), + IL(0x21, 0x01, INDONESIAN, INDONESIAN_INDONESIA), + IL(0x10, 0x01, ITALIAN, ITALIAN), + IL(0x10, 0x02, ITALIAN, ITALIAN_SWISS), + IL(0x11, 0x01, JAPANESE, JAPANESE_JAPAN), + IL(0x60, 0x02, KASHMIRI, KASHMIRI_SASIA), + IL(0x3f, 0x01, KAZAK, KAZAK_KAZAKHSTAN), + IL(0x53, 0x01, KHMER, KHMER_CAMBODIA), + IL(0x12, 0x01, KOREAN, KOREAN), + IL(0x40, 0x01, KYRGYZ, KYRGYZ_KYRGYZSTAN), + IL(0x54, 0x01, LAO, LAO_LAO), + IL(0x26, 0x01, LATVIAN, LATVIAN_LATVIA), + IL(0x27, 0x01, LITHUANIAN, LITHUANIAN), + IL(0x2f, 0x01, MACEDONIAN, MACEDONIAN_MACEDONIA), + IL(0x3e, 0x01, MALAY, MALAY_MALAYSIA), + IL(0x3e, 0x02, MALAY, MALAY_BRUNEI_DARUSSALAM), + IL(0x4c, 0x01, MALAYALAM, MALAYALAM_INDIA), + IL(0x3a, 0x01, MALTESE, MALTESE_MALTA), + //(0x58, 0x01, MANIPURI, ?), + IL(0x4e, 0x01, MARATHI, MARATHI_INDIA), + IL(0x50, 0x01, MONGOLIAN, MONGOLIAN_CYRILLIC_MONGOLIA), + IL(0x50, 0x02, MONGOLIAN, MONGOLIAN_PRC), + IL(0x61, 0x01, NEPALI, NEPALI_NEPAL), + IL(0x61, 0x02, NEPALI, NEPALI_INDIA), + IL(0x14, 0x01, NORWEGIAN, NORWEGIAN_BOKMAL), + IL(0x14, 0x02, NORWEGIAN, NORWEGIAN_NYNORSK), + IL(0x48, 0x01, ORIYA, ORIYA_INDIA), + IL(0x15, 0x01, POLISH, POLISH_POLAND), + IL(0x16, 0x01, PORTUGUESE, PORTUGUESE_BRAZILIAN), + IL(0x16, 0x02, PORTUGUESE, PORTUGUESE), + IL(0x18, 0x01, ROMANIAN, ROMANIAN_ROMANIA), + IL(0x19, 0x01, RUSSIAN, RUSSIAN_RUSSIA), + IL(0x4f, 0x01, SANSKRIT, SANSKRIT_INDIA), + IL(0x91, 0x01, SCOTTISH_GAELIC, SCOTTISH_GAELIC), + IL(0x1a, 0x01, SERBIAN, SERBIAN_CROATIA), + IL(0x1a, 0x02, SERBIAN, SERBIAN_LATIN), // Serbia and Montenegro (former) + IL(0x1a, 0x03, SERBIAN, SERBIAN_CYRILLIC), // Serbia and Montenegro (former) + IL(0x1a, 0x06, SERBIAN, SERBIAN_BOSNIA_HERZEGOVINA_LATIN), + IL(0x1a, 0x07, SERBIAN, SERBIAN_BOSNIA_HERZEGOVINA_CYRILLIC), + IL(0x1b, 0x01, SLOVAK, SLOVAK_SLOVAKIA), + IL(0x24, 0x01, SLOVENIAN, SLOVENIAN_SLOVENIA), + IL(0x0a, 0x01, SPANISH, SPANISH), + IL(0x0a, 0x02, SPANISH, SPANISH_MEXICAN), + IL(0x0a, 0x03, SPANISH, SPANISH_MODERN), + IL(0x0a, 0x04, SPANISH, SPANISH_GUATEMALA), + IL(0x0a, 0x05, SPANISH, SPANISH_COSTA_RICA), + IL(0x0a, 0x06, SPANISH, SPANISH_PANAMA), + IL(0x0a, 0x07, SPANISH, SPANISH_DOMINICAN_REPUBLIC), + IL(0x0a, 0x08, SPANISH, SPANISH_VENEZUELA), + IL(0x0a, 0x09, SPANISH, SPANISH_COLOMBIA), + IL(0x0a, 0x0a, SPANISH, SPANISH_PERU), + IL(0x0a, 0x0b, SPANISH, SPANISH_ARGENTINA), + IL(0x0a, 0x0c, SPANISH, SPANISH_ECUADOR), + IL(0x0a, 0x0d, SPANISH, SPANISH_CHILE), + IL(0x0a, 0x0e, SPANISH, SPANISH_URUGUAY), + IL(0x0a, 0x0f, SPANISH, SPANISH_PARAGUAY), + IL(0x0a, 0x10, SPANISH, SPANISH_BOLIVIA), + IL(0x0a, 0x11, SPANISH, SPANISH_EL_SALVADOR), + IL(0x0a, 0x12, SPANISH, SPANISH_HONDURAS), + IL(0x0a, 0x13, SPANISH, SPANISH_NICARAGUA), + IL(0x0a, 0x14, SPANISH, SPANISH_PUERTO_RICO), + IL(0x0a, 0x15, SPANISH, SPANISH_US), + IL(0x41, 0x01, SWAHILI, SWAHILI), + IL(0x1d, 0x01, SWEDISH, SWEDISH), + IL(0x1d, 0x02, SWEDISH, SWEDISH_FINLAND), + IL(0x5a, 0x01, SYRIAC, SYRIAC_SYRIA), + IL(0x1e, 0x01, THAI, THAI_THAILAND), + IL(0x51, 0x01, TIBETAN, TIBETAN_PRC), + IL(0x1f, 0x01, TURKISH, TURKISH_TURKEY), + IL(0x22, 0x01, UKRAINIAN, UKRAINIAN_UKRAINE), + IL(0x43, 0x01, UZBEK, UZBEK_LATIN), + IL(0x43, 0x02, UZBEK, UZBEK_CYRILLIC), + IL(0x2a, 0x01, VIETNAMESE, VIETNAMESE_VIETNAM), + IL(0x52, 0x01, WELSH, WELSH_UNITED_KINGDOM) +}; + +HWND g_hList; + +static UINT AddLocale(HWND hCtl, LPCTSTR Name, UINT LangId) +{ + UINT idx = SendMessage(hCtl, CB_ADDSTRING, 0, (LPARAM) Name); + if (idx != CB_ERR) SendMessage(hCtl, CB_SETITEMDATA, idx, LangId); + return idx; +} + +static BOOL CALLBACK EnumSysLocalesProc(LPTSTR lpLocaleString) +{ + const UINT cchbuf1 = 80+2+80+1+2+85+1+!0, cchbuf2 = 85+!0; + TCHAR buf1[cchbuf1], buf2[cchbuf2]; + UINT lid = StrToIntptr(lpLocaleString, true), lcid = MAKELCID(lid, SORT_DEFAULT); + + UINT retval = GetLocaleInfo(lcid, LOCALE_SENGLISHDISPLAYNAME|LOCALE_NOUSEROVERRIDE, buf1, cchbuf1); + if (!retval) // LOCALE_SENGLISHDISPLAYNAME is Win7+ + { + GetLocaleInfo(lcid, LOCALE_SENGCOUNTRY|LOCALE_NOUSEROVERRIDE, buf2, cchbuf2); + retval = GetLocaleInfo(lcid, LOCALE_SENGLANGUAGE|LOCALE_NOUSEROVERRIDE, buf1, cchbuf1); + retval += wsprintf(buf1+retval, retval ? TEXT(" (%s)") : TEXT("?"), buf2); + } + AddLocale(g_hList, buf1, lid); + return true; +} + +static void InitSysLangList(HWND hCtl) +{ + g_hList = hCtl; // EnumSystemLocales is stupid and does not have a callback parameter + SendMessage(hCtl, CB_SETCUEBANNER, 0, (LPARAM) L"Select a language..."); + EnumSystemLocales(EnumSysLocalesProc, LCID_SUPPORTED); +} + +static void InitIntLangList(HWND hCtl) +{ + g_hList = hCtl; + SendMessage(hCtl, CB_SETCUEBANNER, 0, (LPARAM) L"Select a language..."); + for (UINT i = 0; i < sizeof(g_IntLoc)/sizeof(INTLNG); ++i) + { + #ifdef UNICODE + WCHAR name[200]; + wsprintf(name, L"%S", g_IntLoc[i].name); + #else + LPCTSTR name = g_IntLoc[i].name; + #endif + AddLocale(hCtl, name, g_IntLoc[i].id); + } +} + + +static void OnLanguageChanged(HWND hDlg) +{ + const UINT cchbuf1 = 80+2+80+1+2+85+1+!0, cchbuf2 = 85+!0; + TCHAR buf1[cchbuf1], buf2[cchbuf2]; + HWND hList = g_hList; + + INT idx = SendMessage(hList, CB_GETCURSEL, 0, 0); + UINT lid = SendMessage(hList, CB_GETITEMDATA, idx, 0), lcid = MAKELCID(lid, SORT_DEFAULT); + EnableWindow(GetDlgItem(hDlg, IDOK), idx != CB_ERR); + if (idx == CB_ERR) + { + SetDlgItemText(hDlg, IDC_INFO, TEXT("")); + SetDlgItemText(hDlg, IDC_LANGID, TEXT("")); + SetDlgItemText(hDlg, IDC_CODEPAGE, TEXT("")); + return ; + } + + UINT retval = GetLocaleInfo(lcid, LOCALE_SNATIVEDISPLAYNAME|LOCALE_NOUSEROVERRIDE, buf1, cchbuf1); + if (!retval) // LOCALE_SNATIVEDISPLAYNAME is Win7+ + { + GetLocaleInfo(lcid, LOCALE_SNATIVECTRYNAME|LOCALE_NOUSEROVERRIDE, buf2, cchbuf2); + retval = GetLocaleInfo(lcid, LOCALE_SNATIVELANGNAME|LOCALE_NOUSEROVERRIDE, buf1, cchbuf1); + retval += wsprintf(buf1+retval, retval ? TEXT(" (%s)") : TEXT("?"), buf2); + } + + if (retval && GetLocaleInfo(lcid, LOCALE_SNAME|LOCALE_NOUSEROVERRIDE, buf2, cchbuf2) && *buf2) + { + wsprintf(buf1+retval-1, TEXT(" [%s]"), buf2); + } + SetDlgItemText(hDlg, IDC_INFO, buf1); + + wsprintf(buf1, TEXT("%u (0x%X)"), lid, lid); + SetDlgItemText(hDlg, IDC_LANGID, buf1); + wsprintf(buf1, TEXT("%u"), lid); + SetDlgItemText(hDlg, IDC_COPYHELPER, buf1); + + retval = GetLocaleInfo(lcid, LOCALE_IDEFAULTANSICODEPAGE|LOCALE_NOUSEROVERRIDE, buf2, cchbuf2); + LPCTSTR cpstr = retval ? lstrcmp(buf2, TEXT("0")) ? buf2 : TEXT("1200 (Unicode-only)") : TEXT("?"); + SetDlgItemText(hDlg, IDC_CODEPAGE, cpstr); +} + +INT_PTR CALLBACK DialogProc(HWND hDlg, UINT Msg, WPARAM wp, LPARAM lp) +{ + HWND hCtl, hCtl2; + switch(Msg) + { + case WM_COMMAND: + switch(wp) + { + case MAKELONG(IDOK, BN_CLICKED): + // Using a secret edit box to copy to the clipboard + hCtl = GetDlgItem(hDlg, IDC_COPYHELPER); + SendMessage(hCtl, EM_SETSEL, 0, -1); + SendMessage(hCtl, WM_COPY, 0, 0); + break; + + case MAKELONG(IDCANCEL, BN_CLICKED): + return EndDialog(hDlg, 0); + + case MAKELONG(IDC_SOURCE, CBN_SELCHANGE): + hCtl = GetDlgItem(hDlg, IDC_SYSLANGLIST), hCtl2 = GetDlgItem(hDlg, IDC_INTLANGLIST); + if (g_hList == hCtl) { HWND h; h = hCtl, hCtl = hCtl2, hCtl2 = h; } + ShowWindow(g_hList = hCtl, SW_SHOW); + ShowWindow(hCtl2, SW_HIDE); + // fallthrough + + case MAKELONG(IDC_SYSLANGLIST, CBN_SELCHANGE): + case MAKELONG(IDC_INTLANGLIST, CBN_SELCHANGE): + OnLanguageChanged(hDlg); + break; } - else if (LOWORD(wParam) == IDOK) { - if (SendDlgItemMessage(hwndDlg, IDC_PRIMARY, CB_GETCURSEL, 0, 0) != CB_ERR && SendDlgItemMessage(hwndDlg, IDC_SUB, CB_GETCURSEL, 0, 0) != CB_ERR) { - HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, 16*sizeof(TCHAR)); - if (!hMem) return 0; - TCHAR *lang_id = (TCHAR *)GlobalLock(hMem); - wsprintf(lang_id, _T("%u"), MAKELANGID(primary[SendDlgItemMessage(hwndDlg, IDC_PRIMARY, CB_GETCURSEL, 0, 0)].id, sub[SendDlgItemMessage(hwndDlg, IDC_SUB, CB_GETCURSEL, 0, 0)].id)); - GlobalUnlock(hMem); - if (!OpenClipboard(hwndDlg)) return FALSE; - EmptyClipboard(); -#ifdef _UNICODE - SetClipboardData(CF_UNICODETEXT,hMem); -#else - SetClipboardData(CF_TEXT,hMem); -#endif - CloseClipboard(); - } + break; + + case WM_INITDIALOG: + { + SendMessage(hDlg, WM_SETICON, ICON_BIG, lp); + InitSysLangList(GetDlgItem(hDlg, IDC_SYSLANGLIST)); + InitIntLangList(GetDlgItem(hDlg, IDC_INTLANGLIST)); + hCtl = GetDlgItem(hDlg, IDC_SOURCE); + SendMessage(hCtl, CB_ADDSTRING, 0, (LPARAM) TEXT("System")); + SendMessage(hCtl, CB_ADDSTRING, 0, (LPARAM) TEXT("Internal")); + SendMessage(hCtl, CB_SETCURSEL, 0, 0); // Select "System"... + SendMessage(hDlg, WM_COMMAND, MAKELONG(IDC_SOURCE, CBN_SELCHANGE), (LPARAM) hCtl); // ...and notify + PostMessage(hDlg, WM_NEXTDLGCTL, 0, FALSE); // Switches focus to the 2nd combobox } break; } @@ -305,14 +372,8 @@ NSIS_ENTRYPOINT_GUINOCRT EXTERN_C void NSISWinMainNOCRT() { InitCommonControls(); - - DialogBox( - GetModuleHandle(0), - MAKEINTRESOURCE(IDD_DIALOG), - 0, - DialogProc - ); - + HINSTANCE hInst = GetModuleHandle(0); + HANDLE hIco = LoadImage(hInst, MAKEINTRESOURCE(IDI_ICON), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE|LR_SHARED); + DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_DIALOG), 0, DialogProc, (LPARAM) hIco); ExitProcess(0); } - diff --git a/Contrib/MakeLangId/MakeLangId.ico b/Contrib/MakeLangId/MakeLangId.ico new file mode 100644 index 00000000..e06e94da Binary files /dev/null and b/Contrib/MakeLangId/MakeLangId.ico differ diff --git a/Contrib/MakeLangId/resource.h b/Contrib/MakeLangId/resource.h index 9da740a8..4e3f45e1 100644 --- a/Contrib/MakeLangId/resource.h +++ b/Contrib/MakeLangId/resource.h @@ -4,18 +4,22 @@ // #define IDR_MANIFEST 1 #define IDD_DIALOG 101 -#define IDC_SUB 1001 -#define IDC_PRIMARY 1002 -#define IDC_RESULT 1003 -#define IDC_CODEPAGE 1004 +#define IDI_ICON 102 +#define IDC_SOURCE 1001 +#define IDC_SYSLANGLIST 1002 +#define IDC_INTLANGLIST 1003 +#define IDC_INFO 1004 +#define IDC_LANGID 1005 +#define IDC_CODEPAGE 1006 +#define IDC_COPYHELPER 1007 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 104 +#define _APS_NEXT_RESOURCE_VALUE 103 #define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1005 +#define _APS_NEXT_CONTROL_VALUE 1008 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/Contrib/MakeLangId/resource.rc b/Contrib/MakeLangId/resource.rc index 766448e2..1f3206b0 100644 --- a/Contrib/MakeLangId/resource.rc +++ b/Contrib/MakeLangId/resource.rc @@ -21,64 +21,6 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32 -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_DIALOG DIALOG DISCARDABLE 0, 0, 135, 85 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "MakeLangID" -FONT 8, "MS Sans Serif" -BEGIN - COMBOBOX IDC_PRIMARY,7,7,121,100,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - COMBOBOX IDC_SUB,7,24,121,100,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - DEFPUSHBUTTON "Copy",IDOK,78,64,50,14 - PUSHBUTTON "Exit",IDCANCEL,7,64,50,14 - LTEXT "",IDC_RESULT,7,41,121,8 - LTEXT "",IDC_CODEPAGE,7,51,121,8 -END - -///////////////////////////////////////////////////////////////////////////// -// -// RT_MANIFEST -// - -1 RT_MANIFEST "MakeLangId.xml" - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_DIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 128 - TOPMARGIN, 7 - BOTTOMMARGIN, 78 - END -END -#endif // APSTUDIO_INVOKED - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - -///////////////////////////////////////////////////////////////////////////// -// Unknown language: 0xD, 0x1 resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_HEB) -#ifdef _WIN32 -LANGUAGE 0xD, 0x1 -#pragma code_page(1255) -#endif //_WIN32 - #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // @@ -92,7 +34,7 @@ END 2 TEXTINCLUDE DISCARDABLE BEGIN - "#include ""afxres.h""\r\n" + "#include \r\n" "\0" END @@ -104,8 +46,66 @@ END #endif // APSTUDIO_INVOKED -#endif // Unknown language: 0xD, 0x1 resources + ///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +IDI_ICON ICON "MakeLangId.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_DIALOG DIALOGEX DISCARDABLE 0, 0, 185, 95 +STYLE DS_SETFONT | DS_FIXEDSYS | DS_SETFOREGROUND | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX +CAPTION "MakeLangID" +FONT 8, "MS Shell Dlg" +BEGIN + COMBOBOX IDC_SOURCE, 7, 7, 171, 100, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SYSLANGLIST, 7, 24, 171, 100, CBS_DROPDOWNLIST | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_INTLANGLIST, 7, 24, 171, 100, CBS_DROPDOWNLIST | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + LTEXT "", IDC_INFO, 7, 41, 171, 8 + LTEXT "Language ID:", -1, 7, 51, 45, 8 + CONTROL "", IDC_LANGID, "EDIT", ES_LEFT | ES_READONLY | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 58, 51, 119, 8 + LTEXT "Codepage:", -1, 7, 61, 45, 8 + CONTROL "", IDC_CODEPAGE, "EDIT", ES_LEFT | ES_READONLY | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 58, 61, 119, 8 + DEFPUSHBUTTON "Copy", IDOK, 128, 74, 50, 14 + PUSHBUTTON "Exit", IDCANCEL, 7, 74, 50, 14 + CONTROL "", IDC_COPYHELPER, "EDIT", ES_LEFT | ES_READONLY | WS_CHILD | WS_VISIBLE, 0, 0, 0, 0 +END + +///////////////////////////////////////////////////////////////////////////// +// +// RT_MANIFEST +// + +1 RT_MANIFEST "MakeLangId.xml" + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO DISCARDABLE +BEGIN + IDD_DIALOG, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 178 + TOPMARGIN, 7 + BOTTOMMARGIN, 88 + END +END +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// +