diff --git a/language/common_res.h b/language/common_res.h index 5881fd464..382fe1dae 100644 --- a/language/common_res.h +++ b/language/common_res.h @@ -364,6 +364,22 @@ //#define CMD_LEFT 20054 //#define CMD_RIGHT 20055 +#define IDM_MUI_LANG_EN_US 34500 +#define IDM_MUI_LANG_AF_ZA 34501 +#define IDM_MUI_LANG_BE_BY 34502 +#define IDM_MUI_LANG_DE_DE 34503 +#define IDM_MUI_LANG_EN_GB 34504 +#define IDM_MUI_LANG_ES_ES 34505 +#define IDM_MUI_LANG_FR_FR 34506 +#define IDM_MUI_LANG_HU_HU 34507 +#define IDM_MUI_LANG_IT_IT 34508 +#define IDM_MUI_LANG_JP_JP 34509 +#define IDM_MUI_LANG_KO_KR 34510 +#define IDM_MUI_LANG_NL_NL 34511 +#define IDM_MUI_LANG_PT_BR 34512 +#define IDM_MUI_LANG_RU_RU 34513 +#define IDM_MUI_LANG_ZH_CN 34514 + #define IDM_FILE_NEW 40000 #define IDM_FILE_OPEN 40001 #define IDM_FILE_REVERT 40002 diff --git a/language/np3_af_za/menu_af_za.rc b/language/np3_af_za/menu_af_za.rc index 9a4004323..866819f88 100644 --- a/language/np3_af_za/menu_af_za.rc +++ b/language/np3_af_za/menu_af_za.rc @@ -426,6 +426,24 @@ BEGIN MENUITEM "Maak Stellings Ler &Oop\tCtrl+F7", CMD_OPENINIFILE END END + POPUP "Language" + BEGIN + MENUITEM "English (United States)", IDM_MUI_LANG_EN_US + MENUITEM "Afrikaans (South Africa )", IDM_MUI_LANG_AF_ZA + MENUITEM "Belarusian (Belarus)", IDM_MUI_LANG_BE_BY + MENUITEM "German (Germany)", IDM_MUI_LANG_DE_DE + MENUITEM "English (United Kingdom)", IDM_MUI_LANG_EN_GB + MENUITEM "Spanish (Spain Modern)", IDM_MUI_LANG_ES_ES + MENUITEM "French (France )", IDM_MUI_LANG_FR_FR + MENUITEM "Hungarian (Hungary)", IDM_MUI_LANG_HU_HU + MENUITEM "Italian (Italy)", IDM_MUI_LANG_IT_IT + MENUITEM "Japanese (Japan)", IDM_MUI_LANG_JP_JP + MENUITEM "Korean (Korea)", IDM_MUI_LANG_KO_KR + MENUITEM "Dutch (Netherlands )", IDM_MUI_LANG_NL_NL + MENUITEM "Portuguese (Brazil)", IDM_MUI_LANG_PT_BR + MENUITEM "Russian (Russia)", IDM_MUI_LANG_RU_RU + MENUITEM "Chinese (Hans)", IDM_MUI_LANG_ZH_CN + END POPUP "&Help" BEGIN MENUITEM "Aanlyn &Dokumentasie\tF1", IDM_HELP_ONLINEDOCUMENTATION diff --git a/language/np3_be_by/menu_be_by.rc b/language/np3_be_by/menu_be_by.rc index c0fba8e24..10c75d75a 100644 --- a/language/np3_be_by/menu_be_by.rc +++ b/language/np3_be_by/menu_be_by.rc @@ -426,6 +426,24 @@ BEGIN MENUITEM "& \tCtrl+F7", CMD_OPENINIFILE END END + POPUP "Language" + BEGIN + MENUITEM "English (United States)", IDM_MUI_LANG_EN_US + MENUITEM "Afrikaans (South Africa )", IDM_MUI_LANG_AF_ZA + MENUITEM "Belarusian (Belarus)", IDM_MUI_LANG_BE_BY + MENUITEM "German (Germany)", IDM_MUI_LANG_DE_DE + MENUITEM "English (United Kingdom)", IDM_MUI_LANG_EN_GB + MENUITEM "Spanish (Spain Modern)", IDM_MUI_LANG_ES_ES + MENUITEM "French (France )", IDM_MUI_LANG_FR_FR + MENUITEM "Hungarian (Hungary)", IDM_MUI_LANG_HU_HU + MENUITEM "Italian (Italy)", IDM_MUI_LANG_IT_IT + MENUITEM "Japanese (Japan)", IDM_MUI_LANG_JP_JP + MENUITEM "Korean (Korea)", IDM_MUI_LANG_KO_KR + MENUITEM "Dutch (Netherlands )", IDM_MUI_LANG_NL_NL + MENUITEM "Portuguese (Brazil)", IDM_MUI_LANG_PT_BR + MENUITEM "Russian (Russia)", IDM_MUI_LANG_RU_RU + MENUITEM "Chinese (Hans)", IDM_MUI_LANG_ZH_CN + END POPUP "&" BEGIN MENUITEM "& Online\tF1", IDM_HELP_ONLINEDOCUMENTATION diff --git a/language/np3_de_de/menu_de_de.rc b/language/np3_de_de/menu_de_de.rc index 270d15ed3..3c43e1ad0 100644 --- a/language/np3_de_de/menu_de_de.rc +++ b/language/np3_de_de/menu_de_de.rc @@ -426,6 +426,24 @@ BEGIN MENUITEM "&Einstellungsdatei bearbeiten\tCtrl+F7", CMD_OPENINIFILE END END + POPUP "Sprache" + BEGIN + MENUITEM "English (United States)", IDM_MUI_LANG_EN_US + MENUITEM "Afrikaans (South Africa )", IDM_MUI_LANG_AF_ZA + MENUITEM "Belarusian (Belarus)", IDM_MUI_LANG_BE_BY + MENUITEM "German (Germany)", IDM_MUI_LANG_DE_DE + MENUITEM "English (United Kingdom)", IDM_MUI_LANG_EN_GB + MENUITEM "Spanish (Spain Modern)", IDM_MUI_LANG_ES_ES + MENUITEM "French (France )", IDM_MUI_LANG_FR_FR + MENUITEM "Hungarian (Hungary)", IDM_MUI_LANG_HU_HU + MENUITEM "Italian (Italy)", IDM_MUI_LANG_IT_IT + MENUITEM "Japanese (Japan)", IDM_MUI_LANG_JP_JP + MENUITEM "Korean (Korea)", IDM_MUI_LANG_KO_KR + MENUITEM "Dutch (Netherlands )", IDM_MUI_LANG_NL_NL + MENUITEM "Portuguese (Brazil)", IDM_MUI_LANG_PT_BR + MENUITEM "Russian (Russia)", IDM_MUI_LANG_RU_RU + MENUITEM "Chinese (Hans)", IDM_MUI_LANG_ZH_CN + END POPUP "&Hilfe" BEGIN MENUITEM "&Online Dokumentation\tF1", IDM_HELP_ONLINEDOCUMENTATION diff --git a/language/np3_en_gb/menu_en_gb.rc b/language/np3_en_gb/menu_en_gb.rc index d5f6e43d3..1c5affd6b 100644 --- a/language/np3_en_gb/menu_en_gb.rc +++ b/language/np3_en_gb/menu_en_gb.rc @@ -426,6 +426,24 @@ BEGIN MENUITEM "&Open Settings File\tCtrl+F7", CMD_OPENINIFILE END END + POPUP "Language" + BEGIN + MENUITEM "English (United States)", IDM_MUI_LANG_EN_US + MENUITEM "Afrikaans (South Africa )", IDM_MUI_LANG_AF_ZA + MENUITEM "Belarusian (Belarus)", IDM_MUI_LANG_BE_BY + MENUITEM "German (Germany)", IDM_MUI_LANG_DE_DE + MENUITEM "English (United Kingdom)", IDM_MUI_LANG_EN_GB + MENUITEM "Spanish (Spain Modern)", IDM_MUI_LANG_ES_ES + MENUITEM "French (France )", IDM_MUI_LANG_FR_FR + MENUITEM "Hungarian (Hungary)", IDM_MUI_LANG_HU_HU + MENUITEM "Italian (Italy)", IDM_MUI_LANG_IT_IT + MENUITEM "Japanese (Japan)", IDM_MUI_LANG_JP_JP + MENUITEM "Korean (Korea)", IDM_MUI_LANG_KO_KR + MENUITEM "Dutch (Netherlands )", IDM_MUI_LANG_NL_NL + MENUITEM "Portuguese (Brazil)", IDM_MUI_LANG_PT_BR + MENUITEM "Russian (Russia)", IDM_MUI_LANG_RU_RU + MENUITEM "Chinese (Hans)", IDM_MUI_LANG_ZH_CN + END POPUP "&Help" BEGIN MENUITEM "&Online Documentation\tF1", IDM_HELP_ONLINEDOCUMENTATION diff --git a/language/np3_en_us/menu_en_us.rc b/language/np3_en_us/menu_en_us.rc index dad33b2fe..7cea90493 100644 --- a/language/np3_en_us/menu_en_us.rc +++ b/language/np3_en_us/menu_en_us.rc @@ -426,6 +426,24 @@ BEGIN MENUITEM "&Open Settings File\tCtrl+F7", CMD_OPENINIFILE END END + POPUP "Language" + BEGIN + MENUITEM "English (United States)", IDM_MUI_LANG_EN_US + MENUITEM "Afrikaans (South Africa )", IDM_MUI_LANG_AF_ZA + MENUITEM "Belarusian (Belarus)", IDM_MUI_LANG_BE_BY + MENUITEM "German (Germany)", IDM_MUI_LANG_DE_DE + MENUITEM "English (United Kingdom)", IDM_MUI_LANG_EN_GB + MENUITEM "Spanish (Spain Modern)", IDM_MUI_LANG_ES_ES + MENUITEM "French (France )", IDM_MUI_LANG_FR_FR + MENUITEM "Hungarian (Hungary)", IDM_MUI_LANG_HU_HU + MENUITEM "Italian (Italy)", IDM_MUI_LANG_IT_IT + MENUITEM "Japanese (Japan)", IDM_MUI_LANG_JP_JP + MENUITEM "Korean (Korea)", IDM_MUI_LANG_KO_KR + MENUITEM "Dutch (Netherlands )", IDM_MUI_LANG_NL_NL + MENUITEM "Portuguese (Brazil)", IDM_MUI_LANG_PT_BR + MENUITEM "Russian (Russia)", IDM_MUI_LANG_RU_RU + MENUITEM "Chinese (Hans)", IDM_MUI_LANG_ZH_CN + END POPUP "&Help" BEGIN MENUITEM "&Online Documentation\tF1", IDM_HELP_ONLINEDOCUMENTATION diff --git a/language/np3_es_es/menu_es_es.rc b/language/np3_es_es/menu_es_es.rc index 3ef107b97..bf9744405 100644 --- a/language/np3_es_es/menu_es_es.rc +++ b/language/np3_es_es/menu_es_es.rc @@ -426,6 +426,24 @@ BEGIN MENUITEM "Abrir el archiv&o de configuracin\tCtrl+F7", CMD_OPENINIFILE END END + POPUP "Language" + BEGIN + MENUITEM "English (United States)", IDM_MUI_LANG_EN_US + MENUITEM "Afrikaans (South Africa )", IDM_MUI_LANG_AF_ZA + MENUITEM "Belarusian (Belarus)", IDM_MUI_LANG_BE_BY + MENUITEM "German (Germany)", IDM_MUI_LANG_DE_DE + MENUITEM "English (United Kingdom)", IDM_MUI_LANG_EN_GB + MENUITEM "Spanish (Spain Modern)", IDM_MUI_LANG_ES_ES + MENUITEM "French (France )", IDM_MUI_LANG_FR_FR + MENUITEM "Hungarian (Hungary)", IDM_MUI_LANG_HU_HU + MENUITEM "Italian (Italy)", IDM_MUI_LANG_IT_IT + MENUITEM "Japanese (Japan)", IDM_MUI_LANG_JP_JP + MENUITEM "Korean (Korea)", IDM_MUI_LANG_KO_KR + MENUITEM "Dutch (Netherlands )", IDM_MUI_LANG_NL_NL + MENUITEM "Portuguese (Brazil)", IDM_MUI_LANG_PT_BR + MENUITEM "Russian (Russia)", IDM_MUI_LANG_RU_RU + MENUITEM "Chinese (Hans)", IDM_MUI_LANG_ZH_CN + END POPUP "&Ayuda" BEGIN MENUITEM "D&ocumentacin en lnea\tF1", IDM_HELP_ONLINEDOCUMENTATION diff --git a/language/np3_fr_fr/menu_fr_fr.rc b/language/np3_fr_fr/menu_fr_fr.rc index 1227de34c..d33d0fa3b 100644 --- a/language/np3_fr_fr/menu_fr_fr.rc +++ b/language/np3_fr_fr/menu_fr_fr.rc @@ -426,6 +426,24 @@ BEGIN MENUITEM "&Ouvrir le ficher de configuration\tCtrl+F7", CMD_OPENINIFILE END END + POPUP "Language" + BEGIN + MENUITEM "English (United States)", IDM_MUI_LANG_EN_US + MENUITEM "Afrikaans (South Africa )", IDM_MUI_LANG_AF_ZA + MENUITEM "Belarusian (Belarus)", IDM_MUI_LANG_BE_BY + MENUITEM "German (Germany)", IDM_MUI_LANG_DE_DE + MENUITEM "English (United Kingdom)", IDM_MUI_LANG_EN_GB + MENUITEM "Spanish (Spain Modern)", IDM_MUI_LANG_ES_ES + MENUITEM "French (France )", IDM_MUI_LANG_FR_FR + MENUITEM "Hungarian (Hungary)", IDM_MUI_LANG_HU_HU + MENUITEM "Italian (Italy)", IDM_MUI_LANG_IT_IT + MENUITEM "Japanese (Japan)", IDM_MUI_LANG_JP_JP + MENUITEM "Korean (Korea)", IDM_MUI_LANG_KO_KR + MENUITEM "Dutch (Netherlands )", IDM_MUI_LANG_NL_NL + MENUITEM "Portuguese (Brazil)", IDM_MUI_LANG_PT_BR + MENUITEM "Russian (Russia)", IDM_MUI_LANG_RU_RU + MENUITEM "Chinese (Hans)", IDM_MUI_LANG_ZH_CN + END POPUP "&Aide" BEGIN MENUITEM "Documentation &en ligne\tF1", IDM_HELP_ONLINEDOCUMENTATION diff --git a/language/np3_hu_hu/menu_hu_hu.rc b/language/np3_hu_hu/menu_hu_hu.rc index 91a6bd9d5..bf4b03d65 100644 --- a/language/np3_hu_hu/menu_hu_hu.rc +++ b/language/np3_hu_hu/menu_hu_hu.rc @@ -426,6 +426,24 @@ BEGIN MENUITEM "&Open Settings File\tCtrl+F7", CMD_OPENINIFILE END END + POPUP "Language" + BEGIN + MENUITEM "English (United States)", IDM_MUI_LANG_EN_US + MENUITEM "Afrikaans (South Africa )", IDM_MUI_LANG_AF_ZA + MENUITEM "Belarusian (Belarus)", IDM_MUI_LANG_BE_BY + MENUITEM "German (Germany)", IDM_MUI_LANG_DE_DE + MENUITEM "English (United Kingdom)", IDM_MUI_LANG_EN_GB + MENUITEM "Spanish (Spain Modern)", IDM_MUI_LANG_ES_ES + MENUITEM "French (France )", IDM_MUI_LANG_FR_FR + MENUITEM "Hungarian (Hungary)", IDM_MUI_LANG_HU_HU + MENUITEM "Italian (Italy)", IDM_MUI_LANG_IT_IT + MENUITEM "Japanese (Japan)", IDM_MUI_LANG_JP_JP + MENUITEM "Korean (Korea)", IDM_MUI_LANG_KO_KR + MENUITEM "Dutch (Netherlands )", IDM_MUI_LANG_NL_NL + MENUITEM "Portuguese (Brazil)", IDM_MUI_LANG_PT_BR + MENUITEM "Russian (Russia)", IDM_MUI_LANG_RU_RU + MENUITEM "Chinese (Hans)", IDM_MUI_LANG_ZH_CN + END POPUP "&Help" BEGIN MENUITEM "&Online Documentation\tF1", IDM_HELP_ONLINEDOCUMENTATION diff --git a/language/np3_it_it/menu_it_it.rc b/language/np3_it_it/menu_it_it.rc index 9aee1cc3a..9207be02b 100644 --- a/language/np3_it_it/menu_it_it.rc +++ b/language/np3_it_it/menu_it_it.rc @@ -426,6 +426,24 @@ BEGIN MENUITEM "&Open Settings File\tCtrl+F7", CMD_OPENINIFILE END END + POPUP "Language" + BEGIN + MENUITEM "English (United States)", IDM_MUI_LANG_EN_US + MENUITEM "Afrikaans (South Africa )", IDM_MUI_LANG_AF_ZA + MENUITEM "Belarusian (Belarus)", IDM_MUI_LANG_BE_BY + MENUITEM "German (Germany)", IDM_MUI_LANG_DE_DE + MENUITEM "English (United Kingdom)", IDM_MUI_LANG_EN_GB + MENUITEM "Spanish (Spain Modern)", IDM_MUI_LANG_ES_ES + MENUITEM "French (France )", IDM_MUI_LANG_FR_FR + MENUITEM "Hungarian (Hungary)", IDM_MUI_LANG_HU_HU + MENUITEM "Italian (Italy)", IDM_MUI_LANG_IT_IT + MENUITEM "Japanese (Japan)", IDM_MUI_LANG_JP_JP + MENUITEM "Korean (Korea)", IDM_MUI_LANG_KO_KR + MENUITEM "Dutch (Netherlands )", IDM_MUI_LANG_NL_NL + MENUITEM "Portuguese (Brazil)", IDM_MUI_LANG_PT_BR + MENUITEM "Russian (Russia)", IDM_MUI_LANG_RU_RU + MENUITEM "Chinese (Hans)", IDM_MUI_LANG_ZH_CN + END POPUP "&Help" BEGIN MENUITEM "&Online Documentation\tF1", IDM_HELP_ONLINEDOCUMENTATION diff --git a/language/np3_ja_jp/menu_ja_jp.rc b/language/np3_ja_jp/menu_ja_jp.rc index ce56ee31e..d5d5a7fbd 100644 --- a/language/np3_ja_jp/menu_ja_jp.rc +++ b/language/np3_ja_jp/menu_ja_jp.rc @@ -426,6 +426,24 @@ BEGIN MENUITEM "ݒt@CJ(&O)\tCtrl+F7", CMD_OPENINIFILE END END + POPUP "Language" + BEGIN + MENUITEM "English (United States)", IDM_MUI_LANG_EN_US + MENUITEM "Afrikaans (South Africa )", IDM_MUI_LANG_AF_ZA + MENUITEM "Belarusian (Belarus)", IDM_MUI_LANG_BE_BY + MENUITEM "German (Germany)", IDM_MUI_LANG_DE_DE + MENUITEM "English (United Kingdom)", IDM_MUI_LANG_EN_GB + MENUITEM "Spanish (Spain Modern)", IDM_MUI_LANG_ES_ES + MENUITEM "French (France )", IDM_MUI_LANG_FR_FR + MENUITEM "Hungarian (Hungary)", IDM_MUI_LANG_HU_HU + MENUITEM "Italian (Italy)", IDM_MUI_LANG_IT_IT + MENUITEM "Japanese (Japan)", IDM_MUI_LANG_JP_JP + MENUITEM "Korean (Korea)", IDM_MUI_LANG_KO_KR + MENUITEM "Dutch (Netherlands )", IDM_MUI_LANG_NL_NL + MENUITEM "Portuguese (Brazil)", IDM_MUI_LANG_PT_BR + MENUITEM "Russian (Russia)", IDM_MUI_LANG_RU_RU + MENUITEM "Chinese (Hans)", IDM_MUI_LANG_ZH_CN + END POPUP "wv(&H)" BEGIN MENUITEM "ICwv̕\(p)(&O)\tF1", IDM_HELP_ONLINEDOCUMENTATION diff --git a/language/np3_ko_kr/menu_ko_kr.rc b/language/np3_ko_kr/menu_ko_kr.rc index e81a1b012..ba8ceda27 100644 --- a/language/np3_ko_kr/menu_ko_kr.rc +++ b/language/np3_ko_kr/menu_ko_kr.rc @@ -426,6 +426,24 @@ BEGIN MENUITEM " (&O)\tCtrl+F7", CMD_OPENINIFILE END END + POPUP "Language" + BEGIN + MENUITEM "English (United States)", IDM_MUI_LANG_EN_US + MENUITEM "Afrikaans (South Africa )", IDM_MUI_LANG_AF_ZA + MENUITEM "Belarusian (Belarus)", IDM_MUI_LANG_BE_BY + MENUITEM "German (Germany)", IDM_MUI_LANG_DE_DE + MENUITEM "English (United Kingdom)", IDM_MUI_LANG_EN_GB + MENUITEM "Spanish (Spain Modern)", IDM_MUI_LANG_ES_ES + MENUITEM "French (France )", IDM_MUI_LANG_FR_FR + MENUITEM "Hungarian (Hungary)", IDM_MUI_LANG_HU_HU + MENUITEM "Italian (Italy)", IDM_MUI_LANG_IT_IT + MENUITEM "Japanese (Japan)", IDM_MUI_LANG_JP_JP + MENUITEM "Korean (Korea)", IDM_MUI_LANG_KO_KR + MENUITEM "Dutch (Netherlands )", IDM_MUI_LANG_NL_NL + MENUITEM "Portuguese (Brazil)", IDM_MUI_LANG_PT_BR + MENUITEM "Russian (Russia)", IDM_MUI_LANG_RU_RU + MENUITEM "Chinese (Hans)", IDM_MUI_LANG_ZH_CN + END POPUP "(&H)" BEGIN MENUITEM "¶ (&O)\tF1", IDM_HELP_ONLINEDOCUMENTATION diff --git a/language/np3_nl_nl/menu_nl_nl.rc b/language/np3_nl_nl/menu_nl_nl.rc index 2d68be46a..a7dcf112a 100644 --- a/language/np3_nl_nl/menu_nl_nl.rc +++ b/language/np3_nl_nl/menu_nl_nl.rc @@ -426,6 +426,24 @@ BEGIN MENUITEM "&Open het configuratie bestand\tCtrl+F7", CMD_OPENINIFILE END END + POPUP "Language" + BEGIN + MENUITEM "English (United States)", IDM_MUI_LANG_EN_US + MENUITEM "Afrikaans (South Africa )", IDM_MUI_LANG_AF_ZA + MENUITEM "Belarusian (Belarus)", IDM_MUI_LANG_BE_BY + MENUITEM "German (Germany)", IDM_MUI_LANG_DE_DE + MENUITEM "English (United Kingdom)", IDM_MUI_LANG_EN_GB + MENUITEM "Spanish (Spain Modern)", IDM_MUI_LANG_ES_ES + MENUITEM "French (France )", IDM_MUI_LANG_FR_FR + MENUITEM "Hungarian (Hungary)", IDM_MUI_LANG_HU_HU + MENUITEM "Italian (Italy)", IDM_MUI_LANG_IT_IT + MENUITEM "Japanese (Japan)", IDM_MUI_LANG_JP_JP + MENUITEM "Korean (Korea)", IDM_MUI_LANG_KO_KR + MENUITEM "Dutch (Netherlands )", IDM_MUI_LANG_NL_NL + MENUITEM "Portuguese (Brazil)", IDM_MUI_LANG_PT_BR + MENUITEM "Russian (Russia)", IDM_MUI_LANG_RU_RU + MENUITEM "Chinese (Hans)", IDM_MUI_LANG_ZH_CN + END POPUP "&Help" BEGIN MENUITEM "&Online documentatie\tF1", IDM_HELP_ONLINEDOCUMENTATION diff --git a/language/np3_pt_br/menu_pt_br.rc b/language/np3_pt_br/menu_pt_br.rc index fc96512cd..57a1bb4ff 100644 --- a/language/np3_pt_br/menu_pt_br.rc +++ b/language/np3_pt_br/menu_pt_br.rc @@ -426,6 +426,24 @@ BEGIN MENUITEM "&Open Settings File\tCtrl+F7", CMD_OPENINIFILE END END + POPUP "Language" + BEGIN + MENUITEM "English (United States)", IDM_MUI_LANG_EN_US + MENUITEM "Afrikaans (South Africa )", IDM_MUI_LANG_AF_ZA + MENUITEM "Belarusian (Belarus)", IDM_MUI_LANG_BE_BY + MENUITEM "German (Germany)", IDM_MUI_LANG_DE_DE + MENUITEM "English (United Kingdom)", IDM_MUI_LANG_EN_GB + MENUITEM "Spanish (Spain Modern)", IDM_MUI_LANG_ES_ES + MENUITEM "French (France )", IDM_MUI_LANG_FR_FR + MENUITEM "Hungarian (Hungary)", IDM_MUI_LANG_HU_HU + MENUITEM "Italian (Italy)", IDM_MUI_LANG_IT_IT + MENUITEM "Japanese (Japan)", IDM_MUI_LANG_JP_JP + MENUITEM "Korean (Korea)", IDM_MUI_LANG_KO_KR + MENUITEM "Dutch (Netherlands )", IDM_MUI_LANG_NL_NL + MENUITEM "Portuguese (Brazil)", IDM_MUI_LANG_PT_BR + MENUITEM "Russian (Russia)", IDM_MUI_LANG_RU_RU + MENUITEM "Chinese (Hans)", IDM_MUI_LANG_ZH_CN + END POPUP "&Help" BEGIN MENUITEM "&Online Documentation\tF1", IDM_HELP_ONLINEDOCUMENTATION diff --git a/language/np3_ru_ru/menu_ru_ru.rc b/language/np3_ru_ru/menu_ru_ru.rc index d1f45ad44..960c0eaaf 100644 --- a/language/np3_ru_ru/menu_ru_ru.rc +++ b/language/np3_ru_ru/menu_ru_ru.rc @@ -426,6 +426,24 @@ BEGIN MENUITEM "& \tCtrl+F7", CMD_OPENINIFILE END END + POPUP "Language" + BEGIN + MENUITEM "English (United States)", IDM_MUI_LANG_EN_US + MENUITEM "Afrikaans (South Africa )", IDM_MUI_LANG_AF_ZA + MENUITEM "Belarusian (Belarus)", IDM_MUI_LANG_BE_BY + MENUITEM "German (Germany)", IDM_MUI_LANG_DE_DE + MENUITEM "English (United Kingdom)", IDM_MUI_LANG_EN_GB + MENUITEM "Spanish (Spain Modern)", IDM_MUI_LANG_ES_ES + MENUITEM "French (France )", IDM_MUI_LANG_FR_FR + MENUITEM "Hungarian (Hungary)", IDM_MUI_LANG_HU_HU + MENUITEM "Italian (Italy)", IDM_MUI_LANG_IT_IT + MENUITEM "Japanese (Japan)", IDM_MUI_LANG_JP_JP + MENUITEM "Korean (Korea)", IDM_MUI_LANG_KO_KR + MENUITEM "Dutch (Netherlands )", IDM_MUI_LANG_NL_NL + MENUITEM "Portuguese (Brazil)", IDM_MUI_LANG_PT_BR + MENUITEM "Russian (Russia)", IDM_MUI_LANG_RU_RU + MENUITEM "Chinese (Hans)", IDM_MUI_LANG_ZH_CN + END POPUP "&" BEGIN MENUITEM "& Online\tF1", IDM_HELP_ONLINEDOCUMENTATION diff --git a/language/np3_zh_cn/menu_zh_cn.rc b/language/np3_zh_cn/menu_zh_cn.rc index 3dedace20..6e36c4f3e 100644 --- a/language/np3_zh_cn/menu_zh_cn.rc +++ b/language/np3_zh_cn/menu_zh_cn.rc @@ -426,6 +426,24 @@ BEGIN MENUITEM "ļ(&O)\tCtrl+F7", CMD_OPENINIFILE END END + POPUP "Language" + BEGIN + MENUITEM "English (United States)", IDM_MUI_LANG_EN_US + MENUITEM "Afrikaans (South Africa )", IDM_MUI_LANG_AF_ZA + MENUITEM "Belarusian (Belarus)", IDM_MUI_LANG_BE_BY + MENUITEM "German (Germany)", IDM_MUI_LANG_DE_DE + MENUITEM "English (United Kingdom)", IDM_MUI_LANG_EN_GB + MENUITEM "Spanish (Spain Modern)", IDM_MUI_LANG_ES_ES + MENUITEM "French (France )", IDM_MUI_LANG_FR_FR + MENUITEM "Hungarian (Hungary)", IDM_MUI_LANG_HU_HU + MENUITEM "Italian (Italy)", IDM_MUI_LANG_IT_IT + MENUITEM "Japanese (Japan)", IDM_MUI_LANG_JP_JP + MENUITEM "Korean (Korea)", IDM_MUI_LANG_KO_KR + MENUITEM "Dutch (Netherlands )", IDM_MUI_LANG_NL_NL + MENUITEM "Portuguese (Brazil)", IDM_MUI_LANG_PT_BR + MENUITEM "Russian (Russia)", IDM_MUI_LANG_RU_RU + MENUITEM "Chinese (Hans)", IDM_MUI_LANG_ZH_CN + END POPUP "(&H)" BEGIN MENUITEM "ĵ(&O)\tF1", IDM_HELP_ONLINEDOCUMENTATION diff --git a/src/Dialogs.c b/src/Dialogs.c index 2c5582a10..72ef829a5 100644 --- a/src/Dialogs.c +++ b/src/Dialogs.c @@ -12,19 +12,8 @@ * * * * *******************************************************************************/ -#if !defined(WINVER) -#define WINVER 0x601 /*_WIN32_WINNT_WIN7*/ -#endif -#if !defined(_WIN32_WINNT) -#define _WIN32_WINNT 0x601 /*_WIN32_WINNT_WIN7*/ -#endif -#if !defined(NTDDI_VERSION) -#define NTDDI_VERSION 0x06010000 /*NTDDI_WIN7*/ -#endif -#define VC_EXTRALEAN 1 -#define WIN32_LEAN_AND_MEAN 1 -#define NOMINMAX 1 -#include +#include "Helpers.h" + #include #include #include @@ -43,9 +32,9 @@ #include "Dlapi.h" #include "resource.h" #include "Version.h" -#include "Helpers.h" #include "Encoding.h" -#include "TypeDefs.h" +#include "MuiLanguage.h" + #include "SciCall.h" #include "Dialogs.h" diff --git a/src/Dlapi.c b/src/Dlapi.c index 74ddb2a13..8b5524fe3 100644 --- a/src/Dlapi.c +++ b/src/Dlapi.c @@ -12,25 +12,14 @@ * * * * *******************************************************************************/ -#if !defined(WINVER) -#define WINVER 0x601 /*_WIN32_WINNT_WIN7*/ -#endif -#if !defined(_WIN32_WINNT) -#define _WIN32_WINNT 0x601 /*_WIN32_WINNT_WIN7*/ -#endif -#if !defined(NTDDI_VERSION) -#define NTDDI_VERSION 0x06010000 /*NTDDI_WIN7*/ -#endif -#define VC_EXTRALEAN 1 -#define WIN32_LEAN_AND_MEAN 1 -#define NOMINMAX 1 -#include +#include "Helpers.h" + #include #include #include #include #include -#include "Helpers.h" + #include "Dlapi.h" diff --git a/src/Edit.c b/src/Edit.c index f23e97f2c..a79b668d0 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -13,20 +13,8 @@ * * *******************************************************************************/ -#if !defined(WINVER) -#define WINVER 0x601 /*_WIN32_WINNT_WIN7*/ -#endif -#if !defined(_WIN32_WINNT) -#define _WIN32_WINNT 0x601 /*_WIN32_WINNT_WIN7*/ -#endif -#if !defined(NTDDI_VERSION) -#define NTDDI_VERSION 0x06010000 /*NTDDI_WIN7*/ -#endif +#include "Helpers.h" -#define VC_EXTRALEAN 1 -#define WIN32_LEAN_AND_MEAN 1 -#define NOMINMAX 1 -#include #include #include #include @@ -46,9 +34,8 @@ //#include "../uthash/utstring.h" #include "../tinyexpr/tinyexpr.h" -#include "Helpers.h" #include "Encoding.h" -#include "TypeDefs.h" +#include "MuiLanguage.h" #include "SciCall.h" #include "SciLexer.h" diff --git a/src/Encoding.c b/src/Encoding.c index 12a8495b5..2db36219d 100644 --- a/src/Encoding.c +++ b/src/Encoding.c @@ -15,19 +15,8 @@ * * *******************************************************************************/ -#if !defined(WINVER) -#define WINVER 0x601 /*_WIN32_WINNT_WIN7*/ -#endif -#if !defined(_WIN32_WINNT) -#define _WIN32_WINNT 0x601 /*_WIN32_WINNT_WIN7*/ -#endif -#if !defined(NTDDI_VERSION) -#define NTDDI_VERSION 0x06010000 /*NTDDI_WIN7*/ -#endif -#define VC_EXTRALEAN 1 -#define WIN32_LEAN_AND_MEAN 1 -#define NOMINMAX 1 -#include +#include "Helpers.h" + #include #include #include @@ -35,10 +24,12 @@ #include "../uthash/utarray.h" -#include "Scintilla.h" -#include "Helpers.h" #include "resource.h" #include "Encoding.h" +#include "MuiLanguage.h" + +#include "Scintilla.h" + //============================================================================= // diff --git a/src/Helpers.c b/src/Helpers.c index 7f8af3922..24f10dfb0 100644 --- a/src/Helpers.c +++ b/src/Helpers.c @@ -15,30 +15,20 @@ * * *******************************************************************************/ -#if !defined(WINVER) -#define WINVER 0x601 /*_WIN32_WINNT_WIN7*/ -#endif -#if !defined(_WIN32_WINNT) -#define _WIN32_WINNT 0x601 /*_WIN32_WINNT_WIN7*/ -#endif -#if !defined(NTDDI_VERSION) -#define NTDDI_VERSION 0x06010000 /*NTDDI_WIN7*/ -#endif -#define VC_EXTRALEAN 1 -#define WIN32_LEAN_AND_MEAN 1 -#define NOMINMAX 1 -#include +#include "Helpers.h" + //#include #include #include //#include -#include "Scintilla.h" + #include "resource.h" #include "Edit.h" #include "Encoding.h" +#include "MuiLanguage.h" #include "Notepad3.h" -#include "Helpers.h" +#include "Scintilla.h" //============================================================================= @@ -676,75 +666,6 @@ bool IsCmdEnabled(HWND hwnd,UINT uId) return (!(ustate & (MF_GRAYED|MF_DISABLED))); } -//============================================================================= -// -// LoadLngStringW() -// -int LoadLngStringW(UINT uID, LPWSTR lpBuffer, int nBufferMax) -{ - const int nLen = LoadStringW(Globals.hLngResContainer, uID, lpBuffer, nBufferMax); - return (nLen != 0) ? nLen : LoadStringW(Globals.hInstance, uID, lpBuffer, nBufferMax); -} - -//============================================================================= -// -// LoadLngStringW2MB() -// -static WCHAR s_tmpStringBuffer[512]; - -int LoadLngStringW2MB(UINT uID, LPSTR lpBuffer, int nBufferMax) -{ - const int nLen = LoadStringW(Globals.hLngResContainer, uID, s_tmpStringBuffer, COUNTOF(s_tmpStringBuffer)); - if (nLen == 0) { LoadStringW(Globals.hInstance, uID, s_tmpStringBuffer, COUNTOF(s_tmpStringBuffer)); } - return WideCharToMultiByte(CP_UTF8, 0, s_tmpStringBuffer, -1, lpBuffer, nBufferMax, NULL, NULL); -} - -//============================================================================= -// -// LoadLngStringA() -// -int LoadLngStringA(UINT uID, LPSTR lpBuffer, int nBufferMax) -{ - const int nLen = LoadStringA(Globals.hLngResContainer, uID, lpBuffer, nBufferMax); - return (nLen != 0) ? nLen : LoadStringA(Globals.hInstance, uID, lpBuffer, nBufferMax); -} - - -//============================================================================= -// -// FormatLngStringW() -// -int FormatLngStringW(LPWSTR lpOutput, int nOutput, UINT uIdFormat, ...) -{ - WCHAR* pBuffer = AllocMem(sizeof(WCHAR)*nOutput, HEAP_ZERO_MEMORY); - if (pBuffer) { - if (LoadLngStringW(uIdFormat, pBuffer, nOutput)) { - StringCchVPrintfW(lpOutput, nOutput, pBuffer, (LPVOID)((PUINT_PTR)&uIdFormat + 1)); - } - FreeMem(pBuffer); - return (int)StringCchLenW(lpOutput, nOutput); - } - return 0; -} - -//============================================================================= -// -// FormatLngStringA() -// -int FormatLngStringA(LPSTR lpOutput, int nOutput, UINT uIdFormat, ...) -{ - CHAR* pBuffer = AllocMem(sizeof(CHAR)*nOutput, HEAP_ZERO_MEMORY); - if (pBuffer) { - if (LoadLngStringA(uIdFormat, pBuffer, nOutput)) { - StringCchVPrintfA(lpOutput, nOutput, pBuffer, (LPVOID)((PUINT_PTR)&uIdFormat + 1)); - } - FreeMem(pBuffer); - return (int)StringCchLenA(lpOutput, nOutput); - } - return 0; -} - - //============================================================================= // // GetKnownFolderPath() @@ -764,7 +685,6 @@ bool GetKnownFolderPath(REFKNOWNFOLDERID rfid, LPWSTR lpOutPath, size_t cchCount return false; } - //============================================================================= // // PathRelativeToApp() diff --git a/src/Helpers.h b/src/Helpers.h index 40c909dd8..dd0bbccf6 100644 --- a/src/Helpers.h +++ b/src/Helpers.h @@ -19,13 +19,12 @@ #define STRSAFE_NO_CB_FUNCTIONS #define STRSAFE_NO_DEPRECATE // don't allow deprecated functions +#include "TypeDefs.h" + #include -#include #include #include -#include "TypeDefs.h" - // ============================================================================ // --- Disable/Enable some CodeAnalysis Warnings --- @@ -262,17 +261,6 @@ bool IsCmdEnabled(HWND hwnd, UINT uId); if (GetFocus() == hctrl) { SendMessage((hdlg), WM_NEXTDLGCTL, 0, false); } }; EnableWindow(hctrl, (b)); } -int LoadLngStringW(UINT uID, LPWSTR lpBuffer, int nBufferMax); -int LoadLngStringA(UINT uID, LPSTR lpBuffer, int nBufferMax); -int FormatLngStringW(LPWSTR lpOutput, int nOutput, UINT uIdFormat, ...); -int FormatLngStringA(LPSTR lpOutput, int nOutput, UINT uIdFormat, ...); -int LoadLngStringW2MB(UINT uID, LPSTR lpBuffer, int nBufferMax); - -#define GetLngString(id,pb,cb) LoadLngStringW((id),(pb),(cb)) -#define GetLngStringA(id,pb,cb) LoadLngStringA((id),(pb),(cb)) -#define GetLngStringW2MB(id,pb,cb) LoadLngStringW2MB((id),(pb),(cb)) - - bool GetKnownFolderPath(REFKNOWNFOLDERID, LPWSTR lpOutPath, size_t cchCount); void PathRelativeToApp(LPWSTR lpszSrc,LPWSTR lpszDest,int cchDest,bool,bool,bool); void PathAbsoluteFromApp(LPWSTR lpszSrc,LPWSTR lpszDest,int cchDest,bool); diff --git a/src/MuiLanguage.c b/src/MuiLanguage.c new file mode 100644 index 000000000..e3bdd3787 --- /dev/null +++ b/src/MuiLanguage.c @@ -0,0 +1,354 @@ +/****************************************************************************** +* * +* * +* Notepad3 * +* * +* MuiLanguage.c * +* General MUI Language support functions * +* * +* (c) Rizonesoft 2008-2019 * +* https://rizonesoft.com * +* * +* * +*******************************************************************************/ + +#include "Helpers.h" + +#include + +#include "resource.h" +#include "Encoding.h" +#include "MuiLanguage.h" + +//============================================================================= + +MUILANGUAGE MUI_LanguageDLLs[NUM_OF_MUI_LANGUAGES] = +{ + { IDM_MUI_LANG_EN_US, L"en-US", MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), true, false }, // internal - must be 1st + // + { IDM_MUI_LANG_AF_ZA, L"af-ZA", MAKELANGID(LANG_AFRIKAANS, SUBLANG_AFRIKAANS_SOUTH_AFRICA), false, false }, + { IDM_MUI_LANG_BE_BY, L"be-BY", MAKELANGID(LANG_BELARUSIAN, SUBLANG_BELARUSIAN_BELARUS), false, false }, + { IDM_MUI_LANG_DE_DE, L"de-DE", MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN), false, false }, + { IDM_MUI_LANG_EN_GB, L"en-GB", MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK), false, false }, + { IDM_MUI_LANG_ES_ES, L"es-ES", MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MODERN), false, false }, + { IDM_MUI_LANG_FR_FR, L"fr-FR", MAKELANGID(LANG_FRENCH, SUBLANG_FRENCH), false, false }, + { IDM_MUI_LANG_HU_HU, L"hu-HU", MAKELANGID(LANG_HUNGARIAN, SUBLANG_HUNGARIAN_HUNGARY), false, false }, + { IDM_MUI_LANG_IT_IT, L"it-IT", MAKELANGID(LANG_ITALIAN, SUBLANG_ITALIAN), false, false }, + { IDM_MUI_LANG_JP_JP, L"ja-JP", MAKELANGID(LANG_JAPANESE, SUBLANG_JAPANESE_JAPAN), false, false }, + { IDM_MUI_LANG_KO_KR, L"ko-KR", MAKELANGID(LANG_KOREAN, SUBLANG_KOREAN), false, false }, + { IDM_MUI_LANG_NL_NL, L"nl-NL", MAKELANGID(LANG_DUTCH, SUBLANG_DUTCH), false, false }, + { IDM_MUI_LANG_PT_BR, L"pt-BR", MAKELANGID(LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN), false, false }, + { IDM_MUI_LANG_RU_RU, L"ru-RU", MAKELANGID(LANG_RUSSIAN, SUBLANG_RUSSIAN_RUSSIA), false, false }, + { IDM_MUI_LANG_ZH_CN, L"zh-CN", MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), false, false} +}; + + + +//============================================================================= +// +// CheckAvailableLanguages +// +// +static void _CheckAvailableLanguageDLLs() +{ + WCHAR wchRelPath[MAX_PATH]; + WCHAR wchAbsPath[MAX_PATH]; + + for (int i = 1; i < NUM_OF_MUI_LANGUAGES; ++i) + { + if (IsValidLocaleName(MUI_LanguageDLLs[i].szLocaleName)) + { + //WCHAR wchLngLocalName[LOCALE_NAME_MAX_LENGTH]; + //if (ResolveLocaleName(MUI_LanguageDLLs[i].szLocaleName, wchLngLocalName, LOCALE_NAME_MAX_LENGTH)) { + // StringCchCopy(MUI_LanguageDLLs[i].szLocaleName, COUNTOF(MUI_LanguageDLLs[i].szLocaleName), wchLngLocalName); // put back resolved name + //} + + // get LANGID + GetLocaleInfoEx(MUI_LanguageDLLs[i].szLocaleName, LOCALE_ILANGUAGE | LOCALE_RETURN_NUMBER, (LPWSTR)&(MUI_LanguageDLLs[i].LangId), sizeof(LANGID)); + + // check for DLL + StringCchPrintf(wchRelPath, COUNTOF(wchRelPath), L"lng/%s/np3lng.dll.mui", MUI_LanguageDLLs[i].szLocaleName); + PathAbsoluteFromApp(wchRelPath, wchAbsPath, COUNTOF(wchAbsPath), false); + MUI_LanguageDLLs[i].bHasDLL = PathFileExists(wchAbsPath); + } + } +} + + +//============================================================================= +// +// _LngStrToMultiLngStr +// +// +static bool _LngStrToMultiLngStr(WCHAR* pLngStr, WCHAR* pLngMultiStr, size_t lngMultiStrSize) +{ + bool rtnVal = true; + + size_t strLen = StringCchLenW(pLngStr, 0); + + if ((strLen > 0) && pLngMultiStr && (lngMultiStrSize > 0)) { + WCHAR* lngMultiStrPtr = pLngMultiStr; + WCHAR* last = pLngStr + (Has_UTF16_LE_BOM((char*)pLngStr, clampi((int)strLen, 0, 8)) ? 1 : 0); + while (last && rtnVal) { + // make sure you validate the user input + WCHAR* next = StrNextTok(last, L",; :"); + if (next) { *next = L'\0'; } + strLen = StringCchLenW(last, LOCALE_NAME_MAX_LENGTH); + if (strLen && IsValidLocaleName(last)) { + lngMultiStrPtr[0] = L'\0'; + rtnVal &= SUCCEEDED(StringCchCatW(lngMultiStrPtr, (lngMultiStrSize - (lngMultiStrPtr - pLngMultiStr)), last)); + lngMultiStrPtr += strLen + 1; + } + last = (next ? next + 1 : next); + } + if (rtnVal && (lngMultiStrSize - (lngMultiStrPtr - pLngMultiStr))) // make sure there is a double null term for the multi-string + { + lngMultiStrPtr[0] = L'\0'; + } + else // fail and guard anyone whom might use the multi-string + { + lngMultiStrPtr[0] = L'\0'; + lngMultiStrPtr[1] = L'\0'; + } + } + return rtnVal; +} + + + +//============================================================================= +// +// _GetUserPreferredLanguage +// +// +static bool _GetUserPreferredLanguage(LPWSTR pszPrefLocaleName, int cchBuffer, LANGID* pLangID) +{ + int res = 0; + LANGID lngID = *pLangID; + WCHAR wchLngLocalName[LOCALE_NAME_MAX_LENGTH+1]; + + if (StringCchLen(pszPrefLocaleName, cchBuffer) > 0) + { + res = ResolveLocaleName(pszPrefLocaleName, wchLngLocalName, COUNTOF(wchLngLocalName)); + if (res > 0) { + // get LANGID + DWORD value; + res = GetLocaleInfoEx(wchLngLocalName, LOCALE_ILANGUAGE | LOCALE_RETURN_NUMBER, (LPWSTR)&value, sizeof(value) / sizeof(WCHAR)); + if (res > 0) { + lngID = (LANGID)value; + } + } + } + + if (res == 0) // No preferred language defined or retrievable, try to get User UI Language + { + //~GetUserDefaultLocaleName(pszPrefLocaleName, cchBuffer); + ULONG numLngs = 0; + DWORD cchLngsBuffer = 0; + BOOL hr = GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, &numLngs, NULL, &cchLngsBuffer); + if (hr) { + WCHAR* pwszLngsBuffer = AllocMem((cchLngsBuffer + 2) * sizeof(WCHAR), HEAP_ZERO_MEMORY); + if (pwszLngsBuffer) { + hr = GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, &numLngs, pwszLngsBuffer, &cchLngsBuffer); + if (hr && (numLngs > 0)) { + // get the first + StringCchCopy(wchLngLocalName, COUNTOF(wchLngLocalName), pwszLngsBuffer); + lngID = LANGIDFROMLCID(LocaleNameToLCID(wchLngLocalName, 0)); + res = 1; + } + FreeMem(pwszLngsBuffer); + } + } + if (res == 0) { // last try + lngID = GetUserDefaultUILanguage(); + LCID const lcid = MAKELCID(lngID, SORT_DEFAULT); + res = LCIDToLocaleName(lcid, wchLngLocalName, COUNTOF(wchLngLocalName), 0); + } + } + if (res != 0) { + *pLangID = lngID; + StringCchCopy(pszPrefLocaleName, cchBuffer, wchLngLocalName); + return true; + } + return false; +} + + + +//============================================================================= +// +// LoadLanguageResources +// +// +HMODULE LoadLanguageResources(LANGID* pPrefLanguageID) +{ + // 1st check language resources + _CheckAvailableLanguageDLLs(); + + LANGID languageID = MUI_LanguageDLLs[0].LangId; + + WCHAR wchLngLocalName[LOCALE_NAME_MAX_LENGTH]; + StringCchCopy(wchLngLocalName, COUNTOF(wchLngLocalName), Settings2.PreferredLanguageLocaleName); + + if (_GetUserPreferredLanguage(wchLngLocalName, COUNTOF(wchLngLocalName), &languageID)) { + // push-back (corrected) name found + StringCchCopy(Settings2.PreferredLanguageLocaleName, COUNTOF(Settings2.PreferredLanguageLocaleName), wchLngLocalName); + } + + // set the appropriate fallback list + int iPrefLngIndex = -1; + WCHAR tchAvailLngs[2 * (LOCALE_NAME_MAX_LENGTH + 1)] = { L'\0' }; + for (int lng = 0; lng < NUM_OF_MUI_LANGUAGES; ++lng) { + if (StringCchCompareXIW(MUI_LanguageDLLs[lng].szLocaleName, Settings2.PreferredLanguageLocaleName) == 0) { + if (MUI_LanguageDLLs[lng].bHasDLL && (lng > 0)) { + StringCchCatW(tchAvailLngs, COUNTOF(tchAvailLngs), MUI_LanguageDLLs[lng].szLocaleName); + StringCchCatW(tchAvailLngs, COUNTOF(tchAvailLngs), L" "); + } + iPrefLngIndex = lng; + break; + } + } + StringCchCatW(tchAvailLngs, COUNTOF(tchAvailLngs), MUI_LanguageDLLs[0].szLocaleName); // en-US + + // NOTES: + // an application developer that makes the assumption the fallback list provided by the + // system / OS is entirely sufficient may or may not be making a good assumption based mostly on: + // A. your choice of languages installed with your application + // B. the languages on the OS at application install time + // C. the OS users propensity to install/uninstall language packs + // D. the OS users propensity to change language settings + + bool bFallbackOK = true; + WCHAR tchUserLangMultiStrg[LARGE_BUFFER] = { L'\0' }; + if (!_LngStrToMultiLngStr(tchAvailLngs, tchUserLangMultiStrg, COUNTOF(tchUserLangMultiStrg))) + { + GetLastErrorToMsgBox(L"_LngStrToMultiLngStr()", ERROR_MUI_INVALID_LOCALE_NAME); + bFallbackOK = false; + } + DWORD langCount = 0; + // using SetProcessPreferredUILanguages is recommended for new applications (esp. multi-threaded applications) + if (!SetThreadPreferredUILanguages(MUI_LANGUAGE_NAME, tchUserLangMultiStrg, &langCount) || (langCount == 0)) + { + GetLastErrorToMsgBox(L"SetProcessPreferredUILanguages()", 0); + bFallbackOK = false; + } + + // obtains access to the proper resource container + // for standard Win32 resource loading this is normally a PE module - use LoadLibraryEx + + HMODULE hLangResourceContainer = NULL; + Globals.bPrefLngNotAvail = (iPrefLngIndex < 0); + + if ((iPrefLngIndex >= 0) && MUI_LanguageDLLs[iPrefLngIndex].bHasDLL) { + hLangResourceContainer = (0 == iPrefLngIndex) ? Globals.hInstance : + LoadMUILibrary(L"lng/np3lng.dll", MUI_LANGUAGE_NAME | MUI_LANGUAGE_EXACT, languageID); + MUI_LanguageDLLs[iPrefLngIndex].bIsLoaded = true; + } + + if (!hLangResourceContainer) { + // fallback to ENGLISH_US + Globals.bPrefLngNotAvail = (languageID != MUI_LanguageDLLs[0].LangId); + languageID = MUI_LanguageDLLs[0].LangId; + hLangResourceContainer = Globals.hInstance; + MUI_LanguageDLLs[0].bIsLoaded = true; + } + + SetThreadUILanguage(languageID); + + *pPrefLanguageID = languageID; + return hLangResourceContainer; +} + + +//============================================================================= +// +// FreeLanguageResources +// +// +void FreeLanguageResources(HMODULE hLangResourceContainer) +{ + if (hLangResourceContainer) { + if (hLangResourceContainer != Globals.hInstance) { + FreeMUILibrary(hLangResourceContainer); + } + } + for (int i = 0; i < NUM_OF_MUI_LANGUAGES; ++i) { + MUI_LanguageDLLs[i].bIsLoaded = false; + } +} + + +//============================================================================= +// +// LoadLngStringW() +// +int LoadLngStringW(UINT uID, LPWSTR lpBuffer, int nBufferMax) +{ + const int nLen = LoadStringW(Globals.hLngResContainer, uID, lpBuffer, nBufferMax); + return (nLen != 0) ? nLen : LoadStringW(Globals.hInstance, uID, lpBuffer, nBufferMax); +} + +//============================================================================= +// +// LoadLngStringW2MB() +// +static WCHAR s_tmpStringBuffer[512]; + +int LoadLngStringW2MB(UINT uID, LPSTR lpBuffer, int nBufferMax) +{ + const int nLen = LoadStringW(Globals.hLngResContainer, uID, s_tmpStringBuffer, COUNTOF(s_tmpStringBuffer)); + if (nLen == 0) { LoadStringW(Globals.hInstance, uID, s_tmpStringBuffer, COUNTOF(s_tmpStringBuffer)); } + return WideCharToMultiByte(CP_UTF8, 0, s_tmpStringBuffer, -1, lpBuffer, nBufferMax, NULL, NULL); +} + +//============================================================================= +// +// LoadLngStringA() +// +int LoadLngStringA(UINT uID, LPSTR lpBuffer, int nBufferMax) +{ + const int nLen = LoadStringA(Globals.hLngResContainer, uID, lpBuffer, nBufferMax); + return (nLen != 0) ? nLen : LoadStringA(Globals.hInstance, uID, lpBuffer, nBufferMax); +} + + +//============================================================================= +// +// FormatLngStringW() +// +int FormatLngStringW(LPWSTR lpOutput, int nOutput, UINT uIdFormat, ...) +{ + WCHAR* pBuffer = AllocMem(sizeof(WCHAR) * nOutput, HEAP_ZERO_MEMORY); + if (pBuffer) { + if (LoadLngStringW(uIdFormat, pBuffer, nOutput)) { + StringCchVPrintfW(lpOutput, nOutput, pBuffer, (LPVOID)((PUINT_PTR)& uIdFormat + 1)); + } + FreeMem(pBuffer); + return (int)StringCchLenW(lpOutput, nOutput); + } + return 0; +} + +//============================================================================= +// +// FormatLngStringA() +// +int FormatLngStringA(LPSTR lpOutput, int nOutput, UINT uIdFormat, ...) +{ + CHAR* pBuffer = AllocMem(sizeof(CHAR) * nOutput, HEAP_ZERO_MEMORY); + if (pBuffer) { + if (LoadLngStringA(uIdFormat, pBuffer, nOutput)) { + StringCchVPrintfA(lpOutput, nOutput, pBuffer, (LPVOID)((PUINT_PTR)& uIdFormat + 1)); + } + FreeMem(pBuffer); + return (int)StringCchLenA(lpOutput, nOutput); + } + return 0; +} + + + + +//============================================================================= + +/// End of MuiLanguage.c /// diff --git a/src/MuiLanguage.h b/src/MuiLanguage.h new file mode 100644 index 000000000..e2bdd95cc --- /dev/null +++ b/src/MuiLanguage.h @@ -0,0 +1,53 @@ +/****************************************************************************** +* * +* * +* Notepad3 * +* * +* MuiLanguage.h * +* Definitions for MUI Language support * +* Based on code from Notepad2, (c) Florian Balmer 1996-2011 * +* * +* (c) Rizonesoft 2008-2019 * +* https://rizonesoft.com * +* * +* * +*******************************************************************************/ +#pragma once +#ifndef _NP3_MUI_LANGUAGE_H_ +#define _NP3_MUI_LANGUAGE_H_ + + +typedef struct _muilanguage +{ + UINT rid; + WCHAR szLocaleName[LOCALE_NAME_MAX_LENGTH]; + // !!! WARNING: LCID is DEPRECATED + LANGID LangId; // just for historic reasons + bool bHasDLL; + bool bIsLoaded; + +} MUILANGUAGE, *PMUILANGUAGE; + + +#define NUM_OF_MUI_LANGUAGES 15 +extern MUILANGUAGE MUI_LanguageDLLs[]; + + +HMODULE LoadLanguageResources(LANGID* pPrefLanguageID); +void FreeLanguageResources(HMODULE hLangResourceContainer); + +int LoadLngStringW(UINT uID, LPWSTR lpBuffer, int nBufferMax); +int LoadLngStringA(UINT uID, LPSTR lpBuffer, int nBufferMax); +int FormatLngStringW(LPWSTR lpOutput, int nOutput, UINT uIdFormat, ...); +int FormatLngStringA(LPSTR lpOutput, int nOutput, UINT uIdFormat, ...); +int LoadLngStringW2MB(UINT uID, LPSTR lpBuffer, int nBufferMax); + +#define GetLngString(id,pb,cb) LoadLngStringW((id),(pb),(cb)) +#define GetLngStringA(id,pb,cb) LoadLngStringA((id),(pb),(cb)) +#define GetLngStringW2MB(id,pb,cb) LoadLngStringW2MB((id),(pb),(cb)) + + + +#endif //_NP3_MUI_LANGUAGE_H_ + +/// End of MuiLanguage.h /// diff --git a/src/Notepad3.c b/src/Notepad3.c index d6855e07f..70cea4105 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -13,19 +13,8 @@ * * *******************************************************************************/ -#if !defined(WINVER) -#define WINVER 0x601 /*_WIN32_WINNT_WIN7*/ -#endif -#if !defined(_WIN32_WINNT) -#define _WIN32_WINNT 0x601 /*_WIN32_WINNT_WIN7*/ -#endif -#if !defined(NTDDI_VERSION) -#define NTDDI_VERSION 0x06010000 /*NTDDI_WIN7*/ -#endif -#define VC_EXTRALEAN 1 -#define WIN32_LEAN_AND_MEAN 1 -#define NOMINMAX 1 -#include +#include "Helpers.h" + #include #include #include @@ -36,7 +25,6 @@ #include //#include #include -#include #include "Edit.h" #include "Styles.h" @@ -47,12 +35,14 @@ #include "../uthash/utlist.h" #include "../tinyexpr/tinyexpr.h" #include "Encoding.h" -#include "Helpers.h" #include "VersionEx.h" #include "SciCall.h" + #include "SciLexer.h" #include "SciXLexer.h" +#include "MuiLanguage.h" + #include "Notepad3.h" @@ -84,9 +74,6 @@ static HWND s_hwndReBar = NULL; static WCHAR s_wchIniFile2[MAX_PATH] = { L'\0' }; static WCHAR s_wchTmpFilePath[MAX_PATH] = { L'\0' }; -// 'en-US' internal default -static WCHAR* const s_tchAvailableLanguages = L"af-ZA be-BY de-DE en-GB es-ES fr-FR hu-HU it-IT ja-JP ko-KR nl-NL pt-BR ru-RU zh-CN"; - static int s_iSettingsVersion = CFG_VER_CURRENT; static bool s_bEnableSaveSettings = true; @@ -413,7 +400,6 @@ static int s_flagChangeNotify = 0; // static forward declarations static void _UpdateStatusbarDelayed(bool bForceRedraw); static void _UpdateToolbarDelayed(); -static HMODULE _LoadLanguageResources(const WCHAR* localeName, LANGID langID); //============================================================================== // @@ -450,7 +436,7 @@ static void _InitGlobals() Constants.FileBrowserMiniPath = L"minipath.exe"; - + Globals.hMainMenu = NULL; Globals.CallTipType = CT_NONE; Globals.iWrapCol = 0; Globals.bCodeFoldingAvailable = false; @@ -512,9 +498,8 @@ static void _CleanUpResources(const HWND hwnd, bool bIsInitialized) DestroyMenu(Globals.hMainMenu); } - if (Globals.hLngResContainer != Globals.hInstance) { - FreeMUILibrary(Globals.hLngResContainer); - } + FreeLanguageResources(Globals.hLngResContainer); + Globals.hLngResContainer = NULL; if (s_hRichEdit) { FreeLibrary(s_hRichEdit); @@ -617,55 +602,9 @@ int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, // ---------------------------------------------------- // MultiLingual // - bool bPrefLngNotAvail = false; - - int res = 0; - if (StringCchLen(Settings2.PreferredLanguageLocaleName, COUNTOF(Settings2.PreferredLanguageLocaleName)) > 0) - { - WCHAR wchLngLocalName[LOCALE_NAME_MAX_LENGTH]; - res = ResolveLocaleName(Settings2.PreferredLanguageLocaleName, wchLngLocalName, LOCALE_NAME_MAX_LENGTH); - if (res > 0) { - StringCchCopy(Settings2.PreferredLanguageLocaleName, COUNTOF(Settings2.PreferredLanguageLocaleName), wchLngLocalName); // put back resolved name - } - // get LANGID - Globals.iPrefLANGID = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US); - res = GetLocaleInfoEx(Settings2.PreferredLanguageLocaleName, LOCALE_ILANGUAGE | LOCALE_RETURN_NUMBER, (LPWSTR)&Globals.iPrefLANGID, sizeof(LANGID)); - } + Globals.iPrefLANGID = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US); + Globals.hLngResContainer = LoadLanguageResources(&Globals.iPrefLANGID); - if (res == 0) // No preferred language defined or retrievable, try to get User UI Language - { - //~GetUserDefaultLocaleName(&Settings2.PreferredLanguageLocaleName[0], COUNTOF(Settings2.PreferredLanguageLocaleName)); - ULONG numLngs = 0; - DWORD cchLngsBuffer = 0; - BOOL hr = GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, &numLngs, NULL, &cchLngsBuffer); - if (hr) { - WCHAR* pwszLngsBuffer = AllocMem((cchLngsBuffer + 2) * sizeof(WCHAR), HEAP_ZERO_MEMORY); - if (pwszLngsBuffer) { - hr = GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, &numLngs, pwszLngsBuffer, &cchLngsBuffer); - if (hr && (numLngs > 0)) { - // get the first - StringCchCopy(Settings2.PreferredLanguageLocaleName, COUNTOF(Settings2.PreferredLanguageLocaleName), pwszLngsBuffer); - Globals.iPrefLANGID = LANGIDFROMLCID(LocaleNameToLCID(Settings2.PreferredLanguageLocaleName, 0)); - res = 1; - } - FreeMem(pwszLngsBuffer); - } - } - if (res == 0) { // last try - Globals.iPrefLANGID = GetUserDefaultUILanguage(); - LCID const lcid = MAKELCID(Globals.iPrefLANGID, SORT_DEFAULT); - /*res = */LCIDToLocaleName(lcid, Settings2.PreferredLanguageLocaleName, COUNTOF(Settings2.PreferredLanguageLocaleName), 0); - } - } - - Globals.hLngResContainer = _LoadLanguageResources(Settings2.PreferredLanguageLocaleName, Globals.iPrefLANGID); - - if (!Globals.hLngResContainer) // fallback en-US (1033) - { - LANGID const langID = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US); - Globals.hLngResContainer = Globals.hInstance; - if (Globals.iPrefLANGID != langID) { bPrefLngNotAvail = true; } - } // ---------------------------------------------------- if (s_hRichEdit == INVALID_HANDLE_VALUE) { @@ -691,7 +630,6 @@ int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, s_msgTaskbarCreated = RegisterWindowMessage(L"TaskbarCreated"); - Globals.hMainMenu = NULL; if (Globals.hLngResContainer != Globals.hInstance) { Globals.hMainMenu = LoadMenu(Globals.hLngResContainer, MAKEINTRESOURCE(IDR_MUI_MAINMENU)); if (!Globals.hMainMenu) { @@ -730,7 +668,7 @@ int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, SetTimer(hwnd, IDT_TIMER_MRKALL, USER_TIMER_MINIMUM, (TIMERPROC)MQ_ExecuteNext); - if (bPrefLngNotAvail) { + if (Globals.bPrefLngNotAvail) { InfoBoxLng(MBWARN, L"MsgPrefLanguageNotAvailable", IDS_WARN_PREF_LNG_NOT_AVAIL, Settings2.PreferredLanguageLocaleName); } @@ -760,98 +698,6 @@ int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, } -//============================================================================= -// -// _LngStrToMultiLngStr -// -// -static bool _LngStrToMultiLngStr(WCHAR* pLngStr, WCHAR* pLngMultiStr, size_t lngMultiStrSize) -{ - bool rtnVal = true; - - size_t strLen = StringCchLenW(pLngStr,0); - - if ((strLen > 0) && pLngMultiStr && (lngMultiStrSize > 0)) { - WCHAR* lngMultiStrPtr = pLngMultiStr; - WCHAR* last = pLngStr + (Has_UTF16_LE_BOM((char*)pLngStr,clampi((int)strLen,0,8)) ? 1 : 0); - while (last && rtnVal) { - // make sure you validate the user input - WCHAR* next = StrNextTok(last, L",; :"); - if (next) { *next = L'\0'; } - strLen = StringCchLenW(last, LOCALE_NAME_MAX_LENGTH); - if (strLen && IsValidLocaleName(last)) { - lngMultiStrPtr[0] = L'\0'; - rtnVal &= SUCCEEDED(StringCchCatW(lngMultiStrPtr, (lngMultiStrSize - (lngMultiStrPtr - pLngMultiStr)), last)); - lngMultiStrPtr += strLen + 1; - } - last = (next ? next + 1 : next); - } - if (rtnVal && (lngMultiStrSize - (lngMultiStrPtr - pLngMultiStr))) // make sure there is a double null term for the multi-string - { - lngMultiStrPtr[0] = L'\0'; - } - else // fail and guard anyone whom might use the multi-string - { - lngMultiStrPtr[0] = L'\0'; - lngMultiStrPtr[1] = L'\0'; - } - } - return rtnVal; -} - - -//============================================================================= -// -// _LoadLanguageResources -// -// -static HMODULE _LoadLanguageResources(const WCHAR* localeName, LANGID langID) -{ - bool bLngAvailable = (StrStrIW(s_tchAvailableLanguages, localeName) != NULL); - if (!bLngAvailable) { return NULL; } - - WCHAR tchAvailLngs[LARGE_BUFFER] = { L'\0' }; - StringCchCopyW(tchAvailLngs, LARGE_BUFFER, s_tchAvailableLanguages); - WCHAR tchUserLangMultiStrg[LARGE_BUFFER] = { L'\0' }; - if (!_LngStrToMultiLngStr(tchAvailLngs, tchUserLangMultiStrg, LARGE_BUFFER)) - { - GetLastErrorToMsgBox(L"_LngStrToMultiLngStr()", ERROR_MUI_INVALID_LOCALE_NAME); - return NULL; - } - - // set the appropriate fallback list - DWORD langCount = 0; - // using SetProcessPreferredUILanguages is recommended for new applications (esp. multi-threaded applications) - if (!SetThreadPreferredUILanguages(MUI_LANGUAGE_NAME, tchUserLangMultiStrg, &langCount) || (langCount == 0)) - { - GetLastErrorToMsgBox(L"SetProcessPreferredUILanguages()", 0); - return NULL; - } - SetThreadUILanguage(langID); - - // NOTES: - // an application developer that makes the assumption the fallback list provided by the - // system / OS is entirely sufficient may or may not be making a good assumption based mostly on: - // A. your choice of languages installed with your application - // B. the languages on the OS at application install time - // C. the OS users propensity to install/uninstall language packs - // D. the OS users propensity to change language settings - - // obtains access to the proper resource container - // for standard Win32 resource loading this is normally a PE module - use LoadLibraryEx - - HMODULE hLangResourceContainer = LoadMUILibraryW(L"lng/np3lng.dll", MUI_LANGUAGE_NAME, langID); - - //if (!hLangResourceContainer) - //{ - // GetLastErrorToMsgBox(L"LoadMUILibrary", 0); - // return NULL; - //} - - return hLangResourceContainer; -} - - //============================================================================= // // WaitCursorStack @@ -2140,8 +1986,6 @@ LRESULT MsgDPIChanged(HWND hwnd, WPARAM wParam, LPARAM lParam) DocPos const pos = SciCall_GetCurrentPos(); - HINSTANCE hInstance = (HINSTANCE)(INT_PTR)GetWindowLongPtr(hwnd, GWLP_HINSTANCE); - #if 0 char buf[128]; sprintf(buf, "WM_DPICHANGED: dpi=%u,%u ppi=%u,%u\n", Globals.CurrentDPI.x, Globals.CurrentDPI.y, Globals.CurrentPPI.x, Globals.CurrentPPI.y); @@ -2157,7 +2001,7 @@ LRESULT MsgDPIChanged(HWND hwnd, WPARAM wParam, LPARAM lParam) DestroyWindow(s_hwndToolbar); DestroyWindow(s_hwndReBar); DestroyWindow(Globals.hwndStatus); - CreateBars(hwnd, hInstance); + CreateBars(hwnd, Globals.hInstance); RECT* const rc = (RECT*)lParam; SendWMSize(hwnd, rc); @@ -3034,6 +2878,11 @@ LRESULT MsgInitMenu(HWND hwnd, WPARAM wParam, LPARAM lParam) i = (int)StringCchLenW(Settings2.AdministrationTool, COUNTOF(Settings2.AdministrationTool)); EnableCmd(hmenu, IDM_HELP_ADMINEXE, i); + for (int lng = 0; lng < NUM_OF_MUI_LANGUAGES; ++lng) { + EnableCmd(hmenu, MUI_LanguageDLLs[lng].rid, MUI_LanguageDLLs[lng].bHasDLL); + CheckCmd(hmenu, MUI_LanguageDLLs[lng].rid, MUI_LanguageDLLs[lng].bIsLoaded); + } + return 0LL; } @@ -3069,6 +2918,57 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam) EditUpdateVisibleUrlHotspot(Settings.HyperlinkHotspot); break; + + case IDM_MUI_LANG_EN_US: + case IDM_MUI_LANG_AF_ZA: + case IDM_MUI_LANG_BE_BY: + case IDM_MUI_LANG_DE_DE: + case IDM_MUI_LANG_EN_GB: + case IDM_MUI_LANG_ES_ES: + case IDM_MUI_LANG_FR_FR: + case IDM_MUI_LANG_HU_HU: + case IDM_MUI_LANG_IT_IT: + case IDM_MUI_LANG_JP_JP: + case IDM_MUI_LANG_KO_KR: + case IDM_MUI_LANG_NL_NL: + case IDM_MUI_LANG_PT_BR: + case IDM_MUI_LANG_RU_RU: + case IDM_MUI_LANG_ZH_CN: + { + int iLngIdx = (int)LOWORD(wParam) - IDM_MUI_LANG_EN_US; + + if (Globals.iPrefLANGID != MUI_LanguageDLLs[iLngIdx].LangId) + { + if (IsWindow(Globals.hwndDlgFindReplace)) { + SendMessage(Globals.hwndDlgFindReplace, WM_CLOSE, 0, 0); + } + if (IsWindow(Globals.hwndDlgCustomizeSchemes)) { + SendMessage(Globals.hwndDlgCustomizeSchemes, WM_CLOSE, 0, 0); + } + + StringCchCopyW(Settings2.PreferredLanguageLocaleName, COUNTOF(Settings2.PreferredLanguageLocaleName), MUI_LanguageDLLs[iLngIdx].szLocaleName); + IniSetString(L"Settings2", L"PreferredLanguageLocaleName", Settings2.PreferredLanguageLocaleName); + + DestroyMenu(Globals.hMainMenu); + FreeLanguageResources(Globals.hLngResContainer); + + Globals.iPrefLANGID = MUI_LanguageDLLs[iLngIdx].LangId; + Globals.hLngResContainer = LoadLanguageResources(&Globals.iPrefLANGID); + Globals.hMainMenu = LoadMenu(Globals.hLngResContainer, MAKEINTRESOURCE(IDR_MUI_MAINMENU)); + + SetMenu(Globals.hwndMain, Globals.hMainMenu); + DrawMenuBar(Globals.hwndMain); + + SendWMSize(Globals.hwndMain, NULL); + UpdateUI(); + UpdateToolbar(); + UpdateStatusbar(true); + + } + } + break; + + case IDM_FILE_NEW: FileLoad(false,true,false,Settings.SkipUnicodeDetection,Settings.SkipANSICodePageDetection,L""); break; @@ -8399,18 +8299,18 @@ static void _UpdateStatusbarDelayed(bool bForceRedraw) static DocLn s_iLnFromPos = -1; static DocLn s_iLnCnt = -1; - if (s_iLnFromPos != iLnFromPos) { + if (bForceRedraw || (s_iLnFromPos != iLnFromPos)) { StringCchPrintf(tchLn, COUNTOF(tchLn), DOCPOSFMTW, iLnFromPos + 1); FormatNumberStr(tchLn); } DocLn const iLnCnt = SciCall_GetLineCount(); - if (s_iLnCnt != iLnCnt) { + if (bForceRedraw || (s_iLnCnt != iLnCnt)) { StringCchPrintf(tchLines, COUNTOF(tchLines), DOCPOSFMTW, iLnCnt); FormatNumberStr(tchLines); } - if ((s_iLnFromPos != iLnFromPos) || (s_iLnCnt != iLnCnt)) + if (bForceRedraw || ((s_iLnFromPos != iLnFromPos) || (s_iLnCnt != iLnCnt))) { StringCchPrintf(tchStatusBar[STATUS_DOCLINE], txtWidth, L"%s%s / %s%s", s_mxSBPrefix[STATUS_DOCLINE], tchLn, tchLines, s_mxSBPostfix[STATUS_DOCLINE]); @@ -8429,7 +8329,7 @@ static void _UpdateStatusbarDelayed(bool bForceRedraw) static DocPos s_iCol = -1; DocPos const iCol = SciCall_GetColumn(iPos) + SciCall_GetSelectionNCaretVirtualSpace(0); - if (s_iCol != iCol) { + if (bForceRedraw || (s_iCol != iCol)) { StringCchPrintf(tchCol, COUNTOF(tchCol), DOCPOSFMTW, iCol + colOffset); FormatNumberStr(tchCol); } @@ -8437,12 +8337,12 @@ static void _UpdateStatusbarDelayed(bool bForceRedraw) static DocPos s_iCols = -1; static WCHAR tchCols[32] = { L'\0' }; DocPos const iCols = SciCall_GetColumn(iLineBack); - if (s_iCols != iCols) { + if (bForceRedraw || (s_iCols != iCols)) { StringCchPrintf(tchCols, COUNTOF(tchCols), DOCPOSFMTW, iCols); FormatNumberStr(tchCols); } - if ((s_iCol != iCol) || (s_iCols != iCols)) { + if (bForceRedraw || ((s_iCol != iCol) || (s_iCols != iCols))) { StringCchPrintf(tchStatusBar[STATUS_DOCCOLUMN], txtWidth, L"%s%s / %s%s", s_mxSBPrefix[STATUS_DOCCOLUMN], tchCol, tchCols, s_mxSBPostfix[STATUS_DOCCOLUMN]); @@ -8461,14 +8361,14 @@ static void _UpdateStatusbarDelayed(bool bForceRedraw) DocPos const chrOffset = Globals.bZeroBasedCharacterCount ? 0 : 1; DocPos const iChr = SciCall_CountCharacters(iLineBegin, iPos); - if (s_iChr != iChr) { + if (bForceRedraw || (s_iChr != iChr)) { StringCchPrintf(tchChr, COUNTOF(tchChr), DOCPOSFMTW, iChr + chrOffset); FormatNumberStr(tchChr); } static DocPos s_iChrs = -1; DocPos const iChrs = SciCall_CountCharacters(iLineBegin, iLineBack); - if (s_iChrs != iChrs) { + if (bForceRedraw || (s_iChrs != iChrs)) { StringCchPrintf(tchChrs, COUNTOF(tchChrs), DOCPOSFMTW, iChrs); FormatNumberStr(tchChrs); } @@ -8493,7 +8393,7 @@ static void _UpdateStatusbarDelayed(bool bForceRedraw) static DocPos s_iSelStart = -1; static DocPos s_iSelEnd = -1; - if ((s_bIsSelCountable != bIsSelCountable) || (s_iSelStart != iSelStart) || (s_iSelEnd != iSelEnd)) + if (bForceRedraw || ((s_bIsSelCountable != bIsSelCountable) || (s_iSelStart != iSelStart) || (s_iSelEnd != iSelEnd))) { static WCHAR tchSelB[64] = { L'\0' }; if (bIsSelCountable) @@ -8533,7 +8433,7 @@ static void _UpdateStatusbarDelayed(bool bForceRedraw) DocLn const iLinesSelected = ((iSelStart != iSelEnd) && (iStartOfLinePos != iSelEnd)) ? ((iLineEnd - iLineStart) + 1) : (iLineEnd - iLineStart); - if ((s_bIsSelectionEmpty != bIsSelectionEmpty) || (s_iLinesSelected != iLinesSelected)) + if (bForceRedraw || ((s_bIsSelectionEmpty != bIsSelectionEmpty) || (s_iLinesSelected != iLinesSelected))) { static WCHAR tchLinesSelected[32] = { L'\0' }; if (bIsSelectionEmpty) { @@ -8601,8 +8501,8 @@ static void _UpdateStatusbarDelayed(bool bForceRedraw) StringCchPrintf(tchExpression, COUNTOF(tchExpression), L"^[%i]", s_iExprError); } - if (!s_iExprError || (s_iExErr != s_iExprError)) { - + if (bForceRedraw || (!s_iExprError || (s_iExErr != s_iExprError))) + { StringCchPrintf(tchStatusBar[STATUS_TINYEXPR], txtWidth, L"%s%s%s ", s_mxSBPrefix[STATUS_TINYEXPR], tchExpression, s_mxSBPostfix[STATUS_TINYEXPR]); @@ -8619,7 +8519,7 @@ static void _UpdateStatusbarDelayed(bool bForceRedraw) { static int s_iMarkOccurrencesCount = -111; static bool s_bMOVisible = false; - if ((s_bMOVisible != Settings.MarkOccurrencesMatchVisible) || (s_iMarkOccurrencesCount != Globals.iMarkOccurrencesCount)) + if (bForceRedraw || ((s_bMOVisible != Settings.MarkOccurrencesMatchVisible) || (s_iMarkOccurrencesCount != Globals.iMarkOccurrencesCount))) { if ((Globals.iMarkOccurrencesCount >= 0) && !Settings.MarkOccurrencesMatchVisible) { @@ -8654,7 +8554,7 @@ static void _UpdateStatusbarDelayed(bool bForceRedraw) { static int s_iReplacedOccurrences = -1; - if (s_iReplacedOccurrences != Globals.iReplacedOccurrences) + if (bForceRedraw || (s_iReplacedOccurrences != Globals.iReplacedOccurrences)) { static WCHAR tchRepl[32] = { L'\0' }; if (Globals.iReplacedOccurrences > 0) @@ -8680,7 +8580,8 @@ static void _UpdateStatusbarDelayed(bool bForceRedraw) { static DocPos s_iTextLength = -1; DocPos const iTextLength = SciCall_GetTextLength(); - if (s_iTextLength != iTextLength) { + if (bForceRedraw || (s_iTextLength != iTextLength)) + { static WCHAR tchBytes[32] = { L'\0' }; StrFormatByteSize(iTextLength, tchBytes, COUNTOF(tchBytes)); @@ -8697,7 +8598,8 @@ static void _UpdateStatusbarDelayed(bool bForceRedraw) { static int s_iEncoding = -1; int const iEncoding = Encoding_Current(CPI_GET); - if (s_iEncoding != iEncoding) { + if (bForceRedraw || (s_iEncoding != iEncoding)) + { Encoding_SetLabel(iEncoding); StringCchPrintf(tchStatusBar[STATUS_CODEPAGE], txtWidth, L"%s%s%s", @@ -8714,7 +8616,7 @@ static void _UpdateStatusbarDelayed(bool bForceRedraw) static int s_iEOLMode = -1; int const _eol_mode = SciCall_GetEOLMode(); - if (s_iEOLMode != _eol_mode) + if (bForceRedraw || (s_iEOLMode != _eol_mode)) { if (_eol_mode == SC_EOL_LF) { StringCchPrintf(tchStatusBar[STATUS_EOLMODE], txtWidth, L"%sLF%s", @@ -8738,7 +8640,8 @@ static void _UpdateStatusbarDelayed(bool bForceRedraw) { static bool s_bIsOVR = -1; bool const bIsOVR = (bool)SendMessage(Globals.hwndEdit, SCI_GETOVERTYPE, 0, 0); - if (s_bIsOVR != bIsOVR) { + if (bForceRedraw || (s_bIsOVR != bIsOVR)) + { if (bIsOVR) { StringCchPrintf(tchStatusBar[STATUS_OVRMODE], txtWidth, L"%sOVR%s", @@ -8758,7 +8661,7 @@ static void _UpdateStatusbarDelayed(bool bForceRedraw) { static bool s_bUse2ndDefault = -1; bool const bUse2ndDefault = Style_GetUse2ndDefault(); - if (s_bUse2ndDefault != bUse2ndDefault) + if (bForceRedraw || (s_bUse2ndDefault != bUse2ndDefault)) { if (bUse2ndDefault) StringCchPrintf(tchStatusBar[STATUS_2ND_DEF], txtWidth, L"%s2ND%s", @@ -8777,7 +8680,7 @@ static void _UpdateStatusbarDelayed(bool bForceRedraw) { static int s_iCurLexer = -1; int const iCurLexer = Style_GetCurrentLexerRID(); - if (s_iCurLexer != iCurLexer) + if (bForceRedraw || (s_iCurLexer != iCurLexer)) { static WCHAR tchLexerName[MINI_BUFFER]; if (Style_IsCurLexerStandard()) diff --git a/src/Notepad3.vcxproj b/src/Notepad3.vcxproj index 8cc5604f7..cbf9a9e5e 100644 --- a/src/Notepad3.vcxproj +++ b/src/Notepad3.vcxproj @@ -381,6 +381,7 @@ + @@ -468,6 +469,7 @@ + diff --git a/src/Notepad3.vcxproj.filters b/src/Notepad3.vcxproj.filters index fa63b45b8..92bc649f6 100644 --- a/src/Notepad3.vcxproj.filters +++ b/src/Notepad3.vcxproj.filters @@ -252,6 +252,9 @@ Source Files\StyleLexers + + Source Files + @@ -389,6 +392,9 @@ Source Files\uthash + + Header Files + diff --git a/src/Print.cpp b/src/Print.cpp index cf605bec5..10ebfd322 100644 --- a/src/Print.cpp +++ b/src/Print.cpp @@ -15,19 +15,11 @@ * * *******************************************************************************/ -#if !defined(WINVER) -#define WINVER 0x601 /*_WIN32_WINNT_WIN7*/ -#endif -#if !defined(_WIN32_WINNT) -#define _WIN32_WINNT 0x601 /*_WIN32_WINNT_WIN7*/ -#endif -#if !defined(NTDDI_VERSION) -#define NTDDI_VERSION 0x06010000 /*NTDDI_WIN7*/ -#endif -#define VC_EXTRALEAN 1 -#define WIN32_LEAN_AND_MEAN 1 -#define NOMINMAX 1 -#include +extern "C" { +#include "Helpers.h" +#include "MuiLanguage.h" +} + #include #include #include @@ -44,8 +36,6 @@ extern "C" { #include "Dialogs.h" -#include "Helpers.h" -#include "TypeDefs.h" #include "SciCall.h" } diff --git a/src/Styles.c b/src/Styles.c index 4cc89ba9e..1d24bf930 100644 --- a/src/Styles.c +++ b/src/Styles.c @@ -13,19 +13,8 @@ * * * * *******************************************************************************/ -#if !defined(WINVER) -#define WINVER 0x601 /*_WIN32_WINNT_WIN7*/ -#endif -#if !defined(_WIN32_WINNT) -#define _WIN32_WINNT 0x601 /*_WIN32_WINNT_WIN7*/ -#endif -#if !defined(NTDDI_VERSION) -#define NTDDI_VERSION 0x06010000 /*NTDDI_WIN7*/ -#endif -#define VC_EXTRALEAN 1 -#define WIN32_LEAN_AND_MEAN 1 -#define NOMINMAX 1 -#include +#include "Helpers.h" + #include #include #include @@ -42,7 +31,8 @@ #include "Dialogs.h" #include "resource.h" #include "Encoding.h" -#include "Helpers.h" +#include "MuiLanguage.h" + #include "SciCall.h" #include "Styles.h" diff --git a/src/TypeDefs.h b/src/TypeDefs.h index cc05b1731..3b73e5f87 100644 --- a/src/TypeDefs.h +++ b/src/TypeDefs.h @@ -14,7 +14,22 @@ #ifndef _NP3_TYPEDEFS_H_ #define _NP3_TYPEDEFS_H_ +#if !defined(WINVER) +#define WINVER 0x601 /*_WIN32_WINNT_WIN7*/ +#endif +#if !defined(_WIN32_WINNT) +#define _WIN32_WINNT 0x601 /*_WIN32_WINNT_WIN7*/ +#endif +#if !defined(NTDDI_VERSION) +#define NTDDI_VERSION 0x06010000 /*NTDDI_WIN7*/ +#endif +#define VC_EXTRALEAN 1 +#define WIN32_LEAN_AND_MEAN 1 +#define NOMINMAX 1 +#include + #include +#include #ifndef __cplusplus #include @@ -245,6 +260,7 @@ typedef struct _globals_t HINSTANCE hInstance; HINSTANCE hPrevInst; HMODULE hLngResContainer; + bool bPrefLngNotAvail; HWND hwndMain; HANDLE hndlProcessHeap; HWND hwndEdit;