diff --git a/i18n/nw_base.ts b/i18n/nw_base.ts index 333f4afc..4ea4ee03 100644 --- a/i18n/nw_base.ts +++ b/i18n/nw_base.ts @@ -342,448 +342,396 @@ GuiAbout - + About novelWriter - + About - + Release - - - - - Licence - - - - - Website: {0} - - - - + Credits - - Developer + + Licence - - Concept + + Website: {0} - i18n - - - - 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. - + novelWriter is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - + novelWriter is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - + See the Licence tab for the full licence text, or visit the GNU website at {0} for more details. - - - Translations - - - - - Theme: {0} - - - - - - - Author - - - - - - - Credit - - - - - Icons: {0} - - - - - Syntax: {0} - - GuiBuildNovel - + Build Novel Project - + Title Formats for Novel Files - + Formatting Codes: - + {0} for the title as set in the document - + {0} for chapter number (1, 2, 3) - + {0} for chapter number as a word (one, two) - + {0} for chapter number in upper case Roman - + {0} for chapter number in lower case Roman - + {0} for scene number within chapter - + {0} for scene number within novel - + Leave blank to skip this heading, or set to a static text, like for instance '{0}', to make a separator. The separator will be centred automatically and only appear between sections of the same type. - + Not Set - + Title - + Chapter - + Unnumbered - + Scene - + Section - + Language - + Hide scene - + Hide section - + Font Options - + Font family - + Font size - + Line height - + Justify text - + Disable styling - + Styling Options - + Include Options - + Include synopsis - + Include comments - + Include keywords - + Include body text - + Root Filter Options - + File Filter Options - + Include novel files - + Include note files - + Include inactive files - + Export Options - + Replace tabs with spaces - + Replace Unicode in HTML - + Build Preview - + Print - + Print Preview - + Print to PDF - + Save As - + Open Document (.odt) - + Flat Open Document (.fodt) - + novelWriter HTML (.htm) - + novelWriter Markdown (.nwd) - + Standard Markdown (.md) - + GitHub Markdown (.md) - + JSON + novelWriter HTML (.json) - + JSON + novelWriter Markdown (.json) - + Close - + Failed to generate preview. The result is too big. - + There were problems when building the project: - + Open Document - + Flat Open Document - + Plain HTML - + novelWriter Markdown - + Standard Markdown - + GitHub Markdown - + JSON + novelWriter HTML - + JSON + novelWriter Markdown - + PDF - + Save Document As - + {0} file successfully written to: - + Failed to write {0} file. {1} @@ -791,17 +739,17 @@ GuiBuildNovelDocView - + This area will show the content of the document to be exported or printed. Press the "Build Preview" button to generate content. - + Unknown - + Build Time: @@ -809,32 +757,32 @@ GuiDocEditFooter - + Status - + Line: {0} ({1}) - + Words: {0} ({1}) - + Document size is {0} bytes - + Words: {0} selected - + Character count: {0} @@ -842,22 +790,22 @@ GuiDocEditHeader - + Edit document label - + Search document - + Toggle Focus Mode - + Close the document @@ -865,58 +813,58 @@ GuiDocEditSearch - - + + Search - + Replace - + Case Sensitive - + Whole Words Only - + RegEx Mode - + Loop Search - + Search Next File - + Preserve Case - + Close Search - + Find in current document - + Find and replace in current document @@ -924,117 +872,117 @@ GuiDocEditor - + The document you are trying to open is too big. The document size is {0} MB. The maximum size allowed is {1} MB. - + Opened Document: {0} - + The text you are trying to add is too big. The text size is {0} MB. The maximum size allowed is {1} MB. - + File Changed on Disk - + This document has been changed outside of novelWriter while it was open. Overwrite the file on disk? - + Could not save document. - + Saved Document: {0} - + Spell checking requires the package PyEnchant. It does not appear to be installed. - + Spell check complete - + File Location - + The currently open file is saved in: - + The document has grown too big and you cannot add more text to it. The maximum size of a single novelWriter document is {0} MB. - + Follow Tag - + Cut - + Copy - + Paste - + Select All - + Select Word - + Select Paragraph - + Spelling Suggestion(s) - + No Suggestions - + Add Word to Dictionary - + Please select some text before calling replace quotes. @@ -1291,173 +1239,173 @@ GuiMain - + You are running an untested development version of novelWriter. Please be careful when working on a live project and make sure you take regular backups. - + novelWriter is ready ... - + Cannot create a new project when another project is open. - + A project already exists in that location. Please choose another folder. - + Close Project - + Close the current project? - - + + Changes are saved automatically. - + Backup Project - + Backup the current project? - + The project was locked by the computer '{0}' ({1} {2}), last active on {3}. - + Project Locked - + The project is already open by another instance of novelWriter, and is therefore locked. Override lock and continue anyway? - + Note: If the program or the computer previously crashed, the lock can safely be overridden. However, overriding it is not recommended if the project is open in another instance of novelWriter. Doing so may corrupt the project. - + The project index is outdated or broken. Rebuilding index. - + Text files ({0}) - + Markdown files ({0}) - + novelWriter files ({0}) - + All files ({0}) - + Import File - + Could not read file. The file must be an existing text file. - + Please open a document to import the text file into. - + Import Document - + Importing the file will overwrite the current content of the document. Do you want to proceed? - + Indexing completed in {0} ms - + The project index has been successfully rebuilt. - + Some changes will not be applied until novelWriter has been restarted. - + Information - + Warning - + Error - + This is a bug! - + Internal Error - + Exit - + Do you want to exit novelWriter? - + Could not find the reference for tag '{0}'. It either doesn't exist, or the index is out of date. The index can be updated from the Tools menu, or by pressing {1}. @@ -2288,103 +2236,103 @@ GuiPreferencesAutomation - + Automatic Features - + Auto-select word under cursor - + Apply formatting to word under cursor if no selection is made. - + Auto-replace text as you type - + Allow the editor to replace symbols as you type. - + Replace as You Type - + Auto-replace single quotes - - + + Try to guess which is an opening or a closing quote. - + Auto-replace double quotes - + Auto-replace dashes - + Double and triple hyphens become short and long dashes. - + Auto-replace dots - + Three consecutive dots become ellipsis. - + Automatic Padding - + Insert non-breaking space before - + Automatically add space before any of these symbols. - + Insert non-breaking space after - + Automatically add space after any of these symbols. - + Use thin space instead - + Inserts a thin space instead of a regular space. @@ -2810,47 +2758,47 @@ GuiPreferencesQuotes - + Quotation Style - + Single quote open style - + The symbol to use for a leading single quote. - + Single quote close style - + The symbol to use for a trailing single quote. - + Double quote open style - + The symbol to use for a leading double quote. - + Double quote close style - + The symbol to use for a trailing double quote. @@ -2858,59 +2806,59 @@ GuiPreferencesSyntax - + Quotes & Dialogue - + Highlight text wrapped in quotes - - - + + + Applies to the document editor only. - + Allow open-ended single quotes - + Highlight single-quoted line with no closing quote. - + Allow open-ended double quotes - + Highlight double-quoted line with no closing quote. - + Text Emphasis - + Add highlight colour to emphasised text - + Text Errors - + Highlight multiple or trailing spaces @@ -3295,52 +3243,52 @@ GuiProjectToolBar - + Project Content - + Quick Links - + Move Up - + Move Down - + Add Item - + Expand All - + Collapse All - + Undo Move - + Empty Trash - + More Options @@ -3348,201 +3296,201 @@ GuiProjectTree - + Active - + Inactive - + Did not find anywhere to add the file or folder! - + Cannot add new files or folders to the Trash folder. - + New Note - + New Chapter - + New Scene - + New Document - + New Folder - + There is currently no Trash folder in this project. - + The Trash folder is already empty. - - + + Empty Trash - + Permanently delete {0} file(s) from Trash? - - + + Delete - + Move '{0}' to Trash? - + Root folders can only be deleted when they are empty. - + Permanently delete '{0}'? - + Open Document - + View Document - + Change Label - + Toggle Active - + Set Status to ... - + Set Importance to ... - + Transform - - + + Convert to {0} - + Merge Child Items into Self - + Merge Child Items into New - + Merge Documents in Folder - + Split Document by Headers - + Expand All - + Collapse All - + Delete Permanently - + Move to Trash - + Convert Folder - + Do you want to convert the folder to a {0}? This action cannot be reversed. - + No documents selected for merging. - + Merged - - + + Could not write document content. - + There is nowhere to add item with name '{0}'. diff --git a/novelwriter/assets/text/credits_en.htm b/novelwriter/assets/text/credits_en.htm new file mode 100644 index 00000000..d2a2825d --- /dev/null +++ b/novelwriter/assets/text/credits_en.htm @@ -0,0 +1,69 @@ + + + + +

