From 7ec5fd79df65cd3e54d3d14c52df106d71d06c53 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Sun, 31 Dec 2017 21:46:55 -0500 Subject: [PATCH] Interface preferences displays self-names of languages --- Makefile.am | 2 +- Makefile.in | 2 +- locale/LanguageNames.txt | 56 ++++++++++++++++++ mac/Audacity.xcodeproj/project.pbxproj | 4 ++ src/Languages.cpp | 81 +++++++------------------- win/audacity.iss | 1 + 6 files changed, 84 insertions(+), 62 deletions(-) create mode 100644 locale/LanguageNames.txt diff --git a/Makefile.am b/Makefile.am index 11482a879..648690dce 100644 --- a/Makefile.am +++ b/Makefile.am @@ -5,7 +5,7 @@ ACLOCAL_AMFLAGS = -I m4 bin_PROGRAMS = audacity$(EXEEXT) dist_doc_DATA = LICENSE.txt README.txt -dist_pkgdata_DATA = presets/EQDefaultCurves.xml +dist_pkgdata_DATA = presets/EQDefaultCurves.xml locale/LanguageNames.txt nobase_dist_pkgdata_DATA = \ include/audacity/ConfigInterface.h \ diff --git a/Makefile.in b/Makefile.in index f7d4fc6a3..47ce56bd4 100644 --- a/Makefile.in +++ b/Makefile.in @@ -513,7 +513,7 @@ SUBDIRS = help images lib-src po src tests ACLOCAL_AMFLAGS = -I m4 bin_PROGRAMS = audacity$(EXEEXT) dist_doc_DATA = LICENSE.txt README.txt -dist_pkgdata_DATA = presets/EQDefaultCurves.xml +dist_pkgdata_DATA = presets/EQDefaultCurves.xml locale/LanguageNames.txt nobase_dist_pkgdata_DATA = \ include/audacity/ConfigInterface.h \ include/audacity/EffectAutomationParameters.h \ diff --git a/locale/LanguageNames.txt b/locale/LanguageNames.txt new file mode 100644 index 000000000..a1b936c54 --- /dev/null +++ b/locale/LanguageNames.txt @@ -0,0 +1,56 @@ +af Afrikaans +ar العربية +be Беларуская +bg Български +bn বাংলা +bs Bosanski +ca Català +ca_ES@valencia Valencià +cs Čeština +cy Cymraeg +da Dansk +de Deutsch +el Ελληνικά +en English +es Español +eu Euskara +eu_ES Euskara (Espainiako) +fa فارسی +fi Suomi +fr Français +ga Gaeilge +gl Galego +he עברית +hi हिन्दी +hr Hrvatski +hu Magyar +hy Հայերեն +id Bahasa Indonesia +it Italiano +ja 日本語 +ka ქართული +km ខេមរភាសា +ko 한국어 +lt Lietuvių +mk Македонски +my မြန်မာစာ +nb Norsk +nl Nederlands +oc Occitan +pl Polski +pt Português +pt_BR Português (Brasil) +ro Română +ru Русский +sk Slovenčina +sl Slovenščina +sr_RS Српски +sr_RS@latin Srpski +sv Svenska +ta தமிழ் +tg Тоҷикӣ +tr Türkçe +uk Українська +vi Tiếng Việt +zh_CN 中文 +zh_TW 中文 diff --git a/mac/Audacity.xcodeproj/project.pbxproj b/mac/Audacity.xcodeproj/project.pbxproj index a68751fe8..bcdd75f03 100644 --- a/mac/Audacity.xcodeproj/project.pbxproj +++ b/mac/Audacity.xcodeproj/project.pbxproj @@ -1222,6 +1222,7 @@ 5E15126E1DB0010C00702E29 /* TrackControls.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E1512681DB0010C00702E29 /* TrackControls.cpp */; }; 5E15126F1DB0010C00702E29 /* TrackUI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E15126A1DB0010C00702E29 /* TrackUI.cpp */; }; 5E1512701DB0010C00702E29 /* TrackVRulerControls.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E15126B1DB0010C00702E29 /* TrackVRulerControls.cpp */; }; + 5E16FF4D1FF9CE0B0085E1B8 /* LanguageNames.txt in Resources */ = {isa = PBXBuildFile; fileRef = 5E16FF4C1FF9CE0B0085E1B8 /* LanguageNames.txt */; }; 5E2A19941EED688500217B58 /* SelectionState.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E2A19921EED688500217B58 /* SelectionState.cpp */; }; 5E3FFE721EC9032B0020F7C9 /* NoteTrackSliderHandles.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E3FFE701EC9032B0020F7C9 /* NoteTrackSliderHandles.cpp */; }; 5E667A601F0BEE5F00C942A5 /* WaveTrackVZoomHandle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E667A5E1F0BEE5F00C942A5 /* WaveTrackVZoomHandle.cpp */; }; @@ -3070,6 +3071,7 @@ 5E15126A1DB0010C00702E29 /* TrackUI.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TrackUI.cpp; sourceTree = ""; }; 5E15126B1DB0010C00702E29 /* TrackVRulerControls.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TrackVRulerControls.cpp; sourceTree = ""; }; 5E15126C1DB0010C00702E29 /* TrackVRulerControls.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrackVRulerControls.h; sourceTree = ""; }; + 5E16FF4C1FF9CE0B0085E1B8 /* LanguageNames.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = LanguageNames.txt; path = ../locale/LanguageNames.txt; sourceTree = ""; }; 5E2A19921EED688500217B58 /* SelectionState.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SelectionState.cpp; sourceTree = ""; }; 5E2A19931EED688500217B58 /* SelectionState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SelectionState.h; sourceTree = ""; }; 5E3FFE701EC9032B0020F7C9 /* NoteTrackSliderHandles.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NoteTrackSliderHandles.cpp; sourceTree = ""; }; @@ -5349,6 +5351,7 @@ 286D30AC0F264B58004E6E4A /* locale */ = { isa = PBXGroup; children = ( + 5E16FF4C1FF9CE0B0085E1B8 /* LanguageNames.txt */, 28884912131B6CF500B59735 /* af.po */, 28884913131B6CF500B59735 /* ar.po */, 28884914131B6CF500B59735 /* be.po */, @@ -7091,6 +7094,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 5E16FF4D1FF9CE0B0085E1B8 /* LanguageNames.txt in Resources */, 174F73D0098D516D009CD6E0 /* Audacity.icns in Resources */, 174F73D1098D516D009CD6E0 /* AudacityAIFF.icns in Resources */, 174F73D2098D516D009CD6E0 /* AudacityAU.icns in Resources */, diff --git a/src/Languages.cpp b/src/Languages.cpp index 0a46481f0..09a0f1f5b 100644 --- a/src/Languages.cpp +++ b/src/Languages.cpp @@ -35,8 +35,10 @@ #include #include #include +#include #include "Languages.h" +#include "FileNames.h" #include "AudacityApp.h" @@ -131,66 +133,25 @@ void GetLanguages(wxArrayString &langCodes, wxArrayString &langNames) LangHash reverseHash; LangHash tempHash; - // MM: Use only ASCII characters here to avoid problems with - // charset conversion on Linux platforms - localLanguageName[wxT("af")] = wxT("Afrikaans"); - localLanguageName[wxT("ar")] = wxT("Arabic"); - localLanguageName[wxT("be")] = wxT("Belarusian"); - localLanguageName[wxT("bg")] = wxT("Balgarski"); - localLanguageName[wxT("bn")] = wxT("Bengali"); - localLanguageName[wxT("bs")] = wxT("Bosnian"); - localLanguageName[wxT("ca")] = wxT("Catalan"); - localLanguageName[wxT("ca_ES@valencia")] = wxT("Valencian (southern Catalan)"); - localLanguageName[wxT("cs")] = wxT("Czech"); - localLanguageName[wxT("cy")] = wxT("Welsh"); - localLanguageName[wxT("da")] = wxT("Dansk"); - localLanguageName[wxT("de")] = wxT("Deutsch"); - localLanguageName[wxT("el")] = wxT("Ellinika"); - localLanguageName[wxT("en")] = wxT("English"); - localLanguageName[wxT("es")] = wxT("Espanol"); - localLanguageName[wxT("eu")] = wxT("Euskara"); - localLanguageName[wxT("eu_ES")] = wxT("Euskara (Espainiako)"); - localLanguageName[wxT("fa")] = wxT("Farsi"); - localLanguageName[wxT("fi")] = wxT("Suomi"); - localLanguageName[wxT("fr")] = wxT("Francais"); - localLanguageName[wxT("ga")] = wxT("Gaeilge"); - localLanguageName[wxT("gl")] = wxT("Galician"); - localLanguageName[wxT("he")] = wxT("Hebrew"); - localLanguageName[wxT("hi")] = wxT("Hindi"); - localLanguageName[wxT("hr")] = wxT("Croatian"); - localLanguageName[wxT("hu")] = wxT("Magyar"); - localLanguageName[wxT("hy")] = wxT("Armenian"); - localLanguageName[wxT("id")] = wxT("Bahasa Indonesia"); // aka Indonesian - localLanguageName[wxT("it")] = wxT("Italiano"); - localLanguageName[wxT("ja")] = wxT("Nihongo"); - localLanguageName[wxT("ka")] = wxT("Georgian"); - localLanguageName[wxT("km")] = wxT("Khmer"); - localLanguageName[wxT("ko")] = wxT("Korean"); - localLanguageName[wxT("lt")] = wxT("Lietuviu"); - localLanguageName[wxT("mk")] = wxT("Makedonski"); - localLanguageName[wxT("my")] = wxT("Burmese"); - localLanguageName[wxT("nb")] = wxT("Norsk"); - localLanguageName[wxT("nl")] = wxT("Nederlands"); - localLanguageName[wxT("oc")] = wxT("Occitan"); - localLanguageName[wxT("pl")] = wxT("Polski"); - localLanguageName[wxT("pt")] = wxT("Portugues"); - localLanguageName[wxT("pt_BR")] = wxT("Portugues (Brasil)"); - localLanguageName[wxT("ro")] = wxT("Romanian"); - localLanguageName[wxT("ru")] = wxT("Russky"); - localLanguageName[wxT("sk")] = wxT("Slovak"); - localLanguageName[wxT("sl")] = wxT("Slovenscina"); - localLanguageName[wxT("sr_RS")] = wxT("Serbian (Cyrillic)"); - localLanguageName[wxT("sr_RS@latin")] = wxT("Serbian (Latin)"); - localLanguageName[wxT("sv")] = wxT("Svenska"); - localLanguageName[wxT("tg")] = wxT("Tajik"); - localLanguageName[wxT("ta")] = wxT("Tamil"); - localLanguageName[wxT("tr")] = wxT("Turkce"); - localLanguageName[wxT("uk")] = wxT("Ukrainska"); - localLanguageName[wxT("vi")] = wxT("Vietnamese"); - // If we look up zh in wxLocale we get zh_TW hence we MUST look - // for zh_CN. - localLanguageName[wxT("zh_CN")] = wxT("Chinese (Simplified)"); - localLanguageName[wxT("zh_TW")] = wxT("Chinese (Traditional)"); + { + // The list of locales and associated self-names of languages + // is stored in an external resource file which is easier + // to edit as Unicode than C++ source code. + auto dir = FileNames::ResourcesDir(); + wxTextFile file{dir + wxFILE_SEP_PATH + "LanguageNames.txt"}; + file.Open(); + for ( auto str = file.GetFirstLine(); !file.Eof(); + str = file.GetNextLine() ) + { + // Allow commenting-out of languages no longer supported + if (str[0] == '#') + continue; + + auto code = str.BeforeFirst(' '); + auto name = str.AfterFirst(' '); + localLanguageName[code] = name; + } + } wxArrayString audacityPathList = wxGetApp().audacityPathList; diff --git a/win/audacity.iss b/win/audacity.iss index 2e8e7e7ba..8a236e4d1 100755 --- a/win/audacity.iss +++ b/win/audacity.iss @@ -98,6 +98,7 @@ Source: "{#AppExe}"; DestDir: "{app}"; Flags: ignoreversion Source: "..\help\manual\*"; DestDir: "{app}\help\manual\"; Flags: ignoreversion recursesubdirs Source: "..\presets\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs +Source: "..\locale\LanguageNames.txt"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs ; wxWidgets DLLs. Be specific (not *.dll) so we don't accidentally distribute avformat.dll, for example. ; Don't use the WXWIN environment variable, because...