Veronica Berglyd Olsen (@vkbo)
+ +
+ Concept: Marian Lückhof (@Number042)
+ Internationalisation: Bruno Meneguello (@bkmeneguello)
+ Setup and Packaging: Rachel Powers (@Ryex)
+
For other contributions, see the project's +Contributors page.
+ +The default language is English (UK) with English (US) as an option. These are the original +translators for the languages currently available:
+
+ Dutch: Martijn van der Kleijn (@mvdkleijn)
+ French: Jan Lüdke (@jyhelle)
+ German: Myian (@heymyian)
+ Latin American Spanish: Tommy Marplatt (@tmarplatt)
+ Norwegian: Veronica Berglyd Olsen (@vkbo)
+ Portuguese: Bruno Meneguello (@bkmeneguello)
+ Simplified Chinese: Qianzhi Long (@longqzh)
+
Additional larger translation contributions:
++ French: Albert Aribaud (@aaribaud) +
+ +Translations are managed on Crowdin, and +more contributions are listed on the project's Members page.
+ +The following libraries are dependencies of novelWriter:
+
+ Qt5 by Qt Company
+ PyQt5 by Riverbank Computing
+ lxml by Martijn Faassen
+ Enchant by Dom Lachowicz
+ PyEnchant by Dimitri Merejkowsky
+
Some of the assets bundled with novelWriter were adapted from the following sources:
+
+ Typicons icons by Stephen Hutchings (CC BY-SA 4.0)
+ Tomorrow syntax themes by Chris Kempson (MIT License)
+ Owl syntax themes by Sarah Drasner (MIT License)
+ Solarized themes by Ethan Schoonover (MIT License)
+
Additional thanks to @johnblommers who was an early user and who has provided a lot +of very useful feedback over the years.
+ + + diff --git a/novelwriter/dialogs/about.py b/novelwriter/dialogs/about.py index a9a45e84..18dec83b 100644 --- a/novelwriter/dialogs/about.py +++ b/novelwriter/dialogs/about.py @@ -85,6 +85,10 @@ class GuiAbout(QDialog): self.pageNotes.setOpenExternalLinks(True) self.pageNotes.document().setDocumentMargin(self.mainConf.pxInt(16)) + self.pageCredits = QTextBrowser() + self.pageCredits.setOpenExternalLinks(True) + self.pageCredits.document().setDocumentMargin(self.mainConf.pxInt(16)) + self.pageLicense = QTextBrowser() self.pageLicense.setOpenExternalLinks(True) self.pageLicense.document().setDocumentMargin(self.mainConf.pxInt(16)) @@ -93,6 +97,7 @@ class GuiAbout(QDialog): self.tabBox = QTabWidget() self.tabBox.addTab(self.pageAbout, self.tr("About")) self.tabBox.addTab(self.pageNotes, self.tr("Release")) + self.tabBox.addTab(self.pageCredits, self.tr("Credits")) self.tabBox.addTab(self.pageLicense, self.tr("Licence")) self.innerBox.addWidget(self.tabBox) @@ -115,6 +120,7 @@ class GuiAbout(QDialog): self._setStyleSheet() self._fillAboutPage() self._fillNotesPage() + self._fillCreditsPage() self._fillLicensePage() qApp.restoreOverrideCursor() return @@ -140,20 +146,12 @@ class GuiAbout(QDialog): "{license1}
" "{license2}
" "{license3}
" - "{credits}
" ).format( title1=self.tr("About novelWriter"), copy=novelwriter.__copyright__, link=self.tr("Website: {0}").format( f"{novelwriter.__domain__}" ), - title2=self.tr("Credits"), - credits=self._wrapTable([ - (self.tr("Developer"), "Veronica Berglyd Olsen"), - (self.tr("Concept"), "Veronica Berglyd Olsen, Marian Lückhof"), - (self.tr("i18n"), "Bruno Meneguello"), - ]), intro=self.tr( "novelWriter is a markdown-like text editor designed for organising and " "writing novels. It is written in Python 3 with a Qt5 GUI, using PyQt5." @@ -177,55 +175,6 @@ class GuiAbout(QDialog): ), ) - aboutMsg += "{1}
".format( - self.tr("Translations"), - self._wrapTable([ - ("Deutsch", "Myian"), - ("English", "Veronica Berglyd Olsen"), - ("Español Latinoamericano", "Tommy Marplatt"), - ("Français", "Jan Lüdke (jyhelle)"), - ("Nederlands", "Martijn van der Kleijn"), - ("Norsk Bokmål", "Veronica Berglyd Olsen"), - ("Português", "Bruno Meneguello"), - ("简体中文", "Qianzhi Long"), - ]) - ) - - mainTheme = self.mainGui.mainTheme - iconCache = self.mainGui.mainTheme.iconCache - if mainTheme.themeName and mainTheme.themeAuthor != "N/A": - licURL = f"{mainTheme.themeLicense}" - aboutMsg += "{1}
".format( - self.tr("Theme: {0}").format(mainTheme.themeName), - self._wrapTable([ - (self.tr("Author"), mainTheme.themeAuthor), - (self.tr("Credit"), mainTheme.themeCredit), - (self.tr("Licence"), licURL), - ]) - ) - - if iconCache.themeName: - licURL = f"{iconCache.themeLicense}" - aboutMsg += "{1}
".format( - self.tr("Icons: {0}").format(iconCache.themeName), - self._wrapTable([ - (self.tr("Author"), iconCache.themeAuthor), - (self.tr("Credit"), iconCache.themeCredit), - (self.tr("Licence"), licURL), - ]) - ) - - if mainTheme.syntaxName: - licURL = f"{mainTheme.syntaxLicense}" - aboutMsg += "{1}
".format( - self.tr("Syntax: {0}").format(mainTheme.syntaxName), - self._wrapTable([ - (self.tr("Author"), mainTheme.syntaxAuthor), - (self.tr("Credit"), mainTheme.syntaxCredit), - (self.tr("Licence"), licURL), - ]) - ) - self.pageAbout.setHtml(aboutMsg) return @@ -241,6 +190,17 @@ class GuiAbout(QDialog): self.pageNotes.setHtml("Error loading release notes text ...") return + def _fillCreditsPage(self): + """Load the content for the Credits page. + """ + docPath = self.mainConf.assetPath("text") / "credits_en.htm" + docText = readTextFile(docPath) + if docText: + self.pageCredits.setHtml(docText) + else: + self.pageCredits.setHtml("Error loading credits text ...") + return + def _fillLicensePage(self): """Load the content for the Licence page. """ @@ -252,16 +212,6 @@ class GuiAbout(QDialog): self.pageLicense.setHtml("Error loading licence text ...") return - def _wrapTable(self, theData): - """Wrap a list of label/value tuples in an html table. - """ - theTable = [] - for aLabel, aValue in theData: - theTable.append( - f"