summaryrefslogtreecommitdiffstats
path: root/packaging
diff options
context:
space:
mode:
authorEduard Braun <eduard.braun2@gmx.de>2017-01-16 22:21:35 +0000
committerEduard Braun <eduard.braun2@gmx.de>2017-01-16 22:21:35 +0000
commit1c722f4ebbf5384a48668a0d9d7f4201280b76c1 (patch)
tree045a5dd0d1ad87d90b7e33e40d009f7c65d25e14 /packaging
parentExtensions: run_command.py - inform user about output to stderr even if error... (diff)
downloadinkscape-1c722f4ebbf5384a48668a0d9d7f4201280b76c1.tar.gz
inkscape-1c722f4ebbf5384a48668a0d9d7f4201280b76c1.zip
Packaging: Sort translations by name in Windows .exe and .msi installers (before they were sorted by language code)
This commit also adds functionality to automatically parse localized language names from the Inkscape .po file for the NSIS (.exe) installer Python scripts for Windows packaging are now Python 2/3 compatible and should always handle unicode characters properly. Fixed bugs: - https://launchpad.net/bugs/1654460 (bzr r15418)
Diffstat (limited to 'packaging')
-rwxr-xr-xpackaging/win32/inkscape.nsi62
-rw-r--r--packaging/win32/languages/Breton.nsh91
-rw-r--r--packaging/win32/languages/Breton_languageNames.nsh94
-rw-r--r--packaging/win32/languages/Catalan.nsh91
-rw-r--r--packaging/win32/languages/Catalan_languageNames.nsh94
-rw-r--r--packaging/win32/languages/Czech.nsh91
-rw-r--r--packaging/win32/languages/Czech_languageNames.nsh94
-rw-r--r--packaging/win32/languages/Danish.nsh91
-rw-r--r--packaging/win32/languages/Danish_languageNames.nsh94
-rw-r--r--packaging/win32/languages/Dutch.nsh91
-rw-r--r--packaging/win32/languages/Dutch_languageNames.nsh94
-rw-r--r--packaging/win32/languages/English.nsh91
-rw-r--r--packaging/win32/languages/English_languageNames.nsh94
-rw-r--r--packaging/win32/languages/Finnish.nsh91
-rw-r--r--packaging/win32/languages/Finnish_languageNames.nsh94
-rw-r--r--packaging/win32/languages/French.nsh91
-rw-r--r--packaging/win32/languages/French_languageNames.nsh94
-rw-r--r--packaging/win32/languages/Galician.nsh91
-rw-r--r--packaging/win32/languages/Galician_languageNames.nsh94
-rw-r--r--packaging/win32/languages/German.nsh91
-rw-r--r--packaging/win32/languages/German_languageNames.nsh94
-rw-r--r--packaging/win32/languages/Greek.nsh91
-rw-r--r--packaging/win32/languages/Greek_languageNames.nsh94
-rw-r--r--packaging/win32/languages/Hebrew.nsh91
-rw-r--r--packaging/win32/languages/Hebrew_languageNames.nsh94
-rw-r--r--packaging/win32/languages/Icelandic.nsh91
-rw-r--r--packaging/win32/languages/Icelandic_languageNames.nsh94
-rw-r--r--packaging/win32/languages/Indonesian.nsh91
-rw-r--r--packaging/win32/languages/Indonesian_languageNames.nsh94
-rw-r--r--packaging/win32/languages/Italian.nsh91
-rw-r--r--packaging/win32/languages/Italian_languageNames.nsh94
-rw-r--r--packaging/win32/languages/Japanese.nsh91
-rw-r--r--packaging/win32/languages/Japanese_languageNames.nsh94
-rw-r--r--packaging/win32/languages/Polish.nsh91
-rw-r--r--packaging/win32/languages/Polish_languageNames.nsh94
-rw-r--r--packaging/win32/languages/Portuguese.nsh91
-rw-r--r--packaging/win32/languages/PortugueseBR.nsh91
-rw-r--r--packaging/win32/languages/PortugueseBR_languageNames.nsh94
-rw-r--r--packaging/win32/languages/Portuguese_languageNames.nsh94
-rw-r--r--packaging/win32/languages/Romanian.nsh91
-rw-r--r--packaging/win32/languages/Romanian_languageNames.nsh94
-rw-r--r--packaging/win32/languages/Russian.nsh91
-rw-r--r--packaging/win32/languages/Russian_languageNames.nsh94
-rw-r--r--packaging/win32/languages/SimpChinese.nsh91
-rw-r--r--packaging/win32/languages/SimpChinese_languageNames.nsh94
-rw-r--r--packaging/win32/languages/Slovak.nsh91
-rw-r--r--packaging/win32/languages/Slovak_languageNames.nsh94
-rw-r--r--packaging/win32/languages/Slovenian.nsh91
-rw-r--r--packaging/win32/languages/Slovenian_languageNames.nsh94
-rw-r--r--packaging/win32/languages/Spanish.nsh91
-rw-r--r--packaging/win32/languages/Spanish_languageNames.nsh94
-rw-r--r--packaging/win32/languages/TradChinese.nsh91
-rw-r--r--packaging/win32/languages/TradChinese_languageNames.nsh94
-rw-r--r--packaging/win32/languages/Ukrainian.nsh91
-rw-r--r--packaging/win32/languages/Ukrainian_languageNames.nsh94
-rw-r--r--packaging/win32/languages/_language_lists.py79
-rw-r--r--packaging/win32/languages/_polib.py1870
-rw-r--r--packaging/wix/files.py16
-rw-r--r--packaging/wix/helpers.py6
59 files changed, 4566 insertions, 2462 deletions
diff --git a/packaging/win32/inkscape.nsi b/packaging/win32/inkscape.nsi
index 9f2c00727..7bc65cc69 100755
--- a/packaging/win32/inkscape.nsi
+++ b/packaging/win32/inkscape.nsi
@@ -85,6 +85,7 @@ LicenseForceSelection off
!define MUI_LICENSEPAGE_TEXT_BOTTOM "$(LICENSE_BOTTOM_TEXT)"
!insertmacro MUI_PAGE_LICENSE ..\..\Copying
; Components page {{{6
+!define MUI_PAGE_CUSTOMFUNCTION_SHOW SortTranslationsSection
!insertmacro MUI_PAGE_COMPONENTS
InstType "$(Full)"
InstType "$(Optimal)"
@@ -114,9 +115,11 @@ ShowUninstDetails hide
!verbose 3
!insertmacro MUI_LANGUAGE "English"
!insertmacro LANGFILE_INCLUDE "languages\English.nsh"
+!insertmacro LANGFILE_INCLUDE "languages\English_languageNames.nsh"
!macro INKLANGFILE LocaleName LocaleID
!insertmacro MUI_LANGUAGE "${LocaleName}"
!insertmacro LANGFILE_INCLUDE_WITHDEFAULT "languages\${LocaleName}.nsh" "languages\English.nsh"
+ !insertmacro LANGFILE_INCLUDE_WITHDEFAULT "languages\${LocaleName}_languageNames.nsh" "languages\English_languageNames.nsh"
!macroend
; include list of available installer translations from /languages/_language_lists.nsh
!insertmacro INSTALLER_TRANSLATIONS INKLANGFILE
@@ -542,7 +545,7 @@ SectionGroupEnd ; SecAddfiles }}}
SectionGroup "$(Languages)" SecLanguages ; Languages sections {{{
!macro Language SecName lng ; A macro to create each section {{{
- Section /o "$(lng_${lng}) (${lng})" Sec${SecName}
+ Section /o "$(lng_${lng})" Sec${SecName}
SectionIn 1 ; flags will be adjusted below, see LanguageAutoSelect in .onInit
!ifndef DUMMYINSTALL
DetailPrint "Installing translations and translated content for ${SecName} (${lng}) locale..."
@@ -678,6 +681,63 @@ SectionEnd ; -FinalizeInstallation }}}
!insertmacro MUI_FUNCTION_DESCRIPTION_END ; Section descriptions }}}
+Function SortTranslationsSection ; sorts the available translations in the component dialog alphabetically
+ ; originally from http://nsis.sourceforge.net/Sorting_Components
+
+ ; defines
+ !define TVGN_ROOT 0
+ !define TVGN_NEXT 1
+ !define TVGN_NEXTVISIBLE 6
+
+ !define TVIF_TEXT 1
+
+ !define TVM_GETNEXTITEM 4362
+ !define TVM_GETITEMA 4364
+ !define TVM_GETITEMW 4414
+ !define TVM_GETITEM 4414
+ !define TVM_SORTCHILDREN 4371
+
+ !define TVITEM '(i, i, i, i, i, i, i, i, i, i)'
+
+ ; get the window handle and search for the tree view control
+ FindWindow $0 "#32770" "" $HWNDPARENT
+ GetDlgItem $0 $0 1032
+
+ ; find the first tree item
+ SendMessage $0 ${TVM_GETNEXTITEM} ${TVGN_ROOT} 0 $1
+
+ ; allocate a string in memory to store the section name
+ System::Alloc ${NSIS_MAX_STRLEN}
+ Pop $2
+
+ ; loop through all tree view items until the one containing the translations is found
+ loopSections:
+ ; allocate a TVITEM (https://msdn.microsoft.com/en-us/library/windows/desktop/bb773456.aspx) structure in memory
+ System::Call '*${TVITEM}(${TVIF_TEXT}, r1,,, r2, ${NSIS_MAX_STRLEN},,,,) i .r3'
+ ; send TVM_GETITEM message (https://msdn.microsoft.com/de-de/library/windows/desktop/bb773596.aspx)
+ ; which stores information on the current tree item in the structure
+ SendMessage $0 ${TVM_GETITEM} 0 $3
+ ; read the string pointed to by pszText (which is the displayed text of the tree item)
+ System::Call '*$2(&t${NSIS_MAX_STRLEN} .r4)'
+ ; check if this matches the localized string for "Translations", i.e. the Section we're looking for
+ StrCmp $4 "$(Languages)" 0 +2
+ Goto foundSection
+
+ ; send TVM_GETNEXTITEM message (https://msdn.microsoft.com/de-de/library/windows/desktop/bb773622.aspx)
+ ; will return 0 if the last item was reached (if this happens something went wrong and we did not find the translations section)
+ SendMessage $0 ${TVM_GETNEXTITEM} ${TVGN_NEXTVISIBLE} $1 $1
+ StrCmp 0 $1 doneSections loopSections
+
+ ; sort the children of the translations section alphabetically
+ foundSection:
+ SendMessage $0 ${TVM_SORTCHILDREN} 0 $1
+
+ doneSections:
+ System::Free $2
+ System::Free $3
+FunctionEnd
+
+
Function .onInit ; initialise the installer {{{2
; This code will be executed before the sections, but due to the
; language code in the sections it must come after it in the code.
diff --git a/packaging/win32/languages/Breton.nsh b/packaging/win32/languages/Breton.nsh
index bbbb834ac..a28687a1f 100644
--- a/packaging/win32/languages/Breton.nsh
+++ b/packaging/win32/languages/Breton.nsh
@@ -44,97 +44,6 @@ ${LangFileString} Dictionaries "Dictionaries"
${LangFileString} DictionariesDesc "Dictionaries for some common languages for spell checking in Inkscape"
${LangFileString} Languages "Troidigezhioù"
${LangFileString} LanguagesDesc "Staliañ troidigezhioù evit Inkscape"
-${LangFileString} lng_am "Amhareg"
-${LangFileString} lng_ar "Arabeg"
-${LangFileString} lng_as "Assamese"
-${LangFileString} lng_az "Azerbaidjaneg"
-${LangFileString} lng_be "Bieloruseg"
-${LangFileString} lng_bg "Bulgareg"
-${LangFileString} lng_bn "Bengalieg"
-${LangFileString} lng_bn_BD "Bengali Bangladesh"
-${LangFileString} lng_br "Brezhoneg"
-${LangFileString} lng_brx "Bodo"
-${LangFileString} lng_ca "Katalaneg"
-${LangFileString} lng_ca@valencia "Katalaneg Valensia"
-${LangFileString} lng_cs "Tchekeg"
-${LangFileString} lng_da "Daneg"
-${LangFileString} lng_de "Alamaneg"
-${LangFileString} lng_doi "Dogri"
-${LangFileString} lng_dz "Dzongkheg"
-${LangFileString} lng_el "Gresianeg"
-${LangFileString} lng_en "Saozneg"
-${LangFileString} lng_en_AU "Saozneg Australia"
-${LangFileString} lng_en_CA "Saozneg Kanada"
-${LangFileString} lng_en_GB "Saozneg Breizh-Veur"
-${LangFileString} lng_en_US@piglatin "Pig Latin"
-${LangFileString} lng_eo "Esperanto"
-${LangFileString} lng_es "Spagnoleg"
-${LangFileString} lng_es_MX "Spagnoleg Mec'hiko"
-${LangFileString} lng_et "Estoneg"
-${LangFileString} lng_eu "Euskareg"
-${LangFileString} lng_fa "Farsi"
-${LangFileString} lng_fi "Finneg"
-${LangFileString} lng_fr "Galleg"
-${LangFileString} lng_ga "Iwerzhoneg"
-${LangFileString} lng_gl "Galisianeg"
-${LangFileString} lng_gu "Gujarati"
-${LangFileString} lng_he "Hebraeg"
-${LangFileString} lng_hi "Hindi"
-${LangFileString} lng_hr "Kroateg"
-${LangFileString} lng_hu "Hungareg"
-${LangFileString} lng_hy "Armenian"
-${LangFileString} lng_id "Indoneseg"
-${LangFileString} lng_is "Icelandic"
-${LangFileString} lng_it "Italianeg"
-${LangFileString} lng_ja "Japoneg"
-${LangFileString} lng_km "Khmereg"
-${LangFileString} lng_kn "Kannada"
-${LangFileString} lng_ko "Koreaneg"
-${LangFileString} lng_kok "Konkani"
-${LangFileString} lng_kok@latin "Konkani in Latin script"
-${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script"
-${LangFileString} lng_ks@deva "Kashmiri in Devanagari script"
-${LangFileString} lng_lt "Lituaneg"
-${LangFileString} lng_lv "Latvian"
-${LangFileString} lng_mai "Maithili"
-${LangFileString} lng_mk "Makédonieg"
-${LangFileString} lng_ml "Malayalam"
-${LangFileString} lng_mn "Mongoleg"
-${LangFileString} lng_mni "Manipuri"
-${LangFileString} lng_mni@beng "Manipuri in Bengali script"
-${LangFileString} lng_mr "Marathi"
-${LangFileString} lng_nb "Norvegeg Bokmal"
-${LangFileString} lng_ne "Nepalieg"
-${LangFileString} lng_nl "Nederlandeg"
-${LangFileString} lng_nn "Norvegeg Ninorsk"
-${LangFileString} lng_or "Odia"
-${LangFileString} lng_pa "Pendjabeg"
-${LangFileString} lng_pl "Poloneg"
-${LangFileString} lng_pt "Portugaleg"
-${LangFileString} lng_pt_BR "Portugaleg Brazil"
-${LangFileString} lng_ro "Romanieg"
-${LangFileString} lng_ru "Ruseg"
-${LangFileString} lng_rw "Kinyarwandeg"
-${LangFileString} lng_sa "Sanskrit"
-${LangFileString} lng_sat "Santali"
-${LangFileString} lng_sat@deva "Santali in Devanagari script"
-${LangFileString} lng_sd "Sindhi"
-${LangFileString} lng_sd@deva "Sindhi in Devanagari script"
-${LangFileString} lng_sk "Sloveg"
-${LangFileString} lng_sl "Sloveneg"
-${LangFileString} lng_sq "Albaneg"
-${LangFileString} lng_sr "Serbeg"
-${LangFileString} lng_sr@latin "Serbeg skrivet mod latin"
-${LangFileString} lng_sv "Swedeg"
-${LangFileString} lng_ta "Tamil"
-${LangFileString} lng_te "Telugu"
-${LangFileString} lng_th "Thaieg"
-${LangFileString} lng_tr "Turkeg"
-${LangFileString} lng_uk "Ukrenieg"
-${LangFileString} lng_ur "Urdu"
-${LangFileString} lng_vi "Vietnameg"
-${LangFileString} lng_zh_CN "Sineg eeunaet"
-${LangFileString} lng_zh_TW "Sineg hengounel"
${LangFileString} UInstOpt "Dibarzhioù distaliañ"
${LangFileString} UInstOpt1 "Dibabit e-touez an dibarzhioù ouzhpenn"
${LangFileString} PurgePrefs "Mirout ar gwellvezioù personel"
diff --git a/packaging/win32/languages/Breton_languageNames.nsh b/packaging/win32/languages/Breton_languageNames.nsh
new file mode 100644
index 000000000..3b88398b9
--- /dev/null
+++ b/packaging/win32/languages/Breton_languageNames.nsh
@@ -0,0 +1,94 @@
+### Breton (br) translations for language names
+# This file has been automatically created by '_language_lists.py', do not edit it manually!
+# Strings that should be translated are in 'Breton.nsh'
+${LangFileString} lng_am "Amharieg (am)"
+${LangFileString} lng_ar "Arabeg (ar)"
+${LangFileString} lng_as "Assamese (as)"
+${LangFileString} lng_az "Azerbaijanieg (az)"
+${LangFileString} lng_be "Belarusianeg (be)"
+${LangFileString} lng_bg "Bulgarieg (bg)"
+${LangFileString} lng_bn "Bengalieg (bn)"
+${LangFileString} lng_bn_BD "Bengalieg/Bangladech (bn_BD)"
+${LangFileString} lng_br "Brezhoneg (br)"
+${LangFileString} lng_brx "Bodo (brx)"
+${LangFileString} lng_ca "Katalaneg (ca)"
+${LangFileString} lng_ca@valencia "Katalaneg Valensia (ca@valencia)"
+${LangFileString} lng_cs "Tchekeg (cs)"
+${LangFileString} lng_da "Daneg (da)"
+${LangFileString} lng_de "Alamaneg (de)"
+${LangFileString} lng_doi "Dogri (doi)"
+${LangFileString} lng_dz "Dzongkheg (dz)"
+${LangFileString} lng_el "Gresianeg (el)"
+${LangFileString} lng_en "Saozneg (en)"
+${LangFileString} lng_en_AU "Saozneg/Aostalia (en_AU)"
+${LangFileString} lng_en_CA "Saozneg/Kanada (en_CA)"
+${LangFileString} lng_en_GB "Saozneg/Breizh-Veur (en_GB)"
+${LangFileString} lng_en_US@piglatin "Pig Latin (en_US@piglatin)"
+${LangFileString} lng_eo "Esperanto (eo)"
+${LangFileString} lng_es "Spagnoleg (es)"
+${LangFileString} lng_es_MX "Spagnoleg/Mec'hiko (es_MX)"
+${LangFileString} lng_et "Estonieg (et)"
+${LangFileString} lng_eu "Euskareg (eu)"
+${LangFileString} lng_fa "Farsieg (fa)"
+${LangFileString} lng_fi "Finneg (fi)"
+${LangFileString} lng_fr "Galleg (fr)"
+${LangFileString} lng_ga "Iwerzhoneg (ga)"
+${LangFileString} lng_gl "Galisieg (gl)"
+${LangFileString} lng_gu "Gujarati (gu)"
+${LangFileString} lng_he "Hebraeg (he)"
+${LangFileString} lng_hi "Hindi (hi)"
+${LangFileString} lng_hr "Kroateg (hr)"
+${LangFileString} lng_hu "Hungareg (hu)"
+${LangFileString} lng_hy "Armenieg (hy)"
+${LangFileString} lng_id "Indonezieg (id)"
+${LangFileString} lng_is "Icelandic (is)"
+${LangFileString} lng_it "Italianeg (it)"
+${LangFileString} lng_ja "Japoneg (ja)"
+${LangFileString} lng_km "Khmereg (km)"
+${LangFileString} lng_kn "Kannada (kn)"
+${LangFileString} lng_ko "Koreeg (ko)"
+${LangFileString} lng_kok "Konkani (kok)"
+${LangFileString} lng_kok@latin "Konkani in Latin script (kok@latin)"
+${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script (ks@aran)"
+${LangFileString} lng_ks@deva "Kashmiri in Devanagari script (ks@deva)"
+${LangFileString} lng_lt "Lituanieg (lt)"
+${LangFileString} lng_lv "Letoneg (lv)"
+${LangFileString} lng_mai "Maithili (mai)"
+${LangFileString} lng_mk "Makedonieg (mk)"
+${LangFileString} lng_ml "Malayalam (ml)"
+${LangFileString} lng_mn "Mongolieg (mn)"
+${LangFileString} lng_mni "Manipuri (mni)"
+${LangFileString} lng_mni@beng "Manipuri in Bengali script (mni@beng)"
+${LangFileString} lng_mr "Marathi (mr)"
+${LangFileString} lng_nb "Norwegeg mod Bokmål (nb)"
+${LangFileString} lng_ne "Nepalegi (ne)"
+${LangFileString} lng_nl "Izelvroeg (nl)"
+${LangFileString} lng_nn "Norwegeg mod Nynorsk (nn)"
+${LangFileString} lng_or "Odia (or)"
+${LangFileString} lng_pa "Penjabeg (pa)"
+${LangFileString} lng_pl "Pologneg (pl)"
+${LangFileString} lng_pt "Portugaleg (pt)"
+${LangFileString} lng_pt_BR "Portuguese/Brazil (pt_BR)"
+${LangFileString} lng_ro "Romanieg (ro)"
+${LangFileString} lng_ru "Rusianeg (ru)"
+${LangFileString} lng_rw "Kinyarwandeg (rw)"
+${LangFileString} lng_sa "Sanskrit (sa)"
+${LangFileString} lng_sat "Santali (sat)"
+${LangFileString} lng_sat@deva "Santali in Devanagari script (sat@deva)"
+${LangFileString} lng_sd "Sindhi (sd)"
+${LangFileString} lng_sd@deva "Sindhi in Devanagari script (sd@deva)"
+${LangFileString} lng_sk "Sloveg (sk)"
+${LangFileString} lng_sl "Slovenieg (sl)"
+${LangFileString} lng_sq "Albanieg (sq)"
+${LangFileString} lng_sr "Serbeg (sr)"
+${LangFileString} lng_sr@latin "Serbeg dre skritur Latin (sr@latin)"
+${LangFileString} lng_sv "Swedeg (sv)"
+${LangFileString} lng_ta "Tamil (ta)"
+${LangFileString} lng_te "Telugueg (te)"
+${LangFileString} lng_th "Thaieg (th)"
+${LangFileString} lng_tr "Turkeg (tr)"
+${LangFileString} lng_uk "Ukrainieg (uk)"
+${LangFileString} lng_ur "Urdu (ur)"
+${LangFileString} lng_vi "Vietnameg (vi)"
+${LangFileString} lng_zh_CN "Sineg/Sina (zh_CN)"
+${LangFileString} lng_zh_TW "Sineg/Taiwan (zh_TW)"
diff --git a/packaging/win32/languages/Catalan.nsh b/packaging/win32/languages/Catalan.nsh
index 5c951c161..c163ad260 100644
--- a/packaging/win32/languages/Catalan.nsh
+++ b/packaging/win32/languages/Catalan.nsh
@@ -44,97 +44,6 @@ ${LangFileString} Dictionaries "Dictionaries"
${LangFileString} DictionariesDesc "Dictionaries for some common languages for spell checking in Inkscape"
${LangFileString} Languages "Traduccions"
${LangFileString} LanguagesDesc "Instal·la més traduccions per a l'Inkscape"
-${LangFileString} lng_am "Amharic"
-${LangFileString} lng_ar "Arabic"
-${LangFileString} lng_as "Assamese"
-${LangFileString} lng_az "Azerbaijani"
-${LangFileString} lng_be "Biel·lorús"
-${LangFileString} lng_bg "Búlgar"
-${LangFileString} lng_bn "Bengalí"
-${LangFileString} lng_bn_BD "Bengali Bangladesh"
-${LangFileString} lng_br "Breton"
-${LangFileString} lng_brx "Bodo"
-${LangFileString} lng_ca "Català"
-${LangFileString} lng_ca@valencia "Català valencià"
-${LangFileString} lng_cs "Txec"
-${LangFileString} lng_da "Danès"
-${LangFileString} lng_de "Alemany"
-${LangFileString} lng_doi "Dogri"
-${LangFileString} lng_dz "Dzongkha"
-${LangFileString} lng_el "Grec"
-${LangFileString} lng_en "Anglès"
-${LangFileString} lng_en_AU "Anglès d'Austràlia"
-${LangFileString} lng_en_CA "Anglès del Canadà"
-${LangFileString} lng_en_GB "Anglès britànic"
-${LangFileString} lng_en_US@piglatin "Pig Latin"
-${LangFileString} lng_eo "Esperanto"
-${LangFileString} lng_es "Espanyol"
-${LangFileString} lng_es_MX "Espanyol mexicà"
-${LangFileString} lng_et "Estonià"
-${LangFileString} lng_eu "Basc"
-${LangFileString} lng_fa "Farsi"
-${LangFileString} lng_fi "Finès"
-${LangFileString} lng_fr "Francès"
-${LangFileString} lng_ga "Irlandès"
-${LangFileString} lng_gl "Gallec"
-${LangFileString} lng_gu "Gujarati"
-${LangFileString} lng_he "Hebreu"
-${LangFileString} lng_hi "Hindi"
-${LangFileString} lng_hr "Croat"
-${LangFileString} lng_hu "Hongarès"
-${LangFileString} lng_hy "Armenian"
-${LangFileString} lng_id "Indonesi"
-${LangFileString} lng_is "Icelandic"
-${LangFileString} lng_it "Italià"
-${LangFileString} lng_ja "Japonès"
-${LangFileString} lng_km "Khmer"
-${LangFileString} lng_kn "Kannada"
-${LangFileString} lng_ko "Coreà"
-${LangFileString} lng_kok "Konkani"
-${LangFileString} lng_kok@latin "Konkani in Latin script"
-${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script"
-${LangFileString} lng_ks@deva "Kashmiri in Devanagari script"
-${LangFileString} lng_lt "Lituà"
-${LangFileString} lng_lv "Latvian"
-${LangFileString} lng_mai "Maithili"
-${LangFileString} lng_mk "Macedoni"
-${LangFileString} lng_ml "Malayalam"
-${LangFileString} lng_mn "Mongol"
-${LangFileString} lng_mni "Manipuri"
-${LangFileString} lng_mni@beng "Manipuri in Bengali script"
-${LangFileString} lng_mr "Marathi"
-${LangFileString} lng_nb "Noruec Bokmål"
-${LangFileString} lng_ne "Nepalí"
-${LangFileString} lng_nl "Holandès"
-${LangFileString} lng_nn "Noruec Nynorsk"
-${LangFileString} lng_or "Odia"
-${LangFileString} lng_pa "Panjabi"
-${LangFileString} lng_pl "Polonès"
-${LangFileString} lng_pt "Portuguès"
-${LangFileString} lng_pt_BR "Portuguès brasiler"
-${LangFileString} lng_ro "Romanès"
-${LangFileString} lng_ru "Rus"
-${LangFileString} lng_rw "Kinyarwanda"
-${LangFileString} lng_sa "Sanskrit"
-${LangFileString} lng_sat "Santali"
-${LangFileString} lng_sat@deva "Santali in Devanagari script"
-${LangFileString} lng_sd "Sindhi"
-${LangFileString} lng_sd@deva "Sindhi in Devanagari script"
-${LangFileString} lng_sk "Eslovac"
-${LangFileString} lng_sl "Esloveni"
-${LangFileString} lng_sq "Albanès"
-${LangFileString} lng_sr "Serbi"
-${LangFileString} lng_sr@latin "Serbi en alfabet llatí"
-${LangFileString} lng_sv "Suec"
-${LangFileString} lng_ta "Tamil"
-${LangFileString} lng_te "Telugu"
-${LangFileString} lng_th "Thai"
-${LangFileString} lng_tr "Turc"
-${LangFileString} lng_uk "Ucraïnès"
-${LangFileString} lng_ur "Urdu"
-${LangFileString} lng_vi "Vietnamese"
-${LangFileString} lng_zh_CN "Xinès simplificat"
-${LangFileString} lng_zh_TW "Xinès tradicional"
${LangFileString} UInstOpt "Opcions de desinstal·lació"
${LangFileString} UInstOpt1 "Seleccioneu les vostres opcions addicionals"
${LangFileString} PurgePrefs "Conserva les preferències personals"
diff --git a/packaging/win32/languages/Catalan_languageNames.nsh b/packaging/win32/languages/Catalan_languageNames.nsh
new file mode 100644
index 000000000..db7430072
--- /dev/null
+++ b/packaging/win32/languages/Catalan_languageNames.nsh
@@ -0,0 +1,94 @@
+### Catalan (ca) translations for language names
+# This file has been automatically created by '_language_lists.py', do not edit it manually!
+# Strings that should be translated are in 'Catalan.nsh'
+${LangFileString} lng_am "Amhàric (am)"
+${LangFileString} lng_ar "Àrab (ar)"
+${LangFileString} lng_as "Assamès (as)"
+${LangFileString} lng_az "Àzeri (az)"
+${LangFileString} lng_be "Bielorús (be)"
+${LangFileString} lng_bg "Búlgar (bg)"
+${LangFileString} lng_bn "Bengalí (bn)"
+${LangFileString} lng_bn_BD "Bengalí/Bangladesh (bn_BD)"
+${LangFileString} lng_br "Bretó (br)"
+${LangFileString} lng_brx "Bodo (brx)"
+${LangFileString} lng_ca "Català (ca)"
+${LangFileString} lng_ca@valencia "Català de València (ca@valencia)"
+${LangFileString} lng_cs "Txec (cs)"
+${LangFileString} lng_da "Danès (da)"
+${LangFileString} lng_de "Alemany (de)"
+${LangFileString} lng_doi "Dogri (doi)"
+${LangFileString} lng_dz "Dzongkha (dz)"
+${LangFileString} lng_el "Grec (el)"
+${LangFileString} lng_en "Anglès (en)"
+${LangFileString} lng_en_AU "Anglès d'Austràlia (en_AU)"
+${LangFileString} lng_en_CA "Anglès del Canadà (en_CA)"
+${LangFileString} lng_en_GB "Anglès de Gran Bretanya (en_GB)"
+${LangFileString} lng_en_US@piglatin "Pig Latin (en_US@piglatin)"
+${LangFileString} lng_eo "Esperanto (eo)"
+${LangFileString} lng_es "Espanyol (es)"
+${LangFileString} lng_es_MX "Espanyol de Mèxic (es_MX)"
+${LangFileString} lng_et "Estonià (et)"
+${LangFileString} lng_eu "Basc (eu)"
+${LangFileString} lng_fa "Persa (fa)"
+${LangFileString} lng_fi "Finès (fi)"
+${LangFileString} lng_fr "Francès (fr)"
+${LangFileString} lng_ga "Irlandès (ga)"
+${LangFileString} lng_gl "Gallec (gl)"
+${LangFileString} lng_gu "Gujarati (gu)"
+${LangFileString} lng_he "Hebreu (he)"
+${LangFileString} lng_hi "Hindi (hi)"
+${LangFileString} lng_hr "Croat (hr)"
+${LangFileString} lng_hu "Hongarès (hu)"
+${LangFileString} lng_hy "Armeni (hy)"
+${LangFileString} lng_id "Indonesi (id)"
+${LangFileString} lng_is "Islandès (is)"
+${LangFileString} lng_it "Italià (it)"
+${LangFileString} lng_ja "Japonès (ja)"
+${LangFileString} lng_km "Khmer (km)"
+${LangFileString} lng_kn "Kanarès (kn)"
+${LangFileString} lng_ko "Coreà (ko)"
+${LangFileString} lng_kok "Konkani (kok)"
+${LangFileString} lng_kok@latin "Konkani amb alfabet llatí (kok@latin)"
+${LangFileString} lng_ks@aran "Caixmiri en l'escriptura perso-àrab (ks@aran)"
+${LangFileString} lng_ks@deva "Caixmiri en l'escriptura devanagari (ks@deva)"
+${LangFileString} lng_lt "Lituà (lt)"
+${LangFileString} lng_lv "Letó (lt)"
+${LangFileString} lng_mai "Maithili (mai)"
+${LangFileString} lng_mk "Macedoni (mk)"
+${LangFileString} lng_ml "Malaiàlam (ml)"
+${LangFileString} lng_mn "Mongol (mn)"
+${LangFileString} lng_mni "Manipuri (mni)"
+${LangFileString} lng_mni@beng "Manipuri amb alfabet bengalí (mni@beng)"
+${LangFileString} lng_mr "Marathi (mr)"
+${LangFileString} lng_nb "Bokmål noruec (nb)"
+${LangFileString} lng_ne "Nepalès (ne)"
+${LangFileString} lng_nl "Holandès (nl)"
+${LangFileString} lng_nn "Nynorsk noruec (nn)"
+${LangFileString} lng_or "Oriya (or)"
+${LangFileString} lng_pa "Panjabi (pa)"
+${LangFileString} lng_pl "Polonès (pl)"
+${LangFileString} lng_pt "Portuguès (pt)"
+${LangFileString} lng_pt_BR "Portuguès del Brasil (pt_BR)"
+${LangFileString} lng_ro "Romanès (ro)"
+${LangFileString} lng_ru "Rus (ru)"
+${LangFileString} lng_rw "Kinyarwanda (rw)"
+${LangFileString} lng_sa "Sànscrit (sa)"
+${LangFileString} lng_sat "Santali (sat)"
+${LangFileString} lng_sat@deva "Santali amb alfabet devanagari (sat@deva)"
+${LangFileString} lng_sd "Sindhi (sd)"
+${LangFileString} lng_sd@deva "Sindhi amb alfabet devanagari (sd@deva)"
+${LangFileString} lng_sk "Eslovac (sk)"
+${LangFileString} lng_sl "Eslovè (sl)"
+${LangFileString} lng_sq "Albanès (sq)"
+${LangFileString} lng_sr "Serbi (sr)"
+${LangFileString} lng_sr@latin "Serbi amb alfabet llatí (sr@latin)"
+${LangFileString} lng_sv "Suec (sv)"
+${LangFileString} lng_ta "Tàmil (ta)"
+${LangFileString} lng_te "Telugu (te)"
+${LangFileString} lng_th "Tai (th)"
+${LangFileString} lng_tr "Turc (tr)"
+${LangFileString} lng_uk "Ucraïnès (uk)"
+${LangFileString} lng_ur "Urdú (ur)"
+${LangFileString} lng_vi "Vietnamita (vi)"
+${LangFileString} lng_zh_CN "Xinès de Xina (zh_CN)"
+${LangFileString} lng_zh_TW "Xinès de Taiwan (zh_TW)"
diff --git a/packaging/win32/languages/Czech.nsh b/packaging/win32/languages/Czech.nsh
index 22385f46b..e02c3ed5d 100644
--- a/packaging/win32/languages/Czech.nsh
+++ b/packaging/win32/languages/Czech.nsh
@@ -44,97 +44,6 @@ ${LangFileString} Dictionaries "Dictionaries"
${LangFileString} DictionariesDesc "Dictionaries for some common languages for spell checking in Inkscape"
${LangFileString} Languages "Jazykové sady"
${LangFileString} LanguagesDesc "Nainstalovat další jazykové sady Inkscape"
-${LangFileString} lng_am "Amharic"
-${LangFileString} lng_ar "Arabic"
-${LangFileString} lng_as "Assamese"
-${LangFileString} lng_az "Azerbajdžánština"
-${LangFileString} lng_be "Běloruština"
-${LangFileString} lng_bg "Bulgarian"
-${LangFileString} lng_bn "Bengali"
-${LangFileString} lng_bn_BD "Bengali Bangladesh"
-${LangFileString} lng_br "Breton"
-${LangFileString} lng_brx "Bodo"
-${LangFileString} lng_ca "Katalánština"
-${LangFileString} lng_ca@valencia "Valencian Catalan"
-${LangFileString} lng_cs "Čeština"
-${LangFileString} lng_da "Dánština"
-${LangFileString} lng_de "Němčina"
-${LangFileString} lng_doi "Dogri"
-${LangFileString} lng_dz "Dzongkha"
-${LangFileString} lng_el "Řečtina"
-${LangFileString} lng_en "Angličina"
-${LangFileString} lng_en_AU "Australian English"
-${LangFileString} lng_en_CA "Kanadská Angličtina"
-${LangFileString} lng_en_GB "Britská Angličtina"
-${LangFileString} lng_en_US@piglatin "Pig Latin"
-${LangFileString} lng_eo "Esperanto"
-${LangFileString} lng_es "Španělština"
-${LangFileString} lng_es_MX "Mexická Španělština"
-${LangFileString} lng_et "Estonština"
-${LangFileString} lng_eu "Basque"
-${LangFileString} lng_fa "Farsi"
-${LangFileString} lng_fi "Finština"
-${LangFileString} lng_fr "Francouzština"
-${LangFileString} lng_ga "Irština"
-${LangFileString} lng_gl "Galician"
-${LangFileString} lng_gu "Gujarati"
-${LangFileString} lng_he "Hebrew"
-${LangFileString} lng_hi "Hindi"
-${LangFileString} lng_hr "Chorvatština"
-${LangFileString} lng_hu "Maďarština"
-${LangFileString} lng_hy "Armenian"
-${LangFileString} lng_id "Indonesian"
-${LangFileString} lng_is "Icelandic"
-${LangFileString} lng_it "Italština"
-${LangFileString} lng_ja "Japonština"
-${LangFileString} lng_km "Khmer"
-${LangFileString} lng_kn "Kannada"
-${LangFileString} lng_ko "Korejština"
-${LangFileString} lng_kok "Konkani"
-${LangFileString} lng_kok@latin "Konkani in Latin script"
-${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script"
-${LangFileString} lng_ks@deva "Kashmiri in Devanagari script"
-${LangFileString} lng_lt "Litevština"
-${LangFileString} lng_lv "Latvian"
-${LangFileString} lng_mai "Maithili"
-${LangFileString} lng_mk "Makedonština"
-${LangFileString} lng_ml "Malayalam"
-${LangFileString} lng_mn "Mongolština"
-${LangFileString} lng_mni "Manipuri"
-${LangFileString} lng_mni@beng "Manipuri in Bengali script"
-${LangFileString} lng_mr "Marathi"
-${LangFileString} lng_nb "Norština Bokmal"
-${LangFileString} lng_ne "Nepálština"
-${LangFileString} lng_nl "Holandština"
-${LangFileString} lng_nn "Norština Nynorsk"
-${LangFileString} lng_or "Odia"
-${LangFileString} lng_pa "Panjabi"
-${LangFileString} lng_pl "Polština"
-${LangFileString} lng_pt "Portugalština"
-${LangFileString} lng_pt_BR "Brazilská Portugalština"
-${LangFileString} lng_ro "Romanian"
-${LangFileString} lng_ru "Ruština"
-${LangFileString} lng_rw "Kinyarwanda"
-${LangFileString} lng_sa "Sanskrit"
-${LangFileString} lng_sat "Santali"
-${LangFileString} lng_sat@deva "Santali in Devanagari script"
-${LangFileString} lng_sd "Sindhi"
-${LangFileString} lng_sd@deva "Sindhi in Devanagari script"
-${LangFileString} lng_sk "Slovenština"
-${LangFileString} lng_sl "Slovinština"
-${LangFileString} lng_sq "Albánština"
-${LangFileString} lng_sr "Srbština"
-${LangFileString} lng_sr@latin "Srbština v latince"
-${LangFileString} lng_sv "Švédština"
-${LangFileString} lng_ta "Tamil"
-${LangFileString} lng_te "Telugu"
-${LangFileString} lng_th "Thai"
-${LangFileString} lng_tr "Turečtina"
-${LangFileString} lng_uk "Ukrajinština"
-${LangFileString} lng_ur "Urdu"
-${LangFileString} lng_vi "Vietnamština"
-${LangFileString} lng_zh_CN "Zjednodušená Čínština"
-${LangFileString} lng_zh_TW "Tradiční Čínština"
${LangFileString} UInstOpt "Volby pro odinstalování"
${LangFileString} UInstOpt1 "Vyberte prosím další nastavení"
${LangFileString} PurgePrefs "Ponechat osobní nastavení"
diff --git a/packaging/win32/languages/Czech_languageNames.nsh b/packaging/win32/languages/Czech_languageNames.nsh
new file mode 100644
index 000000000..83fc5ad66
--- /dev/null
+++ b/packaging/win32/languages/Czech_languageNames.nsh
@@ -0,0 +1,94 @@
+### Czech (cs) translations for language names
+# This file has been automatically created by '_language_lists.py', do not edit it manually!
+# Strings that should be translated are in 'Czech.nsh'
+${LangFileString} lng_am "amharština (am)"
+${LangFileString} lng_ar "arabština (ar)"
+${LangFileString} lng_as "Assamese (as)"
+${LangFileString} lng_az "azerbajdžánština (az)"
+${LangFileString} lng_be "běloruština (be)"
+${LangFileString} lng_bg "bulharština (bg)"
+${LangFileString} lng_bn "bengálština (bn)"
+${LangFileString} lng_bn_BD "Bengali/Bangladesh (bn_BD)"
+${LangFileString} lng_br "bretonština (br)"
+${LangFileString} lng_brx "Bodo (brx)"
+${LangFileString} lng_ca "katalánština (ca)"
+${LangFileString} lng_ca@valencia "valencijská katalánština (ca@valencia)"
+${LangFileString} lng_cs "čeština (cs)"
+${LangFileString} lng_da "dánština (da)"
+${LangFileString} lng_de "němčina (de)"
+${LangFileString} lng_doi "Dogri (doi)"
+${LangFileString} lng_dz "Dzongkä (dz)"
+${LangFileString} lng_el "řečtina (el)"
+${LangFileString} lng_en "English (en)"
+${LangFileString} lng_en_AU "angličtina (Austrálie) (en_AU)"
+${LangFileString} lng_en_CA "angličtina (Kanada) (en_CA)"
+${LangFileString} lng_en_GB "angličtina (Spojené království) (en_GB)"
+${LangFileString} lng_en_US@piglatin "Pig Latin (en_US@piglatin)"
+${LangFileString} lng_eo "Esperanto (eo)"
+${LangFileString} lng_es "španělština (es)"
+${LangFileString} lng_es_MX "španělština (Mexiko) (es_MX)"
+${LangFileString} lng_et "estonština (et)"
+${LangFileString} lng_eu "Basque (eu)"
+${LangFileString} lng_fa "Farsi (fa)"
+${LangFileString} lng_fi "finština (fi)"
+${LangFileString} lng_fr "francouzština (fr)"
+${LangFileString} lng_ga "irština (ga)"
+${LangFileString} lng_gl "galicijština (gl)"
+${LangFileString} lng_gu "Gujarati (gu)"
+${LangFileString} lng_he "hebrejština (he)"
+${LangFileString} lng_hi "Hindi (hi)"
+${LangFileString} lng_hr "chorvatština (hr)"
+${LangFileString} lng_hu "maďarština (hu)"
+${LangFileString} lng_hy "arménština (hy)"
+${LangFileString} lng_id "indonéština (id)"
+${LangFileString} lng_is "Icelandic (is)"
+${LangFileString} lng_it "Italian (it)"
+${LangFileString} lng_ja "japonština (ja)"
+${LangFileString} lng_km "khmerština (km)"
+${LangFileString} lng_kn "Kannada (kn)"
+${LangFileString} lng_ko "korejština (ko)"
+${LangFileString} lng_kok "Konkani (kok)"
+${LangFileString} lng_kok@latin "Konkani in Latin script (kok@latin)"
+${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script (ks@aran)"
+${LangFileString} lng_ks@deva "Kashmiri in Devanagari script (ks@deva)"
+${LangFileString} lng_lt "litevština (lt)"
+${LangFileString} lng_lv "Latvian (lv)"
+${LangFileString} lng_mai "Maithili (mai)"
+${LangFileString} lng_mk "makedonština (mk)"
+${LangFileString} lng_ml "Malayalam (ml)"
+${LangFileString} lng_mn "mongolština (mn)"
+${LangFileString} lng_mni "Manipuri (mni)"
+${LangFileString} lng_mni@beng "Manipuri in Bengali script (mni@beng)"
+${LangFileString} lng_mr "Marathi (mr)"
+${LangFileString} lng_nb "Norwegian Bokmål (nb)"
+${LangFileString} lng_ne "Nepali (ne)"
+${LangFileString} lng_nl "nizozemština (nl)"
+${LangFileString} lng_nn "norský nynorsk (nn)"
+${LangFileString} lng_or "Odia (or)"
+${LangFileString} lng_pa "paňdžábština (pa)"
+${LangFileString} lng_pl "polština (pl)"
+${LangFileString} lng_pt "portugalština (pt)"
+${LangFileString} lng_pt_BR "portugalština (Brazílie) (pt_BR)"
+${LangFileString} lng_ro "rumunština (ro)"
+${LangFileString} lng_ru "ruština (ru)"
+${LangFileString} lng_rw "rwandština (rw)"
+${LangFileString} lng_sa "Sanskrit (sa)"
+${LangFileString} lng_sat "Santali (sat)"
+${LangFileString} lng_sat@deva "Santali in Devanagari script (sat@deva)"
+${LangFileString} lng_sd "Sindhi (sd)"
+${LangFileString} lng_sd@deva "Sindhi in Devanagari script (sd@deva)"
+${LangFileString} lng_sk "slovenština (sk)"
+${LangFileString} lng_sl "slovinština (sl)"
+${LangFileString} lng_sq "albánština (sq)"
+${LangFileString} lng_sr "srbština (sr)"
+${LangFileString} lng_sr@latin "srbština (latinka) (sr@latin)"
+${LangFileString} lng_sv "švédština (sv)"
+${LangFileString} lng_ta "Tamil (ta)"
+${LangFileString} lng_te "Telugu (te)"
+${LangFileString} lng_th "thajština (th)"
+${LangFileString} lng_tr "turečtina (tr)"
+${LangFileString} lng_uk "ukrajinština (uk)"
+${LangFileString} lng_ur "Urdu (ur)"
+${LangFileString} lng_vi "vietnamština (vi)"
+${LangFileString} lng_zh_CN "čínština (Čína) (zh_CN)"
+${LangFileString} lng_zh_TW "čínština (Taiwan) (zh_TW)"
diff --git a/packaging/win32/languages/Danish.nsh b/packaging/win32/languages/Danish.nsh
index 8091b92f9..881536844 100644
--- a/packaging/win32/languages/Danish.nsh
+++ b/packaging/win32/languages/Danish.nsh
@@ -44,97 +44,6 @@ ${LangFileString} Dictionaries "Ordbøger"
${LangFileString} DictionariesDesc "Ordbøger til nogle almene sprog til stavekontrol i Inkscape"
${LangFileString} Languages "Oversættelser"
${LangFileString} LanguagesDesc "Installér diverse oversættelser til Inkscape"
-${LangFileString} lng_am "Amharisk"
-${LangFileString} lng_ar "Arabisk"
-${LangFileString} lng_as "Assamesisk"
-${LangFileString} lng_az "Aserbajdsjansk"
-${LangFileString} lng_be "Hviderussisk"
-${LangFileString} lng_bg "Bulgarsk"
-${LangFileString} lng_bn "Bengalsk"
-${LangFileString} lng_bn_BD "Bengalsk (Bangladesh)"
-${LangFileString} lng_br "Bretonsk"
-${LangFileString} lng_brx "Bodo"
-${LangFileString} lng_ca "Katalansk"
-${LangFileString} lng_ca@valencia "Katalansk (Valenciansk)"
-${LangFileString} lng_cs "Tjekkisk"
-${LangFileString} lng_da "Dansk"
-${LangFileString} lng_de "Tysk"
-${LangFileString} lng_doi "Dogri"
-${LangFileString} lng_dz "Dzongkha"
-${LangFileString} lng_el "Græsk"
-${LangFileString} lng_en "Engelsk"
-${LangFileString} lng_en_AU "Engelsk (Australsk)"
-${LangFileString} lng_en_CA "Engelsk (Canadisk)"
-${LangFileString} lng_en_GB "Engelsk (Britisk)"
-${LangFileString} lng_en_US@piglatin "Pig Latin"
-${LangFileString} lng_eo "Esperanto"
-${LangFileString} lng_es "Spansk"
-${LangFileString} lng_es_MX "Spansk (Mexicansk)"
-${LangFileString} lng_et "Estisk"
-${LangFileString} lng_eu "Baskisk"
-${LangFileString} lng_fa "Farsi"
-${LangFileString} lng_fi "Finsk"
-${LangFileString} lng_fr "Fransk"
-${LangFileString} lng_ga "Irsk"
-${LangFileString} lng_gl "Galicisk"
-${LangFileString} lng_gu "Gujarati"
-${LangFileString} lng_he "Hebraisk"
-${LangFileString} lng_hi "Hindi"
-${LangFileString} lng_hr "Kroatisk"
-${LangFileString} lng_hu "Ungarsk"
-${LangFileString} lng_hy "Armensk"
-${LangFileString} lng_id "Indonesisk"
-${LangFileString} lng_is "Islandsk"
-${LangFileString} lng_it "Italiensk"
-${LangFileString} lng_ja "Japansk"
-${LangFileString} lng_km "Khmer"
-${LangFileString} lng_kn "Kannada"
-${LangFileString} lng_ko "Koreansk"
-${LangFileString} lng_kok "Konkani"
-${LangFileString} lng_kok@latin "Konkani i latinsk skrift"
-${LangFileString} lng_ks@aran "Kashmiri i persisk-arabisk skrift"
-${LangFileString} lng_ks@deva "Kashmiri i devanagari skrift"
-${LangFileString} lng_lt "Litauisk"
-${LangFileString} lng_lv "Lettisk"
-${LangFileString} lng_mai "Maithili"
-${LangFileString} lng_mk "Makedonsk"
-${LangFileString} lng_ml "Malayalam"
-${LangFileString} lng_mn "Mongolsk"
-${LangFileString} lng_mni "Manipuri"
-${LangFileString} lng_mni@beng "Manipuri i bengali skrift"
-${LangFileString} lng_mr "Marathi"
-${LangFileString} lng_nb "Norsk (Bogmål)"
-${LangFileString} lng_ne "Nepalesisk"
-${LangFileString} lng_nl "Nederlandsk"
-${LangFileString} lng_nn "Norsk (Nynorsk)"
-${LangFileString} lng_or "Oriya"
-${LangFileString} lng_pa "Punjabisk"
-${LangFileString} lng_pl "Polsk"
-${LangFileString} lng_pt "Portugisisk"
-${LangFileString} lng_pt_BR "Portugisisk (Brasiliansk)"
-${LangFileString} lng_ro "Rumænsk"
-${LangFileString} lng_ru "Russisk"
-${LangFileString} lng_rw "Kinyarwanda"
-${LangFileString} lng_sa "Sanskrit"
-${LangFileString} lng_sat "Santali"
-${LangFileString} lng_sat@deva "Santali i devanagari skrift"
-${LangFileString} lng_sd "Sindhi"
-${LangFileString} lng_sd@deva "Sindhi i devanagari skrift"
-${LangFileString} lng_sk "Slovakisk"
-${LangFileString} lng_sl "Slovensk"
-${LangFileString} lng_sq "Albansk"
-${LangFileString} lng_sr "Serbisk"
-${LangFileString} lng_sr@latin "Serbisk i latinsk skrift"
-${LangFileString} lng_sv "Svensk"
-${LangFileString} lng_ta "Tamil"
-${LangFileString} lng_te "Telugu"
-${LangFileString} lng_th "Thai"
-${LangFileString} lng_tr "Tyrkisk"
-${LangFileString} lng_uk "Ukrainsk"
-${LangFileString} lng_ur "Urdu"
-${LangFileString} lng_vi "Vietnamesisk"
-${LangFileString} lng_zh_CN "Kinesisk (forenklet)"
-${LangFileString} lng_zh_TW "Kinesisk (traditionel)"
${LangFileString} UInstOpt "Valgmuligheder for afinstallation"
${LangFileString} UInstOpt1 "Foretag venligst dine valg af yderligere valgmuligheder"
${LangFileString} PurgePrefs "Behold personlige præferencer"
diff --git a/packaging/win32/languages/Danish_languageNames.nsh b/packaging/win32/languages/Danish_languageNames.nsh
new file mode 100644
index 000000000..4e7368910
--- /dev/null
+++ b/packaging/win32/languages/Danish_languageNames.nsh
@@ -0,0 +1,94 @@
+### Danish (da) translations for language names
+# This file has been automatically created by '_language_lists.py', do not edit it manually!
+# Strings that should be translated are in 'Danish.nsh'
+${LangFileString} lng_am "Amharic (am)"
+${LangFileString} lng_ar "Arabic (ar)"
+${LangFileString} lng_as "Assamese (as)"
+${LangFileString} lng_az "Azerbaijani (az)"
+${LangFileString} lng_be "Belarusian (be)"
+${LangFileString} lng_bg "Bulgarian (bg)"
+${LangFileString} lng_bn "Bengali (bn)"
+${LangFileString} lng_bn_BD "Bengali/Bangladesh (bn_BD)"
+${LangFileString} lng_br "Breton (br)"
+${LangFileString} lng_brx "Bodo (brx)"
+${LangFileString} lng_ca "Catalan (ca)"
+${LangFileString} lng_ca@valencia "Valencian Catalan (ca@valencia)"
+${LangFileString} lng_cs "Czech (cs)"
+${LangFileString} lng_da "Dansk (da)"
+${LangFileString} lng_de "German (de)"
+${LangFileString} lng_doi "Dogri (doi)"
+${LangFileString} lng_dz "Dzongkha (dz)"
+${LangFileString} lng_el "Greek (el)"
+${LangFileString} lng_en "Engelsk (en)"
+${LangFileString} lng_en_AU "English/Australia (en_AU)"
+${LangFileString} lng_en_CA "English/Canada (en_CA)"
+${LangFileString} lng_en_GB "English/Great Britain (en_GB)"
+${LangFileString} lng_en_US@piglatin "Pig Latin (en_US@piglatin)"
+${LangFileString} lng_eo "Esperanto (eo)"
+${LangFileString} lng_es "Spanish (es)"
+${LangFileString} lng_es_MX "Spanish/Mexico (es_MX)"
+${LangFileString} lng_et "Estonian (et)"
+${LangFileString} lng_eu "Basque (eu)"
+${LangFileString} lng_fa "Farsi (fa)"
+${LangFileString} lng_fi "Finnish (fi)"
+${LangFileString} lng_fr "French (fr)"
+${LangFileString} lng_ga "Irish (ga)"
+${LangFileString} lng_gl "Galician (gl)"
+${LangFileString} lng_gu "Gujarati (gu)"
+${LangFileString} lng_he "Hebrew (he)"
+${LangFileString} lng_hi "Hindi (hi)"
+${LangFileString} lng_hr "Croatian (hr)"
+${LangFileString} lng_hu "Hungarian (hu)"
+${LangFileString} lng_hy "Armenian (hy)"
+${LangFileString} lng_id "Indonesian (id)"
+${LangFileString} lng_is "Icelandic (is)"
+${LangFileString} lng_it "Italian (it)"
+${LangFileString} lng_ja "Japanese (ja)"
+${LangFileString} lng_km "Khmer (km)"
+${LangFileString} lng_kn "Kannada (kn)"
+${LangFileString} lng_ko "Korean (ko)"
+${LangFileString} lng_kok "Konkani (kok)"
+${LangFileString} lng_kok@latin "Konkani in Latin script (kok@latin)"
+${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script (ks@aran)"
+${LangFileString} lng_ks@deva "Kashmiri in Devanagari script (ks@deva)"
+${LangFileString} lng_lt "Lithuanian (lt)"
+${LangFileString} lng_lv "Latvian (lv)"
+${LangFileString} lng_mai "Maithili (mai)"
+${LangFileString} lng_mk "Macedonian (mk)"
+${LangFileString} lng_ml "Malayalam (ml)"
+${LangFileString} lng_mn "Mongolian (mn)"
+${LangFileString} lng_mni "Manipuri (mni)"
+${LangFileString} lng_mni@beng "Manipuri in Bengali script (mni@beng)"
+${LangFileString} lng_mr "Marathi (mr)"
+${LangFileString} lng_nb "Norwegian Bokmål (nb)"
+${LangFileString} lng_ne "Nepali (ne)"
+${LangFileString} lng_nl "Dutch (nl)"
+${LangFileString} lng_nn "Norwegian Nynorsk (nn)"
+${LangFileString} lng_or "Odia (or)"
+${LangFileString} lng_pa "Panjabi (pa)"
+${LangFileString} lng_pl "Polish (pl)"
+${LangFileString} lng_pt "Portuguese (pt)"
+${LangFileString} lng_pt_BR "Portuguese/Brazil (pt_BR)"
+${LangFileString} lng_ro "Romanian (ro)"
+${LangFileString} lng_ru "Russian (ru)"
+${LangFileString} lng_rw "Kinyarwanda (rw)"
+${LangFileString} lng_sa "Sanskrit (sa)"
+${LangFileString} lng_sat "Santali (sat)"
+${LangFileString} lng_sat@deva "Santali in Devanagari script (sat@deva)"
+${LangFileString} lng_sd "Sindhi (sd)"
+${LangFileString} lng_sd@deva "Sindhi in Devanagari script (sd@deva)"
+${LangFileString} lng_sk "Slovak (sk)"
+${LangFileString} lng_sl "Slovenian (sl)"
+${LangFileString} lng_sq "Albanian (sq)"
+${LangFileString} lng_sr "Serbian (sr)"
+${LangFileString} lng_sr@latin "Serbian in Latin script (sr@latin)"
+${LangFileString} lng_sv "Swedish (sv)"
+${LangFileString} lng_ta "Tamil (ta)"
+${LangFileString} lng_te "Telugu (te)"
+${LangFileString} lng_th "Thai (th)"
+${LangFileString} lng_tr "Turkish (tr)"
+${LangFileString} lng_uk "Ukrainian (uk)"
+${LangFileString} lng_ur "Urdu (ur)"
+${LangFileString} lng_vi "Vietnamese (vi)"
+${LangFileString} lng_zh_CN "Chinese/China (zh_CN)"
+${LangFileString} lng_zh_TW "Chinese/Taiwan (zh_TW)"
diff --git a/packaging/win32/languages/Dutch.nsh b/packaging/win32/languages/Dutch.nsh
index 27ce36bd8..4031edf81 100644
--- a/packaging/win32/languages/Dutch.nsh
+++ b/packaging/win32/languages/Dutch.nsh
@@ -44,97 +44,6 @@ ${LangFileString} Dictionaries "Dictionaries"
${LangFileString} DictionariesDesc "Dictionaries for some common languages for spell checking in Inkscape"
${LangFileString} Languages "Vertalingen"
${LangFileString} LanguagesDesc "Diverse vertalingen voor Inkscape installeren"
-${LangFileString} lng_am "Amhaars"
-${LangFileString} lng_ar "Arabisch"
-${LangFileString} lng_as "Assamese"
-${LangFileString} lng_az "Azeri"
-${LangFileString} lng_be "Wit-Russisch"
-${LangFileString} lng_bg "Bulgaars"
-${LangFileString} lng_bn "Bengaals"
-${LangFileString} lng_bn_BD "Bengali Bangladesh"
-${LangFileString} lng_br "Bretoens"
-${LangFileString} lng_brx "Bodo"
-${LangFileString} lng_ca "Catalaans"
-${LangFileString} lng_ca@valencia "Catalaans/Valencia"
-${LangFileString} lng_cs "Tsjechisch"
-${LangFileString} lng_da "Deens"
-${LangFileString} lng_de "Duits"
-${LangFileString} lng_doi "Dogri"
-${LangFileString} lng_dz "Dzongkha"
-${LangFileString} lng_el "Grieks"
-${LangFileString} lng_en "Engels"
-${LangFileString} lng_en_AU "Engels/Australië"
-${LangFileString} lng_en_CA "Engels/Canada"
-${LangFileString} lng_en_GB "Engels/Groot-Brittannië"
-${LangFileString} lng_en_US@piglatin "Pig Latin"
-${LangFileString} lng_eo "Esperanto"
-${LangFileString} lng_es "Spaans"
-${LangFileString} lng_es_MX "Spaans/Mexico"
-${LangFileString} lng_et "Ests"
-${LangFileString} lng_eu "Baskisch"
-${LangFileString} lng_fa "Perzisch"
-${LangFileString} lng_fi "Fins"
-${LangFileString} lng_fr "Frans"
-${LangFileString} lng_ga "Iers"
-${LangFileString} lng_gl "Galisisch"
-${LangFileString} lng_gu "Gujarati"
-${LangFileString} lng_he "Hebreeuws"
-${LangFileString} lng_hi "Hindi"
-${LangFileString} lng_hr "Kroatisch"
-${LangFileString} lng_hu "Hongaars"
-${LangFileString} lng_hy "Armenian"
-${LangFileString} lng_id "Indonesisch"
-${LangFileString} lng_is "Icelandic"
-${LangFileString} lng_it "Italiaans"
-${LangFileString} lng_ja "Japans"
-${LangFileString} lng_km "Khmer"
-${LangFileString} lng_kn "Kannada"
-${LangFileString} lng_ko "Koreaans"
-${LangFileString} lng_kok "Konkani"
-${LangFileString} lng_kok@latin "Konkani in Latin script"
-${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script"
-${LangFileString} lng_ks@deva "Kashmiri in Devanagari script"
-${LangFileString} lng_lt "Litouws"
-${LangFileString} lng_lv "Latvian"
-${LangFileString} lng_mai "Maithili"
-${LangFileString} lng_mk "Macedonisch"
-${LangFileString} lng_ml "Malayalam"
-${LangFileString} lng_mn "Mongools"
-${LangFileString} lng_mni "Manipuri"
-${LangFileString} lng_mni@beng "Manipuri in Bengali script"
-${LangFileString} lng_mr "Marathi"
-${LangFileString} lng_nb "Noors Bokmål"
-${LangFileString} lng_ne "Nepalees"
-${LangFileString} lng_nl "Nederlands"
-${LangFileString} lng_nn "Noors Nynorsk"
-${LangFileString} lng_or "Odia"
-${LangFileString} lng_pa "Punjabi"
-${LangFileString} lng_pl "Pools"
-${LangFileString} lng_pt "Portugees"
-${LangFileString} lng_pt_BR "Portugees/Brazilië"
-${LangFileString} lng_ro "Roemeens"
-${LangFileString} lng_ru "Russisch"
-${LangFileString} lng_rw "Rwandees"
-${LangFileString} lng_sa "Sanskrit"
-${LangFileString} lng_sat "Santali"
-${LangFileString} lng_sat@deva "Santali in Devanagari script"
-${LangFileString} lng_sd "Sindhi"
-${LangFileString} lng_sd@deva "Sindhi in Devanagari script"
-${LangFileString} lng_sk "Slovaaks"
-${LangFileString} lng_sl "Sloveens"
-${LangFileString} lng_sq "Albanees"
-${LangFileString} lng_sr "Servisch"
-${LangFileString} lng_sr@latin "Servisch in Latijnse karakters"
-${LangFileString} lng_sv "Zweeds"
-${LangFileString} lng_ta "Tamil"
-${LangFileString} lng_te "Telugu"
-${LangFileString} lng_th "Thai"
-${LangFileString} lng_tr "Turks"
-${LangFileString} lng_uk "Oekraïens"
-${LangFileString} lng_ur "Urdu"
-${LangFileString} lng_vi "Vietnamees"
-${LangFileString} lng_zh_CN "Vereenvoudigd Chinees"
-${LangFileString} lng_zh_TW "Traditioneel Chinees"
${LangFileString} UInstOpt "Deïnstallatieopties"
${LangFileString} UInstOpt1 "Maak alstublief je keuzes voor additionele opties"
${LangFileString} PurgePrefs "Persoonlijke voorkeuren behouden"
diff --git a/packaging/win32/languages/Dutch_languageNames.nsh b/packaging/win32/languages/Dutch_languageNames.nsh
new file mode 100644
index 000000000..146f855b3
--- /dev/null
+++ b/packaging/win32/languages/Dutch_languageNames.nsh
@@ -0,0 +1,94 @@
+### Dutch (nl) translations for language names
+# This file has been automatically created by '_language_lists.py', do not edit it manually!
+# Strings that should be translated are in 'Dutch.nsh'
+${LangFileString} lng_am "Amhaars (am)"
+${LangFileString} lng_ar "Arabisch (ar)"
+${LangFileString} lng_as "Assamees (as)"
+${LangFileString} lng_az "Azerbeidzjaans (az)"
+${LangFileString} lng_be "Wit-Russisch (be)"
+${LangFileString} lng_bg "Bulgaars (bg)"
+${LangFileString} lng_bn "Bengaals (bn)"
+${LangFileString} lng_bn_BD "Bengaals/Bangladesh (bn_BD)"
+${LangFileString} lng_br "Bretoens (br)"
+${LangFileString} lng_brx "Bodo (brx)"
+${LangFileString} lng_ca "Catalaans (ca)"
+${LangFileString} lng_ca@valencia "Catalaans/Valencia (ca@valencia)"
+${LangFileString} lng_cs "Tsjechisch (cs)"
+${LangFileString} lng_da "Deens (da)"
+${LangFileString} lng_de "Duits (de)"
+${LangFileString} lng_doi "Dogri (doi)"
+${LangFileString} lng_dz "Dzongkha (dz)"
+${LangFileString} lng_el "Grieks (el)"
+${LangFileString} lng_en "English (en)"
+${LangFileString} lng_en_AU "Engels/Australië (en_AU)"
+${LangFileString} lng_en_CA "Engels/Canada (en_CA)"
+${LangFileString} lng_en_GB "Engels/Groot-Brittannië (en_GB)"
+${LangFileString} lng_en_US@piglatin "Pig Latin (en_US@piglatin)"
+${LangFileString} lng_eo "Esperanto (eo)"
+${LangFileString} lng_es "Spaans (es)"
+${LangFileString} lng_es_MX "Spaans/Mexico (es_MX)"
+${LangFileString} lng_et "Ests (et)"
+${LangFileString} lng_eu "Baskisch (eu)"
+${LangFileString} lng_fa "Perzisch (fa)"
+${LangFileString} lng_fi "Fins (fi)"
+${LangFileString} lng_fr "Frans (fr)"
+${LangFileString} lng_ga "Iers (ga)"
+${LangFileString} lng_gl "Galisisch (gl)"
+${LangFileString} lng_gu "Gujarati (gu)"
+${LangFileString} lng_he "Hebreeuws (he)"
+${LangFileString} lng_hi "Hindi (hi)"
+${LangFileString} lng_hr "Kroatisch (hr)"
+${LangFileString} lng_hu "Hongaars (hu)"
+${LangFileString} lng_hy "Armeens (hy)"
+${LangFileString} lng_id "Indonesisch (id)"
+${LangFileString} lng_is "Ijslands (is)"
+${LangFileString} lng_it "Italiaans (it)"
+${LangFileString} lng_ja "Japans (ja)"
+${LangFileString} lng_km "Khmer (km)"
+${LangFileString} lng_kn "Kannada (kn)"
+${LangFileString} lng_ko "Koreaans (ko)"
+${LangFileString} lng_kok "Konkani (kok)"
+${LangFileString} lng_kok@latin "Konkani in Latijnse karakters (kok@latin)"
+${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script (ks@aran)"
+${LangFileString} lng_ks@deva "Kashmiri in Devanagari schrift (ks@deva)"
+${LangFileString} lng_lt "Litouws (lt)"
+${LangFileString} lng_lv "Lets (lv)"
+${LangFileString} lng_mai "Maithili (mai)"
+${LangFileString} lng_mk "Macedonisch (mk)"
+${LangFileString} lng_ml "Malayalam (ml)"
+${LangFileString} lng_mn "Mongools (mn)"
+${LangFileString} lng_mni "Manipuri (mni)"
+${LangFileString} lng_mni@beng "Manipuri in Bengaals schrift (mni@beng)"
+${LangFileString} lng_mr "Marathi (mr)"
+${LangFileString} lng_nb "Noors Bokmål (nb)"
+${LangFileString} lng_ne "Nepalees (ne)"
+${LangFileString} lng_nl "Nederlands (nl)"
+${LangFileString} lng_nn "Noors Nynorsk (nn)"
+${LangFileString} lng_or "Oriya (or)"
+${LangFileString} lng_pa "Punjabi (pa)"
+${LangFileString} lng_pl "Pools (pl)"
+${LangFileString} lng_pt "Portugees (pt)"
+${LangFileString} lng_pt_BR "Portugees/Brazillië (pt_BR)"
+${LangFileString} lng_ro "Roemeens (ro)"
+${LangFileString} lng_ru "Russisch (ru)"
+${LangFileString} lng_rw "Rwandees (rw)"
+${LangFileString} lng_sa "Sanskriet (sa)"
+${LangFileString} lng_sat "Santali (sat)"
+${LangFileString} lng_sat@deva "Santali in Devanagari schrift (sat@deva)"
+${LangFileString} lng_sd "Sindhi (sd)"
+${LangFileString} lng_sd@deva "Sindhi in Devanagari schrift (sd@deva)"
+${LangFileString} lng_sk "Slowaaks (sk)"
+${LangFileString} lng_sl "Sloveens (sl)"
+${LangFileString} lng_sq "Albanees (sq)"
+${LangFileString} lng_sr "Servisch (sr)"
+${LangFileString} lng_sr@latin "Servisch in Latijnse karakters (sr@latin)"
+${LangFileString} lng_sv "Zweeds (sv)"
+${LangFileString} lng_ta "Tamil (ta)"
+${LangFileString} lng_te "Telugu (te)"
+${LangFileString} lng_th "Thai (th)"
+${LangFileString} lng_tr "Turks (tr)"
+${LangFileString} lng_uk "Oekraïens (uk)"
+${LangFileString} lng_ur "Urdu (ur)"
+${LangFileString} lng_vi "Vietnamees (vi)"
+${LangFileString} lng_zh_CN "Chinees/China (zh_CN)"
+${LangFileString} lng_zh_TW "Chinees/Taiwan (zh_TW)"
diff --git a/packaging/win32/languages/English.nsh b/packaging/win32/languages/English.nsh
index be6d6c217..6c6700caa 100644
--- a/packaging/win32/languages/English.nsh
+++ b/packaging/win32/languages/English.nsh
@@ -44,97 +44,6 @@ ${LangFileString} Dictionaries "Dictionaries"
${LangFileString} DictionariesDesc "Dictionaries for some common languages for spell checking in Inkscape"
${LangFileString} Languages "Translations"
${LangFileString} LanguagesDesc "Translations and localized content for Inkscape"
-${LangFileString} lng_am "Amharic"
-${LangFileString} lng_ar "Arabic"
-${LangFileString} lng_as "Assamese"
-${LangFileString} lng_az "Azerbaijani"
-${LangFileString} lng_be "Belarusian"
-${LangFileString} lng_bg "Bulgarian"
-${LangFileString} lng_bn "Bengali"
-${LangFileString} lng_bn_BD "Bengali Bangladesh"
-${LangFileString} lng_br "Breton"
-${LangFileString} lng_brx "Bodo"
-${LangFileString} lng_ca "Catalan"
-${LangFileString} lng_ca@valencia "Valencian Catalan"
-${LangFileString} lng_cs "Czech"
-${LangFileString} lng_da "Danish"
-${LangFileString} lng_de "German"
-${LangFileString} lng_doi "Dogri"
-${LangFileString} lng_dz "Dzongkha"
-${LangFileString} lng_el "Greek"
-${LangFileString} lng_en "English"
-${LangFileString} lng_en_AU "Australian English"
-${LangFileString} lng_en_CA "Canadian English"
-${LangFileString} lng_en_GB "British English"
-${LangFileString} lng_en_US@piglatin "Pig Latin"
-${LangFileString} lng_eo "Esperanto"
-${LangFileString} lng_es "Spanish"
-${LangFileString} lng_es_MX "Mexican Spanish"
-${LangFileString} lng_et "Estonian"
-${LangFileString} lng_eu "Basque"
-${LangFileString} lng_fa "Farsi"
-${LangFileString} lng_fi "Finnish"
-${LangFileString} lng_fr "French"
-${LangFileString} lng_ga "Irish"
-${LangFileString} lng_gl "Galician"
-${LangFileString} lng_gu "Gujarati"
-${LangFileString} lng_he "Hebrew"
-${LangFileString} lng_hi "Hindi"
-${LangFileString} lng_hr "Croatian"
-${LangFileString} lng_hu "Hungarian"
-${LangFileString} lng_hy "Armenian"
-${LangFileString} lng_id "Indonesian"
-${LangFileString} lng_is "Icelandic"
-${LangFileString} lng_it "Italian"
-${LangFileString} lng_ja "Japanese"
-${LangFileString} lng_km "Khmer"
-${LangFileString} lng_kn "Kannada"
-${LangFileString} lng_ko "Korean"
-${LangFileString} lng_kok "Konkani"
-${LangFileString} lng_kok@latin "Konkani in Latin script"
-${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script"
-${LangFileString} lng_ks@deva "Kashmiri in Devanagari script"
-${LangFileString} lng_lt "Lithuanian"
-${LangFileString} lng_lv "Latvian"
-${LangFileString} lng_mai "Maithili"
-${LangFileString} lng_mk "Macedonian"
-${LangFileString} lng_ml "Malayalam"
-${LangFileString} lng_mn "Mongolian"
-${LangFileString} lng_mni "Manipuri"
-${LangFileString} lng_mni@beng "Manipuri in Bengali script"
-${LangFileString} lng_mr "Marathi"
-${LangFileString} lng_nb "Norwegian Bokmål"
-${LangFileString} lng_ne "Nepali"
-${LangFileString} lng_nl "Dutch"
-${LangFileString} lng_nn "Norwegian Nynorsk"
-${LangFileString} lng_or "Odia"
-${LangFileString} lng_pa "Panjabi"
-${LangFileString} lng_pl "Polish"
-${LangFileString} lng_pt "Portuguese"
-${LangFileString} lng_pt_BR "Brazilian Portuguese"
-${LangFileString} lng_ro "Romanian"
-${LangFileString} lng_ru "Russian"
-${LangFileString} lng_rw "Kinyarwanda"
-${LangFileString} lng_sa "Sanskrit"
-${LangFileString} lng_sat "Santali"
-${LangFileString} lng_sat@deva "Santali in Devanagari script"
-${LangFileString} lng_sd "Sindhi"
-${LangFileString} lng_sd@deva "Sindhi in Devanagari script"
-${LangFileString} lng_sk "Slovak"
-${LangFileString} lng_sl "Slovenian"
-${LangFileString} lng_sq "Albanian"
-${LangFileString} lng_sr "Serbian"
-${LangFileString} lng_sr@latin "Serbian in Latin script"
-${LangFileString} lng_sv "Swedish"
-${LangFileString} lng_ta "Tamil"
-${LangFileString} lng_te "Telugu"
-${LangFileString} lng_th "Thai"
-${LangFileString} lng_tr "Turkish"
-${LangFileString} lng_uk "Ukrainian"
-${LangFileString} lng_ur "Urdu"
-${LangFileString} lng_vi "Vietnamese"
-${LangFileString} lng_zh_CN "Simplifed Chinese"
-${LangFileString} lng_zh_TW "Traditional Chinese"
${LangFileString} UInstOpt "Uninstallation Options"
${LangFileString} UInstOpt1 "Please make your choices for additional options"
${LangFileString} PurgePrefs "Keep personal Preferences"
diff --git a/packaging/win32/languages/English_languageNames.nsh b/packaging/win32/languages/English_languageNames.nsh
new file mode 100644
index 000000000..ce6f9e225
--- /dev/null
+++ b/packaging/win32/languages/English_languageNames.nsh
@@ -0,0 +1,94 @@
+### English (en) translations for language names
+# This file has been automatically created by '_language_lists.py', do not edit it manually!
+# Strings that should be translated are in 'English.nsh'
+${LangFileString} lng_am "Amharic (am)"
+${LangFileString} lng_ar "Arabic (ar)"
+${LangFileString} lng_as "Assamese (as)"
+${LangFileString} lng_az "Azerbaijani (az)"
+${LangFileString} lng_be "Belarusian (be)"
+${LangFileString} lng_bg "Bulgarian (bg)"
+${LangFileString} lng_bn "Bengali (bn)"
+${LangFileString} lng_bn_BD "Bengali/Bangladesh (bn_BD)"
+${LangFileString} lng_br "Breton (br)"
+${LangFileString} lng_brx "Bodo (brx)"
+${LangFileString} lng_ca "Catalan (ca)"
+${LangFileString} lng_ca@valencia "Valencian Catalan (ca@valencia)"
+${LangFileString} lng_cs "Czech (cs)"
+${LangFileString} lng_da "Danish (da)"
+${LangFileString} lng_de "German (de)"
+${LangFileString} lng_doi "Dogri (doi)"
+${LangFileString} lng_dz "Dzongkha (dz)"
+${LangFileString} lng_el "Greek (el)"
+${LangFileString} lng_en "English (en)"
+${LangFileString} lng_en_AU "English/Australia (en_AU)"
+${LangFileString} lng_en_CA "English/Canada (en_CA)"
+${LangFileString} lng_en_GB "English/Great Britain (en_GB)"
+${LangFileString} lng_en_US@piglatin "Pig Latin (en_US@piglatin)"
+${LangFileString} lng_eo "Esperanto (eo)"
+${LangFileString} lng_es "Spanish (es)"
+${LangFileString} lng_es_MX "Spanish/Mexico (es_MX)"
+${LangFileString} lng_et "Estonian (et)"
+${LangFileString} lng_eu "Basque (eu)"
+${LangFileString} lng_fa "Farsi (fa)"
+${LangFileString} lng_fi "Finnish (fi)"
+${LangFileString} lng_fr "French (fr)"
+${LangFileString} lng_ga "Irish (ga)"
+${LangFileString} lng_gl "Galician (gl)"
+${LangFileString} lng_gu "Gujarati (gu)"
+${LangFileString} lng_he "Hebrew (he)"
+${LangFileString} lng_hi "Hindi (hi)"
+${LangFileString} lng_hr "Croatian (hr)"
+${LangFileString} lng_hu "Hungarian (hu)"
+${LangFileString} lng_hy "Armenian (hy)"
+${LangFileString} lng_id "Indonesian (id)"
+${LangFileString} lng_is "Icelandic (is)"
+${LangFileString} lng_it "Italian (it)"
+${LangFileString} lng_ja "Japanese (ja)"
+${LangFileString} lng_km "Khmer (km)"
+${LangFileString} lng_kn "Kannada (kn)"
+${LangFileString} lng_ko "Korean (ko)"
+${LangFileString} lng_kok "Konkani (kok)"
+${LangFileString} lng_kok@latin "Konkani in Latin script (kok@latin)"
+${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script (ks@aran)"
+${LangFileString} lng_ks@deva "Kashmiri in Devanagari script (ks@deva)"
+${LangFileString} lng_lt "Lithuanian (lt)"
+${LangFileString} lng_lv "Latvian (lv)"
+${LangFileString} lng_mai "Maithili (mai)"
+${LangFileString} lng_mk "Macedonian (mk)"
+${LangFileString} lng_ml "Malayalam (ml)"
+${LangFileString} lng_mn "Mongolian (mn)"
+${LangFileString} lng_mni "Manipuri (mni)"
+${LangFileString} lng_mni@beng "Manipuri in Bengali script (mni@beng)"
+${LangFileString} lng_mr "Marathi (mr)"
+${LangFileString} lng_nb "Norwegian Bokmål (nb)"
+${LangFileString} lng_ne "Nepali (ne)"
+${LangFileString} lng_nl "Dutch (nl)"
+${LangFileString} lng_nn "Norwegian Nynorsk (nn)"
+${LangFileString} lng_or "Odia (or)"
+${LangFileString} lng_pa "Panjabi (pa)"
+${LangFileString} lng_pl "Polish (pl)"
+${LangFileString} lng_pt "Portuguese (pt)"
+${LangFileString} lng_pt_BR "Portuguese/Brazil (pt_BR)"
+${LangFileString} lng_ro "Romanian (ro)"
+${LangFileString} lng_ru "Russian (ru)"
+${LangFileString} lng_rw "Kinyarwanda (rw)"
+${LangFileString} lng_sa "Sanskrit (sa)"
+${LangFileString} lng_sat "Santali (sat)"
+${LangFileString} lng_sat@deva "Santali in Devanagari script (sat@deva)"
+${LangFileString} lng_sd "Sindhi (sd)"
+${LangFileString} lng_sd@deva "Sindhi in Devanagari script (sd@deva)"
+${LangFileString} lng_sk "Slovak (sk)"
+${LangFileString} lng_sl "Slovenian (sl)"
+${LangFileString} lng_sq "Albanian (sq)"
+${LangFileString} lng_sr "Serbian (sr)"
+${LangFileString} lng_sr@latin "Serbian in Latin script (sr@latin)"
+${LangFileString} lng_sv "Swedish (sv)"
+${LangFileString} lng_ta "Tamil (ta)"
+${LangFileString} lng_te "Telugu (te)"
+${LangFileString} lng_th "Thai (th)"
+${LangFileString} lng_tr "Turkish (tr)"
+${LangFileString} lng_uk "Ukrainian (uk)"
+${LangFileString} lng_ur "Urdu (ur)"
+${LangFileString} lng_vi "Vietnamese (vi)"
+${LangFileString} lng_zh_CN "Chinese/China (zh_CN)"
+${LangFileString} lng_zh_TW "Chinese/Taiwan (zh_TW)"
diff --git a/packaging/win32/languages/Finnish.nsh b/packaging/win32/languages/Finnish.nsh
index a33fa1722..492f2633e 100644
--- a/packaging/win32/languages/Finnish.nsh
+++ b/packaging/win32/languages/Finnish.nsh
@@ -44,97 +44,6 @@ ${LangFileString} Dictionaries "Dictionaries"
${LangFileString} DictionariesDesc "Dictionaries for some common languages for spell checking in Inkscape"
${LangFileString} Languages "Käännökset"
${LangFileString} LanguagesDesc "Asenna Inkscapen käännökset"
-${LangFileString} lng_am "amhari"
-${LangFileString} lng_ar "Arabic"
-${LangFileString} lng_as "Assamese"
-${LangFileString} lng_az "azerbaid?ani"
-${LangFileString} lng_be "valkovenäjä"
-${LangFileString} lng_bg "bulgaria"
-${LangFileString} lng_bn "Bengali"
-${LangFileString} lng_bn_BD "Bengali Bangladesh"
-${LangFileString} lng_br "Breton"
-${LangFileString} lng_brx "Bodo"
-${LangFileString} lng_ca "katalaani"
-${LangFileString} lng_ca@valencia "Valencian Catalan"
-${LangFileString} lng_cs "t?ekki"
-${LangFileString} lng_da "tanska"
-${LangFileString} lng_de "saksa"
-${LangFileString} lng_doi "Dogri"
-${LangFileString} lng_dz "dzongkha"
-${LangFileString} lng_el "kreikka"
-${LangFileString} lng_en "englanti"
-${LangFileString} lng_en_AU "Australian English"
-${LangFileString} lng_en_CA "Kanadan englanti"
-${LangFileString} lng_en_GB "Britti-englanti"
-${LangFileString} lng_en_US@piglatin "kontin kieli (en)"
-${LangFileString} lng_eo "Esperanto"
-${LangFileString} lng_es "espanja"
-${LangFileString} lng_es_MX "Meksikon espanja"
-${LangFileString} lng_et "eesti"
-${LangFileString} lng_eu "Basque"
-${LangFileString} lng_fa "Farsi"
-${LangFileString} lng_fi "suomi"
-${LangFileString} lng_fr "ranska"
-${LangFileString} lng_ga "iiri"
-${LangFileString} lng_gl "galicia"
-${LangFileString} lng_gu "Gujarati"
-${LangFileString} lng_he "Hebrew"
-${LangFileString} lng_hi "Hindi"
-${LangFileString} lng_hr "kroatia"
-${LangFileString} lng_hu "unkari"
-${LangFileString} lng_hy "Armenian"
-${LangFileString} lng_id "Indonesian"
-${LangFileString} lng_is "Icelandic"
-${LangFileString} lng_it "italia"
-${LangFileString} lng_ja "japani"
-${LangFileString} lng_km "Khmer"
-${LangFileString} lng_kn "Kannada"
-${LangFileString} lng_ko "korea"
-${LangFileString} lng_kok "Konkani"
-${LangFileString} lng_kok@latin "Konkani in Latin script"
-${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script"
-${LangFileString} lng_ks@deva "Kashmiri in Devanagari script"
-${LangFileString} lng_lt "liettua"
-${LangFileString} lng_lv "Latvian"
-${LangFileString} lng_mai "Maithili"
-${LangFileString} lng_mk "makedonia"
-${LangFileString} lng_ml "Malayalam"
-${LangFileString} lng_mn "mongolia"
-${LangFileString} lng_mni "Manipuri"
-${LangFileString} lng_mni@beng "Manipuri in Bengali script"
-${LangFileString} lng_mr "Marathi"
-${LangFileString} lng_nb "kirjanorja"
-${LangFileString} lng_ne "nepali"
-${LangFileString} lng_nl "hollanti"
-${LangFileString} lng_nn "nykynorja"
-${LangFileString} lng_or "Odia"
-${LangFileString} lng_pa "punjabi"
-${LangFileString} lng_pl "puola"
-${LangFileString} lng_pt "portugali"
-${LangFileString} lng_pt_BR "Brasilian portugali"
-${LangFileString} lng_ro "Romanian"
-${LangFileString} lng_ru "venäjä"
-${LangFileString} lng_rw "ruanda"
-${LangFileString} lng_sa "Sanskrit"
-${LangFileString} lng_sat "Santali"
-${LangFileString} lng_sat@deva "Santali in Devanagari script"
-${LangFileString} lng_sd "Sindhi"
-${LangFileString} lng_sd@deva "Sindhi in Devanagari script"
-${LangFileString} lng_sk "slovakki"
-${LangFileString} lng_sl "sloveeni"
-${LangFileString} lng_sq "albania"
-${LangFileString} lng_sr "serbia"
-${LangFileString} lng_sr@latin "serbia (latin)"
-${LangFileString} lng_sv "ruotsi"
-${LangFileString} lng_ta "Tamil"
-${LangFileString} lng_te "Telugu"
-${LangFileString} lng_th "thai"
-${LangFileString} lng_tr "turkki"
-${LangFileString} lng_uk "ukraina"
-${LangFileString} lng_ur "Urdu"
-${LangFileString} lng_vi "vietnami"
-${LangFileString} lng_zh_CN "yksinkertaistettu kiina"
-${LangFileString} lng_zh_TW "perinteinen kiina"
${LangFileString} UInstOpt "Ohjelman poiston asetukset"
${LangFileString} UInstOpt1 "Valitse haluamasi asetukset ohjelman poistamiseksi"
${LangFileString} PurgePrefs "Säilytä omat asetukset"
diff --git a/packaging/win32/languages/Finnish_languageNames.nsh b/packaging/win32/languages/Finnish_languageNames.nsh
new file mode 100644
index 000000000..b0c5a18ee
--- /dev/null
+++ b/packaging/win32/languages/Finnish_languageNames.nsh
@@ -0,0 +1,94 @@
+### Finnish (fi) translations for language names
+# This file has been automatically created by '_language_lists.py', do not edit it manually!
+# Strings that should be translated are in 'Finnish.nsh'
+${LangFileString} lng_am "Amharic (am)"
+${LangFileString} lng_ar "Arabia (ar)"
+${LangFileString} lng_as "Assamese (as)"
+${LangFileString} lng_az "Azerbaijani (az)"
+${LangFileString} lng_be "Valkovenäjä (be)"
+${LangFileString} lng_bg "Bulgaria (bg)"
+${LangFileString} lng_bn "Bengali (bn)"
+${LangFileString} lng_bn_BD "Bengali/Bangladesh (bn_BD)"
+${LangFileString} lng_br "Breton (br)"
+${LangFileString} lng_brx "Bodo (brx)"
+${LangFileString} lng_ca "Catalan (ca)"
+${LangFileString} lng_ca@valencia "Valencian Catalan (ca@valencia)"
+${LangFileString} lng_cs "Tsekki (cs)"
+${LangFileString} lng_da "Tanska (da)"
+${LangFileString} lng_de "Saksa (de)"
+${LangFileString} lng_doi "Dogri (doi)"
+${LangFileString} lng_dz "Dzongkha (dz)"
+${LangFileString} lng_el "Kreikka (el)"
+${LangFileString} lng_en "Englanti (en)"
+${LangFileString} lng_en_AU "Englanti/Australia (en_AU)"
+${LangFileString} lng_en_CA "Englanti/Kanada (en_CA)"
+${LangFileString} lng_en_GB "Englanti/Iso Britannia (en_GB)"
+${LangFileString} lng_en_US@piglatin "Siansaksa (en_US@piglatin)"
+${LangFileString} lng_eo "Esperanto (eo)"
+${LangFileString} lng_es "Espanja (es)"
+${LangFileString} lng_es_MX "Espanja/Meksiko (es_MX)"
+${LangFileString} lng_et "Viro (et)"
+${LangFileString} lng_eu "Basque (eu)"
+${LangFileString} lng_fa "Farsi (fa)"
+${LangFileString} lng_fi "Suomi (fi)"
+${LangFileString} lng_fr "Ranska (fr)"
+${LangFileString} lng_ga "Irlanti (ga)"
+${LangFileString} lng_gl "Galician (gl)"
+${LangFileString} lng_gu "Gujarati (gu)"
+${LangFileString} lng_he "Heprea (he)"
+${LangFileString} lng_hi "Hindi (hi)"
+${LangFileString} lng_hr "Kroatia (hr)"
+${LangFileString} lng_hu "Unkari (hu)"
+${LangFileString} lng_hy "Armenia (hy)"
+${LangFileString} lng_id "Indonesa (id)"
+${LangFileString} lng_is "Icelandic (is)"
+${LangFileString} lng_it "Italia (it)"
+${LangFileString} lng_ja "Japani (ja)"
+${LangFileString} lng_km "Khmer (km)"
+${LangFileString} lng_kn "Kannada (kn)"
+${LangFileString} lng_ko "Korea (ko)"
+${LangFileString} lng_kok "Konkani (kok)"
+${LangFileString} lng_kok@latin "Konkani in Latin script (kok@latin)"
+${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script (ks@aran)"
+${LangFileString} lng_ks@deva "Kashmiri in Devanagari script (ks@deva)"
+${LangFileString} lng_lt "Liettua (lt)"
+${LangFileString} lng_lv "Latvian (lv)"
+${LangFileString} lng_mai "Maithili (mai)"
+${LangFileString} lng_mk "Makedonia (mk)"
+${LangFileString} lng_ml "Malayalam (ml)"
+${LangFileString} lng_mn "Mongolia (mn)"
+${LangFileString} lng_mni "Manipuri (mni)"
+${LangFileString} lng_mni@beng "Manipuri in Bengali script (mni@beng)"
+${LangFileString} lng_mr "Marathi (mr)"
+${LangFileString} lng_nb "Norja Bokmål (nb)"
+${LangFileString} lng_ne "Nepali (ne)"
+${LangFileString} lng_nl "Hollanti (nl)"
+${LangFileString} lng_nn "Norja Nynorsk (nn)"
+${LangFileString} lng_or "Odia (or)"
+${LangFileString} lng_pa "Panjabi (pa)"
+${LangFileString} lng_pl "Puola (pl)"
+${LangFileString} lng_pt "Portugali (pt)"
+${LangFileString} lng_pt_BR "Portugali/Brasilia (pt_BR)"
+${LangFileString} lng_ro "Romania (ro)"
+${LangFileString} lng_ru "Venäjä (ru)"
+${LangFileString} lng_rw "Kinyarwanda (rw)"
+${LangFileString} lng_sa "Sanskrit (sa)"
+${LangFileString} lng_sat "Santali (sat)"
+${LangFileString} lng_sat@deva "Santali in Devanagari script (sat@deva)"
+${LangFileString} lng_sd "Sindhi (sd)"
+${LangFileString} lng_sd@deva "Sindhi in Devanagari script (sd@deva)"
+${LangFileString} lng_sk "Slovakia (sk)"
+${LangFileString} lng_sl "Slovenia (sl)"
+${LangFileString} lng_sq "Albania (sq)"
+${LangFileString} lng_sr "Serbia (sr)"
+${LangFileString} lng_sr@latin "Serbia/Latin (sr@latin)"
+${LangFileString} lng_sv "Ruotsi (sv)"
+${LangFileString} lng_ta "Tamil (ta)"
+${LangFileString} lng_te "Telugu (te)"
+${LangFileString} lng_th "Thai (th)"
+${LangFileString} lng_tr "Turkki (tr)"
+${LangFileString} lng_uk "Ukraina (uk)"
+${LangFileString} lng_ur "Urdu (ur)"
+${LangFileString} lng_vi "Vietnami (vi)"
+${LangFileString} lng_zh_CN "Kiina (zh_CN)"
+${LangFileString} lng_zh_TW "Kiina/Taiwan (zh_TW)"
diff --git a/packaging/win32/languages/French.nsh b/packaging/win32/languages/French.nsh
index 64d8793d4..e7349853d 100644
--- a/packaging/win32/languages/French.nsh
+++ b/packaging/win32/languages/French.nsh
@@ -44,97 +44,6 @@ ${LangFileString} Dictionaries "Dictionaries"
${LangFileString} DictionariesDesc "Dictionaries for some common languages for spell checking in Inkscape"
${LangFileString} Languages "Traductions"
${LangFileString} LanguagesDesc "Installer les traductions d'Inkscape"
-${LangFileString} lng_am "Amharique"
-${LangFileString} lng_ar "Arabe"
-${LangFileString} lng_as "Assamese"
-${LangFileString} lng_az "Azéri"
-${LangFileString} lng_be "Biélorusse"
-${LangFileString} lng_bg "Bulgare"
-${LangFileString} lng_bn "Bengali"
-${LangFileString} lng_bn_BD "Bengali (Bangladesh)"
-${LangFileString} lng_br "Breton"
-${LangFileString} lng_brx "Bodo"
-${LangFileString} lng_ca "Catalan"
-${LangFileString} lng_ca@valencia "Catalan (Valence)"
-${LangFileString} lng_cs "Tchèque"
-${LangFileString} lng_da "Danois"
-${LangFileString} lng_de "Allemand"
-${LangFileString} lng_doi "Dogri"
-${LangFileString} lng_dz "Dzongkha"
-${LangFileString} lng_el "Grec"
-${LangFileString} lng_en "Anglais"
-${LangFileString} lng_en_AU "Anglais (Australie)"
-${LangFileString} lng_en_CA "Anglais (Canada)"
-${LangFileString} lng_en_GB "Anglais (Royaume-Uni)"
-${LangFileString} lng_en_US@piglatin "Pig latin"
-${LangFileString} lng_eo "Espéranto"
-${LangFileString} lng_es "Espagnol"
-${LangFileString} lng_es_MX "Espagnol (Mexique)"
-${LangFileString} lng_et "Estonien"
-${LangFileString} lng_eu "Basque"
-${LangFileString} lng_fa "Farsi"
-${LangFileString} lng_fi "Finnois"
-${LangFileString} lng_fr "Français"
-${LangFileString} lng_ga "Irlandais"
-${LangFileString} lng_gl "Galicien"
-${LangFileString} lng_gu "Gujarati"
-${LangFileString} lng_he "Hébreu"
-${LangFileString} lng_hi "Hindi"
-${LangFileString} lng_hr "Croate"
-${LangFileString} lng_hu "Hongrois"
-${LangFileString} lng_hy "Armenian"
-${LangFileString} lng_id "Indonésien"
-${LangFileString} lng_is "Islandais"
-${LangFileString} lng_it "Italien"
-${LangFileString} lng_ja "Japonais"
-${LangFileString} lng_km "Khmer"
-${LangFileString} lng_kn "Kannada"
-${LangFileString} lng_ko "Coréen"
-${LangFileString} lng_kok "Konkani"
-${LangFileString} lng_kok@latin "Konkani in Latin script"
-${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script"
-${LangFileString} lng_ks@deva "Kashmiri in Devanagari script"
-${LangFileString} lng_lt "Lituanien"
-${LangFileString} lng_lv "Latvian"
-${LangFileString} lng_mai "Maithili"
-${LangFileString} lng_mk "Macédonien"
-${LangFileString} lng_ml "Malayalam"
-${LangFileString} lng_mn "Mongol"
-${LangFileString} lng_mni "Manipuri"
-${LangFileString} lng_mni@beng "Manipuri in Bengali script"
-${LangFileString} lng_mr "Marathi"
-${LangFileString} lng_nb "Bokmål (Norvège)"
-${LangFileString} lng_ne "Népalais"
-${LangFileString} lng_nl "Néerlandais"
-${LangFileString} lng_nn "Nynorsk (Norvège)"
-${LangFileString} lng_or "Odia"
-${LangFileString} lng_pa "Pendjabi"
-${LangFileString} lng_pl "Polonais"
-${LangFileString} lng_pt "Portugais"
-${LangFileString} lng_pt_BR "Portugais (Brésil)"
-${LangFileString} lng_ro "Roumain"
-${LangFileString} lng_ru "Russe"
-${LangFileString} lng_rw "Kinyarouandais"
-${LangFileString} lng_sa "Sanskrit"
-${LangFileString} lng_sat "Santali"
-${LangFileString} lng_sat@deva "Santali in Devanagari script"
-${LangFileString} lng_sd "Sindhi"
-${LangFileString} lng_sd@deva "Sindhi in Devanagari script"
-${LangFileString} lng_sk "Slovaque"
-${LangFileString} lng_sl "Slovène"
-${LangFileString} lng_sq "Albanais"
-${LangFileString} lng_sr "Serbe"
-${LangFileString} lng_sr@latin "Serbe (notation latine)"
-${LangFileString} lng_sv "Suédois"
-${LangFileString} lng_ta "Tamil"
-${LangFileString} lng_te "Telugu"
-${LangFileString} lng_th "Thaï"
-${LangFileString} lng_tr "Turc"
-${LangFileString} lng_uk "Ukrainien"
-${LangFileString} lng_ur "Urdu"
-${LangFileString} lng_vi "Vietnamien"
-${LangFileString} lng_zh_CN "Chinois"
-${LangFileString} lng_zh_TW "Chinois (Taïwan)"
${LangFileString} UInstOpt "Options de désinstallation"
${LangFileString} UInstOpt1 "Choisissez parmi les options additionnelles"
${LangFileString} PurgePrefs "Conserver les préférences personnelles"
diff --git a/packaging/win32/languages/French_languageNames.nsh b/packaging/win32/languages/French_languageNames.nsh
new file mode 100644
index 000000000..00dbda62a
--- /dev/null
+++ b/packaging/win32/languages/French_languageNames.nsh
@@ -0,0 +1,94 @@
+### French (fr) translations for language names
+# This file has been automatically created by '_language_lists.py', do not edit it manually!
+# Strings that should be translated are in 'French.nsh'
+${LangFileString} lng_am "Amharique (am)"
+${LangFileString} lng_ar "Arabe (ar)"
+${LangFileString} lng_as "Assamais (as)"
+${LangFileString} lng_az "Azéri (az)"
+${LangFileString} lng_be "Biélorusse (be)"
+${LangFileString} lng_bg "Bulgare (bg)"
+${LangFileString} lng_bn "Bengali (bn)"
+${LangFileString} lng_bn_BD "Bengali/Bangladesh (bn_BD)"
+${LangFileString} lng_br "Breton (br)"
+${LangFileString} lng_brx "Bodo (brx)"
+${LangFileString} lng_ca "Catalan (ca)"
+${LangFileString} lng_ca@valencia "Catalan valencien (ca@valencia)"
+${LangFileString} lng_cs "Tchèque (cs)"
+${LangFileString} lng_da "Danois (da)"
+${LangFileString} lng_de "Allemand (de)"
+${LangFileString} lng_doi "Dogri (doi)"
+${LangFileString} lng_dz "Dzongkha (dz)"
+${LangFileString} lng_el "Grec (el)"
+${LangFileString} lng_en "Anglais (en)"
+${LangFileString} lng_en_AU "Anglais/Australie (en_AU)"
+${LangFileString} lng_en_CA "Anglais/Canada (en_CA)"
+${LangFileString} lng_en_GB "Anglais/Grande-Bretagne (en_GB)"
+${LangFileString} lng_en_US@piglatin "Pig Latin (en_US@piglatin)"
+${LangFileString} lng_eo "Espéranto (eo)"
+${LangFileString} lng_es "Espagnol (es)"
+${LangFileString} lng_es_MX "Espagnol/Mexique (es_MX)"
+${LangFileString} lng_et "Estonien (et)"
+${LangFileString} lng_eu "Basque (eu)"
+${LangFileString} lng_fa "Farsi (fa)"
+${LangFileString} lng_fi "Finnois (fi)"
+${LangFileString} lng_fr "Français (fr)"
+${LangFileString} lng_ga "Irlandais (ga)"
+${LangFileString} lng_gl "Galicien (gl)"
+${LangFileString} lng_gu "Gujarati (gu)"
+${LangFileString} lng_he "Hébreu (he)"
+${LangFileString} lng_hi "Hindi (hi)"
+${LangFileString} lng_hr "Croate (hr)"
+${LangFileString} lng_hu "Hongrois (hu)"
+${LangFileString} lng_hy "Arménien (hy)"
+${LangFileString} lng_id "Indonésien (id)"
+${LangFileString} lng_is "Islandais (is)"
+${LangFileString} lng_it "Italien (it)"
+${LangFileString} lng_ja "Japonais (ja)"
+${LangFileString} lng_km "Khmer (km)"
+${LangFileString} lng_kn "Kannada (kn)"
+${LangFileString} lng_ko "Coréen (ko)"
+${LangFileString} lng_kok "Konkani (kok)"
+${LangFileString} lng_kok@latin "Konkani, alphabet latin (kok@latin)"
+${LangFileString} lng_ks@aran "Kashmiri, écriture perso-arabe (ks@aran)"
+${LangFileString} lng_ks@deva "Kashmiri, écriture dévanagarie (ks@deva)"
+${LangFileString} lng_lt "Lituanien (lt)"
+${LangFileString} lng_lv "Letton (lv)"
+${LangFileString} lng_mai "Maithili (mai)"
+${LangFileString} lng_mk "Macédonien (mk)"
+${LangFileString} lng_ml "Malayalam (ml)"
+${LangFileString} lng_mn "Mongol (mn)"
+${LangFileString} lng_mni "Manipuri (mni)"
+${LangFileString} lng_mni@beng "Manipuri, écriture bengalie (mni@beng)"
+${LangFileString} lng_mr "Marathi (mr)"
+${LangFileString} lng_nb "Norvégien Bokmål (nb)"
+${LangFileString} lng_ne "Népalais (ne)"
+${LangFileString} lng_nl "Néerlandais (nl)"
+${LangFileString} lng_nn "Norvégien Nynorsk (nn)"
+${LangFileString} lng_or "Odia (or)"
+${LangFileString} lng_pa "Panjabi (pa)"
+${LangFileString} lng_pl "Polonais (pl)"
+${LangFileString} lng_pt "Portugais (pt)"
+${LangFileString} lng_pt_BR "Portugais/Brésil (pt_BR)"
+${LangFileString} lng_ro "Roumain (ro)"
+${LangFileString} lng_ru "Russe (ru)"
+${LangFileString} lng_rw "Kinyarouanda (rw)"
+${LangFileString} lng_sa "Sanskrit (sa)"
+${LangFileString} lng_sat "Santali (sat)"
+${LangFileString} lng_sat@deva "Santali, écriture dévanagarie (sat@deva)"
+${LangFileString} lng_sd "Sindhi (sd)"
+${LangFileString} lng_sd@deva "Sindhi, écriture dévanagarie (sd@deva)"
+${LangFileString} lng_sk "Slovaque (sk)"
+${LangFileString} lng_sl "Slovène (sl)"
+${LangFileString} lng_sq "Albanais (sq)"
+${LangFileString} lng_sr "Serbe (sr)"
+${LangFileString} lng_sr@latin "Serbe, alphabet latin (sr@latin)"
+${LangFileString} lng_sv "Suédois (sv)"
+${LangFileString} lng_ta "Tamoul (ta)"
+${LangFileString} lng_te "Télougou (te)"
+${LangFileString} lng_th "Thaï (th)"
+${LangFileString} lng_tr "Turc (tr)"
+${LangFileString} lng_uk "Ukrainien (uk)"
+${LangFileString} lng_ur "Urdu (ur)"
+${LangFileString} lng_vi "Vietnamien (vi)"
+${LangFileString} lng_zh_CN "Chinois/Chine (zh_CN)"
+${LangFileString} lng_zh_TW "Chinois/Taïwan (zh_TW)"
diff --git a/packaging/win32/languages/Galician.nsh b/packaging/win32/languages/Galician.nsh
index bc5bd6724..f107118b1 100644
--- a/packaging/win32/languages/Galician.nsh
+++ b/packaging/win32/languages/Galician.nsh
@@ -44,97 +44,6 @@ ${LangFileString} Dictionaries "Dictionaries"
${LangFileString} DictionariesDesc "Dictionaries for some common languages for spell checking in Inkscape"
${LangFileString} Languages "Traducións"
${LangFileString} LanguagesDesc "Instala varias traducións de Inkscape"
-${LangFileString} lng_am "Amhárico"
-${LangFileString} lng_ar "Arabic"
-${LangFileString} lng_as "Assamese"
-${LangFileString} lng_az "Azerí"
-${LangFileString} lng_be "Bielorruso"
-${LangFileString} lng_bg "Búlgaro"
-${LangFileString} lng_bn "Bengalí"
-${LangFileString} lng_bn_BD "Bengali Bangladesh"
-${LangFileString} lng_br "Breton"
-${LangFileString} lng_brx "Bodo"
-${LangFileString} lng_ca "Catalán"
-${LangFileString} lng_ca@valencia "Catalán Valenciano"
-${LangFileString} lng_cs "Checo"
-${LangFileString} lng_da "Danés"
-${LangFileString} lng_de "Alemán"
-${LangFileString} lng_doi "Dogri"
-${LangFileString} lng_dz "Dzongkha"
-${LangFileString} lng_el "Grego"
-${LangFileString} lng_en "Inglés"
-${LangFileString} lng_en_AU "Inglés Australiano"
-${LangFileString} lng_en_CA "Inglés Canadense"
-${LangFileString} lng_en_GB "Inglés Británico"
-${LangFileString} lng_en_US@piglatin "Pig Latin"
-${LangFileString} lng_eo "Esperanto"
-${LangFileString} lng_es "Español"
-${LangFileString} lng_es_MX "Español Mexicano"
-${LangFileString} lng_et "Estonio"
-${LangFileString} lng_eu "Éuscaro "
-${LangFileString} lng_fa "Farsi"
-${LangFileString} lng_fi "Finés"
-${LangFileString} lng_fr "Francés"
-${LangFileString} lng_ga "Gaélico Irlandés"
-${LangFileString} lng_gl "Galego"
-${LangFileString} lng_gu "Gujarati"
-${LangFileString} lng_he "Hebreo"
-${LangFileString} lng_hi "Hindi"
-${LangFileString} lng_hr "Croata"
-${LangFileString} lng_hu "Húngaro"
-${LangFileString} lng_hy "Armenian"
-${LangFileString} lng_id "Indonesio"
-${LangFileString} lng_is "Icelandic"
-${LangFileString} lng_it "Italiano"
-${LangFileString} lng_ja "Xaponés"
-${LangFileString} lng_km "Khmer"
-${LangFileString} lng_kn "Kannada"
-${LangFileString} lng_ko "Coreano"
-${LangFileString} lng_kok "Konkani"
-${LangFileString} lng_kok@latin "Konkani in Latin script"
-${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script"
-${LangFileString} lng_ks@deva "Kashmiri in Devanagari script"
-${LangFileString} lng_lt "Lituano"
-${LangFileString} lng_lv "Latvian"
-${LangFileString} lng_mai "Maithili"
-${LangFileString} lng_mk "Macedonio"
-${LangFileString} lng_ml "Malayalam"
-${LangFileString} lng_mn "Mongol"
-${LangFileString} lng_mni "Manipuri"
-${LangFileString} lng_mni@beng "Manipuri in Bengali script"
-${LangFileString} lng_mr "Marathi"
-${LangFileString} lng_nb "Noruegués Bokmål"
-${LangFileString} lng_ne "Nepalí"
-${LangFileString} lng_nl "Neerlandés"
-${LangFileString} lng_nn "Noruegués Nynorsk"
-${LangFileString} lng_or "Odia"
-${LangFileString} lng_pa "Punjabi"
-${LangFileString} lng_pl "Polaco"
-${LangFileString} lng_pt "Portugués"
-${LangFileString} lng_pt_BR "Portugués Brasileiro"
-${LangFileString} lng_ro "Romanés"
-${LangFileString} lng_ru "Ruso"
-${LangFileString} lng_rw "Kinyarwanda"
-${LangFileString} lng_sa "Sanskrit"
-${LangFileString} lng_sat "Santali"
-${LangFileString} lng_sat@deva "Santali in Devanagari script"
-${LangFileString} lng_sd "Sindhi"
-${LangFileString} lng_sd@deva "Sindhi in Devanagari script"
-${LangFileString} lng_sk "Eslovaco"
-${LangFileString} lng_sl "Eslovenio"
-${LangFileString} lng_sq "Albanés"
-${LangFileString} lng_sr "Serbio"
-${LangFileString} lng_sr@latin "Serbio con alfabeto Latino"
-${LangFileString} lng_sv "Sueco"
-${LangFileString} lng_ta "Tamil"
-${LangFileString} lng_te "Telugu"
-${LangFileString} lng_th "Tailandés"
-${LangFileString} lng_tr "Turco"
-${LangFileString} lng_uk "Ucraíno"
-${LangFileString} lng_ur "Urdu"
-${LangFileString} lng_vi "Vietnamita"
-${LangFileString} lng_zh_CN "Chinés Simplificado"
-${LangFileString} lng_zh_TW "Chinés Tradicional"
${LangFileString} UInstOpt "Opcións de Desinstalación"
${LangFileString} UInstOpt1 "Escolla as opcións adicionais"
${LangFileString} PurgePrefs "Conservar a Configuración persoal"
diff --git a/packaging/win32/languages/Galician_languageNames.nsh b/packaging/win32/languages/Galician_languageNames.nsh
new file mode 100644
index 000000000..34c67228c
--- /dev/null
+++ b/packaging/win32/languages/Galician_languageNames.nsh
@@ -0,0 +1,94 @@
+### Galician (gl) translations for language names
+# This file has been automatically created by '_language_lists.py', do not edit it manually!
+# Strings that should be translated are in 'Galician.nsh'
+${LangFileString} lng_am "Amharic (am)"
+${LangFileString} lng_ar "Árabe (ar)"
+${LangFileString} lng_as "Assamese (as)"
+${LangFileString} lng_az "Acerí (az)"
+${LangFileString} lng_be "Bieloruso (be)"
+${LangFileString} lng_bg "Búlgaro (bg)"
+${LangFileString} lng_bn "Bengalí (bn)"
+${LangFileString} lng_bn_BD "Bengali/Bangladesh (bn_BD)"
+${LangFileString} lng_br "Bretón (br)"
+${LangFileString} lng_brx "Bodo (brx)"
+${LangFileString} lng_ca "Catalán (ca)"
+${LangFileString} lng_ca@valencia "Catalán de Valencia (ca@valencia)"
+${LangFileString} lng_cs "Checo (cs)"
+${LangFileString} lng_da "Dinamarqués (da)"
+${LangFileString} lng_de "Alemán (de)"
+${LangFileString} lng_doi "Dogri (doi)"
+${LangFileString} lng_dz "Dzongkha (dz)"
+${LangFileString} lng_el "Grego (el)"
+${LangFileString} lng_en "Inglés (en)"
+${LangFileString} lng_en_AU "Inglés de Australia (en_AU)"
+${LangFileString} lng_en_CA "Inglés de Canadá (en_CA)"
+${LangFileString} lng_en_GB "Inglés de Gran Bretaña (en_GB)"
+${LangFileString} lng_en_US@piglatin "Pig Latin (en_US@piglatin)"
+${LangFileString} lng_eo "Esperanto (eo)"
+${LangFileString} lng_es "Castelán (es)"
+${LangFileString} lng_es_MX "Castelán de México (es_MX)"
+${LangFileString} lng_et "Estonio (et)"
+${LangFileString} lng_eu "Éuscaro (eu)"
+${LangFileString} lng_fa "Persa (fa)"
+${LangFileString} lng_fi "Finlandés (fi)"
+${LangFileString} lng_fr "Francés (fr)"
+${LangFileString} lng_ga "Irlandés (ga)"
+${LangFileString} lng_gl "Galego (gl)"
+${LangFileString} lng_gu "Gujarati (gu)"
+${LangFileString} lng_he "Hebreo (he)"
+${LangFileString} lng_hi "Hindi (hi)"
+${LangFileString} lng_hr "Croata (hr)"
+${LangFileString} lng_hu "Húngaro (hu)"
+${LangFileString} lng_hy "Armenio (hy)"
+${LangFileString} lng_id "Indonesio (id)"
+${LangFileString} lng_is "Icelandic (is)"
+${LangFileString} lng_it "Italiano (it)"
+${LangFileString} lng_ja "Xaponés (ja)"
+${LangFileString} lng_km "Khmer (km)"
+${LangFileString} lng_kn "Kannada (kn)"
+${LangFileString} lng_ko "Coreano (ko)"
+${LangFileString} lng_kok "Konkani (kok)"
+${LangFileString} lng_kok@latin "Konkani in Latin script (kok@latin)"
+${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script (ks@aran)"
+${LangFileString} lng_ks@deva "Kashmiri in Devanagari script (ks@deva)"
+${LangFileString} lng_lt "Lituano (lt)"
+${LangFileString} lng_lv "Latvian (lv)"
+${LangFileString} lng_mai "Maithili (mai)"
+${LangFileString} lng_mk "Macedonio (mk)"
+${LangFileString} lng_ml "Malayalam (ml)"
+${LangFileString} lng_mn "Mongol (mn)"
+${LangFileString} lng_mni "Manipuri (mni)"
+${LangFileString} lng_mni@beng "Manipuri in Bengali script (mni@beng)"
+${LangFileString} lng_mr "Marathi (mr)"
+${LangFileString} lng_nb "Noruegués, Bokmål (nb)"
+${LangFileString} lng_ne "Nepalí (ne)"
+${LangFileString} lng_nl "Holandés (nl)"
+${LangFileString} lng_nn "Noruegués, Nynorsk (nn)"
+${LangFileString} lng_or "Odia (or)"
+${LangFileString} lng_pa "Panjabi (pa)"
+${LangFileString} lng_pl "Polaco (pl)"
+${LangFileString} lng_pt "Portugués (pt)"
+${LangFileString} lng_pt_BR "Portugués brasileiro (pt_BR)"
+${LangFileString} lng_ro "Romanés (ro)"
+${LangFileString} lng_ru "Ruso (ru)"
+${LangFileString} lng_rw "Kinyarwanda (rw)"
+${LangFileString} lng_sa "Sanskrit (sa)"
+${LangFileString} lng_sat "Santali (sat)"
+${LangFileString} lng_sat@deva "Santali in Devanagari script (sat@deva)"
+${LangFileString} lng_sd "Sindhi (sd)"
+${LangFileString} lng_sd@deva "Sindhi in Devanagari script (sd@deva)"
+${LangFileString} lng_sk "Eslovaco (sk)"
+${LangFileString} lng_sl "Esloveno (sl)"
+${LangFileString} lng_sq "Albanés (sq)"
+${LangFileString} lng_sr "Serbio (sr)"
+${LangFileString} lng_sr@latin "Serbio en alfabeto latino (sr@latin)"
+${LangFileString} lng_sv "Sueco (sv)"
+${LangFileString} lng_ta "Tamil (ta)"
+${LangFileString} lng_te "Telugu (te)"
+${LangFileString} lng_th "Tailandés (th)"
+${LangFileString} lng_tr "Turco (tr)"
+${LangFileString} lng_uk "Ucraíno (uk)"
+${LangFileString} lng_ur "Urdu (ur)"
+${LangFileString} lng_vi "Vietnamita (vi)"
+${LangFileString} lng_zh_CN "Chinés de China (zh_CN)"
+${LangFileString} lng_zh_TW "Chinés de Taiwán (zh_TW)"
diff --git a/packaging/win32/languages/German.nsh b/packaging/win32/languages/German.nsh
index c663456b8..bb0f8ec00 100644
--- a/packaging/win32/languages/German.nsh
+++ b/packaging/win32/languages/German.nsh
@@ -44,97 +44,6 @@ ${LangFileString} Dictionaries "Wörterbücher"
${LangFileString} DictionariesDesc "Wörterbücher für einige gängige Sprachen zur Rechtschreibprüfung in Inkscape"
${LangFileString} Languages "Übersetzungen"
${LangFileString} LanguagesDesc "Übersetzungen und sprachspezifische Inhalte für Inkscape"
-${LangFileString} lng_am "Amharisch"
-${LangFileString} lng_ar "Arabisch"
-${LangFileString} lng_as "Assamesisch"
-${LangFileString} lng_az "Aserbaidschanisch"
-${LangFileString} lng_be "Weißrussisch"
-${LangFileString} lng_bg "Bulgarisch"
-${LangFileString} lng_bn "Bangla"
-${LangFileString} lng_bn_BD "Bangla Bangladesch"
-${LangFileString} lng_br "Bretonisch"
-${LangFileString} lng_brx "Bodo"
-${LangFileString} lng_ca "Katalanisch"
-${LangFileString} lng_ca@valencia "Valencianisches Katalan"
-${LangFileString} lng_cs "Tschechisch"
-${LangFileString} lng_da "Dänisch"
-${LangFileString} lng_de "Deutsch"
-${LangFileString} lng_doi "Dogri"
-${LangFileString} lng_dz "Dzongkha"
-${LangFileString} lng_el "Griechisch"
-${LangFileString} lng_en "Englisch"
-${LangFileString} lng_en_AU "Englisch/Australien"
-${LangFileString} lng_en_CA "Englisch/Kanada"
-${LangFileString} lng_en_GB "Englisch/Großbritannien"
-${LangFileString} lng_en_US@piglatin "Pig Latin"
-${LangFileString} lng_eo "Esperanto"
-${LangFileString} lng_es "Spanisch"
-${LangFileString} lng_es_MX "Spanisch/Mexico"
-${LangFileString} lng_et "Estnisch"
-${LangFileString} lng_eu "Baskisch"
-${LangFileString} lng_fa "Farsi"
-${LangFileString} lng_fi "Finnisch"
-${LangFileString} lng_fr "Französisch"
-${LangFileString} lng_ga "Irisch"
-${LangFileString} lng_gl "Galizisch"
-${LangFileString} lng_gu "Gujarati"
-${LangFileString} lng_he "Hebräisch"
-${LangFileString} lng_hi "Hindi"
-${LangFileString} lng_hr "Kroatisch"
-${LangFileString} lng_hu "Ungarisch"
-${LangFileString} lng_hy "Armenisch"
-${LangFileString} lng_id "Indonesisch"
-${LangFileString} lng_is "Isländisch"
-${LangFileString} lng_it "Italienisch"
-${LangFileString} lng_ja "Japanisch"
-${LangFileString} lng_km "Khmer"
-${LangFileString} lng_kn "Kannada"
-${LangFileString} lng_ko "Koreanisch"
-${LangFileString} lng_kok "Konkani"
-${LangFileString} lng_kok@latin "Konkani in lateinischer Schrift"
-${LangFileString} lng_ks@aran "Kashmiri in erweiterter arabischer Schrift"
-${LangFileString} lng_ks@deva "Kashmiri in Devanagari-Schrift"
-${LangFileString} lng_lt "Litauisch"
-${LangFileString} lng_lv "Lettisch"
-${LangFileString} lng_mai "Maithili"
-${LangFileString} lng_mk "Mazedonisch"
-${LangFileString} lng_ml "Malayalam"
-${LangFileString} lng_mn "Mongolisch"
-${LangFileString} lng_mni "Manipuri"
-${LangFileString} lng_mni@beng "Manipuri in bengalischer Schrift"
-${LangFileString} lng_mr "Marathi"
-${LangFileString} lng_nb "Norwegisch/Bokmål"
-${LangFileString} lng_ne "Nepalesisch"
-${LangFileString} lng_nl "Niederländisch"
-${LangFileString} lng_nn "Norwegisch/Nynorsk"
-${LangFileString} lng_or "Orya"
-${LangFileString} lng_pa "Panjabi"
-${LangFileString} lng_pl "Polnisch"
-${LangFileString} lng_pt "Portugiesisch"
-${LangFileString} lng_pt_BR "Portugiesisch/Brasilien"
-${LangFileString} lng_ro "Rumänisch"
-${LangFileString} lng_ru "Russisch"
-${LangFileString} lng_rw "Kinyarwanda"
-${LangFileString} lng_sa "Sanskrit"
-${LangFileString} lng_sat "Santali"
-${LangFileString} lng_sat@deva "Santali in Devanagari-Schrift"
-${LangFileString} lng_sd "Sindhi"
-${LangFileString} lng_sd@deva "Sindhi in Devanagari-Schrift"
-${LangFileString} lng_sk "Slowakisch"
-${LangFileString} lng_sl "Slowenisch"
-${LangFileString} lng_sq "Albanisch"
-${LangFileString} lng_sr "Serbisch"
-${LangFileString} lng_sr@latin "Serbisch in lateinischer Schrift"
-${LangFileString} lng_sv "Schwedisch"
-${LangFileString} lng_ta "Tamilisch"
-${LangFileString} lng_te "Telugu"
-${LangFileString} lng_th "Thai"
-${LangFileString} lng_tr "Türkisch"
-${LangFileString} lng_uk "Ukrainisch"
-${LangFileString} lng_ur "Urdu"
-${LangFileString} lng_vi "Vietnamesisch"
-${LangFileString} lng_zh_CN "Chinesisch (vereinfacht)"
-${LangFileString} lng_zh_TW "Chinesisch (traditionell)"
${LangFileString} UInstOpt "Deinstallations-Optionen"
${LangFileString} UInstOpt1 "Bitte wählen Sie die optionalen Deinstallationsparameter"
${LangFileString} PurgePrefs "Persönliche Inkscape-Einstellungen behalten"
diff --git a/packaging/win32/languages/German_languageNames.nsh b/packaging/win32/languages/German_languageNames.nsh
new file mode 100644
index 000000000..15cb3e103
--- /dev/null
+++ b/packaging/win32/languages/German_languageNames.nsh
@@ -0,0 +1,94 @@
+### German (de) translations for language names
+# This file has been automatically created by '_language_lists.py', do not edit it manually!
+# Strings that should be translated are in 'German.nsh'
+${LangFileString} lng_am "Amharisch (am)"
+${LangFileString} lng_ar "Arabisch (ar)"
+${LangFileString} lng_as "Assamesisch (as)"
+${LangFileString} lng_az "Aserbeidschanisch (az)"
+${LangFileString} lng_be "Belorussisch (be)"
+${LangFileString} lng_bg "Bulgarisch (bg)"
+${LangFileString} lng_bn "Bengalesisch (bn)"
+${LangFileString} lng_bn_BD "Bengalesisch (bn_BD)"
+${LangFileString} lng_br "Bretonisch (br)"
+${LangFileString} lng_brx "Bodo (brx)"
+${LangFileString} lng_ca "Katalanisch (ca)"
+${LangFileString} lng_ca@valencia "Valencianisches Katalan (ca@valencia)"
+${LangFileString} lng_cs "Tschechisch (cs)"
+${LangFileString} lng_da "Dänisch (da)"
+${LangFileString} lng_de "Deutsch (de)"
+${LangFileString} lng_doi "Dogri (doi)"
+${LangFileString} lng_dz "Dzongkha (dz)"
+${LangFileString} lng_el "Griechisch (el)"
+${LangFileString} lng_en "Englisch (en)"
+${LangFileString} lng_en_AU "Englisch/Australien (en_AU)"
+${LangFileString} lng_en_CA "Englisch/Kanada (en_CA)"
+${LangFileString} lng_en_GB "Englisch/Großbritannien (en_GB)"
+${LangFileString} lng_en_US@piglatin "Pig Latin (en_US@piglatin)"
+${LangFileString} lng_eo "Esperanto (eo)"
+${LangFileString} lng_es "Spanisch (es)"
+${LangFileString} lng_es_MX "Spanisch/Mexico (es_MX)"
+${LangFileString} lng_et "Estnisch (et)"
+${LangFileString} lng_eu "Baskisch (eu)"
+${LangFileString} lng_fa "Farsi (fa)"
+${LangFileString} lng_fi "Finnisch (fi)"
+${LangFileString} lng_fr "Französisch (fr)"
+${LangFileString} lng_ga "Irisch (ga)"
+${LangFileString} lng_gl "Galizisch (gl)"
+${LangFileString} lng_gu "Gujarati (gu)"
+${LangFileString} lng_he "Hebräisch (he)"
+${LangFileString} lng_hi "Hindi (hi)"
+${LangFileString} lng_hr "Kroatisch (hr)"
+${LangFileString} lng_hu "Ungarisch (hu)"
+${LangFileString} lng_hy "Armenisch (hy)"
+${LangFileString} lng_id "Indonesisch (id)"
+${LangFileString} lng_is "Isländisch (is)"
+${LangFileString} lng_it "Italienisch (it)"
+${LangFileString} lng_ja "Japanisch (ja)"
+${LangFileString} lng_km "Khmer (km)"
+${LangFileString} lng_kn "Kannada (kn)"
+${LangFileString} lng_ko "Koreanisch (ko)"
+${LangFileString} lng_kok "Konkani (kok)"
+${LangFileString} lng_kok@latin "Konkani in lateinischer Schrift (sr@latin)"
+${LangFileString} lng_ks@aran "Kashmiri in erweiterter arabischer Schrift (ks@aran)"
+${LangFileString} lng_ks@deva "Kashmiri in Devanagari-Schrift (ks@deva)"
+${LangFileString} lng_lt "Litauisch (lt)"
+${LangFileString} lng_lv "Lettisch (lv)"
+${LangFileString} lng_mai "Maithili (mai)"
+${LangFileString} lng_mk "Mazedonisch (mk)"
+${LangFileString} lng_ml "Malayalam (ml)"
+${LangFileString} lng_mn "Mongolisch (mn)"
+${LangFileString} lng_mni "Meitei (mni)"
+${LangFileString} lng_mni@beng "Manipuri in bengalischer Schrift (mni@beng)"
+${LangFileString} lng_mr "Marathi (mr)"
+${LangFileString} lng_nb "Norwegisch/Bokmål (nb)"
+${LangFileString} lng_ne "Nepalesisch (ne)"
+${LangFileString} lng_nl "Niderländisch (nl)"
+${LangFileString} lng_nn "Norwegisch/Nynorsk (nn)"
+${LangFileString} lng_or "Orya (or)"
+${LangFileString} lng_pa "Panjabi (pa)"
+${LangFileString} lng_pl "Polnisch (pl)"
+${LangFileString} lng_pt "Portugisisch(pt)"
+${LangFileString} lng_pt_BR "Portugisisch/Brasilien (pt_BR)"
+${LangFileString} lng_ro "Rumänisch (ro)"
+${LangFileString} lng_ru "Russisch (ru)"
+${LangFileString} lng_rw "Kinyarwanda (rw)"
+${LangFileString} lng_sa "Sanskrit (sa)"
+${LangFileString} lng_sat "Santali (sat)"
+${LangFileString} lng_sat@deva "Santali in Devanagari-Schrift (sat@deva)"
+${LangFileString} lng_sd "Sindhi (sd)"
+${LangFileString} lng_sd@deva "Sindhi in Devanagari-Schrift (sd@deva)"
+${LangFileString} lng_sk "Slovakisch (sk)"
+${LangFileString} lng_sl "Slovenisch (sl)"
+${LangFileString} lng_sq "Albanisch (sq)"
+${LangFileString} lng_sr "Serbisch (sr)"
+${LangFileString} lng_sr@latin "Serbisch in lateinischer Schrift (sr@latin)"
+${LangFileString} lng_sv "Schwedisch (sv)"
+${LangFileString} lng_ta "Tamilisch (ta)"
+${LangFileString} lng_te "Telugu (te)"
+${LangFileString} lng_th "Thai (th)"
+${LangFileString} lng_tr "Türkisch (tr)"
+${LangFileString} lng_uk "Ukrainisch (uk)"
+${LangFileString} lng_ur "Urdu (ur)"
+${LangFileString} lng_vi "Vietnamesisch (vi)"
+${LangFileString} lng_zh_CN "Chinesisch/china (zh_CN)"
+${LangFileString} lng_zh_TW "Chinesisch/Taiwan (zh_TW)"
diff --git a/packaging/win32/languages/Greek.nsh b/packaging/win32/languages/Greek.nsh
index a0fa0176f..2f07e36b1 100644
--- a/packaging/win32/languages/Greek.nsh
+++ b/packaging/win32/languages/Greek.nsh
@@ -44,97 +44,6 @@ ${LangFileString} Dictionaries "Dictionaries"
${LangFileString} DictionariesDesc "Dictionaries for some common languages for spell checking in Inkscape"
${LangFileString} Languages "Μεταφράσεις"
${LangFileString} LanguagesDesc "Εγκατάσταση ποικίλων μεταφράσεων για το Inkscape"
-${LangFileString} lng_am "Αμχαρικά"
-${LangFileString} lng_ar "Αραβικά"
-${LangFileString} lng_as "Assamese"
-${LangFileString} lng_az "Αζέρικα"
-${LangFileString} lng_be "Λευκορώσικα"
-${LangFileString} lng_bg "Βουλγαρικά"
-${LangFileString} lng_bn "Μπενγκάλι"
-${LangFileString} lng_bn_BD "Bengali Bangladesh"
-${LangFileString} lng_br "Βρετονικά"
-${LangFileString} lng_brx "Bodo"
-${LangFileString} lng_ca "Καταλανικά"
-${LangFileString} lng_ca@valencia "Καταλανικά Βαλένθιας"
-${LangFileString} lng_cs "Τσέχικα"
-${LangFileString} lng_da "Δανέζικα"
-${LangFileString} lng_de "Γερμανικά"
-${LangFileString} lng_doi "Dogri"
-${LangFileString} lng_dz "Ντζόνγκα"
-${LangFileString} lng_el "Ελληνικά"
-${LangFileString} lng_en "Αγγλικά"
-${LangFileString} lng_en_AU "Αγγλικά Αυστραλίας"
-${LangFileString} lng_en_CA "Αγγλικά Καναδά"
-${LangFileString} lng_en_GB "Αγγλικά Βρετανίας"
-${LangFileString} lng_en_US@piglatin "Pig Λατινικά"
-${LangFileString} lng_eo "Εσπεράντο"
-${LangFileString} lng_es "Ισπανικά"
-${LangFileString} lng_es_MX "Ισπανικά Μεξικού"
-${LangFileString} lng_et "Εσθονικά"
-${LangFileString} lng_eu "Βασκικά"
-${LangFileString} lng_fa "Φαρσί"
-${LangFileString} lng_fi "Φινλανδικά"
-${LangFileString} lng_fr "Γαλλικά"
-${LangFileString} lng_ga "Ιρλανδικά"
-${LangFileString} lng_gl "Γαλικιανικά"
-${LangFileString} lng_gu "Gujarati"
-${LangFileString} lng_he "Εβραϊκά"
-${LangFileString} lng_hi "Hindi"
-${LangFileString} lng_hr "Κροατικά"
-${LangFileString} lng_hu "Ουγγρικά"
-${LangFileString} lng_hy "Armenian"
-${LangFileString} lng_id "Ινδονησιακά"
-${LangFileString} lng_is "Icelandic"
-${LangFileString} lng_it "Ιταλικά"
-${LangFileString} lng_ja "Γιαπωνέζικα"
-${LangFileString} lng_km "Χμερ"
-${LangFileString} lng_kn "Kannada"
-${LangFileString} lng_ko "Κορεατικά"
-${LangFileString} lng_kok "Konkani"
-${LangFileString} lng_kok@latin "Konkani in Latin script"
-${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script"
-${LangFileString} lng_ks@deva "Kashmiri in Devanagari script"
-${LangFileString} lng_lt "Λιθουανικά"
-${LangFileString} lng_lv "Latvian"
-${LangFileString} lng_mai "Maithili"
-${LangFileString} lng_mk "Μακεδονικά"
-${LangFileString} lng_ml "Malayalam"
-${LangFileString} lng_mn "Μογγολικά"
-${LangFileString} lng_mni "Manipuri"
-${LangFileString} lng_mni@beng "Manipuri in Bengali script"
-${LangFileString} lng_mr "Marathi"
-${LangFileString} lng_nb "Νορβηγικά Bokmεl"
-${LangFileString} lng_ne "Νεπαλικά"
-${LangFileString} lng_nl "Ολλανδικά"
-${LangFileString} lng_nn "Νορβηγικά Nynorsk"
-${LangFileString} lng_or "Odia"
-${LangFileString} lng_pa "Παντζάμπικα"
-${LangFileString} lng_pl "Πολωνικά"
-${LangFileString} lng_pt "Πορτογαλικά"
-${LangFileString} lng_pt_BR "Πορτογαλικά Βραζιλίας"
-${LangFileString} lng_ro "Ρουμάνικα"
-${LangFileString} lng_ru "Ρώσικα"
-${LangFileString} lng_rw "Κίνιαρουάντα"
-${LangFileString} lng_sa "Sanskrit"
-${LangFileString} lng_sat "Santali"
-${LangFileString} lng_sat@deva "Santali in Devanagari script"
-${LangFileString} lng_sd "Sindhi"
-${LangFileString} lng_sd@deva "Sindhi in Devanagari script"
-${LangFileString} lng_sk "Σλοβάκικα"
-${LangFileString} lng_sl "Σλοβένικα"
-${LangFileString} lng_sq "Αλβανικά"
-${LangFileString} lng_sr "Σέρβικα"
-${LangFileString} lng_sr@latin "Σέρβικα σε λατινική γραφή"
-${LangFileString} lng_sv "Σουηδικά"
-${LangFileString} lng_ta "Tamil"
-${LangFileString} lng_te "Τελούγκου"
-${LangFileString} lng_th "Τάι"
-${LangFileString} lng_tr "Τούρκικα"
-${LangFileString} lng_uk "Ουκρανικά"
-${LangFileString} lng_ur "Urdu"
-${LangFileString} lng_vi "Βιετναμέζικα"
-${LangFileString} lng_zh_CN "Απλοποιημένα κινέζικα"
-${LangFileString} lng_zh_TW "Παραδοσιακά κινέζικα"
${LangFileString} UInstOpt "Επιλογές απεγκατάστασης"
${LangFileString} UInstOpt1 "Παρακαλώ διαλέξτε για πρόσθετες επιλογές"
${LangFileString} PurgePrefs "Διατήρηση προσωπικών προτιμήσεων"
diff --git a/packaging/win32/languages/Greek_languageNames.nsh b/packaging/win32/languages/Greek_languageNames.nsh
new file mode 100644
index 000000000..2ff2827a7
--- /dev/null
+++ b/packaging/win32/languages/Greek_languageNames.nsh
@@ -0,0 +1,94 @@
+### Greek (el) translations for language names
+# This file has been automatically created by '_language_lists.py', do not edit it manually!
+# Strings that should be translated are in 'Greek.nsh'
+${LangFileString} lng_am "Αμχαρικά (am)"
+${LangFileString} lng_ar "Αραβικά (ar)"
+${LangFileString} lng_as "Ασαμικά (as)"
+${LangFileString} lng_az "Αζέρικα (az)"
+${LangFileString} lng_be "Λευκορώσικα (be)"
+${LangFileString} lng_bg "Βουλγαρικά (bg)"
+${LangFileString} lng_bn "Μπενγκάλι (bn)"
+${LangFileString} lng_bn_BD "Μπεγκάλι/Μπανγκλαντές (bn_BD)"
+${LangFileString} lng_br "Βρετονικά (br)"
+${LangFileString} lng_brx "Μπόντο (brx)"
+${LangFileString} lng_ca "Καταλανικά (ca)"
+${LangFileString} lng_ca@valencia "Καταλανικά Βαλένθιας (ca@valencia)"
+${LangFileString} lng_cs "Τσέχικα (cs)"
+${LangFileString} lng_da "Δανέζικα (da)"
+${LangFileString} lng_de "Γερμανικά (de)"
+${LangFileString} lng_doi "Ντόγκρι (doi)"
+${LangFileString} lng_dz "Ντζόγκα (dz)"
+${LangFileString} lng_el "Ελληνικά (el)"
+${LangFileString} lng_en "Αγγλικά (Αμερικής)"
+${LangFileString} lng_en_AU "Αγγλικά/Αυστραλία (en_AU)"
+${LangFileString} lng_en_CA "Αγγλικά/Καναδάς (en_CA)"
+${LangFileString} lng_en_GB "Αγγλικά/Μεγάλη Βρετανία (en_GB)"
+${LangFileString} lng_en_US@piglatin "Pig Latin (en_US@piglatin)"
+${LangFileString} lng_eo "Εσπεράντο (eo)"
+${LangFileString} lng_es "Ισπανικά (es)"
+${LangFileString} lng_es_MX "Ισπανικά/Μέξικο (es_MX)"
+${LangFileString} lng_et "Εσθονικά (et)"
+${LangFileString} lng_eu "Βασκικά (eu)"
+${LangFileString} lng_fa "Φαρσί (fa)"
+${LangFileString} lng_fi "Φινλανδικά (fi)"
+${LangFileString} lng_fr "Γαλλικά (fr)"
+${LangFileString} lng_ga "Ιρλανδική (ga)"
+${LangFileString} lng_gl "Γαλικία (gl)"
+${LangFileString} lng_gu "Γκουαράτι (gu)"
+${LangFileString} lng_he "Εβραϊκά (he)"
+${LangFileString} lng_hi "Χίντι (hi)"
+${LangFileString} lng_hr "Κροατικά (hr)"
+${LangFileString} lng_hu "Ουγγρικά (hu)"
+${LangFileString} lng_hy "Αρμένικα (hy)"
+${LangFileString} lng_id "Ινδονησιακά (id)"
+${LangFileString} lng_is "Ισλανδικά (is)"
+${LangFileString} lng_it "Ιταλικά (it)"
+${LangFileString} lng_ja "Γιαπωνέζικα (ja)"
+${LangFileString} lng_km "Χμερ (km)"
+${LangFileString} lng_kn "Κανάντα (kn)"
+${LangFileString} lng_ko "Κορεάτικα (ko)"
+${LangFileString} lng_kok "Κονκανικά (kok)"
+${LangFileString} lng_kok@latin "Κονκανικά με λατινική γραφή (kok@latin)"
+${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script (ks@aran)"
+${LangFileString} lng_ks@deva "Κασμιρικά με γραφή ντεβάνγκαρι (ks@deva)"
+${LangFileString} lng_lt "Λιθουανικά (lt)"
+${LangFileString} lng_lv "Λιθουανικά (lv)"
+${LangFileString} lng_mai "Μαιτίλι (mai)"
+${LangFileString} lng_mk "Μακεδονικά (mk)"
+${LangFileString} lng_ml "Μαγιαλαμικά (ml)"
+${LangFileString} lng_mn "Μογγολικά (mn)"
+${LangFileString} lng_mni "Μανιπουρικά (mni)"
+${LangFileString} lng_mni@beng "Μανιπουρικά με γραφή Βεγγάλης (mni@beng)"
+${LangFileString} lng_mr "Μαραθικά (mr)"
+${LangFileString} lng_nb "Νορβηγικά Bokmål (nb)"
+${LangFileString} lng_ne "Νεπαλικά (ne)"
+${LangFileString} lng_nl "Ολλανδικά (nl)"
+${LangFileString} lng_nn "Νορβηγικά Nynorsk (nn)"
+${LangFileString} lng_or "Όντια (or)"
+${LangFileString} lng_pa "Πουντζάμπι (pa)"
+${LangFileString} lng_pl "Πολωνικά (pl)"
+${LangFileString} lng_pt "Πορτογαλικά (pt)"
+${LangFileString} lng_pt_BR "Πορτογαλικά/Βραζιλίας (pt_BR)"
+${LangFileString} lng_ro "Ρουμανικά (ro)"
+${LangFileString} lng_ru "Ρωσικά (ru)"
+${LangFileString} lng_rw "Κινιαρουάντα (rw)"
+${LangFileString} lng_sa "Σανσκριτικά (sa)"
+${LangFileString} lng_sat "Σανταλικά (sat)"
+${LangFileString} lng_sat@deva "Σανταλικά με γραφή ντεβαναγκάρι (sat@deva)"
+${LangFileString} lng_sd "Σίντι (sd)"
+${LangFileString} lng_sd@deva "Σίντι με γραφή ντεβαναγκάρι (sd@deva)"
+${LangFileString} lng_sk "Σλοβακικά (sk)"
+${LangFileString} lng_sl "Σλοβένικα (sl)"
+${LangFileString} lng_sq "Αλβανικά (sq)"
+${LangFileString} lng_sr "Σερβικά/Λατινικά (sr)"
+${LangFileString} lng_sr@latin "Σερβικά σε λατινική γραφή (sr@latin)"
+${LangFileString} lng_sv "Σουηδικά (sv)"
+${LangFileString} lng_ta "Ταμίλ (ta)"
+${LangFileString} lng_te "Τελούγκου (te)"
+${LangFileString} lng_th "Μπατ Ταϊλάνδης (th)"
+${LangFileString} lng_tr "Τουρκικά (tr)"
+${LangFileString} lng_uk "Ουκρανικά (uk)"
+${LangFileString} lng_ur "Ούρντου (ur)"
+${LangFileString} lng_vi "Βιετναμέζικα (vi)"
+${LangFileString} lng_zh_CN "Κινέζικα/Κίνα (zh_CN)"
+${LangFileString} lng_zh_TW "Κινέζικα/Ταϊβάν (zh_TW)"
diff --git a/packaging/win32/languages/Hebrew.nsh b/packaging/win32/languages/Hebrew.nsh
index 2de0d69c7..ecc94c3fe 100644
--- a/packaging/win32/languages/Hebrew.nsh
+++ b/packaging/win32/languages/Hebrew.nsh
@@ -44,97 +44,6 @@ ${LangFileString} Dictionaries "Dictionaries"
${LangFileString} DictionariesDesc "Dictionaries for some common languages for spell checking in Inkscape"
${LangFileString} Languages "תרגומים"
${LangFileString} LanguagesDesc "התקנת מגוון תרגומים לאינקסקייפ"
-${LangFileString} lng_am "אמהרית"
-${LangFileString} lng_ar "ערבית"
-${LangFileString} lng_as "Assamese"
-${LangFileString} lng_az "אזרית"
-${LangFileString} lng_be "בלרוסית"
-${LangFileString} lng_bg "בולגרית"
-${LangFileString} lng_bn "בנגלית"
-${LangFileString} lng_bn_BD "Bengali Bangladesh"
-${LangFileString} lng_br "ברטונית"
-${LangFileString} lng_brx "Bodo"
-${LangFileString} lng_ca "קטלאנית"
-${LangFileString} lng_ca@valencia "קטלאנית ולנסית"
-${LangFileString} lng_cs "צ׳כית"
-${LangFileString} lng_da "דנית"
-${LangFileString} lng_de "גרמנית"
-${LangFileString} lng_doi "Dogri"
-${LangFileString} lng_dz "דזונגקה"
-${LangFileString} lng_el "יוונית"
-${LangFileString} lng_en "אנגלית"
-${LangFileString} lng_en_AU "אנגלית אוסטרלית"
-${LangFileString} lng_en_CA "אנגלית קנדית"
-${LangFileString} lng_en_GB "אנגלית בריטית"
-${LangFileString} lng_en_US@piglatin "לטינית חזירית"
-${LangFileString} lng_eo "אספרנטו"
-${LangFileString} lng_es "ספרדית"
-${LangFileString} lng_es_MX "ספרדית מקסיקנית"
-${LangFileString} lng_et "אסטונית"
-${LangFileString} lng_eu "בסקית"
-${LangFileString} lng_fa "פרסית"
-${LangFileString} lng_fi "פינית"
-${LangFileString} lng_fr "צרפתית"
-${LangFileString} lng_ga "אירית"
-${LangFileString} lng_gl "גליסית"
-${LangFileString} lng_gu "Gujarati"
-${LangFileString} lng_he "עברית"
-${LangFileString} lng_hi "Hindi"
-${LangFileString} lng_hr "קרואטית"
-${LangFileString} lng_hu "הונגרית"
-${LangFileString} lng_hy "Armenian"
-${LangFileString} lng_id "אינדונזית"
-${LangFileString} lng_is "Icelandic"
-${LangFileString} lng_it "איטלקית"
-${LangFileString} lng_ja "יפנית"
-${LangFileString} lng_km "קמרית"
-${LangFileString} lng_kn "Kannada"
-${LangFileString} lng_ko "קוריאנית"
-${LangFileString} lng_kok "Konkani"
-${LangFileString} lng_kok@latin "Konkani in Latin script"
-${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script"
-${LangFileString} lng_ks@deva "Kashmiri in Devanagari script"
-${LangFileString} lng_lt "ליטאית"
-${LangFileString} lng_lv "Latvian"
-${LangFileString} lng_mai "Maithili"
-${LangFileString} lng_mk "מקדונית"
-${LangFileString} lng_ml "Malayalam"
-${LangFileString} lng_mn "מונגולית"
-${LangFileString} lng_mni "Manipuri"
-${LangFileString} lng_mni@beng "Manipuri in Bengali script"
-${LangFileString} lng_mr "Marathi"
-${LangFileString} lng_nb "נורבגית בוקמולית"
-${LangFileString} lng_ne "נפאלית"
-${LangFileString} lng_nl "Dutch"
-${LangFileString} lng_nn "נורבגית נינורשקית"
-${LangFileString} lng_or "Odia"
-${LangFileString} lng_pa "פנג׳אבי"
-${LangFileString} lng_pl "פולנית"
-${LangFileString} lng_pt "פורטוגלית"
-${LangFileString} lng_pt_BR "פורטוגלית בריזלאית"
-${LangFileString} lng_ro "רומנית"
-${LangFileString} lng_ru "רוסית"
-${LangFileString} lng_rw "קיניַרואנדה"
-${LangFileString} lng_sa "Sanskrit"
-${LangFileString} lng_sat "Santali"
-${LangFileString} lng_sat@deva "Santali in Devanagari script"
-${LangFileString} lng_sd "Sindhi"
-${LangFileString} lng_sd@deva "Sindhi in Devanagari script"
-${LangFileString} lng_sk "סלובקית"
-${LangFileString} lng_sl "סלובנית"
-${LangFileString} lng_sq "אלבנית"
-${LangFileString} lng_sr "סרבית"
-${LangFileString} lng_sr@latin "סרבית בכתב לטיני"
-${LangFileString} lng_sv "שבדית"
-${LangFileString} lng_ta "Tamil"
-${LangFileString} lng_te "טלוגו"
-${LangFileString} lng_th "תאי"
-${LangFileString} lng_tr "טורקית"
-${LangFileString} lng_uk "אוקראינית"
-${LangFileString} lng_ur "Urdu"
-${LangFileString} lng_vi "וייטנאמית"
-${LangFileString} lng_zh_CN "סינית מפושטת"
-${LangFileString} lng_zh_TW "סינית מסורתית"
${LangFileString} UInstOpt "אפשרויות הסרה"
${LangFileString} UInstOpt1 "נא לבחור מהרשימה כדי להשתמש באפשרויות נוספות"
${LangFileString} PurgePrefs "שמירת ההעדפות האישיות"
diff --git a/packaging/win32/languages/Hebrew_languageNames.nsh b/packaging/win32/languages/Hebrew_languageNames.nsh
new file mode 100644
index 000000000..210a6b63d
--- /dev/null
+++ b/packaging/win32/languages/Hebrew_languageNames.nsh
@@ -0,0 +1,94 @@
+### Hebrew (he) translations for language names
+# This file has been automatically created by '_language_lists.py', do not edit it manually!
+# Strings that should be translated are in 'Hebrew.nsh'
+${LangFileString} lng_am "אמהרית (am)"
+${LangFileString} lng_ar "ערבית (ar)"
+${LangFileString} lng_as "Assamese (as)"
+${LangFileString} lng_az "אזרבייג׳נית (az)"
+${LangFileString} lng_be "בלרוסית (be)"
+${LangFileString} lng_bg "בולגרית (bg)"
+${LangFileString} lng_bn "בנגאלית (bn)"
+${LangFileString} lng_bn_BD "Bengali/Bangladesh (bn_BD)"
+${LangFileString} lng_br "ברטון (br)"
+${LangFileString} lng_brx "Bodo (brx)"
+${LangFileString} lng_ca "קטלונית (ca)"
+${LangFileString} lng_ca@valencia "קטלונית ולסיאנית (ca@valencia)"
+${LangFileString} lng_cs "צ׳כית (cs)"
+${LangFileString} lng_da "דנית (da)"
+${LangFileString} lng_de "גרמנית (de)"
+${LangFileString} lng_doi "Dogri (doi)"
+${LangFileString} lng_dz "דזונקה (dz)"
+${LangFileString} lng_el "יוונית (el)"
+${LangFileString} lng_en "אנגלית (en)"
+${LangFileString} lng_en_AU "אנגלית/אוסטרליה (en_AU)"
+${LangFileString} lng_en_CA "אנגלית/קנדה (en_CA)"
+${LangFileString} lng_en_GB "אנגלית/אנגליה (en_GB)"
+${LangFileString} lng_en_US@piglatin "לטינית חזירית (en_US@piglatin)"
+${LangFileString} lng_eo "אספרנטו (eo)"
+${LangFileString} lng_es "ספרדית (es)"
+${LangFileString} lng_es_MX "ספרדית/מקסיקו (es_MX)"
+${LangFileString} lng_et "אסטונית (et)"
+${LangFileString} lng_eu "בסקית (eu)"
+${LangFileString} lng_fa "פרסית (fa)"
+${LangFileString} lng_fi "פינית (fi)"
+${LangFileString} lng_fr "צרפתית (fr)"
+${LangFileString} lng_ga "אירית (ga)"
+${LangFileString} lng_gl "גליסית (gl)"
+${LangFileString} lng_gu "Gujarati (gu)"
+${LangFileString} lng_he "עברית (he)"
+${LangFileString} lng_hi "Hindi (hi)"
+${LangFileString} lng_hr "קרואטית (hr)"
+${LangFileString} lng_hu "הונגרית (hu)"
+${LangFileString} lng_hy "ארמנית (hy)"
+${LangFileString} lng_id "אינדונזית (id)"
+${LangFileString} lng_is "Icelandic (is)"
+${LangFileString} lng_it "איטלקית (it)"
+${LangFileString} lng_ja "יפנית (ja)"
+${LangFileString} lng_km "ח׳מר (km)"
+${LangFileString} lng_kn "Kannada (kn)"
+${LangFileString} lng_ko "קוריאנית (ko)"
+${LangFileString} lng_kok "Konkani (kok)"
+${LangFileString} lng_kok@latin "Konkani in Latin script (kok@latin)"
+${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script (ks@aran)"
+${LangFileString} lng_ks@deva "Kashmiri in Devanagari script (ks@deva)"
+${LangFileString} lng_lt "ליטאית (lt)"
+${LangFileString} lng_lv "Latvian (lv)"
+${LangFileString} lng_mai "Maithili (mai)"
+${LangFileString} lng_mk "מקדונית (mk)"
+${LangFileString} lng_ml "Malayalam (ml)"
+${LangFileString} lng_mn "מונגולית (mn)"
+${LangFileString} lng_mni "Manipuri (mni)"
+${LangFileString} lng_mni@beng "Manipuri in Bengali script (mni@beng)"
+${LangFileString} lng_mr "Marathi (mr)"
+${LangFileString} lng_nb "נורבגית בוקמול (nb)"
+${LangFileString} lng_ne "נפאלית (ne)"
+${LangFileString} lng_nl "הולנדית (nl)"
+${LangFileString} lng_nn "נורבגית נינורשק (nn)"
+${LangFileString} lng_or "Odia (or)"
+${LangFileString} lng_pa "פנג׳בית (pa)"
+${LangFileString} lng_pl "פולנית (pl)"
+${LangFileString} lng_pt "פורטוגזית (pt)"
+${LangFileString} lng_pt_BR "פורטוגזית/ברזיל (pt_BR)"
+${LangFileString} lng_ro "רומנית (ro)"
+${LangFileString} lng_ru "רוסית (ru)"
+${LangFileString} lng_rw "קיניארוונדה (rw)"
+${LangFileString} lng_sa "Sanskrit (sa)"
+${LangFileString} lng_sat "Santali (sat)"
+${LangFileString} lng_sat@deva "Santali in Devanagari script (sat@deva)"
+${LangFileString} lng_sd "Sindhi (sd)"
+${LangFileString} lng_sd@deva "Sindhi in Devanagari script (sd@deva)"
+${LangFileString} lng_sk "סלובקית (sk)"
+${LangFileString} lng_sl "סלובנית (sl)"
+${LangFileString} lng_sq "אלבנית (sq)"
+${LangFileString} lng_sr "סרבית (sr)"
+${LangFileString} lng_sr@latin "סרבית בכתב לטיני (sr@latin)"
+${LangFileString} lng_sv "שבדית (sv)"
+${LangFileString} lng_ta "Tamil (ta)"
+${LangFileString} lng_te "Telugu (te)"
+${LangFileString} lng_th "תאילנדית (th)"
+${LangFileString} lng_tr "טורקית (tr)"
+${LangFileString} lng_uk "אוקראינית (uk)"
+${LangFileString} lng_ur "Urdu (ur)"
+${LangFileString} lng_vi "וייטנאמית (vi)"
+${LangFileString} lng_zh_CN "סינית/סין (zh_CN)"
+${LangFileString} lng_zh_TW "סינית/טייוואן (zh_TW)"
diff --git a/packaging/win32/languages/Icelandic.nsh b/packaging/win32/languages/Icelandic.nsh
index f7dfaa104..f5f3bb253 100644
--- a/packaging/win32/languages/Icelandic.nsh
+++ b/packaging/win32/languages/Icelandic.nsh
@@ -45,97 +45,6 @@ ${LangFileString} Dictionaries "Dictionaries"
${LangFileString} DictionariesDesc "Dictionaries for some common languages for spell checking in Inkscape"
${LangFileString} Languages "Þýðingar"
${LangFileString} LanguagesDesc "Setja inn ýmsar þýðingar á Inkscape"
-${LangFileString} lng_am "Amharíska"
-${LangFileString} lng_ar "Arabíska"
-${LangFileString} lng_as "Assamese"
-${LangFileString} lng_az "Azerbadjanska"
-${LangFileString} lng_be "Hvítrússneska"
-${LangFileString} lng_bg "Búlgarska"
-${LangFileString} lng_bn "Bengalska"
-${LangFileString} lng_bn_BD "Bangladesh bengalska"
-${LangFileString} lng_br "Bretónska"
-${LangFileString} lng_brx "Bodo"
-${LangFileString} lng_ca "Katalónska"
-${LangFileString} lng_ca@valencia "Valensíönsk katalónska"
-${LangFileString} lng_cs "Tékkneska"
-${LangFileString} lng_da "Danska"
-${LangFileString} lng_de "Þýska"
-${LangFileString} lng_doi "Dogri"
-${LangFileString} lng_dz "Dzongkha"
-${LangFileString} lng_el "Gríska"
-${LangFileString} lng_en "Enska"
-${LangFileString} lng_en_AU "Áströlsk enska"
-${LangFileString} lng_en_CA "Kanadísk enska"
-${LangFileString} lng_en_GB "Bresk enska"
-${LangFileString} lng_en_US@piglatin "Pig Latína"
-${LangFileString} lng_eo "Esperantó"
-${LangFileString} lng_es "Spænska"
-${LangFileString} lng_es_MX "Mexíkönsk spænska"
-${LangFileString} lng_et "Eistneska"
-${LangFileString} lng_eu "Baskneska"
-${LangFileString} lng_fa "Farsi"
-${LangFileString} lng_fi "Finnska"
-${LangFileString} lng_fr "Franska"
-${LangFileString} lng_ga "Írska"
-${LangFileString} lng_gl "Galisíska"
-${LangFileString} lng_gu "Gujarati"
-${LangFileString} lng_he "Hebreska"
-${LangFileString} lng_hi "Hindi"
-${LangFileString} lng_hr "Króatíska"
-${LangFileString} lng_hu "Ungverska"
-${LangFileString} lng_hy "Armenska"
-${LangFileString} lng_id "Indónesíska"
-${LangFileString} lng_is "Íslenska"
-${LangFileString} lng_it "Ítalska"
-${LangFileString} lng_ja "Japanska"
-${LangFileString} lng_km "Khmeríska"
-${LangFileString} lng_kn "Kannada"
-${LangFileString} lng_ko "Kóreska"
-${LangFileString} lng_kok "Konkani"
-${LangFileString} lng_kok@latin "Konkani in Latin script"
-${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script"
-${LangFileString} lng_ks@deva "Kashmiri in Devanagari script"
-${LangFileString} lng_lt "Litháenska"
-${LangFileString} lng_lv "Lettneska"
-${LangFileString} lng_mai "Maithili"
-${LangFileString} lng_mk "Makedónska"
-${LangFileString} lng_ml "Malayalam"
-${LangFileString} lng_mn "Mongólska"
-${LangFileString} lng_mni "Manipuri"
-${LangFileString} lng_mni@beng "Manipuri in Bengali script"
-${LangFileString} lng_mr "Marathi"
-${LangFileString} lng_nb "Norskt bókmál"
-${LangFileString} lng_ne "Nepalska"
-${LangFileString} lng_nl "Hollenska"
-${LangFileString} lng_nn "Nýnorska"
-${LangFileString} lng_or "Odia"
-${LangFileString} lng_pa "Panjabi"
-${LangFileString} lng_pl "Pólska"
-${LangFileString} lng_pt "Portúgalska"
-${LangFileString} lng_pt_BR "Brasilísk portúgalska"
-${LangFileString} lng_ro "Rúmenska"
-${LangFileString} lng_ru "Rússneska"
-${LangFileString} lng_rw "Kinyarwanda"
-${LangFileString} lng_sa "Sanskrit"
-${LangFileString} lng_sat "Santali"
-${LangFileString} lng_sat@deva "Santali in Devanagari script"
-${LangFileString} lng_sd "Sindhi"
-${LangFileString} lng_sd@deva "Sindhi in Devanagari script"
-${LangFileString} lng_sk "Slóvakíska"
-${LangFileString} lng_sl "Slóvenska"
-${LangFileString} lng_sq "Albanska"
-${LangFileString} lng_sr "Serbneska"
-${LangFileString} lng_sr@latin "Serbneska með latnesku letri"
-${LangFileString} lng_sv "Sænska"
-${LangFileString} lng_ta "Tamil"
-${LangFileString} lng_te "Telúgú"
-${LangFileString} lng_th "Tælenska"
-${LangFileString} lng_tr "Tyrkneska"
-${LangFileString} lng_uk "Úkraínska"
-${LangFileString} lng_ur "Urdu"
-${LangFileString} lng_vi "Víetnamska"
-${LangFileString} lng_zh_CN "Einfölduð kínverska"
-${LangFileString} lng_zh_TW "Hefðbundin kínverska"
${LangFileString} UInstOpt "Valkostir við fjarlægingu"
${LangFileString} UInstOpt1 "Ákveddu hvað þú vilt gera fyrir þessa aukavalkosti"
${LangFileString} PurgePrefs "Halda persónulegum kjörstillingum"
diff --git a/packaging/win32/languages/Icelandic_languageNames.nsh b/packaging/win32/languages/Icelandic_languageNames.nsh
new file mode 100644
index 000000000..9065ab158
--- /dev/null
+++ b/packaging/win32/languages/Icelandic_languageNames.nsh
@@ -0,0 +1,94 @@
+### Icelandic (is) translations for language names
+# This file has been automatically created by '_language_lists.py', do not edit it manually!
+# Strings that should be translated are in 'Icelandic.nsh'
+${LangFileString} lng_am "Amharíska (am)"
+${LangFileString} lng_ar "Arabíska (ar)"
+${LangFileString} lng_as "Assamíska (as)"
+${LangFileString} lng_az "Azerbaijanska (az)"
+${LangFileString} lng_be "Hvítrússneska (be)"
+${LangFileString} lng_bg "Búlgarska (bg)"
+${LangFileString} lng_bn "Bengalska (bn)"
+${LangFileString} lng_bn_BD "Bengali/Bangladesh (bn_BD)"
+${LangFileString} lng_br "Bretónska (br)"
+${LangFileString} lng_brx "Bodo (brx)"
+${LangFileString} lng_ca "Katalónska (ca)"
+${LangFileString} lng_ca@valencia "Valensísk-katalónska (ca@valencia)"
+${LangFileString} lng_cs "Tékkneska (cs)"
+${LangFileString} lng_da "Danska (da)"
+${LangFileString} lng_de "Þýska (de)"
+${LangFileString} lng_doi "Dogri (doi)"
+${LangFileString} lng_dz "Dzongkha (dz)"
+${LangFileString} lng_el "Gríska (el)"
+${LangFileString} lng_en "Enska (en)"
+${LangFileString} lng_en_AU "Enska/Ástralía (en_AU)"
+${LangFileString} lng_en_CA "Enska/Kanada (en_CA)"
+${LangFileString} lng_en_GB "Enska/Stóra Bretland (en_GB)"
+${LangFileString} lng_en_US@piglatin "Pig Latin (en_US@piglatin)"
+${LangFileString} lng_eo "Esperantó (eo)"
+${LangFileString} lng_es "Spænska (es)"
+${LangFileString} lng_es_MX "Spænska/Mexíkó (es_MX)"
+${LangFileString} lng_et "Eistneska (et)"
+${LangFileString} lng_eu "Baskneska (eu)"
+${LangFileString} lng_fa "Farsí (fa)"
+${LangFileString} lng_fi "Finnska (fi)"
+${LangFileString} lng_fr "Franska (fr)"
+${LangFileString} lng_ga "Írska (ga)"
+${LangFileString} lng_gl "Galisíska (gl)"
+${LangFileString} lng_gu "Gújaratí (gu)"
+${LangFileString} lng_he "Hebreska (he)"
+${LangFileString} lng_hi "Hindí (hi)"
+${LangFileString} lng_hr "Króatíska (hr)"
+${LangFileString} lng_hu "Ungverska (hu)"
+${LangFileString} lng_hy "Armenska (hy)"
+${LangFileString} lng_id "Indónesíska (id)"
+${LangFileString} lng_is "Íslenska (is)"
+${LangFileString} lng_it "Ítalska (it)"
+${LangFileString} lng_ja "Japanska (ja)"
+${LangFileString} lng_km "Khmeríska (km)"
+${LangFileString} lng_kn "Kannada (kn)"
+${LangFileString} lng_ko "Kóreska (ko)"
+${LangFileString} lng_kok "Konkaní (kok)"
+${LangFileString} lng_kok@latin "Konkaní með latneskt letur (kok@latin)"
+${LangFileString} lng_ks@aran "Kashmírska með Peso-Arabísku letri (ks@aran)"
+${LangFileString} lng_ks@deva "Kashmírska með Devanagarí letur (ks@deva)"
+${LangFileString} lng_lt "Litháíska (lt)"
+${LangFileString} lng_lv "Lettlenska (lv)"
+${LangFileString} lng_mai "Maithilí (mai)"
+${LangFileString} lng_mk "Makedónska (mk)"
+${LangFileString} lng_ml "Malaíalam (ml)"
+${LangFileString} lng_mn "Mongólska (mn)"
+${LangFileString} lng_mni "Manipurí (mni)"
+${LangFileString} lng_mni@beng "Manipurí með Bengalí letri (mni@beng)"
+${LangFileString} lng_mr "Marathí (mr)"
+${LangFileString} lng_nb "Norskt bókmál (nb)"
+${LangFileString} lng_ne "Nepalska (ne)"
+${LangFileString} lng_nl "Hollenska (nl)"
+${LangFileString} lng_nn "Nýnorska (nn)"
+${LangFileString} lng_or "Odia (or)"
+${LangFileString} lng_pa "Panjabi (pa)"
+${LangFileString} lng_pl "Pólska (pl)"
+${LangFileString} lng_pt "Portúgalska (pt)"
+${LangFileString} lng_pt_BR "Portúgalska/Brasilía (pt_BR)"
+${LangFileString} lng_ro "Rúmenska (ro)"
+${LangFileString} lng_ru "Rússneska (ru)"
+${LangFileString} lng_rw "Kinyarwanda (rw)"
+${LangFileString} lng_sa "Sanskrít (sa)"
+${LangFileString} lng_sat "Santalí (sat)"
+${LangFileString} lng_sat@deva "Santalí með Devanagarí letur (sd@deva)"
+${LangFileString} lng_sd "Shindí (sd)"
+${LangFileString} lng_sd@deva "Sindhí með Devanagarí letur (sd@deva)"
+${LangFileString} lng_sk "Slóvakíska (sk)"
+${LangFileString} lng_sl "Slóvenska (sl)"
+${LangFileString} lng_sq "Albanska (sq)"
+${LangFileString} lng_sr "Serbneska (sr)"
+${LangFileString} lng_sr@latin "Serbneska með latneskt letur (sr@latin)"
+${LangFileString} lng_sv "Sænska (sv)"
+${LangFileString} lng_ta "Tamílska (ta)"
+${LangFileString} lng_te "Telugu (te)"
+${LangFileString} lng_th "Tælenska (th)"
+${LangFileString} lng_tr "Tyrkneska (tr)"
+${LangFileString} lng_uk "Úkraínska (uk)"
+${LangFileString} lng_ur "Úrdú (ur)"
+${LangFileString} lng_vi "Víetnamska (vi)"
+${LangFileString} lng_zh_CN "Kínverska/Kína (zh_CN)"
+${LangFileString} lng_zh_TW "Kínverska/Taívan (zh_TW)"
diff --git a/packaging/win32/languages/Indonesian.nsh b/packaging/win32/languages/Indonesian.nsh
index 8310ad186..55f577d4f 100644
--- a/packaging/win32/languages/Indonesian.nsh
+++ b/packaging/win32/languages/Indonesian.nsh
@@ -44,97 +44,6 @@ ${LangFileString} Dictionaries "Dictionaries"
${LangFileString} DictionariesDesc "Dictionaries for some common languages for spell checking in Inkscape"
${LangFileString} Languages "Terjemahan"
${LangFileString} LanguagesDesc "Pasang macam-macam terjemahan untuk Inkscape"
-${LangFileString} lng_am "Amharic"
-${LangFileString} lng_ar "Arab"
-${LangFileString} lng_as "Assamese"
-${LangFileString} lng_az "Azerbaijan"
-${LangFileString} lng_be "Belarus"
-${LangFileString} lng_bg "Bulgaria"
-${LangFileString} lng_bn "Benggala"
-${LangFileString} lng_bn_BD "Bengali Bangladesh"
-${LangFileString} lng_br "Breton"
-${LangFileString} lng_brx "Bodo"
-${LangFileString} lng_ca "Katalan"
-${LangFileString} lng_ca@valencia "Katalan Valencia"
-${LangFileString} lng_cs "Ceko"
-${LangFileString} lng_da "Denmark"
-${LangFileString} lng_de "Jerman"
-${LangFileString} lng_doi "Dogri"
-${LangFileString} lng_dz "Dzongkha"
-${LangFileString} lng_el "Yunani"
-${LangFileString} lng_en "Inggris"
-${LangFileString} lng_en_AU "Inggris Australia"
-${LangFileString} lng_en_CA "Inggris Kanada"
-${LangFileString} lng_en_GB "Inggris Inggris"
-${LangFileString} lng_en_US@piglatin "Pig Latin"
-${LangFileString} lng_eo "Esperanto"
-${LangFileString} lng_es "Spanyol"
-${LangFileString} lng_es_MX "Spanyol Meksiko"
-${LangFileString} lng_et "Estonia"
-${LangFileString} lng_eu "Basque"
-${LangFileString} lng_fa "Persia"
-${LangFileString} lng_fi "Finlandia"
-${LangFileString} lng_fr "Perancis"
-${LangFileString} lng_ga "Irlandia"
-${LangFileString} lng_gl "Galician"
-${LangFileString} lng_gu "Gujarati"
-${LangFileString} lng_he "Ibrani"
-${LangFileString} lng_hi "Hindi"
-${LangFileString} lng_hr "Kroasia"
-${LangFileString} lng_hu "Hongaria"
-${LangFileString} lng_hy "Armenian"
-${LangFileString} lng_id "Bahasa Indonesia"
-${LangFileString} lng_is "Icelandic"
-${LangFileString} lng_it "Italia"
-${LangFileString} lng_ja "Jepang"
-${LangFileString} lng_km "Khmer"
-${LangFileString} lng_kn "Kannada"
-${LangFileString} lng_ko "Korea"
-${LangFileString} lng_kok "Konkani"
-${LangFileString} lng_kok@latin "Konkani in Latin script"
-${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script"
-${LangFileString} lng_ks@deva "Kashmiri in Devanagari script"
-${LangFileString} lng_lt "Lithuania"
-${LangFileString} lng_lv "Latvian"
-${LangFileString} lng_mai "Maithili"
-${LangFileString} lng_mk "Macedonia"
-${LangFileString} lng_ml "Malayalam"
-${LangFileString} lng_mn "Mongolia"
-${LangFileString} lng_mni "Manipuri"
-${LangFileString} lng_mni@beng "Manipuri in Bengali script"
-${LangFileString} lng_mr "Marathi"
-${LangFileString} lng_nb "Bokmål Norwegia"
-${LangFileString} lng_ne "Nepal"
-${LangFileString} lng_nl "Belanda"
-${LangFileString} lng_nn "Nynorsk Norwegia"
-${LangFileString} lng_or "Odia"
-${LangFileString} lng_pa "Panjabi"
-${LangFileString} lng_pl "Polandia"
-${LangFileString} lng_pt "Portugis"
-${LangFileString} lng_pt_BR "Portugis Brasil"
-${LangFileString} lng_ro "Rumania"
-${LangFileString} lng_ru "Rusia"
-${LangFileString} lng_rw "Kinyarwanda"
-${LangFileString} lng_sa "Sanskrit"
-${LangFileString} lng_sat "Santali"
-${LangFileString} lng_sat@deva "Santali in Devanagari script"
-${LangFileString} lng_sd "Sindhi"
-${LangFileString} lng_sd@deva "Sindhi in Devanagari script"
-${LangFileString} lng_sk "Slovakia"
-${LangFileString} lng_sl "Slovenia"
-${LangFileString} lng_sq "Albania"
-${LangFileString} lng_sr "Serbia"
-${LangFileString} lng_sr@latin "Serbia dalam Latin"
-${LangFileString} lng_sv "Swedia"
-${LangFileString} lng_ta "Tamil"
-${LangFileString} lng_te "Telugu"
-${LangFileString} lng_th "Thai"
-${LangFileString} lng_tr "Turki"
-${LangFileString} lng_uk "Ukraina"
-${LangFileString} lng_ur "Urdu"
-${LangFileString} lng_vi "Vietnam"
-${LangFileString} lng_zh_CN "Cina Simplifed"
-${LangFileString} lng_zh_TW "Cina Tradisional"
${LangFileString} UInstOpt "Pilihan Pelepasan"
${LangFileString} UInstOpt1 "Silahkan pilih pilihan tambahan"
${LangFileString} PurgePrefs "Simpal preferensi personal"
diff --git a/packaging/win32/languages/Indonesian_languageNames.nsh b/packaging/win32/languages/Indonesian_languageNames.nsh
new file mode 100644
index 000000000..270b03ec9
--- /dev/null
+++ b/packaging/win32/languages/Indonesian_languageNames.nsh
@@ -0,0 +1,94 @@
+### Indonesian (id) translations for language names
+# This file has been automatically created by '_language_lists.py', do not edit it manually!
+# Strings that should be translated are in 'Indonesian.nsh'
+${LangFileString} lng_am "Amharik (am)"
+${LangFileString} lng_ar "Arab (ar)"
+${LangFileString} lng_as "Assamese (as)"
+${LangFileString} lng_az "Azerbaijan (az)"
+${LangFileString} lng_be "Belarusia (be)"
+${LangFileString} lng_bg "Bulgaria (bg)"
+${LangFileString} lng_bn "Bengali (bn)"
+${LangFileString} lng_bn_BD "Bengali/Bangladesh (bn_BD)"
+${LangFileString} lng_br "Breton (br)"
+${LangFileString} lng_brx "Bodo (brx)"
+${LangFileString} lng_ca "Katalan (ca)"
+${LangFileString} lng_ca@valencia "Katalan Valensia (ca@valencia)"
+${LangFileString} lng_cs "Ceko (cs)"
+${LangFileString} lng_da "Denmark (da)"
+${LangFileString} lng_de "Jerman (de)"
+${LangFileString} lng_doi "Dogri (doi)"
+${LangFileString} lng_dz "Dzongkha (dz)"
+${LangFileString} lng_el "Yunani (el)"
+${LangFileString} lng_en "Inggris (en)"
+${LangFileString} lng_en_AU "Inggris/Australia (en_AU)"
+${LangFileString} lng_en_CA "Inggris/Kanada (en_CA)"
+${LangFileString} lng_en_GB "Inggris/Inggris Raya (en_GB)"
+${LangFileString} lng_en_US@piglatin "Pig Latin (en_US@piglatin)"
+${LangFileString} lng_eo "Esperanto (eo)"
+${LangFileString} lng_es "Spanyol (es)"
+${LangFileString} lng_es_MX "Spanyol/Meksiko (es_MX)"
+${LangFileString} lng_et "Estonia (et)"
+${LangFileString} lng_eu "Basque (eu)"
+${LangFileString} lng_fa "Persia (fa)"
+${LangFileString} lng_fi "Finlandia (fi)"
+${LangFileString} lng_fr "Perancis (fr)"
+${LangFileString} lng_ga "Irlandia (ga)"
+${LangFileString} lng_gl "Galisia (gl)"
+${LangFileString} lng_gu "Gujarati (gu)"
+${LangFileString} lng_he "Ibrani (he)"
+${LangFileString} lng_hi "Hindi (hi)"
+${LangFileString} lng_hr "Kroasia (hr)"
+${LangFileString} lng_hu "Hungaria (hu)"
+${LangFileString} lng_hy "Armenia (hy)"
+${LangFileString} lng_id "Indonesia (id)"
+${LangFileString} lng_is "Icelandic (is)"
+${LangFileString} lng_it "Italia (it)"
+${LangFileString} lng_ja "Jepang (ja)"
+${LangFileString} lng_km "Khmer (km)"
+${LangFileString} lng_kn "Kannada (kn)"
+${LangFileString} lng_ko "Korea (ko)"
+${LangFileString} lng_kok "Konkani (kok)"
+${LangFileString} lng_kok@latin "Konkani in Latin script (kok@latin)"
+${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script (ks@aran)"
+${LangFileString} lng_ks@deva "Kashmiri in Devanagari script (ks@deva)"
+${LangFileString} lng_lt "Lituania (lt)"
+${LangFileString} lng_lv "Latvian (lv)"
+${LangFileString} lng_mai "Maithili (mai)"
+${LangFileString} lng_mk "Makedonia (mk)"
+${LangFileString} lng_ml "Malayalam (ml)"
+${LangFileString} lng_mn "Mongolia (mn)"
+${LangFileString} lng_mni "Manipuri (mni)"
+${LangFileString} lng_mni@beng "Manipuri in Bengali script (mni@beng)"
+${LangFileString} lng_mr "Marathi (mr)"
+${LangFileString} lng_nb "Norwegia Bokmål (nb)"
+${LangFileString} lng_ne "Nepal (ne)"
+${LangFileString} lng_nl "Belanda (nl)"
+${LangFileString} lng_nn "Norwegia Ninorski (nn)"
+${LangFileString} lng_or "Odia (or)"
+${LangFileString} lng_pa "Panjabi (pa)"
+${LangFileString} lng_pl "Polandia (pl)"
+${LangFileString} lng_pt "Portugis (pt)"
+${LangFileString} lng_pt_BR "Portugis/Brasil (pt_BR)"
+${LangFileString} lng_ro "Rumania (ro)"
+${LangFileString} lng_ru "Rusia (ru)"
+${LangFileString} lng_rw "Kinyarwanda (rw)"
+${LangFileString} lng_sa "Sanskrit (sa)"
+${LangFileString} lng_sat "Santali (sat)"
+${LangFileString} lng_sat@deva "Santali in Devanagari script (sat@deva)"
+${LangFileString} lng_sd "Sindhi (sd)"
+${LangFileString} lng_sd@deva "Sindhi in Devanagari script (sd@deva)"
+${LangFileString} lng_sk "Slovakia (sk)"
+${LangFileString} lng_sl "Slovenia (sl)"
+${LangFileString} lng_sq "Albania (sq)"
+${LangFileString} lng_sr "Serbia (sr)"
+${LangFileString} lng_sr@latin "Serbia dengan skrip Latin (sr@latin)"
+${LangFileString} lng_sv "Swedia (sv)"
+${LangFileString} lng_ta "Tamil (ta)"
+${LangFileString} lng_te "Telugu (te)"
+${LangFileString} lng_th "Thai (th)"
+${LangFileString} lng_tr "Turki (tr)"
+${LangFileString} lng_uk "Ukraina (uk)"
+${LangFileString} lng_ur "Urdu (ur)"
+${LangFileString} lng_vi "Vietnam (vi)"
+${LangFileString} lng_zh_CN "Cina/Cina (zh_CN)"
+${LangFileString} lng_zh_TW "Cina/Taiwan (zh_TW)"
diff --git a/packaging/win32/languages/Italian.nsh b/packaging/win32/languages/Italian.nsh
index d2fb18a03..9a38f8b58 100644
--- a/packaging/win32/languages/Italian.nsh
+++ b/packaging/win32/languages/Italian.nsh
@@ -44,97 +44,6 @@ ${LangFileString} Dictionaries "Dizionari"
${LangFileString} DictionariesDesc "Dizionari di varie lingue utilizzati per il controllo ortografico in Inkscape"
${LangFileString} Languages "Traduzioni"
${LangFileString} LanguagesDesc "Installa altre traduzioni per Inkscape"
-${LangFileString} lng_am "Aramaico"
-${LangFileString} lng_ar "Arabo"
-${LangFileString} lng_as "Assamese"
-${LangFileString} lng_az "Azerbaigiano"
-${LangFileString} lng_be "Bielorusso"
-${LangFileString} lng_bg "Bulgaro"
-${LangFileString} lng_bn "Bengali"
-${LangFileString} lng_bn_BD "Bengali Bangladesh"
-${LangFileString} lng_br "Bretone"
-${LangFileString} lng_brx "Bodo"
-${LangFileString} lng_ca "Catalano"
-${LangFileString} lng_ca@valencia "Catalano Valenciano"
-${LangFileString} lng_cs "Ceco"
-${LangFileString} lng_da "Danese"
-${LangFileString} lng_de "Tedesco"
-${LangFileString} lng_doi "Dogri"
-${LangFileString} lng_dz "Dzongkha"
-${LangFileString} lng_el "Greco"
-${LangFileString} lng_en "Inglese"
-${LangFileString} lng_en_AU "Inglese Australiano"
-${LangFileString} lng_en_CA "Inglese Canadese"
-${LangFileString} lng_en_GB "Inglese Britannico"
-${LangFileString} lng_en_US@piglatin "Pig Latin"
-${LangFileString} lng_eo "Esperanto"
-${LangFileString} lng_es "Spagnolo"
-${LangFileString} lng_es_MX "Spagnolo Messicano"
-${LangFileString} lng_et "Estone"
-${LangFileString} lng_eu "Basco"
-${LangFileString} lng_fa "Farsi"
-${LangFileString} lng_fi "Finlandese"
-${LangFileString} lng_fr "Francese"
-${LangFileString} lng_ga "Irlandese"
-${LangFileString} lng_gl "Gallese"
-${LangFileString} lng_gu "Gujarati"
-${LangFileString} lng_he "Ebreo"
-${LangFileString} lng_hi "Hindi"
-${LangFileString} lng_hr "Croato"
-${LangFileString} lng_hu "Ungherese"
-${LangFileString} lng_hy "Armenian"
-${LangFileString} lng_id "Indonesiano"
-${LangFileString} lng_is "Icelandic"
-${LangFileString} lng_it "Italiano"
-${LangFileString} lng_ja "Giopponese"
-${LangFileString} lng_km "Khmer"
-${LangFileString} lng_kn "Kannada"
-${LangFileString} lng_ko "Koreano"
-${LangFileString} lng_kok "Konkani"
-${LangFileString} lng_kok@latin "Konkani in Latin script"
-${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script"
-${LangFileString} lng_ks@deva "Kashmiri in Devanagari script"
-${LangFileString} lng_lt "Lituano"
-${LangFileString} lng_lv "Latvian"
-${LangFileString} lng_mai "Maithili"
-${LangFileString} lng_mk "Macedone"
-${LangFileString} lng_ml "Malayalam"
-${LangFileString} lng_mn "Mongolo"
-${LangFileString} lng_mni "Manipuri"
-${LangFileString} lng_mni@beng "Manipuri in Bengali script"
-${LangFileString} lng_mr "Marathi"
-${LangFileString} lng_nb "Norvegese Bokmål"
-${LangFileString} lng_ne "Nepali"
-${LangFileString} lng_nl "Olandese"
-${LangFileString} lng_nn "Norvegese Nynorsk"
-${LangFileString} lng_or "Odia"
-${LangFileString} lng_pa "Panjabi"
-${LangFileString} lng_pl "Polacco"
-${LangFileString} lng_pt "Portoghese"
-${LangFileString} lng_pt_BR "Portoghese Brasiliano"
-${LangFileString} lng_ro "Rumeno"
-${LangFileString} lng_ru "Russo"
-${LangFileString} lng_rw "Kinyarwanda"
-${LangFileString} lng_sa "Sanskrit"
-${LangFileString} lng_sat "Santali"
-${LangFileString} lng_sat@deva "Santali in Devanagari script"
-${LangFileString} lng_sd "Sindhi"
-${LangFileString} lng_sd@deva "Sindhi in Devanagari script"
-${LangFileString} lng_sk "Slovacco"
-${LangFileString} lng_sl "Sloveno"
-${LangFileString} lng_sq "Albanese"
-${LangFileString} lng_sr "Serbo"
-${LangFileString} lng_sr@latin "Serbo in caratteri Latini"
-${LangFileString} lng_sv "Svedese"
-${LangFileString} lng_ta "Tamil"
-${LangFileString} lng_te "Telugu"
-${LangFileString} lng_th "Thai"
-${LangFileString} lng_tr "Turco"
-${LangFileString} lng_uk "Ucraino"
-${LangFileString} lng_ur "Urdu"
-${LangFileString} lng_vi "Vietnamese"
-${LangFileString} lng_zh_CN "Cinese Semplificato"
-${LangFileString} lng_zh_TW "Cinese Tradizionale"
${LangFileString} UInstOpt "Opzioni di Disinstallazione"
${LangFileString} UInstOpt1 "Scegli ulteriori Opzioni"
${LangFileString} PurgePrefs "Mantieni le Impostazioni personali"
diff --git a/packaging/win32/languages/Italian_languageNames.nsh b/packaging/win32/languages/Italian_languageNames.nsh
new file mode 100644
index 000000000..020b60730
--- /dev/null
+++ b/packaging/win32/languages/Italian_languageNames.nsh
@@ -0,0 +1,94 @@
+### Italian (it) translations for language names
+# This file has been automatically created by '_language_lists.py', do not edit it manually!
+# Strings that should be translated are in 'Italian.nsh'
+${LangFileString} lng_am "Amarico (am)"
+${LangFileString} lng_ar "Arabo (ar)"
+${LangFileString} lng_as "Assamese (as)"
+${LangFileString} lng_az "Azero (az)"
+${LangFileString} lng_be "Bielorusso (be)"
+${LangFileString} lng_bg "Bulgaro (bg)"
+${LangFileString} lng_bn "Bengalese (bn)"
+${LangFileString} lng_bn_BD "Bengalese/Bangladesh (bn_BD)"
+${LangFileString} lng_br "Bretone (br)"
+${LangFileString} lng_brx "Bodo (brx)"
+${LangFileString} lng_ca "Catalano (ca)"
+${LangFileString} lng_ca@valencia "Catalano Valenziano (ca@valencia)"
+${LangFileString} lng_cs "Ceco (cs)"
+${LangFileString} lng_da "Danese (da)"
+${LangFileString} lng_de "Tedesco (de)"
+${LangFileString} lng_doi "Dogri (doi)"
+${LangFileString} lng_dz "Dzongkha (dz)"
+${LangFileString} lng_el "Greco (el)"
+${LangFileString} lng_en "Inglese (en)"
+${LangFileString} lng_en_AU "Inglese/Australia (en_AU)"
+${LangFileString} lng_en_CA "Inglese/Canada (en_CA)"
+${LangFileString} lng_en_GB "Inglese/Gran Bretagna (en_GB)"
+${LangFileString} lng_en_US@piglatin "Pig Latin (en_US@piglatin)"
+${LangFileString} lng_eo "Esperanto (eo)"
+${LangFileString} lng_es "Spagnolo (es)"
+${LangFileString} lng_es_MX "Spagnolo/Messicano (es_MX)"
+${LangFileString} lng_et "Estone (et)"
+${LangFileString} lng_eu "Basco (eu)"
+${LangFileString} lng_fa "Persiano (fa)"
+${LangFileString} lng_fi "Finlandese (fi)"
+${LangFileString} lng_fr "Francese (fr)"
+${LangFileString} lng_ga "Irlandese (ga)"
+${LangFileString} lng_gl "Galiziona (gl)"
+${LangFileString} lng_gu "Gujarati (gu)"
+${LangFileString} lng_he "Ebreo (he)"
+${LangFileString} lng_hi "Hindi (hi)"
+${LangFileString} lng_hr "Croato (hr)"
+${LangFileString} lng_hu "Ungherese (hu)"
+${LangFileString} lng_hy "Armeno (hy)"
+${LangFileString} lng_id "Indonesiano (id)"
+${LangFileString} lng_is "Islandese (is)"
+${LangFileString} lng_it "Italiano (it)"
+${LangFileString} lng_ja "Giapponese (ja)"
+${LangFileString} lng_km "Khmer (km)"
+${LangFileString} lng_kn "Kannada (kn)"
+${LangFileString} lng_ko "Koreano (ko)"
+${LangFileString} lng_kok "Konkani (kok)"
+${LangFileString} lng_kok@latin "Konkani in caratteri latini (kok@latin)"
+${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script (ks@aran)"
+${LangFileString} lng_ks@deva "Kashmiri in caratteri devanagari (ks@deva)"
+${LangFileString} lng_lt "Lituano (lt)"
+${LangFileString} lng_lv "Lettone (lv)"
+${LangFileString} lng_mai "Maithili (mai)"
+${LangFileString} lng_mk "Macedone (mk)"
+${LangFileString} lng_ml "Malayalam (ml)"
+${LangFileString} lng_mn "Mongolo (mn)"
+${LangFileString} lng_mni "Manipuri (mni)"
+${LangFileString} lng_mni@beng "Manipuri in caratteri bengalesi (mni@beng)"
+${LangFileString} lng_mr "Marathi (mr)"
+${LangFileString} lng_nb "Norvegese Bokmål (nb)"
+${LangFileString} lng_ne "Nepalese (ne)"
+${LangFileString} lng_nl "Olandese (nl)"
+${LangFileString} lng_nn "Norvegese Nynorsk (nn)"
+${LangFileString} lng_or "Odia (or)"
+${LangFileString} lng_pa "Panjabi (pa)"
+${LangFileString} lng_pl "Polacco (pl)"
+${LangFileString} lng_pt "Portoghese (pt)"
+${LangFileString} lng_pt_BR "Portoghese/Brasiliano (pt_BR)"
+${LangFileString} lng_ro "Rumeno (ro)"
+${LangFileString} lng_ru "Russo (ru)"
+${LangFileString} lng_rw "Kinyarwanda (rw)"
+${LangFileString} lng_sa "Sanscrito (sa)"
+${LangFileString} lng_sat "Santali (sat)"
+${LangFileString} lng_sat@deva "Santali in caratteri devanagari (sat@deva)"
+${LangFileString} lng_sd "Sindhi (sd)"
+${LangFileString} lng_sd@deva "Sindhi in caratteri devanagari (sd@deva)"
+${LangFileString} lng_sk "Slovacco (sk)"
+${LangFileString} lng_sl "Sloveno (sl)"
+${LangFileString} lng_sq "Albanese (sq)"
+${LangFileString} lng_sr "Serbo (sr)"
+${LangFileString} lng_sr@latin "Serbo in caratteri latini (sr@latin)"
+${LangFileString} lng_sv "Svedese (sv)"
+${LangFileString} lng_ta "Tamil (ta)"
+${LangFileString} lng_te "Telugu (te)"
+${LangFileString} lng_th "Tailandese (th)"
+${LangFileString} lng_tr "Turco (tr)"
+${LangFileString} lng_uk "Ucraino (uk)"
+${LangFileString} lng_ur "Urdu (ur)"
+${LangFileString} lng_vi "Vietnamita (vi)"
+${LangFileString} lng_zh_CN "Cinese/Cina (zh_CN)"
+${LangFileString} lng_zh_TW "Cinese/Taiwan (zh_TW)"
diff --git a/packaging/win32/languages/Japanese.nsh b/packaging/win32/languages/Japanese.nsh
index 023654aa2..0c8f28aa8 100644
--- a/packaging/win32/languages/Japanese.nsh
+++ b/packaging/win32/languages/Japanese.nsh
@@ -44,97 +44,6 @@ ${LangFileString} Dictionaries "Dictionaries"
${LangFileString} DictionariesDesc "Dictionaries for some common languages for spell checking in Inkscape"
${LangFileString} Languages "言語"
${LangFileString} LanguagesDesc "Inkscape のさまざまな言語ファイルをインストール"
-${LangFileString} lng_am "アムハラ語"
-${LangFileString} lng_ar "アラビア語"
-${LangFileString} lng_as "Assamese"
-${LangFileString} lng_az "アゼルバイジャン語"
-${LangFileString} lng_be "ベラルーシ語"
-${LangFileString} lng_bg "ブルガリア語"
-${LangFileString} lng_bn "ベンガル語"
-${LangFileString} lng_bn_BD "Bengali Bangladesh"
-${LangFileString} lng_br "ブルトン語"
-${LangFileString} lng_brx "Bodo"
-${LangFileString} lng_ca "カタロニア語"
-${LangFileString} lng_ca@valencia "バレンシア語"
-${LangFileString} lng_cs "チェコ語"
-${LangFileString} lng_da "デンマーク語"
-${LangFileString} lng_de "ドイツ語"
-${LangFileString} lng_doi "Dogri"
-${LangFileString} lng_dz "ゾンカ語"
-${LangFileString} lng_el "ギリシャ語"
-${LangFileString} lng_en "英語"
-${LangFileString} lng_en_AU "英語 (オーストラリア)"
-${LangFileString} lng_en_CA "英語 (カナダ)"
-${LangFileString} lng_en_GB "英語 (英国)"
-${LangFileString} lng_en_US@piglatin "ピッグ・ラテン語"
-${LangFileString} lng_eo "エスペラント語"
-${LangFileString} lng_es "スペイン語"
-${LangFileString} lng_es_MX "スペイン語 (メキシコ)"
-${LangFileString} lng_et "エストニア語"
-${LangFileString} lng_eu "バスク語"
-${LangFileString} lng_fa "ファルシ語"
-${LangFileString} lng_fi "フィンランド語"
-${LangFileString} lng_fr "フランス語"
-${LangFileString} lng_ga "アイルランド語"
-${LangFileString} lng_gl "ガリシア語"
-${LangFileString} lng_gu "Gujarati"
-${LangFileString} lng_he "ヘブライ語"
-${LangFileString} lng_hi "Hindi"
-${LangFileString} lng_hr "クロアチア語"
-${LangFileString} lng_hu "ハンガリー語"
-${LangFileString} lng_hy "Armenian"
-${LangFileString} lng_id "インドネシア語"
-${LangFileString} lng_is "Icelandic"
-${LangFileString} lng_it "イタリア語"
-${LangFileString} lng_ja "日本語"
-${LangFileString} lng_km "クメール語"
-${LangFileString} lng_kn "Kannada"
-${LangFileString} lng_ko "韓国語"
-${LangFileString} lng_kok "Konkani"
-${LangFileString} lng_kok@latin "Konkani in Latin script"
-${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script"
-${LangFileString} lng_ks@deva "Kashmiri in Devanagari script"
-${LangFileString} lng_lt "リトアニア語"
-${LangFileString} lng_lv "Latvian"
-${LangFileString} lng_mai "Maithili"
-${LangFileString} lng_mk "マケドニア語"
-${LangFileString} lng_ml "Malayalam"
-${LangFileString} lng_mn "モンゴル語"
-${LangFileString} lng_mni "Manipuri"
-${LangFileString} lng_mni@beng "Manipuri in Bengali script"
-${LangFileString} lng_mr "Marathi"
-${LangFileString} lng_nb "ノルウェー語ブークモール"
-${LangFileString} lng_ne "ネパール語"
-${LangFileString} lng_nl "オランダ語"
-${LangFileString} lng_nn "ノルウェー語ニーノシュク"
-${LangFileString} lng_or "Odia"
-${LangFileString} lng_pa "パンジャブ語"
-${LangFileString} lng_pl "ポーランド語"
-${LangFileString} lng_pt "ポルトガル語"
-${LangFileString} lng_pt_BR "ポルトガル語 (ブラジル)"
-${LangFileString} lng_ro "ルーマニア語"
-${LangFileString} lng_ru "ロシア語"
-${LangFileString} lng_rw "キニヤルワンダ語"
-${LangFileString} lng_sa "Sanskrit"
-${LangFileString} lng_sat "Santali"
-${LangFileString} lng_sat@deva "Santali in Devanagari script"
-${LangFileString} lng_sd "Sindhi"
-${LangFileString} lng_sd@deva "Sindhi in Devanagari script"
-${LangFileString} lng_sk "スロバキア語"
-${LangFileString} lng_sl "スロベニア語"
-${LangFileString} lng_sq "アルバニア語"
-${LangFileString} lng_sr "セルビア語"
-${LangFileString} lng_sr@latin "セルビア語ラテン文字"
-${LangFileString} lng_sv "スウェーデン語"
-${LangFileString} lng_ta "Tamil"
-${LangFileString} lng_te "テルグ語"
-${LangFileString} lng_th "タイ語"
-${LangFileString} lng_tr "トルコ語"
-${LangFileString} lng_uk "ウクライナ語"
-${LangFileString} lng_ur "Urdu"
-${LangFileString} lng_vi "ベトナム語"
-${LangFileString} lng_zh_CN "中国語 (簡体字)"
-${LangFileString} lng_zh_TW "中国語 (繁体字)"
${LangFileString} UInstOpt "アンインストールオプション"
${LangFileString} UInstOpt1 "必要であれば以下のオプションを選択してください"
${LangFileString} PurgePrefs "個人設定を残す"
diff --git a/packaging/win32/languages/Japanese_languageNames.nsh b/packaging/win32/languages/Japanese_languageNames.nsh
new file mode 100644
index 000000000..109e8d7fc
--- /dev/null
+++ b/packaging/win32/languages/Japanese_languageNames.nsh
@@ -0,0 +1,94 @@
+### Japanese (ja) translations for language names
+# This file has been automatically created by '_language_lists.py', do not edit it manually!
+# Strings that should be translated are in 'Japanese.nsh'
+${LangFileString} lng_am "アムハラ語 (am)"
+${LangFileString} lng_ar "アラビア語 (ar)"
+${LangFileString} lng_as "Assamese (as)"
+${LangFileString} lng_az "アゼルバイジャン語 (az)"
+${LangFileString} lng_be "ベラルーシ語 (be)"
+${LangFileString} lng_bg "ブルガリア語 (bg)"
+${LangFileString} lng_bn "ベンガル語 (bn)"
+${LangFileString} lng_bn_BD "ベンガル語/バングラデシュ (bn_BD)"
+${LangFileString} lng_br "ブルトン語 (br)"
+${LangFileString} lng_brx "Bodo (brx)"
+${LangFileString} lng_ca "カタルーニャ語 (ca)"
+${LangFileString} lng_ca@valencia "バレンシア語 (ca@valencia)"
+${LangFileString} lng_cs "チェコ語 (cs)"
+${LangFileString} lng_da "デンマーク語 (da)"
+${LangFileString} lng_de "ドイツ語 (de)"
+${LangFileString} lng_doi "Dogri (doi)"
+${LangFileString} lng_dz "ゾンカ語 (dz)"
+${LangFileString} lng_el "ギリシャ語 (el)"
+${LangFileString} lng_en "英語 (en)"
+${LangFileString} lng_en_AU "英語/オーストラリア (en_AU)"
+${LangFileString} lng_en_CA "英語/カナダ (en_CA)"
+${LangFileString} lng_en_GB "英語/イギリス (en_GB)"
+${LangFileString} lng_en_US@piglatin "ピッグ・ラテン語 (en_US@piglatin)"
+${LangFileString} lng_eo "エスペラント語 (eo)"
+${LangFileString} lng_es "スペイン語 (es)"
+${LangFileString} lng_es_MX "スペイン語/メキシコ (es_MX)"
+${LangFileString} lng_et "エストニア語 (et)"
+${LangFileString} lng_eu "バスク語 (eu)"
+${LangFileString} lng_fa "ファルシ語 (fa)"
+${LangFileString} lng_fi "フィンランド語 (fi)"
+${LangFileString} lng_fr "フランス語 (fr)"
+${LangFileString} lng_ga "アイルランド語 (ga)"
+${LangFileString} lng_gl "ガリシア語 (gl)"
+${LangFileString} lng_gu "Gujarati (gu)"
+${LangFileString} lng_he "ヘブライ語 (he)"
+${LangFileString} lng_hi "Hindi (hi)"
+${LangFileString} lng_hr "クロアチア語 (hr)"
+${LangFileString} lng_hu "ハンガリー語 (hu)"
+${LangFileString} lng_hy "アルメニア語 (hy)"
+${LangFileString} lng_id "インドネシア語 (id)"
+${LangFileString} lng_is "Icelandic (is)"
+${LangFileString} lng_it "イタリア語 (it)"
+${LangFileString} lng_ja "日本語 (ja)"
+${LangFileString} lng_km "クメール語 (km)"
+${LangFileString} lng_kn "Kannada (kn)"
+${LangFileString} lng_ko "韓国語 (ko)"
+${LangFileString} lng_kok "Konkani (kok)"
+${LangFileString} lng_kok@latin "Konkani in Latin script (kok@latin)"
+${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script (ks@aran)"
+${LangFileString} lng_ks@deva "Kashmiri in Devanagari script (ks@deva)"
+${LangFileString} lng_lt "リトアニア語 (lt)"
+${LangFileString} lng_lv "ラトビア語 (lv)"
+${LangFileString} lng_mai "Maithili (mai)"
+${LangFileString} lng_mk "マケドニア語 (mk)"
+${LangFileString} lng_ml "Malayalam (ml)"
+${LangFileString} lng_mn "モンゴル語 (mn)"
+${LangFileString} lng_mni "Manipuri (mni)"
+${LangFileString} lng_mni@beng "Manipuri in Bengali script (mni@beng)"
+${LangFileString} lng_mr "Marathi (mr)"
+${LangFileString} lng_nb "ノルウェー語ブークモール (nb)"
+${LangFileString} lng_ne "ネパール語 (ne)"
+${LangFileString} lng_nl "オランダ語 (nl)"
+${LangFileString} lng_nn "ノルウェー語ニーノシュク (nn)"
+${LangFileString} lng_or "Odia (or)"
+${LangFileString} lng_pa "パンジャブ語 (pa)"
+${LangFileString} lng_pl "ポーランド語 (pl)"
+${LangFileString} lng_pt "ポルトガル語 (pt)"
+${LangFileString} lng_pt_BR "ポルトガル語/ブラジル (pt_BR)"
+${LangFileString} lng_ro "ルーマニア語 (ro)"
+${LangFileString} lng_ru "ロシア語 (ru)"
+${LangFileString} lng_rw "キニヤルワンダ語 (rw)"
+${LangFileString} lng_sa "Sanskrit (sa)"
+${LangFileString} lng_sat "Santali (sat)"
+${LangFileString} lng_sat@deva "Santali in Devanagari script (sat@deva)"
+${LangFileString} lng_sd "Sindhi (sd)"
+${LangFileString} lng_sd@deva "Sindhi in Devanagari script (sd@deva)"
+${LangFileString} lng_sk "スロバキア語 (sk)"
+${LangFileString} lng_sl "スロベニア語 (sl)"
+${LangFileString} lng_sq "アルバニア語 (sq)"
+${LangFileString} lng_sr "セルビア語 (sr)"
+${LangFileString} lng_sr@latin "セルビア語ラテン文字 (sr@latin)"
+${LangFileString} lng_sv "スウェーデン語 (sv)"
+${LangFileString} lng_ta "Tamil (ta)"
+${LangFileString} lng_te "Telugu (te)"
+${LangFileString} lng_th "タイ語 (th)"
+${LangFileString} lng_tr "トルコ語 (tr)"
+${LangFileString} lng_uk "ウクライナ語 (uk)"
+${LangFileString} lng_ur "Urdu (ur)"
+${LangFileString} lng_vi "ベトナム語 (vi)"
+${LangFileString} lng_zh_CN "中国語/中国 (zh_CN)"
+${LangFileString} lng_zh_TW "中国語/台湾 (zh_TW)"
diff --git a/packaging/win32/languages/Polish.nsh b/packaging/win32/languages/Polish.nsh
index bea4dd958..a0ade97ee 100644
--- a/packaging/win32/languages/Polish.nsh
+++ b/packaging/win32/languages/Polish.nsh
@@ -44,97 +44,6 @@ ${LangFileString} Dictionaries "Dictionaries"
${LangFileString} DictionariesDesc "Dictionaries for some common languages for spell checking in Inkscape"
${LangFileString} Languages "Języki interfejsu"
${LangFileString} LanguagesDesc "Dostępne języki interfejsu dla programu Inkscape"
-${LangFileString} lng_am "Amharski"
-${LangFileString} lng_ar "Arabski"
-${LangFileString} lng_as "Assamese"
-${LangFileString} lng_az "Azerski"
-${LangFileString} lng_be "Białoruski"
-${LangFileString} lng_bg "Bułgarski"
-${LangFileString} lng_bn "Bengalski"
-${LangFileString} lng_bn_BD "Bengali Bangladesh"
-${LangFileString} lng_br "Bretoński"
-${LangFileString} lng_brx "Bodo"
-${LangFileString} lng_ca "Kataloński"
-${LangFileString} lng_ca@valencia "Walencki-Kataloński"
-${LangFileString} lng_cs "Czeski"
-${LangFileString} lng_da "Duński"
-${LangFileString} lng_de "Niemiecki"
-${LangFileString} lng_doi "Dogri"
-${LangFileString} lng_dz "Dzongkha"
-${LangFileString} lng_el "Grecki"
-${LangFileString} lng_en "Angielski"
-${LangFileString} lng_en_AU "Angielski-Australijski"
-${LangFileString} lng_en_CA "Angielski-Kanadyjski"
-${LangFileString} lng_en_GB "Angielski-Brytyjski"
-${LangFileString} lng_en_US@piglatin "Pig Latin"
-${LangFileString} lng_eo "Esperanto"
-${LangFileString} lng_es "Hiszpański"
-${LangFileString} lng_es_MX "Hiszpański-Meksykański"
-${LangFileString} lng_et "Estoński"
-${LangFileString} lng_eu "Baskijski"
-${LangFileString} lng_fa "Farsi"
-${LangFileString} lng_fi "Fiński"
-${LangFileString} lng_fr "Francuski"
-${LangFileString} lng_ga "Irlandzki"
-${LangFileString} lng_gl "Galicyjski"
-${LangFileString} lng_gu "Gujarati"
-${LangFileString} lng_he "Hebrajski"
-${LangFileString} lng_hi "Hindi"
-${LangFileString} lng_hr "Chorwacki"
-${LangFileString} lng_hu "Węgierski"
-${LangFileString} lng_hy "Armenian"
-${LangFileString} lng_id "Indonezyjski"
-${LangFileString} lng_is "Icelandic"
-${LangFileString} lng_it "Włoski"
-${LangFileString} lng_ja "Japoński"
-${LangFileString} lng_km "Kmerski"
-${LangFileString} lng_kn "Kannada"
-${LangFileString} lng_ko "Koreański"
-${LangFileString} lng_kok "Konkani"
-${LangFileString} lng_kok@latin "Konkani in Latin script"
-${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script"
-${LangFileString} lng_ks@deva "Kashmiri in Devanagari script"
-${LangFileString} lng_lt "Litewski"
-${LangFileString} lng_lv "Latvian"
-${LangFileString} lng_mai "Maithili"
-${LangFileString} lng_mk "Macedoński"
-${LangFileString} lng_ml "Malayalam"
-${LangFileString} lng_mn "Mongolski"
-${LangFileString} lng_mni "Manipuri"
-${LangFileString} lng_mni@beng "Manipuri in Bengali script"
-${LangFileString} lng_mr "Marathi"
-${LangFileString} lng_nb "Norweski Bokmĺl"
-${LangFileString} lng_ne "Nepali"
-${LangFileString} lng_nl "Holenderski"
-${LangFileString} lng_nn "Norweski Nynorsk"
-${LangFileString} lng_or "Odia"
-${LangFileString} lng_pa "Pendżabski"
-${LangFileString} lng_pl "Polski"
-${LangFileString} lng_pt "Portugalski"
-${LangFileString} lng_pt_BR "Portugalski-Brazylijski"
-${LangFileString} lng_ro "Rumuński"
-${LangFileString} lng_ru "Rosyjski"
-${LangFileString} lng_rw "Ruanda-Rundi "
-${LangFileString} lng_sa "Sanskrit"
-${LangFileString} lng_sat "Santali"
-${LangFileString} lng_sat@deva "Santali in Devanagari script"
-${LangFileString} lng_sd "Sindhi"
-${LangFileString} lng_sd@deva "Sindhi in Devanagari script"
-${LangFileString} lng_sk "Słowacki"
-${LangFileString} lng_sl "Słoweński"
-${LangFileString} lng_sq "Albański"
-${LangFileString} lng_sr "Serbski"
-${LangFileString} lng_sr@latin "Serbski skrypt łaciński"
-${LangFileString} lng_sv "Szwedzki"
-${LangFileString} lng_ta "Tamil"
-${LangFileString} lng_te "Telugu"
-${LangFileString} lng_th "Tajski"
-${LangFileString} lng_tr "Turecki"
-${LangFileString} lng_uk "Ukraiński"
-${LangFileString} lng_ur "Urdu"
-${LangFileString} lng_vi "Wietnamski"
-${LangFileString} lng_zh_CN "Chiński uproszczony"
-${LangFileString} lng_zh_TW "Chiński tradycyjny"
${LangFileString} UInstOpt "Opcje dezinstalacji"
${LangFileString} UInstOpt1 "Dokonaj wyboru spośród dodatkowych opcji"
${LangFileString} PurgePrefs "Zachowaj ustawienia użytkownika"
diff --git a/packaging/win32/languages/Polish_languageNames.nsh b/packaging/win32/languages/Polish_languageNames.nsh
new file mode 100644
index 000000000..6fcfdc84b
--- /dev/null
+++ b/packaging/win32/languages/Polish_languageNames.nsh
@@ -0,0 +1,94 @@
+### Polish (pl) translations for language names
+# This file has been automatically created by '_language_lists.py', do not edit it manually!
+# Strings that should be translated are in 'Polish.nsh'
+${LangFileString} lng_am "amharski (am)"
+${LangFileString} lng_ar "arabski (ar)"
+${LangFileString} lng_as "Assamese (as)"
+${LangFileString} lng_az "azerski (az)"
+${LangFileString} lng_be "białoruski (ba)"
+${LangFileString} lng_bg "bułgarski (bg)"
+${LangFileString} lng_bn "bengalski (bn)"
+${LangFileString} lng_bn_BD "bengalski/Bangladesz (bn_BD)"
+${LangFileString} lng_br "bretoński (br)"
+${LangFileString} lng_brx "Bodo (brx)"
+${LangFileString} lng_ca "kataloński (ca)"
+${LangFileString} lng_ca@valencia "kataloński waloński (ca@valencia)"
+${LangFileString} lng_cs "czeski (cs)"
+${LangFileString} lng_da "duński (da)"
+${LangFileString} lng_de "niemiecki (de)"
+${LangFileString} lng_doi "Dogri (doi)"
+${LangFileString} lng_dz "dzongkha (dz)"
+${LangFileString} lng_el "grecki (el)"
+${LangFileString} lng_en "angielski (en)"
+${LangFileString} lng_en_AU "angielski/Australia (en-AU)"
+${LangFileString} lng_en_CA "angielski/Kanada (en_CA)"
+${LangFileString} lng_en_GB "angielski/Wlk.Brytania (en_GB)"
+${LangFileString} lng_en_US@piglatin "Pig Latin (en_US@piglatin)"
+${LangFileString} lng_eo "esperanto (eo)"
+${LangFileString} lng_es "hiszpański (es)"
+${LangFileString} lng_es_MX "hiszpański/Meksyk (es_MX)"
+${LangFileString} lng_et "estoński (et)"
+${LangFileString} lng_eu "baskijski (eu)"
+${LangFileString} lng_fa "perski (fa)"
+${LangFileString} lng_fi "fiński (fi)"
+${LangFileString} lng_fr "francuski (fr)"
+${LangFileString} lng_ga "irlandzki (ga)"
+${LangFileString} lng_gl "galicyjski (gl)"
+${LangFileString} lng_gu "Gujarati (gu)"
+${LangFileString} lng_he "hebrajski (he)"
+${LangFileString} lng_hi "Hindi (hi)"
+${LangFileString} lng_hr "chorwacki (hr)"
+${LangFileString} lng_hu "węgierski (hu)"
+${LangFileString} lng_hy "armeński (hy)"
+${LangFileString} lng_id "indonezyjski (id)"
+${LangFileString} lng_is "Icelandic (is)"
+${LangFileString} lng_it "włoski (it)"
+${LangFileString} lng_ja "japoński (ja)"
+${LangFileString} lng_km "kmerski (km)"
+${LangFileString} lng_kn "Kannada (kn)"
+${LangFileString} lng_ko "koreański (ko)"
+${LangFileString} lng_kok "Konkani (kok)"
+${LangFileString} lng_kok@latin "Konkani in Latin script (kok@latin)"
+${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script (ks@aran)"
+${LangFileString} lng_ks@deva "Kashmiri in Devanagari script (ks@deva)"
+${LangFileString} lng_lt "litewski (lt)"
+${LangFileString} lng_lv "łotewski (lv)"
+${LangFileString} lng_mai "Maithili (mai)"
+${LangFileString} lng_mk "macedoński (mk)"
+${LangFileString} lng_ml "Malayalam (ml)"
+${LangFileString} lng_mn "mongolski (mn)"
+${LangFileString} lng_mni "Manipuri (mni)"
+${LangFileString} lng_mni@beng "Manipuri in Bengali script (mni@beng)"
+${LangFileString} lng_mr "Marathi (mr)"
+${LangFileString} lng_nb "norweski Bokmål (nb)"
+${LangFileString} lng_ne "nepalski (ne)"
+${LangFileString} lng_nl "holenderski (nl)"
+${LangFileString} lng_nn "norweski Nynorsk (nn)"
+${LangFileString} lng_or "Odia (or)"
+${LangFileString} lng_pa "pendżabski (pa)"
+${LangFileString} lng_pl "polski (pl)"
+${LangFileString} lng_pt "portugalski (pt)"
+${LangFileString} lng_pt_BR "portugalski/Brazylia (pt_BR)"
+${LangFileString} lng_ro "rumuński (ro)"
+${LangFileString} lng_ru "rosyjski (ru)"
+${LangFileString} lng_rw "ruanda-rundi (rw)"
+${LangFileString} lng_sa "Sanskrit (sa)"
+${LangFileString} lng_sat "Santali (sat)"
+${LangFileString} lng_sat@deva "Santali in Devanagari script (sat@deva)"
+${LangFileString} lng_sd "Sindhi (sd)"
+${LangFileString} lng_sd@deva "Sindhi in Devanagari script (sd@deva)"
+${LangFileString} lng_sk "słowacki (sk)"
+${LangFileString} lng_sl "słoweński (sl)"
+${LangFileString} lng_sq "albański (sq)"
+${LangFileString} lng_sr "serbski (sr)"
+${LangFileString} lng_sr@latin "serbski, skrypt łaciński (sr@latin)"
+${LangFileString} lng_sv "szwedzki (sv)"
+${LangFileString} lng_ta "Tamil (ta)"
+${LangFileString} lng_te "Telugu (te)"
+${LangFileString} lng_th "tajski (th)"
+${LangFileString} lng_tr "turecki (tr)"
+${LangFileString} lng_uk "ukraiński (uk)"
+${LangFileString} lng_ur "Urdu (ur)"
+${LangFileString} lng_vi "wietnamski (vi)"
+${LangFileString} lng_zh_CN "chiński/Chiny (zh_CN)"
+${LangFileString} lng_zh_TW "chiński/Tajwan (zh_TW)"
diff --git a/packaging/win32/languages/Portuguese.nsh b/packaging/win32/languages/Portuguese.nsh
index c17973801..b0f745349 100644
--- a/packaging/win32/languages/Portuguese.nsh
+++ b/packaging/win32/languages/Portuguese.nsh
@@ -44,97 +44,6 @@ ${LangFileString} Dictionaries "Dicionários"
${LangFileString} DictionariesDesc "Dicionários para algumas linguagens comuns para correcção ortográfica no Inkscape"
${LangFileString} Languages "Traduções"
${LangFileString} LanguagesDesc "Instalar várias traduções do Inkscape"
-${LangFileString} lng_am "Amárico"
-${LangFileString} lng_ar "Arábico"
-${LangFileString} lng_as "Assamese"
-${LangFileString} lng_az "Azerbaijano"
-${LangFileString} lng_be "Bielorrusso"
-${LangFileString} lng_bg "Búlgaro"
-${LangFileString} lng_bn "Bengali"
-${LangFileString} lng_bn_BD "Bengali do Bangladeche"
-${LangFileString} lng_br "Bretão"
-${LangFileString} lng_brx "Bodo"
-${LangFileString} lng_ca "Catalão"
-${LangFileString} lng_ca@valencia "Catalão Valenciano"
-${LangFileString} lng_cs "Checo"
-${LangFileString} lng_da "Dinamarquês"
-${LangFileString} lng_de "Alemão"
-${LangFileString} lng_doi "Dogri"
-${LangFileString} lng_dz "Butanês"
-${LangFileString} lng_el "Grego"
-${LangFileString} lng_en "Inglês"
-${LangFileString} lng_en_AU "Inglês Australiano"
-${LangFileString} lng_en_CA "Inglês Canadiano"
-${LangFileString} lng_en_GB "Inglês Britânico"
-${LangFileString} lng_en_US@piglatin "Pig Latin"
-${LangFileString} lng_eo "Esperanto"
-${LangFileString} lng_es "Espanhol"
-${LangFileString} lng_es_MX "Espanhol Mexicano"
-${LangFileString} lng_et "Estónio"
-${LangFileString} lng_eu "Basco"
-${LangFileString} lng_fa "Persa"
-${LangFileString} lng_fi "Finlandês"
-${LangFileString} lng_fr "Francês"
-${LangFileString} lng_ga "Irlandês"
-${LangFileString} lng_gl "Galego"
-${LangFileString} lng_gu "Gujarati"
-${LangFileString} lng_he "Hebraico"
-${LangFileString} lng_hi "Hindi"
-${LangFileString} lng_hr "Croata"
-${LangFileString} lng_hu "Húngaro"
-${LangFileString} lng_hy "Arménio"
-${LangFileString} lng_id "Indonésio"
-${LangFileString} lng_is "Islandês"
-${LangFileString} lng_it "Italiano"
-${LangFileString} lng_ja "Japonês"
-${LangFileString} lng_km "Cambojano"
-${LangFileString} lng_kn "Kannada"
-${LangFileString} lng_ko "Coreano"
-${LangFileString} lng_kok "Konkani"
-${LangFileString} lng_kok@latin "Konkani in Latin script"
-${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script"
-${LangFileString} lng_ks@deva "Kashmiri in Devanagari script"
-${LangFileString} lng_lt "Lituano"
-${LangFileString} lng_lv "Letão"
-${LangFileString} lng_mai "Maithili"
-${LangFileString} lng_mk "Macedónio"
-${LangFileString} lng_ml "Malayalam"
-${LangFileString} lng_mn "Mongol"
-${LangFileString} lng_mni "Manipuri"
-${LangFileString} lng_mni@beng "Manipuri no alfabeto Bengali"
-${LangFileString} lng_mr "Marathi"
-${LangFileString} lng_nb "Bokmål Norueguês"
-${LangFileString} lng_ne "Nepalês"
-${LangFileString} lng_nl "Holandês"
-${LangFileString} lng_nn "Novo Norueguês"
-${LangFileString} lng_or "Odia"
-${LangFileString} lng_pa "Panjabi"
-${LangFileString} lng_pl "Polaco"
-${LangFileString} lng_pt "Português"
-${LangFileString} lng_pt_BR "Português do Brasil"
-${LangFileString} lng_ro "Romeno"
-${LangFileString} lng_ru "Russo"
-${LangFileString} lng_rw "Quiniaruanda"
-${LangFileString} lng_sa "Sanskrit"
-${LangFileString} lng_sat "Santali"
-${LangFileString} lng_sat@deva "Santali in Devanagari script"
-${LangFileString} lng_sd "Sindhi"
-${LangFileString} lng_sd@deva "Sindhi in Devanagari script"
-${LangFileString} lng_sk "Eslovaco"
-${LangFileString} lng_sl "Esloveno"
-${LangFileString} lng_sq "Albanês"
-${LangFileString} lng_sr "Sérvio"
-${LangFileString} lng_sr@latin "Sérvio no alfabeto Latino"
-${LangFileString} lng_sv "Sueco"
-${LangFileString} lng_ta "Tamil"
-${LangFileString} lng_te "Telugo"
-${LangFileString} lng_th "Tailandês"
-${LangFileString} lng_tr "Turco"
-${LangFileString} lng_uk "Ucraniano"
-${LangFileString} lng_ur "Urdu"
-${LangFileString} lng_vi "Vietnamita"
-${LangFileString} lng_zh_CN "Chinês Simplificado"
-${LangFileString} lng_zh_TW "Chinês Traditional"
${LangFileString} UInstOpt "Opções de Desinstalação"
${LangFileString} UInstOpt1 "Por favor faça as suas escolhas para opções adicionais"
${LangFileString} PurgePrefs "Manter Preferências"
diff --git a/packaging/win32/languages/PortugueseBR.nsh b/packaging/win32/languages/PortugueseBR.nsh
index 15a6cc3db..3225743e6 100644
--- a/packaging/win32/languages/PortugueseBR.nsh
+++ b/packaging/win32/languages/PortugueseBR.nsh
@@ -44,97 +44,6 @@ ${LangFileString} Dictionaries "Dictionaries"
${LangFileString} DictionariesDesc "Dictionaries for some common languages for spell checking in Inkscape"
${LangFileString} Languages "Traduções"
${LangFileString} LanguagesDesc "Instala várias traduçoes do Inkscape"
-${LangFileString} lng_am "Aramaico"
-${LangFileString} lng_ar "Árabe"
-${LangFileString} lng_as "Assamese"
-${LangFileString} lng_az "Azerbaijão"
-${LangFileString} lng_be "Bielo-Russo"
-${LangFileString} lng_bg "Búlgaro"
-${LangFileString} lng_bn "Bengali"
-${LangFileString} lng_bn_BD "Bengali Bangladesh"
-${LangFileString} lng_br "Bretão"
-${LangFileString} lng_brx "Bodo"
-${LangFileString} lng_ca "Catalão"
-${LangFileString} lng_ca@valencia "Catalão de Valência"
-${LangFileString} lng_cs "Tcheco"
-${LangFileString} lng_da "Dinamarquês"
-${LangFileString} lng_de "Alemão"
-${LangFileString} lng_doi "Dogri"
-${LangFileString} lng_dz "Dzongkha"
-${LangFileString} lng_el "Grego"
-${LangFileString} lng_en "Inglês"
-${LangFileString} lng_en_AU "Inglês Australiano"
-${LangFileString} lng_en_CA "Inglês Canadense"
-${LangFileString} lng_en_GB "Inglês Britânico"
-${LangFileString} lng_en_US@piglatin "Pig Latin"
-${LangFileString} lng_eo "Esperanto"
-${LangFileString} lng_es "Espanhol"
-${LangFileString} lng_es_MX "Espanhol Mexicano"
-${LangFileString} lng_et "Estônia"
-${LangFileString} lng_eu "Basco"
-${LangFileString} lng_fa "Persa"
-${LangFileString} lng_fi "Finlandês"
-${LangFileString} lng_fr "Francês"
-${LangFileString} lng_ga "Irlandês"
-${LangFileString} lng_gl "Galego"
-${LangFileString} lng_gu "Gujarati"
-${LangFileString} lng_he "Hebreu"
-${LangFileString} lng_hi "Hindi"
-${LangFileString} lng_hr "Croata"
-${LangFileString} lng_hu "Húngaro"
-${LangFileString} lng_hy "Armênio"
-${LangFileString} lng_id "Indonésio"
-${LangFileString} lng_is "Islandês"
-${LangFileString} lng_it "Italiano"
-${LangFileString} lng_ja "Japonês"
-${LangFileString} lng_km "Khmer"
-${LangFileString} lng_kn "Kannada"
-${LangFileString} lng_ko "Coreano"
-${LangFileString} lng_kok "Konkani"
-${LangFileString} lng_kok@latin "Konkani in Latin script"
-${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script"
-${LangFileString} lng_ks@deva "Kashmiri in Devanagari script"
-${LangFileString} lng_lt "Lituano"
-${LangFileString} lng_lv "Latvian"
-${LangFileString} lng_mai "Maithili"
-${LangFileString} lng_mk "Macedônio"
-${LangFileString} lng_ml "Malayalam"
-${LangFileString} lng_mn "Mongol"
-${LangFileString} lng_mni "Manipuri"
-${LangFileString} lng_mni@beng "Manipuri in Bengali script"
-${LangFileString} lng_mr "Marathi"
-${LangFileString} lng_nb "Bokmål Norueguês"
-${LangFileString} lng_ne "Nepalês"
-${LangFileString} lng_nl "Holandês"
-${LangFileString} lng_nn "Nynorsk Norueguês"
-${LangFileString} lng_or "Odia"
-${LangFileString} lng_pa "Punjabi"
-${LangFileString} lng_pl "Polonês"
-${LangFileString} lng_pt "Português"
-${LangFileString} lng_pt_BR "Português do Brasil"
-${LangFileString} lng_ro "Romeno"
-${LangFileString} lng_ru "Russo"
-${LangFileString} lng_rw "Quiniaruanda"
-${LangFileString} lng_sa "Sanskrit"
-${LangFileString} lng_sat "Santali"
-${LangFileString} lng_sat@deva "Santali in Devanagari script"
-${LangFileString} lng_sd "Sindhi"
-${LangFileString} lng_sd@deva "Sindhi in Devanagari script"
-${LangFileString} lng_sk "Eslováquio"
-${LangFileString} lng_sl "Esloveno"
-${LangFileString} lng_sq "Albanês"
-${LangFileString} lng_sr "Sérvio"
-${LangFileString} lng_sr@latin "Sérvio no alfabeto latino"
-${LangFileString} lng_sv "Sueco"
-${LangFileString} lng_ta "Tamil"
-${LangFileString} lng_te "Telugu"
-${LangFileString} lng_th "Tailandês"
-${LangFileString} lng_tr "Turco"
-${LangFileString} lng_uk "Ucraniano"
-${LangFileString} lng_ur "Urdu"
-${LangFileString} lng_vi "Vietnamita"
-${LangFileString} lng_zh_CN "Chinês Simplificado"
-${LangFileString} lng_zh_TW "Chinês Tradicional"
${LangFileString} UInstOpt "Opções de Desinstalação"
${LangFileString} UInstOpt1 "Determine suas opções adicionais"
${LangFileString} PurgePrefs "Manter Preferências pessoais"
diff --git a/packaging/win32/languages/PortugueseBR_languageNames.nsh b/packaging/win32/languages/PortugueseBR_languageNames.nsh
new file mode 100644
index 000000000..98295ce00
--- /dev/null
+++ b/packaging/win32/languages/PortugueseBR_languageNames.nsh
@@ -0,0 +1,94 @@
+### Portuguese/Brazil (pt_BR) translations for language names
+# This file has been automatically created by '_language_lists.py', do not edit it manually!
+# Strings that should be translated are in 'PortugueseBR.nsh'
+${LangFileString} lng_am "Amárico (am)"
+${LangFileString} lng_ar "Árabe (ar)"
+${LangFileString} lng_as "Assamese (as)"
+${LangFileString} lng_az "Azerbaijano (az)"
+${LangFileString} lng_be "Bielo-russo (be)"
+${LangFileString} lng_bg "Búlgaro (bg)"
+${LangFileString} lng_bn "Bengali (bn)"
+${LangFileString} lng_bn_BD "Bengali/Bangladesh (bn_BD)"
+${LangFileString} lng_br "Bretão (br)"
+${LangFileString} lng_brx "Bodo (brx)"
+${LangFileString} lng_ca "Catalã (ca)"
+${LangFileString} lng_ca@valencia "Catalã Valenciano (ca@valencia)"
+${LangFileString} lng_cs "Tcheco (cs)"
+${LangFileString} lng_da "Dinamarquês (da)"
+${LangFileString} lng_de "Alemão (de)"
+${LangFileString} lng_doi "Dogri (doi)"
+${LangFileString} lng_dz "Dzonga (dz)"
+${LangFileString} lng_el "Grego (el)"
+${LangFileString} lng_en "Inglês (en)"
+${LangFileString} lng_en_AU "Inglês/Austrália (en_AU)"
+${LangFileString} lng_en_CA "Inglês/Canadá (en_CA)"
+${LangFileString} lng_en_GB "Inglês/Grã-Bretanha (en_AU)"
+${LangFileString} lng_en_US@piglatin "Pig Latin (en_US@piglatin)"
+${LangFileString} lng_eo "Esperanto (eo)"
+${LangFileString} lng_es "Espanhol (es)"
+${LangFileString} lng_es_MX "Espanhol / México (es_MX)"
+${LangFileString} lng_et "Estoniano (et)"
+${LangFileString} lng_eu "Basco (eu)"
+${LangFileString} lng_fa "Persa (fa)"
+${LangFileString} lng_fi "Finlandês (fi)"
+${LangFileString} lng_fr "Francês (fr)"
+${LangFileString} lng_ga "Irlandês (ga)"
+${LangFileString} lng_gl "Galego (gl)"
+${LangFileString} lng_gu "Gujarati (gu)"
+${LangFileString} lng_he "Hebraico (he)"
+${LangFileString} lng_hi "Hindi (hi)"
+${LangFileString} lng_hr "Croácio (hr)"
+${LangFileString} lng_hu "Húngaro (hu)"
+${LangFileString} lng_hy "Armênio (hy)"
+${LangFileString} lng_id "Indonésio (id)"
+${LangFileString} lng_is "Icelandic (is)"
+${LangFileString} lng_it "Italiano (it)"
+${LangFileString} lng_ja "Japonês (ja)"
+${LangFileString} lng_km "Khmer (km)"
+${LangFileString} lng_kn "Kannada (kn)"
+${LangFileString} lng_ko "Coreano (ko)"
+${LangFileString} lng_kok "Konkani (kok)"
+${LangFileString} lng_kok@latin "Konkani in Latin script (kok@latin)"
+${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script (ks@aran)"
+${LangFileString} lng_ks@deva "Kashmiri in Devanagari script (ks@deva)"
+${LangFileString} lng_lt "Lituano (lt)"
+${LangFileString} lng_lv "Letão (lt)"
+${LangFileString} lng_mai "Maithili (mai)"
+${LangFileString} lng_mk "Macedônio (mk)"
+${LangFileString} lng_ml "Malayalam (ml)"
+${LangFileString} lng_mn "Mongol (mn)"
+${LangFileString} lng_mni "Manipuri (mni)"
+${LangFileString} lng_mni@beng "Manipuri in Bengali script (mni@beng)"
+${LangFileString} lng_mr "Marathi (mr)"
+${LangFileString} lng_nb "Dano-norueguesa (nb)"
+${LangFileString} lng_ne "Nepalês (ne)"
+${LangFileString} lng_nl "Holandês (nl)"
+${LangFileString} lng_nn "Novo norueguês (nn)"
+${LangFileString} lng_or "Odia (or)"
+${LangFileString} lng_pa "Panjabi (pa)"
+${LangFileString} lng_pl "Polonês (pl)"
+${LangFileString} lng_pt "Português (pt)"
+${LangFileString} lng_pt_BR "Português / Brasil (pt_BR)"
+${LangFileString} lng_ro "Romeno (ro)"
+${LangFileString} lng_ru "Russo (ru)"
+${LangFileString} lng_rw "Kinyarwanda (rw)"
+${LangFileString} lng_sa "Sanskrit (sa)"
+${LangFileString} lng_sat "Santali (sat)"
+${LangFileString} lng_sat@deva "Santali in Devanagari script (sat@deva)"
+${LangFileString} lng_sd "Sindhi (sd)"
+${LangFileString} lng_sd@deva "Sindhi in Devanagari script (sd@deva)"
+${LangFileString} lng_sk "Eslovaco (sk)"
+${LangFileString} lng_sl "Esloveno (sl)"
+${LangFileString} lng_sq "Albanês (sq)"
+${LangFileString} lng_sr "Sérvio (sr)"
+${LangFileString} lng_sr@latin "Sérvio latino (sr@latin)"
+${LangFileString} lng_sv "Sueco (sv)"
+${LangFileString} lng_ta "Tamil (ta)"
+${LangFileString} lng_te "Telugu (te)"
+${LangFileString} lng_th "Tailandês (th)"
+${LangFileString} lng_tr "Turco (tr)"
+${LangFileString} lng_uk "Ucraniano (uk)"
+${LangFileString} lng_ur "Urdu (ur)"
+${LangFileString} lng_vi "Vietnamita (vi)"
+${LangFileString} lng_zh_CN "Chinês/China (zh_CN)"
+${LangFileString} lng_zh_TW "Chinês/Taiwan (zh_TW)"
diff --git a/packaging/win32/languages/Portuguese_languageNames.nsh b/packaging/win32/languages/Portuguese_languageNames.nsh
new file mode 100644
index 000000000..fd3c4e921
--- /dev/null
+++ b/packaging/win32/languages/Portuguese_languageNames.nsh
@@ -0,0 +1,94 @@
+### Portuguese (pt) translations for language names
+# This file has been automatically created by '_language_lists.py', do not edit it manually!
+# Strings that should be translated are in 'Portuguese.nsh'
+${LangFileString} lng_am "Amárico (am)"
+${LangFileString} lng_ar "Arábico (ar)"
+${LangFileString} lng_as "Assamês (as)"
+${LangFileString} lng_az "Azerbaijano (az)"
+${LangFileString} lng_be "Bielorrusso (be)"
+${LangFileString} lng_bg "Búlgaro (bg)"
+${LangFileString} lng_bn "Bengali (bn)"
+${LangFileString} lng_bn_BD "Bengali/Bangladeche (bn_BD)"
+${LangFileString} lng_br "Bretão (br)"
+${LangFileString} lng_brx "Bodo (brx)"
+${LangFileString} lng_ca "Catalão (ca)"
+${LangFileString} lng_ca@valencia "Catalão Valenciano (ca@valencia)"
+${LangFileString} lng_cs "Checo (cs)"
+${LangFileString} lng_da "Dinamarquês (da)"
+${LangFileString} lng_de "Alemão (de)"
+${LangFileString} lng_doi "Dogri (doi)"
+${LangFileString} lng_dz "Butanês (dz)"
+${LangFileString} lng_el "Grego (el)"
+${LangFileString} lng_en "Inglês (en)"
+${LangFileString} lng_en_AU "Inglês/Austrália (en_AU)"
+${LangFileString} lng_en_CA "Inglês/Canadá (en_CA)"
+${LangFileString} lng_en_GB "Inglês/Grâ-Bretanha (en_GB)"
+${LangFileString} lng_en_US@piglatin "Pig Latin (en_US@piglatin)"
+${LangFileString} lng_eo "Esperanto (eo)"
+${LangFileString} lng_es "Espanhol (es)"
+${LangFileString} lng_es_MX "Espanhol/México (es_MX)"
+${LangFileString} lng_et "Estónio (et)"
+${LangFileString} lng_eu "Basco (eu)"
+${LangFileString} lng_fa "Persa (fa)"
+${LangFileString} lng_fi "Finlandês (fi)"
+${LangFileString} lng_fr "Francês (fr)"
+${LangFileString} lng_ga "Irlandês (ga)"
+${LangFileString} lng_gl "Galego (gl)"
+${LangFileString} lng_gu "Gujaráti (gu)"
+${LangFileString} lng_he "Hebraico (he)"
+${LangFileString} lng_hi "Hindi (hi)"
+${LangFileString} lng_hr "Croata (hr)"
+${LangFileString} lng_hu "Húngaro (hu)"
+${LangFileString} lng_hy "Arménio (hy)"
+${LangFileString} lng_id "Indonésio (id)"
+${LangFileString} lng_is "Islandês (is)"
+${LangFileString} lng_it "Italiano (it)"
+${LangFileString} lng_ja "Japonês (ja)"
+${LangFileString} lng_km "Cambojano (km)"
+${LangFileString} lng_kn "Canarês (kn)"
+${LangFileString} lng_ko "Coreano (ko)"
+${LangFileString} lng_kok "Concani (kok)"
+${LangFileString} lng_kok@latin "Concani no alfabeto Latino (kok@latin)"
+${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script (ks@aran)"
+${LangFileString} lng_ks@deva "Caxemiriano no alfabeto Devanágari (ks@deva)"
+${LangFileString} lng_lt "Lituano (lt)"
+${LangFileString} lng_lv "Letão (lv)"
+${LangFileString} lng_mai "Maithili (mai)"
+${LangFileString} lng_mk "Macedónio (mk)"
+${LangFileString} lng_ml "Malaiala (ml)"
+${LangFileString} lng_mn "Mongol (mn)"
+${LangFileString} lng_mni "Manipuri (mni)"
+${LangFileString} lng_mni@beng "Manipuri no alfabeto Bengali (mni@beng)"
+${LangFileString} lng_mr "Marata (mr)"
+${LangFileString} lng_nb "Bokmål Norueguês (nb)"
+${LangFileString} lng_ne "Nepalês (ne)"
+${LangFileString} lng_nl "Neerlandês (nl)"
+${LangFileString} lng_nn "Novo Norueguês (nn)"
+${LangFileString} lng_or "Odia (or)"
+${LangFileString} lng_pa "Panjabi (pa)"
+${LangFileString} lng_pl "Polaco (pl)"
+${LangFileString} lng_pt "Português (pt)"
+${LangFileString} lng_pt_BR "Português/Brasil (pt_BR)"
+${LangFileString} lng_ro "Romeno (ro)"
+${LangFileString} lng_ru "Russo (ru)"
+${LangFileString} lng_rw "Quiniaruanda (rw)"
+${LangFileString} lng_sa "Sânscrito (sa)"
+${LangFileString} lng_sat "Santali (sat)"
+${LangFileString} lng_sat@deva "Santali no alfabeto Devanágari (sat@deva)"
+${LangFileString} lng_sd "Sindi (sd)"
+${LangFileString} lng_sd@deva "Sindi no alfabeto Devanágari (sd@deva)"
+${LangFileString} lng_sk "Eslovaco (sk)"
+${LangFileString} lng_sl "Esloveno (sl)"
+${LangFileString} lng_sq "Albanês (sq)"
+${LangFileString} lng_sr "Sérvio (sr)"
+${LangFileString} lng_sr@latin "Sérvio no alfabeto Latino (sr@latin)"
+${LangFileString} lng_sv "Sueco (sv)"
+${LangFileString} lng_ta "Tâmil (ta)"
+${LangFileString} lng_te "Telugo (te)"
+${LangFileString} lng_th "Tailandês (th)"
+${LangFileString} lng_tr "Turco (tr)"
+${LangFileString} lng_uk "Ucraniano (uk)"
+${LangFileString} lng_ur "Urdu (ur)"
+${LangFileString} lng_vi "Vietnamita (vi)"
+${LangFileString} lng_zh_CN "Chinês/China (zh_CN)"
+${LangFileString} lng_zh_TW "Chinese/Taiwan (zh_TW)"
diff --git a/packaging/win32/languages/Romanian.nsh b/packaging/win32/languages/Romanian.nsh
index e69502793..d7b0efd7e 100644
--- a/packaging/win32/languages/Romanian.nsh
+++ b/packaging/win32/languages/Romanian.nsh
@@ -44,97 +44,6 @@ ${LangFileString} Dictionaries "Dictionaries"
${LangFileString} DictionariesDesc "Dictionaries for some common languages for spell checking in Inkscape"
${LangFileString} Languages "Traduceri"
${LangFileString} LanguagesDesc "Instalează diverse traduceri ale interfeţei pentru Inkscape"
-${LangFileString} lng_am "Amharică"
-${LangFileString} lng_ar "Arabă"
-${LangFileString} lng_as "Assamese"
-${LangFileString} lng_az "Azeră"
-${LangFileString} lng_be "Bielorusă"
-${LangFileString} lng_bg "Bulgară"
-${LangFileString} lng_bn "Bengali"
-${LangFileString} lng_bn_BD "Bengali Bangladesh"
-${LangFileString} lng_br "Bretonă"
-${LangFileString} lng_brx "Bodo"
-${LangFileString} lng_ca "Catalană"
-${LangFileString} lng_ca@valencia "Catalană, Valencian"
-${LangFileString} lng_cs "Cehă"
-${LangFileString} lng_da "Daneză"
-${LangFileString} lng_de "Germană"
-${LangFileString} lng_doi "Dogri"
-${LangFileString} lng_dz "Dzongkha"
-${LangFileString} lng_el "Greacă"
-${LangFileString} lng_en "Engleză"
-${LangFileString} lng_en_AU "Engleză australiană"
-${LangFileString} lng_en_CA "Engleză canadiană"
-${LangFileString} lng_en_GB "Engleză britanică"
-${LangFileString} lng_en_US@piglatin "Pig Latin"
-${LangFileString} lng_eo "Esperanto"
-${LangFileString} lng_es "Spaniolă"
-${LangFileString} lng_es_MX "Spaniolă mexicană"
-${LangFileString} lng_et "Estoniană"
-${LangFileString} lng_eu "Bască"
-${LangFileString} lng_fa "Farsi"
-${LangFileString} lng_fi "Finlandeză"
-${LangFileString} lng_fr "Franceză"
-${LangFileString} lng_ga "Irlandeză"
-${LangFileString} lng_gl "Galiciană"
-${LangFileString} lng_gu "Gujarati"
-${LangFileString} lng_he "Ebraică"
-${LangFileString} lng_hi "Hindi"
-${LangFileString} lng_hr "Croată"
-${LangFileString} lng_hu "Maghiară"
-${LangFileString} lng_hy "Armenian"
-${LangFileString} lng_id "Indoneziană"
-${LangFileString} lng_is "Icelandic"
-${LangFileString} lng_it "Italiană"
-${LangFileString} lng_ja "Japoneză"
-${LangFileString} lng_km "Khmeră"
-${LangFileString} lng_kn "Kannada"
-${LangFileString} lng_ko "Koreană"
-${LangFileString} lng_kok "Konkani"
-${LangFileString} lng_kok@latin "Konkani in Latin script"
-${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script"
-${LangFileString} lng_ks@deva "Kashmiri in Devanagari script"
-${LangFileString} lng_lt "Lituaniană"
-${LangFileString} lng_lv "Latvian"
-${LangFileString} lng_mai "Maithili"
-${LangFileString} lng_mk "Macedoneană"
-${LangFileString} lng_ml "Malayalam"
-${LangFileString} lng_mn "Mongolă"
-${LangFileString} lng_mni "Manipuri"
-${LangFileString} lng_mni@beng "Manipuri in Bengali script"
-${LangFileString} lng_mr "Marathi"
-${LangFileString} lng_nb "Norvegiană cărturărească"
-${LangFileString} lng_ne "Nepaleză"
-${LangFileString} lng_nl "Olandeză"
-${LangFileString} lng_nn "Norvegiană nouă"
-${LangFileString} lng_or "Odia"
-${LangFileString} lng_pa "Panjabi"
-${LangFileString} lng_pl "Poloneză"
-${LangFileString} lng_pt "Portugheză"
-${LangFileString} lng_pt_BR "Portugheză braziliană"
-${LangFileString} lng_ro "Romanână"
-${LangFileString} lng_ru "Rusă"
-${LangFileString} lng_rw "Kinyarwanda"
-${LangFileString} lng_sa "Sanskrit"
-${LangFileString} lng_sat "Santali"
-${LangFileString} lng_sat@deva "Santali in Devanagari script"
-${LangFileString} lng_sd "Sindhi"
-${LangFileString} lng_sd@deva "Sindhi in Devanagari script"
-${LangFileString} lng_sk "Slovacă"
-${LangFileString} lng_sl "Slovenă"
-${LangFileString} lng_sq "Albaneză"
-${LangFileString} lng_sr "Sârbă"
-${LangFileString} lng_sr@latin "Sârbă (alfabet Latin)"
-${LangFileString} lng_sv "Suedeză"
-${LangFileString} lng_ta "Tamil"
-${LangFileString} lng_te "Telugu"
-${LangFileString} lng_th "Tailandeză"
-${LangFileString} lng_tr "Turcă"
-${LangFileString} lng_uk "Ucraineană"
-${LangFileString} lng_ur "Urdu"
-${LangFileString} lng_vi "Vietnameză"
-${LangFileString} lng_zh_CN "Chineză simplificată"
-${LangFileString} lng_zh_TW "Chineză tradiţională"
${LangFileString} UInstOpt "Opţiuni de dezinstalare"
${LangFileString} UInstOpt1 "Alegeţi dintre opţiunile adiţionale"
${LangFileString} PurgePrefs "Păstrează preferinţele personale"
diff --git a/packaging/win32/languages/Romanian_languageNames.nsh b/packaging/win32/languages/Romanian_languageNames.nsh
new file mode 100644
index 000000000..09821fb43
--- /dev/null
+++ b/packaging/win32/languages/Romanian_languageNames.nsh
@@ -0,0 +1,94 @@
+### Romanian (ro) translations for language names
+# This file has been automatically created by '_language_lists.py', do not edit it manually!
+# Strings that should be translated are in 'Romanian.nsh'
+${LangFileString} lng_am "Amharic (am)"
+${LangFileString} lng_ar "Arabă (ar)"
+${LangFileString} lng_as "Assamese (as)"
+${LangFileString} lng_az "Azerbaijani (az)"
+${LangFileString} lng_be "Belarusă (be)"
+${LangFileString} lng_bg "Bulgară (bg)"
+${LangFileString} lng_bn "Bengaleză (bn)"
+${LangFileString} lng_bn_BD "Bengaleză/Bangladesh (bn_BD)"
+${LangFileString} lng_br "Bretonă (br)"
+${LangFileString} lng_brx "Bodo (brx)"
+${LangFileString} lng_ca "Catalană (ca)"
+${LangFileString} lng_ca@valencia "Catalană Valencia (ca@valencia)"
+${LangFileString} lng_cs "Cehă (cs)"
+${LangFileString} lng_da "Daneză (da)"
+${LangFileString} lng_de "Germană (de)"
+${LangFileString} lng_doi "Dogri (doi)"
+${LangFileString} lng_dz "Dzongkha (dz)"
+${LangFileString} lng_el "Greacă (el)"
+${LangFileString} lng_en "Engleză (en)"
+${LangFileString} lng_en_AU "Engleză/Australia (en_AU)"
+${LangFileString} lng_en_CA "Engleză/Canada (en_CA)"
+${LangFileString} lng_en_GB "Engleză/Marea Britanie (en_GB)"
+${LangFileString} lng_en_US@piglatin "Pig Latin (en_US@piglatin)"
+${LangFileString} lng_eo "Esperanto (eo)"
+${LangFileString} lng_es "Spaniolă (es)"
+${LangFileString} lng_es_MX "Spaniolă/Mexic (es_MX)"
+${LangFileString} lng_et "Estoniană (et)"
+${LangFileString} lng_eu "Bască (eu)"
+${LangFileString} lng_fa "Farsi (fa)"
+${LangFileString} lng_fi "Finlandeză (fi)"
+${LangFileString} lng_fr "Franceză (fr)"
+${LangFileString} lng_ga "Irlandeză (ga)"
+${LangFileString} lng_gl "Galeză (gl)"
+${LangFileString} lng_gu "Gujarati (gu)"
+${LangFileString} lng_he "Ebraică (he)"
+${LangFileString} lng_hi "Hindi (hi)"
+${LangFileString} lng_hr "Croată (hr)"
+${LangFileString} lng_hu "Maghiară (hu)"
+${LangFileString} lng_hy "Armenă (hy)"
+${LangFileString} lng_id "Indoneză (id)"
+${LangFileString} lng_is "Icelandic (is)"
+${LangFileString} lng_it "Italiană (it)"
+${LangFileString} lng_ja "Japoneză (ja)"
+${LangFileString} lng_km "Khmer (km)"
+${LangFileString} lng_kn "Kannada (kn)"
+${LangFileString} lng_ko "Koreană (ko)"
+${LangFileString} lng_kok "Konkani (kok)"
+${LangFileString} lng_kok@latin "Konkani in Latin script (kok@latin)"
+${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script (ks@aran)"
+${LangFileString} lng_ks@deva "Kashmiri in Devanagari script (ks@deva)"
+${LangFileString} lng_lt "Lituaniană (lt)"
+${LangFileString} lng_lv "Letonă (lv)"
+${LangFileString} lng_mai "Maithili (mai)"
+${LangFileString} lng_mk "Macedoneană (mk)"
+${LangFileString} lng_ml "Malayalam (ml)"
+${LangFileString} lng_mn "Mongolă (mn)"
+${LangFileString} lng_mni "Manipuri (mni)"
+${LangFileString} lng_mni@beng "Manipuri in Bengali script (mni@beng)"
+${LangFileString} lng_mr "Marathi (mr)"
+${LangFileString} lng_nb "Norwegiană Bokmål (nb)"
+${LangFileString} lng_ne "Nepaleză (ne)"
+${LangFileString} lng_nl "Olandeză (nl)"
+${LangFileString} lng_nn "Norwegiană Nynorsk (nn)"
+${LangFileString} lng_or "Odia (or)"
+${LangFileString} lng_pa "Panjabi (pa)"
+${LangFileString} lng_pl "Poloneză (pl)"
+${LangFileString} lng_pt "Portugheză (pt)"
+${LangFileString} lng_pt_BR "Portugheză/Brazilia (pt_BR)"
+${LangFileString} lng_ro "Română (ro)"
+${LangFileString} lng_ru "Rusă (ru)"
+${LangFileString} lng_rw "Kinyarwanda (rw)"
+${LangFileString} lng_sa "Sanskrit (sa)"
+${LangFileString} lng_sat "Santali (sat)"
+${LangFileString} lng_sat@deva "Santali in Devanagari script (sat@deva)"
+${LangFileString} lng_sd "Sindhi (sd)"
+${LangFileString} lng_sd@deva "Sindhi in Devanagari script (sd@deva)"
+${LangFileString} lng_sk "Slovacă (sk)"
+${LangFileString} lng_sl "Slovenă (sl)"
+${LangFileString} lng_sq "Albaniană (sq)"
+${LangFileString} lng_sr "Sârbă (sr)"
+${LangFileString} lng_sr@latin "Sârbă în alfabet latin (sr@latin)"
+${LangFileString} lng_sv "Suedeză (sv)"
+${LangFileString} lng_ta "Tamil (ta)"
+${LangFileString} lng_te "Telugu (te)"
+${LangFileString} lng_th "Tailandeză (th)"
+${LangFileString} lng_tr "Turcă (tr)"
+${LangFileString} lng_uk "Ucraineană (uk)"
+${LangFileString} lng_ur "Urdu (ur)"
+${LangFileString} lng_vi "Vietnameză (vi)"
+${LangFileString} lng_zh_CN "Chineză/China (zh_CN)"
+${LangFileString} lng_zh_TW "Chineză/Taiwan (zh_TW)"
diff --git a/packaging/win32/languages/Russian.nsh b/packaging/win32/languages/Russian.nsh
index 16d5f0d4f..539e95828 100644
--- a/packaging/win32/languages/Russian.nsh
+++ b/packaging/win32/languages/Russian.nsh
@@ -44,97 +44,6 @@ ${LangFileString} Dictionaries "Словари"
${LangFileString} DictionariesDesc "Словари для проверки правописания в текстах на некоторых распространенных языках"
${LangFileString} Languages "Переводы"
${LangFileString} LanguagesDesc "Установка переводов Inkscape на разные языки"
-${LangFileString} lng_am "Амхарский (Амаринья)"
-${LangFileString} lng_ar "Арабский"
-${LangFileString} lng_as "Ассамский"
-${LangFileString} lng_az "Азербайджанский"
-${LangFileString} lng_be "Белорусский"
-${LangFileString} lng_bg "Болгарский"
-${LangFileString} lng_bn "Бенгальский"
-${LangFileString} lng_bn_BD "Бенгальский (Бангладеш)"
-${LangFileString} lng_br "Бретонский"
-${LangFileString} lng_brx "Бодо"
-${LangFileString} lng_ca "Каталанский"
-${LangFileString} lng_ca@valencia "Каталонский (Валенсия)"
-${LangFileString} lng_cs "Чешский"
-${LangFileString} lng_da "Датский"
-${LangFileString} lng_de "Немецкий"
-${LangFileString} lng_doi "Догри"
-${LangFileString} lng_dz "Дзонг-кэ"
-${LangFileString} lng_el "Греческий"
-${LangFileString} lng_en "Английский"
-${LangFileString} lng_en_AU "Английский (Австралия)"
-${LangFileString} lng_en_CA "Английский (Канада)"
-${LangFileString} lng_en_GB "Английский (Великобритания)"
-${LangFileString} lng_en_US@piglatin "Поросячья латынь"
-${LangFileString} lng_eo "Эсперанто"
-${LangFileString} lng_es "Испанский"
-${LangFileString} lng_es_MX "Испанский (Мексика)"
-${LangFileString} lng_et "Эстонский"
-${LangFileString} lng_eu "Баскский"
-${LangFileString} lng_fa "Фарси"
-${LangFileString} lng_fi "Финский"
-${LangFileString} lng_fr "Французский"
-${LangFileString} lng_ga "Ирландский"
-${LangFileString} lng_gl "Галисийский"
-${LangFileString} lng_gu "Гуджарати"
-${LangFileString} lng_he "Иврит"
-${LangFileString} lng_hi "Хинди"
-${LangFileString} lng_hr "Хорватский"
-${LangFileString} lng_hu "Венгерский"
-${LangFileString} lng_hy "Армянский"
-${LangFileString} lng_id "Индонезийский"
-${LangFileString} lng_is "Исландский"
-${LangFileString} lng_it "Итальянский"
-${LangFileString} lng_ja "Японский"
-${LangFileString} lng_km "Кхмерский"
-${LangFileString} lng_kn "Каннада"
-${LangFileString} lng_ko "Корейский"
-${LangFileString} lng_kok "Конкани"
-${LangFileString} lng_kok@latin "Конкани на латинице"
-${LangFileString} lng_ks@aran "Кашмирский в арабском письме"
-${LangFileString} lng_ks@deva "Кашмирский в письме деванагари"
-${LangFileString} lng_lt "Литовский"
-${LangFileString} lng_lv "Латвийский"
-${LangFileString} lng_mai "Майтхили"
-${LangFileString} lng_mk "Македонский"
-${LangFileString} lng_ml "Малаялам"
-${LangFileString} lng_mn "Монгольский"
-${LangFileString} lng_mni "Манипури"
-${LangFileString} lng_mni@beng "Манипури в бенгальском письме"
-${LangFileString} lng_mr "Маратхи"
-${LangFileString} lng_nb "Норвежский (букмол)"
-${LangFileString} lng_ne "Непальский"
-${LangFileString} lng_nl "Датский"
-${LangFileString} lng_nn "Норвежский (нюнорск)"
-${LangFileString} lng_or "Ория"
-${LangFileString} lng_pa "Пенджабский"
-${LangFileString} lng_pl "Польский"
-${LangFileString} lng_pt "Португальский"
-${LangFileString} lng_pt_BR "Португальский (Бразилия)"
-${LangFileString} lng_ro "Румынский"
-${LangFileString} lng_ru "Русский"
-${LangFileString} lng_rw "Киньяруанда"
-${LangFileString} lng_sa "Санскрит"
-${LangFileString} lng_sat "Сантали"
-${LangFileString} lng_sat@deva "Сантали в письме деванагари"
-${LangFileString} lng_sd "Синдхи"
-${LangFileString} lng_sd@deva "Синдхи в письме деванагари"
-${LangFileString} lng_sk "Словацкий"
-${LangFileString} lng_sl "Словенский"
-${LangFileString} lng_sq "Албанский"
-${LangFileString} lng_sr "Сербский"
-${LangFileString} lng_sr@latin "Сербский (латиница)"
-${LangFileString} lng_sv "Шведский"
-${LangFileString} lng_ta "Тамильский"
-${LangFileString} lng_te "Телугу"
-${LangFileString} lng_th "Тайский"
-${LangFileString} lng_tr "Турецкий"
-${LangFileString} lng_uk "Украинский"
-${LangFileString} lng_ur "Урду"
-${LangFileString} lng_vi "Вьетнамский"
-${LangFileString} lng_zh_CN "Китайский упрощённый"
-${LangFileString} lng_zh_TW "Китайский традиционный"
${LangFileString} UInstOpt "Параметры удаления программы из системы"
${LangFileString} UInstOpt1 "Убедитесь в том, что указали дополнительные параметры"
${LangFileString} PurgePrefs "Сохранить личные настройки"
diff --git a/packaging/win32/languages/Russian_languageNames.nsh b/packaging/win32/languages/Russian_languageNames.nsh
new file mode 100644
index 000000000..195c5de47
--- /dev/null
+++ b/packaging/win32/languages/Russian_languageNames.nsh
@@ -0,0 +1,94 @@
+### Russian (ru) translations for language names
+# This file has been automatically created by '_language_lists.py', do not edit it manually!
+# Strings that should be translated are in 'Russian.nsh'
+${LangFileString} lng_am "Амхарский (am)"
+${LangFileString} lng_ar "Арабский (ar)"
+${LangFileString} lng_as "Assamese (as)"
+${LangFileString} lng_az "Азербайджанский (az)"
+${LangFileString} lng_be "Белорусский (be)"
+${LangFileString} lng_bg "Болгарский (bg)"
+${LangFileString} lng_bn "Бенгальский (bn)"
+${LangFileString} lng_bn_BD "Bengali/Bangladesh (bn_BD)"
+${LangFileString} lng_br "Бретонский (br)"
+${LangFileString} lng_brx "Bodo (brx)"
+${LangFileString} lng_ca "Каталонский (ca)"
+${LangFileString} lng_ca@valencia "Каталонский, Валенсия (ca@valencia)"
+${LangFileString} lng_cs "Чешский (cs)"
+${LangFileString} lng_da "Датский (da)"
+${LangFileString} lng_de "Немецкий (de)"
+${LangFileString} lng_doi "Dogri (doi)"
+${LangFileString} lng_dz "Дзонг-кэ (dz)"
+${LangFileString} lng_el "Греческий (el)"
+${LangFileString} lng_en "Английский (en)"
+${LangFileString} lng_en_AU "Английский, Австралия (en_AU)"
+${LangFileString} lng_en_CA "Английский, Канада (en_CA)"
+${LangFileString} lng_en_GB "Английский, Великобритания (en_GB)"
+${LangFileString} lng_en_US@piglatin "Поросячья латынь (en_US@piglatin)"
+${LangFileString} lng_eo "Эсперанто (eo)"
+${LangFileString} lng_es "Испанский (es)"
+${LangFileString} lng_es_MX "Испанский, Мексика (es_MX)"
+${LangFileString} lng_et "Эстонский (et)"
+${LangFileString} lng_eu "Баскский (eu)"
+${LangFileString} lng_fa "Фарси (fa)"
+${LangFileString} lng_fi "Финский (fi)"
+${LangFileString} lng_fr "Французский (fr)"
+${LangFileString} lng_ga "Ирландский (ga)"
+${LangFileString} lng_gl "Галицийский (gl)"
+${LangFileString} lng_gu "Gujarati (gu)"
+${LangFileString} lng_he "Иврит (he)"
+${LangFileString} lng_hi "Хинди (hi)"
+${LangFileString} lng_hr "Хорватский (hr)"
+${LangFileString} lng_hu "Венгерский (hu)"
+${LangFileString} lng_hy "Армянский (hy)"
+${LangFileString} lng_id "Индонезийский (id)"
+${LangFileString} lng_is "Icelandic (is)"
+${LangFileString} lng_it "Итальянский (it)"
+${LangFileString} lng_ja "Японский (ja)"
+${LangFileString} lng_km "Кхмерский (km)"
+${LangFileString} lng_kn "Kannada (kn)"
+${LangFileString} lng_ko "Корейский (ko)"
+${LangFileString} lng_kok "Konkani (kok)"
+${LangFileString} lng_kok@latin "Konkani in Latin script (kok@latin)"
+${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script (ks@aran)"
+${LangFileString} lng_ks@deva "Kashmiri in Devanagari script (ks@deva)"
+${LangFileString} lng_lt "Литовский (lt)"
+${LangFileString} lng_lv "Latvian (lv)"
+${LangFileString} lng_mai "Maithili (mai)"
+${LangFileString} lng_mk "Македонский (mk)"
+${LangFileString} lng_ml "Malayalam (ml)"
+${LangFileString} lng_mn "Монгольский (mn)"
+${LangFileString} lng_mni "Manipuri (mni)"
+${LangFileString} lng_mni@beng "Manipuri in Bengali script (mni@beng)"
+${LangFileString} lng_mr "Marathi (mr)"
+${LangFileString} lng_nb "Норвежский, бокмол (nb)"
+${LangFileString} lng_ne "Непальский (ne)"
+${LangFileString} lng_nl "Голландский (nl)"
+${LangFileString} lng_nn "Норвежский, нюнорск (nn)"
+${LangFileString} lng_or "Odia (or)"
+${LangFileString} lng_pa "Пенджаби (pa)"
+${LangFileString} lng_pl "Польский (pl)"
+${LangFileString} lng_pt "Португальский (pt)"
+${LangFileString} lng_pt_BR "Португальский, Бразилия (pt_BR)"
+${LangFileString} lng_ro "Румынский (ro)"
+${LangFileString} lng_ru "Русский (ru)"
+${LangFileString} lng_rw "Руанда (rw)"
+${LangFileString} lng_sa "Sanskrit (sa)"
+${LangFileString} lng_sat "Santali (sat)"
+${LangFileString} lng_sat@deva "Santali in Devanagari script (sat@deva)"
+${LangFileString} lng_sd "Sindhi (sd)"
+${LangFileString} lng_sd@deva "Sindhi in Devanagari script (sd@deva)"
+${LangFileString} lng_sk "Словацкий (sk)"
+${LangFileString} lng_sl "Словенский (sl)"
+${LangFileString} lng_sq "Албанский (sq)"
+${LangFileString} lng_sr "Сербский, кириллица (sr)"
+${LangFileString} lng_sr@latin "Сербский, латиница (sr@latin)"
+${LangFileString} lng_sv "Шведский (sv)"
+${LangFileString} lng_ta "Tamil (ta)"
+${LangFileString} lng_te "Телугу (te)"
+${LangFileString} lng_th "Тайский (th)"
+${LangFileString} lng_tr "Турецкий (tr)"
+${LangFileString} lng_uk "Украинский (uk)"
+${LangFileString} lng_ur "Урду (ur)"
+${LangFileString} lng_vi "Вьетнамский (vi)"
+${LangFileString} lng_zh_CN "Китайский, Китай (zh_CN)"
+${LangFileString} lng_zh_TW "Китайский, Тайвань (zh_TW)"
diff --git a/packaging/win32/languages/SimpChinese.nsh b/packaging/win32/languages/SimpChinese.nsh
index 79105b76c..48a2a3a35 100644
--- a/packaging/win32/languages/SimpChinese.nsh
+++ b/packaging/win32/languages/SimpChinese.nsh
@@ -44,97 +44,6 @@ ${LangFileString} Dictionaries "Dictionaries"
${LangFileString} DictionariesDesc "Dictionaries for some common languages for spell checking in Inkscape"
${LangFileString} Languages "语言"
${LangFileString} LanguagesDesc "安装 Inkscape 各种语言翻译"
-${LangFileString} lng_am "am 阿比西尼亚语"
-${LangFileString} lng_ar "ar 阿拉伯语"
-${LangFileString} lng_as "Assamese"
-${LangFileString} lng_az "az 亚塞拜然语"
-${LangFileString} lng_be "be 白俄罗斯语"
-${LangFileString} lng_bg "bg 保加利亚语"
-${LangFileString} lng_bn "bn 孟加拉语"
-${LangFileString} lng_bn_BD "Bengali Bangladesh"
-${LangFileString} lng_br "br 不列塔尼语"
-${LangFileString} lng_brx "Bodo"
-${LangFileString} lng_ca "ca 加泰隆语"
-${LangFileString} lng_ca@valencia "ca@valencia 瓦伦西亚语 加泰罗尼亚语"
-${LangFileString} lng_cs "cs 捷克语"
-${LangFileString} lng_da "da 丹麦语"
-${LangFileString} lng_de "de 德语"
-${LangFileString} lng_doi "Dogri"
-${LangFileString} lng_dz "dz 宗卡语"
-${LangFileString} lng_el "el 希腊语"
-${LangFileString} lng_en "en 英语"
-${LangFileString} lng_en_AU "en_AU 英语(澳大利亚)"
-${LangFileString} lng_en_CA "en_CA 英语(加拿大)"
-${LangFileString} lng_en_GB "en_GB 英语(英国)"
-${LangFileString} lng_en_US@piglatin "en_US@piglatin 猪拉丁语"
-${LangFileString} lng_eo "eo 世界语"
-${LangFileString} lng_es "es 西班牙文"
-${LangFileString} lng_es_MX "es_MX 西班牙语(墨西哥)"
-${LangFileString} lng_et "et 爱沙尼亚语"
-${LangFileString} lng_eu "eu 巴斯克语"
-${LangFileString} lng_fa "Farsi"
-${LangFileString} lng_fi "fi 芬兰语"
-${LangFileString} lng_fr "fr 法文"
-${LangFileString} lng_ga "ga 爱尔兰语"
-${LangFileString} lng_gl "gl 加里西亚语"
-${LangFileString} lng_gu "Gujarati"
-${LangFileString} lng_he "he 希伯來语"
-${LangFileString} lng_hi "Hindi"
-${LangFileString} lng_hr "hr 克罗埃西亚语"
-${LangFileString} lng_hu "hu 匈牙利语"
-${LangFileString} lng_hy "Armenian"
-${LangFileString} lng_id "id 印尼语"
-${LangFileString} lng_is "Icelandic"
-${LangFileString} lng_it "it 意大利文"
-${LangFileString} lng_ja "ja 日文"
-${LangFileString} lng_km "km 高棉语"
-${LangFileString} lng_kn "Kannada"
-${LangFileString} lng_ko "ko 韩文"
-${LangFileString} lng_kok "Konkani"
-${LangFileString} lng_kok@latin "Konkani in Latin script"
-${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script"
-${LangFileString} lng_ks@deva "Kashmiri in Devanagari script"
-${LangFileString} lng_lt "lt 立陶宛语"
-${LangFileString} lng_lv "Latvian"
-${LangFileString} lng_mai "Maithili"
-${LangFileString} lng_mk "mk 马其顿语"
-${LangFileString} lng_ml "Malayalam"
-${LangFileString} lng_mn "mn 蒙古语"
-${LangFileString} lng_mni "Manipuri"
-${LangFileString} lng_mni@beng "Manipuri in Bengali script"
-${LangFileString} lng_mr "Marathi"
-${LangFileString} lng_nb "nb 挪威 Bokmal 语"
-${LangFileString} lng_ne "ne 尼泊尔语"
-${LangFileString} lng_nl "nl 荷兰语"
-${LangFileString} lng_nn "nn 挪威 Nynorsk 语"
-${LangFileString} lng_or "Odia"
-${LangFileString} lng_pa "pa 旁遮普语"
-${LangFileString} lng_pl "po 波兰语"
-${LangFileString} lng_pt "pt 葡萄牙文"
-${LangFileString} lng_pt_BR "pt_BR 葡萄牙文(巴西)"
-${LangFileString} lng_ro "ro 罗马尼亚语"
-${LangFileString} lng_ru "ru 俄文"
-${LangFileString} lng_rw "rw 金亚卢安达语"
-${LangFileString} lng_sa "Sanskrit"
-${LangFileString} lng_sat "Santali"
-${LangFileString} lng_sat@deva "Santali in Devanagari script"
-${LangFileString} lng_sd "Sindhi"
-${LangFileString} lng_sd@deva "Sindhi in Devanagari script"
-${LangFileString} lng_sk "sk 斯洛法克语"
-${LangFileString} lng_sl "sl 斯洛凡尼亚语"
-${LangFileString} lng_sq "sq 阿尔巴尼亚语"
-${LangFileString} lng_sr "sr 赛尔维亚语"
-${LangFileString} lng_sr@latin "sr@latin 塞尔维亚文-拉丁"
-${LangFileString} lng_sv "sv 瑞典语"
-${LangFileString} lng_ta "Tamil"
-${LangFileString} lng_te "Telugu"
-${LangFileString} lng_th "th 泰语"
-${LangFileString} lng_tr "tr 土耳其语"
-${LangFileString} lng_uk "uk 乌克兰语"
-${LangFileString} lng_ur "Urdu"
-${LangFileString} lng_vi "vi 越南話"
-${LangFileString} lng_zh_CN "zh_CH 简体中文"
-${LangFileString} lng_zh_TW "zh_TW 繁体中文"
${LangFileString} UInstOpt "反安装选项"
${LangFileString} UInstOpt1 "请选择其他选项"
${LangFileString} PurgePrefs "保留个人偏好设定"
diff --git a/packaging/win32/languages/SimpChinese_languageNames.nsh b/packaging/win32/languages/SimpChinese_languageNames.nsh
new file mode 100644
index 000000000..a75313800
--- /dev/null
+++ b/packaging/win32/languages/SimpChinese_languageNames.nsh
@@ -0,0 +1,94 @@
+### Chinese/China (zh_CN) translations for language names
+# This file has been automatically created by '_language_lists.py', do not edit it manually!
+# Strings that should be translated are in 'SimpChinese.nsh'
+${LangFileString} lng_am "阿姆哈拉语(am)"
+${LangFileString} lng_ar "阿拉伯语(ar)"
+${LangFileString} lng_as "阿萨姆语(as)"
+${LangFileString} lng_az "阿塞拜疆语(az)"
+${LangFileString} lng_be "白俄罗斯语(be)"
+${LangFileString} lng_bg "保加利亚语(bg)"
+${LangFileString} lng_bn "孟加拉语(bn)"
+${LangFileString} lng_bn_BD "孟加拉语/西孟加拉 (bn_BD)"
+${LangFileString} lng_br "布利托尼语(br)"
+${LangFileString} lng_brx "博多语(brx)"
+${LangFileString} lng_ca "加泰罗尼亚语(ca)"
+${LangFileString} lng_ca@valencia "瓦伦西亚加泰罗尼亚语(ca@valencia)"
+${LangFileString} lng_cs "捷克语(cs)"
+${LangFileString} lng_da "丹麦语(da)"
+${LangFileString} lng_de "德语(de)"
+${LangFileString} lng_doi "多格拉语(doi)"
+${LangFileString} lng_dz "不丹语(dz)"
+${LangFileString} lng_el "希腊语(el)"
+${LangFileString} lng_en "英语(en)"
+${LangFileString} lng_en_AU "英语/澳大利亚(en_AU)"
+${LangFileString} lng_en_CA "英语/加拿大(en_CA)"
+${LangFileString} lng_en_GB "英语/英国(en_GB)"
+${LangFileString} lng_en_US@piglatin "大拉丁语(en_US@piglatin)"
+${LangFileString} lng_eo "世界语(eo)"
+${LangFileString} lng_es "西班牙语(es)"
+${LangFileString} lng_es_MX "西班牙语/墨西哥(es_MX)"
+${LangFileString} lng_et "爱沙尼亚语(et)"
+${LangFileString} lng_eu "巴斯克语(eu)"
+${LangFileString} lng_fa "波斯语(fa)"
+${LangFileString} lng_fi "芬兰语(fi)"
+${LangFileString} lng_fr "法语(fr)"
+${LangFileString} lng_ga "爱尔兰语(ga)"
+${LangFileString} lng_gl "加利西亚语(gl)"
+${LangFileString} lng_gu "古吉拉特语(gu)"
+${LangFileString} lng_he "希伯来语(he)"
+${LangFileString} lng_hi "印地语(hi)"
+${LangFileString} lng_hr "克罗地亚语(hr)"
+${LangFileString} lng_hu "匈牙利语(hu)"
+${LangFileString} lng_hy "亚美尼亚语(hy)"
+${LangFileString} lng_id "印度尼西亚语(id)"
+${LangFileString} lng_is "冰岛语(is)"
+${LangFileString} lng_it "意大利语(it)"
+${LangFileString} lng_ja "日语(ja)"
+${LangFileString} lng_km "柬埔寨语(km)"
+${LangFileString} lng_kn "坎那达文 (kn)"
+${LangFileString} lng_ko "韩语(ko)"
+${LangFileString} lng_kok "孔卡尼语(kok)"
+${LangFileString} lng_kok@latin "孔卡尼语,拉丁字书写(sr@latin)"
+${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script (ks@aran)"
+${LangFileString} lng_ks@deva "Kashmiri in Devanagari script (ks@deva)"
+${LangFileString} lng_lt "立陶宛语(lt)"
+${LangFileString} lng_lv "拉脱维亚语(lv)"
+${LangFileString} lng_mai "迈蒂利语(mai)"
+${LangFileString} lng_mk "马其顿语(mk)"
+${LangFileString} lng_ml "马拉雅拉姆语(ml)"
+${LangFileString} lng_mn "蒙古语(mn)"
+${LangFileString} lng_mni "曼尼普尔语(mni)"
+${LangFileString} lng_mni@beng "Manipuri in Bengali script (mni@beng)"
+${LangFileString} lng_mr "马拉地语(mr)"
+${LangFileString} lng_nb "挪威巴克摩语(nb)"
+${LangFileString} lng_ne "尼泊尔语(ne)"
+${LangFileString} lng_nl "荷兰语(nl)"
+${LangFileString} lng_nn "挪威尼诺斯克语(nn)"
+${LangFileString} lng_or "奥里亚语(or)"
+${LangFileString} lng_pa "潘贾比语(pa)"
+${LangFileString} lng_pl "波兰语(pl)"
+${LangFileString} lng_pt "葡萄牙语(pt)"
+${LangFileString} lng_pt_BR "葡萄牙语/巴西(pt_BR)"
+${LangFileString} lng_ro "罗马尼亚语(ro)"
+${LangFileString} lng_ru "俄语(ru)"
+${LangFileString} lng_rw "卢旺达语(rw)"
+${LangFileString} lng_sa "梵语(sa)"
+${LangFileString} lng_sat "桑塔尔语(sat)"
+${LangFileString} lng_sat@deva "Santali in Devanagari script (sat@deva)"
+${LangFileString} lng_sd "信德语(sd)"
+${LangFileString} lng_sd@deva "Sindhi in Devanagari script (sd@deva)"
+${LangFileString} lng_sk "斯洛伐克语(sk)"
+${LangFileString} lng_sl "斯洛文尼亚语(sl)"
+${LangFileString} lng_sq "阿尔巴尼亚语(sq)"
+${LangFileString} lng_sr "塞尔维亚语(sr)"
+${LangFileString} lng_sr@latin "塞尔维亚语,拉丁字书写(sr@latin)"
+${LangFileString} lng_sv "瑞典语(sv)"
+${LangFileString} lng_ta "泰米尔语(ta)"
+${LangFileString} lng_te "泰卢固语(te)"
+${LangFileString} lng_th "泰语(th)"
+${LangFileString} lng_tr "土耳其语(tr)"
+${LangFileString} lng_uk "乌克兰语(uk)"
+${LangFileString} lng_ur "乌尔都语(ur)"
+${LangFileString} lng_vi "越南语(vi)"
+${LangFileString} lng_zh_CN "中文/中国(zh_CN)"
+${LangFileString} lng_zh_TW "中文/台湾(zh_TW)"
diff --git a/packaging/win32/languages/Slovak.nsh b/packaging/win32/languages/Slovak.nsh
index cb4d84d1b..befe7f43a 100644
--- a/packaging/win32/languages/Slovak.nsh
+++ b/packaging/win32/languages/Slovak.nsh
@@ -44,97 +44,6 @@ ${LangFileString} Dictionaries "Dictionaries"
${LangFileString} DictionariesDesc "Dictionaries for some common languages for spell checking in Inkscape"
${LangFileString} Languages "Jazykové sady"
${LangFileString} LanguagesDesc "Nainštalovať ďalšie jazykové sady Inkscape"
-${LangFileString} lng_am "amharčina"
-${LangFileString} lng_ar "arabčina"
-${LangFileString} lng_as "Assamese"
-${LangFileString} lng_az "azerbajdžančina"
-${LangFileString} lng_be "bieloruština"
-${LangFileString} lng_bg "bulharčina"
-${LangFileString} lng_bn "bengálčina"
-${LangFileString} lng_bn_BD "Bengali Bangladesh"
-${LangFileString} lng_br "bretónčina"
-${LangFileString} lng_brx "Bodo"
-${LangFileString} lng_ca "katalánčina"
-${LangFileString} lng_ca@valencia "valencijčina"
-${LangFileString} lng_cs "čeština"
-${LangFileString} lng_da "dánčina"
-${LangFileString} lng_de "nemčina"
-${LangFileString} lng_doi "Dogri"
-${LangFileString} lng_dz "dzongkä"
-${LangFileString} lng_el "gréčtina"
-${LangFileString} lng_en "angličtina"
-${LangFileString} lng_en_AU "angličtina (Austrália)"
-${LangFileString} lng_en_CA "angličtina (Kanada)"
-${LangFileString} lng_en_GB "angličtina (Spojené kráľovstvo)"
-${LangFileString} lng_en_US@piglatin "Pig Latin"
-${LangFileString} lng_eo "esperanto"
-${LangFileString} lng_es "španielčina"
-${LangFileString} lng_es_MX "španielčina (Mexiko)"
-${LangFileString} lng_et "estónčina"
-${LangFileString} lng_eu "baskičtina"
-${LangFileString} lng_fa "farsi"
-${LangFileString} lng_fi "fínčina"
-${LangFileString} lng_fr "francúzština"
-${LangFileString} lng_ga "írčina"
-${LangFileString} lng_gl "galícijčina"
-${LangFileString} lng_gu "Gujarati"
-${LangFileString} lng_he "hebrejčina"
-${LangFileString} lng_hi "Hindi"
-${LangFileString} lng_hr "chorvátčina"
-${LangFileString} lng_hu "maďarčina"
-${LangFileString} lng_hy "Armenian"
-${LangFileString} lng_id "indonézština"
-${LangFileString} lng_is "Icelandic"
-${LangFileString} lng_it "taliančina"
-${LangFileString} lng_ja "japončina"
-${LangFileString} lng_km "khmérčina"
-${LangFileString} lng_kn "Kannada"
-${LangFileString} lng_ko "kórejčina"
-${LangFileString} lng_kok "Konkani"
-${LangFileString} lng_kok@latin "Konkani in Latin script"
-${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script"
-${LangFileString} lng_ks@deva "Kashmiri in Devanagari script"
-${LangFileString} lng_lt "litovčina"
-${LangFileString} lng_lv "Latvian"
-${LangFileString} lng_mai "Maithili"
-${LangFileString} lng_mk "macedónčina"
-${LangFileString} lng_ml "Malayalam"
-${LangFileString} lng_mn "mongolčina"
-${LangFileString} lng_mni "Manipuri"
-${LangFileString} lng_mni@beng "Manipuri in Bengali script"
-${LangFileString} lng_mr "Marathi"
-${LangFileString} lng_nb "nórsky bokmal"
-${LangFileString} lng_ne "nepálčina"
-${LangFileString} lng_nl "holandčina"
-${LangFileString} lng_nn "nórsky nynorsk"
-${LangFileString} lng_or "Odia"
-${LangFileString} lng_pa "pandžábčina"
-${LangFileString} lng_pl "poľština"
-${LangFileString} lng_pt "portugalčina"
-${LangFileString} lng_pt_BR "portugalčina (Brazília)"
-${LangFileString} lng_ro "rumunčina"
-${LangFileString} lng_ru "ruština"
-${LangFileString} lng_rw "rwandčina"
-${LangFileString} lng_sa "Sanskrit"
-${LangFileString} lng_sat "Santali"
-${LangFileString} lng_sat@deva "Santali in Devanagari script"
-${LangFileString} lng_sd "Sindhi"
-${LangFileString} lng_sd@deva "Sindhi in Devanagari script"
-${LangFileString} lng_sk "slovenčina"
-${LangFileString} lng_sl "slovinčina"
-${LangFileString} lng_sq "albánčina"
-${LangFileString} lng_sr "srbčina"
-${LangFileString} lng_sr@latin "srbčina (latinka)"
-${LangFileString} lng_sv "švédčina"
-${LangFileString} lng_ta "Tamil"
-${LangFileString} lng_te "telugu"
-${LangFileString} lng_th "thajčina"
-${LangFileString} lng_tr "turečtina"
-${LangFileString} lng_uk "ukrajinčina"
-${LangFileString} lng_ur "Urdu"
-${LangFileString} lng_vi "Vietnamese"
-${LangFileString} lng_zh_CN "čínština (zjednodušená)"
-${LangFileString} lng_zh_TW "čínština (tradičná)"
${LangFileString} UInstOpt "Možnosti deinštalácie"
${LangFileString} UInstOpt1 "Zvoľte prosím ďalšie možnosti"
${LangFileString} PurgePrefs "Ponechať osobné nastavenia"
diff --git a/packaging/win32/languages/Slovak_languageNames.nsh b/packaging/win32/languages/Slovak_languageNames.nsh
new file mode 100644
index 000000000..9e38b9109
--- /dev/null
+++ b/packaging/win32/languages/Slovak_languageNames.nsh
@@ -0,0 +1,94 @@
+### Slovak (sk) translations for language names
+# This file has been automatically created by '_language_lists.py', do not edit it manually!
+# Strings that should be translated are in 'Slovak.nsh'
+${LangFileString} lng_am "amharčina (am)"
+${LangFileString} lng_ar "arabčina (ar)"
+${LangFileString} lng_as "ásámčina (as)"
+${LangFileString} lng_az "azerbajdžančina (az)"
+${LangFileString} lng_be "bieloruština (be)"
+${LangFileString} lng_bg "bulharčina (bg)"
+${LangFileString} lng_bn "bengálčina (bn)"
+${LangFileString} lng_bn_BD "bengálčina (Bangladéš) (bn)"
+${LangFileString} lng_br "bretónčina (br)"
+${LangFileString} lng_brx "Bodo (brx)"
+${LangFileString} lng_ca "katalánčina (ca)"
+${LangFileString} lng_ca@valencia "valencijčina (ca@valencia)"
+${LangFileString} lng_cs "čeština (cs)"
+${LangFileString} lng_da "dánčina (da)"
+${LangFileString} lng_de "nemčina (de)"
+${LangFileString} lng_doi "dógrí (doi)"
+${LangFileString} lng_dz "dzongkä (dz)"
+${LangFileString} lng_el "gréčtina (el)"
+${LangFileString} lng_en "angličtina (en)"
+${LangFileString} lng_en_AU "angličtina (Austrália) (en_AU)"
+${LangFileString} lng_en_CA "angličtina (Kanada) (en_CA)"
+${LangFileString} lng_en_GB "angličtina (Spojené kráľovstvo) (en_GB)"
+${LangFileString} lng_en_US@piglatin "pig latin (en_US@piglatin)"
+${LangFileString} lng_eo "esperanto (eo)"
+${LangFileString} lng_es "španielčina (es)"
+${LangFileString} lng_es_MX "španielčina (Mexiko) (es_MX)"
+${LangFileString} lng_et "estónčina (et)"
+${LangFileString} lng_eu "baskičtina (eu)"
+${LangFileString} lng_fa "perzština (fa)"
+${LangFileString} lng_fi "fínčina (fi)"
+${LangFileString} lng_fr "francúzština (fr)"
+${LangFileString} lng_ga "írčina (ga)"
+${LangFileString} lng_gl "galícijčina (gl)"
+${LangFileString} lng_gu "gudžarátčina (gu)"
+${LangFileString} lng_he "hebrejčina (he)"
+${LangFileString} lng_hi "hindčina (hi)"
+${LangFileString} lng_hr "chorvátčina (hr)"
+${LangFileString} lng_hu "maďarčina (hu)"
+${LangFileString} lng_hy "arménčina (hy)"
+${LangFileString} lng_id "indonézština (id)"
+${LangFileString} lng_is "islandčina (is)"
+${LangFileString} lng_it "taliančina (it)"
+${LangFileString} lng_ja "japončina (ja)"
+${LangFileString} lng_km "khmérčina (km)"
+${LangFileString} lng_kn "kannadčina (kn)"
+${LangFileString} lng_ko "kórejčina (ko)"
+${LangFileString} lng_kok "konkánčina (kok)"
+${LangFileString} lng_kok@latin "konkánčina v latinke (kok@latin)"
+${LangFileString} lng_ks@aran "kašmírčina v perzsko-arabskom skripte (ks@aran)"
+${LangFileString} lng_ks@deva "kašmírčina v skripte Devanagari (ks@deva)"
+${LangFileString} lng_lt "litovčina (lt)"
+${LangFileString} lng_lv "lotyština (lv)"
+${LangFileString} lng_mai "maithilčina (mai)"
+${LangFileString} lng_mk "macedónčina (mk)"
+${LangFileString} lng_ml "malajálamčina (ml)"
+${LangFileString} lng_mn "mongolčina (mn)"
+${LangFileString} lng_mni "manípurčina (mni)"
+${LangFileString} lng_mni@beng "manípurčina v bengálskom skripte (mni@beng)"
+${LangFileString} lng_mr "maráthčina (mr)"
+${LangFileString} lng_nb "nórsky bokmål (nb)"
+${LangFileString} lng_ne "nepálčina (ne)"
+${LangFileString} lng_nl "holandčina (nl)"
+${LangFileString} lng_nn "nórsky nynorsk (nn)"
+${LangFileString} lng_or "Odia (or)"
+${LangFileString} lng_pa "pandžábčina (pa)"
+${LangFileString} lng_pl "poľština (pl)"
+${LangFileString} lng_pt "portugalčina (pt)"
+${LangFileString} lng_pt_BR "portugalčina (Brazília) (pt_BR)"
+${LangFileString} lng_ro "rumunčina (ro)"
+${LangFileString} lng_ru "ruština (ru)"
+${LangFileString} lng_rw "rwandčina (rw)"
+${LangFileString} lng_sa "sanskrit (sa)"
+${LangFileString} lng_sat "santalčina (sat)"
+${LangFileString} lng_sat@deva "santalčina v skripte Devanagari (sat@deva)"
+${LangFileString} lng_sd "sindhčina (sd)"
+${LangFileString} lng_sd@deva "sindhčina v skripte Devanagari (sd@deva)"
+${LangFileString} lng_sk "slovenčina (sk)"
+${LangFileString} lng_sl "slovinčina (sl)"
+${LangFileString} lng_sq "albánčina (sq)"
+${LangFileString} lng_sr "srbčina (sr)"
+${LangFileString} lng_sr@latin "srbčina v latinke (sr@latin)"
+${LangFileString} lng_sv "švédčina (sv)"
+${LangFileString} lng_ta "tamilčina (ta)"
+${LangFileString} lng_te "telugčina (te)"
+${LangFileString} lng_th "thajčina (th)"
+${LangFileString} lng_tr "turečtina (tr)"
+${LangFileString} lng_uk "ukrajinčina (uk)"
+${LangFileString} lng_ur "urdčina (ur)"
+${LangFileString} lng_vi "vietnamčina (vi)"
+${LangFileString} lng_zh_CN "čínština (Čína) (zh_CN)"
+${LangFileString} lng_zh_TW "čínština (Taiwan) (zh_TW)"
diff --git a/packaging/win32/languages/Slovenian.nsh b/packaging/win32/languages/Slovenian.nsh
index 8042f3cb6..fd50222c2 100644
--- a/packaging/win32/languages/Slovenian.nsh
+++ b/packaging/win32/languages/Slovenian.nsh
@@ -44,97 +44,6 @@ ${LangFileString} Dictionaries "Dictionaries"
${LangFileString} DictionariesDesc "Dictionaries for some common languages for spell checking in Inkscape"
${LangFileString} Languages "Prevodi"
${LangFileString} LanguagesDesc "Namesti različne prevode za Inkscape"
-${LangFileString} lng_am "amharski"
-${LangFileString} lng_ar "arabski"
-${LangFileString} lng_as "Assamese"
-${LangFileString} lng_az "azerbajdžanski"
-${LangFileString} lng_be "beloruski"
-${LangFileString} lng_bg "bolgarski"
-${LangFileString} lng_bn "bengalski"
-${LangFileString} lng_bn_BD "Bengali Bangladesh"
-${LangFileString} lng_br "bretonski"
-${LangFileString} lng_brx "Bodo"
-${LangFileString} lng_ca "katalonski"
-${LangFileString} lng_ca@valencia "valencijski katalonski"
-${LangFileString} lng_cs "češki"
-${LangFileString} lng_da "danski"
-${LangFileString} lng_de "nemški"
-${LangFileString} lng_doi "Dogri"
-${LangFileString} lng_dz "džongški"
-${LangFileString} lng_el "grški"
-${LangFileString} lng_en "angleški"
-${LangFileString} lng_en_AU "avstralsko angleški"
-${LangFileString} lng_en_CA "kanadsko angleški"
-${LangFileString} lng_en_GB "britansko angleški"
-${LangFileString} lng_en_US@piglatin "obrnjeni angleški zlogi"
-${LangFileString} lng_eo "esperanto"
-${LangFileString} lng_es "španski"
-${LangFileString} lng_es_MX "mehiško španski"
-${LangFileString} lng_et "estonski"
-${LangFileString} lng_eu "baskovski"
-${LangFileString} lng_fa "farsi"
-${LangFileString} lng_fi "finski"
-${LangFileString} lng_fr "francoski"
-${LangFileString} lng_ga "irski"
-${LangFileString} lng_gl "galegaški"
-${LangFileString} lng_gu "Gujarati"
-${LangFileString} lng_he "hebrejski"
-${LangFileString} lng_hi "Hindi"
-${LangFileString} lng_hr "hrvaški"
-${LangFileString} lng_hu "madžarski"
-${LangFileString} lng_hy "Armenian"
-${LangFileString} lng_id "indonezijski"
-${LangFileString} lng_is "Icelandic"
-${LangFileString} lng_it "italijanski"
-${LangFileString} lng_ja "japonski"
-${LangFileString} lng_km "kmerski"
-${LangFileString} lng_kn "Kannada"
-${LangFileString} lng_ko "korejski"
-${LangFileString} lng_kok "Konkani"
-${LangFileString} lng_kok@latin "Konkani in Latin script"
-${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script"
-${LangFileString} lng_ks@deva "Kashmiri in Devanagari script"
-${LangFileString} lng_lt "litovski"
-${LangFileString} lng_lv "Latvian"
-${LangFileString} lng_mai "Maithili"
-${LangFileString} lng_mk "makedonski"
-${LangFileString} lng_ml "Malayalam"
-${LangFileString} lng_mn "mongolski"
-${LangFileString} lng_mni "Manipuri"
-${LangFileString} lng_mni@beng "Manipuri in Bengali script"
-${LangFileString} lng_mr "Marathi"
-${LangFileString} lng_nb "norveški Bokmal"
-${LangFileString} lng_ne "nepalski"
-${LangFileString} lng_nl "nizozemski"
-${LangFileString} lng_nn "norveški Nyorsk"
-${LangFileString} lng_or "Odia"
-${LangFileString} lng_pa "pundžabski"
-${LangFileString} lng_pl "poljski"
-${LangFileString} lng_pt "portugalski"
-${LangFileString} lng_pt_BR "brazilski portugalski"
-${LangFileString} lng_ro "romunski"
-${LangFileString} lng_ru "ruski"
-${LangFileString} lng_rw "kinjarvandski"
-${LangFileString} lng_sa "Sanskrit"
-${LangFileString} lng_sat "Santali"
-${LangFileString} lng_sat@deva "Santali in Devanagari script"
-${LangFileString} lng_sd "Sindhi"
-${LangFileString} lng_sd@deva "Sindhi in Devanagari script"
-${LangFileString} lng_sk "slovaški"
-${LangFileString} lng_sl "slovenski"
-${LangFileString} lng_sq "albanski"
-${LangFileString} lng_sr "srbski"
-${LangFileString} lng_sr@latin "srbski - latinica"
-${LangFileString} lng_sv "švedski"
-${LangFileString} lng_ta "Tamil"
-${LangFileString} lng_te "telugu"
-${LangFileString} lng_th "tajski"
-${LangFileString} lng_tr "turški"
-${LangFileString} lng_uk "ukrajinski"
-${LangFileString} lng_ur "Urdu"
-${LangFileString} lng_vi "vietnamski"
-${LangFileString} lng_zh_CN "poenostavljeni kitajski"
-${LangFileString} lng_zh_TW "tradicionalni kitajski"
${LangFileString} UInstOpt "Možnosti odstranitve"
${LangFileString} UInstOpt1 "Izberite dodatne možnosti"
${LangFileString} PurgePrefs "Ohrani osebne nastavitve"
diff --git a/packaging/win32/languages/Slovenian_languageNames.nsh b/packaging/win32/languages/Slovenian_languageNames.nsh
new file mode 100644
index 000000000..633e73ee7
--- /dev/null
+++ b/packaging/win32/languages/Slovenian_languageNames.nsh
@@ -0,0 +1,94 @@
+### Slovenian (sl) translations for language names
+# This file has been automatically created by '_language_lists.py', do not edit it manually!
+# Strings that should be translated are in 'Slovenian.nsh'
+${LangFileString} lng_am "amharski (am)"
+${LangFileString} lng_ar "arabski (ar)"
+${LangFileString} lng_as "Assamese (as)"
+${LangFileString} lng_az "azerbajdžanski (az)"
+${LangFileString} lng_be "beloruski (be)"
+${LangFileString} lng_bg "bolgarski (bg)"
+${LangFileString} lng_bn "bengalski (bn)"
+${LangFileString} lng_bn_BD "Bengali/Bangladesh (bn_BD)"
+${LangFileString} lng_br "bretonski (br)"
+${LangFileString} lng_brx "Bodo (brx)"
+${LangFileString} lng_ca "katalonski (ca)"
+${LangFileString} lng_ca@valencia "katalonski, Valencia (ca@valencia)"
+${LangFileString} lng_cs "češki (cs)"
+${LangFileString} lng_da "danski (da)"
+${LangFileString} lng_de "nemški (de)"
+${LangFileString} lng_doi "Dogri (doi)"
+${LangFileString} lng_dz "džonkški (dz)"
+${LangFileString} lng_el "grški (el)"
+${LangFileString} lng_en "angleški (en)"
+${LangFileString} lng_en_AU "angleški/Avstralija (en_AU)"
+${LangFileString} lng_en_CA "angleški/Kanada (en_CA)"
+${LangFileString} lng_en_GB "angleški/Velika Britanija (en_GB)"
+${LangFileString} lng_en_US@piglatin "obrnjeni zlogi (en_US@piglatin)"
+${LangFileString} lng_eo "esperanto (eo)"
+${LangFileString} lng_es "španski (es)"
+${LangFileString} lng_es_MX "španski/Mehika (es_MX)"
+${LangFileString} lng_et "estonski (et)"
+${LangFileString} lng_eu "baskovski (eu)"
+${LangFileString} lng_fa "farsi (fa)"
+${LangFileString} lng_fi "finski (fi)"
+${LangFileString} lng_fr "francoski (fr)"
+${LangFileString} lng_ga "irski (ga)"
+${LangFileString} lng_gl "galicijski (gl)"
+${LangFileString} lng_gu "Gujarati (gu)"
+${LangFileString} lng_he "hebrejski (he)"
+${LangFileString} lng_hi "Hindi (hi)"
+${LangFileString} lng_hr "hrvaški (hr)"
+${LangFileString} lng_hu "madžarski (hu)"
+${LangFileString} lng_hy "armenski (hy)"
+${LangFileString} lng_id "indonezijski (id)"
+${LangFileString} lng_is "Icelandic (is)"
+${LangFileString} lng_it "italijanski (it)"
+${LangFileString} lng_ja "japonski (ja)"
+${LangFileString} lng_km "kmerski (km)"
+${LangFileString} lng_kn "Kannada (kn)"
+${LangFileString} lng_ko "korejski (ko)"
+${LangFileString} lng_kok "Konkani (kok)"
+${LangFileString} lng_kok@latin "Konkani in Latin script (kok@latin)"
+${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script (ks@aran)"
+${LangFileString} lng_ks@deva "Kashmiri in Devanagari script (ks@deva)"
+${LangFileString} lng_lt "litovski (lt)"
+${LangFileString} lng_lv "latvijski (lt)"
+${LangFileString} lng_mai "Maithili (mai)"
+${LangFileString} lng_mk "makedonski (mk)"
+${LangFileString} lng_ml "Malayalam (ml)"
+${LangFileString} lng_mn "mongolski (mn)"
+${LangFileString} lng_mni "Manipuri (mni)"
+${LangFileString} lng_mni@beng "Manipuri in Bengali script (mni@beng)"
+${LangFileString} lng_mr "Marathi (mr)"
+${LangFileString} lng_nb "norveški, Bokmål (nb)"
+${LangFileString} lng_ne "nepalski (ne)"
+${LangFileString} lng_nl "nizozemski (nl)"
+${LangFileString} lng_nn "norveški, Nynorsk (nn)"
+${LangFileString} lng_or "Odia (or)"
+${LangFileString} lng_pa "pandžabski (pa)"
+${LangFileString} lng_pl "poljski (pl)"
+${LangFileString} lng_pt "portugalski (pt)"
+${LangFileString} lng_pt_BR "portugalski/Brazilija (pt_BR)"
+${LangFileString} lng_ro "romunski (ro)"
+${LangFileString} lng_ru "ruski (ru)"
+${LangFileString} lng_rw "kinjarvandski (rw)"
+${LangFileString} lng_sa "Sanskrit (sa)"
+${LangFileString} lng_sat "Santali (sat)"
+${LangFileString} lng_sat@deva "Santali in Devanagari script (sat@deva)"
+${LangFileString} lng_sd "Sindhi (sd)"
+${LangFileString} lng_sd@deva "Sindhi in Devanagari script (sd@deva)"
+${LangFileString} lng_sk "slovaški (sk)"
+${LangFileString} lng_sl "slovenski (sl)"
+${LangFileString} lng_sq "albanski (sq)"
+${LangFileString} lng_sr "srbski (sr)"
+${LangFileString} lng_sr@latin "srbski, latinica (sr@latin)"
+${LangFileString} lng_sv "švedski (sv)"
+${LangFileString} lng_ta "Tamil (ta)"
+${LangFileString} lng_te "Telugu (te)"
+${LangFileString} lng_th "tajski (th)"
+${LangFileString} lng_tr "turški (tr)"
+${LangFileString} lng_uk "ukrajinski (uk)"
+${LangFileString} lng_ur "Urdu (ur)"
+${LangFileString} lng_vi "vietnamski (vi)"
+${LangFileString} lng_zh_CN "kitajski/Kitajska (zh_CN)"
+${LangFileString} lng_zh_TW "kitajski/Tajvan (zh_TW)"
diff --git a/packaging/win32/languages/Spanish.nsh b/packaging/win32/languages/Spanish.nsh
index af38422f6..c28d29433 100644
--- a/packaging/win32/languages/Spanish.nsh
+++ b/packaging/win32/languages/Spanish.nsh
@@ -44,97 +44,6 @@ ${LangFileString} Dictionaries "Dictionaries"
${LangFileString} DictionariesDesc "Dictionaries for some common languages for spell checking in Inkscape"
${LangFileString} Languages "Traducciones"
${LangFileString} LanguagesDesc "Instalar varias traducciones para Inkscape"
-${LangFileString} lng_am "Amárico"
-${LangFileString} lng_ar "Árabe"
-${LangFileString} lng_as "Assamese"
-${LangFileString} lng_az "Azerbayano"
-${LangFileString} lng_be "Bielorruso"
-${LangFileString} lng_bg "Búlgaro"
-${LangFileString} lng_bn "Bengalí"
-${LangFileString} lng_bn_BD "Bengali Bangladesh"
-${LangFileString} lng_br "Bretón"
-${LangFileString} lng_brx "Bodo"
-${LangFileString} lng_ca "Catalán"
-${LangFileString} lng_ca@valencia "Valenciano"
-${LangFileString} lng_cs "Checo"
-${LangFileString} lng_da "Dané"
-${LangFileString} lng_de "Alemán"
-${LangFileString} lng_doi "Dogri"
-${LangFileString} lng_dz "Dzongkha"
-${LangFileString} lng_el "Griego"
-${LangFileString} lng_en "Inglés"
-${LangFileString} lng_en_AU "Inglés australiano"
-${LangFileString} lng_en_CA "Inglés canadiense"
-${LangFileString} lng_en_GB "Inglés británico"
-${LangFileString} lng_en_US@piglatin "Pig Latin"
-${LangFileString} lng_eo "Esperanto"
-${LangFileString} lng_es "Español"
-${LangFileString} lng_es_MX "Español mexicano"
-${LangFileString} lng_et "Estonio"
-${LangFileString} lng_eu "Euskera"
-${LangFileString} lng_fa "Farsi"
-${LangFileString} lng_fi "Finés"
-${LangFileString} lng_fr "Francés"
-${LangFileString} lng_ga "Irlandés"
-${LangFileString} lng_gl "Galego"
-${LangFileString} lng_gu "Gujarati"
-${LangFileString} lng_he "Hebreo"
-${LangFileString} lng_hi "Hindi"
-${LangFileString} lng_hr "Croata"
-${LangFileString} lng_hu "Húngaro"
-${LangFileString} lng_hy "Armenian"
-${LangFileString} lng_id "Indonesio"
-${LangFileString} lng_is "Icelandic"
-${LangFileString} lng_it "Italiano"
-${LangFileString} lng_ja "Japonés"
-${LangFileString} lng_km "Jemer"
-${LangFileString} lng_kn "Kannada"
-${LangFileString} lng_ko "Coreano"
-${LangFileString} lng_kok "Konkani"
-${LangFileString} lng_kok@latin "Konkani in Latin script"
-${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script"
-${LangFileString} lng_ks@deva "Kashmiri in Devanagari script"
-${LangFileString} lng_lt "Lituano"
-${LangFileString} lng_lv "Latvian"
-${LangFileString} lng_mai "Maithili"
-${LangFileString} lng_mk "Macedonio"
-${LangFileString} lng_ml "Malayalam"
-${LangFileString} lng_mn "Mongol"
-${LangFileString} lng_mni "Manipuri"
-${LangFileString} lng_mni@beng "Manipuri in Bengali script"
-${LangFileString} lng_mr "Marathi"
-${LangFileString} lng_nb "Bokmål noruego"
-${LangFileString} lng_ne "Nepalí"
-${LangFileString} lng_nl "Holandés"
-${LangFileString} lng_nn "Nynorsk noruego"
-${LangFileString} lng_or "Odia"
-${LangFileString} lng_pa "Punyabi"
-${LangFileString} lng_pl "Polaco"
-${LangFileString} lng_pt "Portugués"
-${LangFileString} lng_pt_BR "Portugués brasileño"
-${LangFileString} lng_ro "Rumano"
-${LangFileString} lng_ru "Ruso"
-${LangFileString} lng_rw "Kinyarwanda"
-${LangFileString} lng_sa "Sanskrit"
-${LangFileString} lng_sat "Santali"
-${LangFileString} lng_sat@deva "Santali in Devanagari script"
-${LangFileString} lng_sd "Sindhi"
-${LangFileString} lng_sd@deva "Sindhi in Devanagari script"
-${LangFileString} lng_sk "Eslovaco"
-${LangFileString} lng_sl "Esloveno"
-${LangFileString} lng_sq "Albano"
-${LangFileString} lng_sr "Serbio"
-${LangFileString} lng_sr@latin "Serbio en escritura latina"
-${LangFileString} lng_sv "Sueco"
-${LangFileString} lng_ta "Tamil"
-${LangFileString} lng_te "Telugu"
-${LangFileString} lng_th "Tai"
-${LangFileString} lng_tr "Turco"
-${LangFileString} lng_uk "Ucranio"
-${LangFileString} lng_ur "Urdu"
-${LangFileString} lng_vi "Vietnamita"
-${LangFileString} lng_zh_CN "Chino simplificado"
-${LangFileString} lng_zh_TW "Chino taiwanés"
${LangFileString} UInstOpt "Opciones de desinstalación"
${LangFileString} UInstOpt1 "Elija sus opciones adicionales"
${LangFileString} PurgePrefs "Guardar las preferencias personales"
diff --git a/packaging/win32/languages/Spanish_languageNames.nsh b/packaging/win32/languages/Spanish_languageNames.nsh
new file mode 100644
index 000000000..b904bae9e
--- /dev/null
+++ b/packaging/win32/languages/Spanish_languageNames.nsh
@@ -0,0 +1,94 @@
+### Spanish (es) translations for language names
+# This file has been automatically created by '_language_lists.py', do not edit it manually!
+# Strings that should be translated are in 'Spanish.nsh'
+${LangFileString} lng_am "Amárico (am)"
+${LangFileString} lng_ar "Árabe (ar)"
+${LangFileString} lng_as "Asamés (as)"
+${LangFileString} lng_az "Azerbayano (az)"
+${LangFileString} lng_be "Bielorruso (be) "
+${LangFileString} lng_bg "Búlgaro (bg)"
+${LangFileString} lng_bn "Bengalí (bn)"
+${LangFileString} lng_bn_BD "Bengalí/Bangladesh (bn_BD)"
+${LangFileString} lng_br "Bretón (br)"
+${LangFileString} lng_brx "Bodo (brx)"
+${LangFileString} lng_ca "Catalán (ca)"
+${LangFileString} lng_ca@valencia "Valenciano (ca@valencia)"
+${LangFileString} lng_cs "Checo (cs)"
+${LangFileString} lng_da "Danés (da)"
+${LangFileString} lng_de "Alemán (de)"
+${LangFileString} lng_doi "Dogri (doi)"
+${LangFileString} lng_dz "Dzongkha (dz)"
+${LangFileString} lng_el "Griego (el)"
+${LangFileString} lng_en "Inglés (en)"
+${LangFileString} lng_en_AU "Inglés/Australia (en_AU)"
+${LangFileString} lng_en_CA "Inglés/Canada (en_CA)"
+${LangFileString} lng_en_GB "Inglés/Gran Bretaña (en_GB)"
+${LangFileString} lng_en_US@piglatin "Galimatías - Pig Latin (en_US@piglatin)"
+${LangFileString} lng_eo "Esperanto (eo)"
+${LangFileString} lng_es "Español (es)"
+${LangFileString} lng_es_MX "Español/México (es_MX)"
+${LangFileString} lng_et "Estonio (et)"
+${LangFileString} lng_eu "Euskera (eu)"
+${LangFileString} lng_fa "Farsi (fa)"
+${LangFileString} lng_fi "Finés (fi)"
+${LangFileString} lng_fr "Francés (fr)"
+${LangFileString} lng_ga "Irlandés (ga)"
+${LangFileString} lng_gl "Gallego (gl)"
+${LangFileString} lng_gu "Gujarati (gu)"
+${LangFileString} lng_he "Hebreo (he)"
+${LangFileString} lng_hi "Hindi (hi)"
+${LangFileString} lng_hr "Croata (hr)"
+${LangFileString} lng_hu "Húngaro (hu)"
+${LangFileString} lng_hy "Armenio (hy)"
+${LangFileString} lng_id "Indonesio (id)"
+${LangFileString} lng_is "Islandés (is)"
+${LangFileString} lng_it "Italiano (it)"
+${LangFileString} lng_ja "Japonés (ja)"
+${LangFileString} lng_km "Jemer (km)"
+${LangFileString} lng_kn "Kannada (kn)"
+${LangFileString} lng_ko "Coreano (ko)"
+${LangFileString} lng_kok "Konkani (kok)"
+${LangFileString} lng_kok@latin "Konkani en escritura latina (kok@latin)"
+${LangFileString} lng_ks@aran "Cachemiro en escritura Perso-Arábica (ks@aran)"
+${LangFileString} lng_ks@deva "Cachemiro en escritura Devanagari (ks@deva)"
+${LangFileString} lng_lt "Lituano (lt)"
+${LangFileString} lng_lv "Letón (lv)"
+${LangFileString} lng_mai "Maithili (mai)"
+${LangFileString} lng_mk "Macedonio (mk)"
+${LangFileString} lng_ml "Malayalam (ml)"
+${LangFileString} lng_mn "Mongol (mn)"
+${LangFileString} lng_mni "Manipuri (mni)"
+${LangFileString} lng_mni@beng "Manipuri en escritura Bengalí (mni@beng)"
+${LangFileString} lng_mr "Marathi (mr)"
+${LangFileString} lng_nb "Noruego Bokmål (nb)"
+${LangFileString} lng_ne "Nepalí (ne)"
+${LangFileString} lng_nl "Holandés (nl)"
+${LangFileString} lng_nn "Noruego Nynorsk (nn)"
+${LangFileString} lng_or "Odia (or)"
+${LangFileString} lng_pa "Panjabí (pa)"
+${LangFileString} lng_pl "Polaco (pl)"
+${LangFileString} lng_pt "Portugués (pt)"
+${LangFileString} lng_pt_BR "Portugués brasileño (pt_BR)"
+${LangFileString} lng_ro "Rumano (ro)"
+${LangFileString} lng_ru "Ruso (ru)"
+${LangFileString} lng_rw "Kinyarwanda (rw)"
+${LangFileString} lng_sa "Sánscrito (sa)"
+${LangFileString} lng_sat "Santali (sat)"
+${LangFileString} lng_sat@deva "Santali en escritura Devanagari (sat@deva)"
+${LangFileString} lng_sd "Sindhi (sd)"
+${LangFileString} lng_sd@deva "Sindhi en escritura Devanagari (sd@deva)"
+${LangFileString} lng_sk "Eslovaco (sk)"
+${LangFileString} lng_sl "Esloveno (sl)"
+${LangFileString} lng_sq "Albanés (sq)"
+${LangFileString} lng_sr "Serbio (sr)"
+${LangFileString} lng_sr@latin "Serbio en escritura latina (sr@latin)"
+${LangFileString} lng_sv "Sueco (sv)"
+${LangFileString} lng_ta "Tamil (ta)"
+${LangFileString} lng_te "Telugu (te)"
+${LangFileString} lng_th "Thai (th)"
+${LangFileString} lng_tr "Turco (tr)"
+${LangFileString} lng_uk "Ukranio (uk)"
+${LangFileString} lng_ur "Urdu (ur)"
+${LangFileString} lng_vi "Vietnamita (vi)"
+${LangFileString} lng_zh_CN "Chino/China (zh_CN)"
+${LangFileString} lng_zh_TW "Chino/Taiwán (zh_TW)"
diff --git a/packaging/win32/languages/TradChinese.nsh b/packaging/win32/languages/TradChinese.nsh
index 6e75dea77..38d017949 100644
--- a/packaging/win32/languages/TradChinese.nsh
+++ b/packaging/win32/languages/TradChinese.nsh
@@ -44,97 +44,6 @@ ${LangFileString} Dictionaries "Dictionaries"
${LangFileString} DictionariesDesc "Dictionaries for some common languages for spell checking in Inkscape"
${LangFileString} Languages "語言"
${LangFileString} LanguagesDesc "安裝 Inkscape 各種語言翻譯"
-${LangFileString} lng_am "阿比西尼亞語"
-${LangFileString} lng_ar "阿拉伯語"
-${LangFileString} lng_as "Assamese"
-${LangFileString} lng_az "亞塞拜然語"
-${LangFileString} lng_be "白俄羅斯語"
-${LangFileString} lng_bg "保加利亞語"
-${LangFileString} lng_bn "孟加拉語"
-${LangFileString} lng_bn_BD "Bengali Bangladesh"
-${LangFileString} lng_br "不列塔尼語"
-${LangFileString} lng_brx "Bodo"
-${LangFileString} lng_ca "加泰隆語"
-${LangFileString} lng_ca@valencia "瓦倫西亞語 加泰羅尼亞語"
-${LangFileString} lng_cs "捷克語"
-${LangFileString} lng_da "丹麥語"
-${LangFileString} lng_de "德語"
-${LangFileString} lng_doi "Dogri"
-${LangFileString} lng_dz "宗卡語"
-${LangFileString} lng_el "希臘語"
-${LangFileString} lng_en "英語"
-${LangFileString} lng_en_AU "英語(澳大利亞)"
-${LangFileString} lng_en_CA "英語(加拿大)"
-${LangFileString} lng_en_GB "英語(不列顛)"
-${LangFileString} lng_en_US@piglatin "豬拉丁語"
-${LangFileString} lng_eo "世界語"
-${LangFileString} lng_es "西班牙文"
-${LangFileString} lng_es_MX "西班牙語(墨西哥)"
-${LangFileString} lng_et "愛沙尼亞語"
-${LangFileString} lng_eu "巴斯克語"
-${LangFileString} lng_fa "Farsi"
-${LangFileString} lng_fi "芬蘭語"
-${LangFileString} lng_fr "法文"
-${LangFileString} lng_ga "愛爾蘭語"
-${LangFileString} lng_gl "加里西亞語"
-${LangFileString} lng_gu "Gujarati"
-${LangFileString} lng_he "希伯來語"
-${LangFileString} lng_hi "Hindi"
-${LangFileString} lng_hr "克羅埃西亞語"
-${LangFileString} lng_hu "匈牙利語"
-${LangFileString} lng_hy "Armenian"
-${LangFileString} lng_id "印尼語"
-${LangFileString} lng_is "Icelandic"
-${LangFileString} lng_it "義大利文"
-${LangFileString} lng_ja "日文"
-${LangFileString} lng_km "高棉語"
-${LangFileString} lng_kn "Kannada"
-${LangFileString} lng_ko "韓文"
-${LangFileString} lng_kok "Konkani"
-${LangFileString} lng_kok@latin "Konkani in Latin script"
-${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script"
-${LangFileString} lng_ks@deva "Kashmiri in Devanagari script"
-${LangFileString} lng_lt "立陶宛語"
-${LangFileString} lng_lv "Latvian"
-${LangFileString} lng_mai "Maithili"
-${LangFileString} lng_mk "馬其頓語"
-${LangFileString} lng_ml "Malayalam"
-${LangFileString} lng_mn "蒙古語"
-${LangFileString} lng_mni "Manipuri"
-${LangFileString} lng_mni@beng "Manipuri in Bengali script"
-${LangFileString} lng_mr "Marathi"
-${LangFileString} lng_nb "挪威 Bokmal 語"
-${LangFileString} lng_ne "尼泊爾語"
-${LangFileString} lng_nl "荷蘭語"
-${LangFileString} lng_nn "挪威 Nynorsk 語"
-${LangFileString} lng_or "Odia"
-${LangFileString} lng_pa "旁遮普語"
-${LangFileString} lng_pl "波蘭語"
-${LangFileString} lng_pt "葡萄牙文"
-${LangFileString} lng_pt_BR "葡萄牙文(巴西)"
-${LangFileString} lng_ro "羅馬尼亞語"
-${LangFileString} lng_ru "俄文"
-${LangFileString} lng_rw "金亞盧安達語"
-${LangFileString} lng_sa "Sanskrit"
-${LangFileString} lng_sat "Santali"
-${LangFileString} lng_sat@deva "Santali in Devanagari script"
-${LangFileString} lng_sd "Sindhi"
-${LangFileString} lng_sd@deva "Sindhi in Devanagari script"
-${LangFileString} lng_sk "斯洛法克語"
-${LangFileString} lng_sl "斯洛凡尼亞語"
-${LangFileString} lng_sq "阿爾巴尼亞語"
-${LangFileString} lng_sr "賽爾維亞語"
-${LangFileString} lng_sr@latin "塞爾維亞文-拉丁"
-${LangFileString} lng_sv "瑞典語"
-${LangFileString} lng_ta "Tamil"
-${LangFileString} lng_te "Telugu"
-${LangFileString} lng_th "泰語"
-${LangFileString} lng_tr "土耳其語"
-${LangFileString} lng_uk "烏克蘭語"
-${LangFileString} lng_ur "Urdu"
-${LangFileString} lng_vi "越南話"
-${LangFileString} lng_zh_CN "簡體中文"
-${LangFileString} lng_zh_TW "繁體中文"
${LangFileString} UInstOpt "反安裝選項"
${LangFileString} UInstOpt1 "請選擇其他選項"
${LangFileString} PurgePrefs "保留個人偏好設定"
diff --git a/packaging/win32/languages/TradChinese_languageNames.nsh b/packaging/win32/languages/TradChinese_languageNames.nsh
new file mode 100644
index 000000000..6d1a66954
--- /dev/null
+++ b/packaging/win32/languages/TradChinese_languageNames.nsh
@@ -0,0 +1,94 @@
+### Chinese/Taiwan (zh_TW) translations for language names
+# This file has been automatically created by '_language_lists.py', do not edit it manually!
+# Strings that should be translated are in 'TradChinese.nsh'
+${LangFileString} lng_am "阿比西尼亞語 (am)"
+${LangFileString} lng_ar "阿拉伯語 (ar)"
+${LangFileString} lng_as "Assamese (as)"
+${LangFileString} lng_az "亞塞拜然語 (az)"
+${LangFileString} lng_be "白俄羅斯語 (be)"
+${LangFileString} lng_bg "保加利亞語 (bg)"
+${LangFileString} lng_bn "孟加拉語 (bn)"
+${LangFileString} lng_bn_BD "孟加拉語 / 西孟加拉 (bn)"
+${LangFileString} lng_br "不列塔尼語 (br)"
+${LangFileString} lng_brx "Bodo (brx)"
+${LangFileString} lng_ca "加達朗語 (ca)"
+${LangFileString} lng_ca@valencia "瓦倫西亞語 加泰羅尼亞語 (ca@valencia)"
+${LangFileString} lng_cs "捷克語 (cs)"
+${LangFileString} lng_da "丹麥語 (da)"
+${LangFileString} lng_de "德語 (de)"
+${LangFileString} lng_doi "多格萊語 (doi)"
+${LangFileString} lng_dz "宗卡語 (dz)"
+${LangFileString} lng_el "希臘語 (el)"
+${LangFileString} lng_en "英語 (en)"
+${LangFileString} lng_en_AU "英語/澳大利亞 (en_AU)"
+${LangFileString} lng_en_CA "英語 / 加拿大 (en_CA)"
+${LangFileString} lng_en_GB "英語 / 大不列顛 (en_GB)"
+${LangFileString} lng_en_US@piglatin "兒童黑話 (en_US@piglatin)"
+${LangFileString} lng_eo "世界語 (eo)"
+${LangFileString} lng_es "西班牙語 (es)"
+${LangFileString} lng_es_MX "西班牙語 / 墨西哥 (es_MX)"
+${LangFileString} lng_et "愛沙尼亞語 (et)"
+${LangFileString} lng_eu "巴斯克語 (eu)"
+${LangFileString} lng_fa "波斯語 (fa)"
+${LangFileString} lng_fi "芬蘭語 (fi)"
+${LangFileString} lng_fr "法語 (fr)"
+${LangFileString} lng_ga "愛爾蘭語 (ga)"
+${LangFileString} lng_gl "加裡西亞語 (gl)"
+${LangFileString} lng_gu "Gujarati (gu)"
+${LangFileString} lng_he "希伯來語 (he)"
+${LangFileString} lng_hi "印地語 (hi)"
+${LangFileString} lng_hr "克羅埃西亞語 (hr)"
+${LangFileString} lng_hu "匈牙利語 (hu)"
+${LangFileString} lng_hy "亞美尼亞語 (hy)"
+${LangFileString} lng_id "印尼語 (id)"
+${LangFileString} lng_is "冰島語 (is)"
+${LangFileString} lng_it "義大利語 (it)"
+${LangFileString} lng_ja "日文 (ja)"
+${LangFileString} lng_km "高棉語 (km)"
+${LangFileString} lng_kn "Kannada (kn)"
+${LangFileString} lng_ko "韓語 (ko)"
+${LangFileString} lng_kok "Konkani (kok)"
+${LangFileString} lng_kok@latin "Konkani in Latin script (kok@latin)"
+${LangFileString} lng_ks@aran "Kashmiri in Perso-Arabic script (ks@aran)"
+${LangFileString} lng_ks@deva "迪瓦那格里書寫體喀什米爾語 (ks@deva)"
+${LangFileString} lng_lt "立陶宛語 (lt)"
+${LangFileString} lng_lv "拉脫維亞語 (lv)"
+${LangFileString} lng_mai "邁蒂利語 (mai)"
+${LangFileString} lng_mk "馬其頓語 (mk)"
+${LangFileString} lng_ml "Malayalam (ml)"
+${LangFileString} lng_mn "蒙古語 (mn)"
+${LangFileString} lng_mni "曼尼普爾語 (mni)"
+${LangFileString} lng_mni@beng "孟加拉書寫體曼尼普爾語 (mni@beng)"
+${LangFileString} lng_mr "馬拉提語 (mr)"
+${LangFileString} lng_nb "挪威 Bokmål 語 (nb)"
+${LangFileString} lng_ne "尼泊爾語 (ne)"
+${LangFileString} lng_nl "荷蘭語 (nl)"
+${LangFileString} lng_nn "挪威 Nynorsk 語 (nn)"
+${LangFileString} lng_or "歐利亞語 (or)"
+${LangFileString} lng_pa "旁遮普語 (pa)"
+${LangFileString} lng_pl "波蘭語 (pl)"
+${LangFileString} lng_pt "葡萄牙語 (pt)"
+${LangFileString} lng_pt_BR "葡萄牙語 / 巴西 (pt_BR)"
+${LangFileString} lng_ro "羅馬尼亞語 (ro)"
+${LangFileString} lng_ru "俄文 (ru)"
+${LangFileString} lng_rw "金亞盧安達語 (rw)"
+${LangFileString} lng_sa "梵語 (sa)"
+${LangFileString} lng_sat "Santali (sat)"
+${LangFileString} lng_sat@deva "Santali in Devanagari script (sat@deva)"
+${LangFileString} lng_sd "信德語 (sd)"
+${LangFileString} lng_sd@deva "Sindhi in Devanagari script (sd@deva)"
+${LangFileString} lng_sk "斯洛法克語 (sk)"
+${LangFileString} lng_sl "斯洛凡尼亞語 (sl)"
+${LangFileString} lng_sq "阿爾巴尼亞語 (sq)"
+${LangFileString} lng_sr "賽爾維亞語 (sr)"
+${LangFileString} lng_sr@latin "塞爾維亞文 - 拉丁 (sr@latin)"
+${LangFileString} lng_sv "瑞典語 (sv)"
+${LangFileString} lng_ta "Tamil (ta)"
+${LangFileString} lng_te "泰盧固語 (te)"
+${LangFileString} lng_th "泰語 (th)"
+${LangFileString} lng_tr "土耳其語 (tr)"
+${LangFileString} lng_uk "烏克蘭語 (uk)"
+${LangFileString} lng_ur "烏爾都語 (ur)"
+${LangFileString} lng_vi "越南話 (vi)"
+${LangFileString} lng_zh_CN "中文 / 中國 (zh_CN)"
+${LangFileString} lng_zh_TW "中文 / 臺灣 (zh_TW)"
diff --git a/packaging/win32/languages/Ukrainian.nsh b/packaging/win32/languages/Ukrainian.nsh
index 5c015da1e..a1c6c1d1f 100644
--- a/packaging/win32/languages/Ukrainian.nsh
+++ b/packaging/win32/languages/Ukrainian.nsh
@@ -44,97 +44,6 @@ ${LangFileString} Dictionaries "Словники"
${LangFileString} DictionariesDesc "Словники для перевірки правопису поширеними мовами у Inkscape"
${LangFileString} Languages "Переклади"
${LangFileString} LanguagesDesc "Встановити переклади Inkscape різними мовами"
-${LangFileString} lng_am "Амхарською"
-${LangFileString} lng_ar "Арабською"
-${LangFileString} lng_as "Асамською"
-${LangFileString} lng_az "Азербайджанською"
-${LangFileString} lng_be "Білоруською"
-${LangFileString} lng_bg "Болгарською"
-${LangFileString} lng_bn "Бенгальською"
-${LangFileString} lng_bn_BD "Бенгальською (Бангладеш)"
-${LangFileString} lng_br "Бретонською"
-${LangFileString} lng_brx "Бодо"
-${LangFileString} lng_ca "Каталанською"
-${LangFileString} lng_ca@valencia "Валенсійською каталанською"
-${LangFileString} lng_cs "Чеською"
-${LangFileString} lng_da "Данською"
-${LangFileString} lng_de "Німецькою"
-${LangFileString} lng_doi "Dogri"
-${LangFileString} lng_dz "Дзонг-кхе"
-${LangFileString} lng_el "Грецькою"
-${LangFileString} lng_en "Англійською"
-${LangFileString} lng_en_AU "Австралійською англійською"
-${LangFileString} lng_en_CA "Канадською англійською"
-${LangFileString} lng_en_GB "Британською англійською"
-${LangFileString} lng_en_US@piglatin "Поросячою латиною"
-${LangFileString} lng_eo "Есперанто"
-${LangFileString} lng_es "Іспанською"
-${LangFileString} lng_es_MX "Мексиканською іспанською"
-${LangFileString} lng_et "Естонською"
-${LangFileString} lng_eu "Баською"
-${LangFileString} lng_fa "Фарсі"
-${LangFileString} lng_fi "Фінською"
-${LangFileString} lng_fr "Французькою"
-${LangFileString} lng_ga "Ірландською"
-${LangFileString} lng_gl "Галісійською"
-${LangFileString} lng_gu "Гуджараті"
-${LangFileString} lng_he "Івритом"
-${LangFileString} lng_hi "Гінді"
-${LangFileString} lng_hr "Хорватською"
-${LangFileString} lng_hu "Угорською"
-${LangFileString} lng_hy "Вірменською"
-${LangFileString} lng_id "Індонезійською"
-${LangFileString} lng_is "Ісландською"
-${LangFileString} lng_it "Італійською"
-${LangFileString} lng_ja "Японською"
-${LangFileString} lng_km "Кхмерською"
-${LangFileString} lng_kn "Каннадською"
-${LangFileString} lng_ko "Корейською"
-${LangFileString} lng_kok "Конкані"
-${LangFileString} lng_kok@latin "Конкані з латинською писемністю"
-${LangFileString} lng_ks@aran "Кашмірською із персо-арабською писемністю"
-${LangFileString} lng_ks@deva "Кашмірською із писемністю деванагарі"
-${LangFileString} lng_lt "Литовською"
-${LangFileString} lng_lv "Латвійською"
-${LangFileString} lng_mai "Майтілі"
-${LangFileString} lng_mk "Македонською"
-${LangFileString} lng_ml "Малаялам"
-${LangFileString} lng_mn "Монгольською"
-${LangFileString} lng_mni "Маніпурі"
-${LangFileString} lng_mni@beng "Маніпурі із бенгальською писемністю"
-${LangFileString} lng_mr "Мараті"
-${LangFileString} lng_nb "Норвезькою (букмол)"
-${LangFileString} lng_ne "Непальською"
-${LangFileString} lng_nl "Голландською"
-${LangFileString} lng_nn "Норвезькою (нюноршк)"
-${LangFileString} lng_or "Одія"
-${LangFileString} lng_pa "Пенджабі"
-${LangFileString} lng_pl "Польською"
-${LangFileString} lng_pt "Португальською"
-${LangFileString} lng_pt_BR "Бразильською португальською"
-${LangFileString} lng_ro "Румунською"
-${LangFileString} lng_ru "Російською"
-${LangFileString} lng_rw "Киньяруанда"
-${LangFileString} lng_sa "Санскритом"
-${LangFileString} lng_sat "Санталі"
-${LangFileString} lng_sat@deva "Санталі із писемністю деванагарі"
-${LangFileString} lng_sd "Сіндською"
-${LangFileString} lng_sd@deva "Сіндською із писемністю деванагарі"
-${LangFileString} lng_sk "Словацькою"
-${LangFileString} lng_sl "Словенською"
-${LangFileString} lng_sq "Албанською"
-${LangFileString} lng_sr "Сербською"
-${LangFileString} lng_sr@latin "Сербською (латиницею)"
-${LangFileString} lng_sv "Шведською"
-${LangFileString} lng_ta "Тамільською"
-${LangFileString} lng_te "Телугу"
-${LangFileString} lng_th "Тайською"
-${LangFileString} lng_tr "Турецькою"
-${LangFileString} lng_uk "Українською"
-${LangFileString} lng_ur "Урду"
-${LangFileString} lng_vi "В’єтнамською"
-${LangFileString} lng_zh_CN "Спрощеною китайською"
-${LangFileString} lng_zh_TW "Традиційною китайською"
${LangFileString} UInstOpt "Параметри вилучення програми"
${LangFileString} UInstOpt1 "Будь ласка, вкажіть додаткові параметри"
${LangFileString} PurgePrefs "Зберегти особисті налаштування"
diff --git a/packaging/win32/languages/Ukrainian_languageNames.nsh b/packaging/win32/languages/Ukrainian_languageNames.nsh
new file mode 100644
index 000000000..1c53aa503
--- /dev/null
+++ b/packaging/win32/languages/Ukrainian_languageNames.nsh
@@ -0,0 +1,94 @@
+### Ukrainian (uk) translations for language names
+# This file has been automatically created by '_language_lists.py', do not edit it manually!
+# Strings that should be translated are in 'Ukrainian.nsh'
+${LangFileString} lng_am "Амхарська (am)"
+${LangFileString} lng_ar "Арабська (ar)"
+${LangFileString} lng_as "Ассамська (as)"
+${LangFileString} lng_az "Азербайджанська (az)"
+${LangFileString} lng_be "Білоруська (be)"
+${LangFileString} lng_bg "Болгарська (bg)"
+${LangFileString} lng_bn "Бенгальська (bn)"
+${LangFileString} lng_bn_BD "Бенгальська, Бангладеш (bn_BD)"
+${LangFileString} lng_br "Бретонська (br)"
+${LangFileString} lng_brx "Бодо (brx)"
+${LangFileString} lng_ca "Каталанська (ca)"
+${LangFileString} lng_ca@valencia "Валенсійска каталанська (ca@valencia)"
+${LangFileString} lng_cs "Чеська (cs)"
+${LangFileString} lng_da "Данська (da)"
+${LangFileString} lng_de "Німецька (de)"
+${LangFileString} lng_doi "Догрі (doi)"
+${LangFileString} lng_dz "Джонка (dz)"
+${LangFileString} lng_el "Грецька (el)"
+${LangFileString} lng_en "Англійська (en)"
+${LangFileString} lng_en_AU "Англійська/Австралія (en_AU)"
+${LangFileString} lng_en_CA "Англійська/Канада (en_CA)"
+${LangFileString} lng_en_GB "Англійська/Великобританія (en_GB)"
+${LangFileString} lng_en_US@piglatin "Свиняча латина (en_US@piglatin)"
+${LangFileString} lng_eo "Есперанто (eo)"
+${LangFileString} lng_es "Іспанська (es)"
+${LangFileString} lng_es_MX "Іспанська (Мексика) (es_MX)"
+${LangFileString} lng_et "Естонська (et)"
+${LangFileString} lng_eu "Баскська (eu)"
+${LangFileString} lng_fa "Фарсі (fa)"
+${LangFileString} lng_fi "Фінська (fi)"
+${LangFileString} lng_fr "Французька (fr)"
+${LangFileString} lng_ga "Ірландська (ga)"
+${LangFileString} lng_gl "Галісійська (gl)"
+${LangFileString} lng_gu "Гуджараті (gu)"
+${LangFileString} lng_he "Єврейська (he)"
+${LangFileString} lng_hi "Хінді (hi)"
+${LangFileString} lng_hr "Хорватська (hr)"
+${LangFileString} lng_hu "Угорська (hu)"
+${LangFileString} lng_hy "Вірменська (hy)"
+${LangFileString} lng_id "Індонезійська (id)"
+${LangFileString} lng_is "ісландська (is)"
+${LangFileString} lng_it "Італійська (it)"
+${LangFileString} lng_ja "Японська (ja)"
+${LangFileString} lng_km "Кхмерська (km)"
+${LangFileString} lng_kn "Каннада (kn)"
+${LangFileString} lng_ko "Корейська (ko)"
+${LangFileString} lng_kok "Конканська (kok)"
+${LangFileString} lng_kok@latin "Конканська (латиниця) (sr@latin)"
+${LangFileString} lng_ks@aran "Кашмірська, записана персько-арабською писемністю (ks@aran)"
+${LangFileString} lng_ks@deva "Кашмірська, записана писемністю деванагарі (ks@deva)"
+${LangFileString} lng_lt "Литовська (lt)"
+${LangFileString} lng_lv "Латвійська (lv)"
+${LangFileString} lng_mai "Майтілі (mai)"
+${LangFileString} lng_mk "Македонська (mk)"
+${LangFileString} lng_ml "Малаялам (ml)"
+${LangFileString} lng_mn "Монгольська (mn)"
+${LangFileString} lng_mni "Маніпурі (mni)"
+${LangFileString} lng_mni@beng "Маніпурі, записана бенгальською писемністю (mni@beng)"
+${LangFileString} lng_mr "Маратійська (gu)"
+${LangFileString} lng_nb "Норвезька (букмол) (nb)"
+${LangFileString} lng_ne "Непальська (ne)"
+${LangFileString} lng_nl "Голландська (nl)"
+${LangFileString} lng_nn "Норвезька (нюноршк) (nn)"
+${LangFileString} lng_or "Орія (or)"
+${LangFileString} lng_pa "Пенджабі (pa)"
+${LangFileString} lng_pl "Польська (pl)"
+${LangFileString} lng_pt "Португальська (pt)"
+${LangFileString} lng_pt_BR "Португальська бразильська (pt_BR)"
+${LangFileString} lng_ro "Румунська (ro)"
+${LangFileString} lng_ru "Російська (ru)"
+${LangFileString} lng_rw "Руандійська (rw)"
+${LangFileString} lng_sa "Санскрит (sa)"
+${LangFileString} lng_sat "Санталі (it)"
+${LangFileString} lng_sat@deva "Санталі, записана писемністю деванагарі (sat@deva)"
+${LangFileString} lng_sd "Сіндхська (sd)"
+${LangFileString} lng_sd@deva "Сіндхська, записана писемністю деванагарі (sd@deva)"
+${LangFileString} lng_sk "Словацька (sk)"
+${LangFileString} lng_sl "Словенська (sl)"
+${LangFileString} lng_sq "Албанська (sq)"
+${LangFileString} lng_sr "Сербська (sr)"
+${LangFileString} lng_sr@latin "Сербська (латиниця) (sr@latin)"
+${LangFileString} lng_sv "Шведська (sv)"
+${LangFileString} lng_ta "Тамільська (ta)"
+${LangFileString} lng_te "Телугу (te)"
+${LangFileString} lng_th "Тайська (th)"
+${LangFileString} lng_tr "Турецька (tr)"
+${LangFileString} lng_uk "Українська (uk)"
+${LangFileString} lng_ur "Урду (ur)"
+${LangFileString} lng_vi "В'єтнамська (vi)"
+${LangFileString} lng_zh_CN "Китайська/Китай (zh_CN)"
+${LangFileString} lng_zh_TW "Китайська/Тайвань (zh_TW)"
diff --git a/packaging/win32/languages/_language_lists.py b/packaging/win32/languages/_language_lists.py
new file mode 100644
index 000000000..9ca0234b6
--- /dev/null
+++ b/packaging/win32/languages/_language_lists.py
@@ -0,0 +1,79 @@
+# use this to update the translated language strings in the *_languageNames.nsh files
+# translated language names are extracted from the .po files in the /po directory
+
+from __future__ import print_function
+from __future__ import unicode_literals # make all literals unicode strings by default (even in Python 2)
+
+import os
+import re
+import sys
+from io import open # needed for support of encoding parameter in Python 2
+
+from _polib import pofile
+
+
+# get the list of available Inkscape UI translations (by parsing inkscape-preferences.cpp)
+sys.path.append('../../wix/')
+from helpers import get_inkscape_locales_and_names
+inkscape_locales = get_inkscape_locales_and_names()
+
+# get the list of translations offered in the installer (by parsing _language_lists.nsh)
+re_installer_locales = re.compile(r'!macro INKSCAPE_TRANSLATIONS _MACRONAME\n(.+?)!macroend', re.DOTALL)
+re_installer_locale = re.compile(r'[ \t]+!insertmacro \${_MACRONAME}[ \t]+([\w]+)[ \t]+([\w@]+)\n')
+with open('_language_lists.nsh', 'r') as f:
+ installer_locales = re.search(re_installer_locales, f.read())
+if installer_locales:
+ installer_locales = re.finditer(re_installer_locale, installer_locales.group(1))
+ if installer_locales:
+ installer_locales = {
+ installer_locale.group(2): installer_locale.group(1) for installer_locale in installer_locales
+ }
+if not installer_locales:
+ print("Could not get the list of Inkscape translations from _language_lists.nsh")
+ sys.exit(1)
+installer_locales['en'] = 'English'
+
+
+# check if the lists are in sync
+for installer_locale in installer_locales:
+ if installer_locale not in inkscape_locales:
+ print(
+ "Error: Locale '" + installer_locale +
+ "' is present in '_language_lists.nsh' but is not a selectable Inkscape translation!"
+ )
+ sys.exit(1)
+for inkscape_locale in inkscape_locales:
+ if inkscape_locale not in installer_locales:
+ print(
+ "Warning: Locale '" + inkscape_locale +
+ "' is a selectable Inkscape translation but not present in '_language_lists.nsh'\n" +
+ " You should consider adding it."
+ )
+
+
+# extract translation names from .po files for locales offered in the installer
+for locale in sorted(installer_locales):
+ if os.path.isfile(installer_locales[locale] + '.nsh'):
+ print("Getting translation names for " + inkscape_locales[locale])
+ filename = installer_locales[locale] + '_languageNames.nsh'
+ with open(filename, 'w', encoding='utf-8', newline='\n') as f:
+ f.write(
+ "### " + inkscape_locales[locale] + " translations for language names\n" +
+ "# This file has been automatically created by '" + __file__ + "', do not edit it manually!\n"
+ "# Strings that should be translated are in '" + installer_locales[locale] + ".nsh'\n")
+ if locale is 'en':
+ for locale in sorted(installer_locales):
+ locale_name = inkscape_locales[locale]
+ f.write('${LangFileString} lng_' + locale + ' ')
+ f.write('"' + locale_name + '"\n')
+ else:
+ po_filename = '../../../po/' + locale + '.po'
+ po = pofile(po_filename)
+ for locale in sorted(installer_locales):
+ po_entry = po.find(inkscape_locales[locale])
+ if po_entry.translated():
+ locale_name = po_entry.msgstr
+ else:
+ locale_name = inkscape_locales[locale]
+ f.write('${LangFileString} lng_' + locale + ' ')
+ f.write('"' + locale_name + '"\n')
diff --git a/packaging/win32/languages/_polib.py b/packaging/win32/languages/_polib.py
new file mode 100644
index 000000000..5fc4d82b2
--- /dev/null
+++ b/packaging/win32/languages/_polib.py
@@ -0,0 +1,1870 @@
+# -* coding: utf-8 -*-
+#
+# License: MIT
+#
+# Copyright (c) 2006-2015 David Jean Louis.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+#
+# vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4:
+
+"""
+**polib** allows you to manipulate, create, modify gettext files (pot, po and
+mo files). You can load existing files, iterate through it's entries, add,
+modify entries, comments or metadata, etc. or create new po files from scratch.
+
+**polib** provides a simple and pythonic API via the :func:`~polib.pofile` and
+:func:`~polib.mofile` convenience functions.
+"""
+
+__author__ = 'David Jean Louis <izimobil@gmail.com>'
+__version__ = '1.0.8'
+__all__ = ['pofile', 'POFile', 'POEntry', 'mofile', 'MOFile', 'MOEntry',
+ 'default_encoding', 'escape', 'unescape', 'detect_encoding', ]
+
+import array
+import codecs
+import os
+import re
+import struct
+import sys
+import textwrap
+
+try:
+ import io
+except ImportError:
+ # replacement of io.open() for python < 2.6
+ # we use codecs instead
+ class io(object):
+ @staticmethod
+ def open(fpath, mode='r', encoding=None):
+ return codecs.open(fpath, mode, encoding)
+
+
+# the default encoding to use when encoding cannot be detected
+default_encoding = 'utf-8'
+
+# python 2/3 compatibility helpers {{{
+
+
+if sys.version_info[:2] < (3, 0):
+ PY3 = False
+ text_type = unicode
+
+ def b(s):
+ return s
+
+ def u(s):
+ return unicode(s, "unicode_escape")
+
+else:
+ PY3 = True
+ text_type = str
+
+ def b(s):
+ return s.encode("latin-1")
+
+ def u(s):
+ return s
+# }}}
+# _pofile_or_mofile {{{
+
+
+def _pofile_or_mofile(f, type, **kwargs):
+ """
+ Internal function used by :func:`polib.pofile` and :func:`polib.mofile` to
+ honor the DRY concept.
+ """
+ # get the file encoding
+ enc = kwargs.get('encoding')
+ if enc is None:
+ enc = detect_encoding(f, type == 'mofile')
+
+ # parse the file
+ kls = type == 'pofile' and _POFileParser or _MOFileParser
+ parser = kls(
+ f,
+ encoding=enc,
+ check_for_duplicates=kwargs.get('check_for_duplicates', False),
+ klass=kwargs.get('klass')
+ )
+ instance = parser.parse()
+ instance.wrapwidth = kwargs.get('wrapwidth', 78)
+ return instance
+# }}}
+# _is_file {{{
+
+
+def _is_file(filename_or_contents):
+ """
+ Safely returns the value of os.path.exists(filename_or_contents).
+
+ Arguments:
+
+ ``filename_or_contents``
+ either a filename, or a string holding the contents of some file.
+ In the latter case, this function will always return False.
+ """
+ try:
+ return os.path.exists(filename_or_contents)
+ except (ValueError, UnicodeEncodeError):
+ return False
+# }}}
+# function pofile() {{{
+
+
+def pofile(pofile, **kwargs):
+ """
+ Convenience function that parses the po or pot file ``pofile`` and returns
+ a :class:`~polib.POFile` instance.
+
+ Arguments:
+
+ ``pofile``
+ string, full or relative path to the po/pot file or its content (data).
+
+ ``wrapwidth``
+ integer, the wrap width, only useful when the ``-w`` option was passed
+ to xgettext (optional, default: ``78``).
+
+ ``encoding``
+ string, the encoding to use (e.g. "utf-8") (default: ``None``, the
+ encoding will be auto-detected).
+
+ ``check_for_duplicates``
+ whether to check for duplicate entries when adding entries to the
+ file (optional, default: ``False``).
+
+ ``klass``
+ class which is used to instantiate the return value (optional,
+ default: ``None``, the return value with be a :class:`~polib.POFile`
+ instance).
+ """
+ return _pofile_or_mofile(pofile, 'pofile', **kwargs)
+# }}}
+# function mofile() {{{
+
+
+def mofile(mofile, **kwargs):
+ """
+ Convenience function that parses the mo file ``mofile`` and returns a
+ :class:`~polib.MOFile` instance.
+
+ Arguments:
+
+ ``mofile``
+ string, full or relative path to the mo file or its content (data).
+
+ ``wrapwidth``
+ integer, the wrap width, only useful when the ``-w`` option was passed
+ to xgettext to generate the po file that was used to format the mo file
+ (optional, default: ``78``).
+
+ ``encoding``
+ string, the encoding to use (e.g. "utf-8") (default: ``None``, the
+ encoding will be auto-detected).
+
+ ``check_for_duplicates``
+ whether to check for duplicate entries when adding entries to the
+ file (optional, default: ``False``).
+
+ ``klass``
+ class which is used to instantiate the return value (optional,
+ default: ``None``, the return value with be a :class:`~polib.POFile`
+ instance).
+ """
+ return _pofile_or_mofile(mofile, 'mofile', **kwargs)
+# }}}
+# function detect_encoding() {{{
+
+
+def detect_encoding(file, binary_mode=False):
+ """
+ Try to detect the encoding used by the ``file``. The ``file`` argument can
+ be a PO or MO file path or a string containing the contents of the file.
+ If the encoding cannot be detected, the function will return the value of
+ ``default_encoding``.
+
+ Arguments:
+
+ ``file``
+ string, full or relative path to the po/mo file or its content.
+
+ ``binary_mode``
+ boolean, set this to True if ``file`` is a mo file.
+ """
+ PATTERN = r'"?Content-Type:.+? charset=([\w_\-:\.]+)'
+ rxt = re.compile(u(PATTERN))
+ rxb = re.compile(b(PATTERN))
+
+ def charset_exists(charset):
+ """Check whether ``charset`` is valid or not."""
+ try:
+ codecs.lookup(charset)
+ except LookupError:
+ return False
+ return True
+
+ if not _is_file(file):
+ match = rxt.search(file)
+ if match:
+ enc = match.group(1).strip()
+ if charset_exists(enc):
+ return enc
+ else:
+ # For PY3, always treat as binary
+ if binary_mode or PY3:
+ mode = 'rb'
+ rx = rxb
+ else:
+ mode = 'r'
+ rx = rxt
+ f = open(file, mode)
+ for l in f.readlines():
+ match = rx.search(l)
+ if match:
+ f.close()
+ enc = match.group(1).strip()
+ if not isinstance(enc, text_type):
+ enc = enc.decode('utf-8')
+ if charset_exists(enc):
+ return enc
+ f.close()
+ return default_encoding
+# }}}
+# function escape() {{{
+
+
+def escape(st):
+ """
+ Escapes the characters ``\\\\``, ``\\t``, ``\\n``, ``\\r`` and ``"`` in
+ the given string ``st`` and returns it.
+ """
+ return st.replace('\\', r'\\')\
+ .replace('\t', r'\t')\
+ .replace('\r', r'\r')\
+ .replace('\n', r'\n')\
+ .replace('\"', r'\"')
+# }}}
+# function unescape() {{{
+
+
+def unescape(st):
+ """
+ Unescapes the characters ``\\\\``, ``\\t``, ``\\n``, ``\\r`` and ``"`` in
+ the given string ``st`` and returns it.
+ """
+ def unescape_repl(m):
+ m = m.group(1)
+ if m == 'n':
+ return '\n'
+ if m == 't':
+ return '\t'
+ if m == 'r':
+ return '\r'
+ if m == '\\':
+ return '\\'
+ return m # handles escaped double quote
+ return re.sub(r'\\(\\|n|t|r|")', unescape_repl, st)
+# }}}
+# function natural_sort() {{{
+
+
+def natural_sort(lst):
+ """
+ Sort naturally the given list.
+ Credits: http://stackoverflow.com/a/4836734
+ """
+ convert = lambda text: int(text) if text.isdigit() else text.lower()
+ alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ]
+ return sorted(lst, key = alphanum_key)
+# }}}
+# class _BaseFile {{{
+
+
+class _BaseFile(list):
+ """
+ Common base class for the :class:`~polib.POFile` and :class:`~polib.MOFile`
+ classes. This class should **not** be instantiated directly.
+ """
+
+ def __init__(self, *args, **kwargs):
+ """
+ Constructor, accepts the following keyword arguments:
+
+ ``pofile``
+ string, the path to the po or mo file, or its content as a string.
+
+ ``wrapwidth``
+ integer, the wrap width, only useful when the ``-w`` option was
+ passed to xgettext (optional, default: ``78``).
+
+ ``encoding``
+ string, the encoding to use, defaults to ``default_encoding``
+ global variable (optional).
+
+ ``check_for_duplicates``
+ whether to check for duplicate entries when adding entries to the
+ file, (optional, default: ``False``).
+ """
+ list.__init__(self)
+ # the opened file handle
+ pofile = kwargs.get('pofile', None)
+ if pofile and _is_file(pofile):
+ self.fpath = pofile
+ else:
+ self.fpath = kwargs.get('fpath')
+ # the width at which lines should be wrapped
+ self.wrapwidth = kwargs.get('wrapwidth', 78)
+ # the file encoding
+ self.encoding = kwargs.get('encoding', default_encoding)
+ # whether to check for duplicate entries or not
+ self.check_for_duplicates = kwargs.get('check_for_duplicates', False)
+ # header
+ self.header = ''
+ # both po and mo files have metadata
+ self.metadata = {}
+ self.metadata_is_fuzzy = 0
+
+ def __unicode__(self):
+ """
+ Returns the unicode representation of the file.
+ """
+ ret = []
+ entries = [self.metadata_as_entry()] + \
+ [e for e in self if not e.obsolete]
+ for entry in entries:
+ ret.append(entry.__unicode__(self.wrapwidth))
+ for entry in self.obsolete_entries():
+ ret.append(entry.__unicode__(self.wrapwidth))
+ ret = u('\n').join(ret)
+
+ assert isinstance(ret, text_type)
+ #if type(ret) != text_type:
+ # return unicode(ret, self.encoding)
+ return ret
+
+ if PY3:
+ def __str__(self):
+ return self.__unicode__()
+ else:
+ def __str__(self):
+ """
+ Returns the string representation of the file.
+ """
+ return unicode(self).encode(self.encoding)
+
+ def __contains__(self, entry):
+ """
+ Overridden ``list`` method to implement the membership test (in and
+ not in).
+ The method considers that an entry is in the file if it finds an entry
+ that has the same msgid (the test is **case sensitive**) and the same
+ msgctxt (or none for both entries).
+
+ Argument:
+
+ ``entry``
+ an instance of :class:`~polib._BaseEntry`.
+ """
+ return self.find(entry.msgid, by='msgid', msgctxt=entry.msgctxt) \
+ is not None
+
+ def __eq__(self, other):
+ return str(self) == str(other)
+
+ def append(self, entry):
+ """
+ Overridden method to check for duplicates entries, if a user tries to
+ add an entry that is already in the file, the method will raise a
+ ``ValueError`` exception.
+
+ Argument:
+
+ ``entry``
+ an instance of :class:`~polib._BaseEntry`.
+ """
+ # check_for_duplicates may not be defined (yet) when unpickling.
+ # But if pickling, we never want to check for duplicates anyway.
+ if getattr(self, 'check_for_duplicates', False) and entry in self:
+ raise ValueError('Entry "%s" already exists' % entry.msgid)
+ super(_BaseFile, self).append(entry)
+
+ def insert(self, index, entry):
+ """
+ Overridden method to check for duplicates entries, if a user tries to
+ add an entry that is already in the file, the method will raise a
+ ``ValueError`` exception.
+
+ Arguments:
+
+ ``index``
+ index at which the entry should be inserted.
+
+ ``entry``
+ an instance of :class:`~polib._BaseEntry`.
+ """
+ if self.check_for_duplicates and entry in self:
+ raise ValueError('Entry "%s" already exists' % entry.msgid)
+ super(_BaseFile, self).insert(index, entry)
+
+ def metadata_as_entry(self):
+ """
+ Returns the file metadata as a :class:`~polib.POFile` instance.
+ """
+ e = POEntry(msgid='')
+ mdata = self.ordered_metadata()
+ if mdata:
+ strs = []
+ for name, value in mdata:
+ # Strip whitespace off each line in a multi-line entry
+ strs.append('%s: %s' % (name, value))
+ e.msgstr = '\n'.join(strs) + '\n'
+ if self.metadata_is_fuzzy:
+ e.flags.append('fuzzy')
+ return e
+
+ def save(self, fpath=None, repr_method='__unicode__'):
+ """
+ Saves the po file to ``fpath``.
+ If it is an existing file and no ``fpath`` is provided, then the
+ existing file is rewritten with the modified data.
+
+ Keyword arguments:
+
+ ``fpath``
+ string, full or relative path to the file.
+
+ ``repr_method``
+ string, the method to use for output.
+ """
+ if self.fpath is None and fpath is None:
+ raise IOError('You must provide a file path to save() method')
+ contents = getattr(self, repr_method)()
+ if fpath is None:
+ fpath = self.fpath
+ if repr_method == 'to_binary':
+ fhandle = open(fpath, 'wb')
+ else:
+ fhandle = io.open(fpath, 'w', encoding=self.encoding)
+ if not isinstance(contents, text_type):
+ contents = contents.decode(self.encoding)
+ fhandle.write(contents)
+ fhandle.close()
+ # set the file path if not set
+ if self.fpath is None and fpath:
+ self.fpath = fpath
+
+ def find(self, st, by='msgid', include_obsolete_entries=False,
+ msgctxt=False):
+ """
+ Find the entry which msgid (or property identified by the ``by``
+ argument) matches the string ``st``.
+
+ Keyword arguments:
+
+ ``st``
+ string, the string to search for.
+
+ ``by``
+ string, the property to use for comparison (default: ``msgid``).
+
+ ``include_obsolete_entries``
+ boolean, whether to also search in entries that are obsolete.
+
+ ``msgctxt``
+ string, allows specifying a specific message context for the
+ search.
+ """
+ if include_obsolete_entries:
+ entries = self[:]
+ else:
+ entries = [e for e in self if not e.obsolete]
+ for e in entries:
+ if getattr(e, by) == st:
+ if msgctxt is not False and e.msgctxt != msgctxt:
+ continue
+ return e
+ return None
+
+ def ordered_metadata(self):
+ """
+ Convenience method that returns an ordered version of the metadata
+ dictionary. The return value is list of tuples (metadata name,
+ metadata_value).
+ """
+ # copy the dict first
+ metadata = self.metadata.copy()
+ data_order = [
+ 'Project-Id-Version',
+ 'Report-Msgid-Bugs-To',
+ 'POT-Creation-Date',
+ 'PO-Revision-Date',
+ 'Last-Translator',
+ 'Language-Team',
+ 'Language',
+ 'MIME-Version',
+ 'Content-Type',
+ 'Content-Transfer-Encoding',
+ 'Plural-Forms'
+ ]
+ ordered_data = []
+ for data in data_order:
+ try:
+ value = metadata.pop(data)
+ ordered_data.append((data, value))
+ except KeyError:
+ pass
+ # the rest of the metadata will be alphabetically ordered since there
+ # are no specs for this AFAIK
+ for data in natural_sort(metadata.keys()):
+ value = metadata[data]
+ ordered_data.append((data, value))
+ return ordered_data
+
+ def to_binary(self):
+ """
+ Return the binary representation of the file.
+ """
+ offsets = []
+ entries = self.translated_entries()
+
+ # the keys are sorted in the .mo file
+ def cmp(_self, other):
+ # msgfmt compares entries with msgctxt if it exists
+ self_msgid = _self.msgctxt and _self.msgctxt or _self.msgid
+ other_msgid = other.msgctxt and other.msgctxt or other.msgid
+ if self_msgid > other_msgid:
+ return 1
+ elif self_msgid < other_msgid:
+ return -1
+ else:
+ return 0
+ # add metadata entry
+ entries.sort(key=lambda o: o.msgctxt or o.msgid)
+ mentry = self.metadata_as_entry()
+ #mentry.msgstr = mentry.msgstr.replace('\\n', '').lstrip()
+ entries = [mentry] + entries
+ entries_len = len(entries)
+ ids, strs = b(''), b('')
+ for e in entries:
+ # For each string, we need size and file offset. Each string is
+ # NUL terminated; the NUL does not count into the size.
+ msgid = b('')
+ if e.msgctxt:
+ # Contexts are stored by storing the concatenation of the
+ # context, a <EOT> byte, and the original string
+ msgid = self._encode(e.msgctxt + '\4')
+ if e.msgid_plural:
+ msgstr = []
+ for index in sorted(e.msgstr_plural.keys()):
+ msgstr.append(e.msgstr_plural[index])
+ msgid += self._encode(e.msgid + '\0' + e.msgid_plural)
+ msgstr = self._encode('\0'.join(msgstr))
+ else:
+ msgid += self._encode(e.msgid)
+ msgstr = self._encode(e.msgstr)
+ offsets.append((len(ids), len(msgid), len(strs), len(msgstr)))
+ ids += msgid + b('\0')
+ strs += msgstr + b('\0')
+
+ # The header is 7 32-bit unsigned integers.
+ keystart = 7 * 4 + 16 * entries_len
+ # and the values start after the keys
+ valuestart = keystart + len(ids)
+ koffsets = []
+ voffsets = []
+ # The string table first has the list of keys, then the list of values.
+ # Each entry has first the size of the string, then the file offset.
+ for o1, l1, o2, l2 in offsets:
+ koffsets += [l1, o1 + keystart]
+ voffsets += [l2, o2 + valuestart]
+ offsets = koffsets + voffsets
+
+ output = struct.pack(
+ "Iiiiiii",
+ # Magic number
+ MOFile.MAGIC,
+ # Version
+ 0,
+ # number of entries
+ entries_len,
+ # start of key index
+ 7 * 4,
+ # start of value index
+ 7 * 4 + entries_len * 8,
+ # size and offset of hash table, we don't use hash tables
+ 0, keystart
+
+ )
+ if PY3 and sys.version_info.minor > 1: # python 3.2 or superior
+ output += array.array("i", offsets).tobytes()
+ else:
+ output += array.array("i", offsets).tostring()
+ output += ids
+ output += strs
+ return output
+
+ def _encode(self, mixed):
+ """
+ Encodes the given ``mixed`` argument with the file encoding if and
+ only if it's an unicode string and returns the encoded string.
+ """
+ if isinstance(mixed, text_type):
+ mixed = mixed.encode(self.encoding)
+ return mixed
+# }}}
+# class POFile {{{
+
+
+class POFile(_BaseFile):
+ """
+ Po (or Pot) file reader/writer.
+ This class inherits the :class:`~polib._BaseFile` class and, by extension,
+ the python ``list`` type.
+ """
+
+ def __unicode__(self):
+ """
+ Returns the unicode representation of the po file.
+ """
+ ret, headers = '', self.header.split('\n')
+ for header in headers:
+ if not len(header):
+ ret += "#\n"
+ elif header[:1] in [',', ':']:
+ ret += '#%s\n' % header
+ else:
+ ret += '# %s\n' % header
+
+ if not isinstance(ret, text_type):
+ ret = ret.decode(self.encoding)
+
+ return ret + _BaseFile.__unicode__(self)
+
+ def save_as_mofile(self, fpath):
+ """
+ Saves the binary representation of the file to given ``fpath``.
+
+ Keyword argument:
+
+ ``fpath``
+ string, full or relative path to the mo file.
+ """
+ _BaseFile.save(self, fpath, 'to_binary')
+
+ def percent_translated(self):
+ """
+ Convenience method that returns the percentage of translated
+ messages.
+ """
+ total = len([e for e in self if not e.obsolete])
+ if total == 0:
+ return 100
+ translated = len(self.translated_entries())
+ return int(translated * 100 / float(total))
+
+ def translated_entries(self):
+ """
+ Convenience method that returns the list of translated entries.
+ """
+ return [e for e in self if e.translated()]
+
+ def untranslated_entries(self):
+ """
+ Convenience method that returns the list of untranslated entries.
+ """
+ return [e for e in self if not e.translated() and not e.obsolete
+ and not 'fuzzy' in e.flags]
+
+ def fuzzy_entries(self):
+ """
+ Convenience method that returns the list of fuzzy entries.
+ """
+ return [e for e in self if 'fuzzy' in e.flags]
+
+ def obsolete_entries(self):
+ """
+ Convenience method that returns the list of obsolete entries.
+ """
+ return [e for e in self if e.obsolete]
+
+ def merge(self, refpot):
+ """
+ Convenience method that merges the current pofile with the pot file
+ provided. It behaves exactly as the gettext msgmerge utility:
+
+ * comments of this file will be preserved, but extracted comments and
+ occurrences will be discarded;
+ * any translations or comments in the file will be discarded, however,
+ dot comments and file positions will be preserved;
+ * the fuzzy flags are preserved.
+
+ Keyword argument:
+
+ ``refpot``
+ object POFile, the reference catalog.
+ """
+ # Store entries in dict/set for faster access
+ self_entries = dict((entry.msgid, entry) for entry in self)
+ refpot_msgids = set(entry.msgid for entry in refpot)
+ # Merge entries that are in the refpot
+ for entry in refpot:
+ e = self_entries.get(entry.msgid)
+ if e is None:
+ e = POEntry()
+ self.append(e)
+ e.merge(entry)
+ # ok, now we must "obsolete" entries that are not in the refpot anymore
+ for entry in self:
+ if entry.msgid not in refpot_msgids:
+ entry.obsolete = True
+# }}}
+# class MOFile {{{
+
+
+class MOFile(_BaseFile):
+ """
+ Mo file reader/writer.
+ This class inherits the :class:`~polib._BaseFile` class and, by
+ extension, the python ``list`` type.
+ """
+ MAGIC = 0x950412de
+ MAGIC_SWAPPED = 0xde120495
+
+ def __init__(self, *args, **kwargs):
+ """
+ Constructor, accepts all keywords arguments accepted by
+ :class:`~polib._BaseFile` class.
+ """
+ _BaseFile.__init__(self, *args, **kwargs)
+ self.magic_number = None
+ self.version = 0
+
+ def save_as_pofile(self, fpath):
+ """
+ Saves the mofile as a pofile to ``fpath``.
+
+ Keyword argument:
+
+ ``fpath``
+ string, full or relative path to the file.
+ """
+ _BaseFile.save(self, fpath)
+
+ def save(self, fpath=None):
+ """
+ Saves the mofile to ``fpath``.
+
+ Keyword argument:
+
+ ``fpath``
+ string, full or relative path to the file.
+ """
+ _BaseFile.save(self, fpath, 'to_binary')
+
+ def percent_translated(self):
+ """
+ Convenience method to keep the same interface with POFile instances.
+ """
+ return 100
+
+ def translated_entries(self):
+ """
+ Convenience method to keep the same interface with POFile instances.
+ """
+ return self
+
+ def untranslated_entries(self):
+ """
+ Convenience method to keep the same interface with POFile instances.
+ """
+ return []
+
+ def fuzzy_entries(self):
+ """
+ Convenience method to keep the same interface with POFile instances.
+ """
+ return []
+
+ def obsolete_entries(self):
+ """
+ Convenience method to keep the same interface with POFile instances.
+ """
+ return []
+# }}}
+# class _BaseEntry {{{
+
+
+class _BaseEntry(object):
+ """
+ Base class for :class:`~polib.POEntry` and :class:`~polib.MOEntry` classes.
+ This class should **not** be instantiated directly.
+ """
+
+ def __init__(self, *args, **kwargs):
+ """
+ Constructor, accepts the following keyword arguments:
+
+ ``msgid``
+ string, the entry msgid.
+
+ ``msgstr``
+ string, the entry msgstr.
+
+ ``msgid_plural``
+ string, the entry msgid_plural.
+
+ ``msgstr_plural``
+ list, the entry msgstr_plural lines.
+
+ ``msgctxt``
+ string, the entry context (msgctxt).
+
+ ``obsolete``
+ bool, whether the entry is "obsolete" or not.
+
+ ``encoding``
+ string, the encoding to use, defaults to ``default_encoding``
+ global variable (optional).
+ """
+ self.msgid = kwargs.get('msgid', '')
+ self.msgstr = kwargs.get('msgstr', '')
+ self.msgid_plural = kwargs.get('msgid_plural', '')
+ self.msgstr_plural = kwargs.get('msgstr_plural', {})
+ self.msgctxt = kwargs.get('msgctxt', None)
+ self.obsolete = kwargs.get('obsolete', False)
+ self.encoding = kwargs.get('encoding', default_encoding)
+
+ def __unicode__(self, wrapwidth=78):
+ """
+ Returns the unicode representation of the entry.
+ """
+ if self.obsolete:
+ delflag = '#~ '
+ else:
+ delflag = ''
+ ret = []
+ # write the msgctxt if any
+ if self.msgctxt is not None:
+ ret += self._str_field("msgctxt", delflag, "", self.msgctxt,
+ wrapwidth)
+ # write the msgid
+ ret += self._str_field("msgid", delflag, "", self.msgid, wrapwidth)
+ # write the msgid_plural if any
+ if self.msgid_plural:
+ ret += self._str_field("msgid_plural", delflag, "",
+ self.msgid_plural, wrapwidth)
+ if self.msgstr_plural:
+ # write the msgstr_plural if any
+ msgstrs = self.msgstr_plural
+ keys = list(msgstrs)
+ keys.sort()
+ for index in keys:
+ msgstr = msgstrs[index]
+ plural_index = '[%s]' % index
+ ret += self._str_field("msgstr", delflag, plural_index, msgstr,
+ wrapwidth)
+ else:
+ # otherwise write the msgstr
+ ret += self._str_field("msgstr", delflag, "", self.msgstr,
+ wrapwidth)
+ ret.append('')
+ ret = u('\n').join(ret)
+ return ret
+
+ if PY3:
+ def __str__(self):
+ return self.__unicode__()
+ else:
+ def __str__(self):
+ """
+ Returns the string representation of the entry.
+ """
+ return unicode(self).encode(self.encoding)
+
+ def __eq__(self, other):
+ return str(self) == str(other)
+
+ def _str_field(self, fieldname, delflag, plural_index, field,
+ wrapwidth=78):
+ lines = field.splitlines(True)
+ if len(lines) > 1:
+ lines = [''] + lines # start with initial empty line
+ else:
+ escaped_field = escape(field)
+ specialchars_count = 0
+ for c in ['\\', '\n', '\r', '\t', '"']:
+ specialchars_count += field.count(c)
+ # comparison must take into account fieldname length + one space
+ # + 2 quotes (eg. msgid "<string>")
+ flength = len(fieldname) + 3
+ if plural_index:
+ flength += len(plural_index)
+ real_wrapwidth = wrapwidth - flength + specialchars_count
+ if wrapwidth > 0 and len(field) > real_wrapwidth:
+ # Wrap the line but take field name into account
+ lines = [''] + [unescape(item) for item in wrap(
+ escaped_field,
+ wrapwidth - 2, # 2 for quotes ""
+ drop_whitespace=False,
+ break_long_words=False
+ )]
+ else:
+ lines = [field]
+ if fieldname.startswith('previous_'):
+ # quick and dirty trick to get the real field name
+ fieldname = fieldname[9:]
+
+ ret = ['%s%s%s "%s"' % (delflag, fieldname, plural_index,
+ escape(lines.pop(0)))]
+ for line in lines:
+ ret.append('%s"%s"' % (delflag, escape(line)))
+ return ret
+# }}}
+# class POEntry {{{
+
+
+class POEntry(_BaseEntry):
+ """
+ Represents a po file entry.
+ """
+
+ def __init__(self, *args, **kwargs):
+ """
+ Constructor, accepts the following keyword arguments:
+
+ ``comment``
+ string, the entry comment.
+
+ ``tcomment``
+ string, the entry translator comment.
+
+ ``occurrences``
+ list, the entry occurrences.
+
+ ``flags``
+ list, the entry flags.
+
+ ``previous_msgctxt``
+ string, the entry previous context.
+
+ ``previous_msgid``
+ string, the entry previous msgid.
+
+ ``previous_msgid_plural``
+ string, the entry previous msgid_plural.
+
+ ``linenum``
+ integer, the line number of the entry
+ """
+ _BaseEntry.__init__(self, *args, **kwargs)
+ self.comment = kwargs.get('comment', '')
+ self.tcomment = kwargs.get('tcomment', '')
+ self.occurrences = kwargs.get('occurrences', [])
+ self.flags = kwargs.get('flags', [])
+ self.previous_msgctxt = kwargs.get('previous_msgctxt', None)
+ self.previous_msgid = kwargs.get('previous_msgid', None)
+ self.previous_msgid_plural = kwargs.get('previous_msgid_plural', None)
+ self.linenum = kwargs.get('linenum', None)
+
+ def __unicode__(self, wrapwidth=78):
+ """
+ Returns the unicode representation of the entry.
+ """
+ ret = []
+ # comments first, if any (with text wrapping as xgettext does)
+ if self.obsolete:
+ comments = [('tcomment', '# ')]
+ else:
+ comments = [('comment', '#. '), ('tcomment', '# ')]
+ for c in comments:
+ val = getattr(self, c[0])
+ if val:
+ for comment in val.split('\n'):
+ if wrapwidth > 0 and len(comment) + len(c[1]) > wrapwidth:
+ ret += wrap(
+ comment,
+ wrapwidth,
+ initial_indent=c[1],
+ subsequent_indent=c[1],
+ break_long_words=False
+ )
+ else:
+ ret.append('%s%s' % (c[1], comment))
+
+ # occurrences (with text wrapping as xgettext does)
+ if not self.obsolete and self.occurrences:
+ filelist = []
+ for fpath, lineno in self.occurrences:
+ if lineno:
+ filelist.append('%s:%s' % (fpath, lineno))
+ else:
+ filelist.append(fpath)
+ filestr = ' '.join(filelist)
+ if wrapwidth > 0 and len(filestr) + 3 > wrapwidth:
+ # textwrap split words that contain hyphen, this is not
+ # what we want for filenames, so the dirty hack is to
+ # temporally replace hyphens with a char that a file cannot
+ # contain, like "*"
+ ret += [l.replace('*', '-') for l in wrap(
+ filestr.replace('-', '*'),
+ wrapwidth,
+ initial_indent='#: ',
+ subsequent_indent='#: ',
+ break_long_words=False
+ )]
+ else:
+ ret.append('#: ' + filestr)
+
+ # flags (TODO: wrapping ?)
+ if self.flags:
+ ret.append('#, %s' % ', '.join(self.flags))
+
+ # previous context and previous msgid/msgid_plural
+ fields = ['previous_msgctxt', 'previous_msgid',
+ 'previous_msgid_plural']
+ if self.obsolete:
+ prefix = "#~| "
+ else:
+ prefix = "#| "
+ for f in fields:
+ val = getattr(self, f)
+ if val:
+ ret += self._str_field(f, prefix, "", val, wrapwidth)
+
+ ret.append(_BaseEntry.__unicode__(self, wrapwidth))
+ ret = u('\n').join(ret)
+ return ret
+
+ def __cmp__(self, other):
+ """
+ Called by comparison operations if rich comparison is not defined.
+ """
+
+ # First: Obsolete test
+ if self.obsolete != other.obsolete:
+ if self.obsolete:
+ return -1
+ else:
+ return 1
+ # Work on a copy to protect original
+ occ1 = sorted(self.occurrences[:])
+ occ2 = sorted(other.occurrences[:])
+ pos = 0
+ for entry1 in occ1:
+ try:
+ entry2 = occ2[pos]
+ except IndexError:
+ return 1
+ pos = pos + 1
+ if entry1[0] != entry2[0]:
+ if entry1[0] > entry2[0]:
+ return 1
+ else:
+ return -1
+ if entry1[1] != entry2[1]:
+ if entry1[1] > entry2[1]:
+ return 1
+ else:
+ return -1
+ # Compare msgid_plural if set
+ if self.msgid_plural:
+ if not other.msgid_plural:
+ return 1
+ for pos in self.msgid_plural:
+ if pos not in other.msgid_plural:
+ return 1
+ if self.msgid_plural[pos] > other.msgid_plural[pos]:
+ return 1
+ if self.msgid_plural[pos] < other.msgid_plural[pos]:
+ return -1
+ # Finally: Compare message ID
+ if self.msgid > other.msgid:
+ return 1
+ elif self.msgid < other.msgid:
+ return -1
+ return 0
+
+ def __gt__(self, other):
+ return self.__cmp__(other) > 0
+
+ def __lt__(self, other):
+ return self.__cmp__(other) < 0
+
+ def __ge__(self, other):
+ return self.__cmp__(other) >= 0
+
+ def __le__(self, other):
+ return self.__cmp__(other) <= 0
+
+ def __eq__(self, other):
+ return self.__cmp__(other) == 0
+
+ def __ne__(self, other):
+ return self.__cmp__(other) != 0
+
+ def translated(self):
+ """
+ Returns ``True`` if the entry has been translated or ``False``
+ otherwise.
+ """
+ if self.obsolete or 'fuzzy' in self.flags:
+ return False
+ if self.msgstr != '':
+ return True
+ if self.msgstr_plural:
+ for pos in self.msgstr_plural:
+ if self.msgstr_plural[pos] == '':
+ return False
+ return True
+ return False
+
+ def merge(self, other):
+ """
+ Merge the current entry with the given pot entry.
+ """
+ self.msgid = other.msgid
+ self.msgctxt = other.msgctxt
+ self.occurrences = other.occurrences
+ self.comment = other.comment
+ fuzzy = 'fuzzy' in self.flags
+ self.flags = other.flags[:] # clone flags
+ if fuzzy:
+ self.flags.append('fuzzy')
+ self.msgid_plural = other.msgid_plural
+ self.obsolete = other.obsolete
+ self.previous_msgctxt = other.previous_msgctxt
+ self.previous_msgid = other.previous_msgid
+ self.previous_msgid_plural = other.previous_msgid_plural
+ if other.msgstr_plural:
+ for pos in other.msgstr_plural:
+ try:
+ # keep existing translation at pos if any
+ self.msgstr_plural[pos]
+ except KeyError:
+ self.msgstr_plural[pos] = ''
+
+ def __hash__(self):
+ return hash((self.msgid, self.msgstr))
+# }}}
+# class MOEntry {{{
+
+
+class MOEntry(_BaseEntry):
+ """
+ Represents a mo file entry.
+ """
+ def __init__(self, *args, **kwargs):
+ """
+ Constructor, accepts the following keyword arguments,
+ for consistency with :class:`~polib.POEntry`:
+
+ ``comment``
+ ``tcomment``
+ ``occurrences``
+ ``flags``
+ ``previous_msgctxt``
+ ``previous_msgid``
+ ``previous_msgid_plural``
+
+ Note: even though these keyword arguments are accepted,
+ they hold no real meaning in the context of MO files
+ and are simply ignored.
+ """
+ _BaseEntry.__init__(self, *args, **kwargs)
+ self.comment = ''
+ self.tcomment = ''
+ self.occurrences = []
+ self.flags = []
+ self.previous_msgctxt = None
+ self.previous_msgid = None
+ self.previous_msgid_plural = None
+
+ def __hash__(self):
+ return hash((self.msgid, self.msgstr))
+
+# }}}
+# class _POFileParser {{{
+
+
+class _POFileParser(object):
+ """
+ A finite state machine to parse efficiently and correctly po
+ file format.
+ """
+
+ def __init__(self, pofile, *args, **kwargs):
+ """
+ Constructor.
+
+ Keyword arguments:
+
+ ``pofile``
+ string, path to the po file or its content
+
+ ``encoding``
+ string, the encoding to use, defaults to ``default_encoding``
+ global variable (optional).
+
+ ``check_for_duplicates``
+ whether to check for duplicate entries when adding entries to the
+ file (optional, default: ``False``).
+ """
+ enc = kwargs.get('encoding', default_encoding)
+ if _is_file(pofile):
+ try:
+ self.fhandle = io.open(pofile, 'rt', encoding=enc)
+ except LookupError:
+ enc = default_encoding
+ self.fhandle = io.open(pofile, 'rt', encoding=enc)
+ else:
+ self.fhandle = pofile.splitlines()
+
+ klass = kwargs.get('klass')
+ if klass is None:
+ klass = POFile
+ self.instance = klass(
+ pofile=pofile,
+ encoding=enc,
+ check_for_duplicates=kwargs.get('check_for_duplicates', False)
+ )
+ self.transitions = {}
+ self.current_line = 0
+ self.current_entry = POEntry(linenum=self.current_line)
+ self.current_state = 'st'
+ self.current_token = None
+ # two memo flags used in handlers
+ self.msgstr_index = 0
+ self.entry_obsolete = 0
+ # Configure the state machine, by adding transitions.
+ # Signification of symbols:
+ # * ST: Beginning of the file (start)
+ # * HE: Header
+ # * TC: a translation comment
+ # * GC: a generated comment
+ # * OC: a file/line occurrence
+ # * FL: a flags line
+ # * CT: a message context
+ # * PC: a previous msgctxt
+ # * PM: a previous msgid
+ # * PP: a previous msgid_plural
+ # * MI: a msgid
+ # * MP: a msgid plural
+ # * MS: a msgstr
+ # * MX: a msgstr plural
+ # * MC: a msgid or msgstr continuation line
+ all = ['st', 'he', 'gc', 'oc', 'fl', 'ct', 'pc', 'pm', 'pp', 'tc',
+ 'ms', 'mp', 'mx', 'mi']
+
+ self.add('tc', ['st', 'he'], 'he')
+ self.add('tc', ['gc', 'oc', 'fl', 'tc', 'pc', 'pm', 'pp', 'ms',
+ 'mp', 'mx', 'mi'], 'tc')
+ self.add('gc', all, 'gc')
+ self.add('oc', all, 'oc')
+ self.add('fl', all, 'fl')
+ self.add('pc', all, 'pc')
+ self.add('pm', all, 'pm')
+ self.add('pp', all, 'pp')
+ self.add('ct', ['st', 'he', 'gc', 'oc', 'fl', 'tc', 'pc', 'pm',
+ 'pp', 'ms', 'mx'], 'ct')
+ self.add('mi', ['st', 'he', 'gc', 'oc', 'fl', 'ct', 'tc', 'pc',
+ 'pm', 'pp', 'ms', 'mx'], 'mi')
+ self.add('mp', ['tc', 'gc', 'pc', 'pm', 'pp', 'mi'], 'mp')
+ self.add('ms', ['mi', 'mp', 'tc'], 'ms')
+ self.add('mx', ['mi', 'mx', 'mp', 'tc'], 'mx')
+ self.add('mc', ['ct', 'mi', 'mp', 'ms', 'mx', 'pm', 'pp', 'pc'], 'mc')
+
+ def parse(self):
+ """
+ Run the state machine, parse the file line by line and call process()
+ with the current matched symbol.
+ """
+
+ keywords = {
+ 'msgctxt': 'ct',
+ 'msgid': 'mi',
+ 'msgstr': 'ms',
+ 'msgid_plural': 'mp',
+ }
+ prev_keywords = {
+ 'msgid_plural': 'pp',
+ 'msgid': 'pm',
+ 'msgctxt': 'pc',
+ }
+ tokens = []
+ for line in self.fhandle:
+ self.current_line += 1
+ line = line.strip()
+ if line == '':
+ continue
+
+ tokens = line.split(None, 2)
+ nb_tokens = len(tokens)
+
+ if tokens[0] == '#~|':
+ continue
+
+ if tokens[0] == '#~' and nb_tokens > 1:
+ line = line[3:].strip()
+ tokens = tokens[1:]
+ nb_tokens -= 1
+ self.entry_obsolete = 1
+ else:
+ self.entry_obsolete = 0
+
+ # Take care of keywords like
+ # msgid, msgid_plural, msgctxt & msgstr.
+ if tokens[0] in keywords and nb_tokens > 1:
+ line = line[len(tokens[0]):].lstrip()
+ if re.search(r'([^\\]|^)"', line[1:-1]):
+ raise IOError('Syntax error in po file %s (line %s): '
+ 'unescaped double quote found' %
+ (self.instance.fpath, self.current_line))
+ self.current_token = line
+ self.process(keywords[tokens[0]])
+ continue
+
+ self.current_token = line
+
+ if tokens[0] == '#:':
+ if nb_tokens <= 1:
+ continue
+ # we are on a occurrences line
+ self.process('oc')
+
+ elif line[:1] == '"':
+ # we are on a continuation line
+ if re.search(r'([^\\]|^)"', line[1:-1]):
+ raise IOError('Syntax error in po file %s (line %s): '
+ 'unescaped double quote found' %
+ (self.instance.fpath, self.current_line))
+ self.process('mc')
+
+ elif line[:7] == 'msgstr[':
+ # we are on a msgstr plural
+ self.process('mx')
+
+ elif tokens[0] == '#,':
+ if nb_tokens <= 1:
+ continue
+ # we are on a flags line
+ self.process('fl')
+
+ elif tokens[0] == '#' or tokens[0].startswith('##'):
+ if line == '#':
+ line += ' '
+ # we are on a translator comment line
+ self.process('tc')
+
+ elif tokens[0] == '#.':
+ if nb_tokens <= 1:
+ continue
+ # we are on a generated comment line
+ self.process('gc')
+
+ elif tokens[0] == '#|':
+ if nb_tokens <= 1:
+ raise IOError('Syntax error in po file %s (line %s)' %
+ (self.instance.fpath, self.current_line))
+
+ # Remove the marker and any whitespace right after that.
+ line = line[2:].lstrip()
+ self.current_token = line
+
+ if tokens[1].startswith('"'):
+ # Continuation of previous metadata.
+ self.process('mc')
+ continue
+
+ if nb_tokens == 2:
+ # Invalid continuation line.
+ raise IOError('Syntax error in po file %s (line %s): '
+ 'invalid continuation line' %
+ (self.instance.fpath, self.current_line))
+
+ # we are on a "previous translation" comment line,
+ if tokens[1] not in prev_keywords:
+ # Unknown keyword in previous translation comment.
+ raise IOError('Syntax error in po file %s (line %s): '
+ 'unknown keyword %s' %
+ (self.instance.fpath, self.current_line,
+ tokens[1]))
+
+ # Remove the keyword and any whitespace
+ # between it and the starting quote.
+ line = line[len(tokens[1]):].lstrip()
+ self.current_token = line
+ self.process(prev_keywords[tokens[1]])
+
+ else:
+ raise IOError('Syntax error in po file %s (line %s)' %
+ (self.instance.fpath, self.current_line))
+
+ if self.current_entry and len(tokens) > 0 and \
+ not tokens[0].startswith('#'):
+ # since entries are added when another entry is found, we must add
+ # the last entry here (only if there are lines). Trailing comments
+ # are ignored
+ self.instance.append(self.current_entry)
+
+ # before returning the instance, check if there's metadata and if
+ # so extract it in a dict
+ metadataentry = self.instance.find('')
+ if metadataentry: # metadata found
+ # remove the entry
+ self.instance.remove(metadataentry)
+ self.instance.metadata_is_fuzzy = metadataentry.flags
+ key = None
+ for msg in metadataentry.msgstr.splitlines():
+ try:
+ key, val = msg.split(':', 1)
+ self.instance.metadata[key] = val.strip()
+ except (ValueError, KeyError):
+ if key is not None:
+ self.instance.metadata[key] += '\n' + msg.strip()
+ # close opened file
+ if not isinstance(self.fhandle, list): # must be file
+ self.fhandle.close()
+ return self.instance
+
+ def add(self, symbol, states, next_state):
+ """
+ Add a transition to the state machine.
+
+ Keywords arguments:
+
+ ``symbol``
+ string, the matched token (two chars symbol).
+
+ ``states``
+ list, a list of states (two chars symbols).
+
+ ``next_state``
+ the next state the fsm will have after the action.
+ """
+ for state in states:
+ action = getattr(self, 'handle_%s' % next_state)
+ self.transitions[(symbol, state)] = (action, next_state)
+
+ def process(self, symbol):
+ """
+ Process the transition corresponding to the current state and the
+ symbol provided.
+
+ Keywords arguments:
+
+ ``symbol``
+ string, the matched token (two chars symbol).
+
+ ``linenum``
+ integer, the current line number of the parsed file.
+ """
+ try:
+ (action, state) = self.transitions[(symbol, self.current_state)]
+ if action():
+ self.current_state = state
+ except Exception:
+ raise IOError('Syntax error in po file (line %s)' %
+ self.current_line)
+
+ # state handlers
+
+ def handle_he(self):
+ """Handle a header comment."""
+ if self.instance.header != '':
+ self.instance.header += '\n'
+ self.instance.header += self.current_token[2:]
+ return 1
+
+ def handle_tc(self):
+ """Handle a translator comment."""
+ if self.current_state in ['mc', 'ms', 'mx']:
+ self.instance.append(self.current_entry)
+ self.current_entry = POEntry(linenum=self.current_line)
+ if self.current_entry.tcomment != '':
+ self.current_entry.tcomment += '\n'
+ tcomment = self.current_token.lstrip('#')
+ if tcomment.startswith(' '):
+ tcomment = tcomment[1:]
+ self.current_entry.tcomment += tcomment
+ return True
+
+ def handle_gc(self):
+ """Handle a generated comment."""
+ if self.current_state in ['mc', 'ms', 'mx']:
+ self.instance.append(self.current_entry)
+ self.current_entry = POEntry(linenum=self.current_line)
+ if self.current_entry.comment != '':
+ self.current_entry.comment += '\n'
+ self.current_entry.comment += self.current_token[3:]
+ return True
+
+ def handle_oc(self):
+ """Handle a file:num occurrence."""
+ if self.current_state in ['mc', 'ms', 'mx']:
+ self.instance.append(self.current_entry)
+ self.current_entry = POEntry(linenum=self.current_line)
+ occurrences = self.current_token[3:].split()
+ for occurrence in occurrences:
+ if occurrence != '':
+ try:
+ fil, line = occurrence.rsplit(':', 1)
+ if not line.isdigit():
+ fil = fil + line
+ line = ''
+ self.current_entry.occurrences.append((fil, line))
+ except (ValueError, AttributeError):
+ self.current_entry.occurrences.append((occurrence, ''))
+ return True
+
+ def handle_fl(self):
+ """Handle a flags line."""
+ if self.current_state in ['mc', 'ms', 'mx']:
+ self.instance.append(self.current_entry)
+ self.current_entry = POEntry(linenum=self.current_line)
+ self.current_entry.flags += [c.strip() for c in
+ self.current_token[3:].split(',')]
+ return True
+
+ def handle_pp(self):
+ """Handle a previous msgid_plural line."""
+ if self.current_state in ['mc', 'ms', 'mx']:
+ self.instance.append(self.current_entry)
+ self.current_entry = POEntry(linenum=self.current_line)
+ self.current_entry.previous_msgid_plural = \
+ unescape(self.current_token[1:-1])
+ return True
+
+ def handle_pm(self):
+ """Handle a previous msgid line."""
+ if self.current_state in ['mc', 'ms', 'mx']:
+ self.instance.append(self.current_entry)
+ self.current_entry = POEntry(linenum=self.current_line)
+ self.current_entry.previous_msgid = \
+ unescape(self.current_token[1:-1])
+ return True
+
+ def handle_pc(self):
+ """Handle a previous msgctxt line."""
+ if self.current_state in ['mc', 'ms', 'mx']:
+ self.instance.append(self.current_entry)
+ self.current_entry = POEntry(linenum=self.current_line)
+ self.current_entry.previous_msgctxt = \
+ unescape(self.current_token[1:-1])
+ return True
+
+ def handle_ct(self):
+ """Handle a msgctxt."""
+ if self.current_state in ['mc', 'ms', 'mx']:
+ self.instance.append(self.current_entry)
+ self.current_entry = POEntry(linenum=self.current_line)
+ self.current_entry.msgctxt = unescape(self.current_token[1:-1])
+ return True
+
+ def handle_mi(self):
+ """Handle a msgid."""
+ if self.current_state in ['mc', 'ms', 'mx']:
+ self.instance.append(self.current_entry)
+ self.current_entry = POEntry(linenum=self.current_line)
+ self.current_entry.obsolete = self.entry_obsolete
+ self.current_entry.msgid = unescape(self.current_token[1:-1])
+ return True
+
+ def handle_mp(self):
+ """Handle a msgid plural."""
+ self.current_entry.msgid_plural = unescape(self.current_token[1:-1])
+ return True
+
+ def handle_ms(self):
+ """Handle a msgstr."""
+ self.current_entry.msgstr = unescape(self.current_token[1:-1])
+ return True
+
+ def handle_mx(self):
+ """Handle a msgstr plural."""
+ index = self.current_token[7]
+ value = self.current_token[self.current_token.find('"') + 1:-1]
+ self.current_entry.msgstr_plural[int(index)] = unescape(value)
+ self.msgstr_index = int(index)
+ return True
+
+ def handle_mc(self):
+ """Handle a msgid or msgstr continuation line."""
+ token = unescape(self.current_token[1:-1])
+ if self.current_state == 'ct':
+ self.current_entry.msgctxt += token
+ elif self.current_state == 'mi':
+ self.current_entry.msgid += token
+ elif self.current_state == 'mp':
+ self.current_entry.msgid_plural += token
+ elif self.current_state == 'ms':
+ self.current_entry.msgstr += token
+ elif self.current_state == 'mx':
+ self.current_entry.msgstr_plural[self.msgstr_index] += token
+ elif self.current_state == 'pp':
+ self.current_entry.previous_msgid_plural += token
+ elif self.current_state == 'pm':
+ self.current_entry.previous_msgid += token
+ elif self.current_state == 'pc':
+ self.current_entry.previous_msgctxt += token
+ # don't change the current state
+ return False
+# }}}
+# class _MOFileParser {{{
+
+
+class _MOFileParser(object):
+ """
+ A class to parse binary mo files.
+ """
+
+ def __init__(self, mofile, *args, **kwargs):
+ """
+ Constructor.
+
+ Keyword arguments:
+
+ ``mofile``
+ string, path to the mo file or its content
+
+ ``encoding``
+ string, the encoding to use, defaults to ``default_encoding``
+ global variable (optional).
+
+ ``check_for_duplicates``
+ whether to check for duplicate entries when adding entries to the
+ file (optional, default: ``False``).
+ """
+ self.fhandle = open(mofile, 'rb')
+
+ klass = kwargs.get('klass')
+ if klass is None:
+ klass = MOFile
+ self.instance = klass(
+ fpath=mofile,
+ encoding=kwargs.get('encoding', default_encoding),
+ check_for_duplicates=kwargs.get('check_for_duplicates', False)
+ )
+
+ def __del__(self):
+ """
+ Make sure the file is closed, this prevents warnings on unclosed file
+ when running tests with python >= 3.2.
+ """
+ if self.fhandle:
+ self.fhandle.close()
+
+ def parse(self):
+ """
+ Build the instance with the file handle provided in the
+ constructor.
+ """
+ # parse magic number
+ magic_number = self._readbinary('<I', 4)
+ if magic_number == MOFile.MAGIC:
+ ii = '<II'
+ elif magic_number == MOFile.MAGIC_SWAPPED:
+ ii = '>II'
+ else:
+ raise IOError('Invalid mo file, magic number is incorrect !')
+ self.instance.magic_number = magic_number
+ # parse the version number and the number of strings
+ version, numofstrings = self._readbinary(ii, 8)
+ # from MO file format specs: "A program seeing an unexpected major
+ # revision number should stop reading the MO file entirely"
+ if version not in (0, 1):
+ raise IOError('Invalid mo file, unexpected major revision number')
+ self.instance.version = version
+ # original strings and translation strings hash table offset
+ msgids_hash_offset, msgstrs_hash_offset = self._readbinary(ii, 8)
+ # move to msgid hash table and read length and offset of msgids
+ self.fhandle.seek(msgids_hash_offset)
+ msgids_index = []
+ for i in range(numofstrings):
+ msgids_index.append(self._readbinary(ii, 8))
+ # move to msgstr hash table and read length and offset of msgstrs
+ self.fhandle.seek(msgstrs_hash_offset)
+ msgstrs_index = []
+ for i in range(numofstrings):
+ msgstrs_index.append(self._readbinary(ii, 8))
+ # build entries
+ encoding = self.instance.encoding
+ for i in range(numofstrings):
+ self.fhandle.seek(msgids_index[i][1])
+ msgid = self.fhandle.read(msgids_index[i][0])
+
+ self.fhandle.seek(msgstrs_index[i][1])
+ msgstr = self.fhandle.read(msgstrs_index[i][0])
+ if i == 0 and not msgid: # metadata
+ raw_metadata, metadata = msgstr.split(b('\n')), {}
+ for line in raw_metadata:
+ tokens = line.split(b(':'), 1)
+ if tokens[0] != b(''):
+ try:
+ k = tokens[0].decode(encoding)
+ v = tokens[1].decode(encoding)
+ metadata[k] = v.strip()
+ except IndexError:
+ metadata[k] = u('')
+ self.instance.metadata = metadata
+ continue
+ # test if we have a plural entry
+ msgid_tokens = msgid.split(b('\0'))
+ if len(msgid_tokens) > 1:
+ entry = self._build_entry(
+ msgid=msgid_tokens[0],
+ msgid_plural=msgid_tokens[1],
+ msgstr_plural=dict((k, v) for k, v in
+ enumerate(msgstr.split(b('\0'))))
+ )
+ else:
+ entry = self._build_entry(msgid=msgid, msgstr=msgstr)
+ self.instance.append(entry)
+ # close opened file
+ self.fhandle.close()
+ return self.instance
+
+ def _build_entry(self, msgid, msgstr=None, msgid_plural=None,
+ msgstr_plural=None):
+ msgctxt_msgid = msgid.split(b('\x04'))
+ encoding = self.instance.encoding
+ if len(msgctxt_msgid) > 1:
+ kwargs = {
+ 'msgctxt': msgctxt_msgid[0].decode(encoding),
+ 'msgid': msgctxt_msgid[1].decode(encoding),
+ }
+ else:
+ kwargs = {'msgid': msgid.decode(encoding)}
+ if msgstr:
+ kwargs['msgstr'] = msgstr.decode(encoding)
+ if msgid_plural:
+ kwargs['msgid_plural'] = msgid_plural.decode(encoding)
+ if msgstr_plural:
+ for k in msgstr_plural:
+ msgstr_plural[k] = msgstr_plural[k].decode(encoding)
+ kwargs['msgstr_plural'] = msgstr_plural
+ return MOEntry(**kwargs)
+
+ def _readbinary(self, fmt, numbytes):
+ """
+ Private method that unpack n bytes of data using format <fmt>.
+ It returns a tuple or a mixed value if the tuple length is 1.
+ """
+ bytes = self.fhandle.read(numbytes)
+ tup = struct.unpack(fmt, bytes)
+ if len(tup) == 1:
+ return tup[0]
+ return tup
+# }}}
+# class TextWrapper {{{
+
+
+class TextWrapper(textwrap.TextWrapper):
+ """
+ Subclass of textwrap.TextWrapper that backport the
+ drop_whitespace option.
+ """
+ def __init__(self, *args, **kwargs):
+ drop_whitespace = kwargs.pop('drop_whitespace', True)
+ textwrap.TextWrapper.__init__(self, *args, **kwargs)
+ self.drop_whitespace = drop_whitespace
+
+ def _wrap_chunks(self, chunks):
+ """_wrap_chunks(chunks : [string]) -> [string]
+
+ Wrap a sequence of text chunks and return a list of lines of
+ length 'self.width' or less. (If 'break_long_words' is false,
+ some lines may be longer than this.) Chunks correspond roughly
+ to words and the whitespace between them: each chunk is
+ indivisible (modulo 'break_long_words'), but a line break can
+ come between any two chunks. Chunks should not have internal
+ whitespace; ie. a chunk is either all whitespace or a "word".
+ Whitespace chunks will be removed from the beginning and end of
+ lines, but apart from that whitespace is preserved.
+ """
+ lines = []
+ if self.width <= 0:
+ raise ValueError("invalid width %r (must be > 0)" % self.width)
+
+ # Arrange in reverse order so items can be efficiently popped
+ # from a stack of chucks.
+ chunks.reverse()
+
+ while chunks:
+
+ # Start the list of chunks that will make up the current line.
+ # cur_len is just the length of all the chunks in cur_line.
+ cur_line = []
+ cur_len = 0
+
+ # Figure out which static string will prefix this line.
+ if lines:
+ indent = self.subsequent_indent
+ else:
+ indent = self.initial_indent
+
+ # Maximum width for this line.
+ width = self.width - len(indent)
+
+ # First chunk on line is whitespace -- drop it, unless this
+ # is the very beginning of the text (ie. no lines started yet).
+ if self.drop_whitespace and chunks[-1].strip() == '' and lines:
+ del chunks[-1]
+
+ while chunks:
+ l = len(chunks[-1])
+
+ # Can at least squeeze this chunk onto the current line.
+ if cur_len + l <= width:
+ cur_line.append(chunks.pop())
+ cur_len += l
+
+ # Nope, this line is full.
+ else:
+ break
+
+ # The current line is full, and the next chunk is too big to
+ # fit on *any* line (not just this one).
+ if chunks and len(chunks[-1]) > width:
+ self._handle_long_word(chunks, cur_line, cur_len, width)
+
+ # If the last chunk on this line is all whitespace, drop it.
+ if self.drop_whitespace and cur_line and not cur_line[-1].strip():
+ del cur_line[-1]
+
+ # Convert current line back to a string and store it in list
+ # of all lines (return value).
+ if cur_line:
+ lines.append(indent + ''.join(cur_line))
+
+ return lines
+# }}}
+# function wrap() {{{
+
+
+def wrap(text, width=70, **kwargs):
+ """
+ Wrap a single paragraph of text, returning a list of wrapped lines.
+ """
+ if sys.version_info < (2, 6):
+ return TextWrapper(width=width, **kwargs).wrap(text)
+ return textwrap.wrap(text, width=width, **kwargs)
+
+# }}}
diff --git a/packaging/wix/files.py b/packaging/wix/files.py
index 7034021ac..9bf5f393e 100644
--- a/packaging/wix/files.py
+++ b/packaging/wix/files.py
@@ -1,13 +1,22 @@
#!/usr/bin/python
from __future__ import print_function
+from __future__ import unicode_literals # make all literals unicode strings by default (even in Python 2)
import os
import re
import uuid
+from io import open # needed for support of encoding parameter in Python 2
from helpers import get_inkscape_dist_dir, get_inkscape_locales_and_names
+# basestring is not available in Python 3
+try:
+ basestring
+except NameError:
+ basestring = (str,bytes)
+
+
directory_ids = {}
file_ids = {}
@@ -88,7 +97,7 @@ inkscape_dist_dir = get_inkscape_dist_dir()
# get locales currently supported by Inkscape (dict of the form {'de': 'German (de)'})
locales = get_inkscape_locales_and_names()
-with open('files.wxs', 'w') as wxs:
+with open('files.wxs', 'w', encoding='utf-8') as wxs:
wxs.write("<!-- do not edit, this file is created by files.py tool any changes will be lost -->\n")
wxs.write("<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>\n")
wxs.write(indent(1) + "<?include version.wxi?>\n")
@@ -125,8 +134,9 @@ with open('files.wxs', 'w') as wxs:
# create a FeatureGroup for translations
wxs.write(indent(2) + "<FeatureGroup Id='Translations'>\n")
- for lang_code in sorted(locales):
- wxs.write(indent(3) + "<Feature Id='Translation_" + valid_id(lang_code) + "' Level='1' Title='" + locales[lang_code] + "' AllowAdvertise='no'>\n")
+ sorted_locales = sorted( ((v,k) for k,v in locales.items()) ) # sort by language name (instead of language code)
+ for lang_name, lang_code in sorted_locales:
+ wxs.write(indent(3) + "<Feature Id='Translation_" + valid_id(lang_code) + "' Level='1' Title='" + lang_name + "' AllowAdvertise='no'>\n")
wxs.write(indent(4) + "<ComponentGroupRef Id='Translation_" + valid_id(lang_code) + "' />\n")
wxs.write(indent(3) + "</Feature>\n")
wxs.write(indent(2) + "</FeatureGroup>\n")
diff --git a/packaging/wix/helpers.py b/packaging/wix/helpers.py
index 7bd706398..4e8ef4547 100644
--- a/packaging/wix/helpers.py
+++ b/packaging/wix/helpers.py
@@ -1,10 +1,12 @@
#!/usr/bin/python
from __future__ import print_function
+from __future__ import unicode_literals # make all literals unicode strings by default (even in Python 2)
import os
import re
import sys
+from io import open # needed for support of encoding parameter in Python 2
# check where to look for the Inkscape files to bundle
@@ -35,13 +37,15 @@ def get_inkscape_locales():
# get the list of available Inkscape UI translations (by parsing inkscape-preferences.cpp)
+# (note that this is also used in /packaging/win32/languages/_language_lists.py, don't break it!)
def get_inkscape_locales_and_names():
re_languages = re.compile(r'Glib::ustring languages\[\] = \{(.+?)\};', re.DOTALL)
re_langValues = re.compile(r'Glib::ustring langValues\[\] = \{(.+?)\};', re.DOTALL)
re_quotes = re.compile(r'"(.*?)"')
# get the raw array contents from inkscape-preferences.cpp
- with open('..\\..\\src\\ui\\dialog\\inkscape-preferences.cpp', 'r') as f:
+ filepath = os.path.join(os.path.dirname(__file__), '../../src/ui/dialog/inkscape-preferences.cpp')
+ with open(filepath, 'r', encoding='utf-8') as f:
languages = re.search(re_languages, f.read())
f.seek(0)
langValues = re.search(re_langValues, f.read())