Credits

+ +

Main Developer

+

Veronica Berglyd Olsen (@vkbo)

+ +

Contributors

+ +

+ Concept: Marian Lückhof (@Number042)
+ Internationalisation: Bruno Meneguello (@bkmeneguello)
+ Setup and Packaging: Rachel Powers (@Ryex) +

+

For other contributions, see the project's +Contributors page.

+ +

Translations

+ +

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.

+ +

Libraries

+ +

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 +

+ +

Assets

+ +

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) +

+ +

Special Mentions

+ +

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}

" - "

{title2}

" - "

{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 += "

{0}

{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 += "

{0}

{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 += "

{0}

{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 += "

{0}

{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"{aLabel}:{aValue}" - ) - return "{0}
".format("".join(theTable)) - def _setStyleSheet(self): """Set stylesheet for all browser tabs """ @@ -275,8 +225,8 @@ class GuiAbout(QDialog): ".alt {{" " color: rgb({kColR},{kColG},{kColB});" "}}\n" - "td {{" - " padding-right: 0.8em;" + "ul, li {{" + " margin-left: 0; padding-left: 0;" "}}\n" ).format( hColR=self.mainGui.mainTheme.colHead[0], @@ -288,6 +238,7 @@ class GuiAbout(QDialog): ) self.pageAbout.document().setDefaultStyleSheet(styleSheet) self.pageNotes.document().setDefaultStyleSheet(styleSheet) + self.pageCredits.document().setDefaultStyleSheet(styleSheet) self.pageLicense.document().setDefaultStyleSheet(styleSheet) return diff --git a/tests/test_dialogs/test_dlg_about.py b/tests/test_dialogs/test_dlg_about.py index 1b650ec1..8567b07c 100644 --- a/tests/test_dialogs/test_dlg_about.py +++ b/tests/test_dialogs/test_dlg_about.py @@ -51,6 +51,8 @@ def testDlgAbout_NWDialog(qtbot, monkeypatch, nwGUI): mp.setattr("novelwriter.config.Config.assetPath", lambda *a: Path("whatever")) msgAbout._fillNotesPage() assert msgAbout.pageNotes.toPlainText() == "Error loading release notes text ..." + msgAbout._fillCreditsPage() + assert msgAbout.pageCredits.toPlainText() == "Error loading credits text ..." msgAbout._fillLicensePage() assert msgAbout.pageLicense.toPlainText() == "Error loading licence text ..."