Merge branch 'release'

This commit is contained in:
Veronica Berglyd Olsen
2024-07-04 16:30:26 +02:00
22 changed files with 7326 additions and 2185 deletions
+32 -30
View File
@@ -2,72 +2,74 @@
## Main Developer
* Veronica Berglyd Olsen (@vkbo)
* Veronica Berglyd Olsen
## Contributors
* Concept: Marian Lückhof (@Number042)
* Internationalisation: Bruno Meneguello (@bkmeneguello)
* Setup and Packaging: Rachel Powers (@Ryex)
* Early Concept: Marian Lückhof
* Internationalisation: Bruno Meneguello
* Setup and Packaging: Rachel Powers
For other contributions, see the project's [Contributors](https://github.com/vkbo/novelWriter/graphs/contributors) page.
## Artwork
The artwork on the Welcome dialog was created by [Louis Durrant](https://louisdurrant.art).
The artwork on the Welcome dialog was created by Louis Durrant.
## 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)
* Italian: Riccardo Mangili
* Japanese: hebekeg (@hebekeg)
* Latin American Spanish: Tommy Marplatt (@tmarplatt)
* Norwegian: Veronica Berglyd Olsen (@vkbo)
* Portuguese: Bruno Meneguello (@bkmeneguello)
* Simplified Chinese: Qianzhi Long (@longqzh)
* **Dutch:** Martijn van der Kleijn (mvdkleijn)
* **French:** Jan Lüdke (jyhelle)
* **German:** Myian (HeyMyian)
* **Italian:** Riccardo Mangili
* **Japanese:** hebekeg
* **Latin American Spanish:** Tommy Marplatt (tmarplatt)
* **Norwegian:** Veronica Berglyd Olsen (vkbo)
* **Polish:** Anna Maria Polak (Nauthiz)
* **Portuguese:** Bruno Meneguello (bkmeneguello)
* **Simplified Chinese:** Qianzhi Long (longqzh)
Additional larger translation contributions:
* French: Albert Aribaud (@aaribaud)
* **French:** Albert Aribaud (aaribaud)
* **Portuguese:** Oli Maia (olimaia)
Translations are managed on [Crowdin](https://crowdin.com/project/novelwriter), and more
contributions are listed on the project's [Members](https://crowdin.com/project/novelwriter/members) page.
contributions are listed on the project's Members page.
## Libraries
The following libraries are dependencies of novelWriter:
* [Qt5](https://www.qt.io) by Qt Company
* [PyQt5](https://www.riverbankcomputing.com/software/pyqt) by Riverbank Computing
* [Enchant](https://abiword.github.io/enchant) by Dom Lachowicz
* [PyEnchant](https://pyenchant.github.io/pyenchant) by Dimitri Merejkowsky
* **Qt5** by Qt Company
* **PyQt5** by Riverbank Computing
* **Enchant** by Dom Lachowicz
* **PyEnchant** by Dimitri Merejkowsky
## Assets
Some of the assets bundled with novelWriter were adapted from the following sources:
* [Typicons](https://github.com/stephenhutchings/typicons.font) icons by Stephen Hutchings (CC BY-SA 4.0)
* [Tomorrow](https://github.com/chriskempson/base16) syntax themes by Chris Kempson (MIT License)
* [Owl](https://github.com/sdras/night-owl-vscode-theme) syntax themes by Sarah Drasner (MIT License)
* [Solarized](https://github.com/altercation/solarized) themes by Ethan Schoonover (MIT License)
* [Cyberpunk Night](https://github.com/alemvigh) theme by Anders Lemvigh (CC BY-SA 4.0)
* [Dracula](https://draculatheme.com) theme by Zeno Rocha (MIT License)
* [Snazzy Light](https://github.com/loilo/vscode-snazzy-light) theme by Florian Reuschel (MIT License)
* **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)
* **Cyberpunk Night** theme by Anders Lemvigh (CC BY-SA 4.0)
* **Dracula** theme by Zeno Rocha (MIT License)
* **Snazzy Light** theme by Florian Reuschel (MIT License)
## Fonts
The font used for the main novelWriter logo, mimetype and text banners is Pridi. Other fonts are
used on buttons and icons.
* Pridi by Cadson Demak (Open Font License, Version 1.1)
* Source Sans Pro by Paul D. Hunt (SIL Open Font License)
* **Pridi** by Cadson Demak (Open Font License, Version 1.1)
* **Source Sans Pro** by Paul D. Hunt (SIL Open Font License)
## Special Mentions
Additional thanks to @johnblommers who was an early user and who has provided a lot of very useful
Additional thanks to John Blommers who was an early user and who has provided a lot of very useful
feedback over the years.
+150 -150
View File
@@ -1267,27 +1267,27 @@
<context>
<name>GuiDocViewFooter</name>
<message>
<location filename="../novelwriter/gui/docviewer.py" line="838" />
<location filename="../novelwriter/gui/docviewer.py" line="840" />
<source>Show/Hide Viewer Panel</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/gui/docviewer.py" line="842" />
<location filename="../novelwriter/gui/docviewer.py" line="844" />
<source>Comments</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/gui/docviewer.py" line="848" />
<location filename="../novelwriter/gui/docviewer.py" line="850" />
<source>Show Comments</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/gui/docviewer.py" line="852" />
<location filename="../novelwriter/gui/docviewer.py" line="854" />
<source>Synopsis</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/gui/docviewer.py" line="858" />
<location filename="../novelwriter/gui/docviewer.py" line="860" />
<source>Show Synopsis Comments</source>
<translation type="unfinished" />
</message>
@@ -1534,12 +1534,12 @@
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/guimain.py" line="1045" />
<location filename="../novelwriter/guimain.py" line="1061" />
<source>Some changes will not be applied until novelWriter has been restarted.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/guimain.py" line="1398" />
<location filename="../novelwriter/guimain.py" line="1414" />
<source>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}.</source>
<translation type="unfinished" />
</message>
@@ -2457,64 +2457,64 @@
<context>
<name>GuiOutlineDetails</name>
<message>
<location filename="../novelwriter/gui/outline.py" line="1004" />
<location filename="../novelwriter/gui/outline.py" line="796" />
<location filename="../novelwriter/gui/outline.py" line="771" />
<location filename="../novelwriter/gui/outline.py" line="1005" />
<location filename="../novelwriter/gui/outline.py" line="797" />
<location filename="../novelwriter/gui/outline.py" line="772" />
<source>Title</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/gui/outline.py" line="772" />
<location filename="../novelwriter/gui/outline.py" line="773" />
<source>Chapter</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/gui/outline.py" line="773" />
<location filename="../novelwriter/gui/outline.py" line="774" />
<source>Scene</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/gui/outline.py" line="774" />
<location filename="../novelwriter/gui/outline.py" line="775" />
<source>Section</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/gui/outline.py" line="797" />
<location filename="../novelwriter/gui/outline.py" line="798" />
<source>Document</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/gui/outline.py" line="798" />
<location filename="../novelwriter/gui/outline.py" line="799" />
<source>Status</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/gui/outline.py" line="815" />
<location filename="../novelwriter/gui/outline.py" line="816" />
<source>Characters</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/gui/outline.py" line="816" />
<location filename="../novelwriter/gui/outline.py" line="817" />
<source>Words</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/gui/outline.py" line="817" />
<location filename="../novelwriter/gui/outline.py" line="818" />
<source>Paragraphs</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/gui/outline.py" line="834" />
<location filename="../novelwriter/gui/outline.py" line="835" />
<source>Synopsis</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/gui/outline.py" line="916" />
<location filename="../novelwriter/gui/outline.py" line="917" />
<source>Title Details</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/gui/outline.py" line="941" />
<location filename="../novelwriter/gui/outline.py" line="942" />
<source>Reference Tags</source>
<translation type="unfinished" />
</message>
@@ -2522,7 +2522,7 @@
<context>
<name>GuiOutlineHeaderMenu</name>
<message>
<location filename="../novelwriter/gui/outline.py" line="735" />
<location filename="../novelwriter/gui/outline.py" line="736" />
<source>Select Columns</source>
<translation type="unfinished" />
</message>
@@ -2548,7 +2548,7 @@
<context>
<name>GuiOutlineTree</name>
<message>
<location filename="../novelwriter/gui/outline.py" line="528" />
<location filename="../novelwriter/gui/outline.py" line="529" />
<source>Save Outline As</source>
<translation type="unfinished" />
</message>
@@ -2556,589 +2556,589 @@
<context>
<name>GuiPreferences</name>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="69" />
<location filename="../novelwriter/dialogs/preferences.py" line="63" />
<location filename="../novelwriter/dialogs/preferences.py" line="66" />
<location filename="../novelwriter/dialogs/preferences.py" line="60" />
<source>Preferences</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="75" />
<location filename="../novelwriter/dialogs/preferences.py" line="72" />
<source>Search</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="147" />
<location filename="../novelwriter/dialogs/preferences.py" line="145" />
<source>General</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="152" />
<location filename="../novelwriter/dialogs/preferences.py" line="150" />
<source>Appearance</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="165" />
<location filename="../novelwriter/dialogs/preferences.py" line="163" />
<source>Display language</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="191" />
<location filename="../novelwriter/dialogs/preferences.py" line="166" />
<location filename="../novelwriter/dialogs/preferences.py" line="189" />
<location filename="../novelwriter/dialogs/preferences.py" line="164" />
<source>Requires restart to take effect.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="177" />
<location filename="../novelwriter/dialogs/preferences.py" line="175" />
<source>Colour theme</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="178" />
<location filename="../novelwriter/dialogs/preferences.py" line="176" />
<source>General colour theme and icons.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="190" />
<location filename="../novelwriter/dialogs/preferences.py" line="188" />
<source>Application font</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="199" />
<location filename="../novelwriter/dialogs/preferences.py" line="197" />
<source>Hide vertical scroll bars in main windows</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="208" />
<location filename="../novelwriter/dialogs/preferences.py" line="200" />
<location filename="../novelwriter/dialogs/preferences.py" line="206" />
<location filename="../novelwriter/dialogs/preferences.py" line="198" />
<source>Scrolling available with mouse wheel and keys only.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="207" />
<location filename="../novelwriter/dialogs/preferences.py" line="205" />
<source>Hide horizontal scroll bars in main windows</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="215" />
<location filename="../novelwriter/dialogs/preferences.py" line="213" />
<source>Use the system's font selection dialog</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="216" />
<location filename="../novelwriter/dialogs/preferences.py" line="214" />
<source>Turn off to use the Qt font dialog, which may have more options.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="222" />
<location filename="../novelwriter/dialogs/preferences.py" line="220" />
<source>Document Style</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="235" />
<location filename="../novelwriter/dialogs/preferences.py" line="233" />
<source>Document colour theme</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="236" />
<location filename="../novelwriter/dialogs/preferences.py" line="234" />
<source>Colour theme for the editor and viewer.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="248" />
<location filename="../novelwriter/dialogs/preferences.py" line="246" />
<source>Document font</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="429" />
<location filename="../novelwriter/dialogs/preferences.py" line="418" />
<location filename="../novelwriter/dialogs/preferences.py" line="249" />
<location filename="../novelwriter/dialogs/preferences.py" line="427" />
<location filename="../novelwriter/dialogs/preferences.py" line="416" />
<location filename="../novelwriter/dialogs/preferences.py" line="247" />
<source>Applies to both document editor and viewer.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="257" />
<location filename="../novelwriter/dialogs/preferences.py" line="255" />
<source>Emphasise partition and chapter labels</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="258" />
<location filename="../novelwriter/dialogs/preferences.py" line="256" />
<source>Makes them stand out in the project tree.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="265" />
<location filename="../novelwriter/dialogs/preferences.py" line="263" />
<source>Show full path in document header</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="266" />
<location filename="../novelwriter/dialogs/preferences.py" line="264" />
<source>Add the parent folder names to the header.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="273" />
<location filename="../novelwriter/dialogs/preferences.py" line="271" />
<source>Include project notes in status bar word count</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="279" />
<location filename="../novelwriter/dialogs/preferences.py" line="277" />
<source>Auto Save</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="291" />
<location filename="../novelwriter/dialogs/preferences.py" line="289" />
<source>Save document interval</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="292" />
<location filename="../novelwriter/dialogs/preferences.py" line="290" />
<source>How often the document is automatically saved.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="303" />
<location filename="../novelwriter/dialogs/preferences.py" line="292" />
<location filename="../novelwriter/dialogs/preferences.py" line="301" />
<location filename="../novelwriter/dialogs/preferences.py" line="290" />
<source>seconds</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="302" />
<location filename="../novelwriter/dialogs/preferences.py" line="300" />
<source>Save project interval</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="303" />
<location filename="../novelwriter/dialogs/preferences.py" line="301" />
<source>How often the project is automatically saved.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="309" />
<location filename="../novelwriter/dialogs/preferences.py" line="307" />
<source>Project Backup</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="316" />
<location filename="../novelwriter/dialogs/preferences.py" line="314" />
<source>Browse</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="320" />
<location filename="../novelwriter/dialogs/preferences.py" line="318" />
<source>Backup storage location</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="840" />
<location filename="../novelwriter/dialogs/preferences.py" line="321" />
<location filename="../novelwriter/dialogs/preferences.py" line="825" />
<location filename="../novelwriter/dialogs/preferences.py" line="319" />
<source>Path: {0}</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="329" />
<location filename="../novelwriter/dialogs/preferences.py" line="327" />
<source>Run backup when the project is closed</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="330" />
<location filename="../novelwriter/dialogs/preferences.py" line="328" />
<source>Can be overridden for individual projects in Project Settings.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="339" />
<location filename="../novelwriter/dialogs/preferences.py" line="337" />
<source>Ask before running backup</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="340" />
<location filename="../novelwriter/dialogs/preferences.py" line="338" />
<source>If off, backups will run in the background.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="346" />
<location filename="../novelwriter/dialogs/preferences.py" line="344" />
<source>Session Timer</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="355" />
<location filename="../novelwriter/dialogs/preferences.py" line="353" />
<source>Pause the session timer when not writing</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="356" />
<location filename="../novelwriter/dialogs/preferences.py" line="354" />
<source>Also pauses when the application window does not have focus.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="367" />
<location filename="../novelwriter/dialogs/preferences.py" line="365" />
<source>Editor inactive time before pausing timer</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="368" />
<location filename="../novelwriter/dialogs/preferences.py" line="366" />
<source>User activity includes typing and changing the content.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="369" />
<location filename="../novelwriter/dialogs/preferences.py" line="367" />
<source>minutes</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="373" />
<location filename="../novelwriter/dialogs/preferences.py" line="371" />
<source>Writing</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="378" />
<location filename="../novelwriter/dialogs/preferences.py" line="376" />
<source>Text Flow</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="390" />
<location filename="../novelwriter/dialogs/preferences.py" line="388" />
<source>Maximum text width in "Normal Mode"</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="391" />
<location filename="../novelwriter/dialogs/preferences.py" line="389" />
<source>Set to 0 to disable this feature.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="442" />
<location filename="../novelwriter/dialogs/preferences.py" line="430" />
<location filename="../novelwriter/dialogs/preferences.py" line="402" />
<location filename="../novelwriter/dialogs/preferences.py" line="391" />
<location filename="../novelwriter/dialogs/preferences.py" line="440" />
<location filename="../novelwriter/dialogs/preferences.py" line="428" />
<location filename="../novelwriter/dialogs/preferences.py" line="400" />
<location filename="../novelwriter/dialogs/preferences.py" line="389" />
<source>px</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="401" />
<location filename="../novelwriter/dialogs/preferences.py" line="399" />
<source>Maximum text width in "Focus Mode"</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="402" />
<location filename="../novelwriter/dialogs/preferences.py" line="400" />
<source>The maximum width cannot be disabled.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="409" />
<location filename="../novelwriter/dialogs/preferences.py" line="407" />
<source>Hide document footer in "Focus Mode"</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="410" />
<location filename="../novelwriter/dialogs/preferences.py" line="408" />
<source>Hide the information bar in the document editor.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="417" />
<location filename="../novelwriter/dialogs/preferences.py" line="415" />
<source>Justify the text margins</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="428" />
<location filename="../novelwriter/dialogs/preferences.py" line="426" />
<source>Minimum text margin</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="440" />
<location filename="../novelwriter/dialogs/preferences.py" line="438" />
<source>Tab width</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="441" />
<location filename="../novelwriter/dialogs/preferences.py" line="439" />
<source>The width of a tab key press in the editor and viewer.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="448" />
<location filename="../novelwriter/dialogs/preferences.py" line="446" />
<source>Text Editing</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="468" />
<location filename="../novelwriter/dialogs/preferences.py" line="466" />
<source>Spell check language</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="469" />
<location filename="../novelwriter/dialogs/preferences.py" line="467" />
<source>Available languages are determined by your system.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="476" />
<location filename="../novelwriter/dialogs/preferences.py" line="474" />
<source>Auto-select word under cursor</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="477" />
<location filename="../novelwriter/dialogs/preferences.py" line="475" />
<source>Apply formatting to word under cursor if no selection is made.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="484" />
<location filename="../novelwriter/dialogs/preferences.py" line="482" />
<source>Show tabs and spaces</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="491" />
<location filename="../novelwriter/dialogs/preferences.py" line="489" />
<source>Show line endings</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="497" />
<location filename="../novelwriter/dialogs/preferences.py" line="495" />
<source>Editor Scrolling</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="506" />
<location filename="../novelwriter/dialogs/preferences.py" line="504" />
<source>Scroll past end of the document</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="507" />
<location filename="../novelwriter/dialogs/preferences.py" line="505" />
<source>Also centres the cursor when scrolling.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="514" />
<location filename="../novelwriter/dialogs/preferences.py" line="512" />
<source>Typewriter style scrolling when you type</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="515" />
<location filename="../novelwriter/dialogs/preferences.py" line="513" />
<source>Keeps the cursor at a fixed vertical position.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="525" />
<location filename="../novelwriter/dialogs/preferences.py" line="523" />
<source>Minimum position for Typewriter scrolling</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="526" />
<location filename="../novelwriter/dialogs/preferences.py" line="524" />
<source>Percentage of the editor height from the top.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="532" />
<location filename="../novelwriter/dialogs/preferences.py" line="530" />
<source>Text Highlighting</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="538" />
<location filename="../novelwriter/dialogs/preferences.py" line="536" />
<source>None</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="539" />
<location filename="../novelwriter/dialogs/preferences.py" line="537" />
<source>Single Quotes</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="540" />
<location filename="../novelwriter/dialogs/preferences.py" line="538" />
<source>Double Quotes</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="541" />
<location filename="../novelwriter/dialogs/preferences.py" line="539" />
<source>Both</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="544" />
<location filename="../novelwriter/dialogs/preferences.py" line="542" />
<source>Highlight dialogue</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="545" />
<location filename="../novelwriter/dialogs/preferences.py" line="543" />
<source>Applies to the selected quote styles.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="551" />
<location filename="../novelwriter/dialogs/preferences.py" line="549" />
<source>Allow open-ended dialogue</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="552" />
<location filename="../novelwriter/dialogs/preferences.py" line="550" />
<source>Highlight dialogue line with no closing quote.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="561" />
<location filename="../novelwriter/dialogs/preferences.py" line="559" />
<source>Dialogue narrator break symbol</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="562" />
<location filename="../novelwriter/dialogs/preferences.py" line="560" />
<source>Symbol to indicate injected narrator break.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="571" />
<location filename="../novelwriter/dialogs/preferences.py" line="569" />
<source>Dialogue line symbol</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="572" />
<location filename="../novelwriter/dialogs/preferences.py" line="570" />
<source>Lines starting with this symbol are dialogue.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="588" />
<location filename="../novelwriter/dialogs/preferences.py" line="586" />
<source>Alternative dialogue symbols</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="589" />
<location filename="../novelwriter/dialogs/preferences.py" line="587" />
<source>Custom highlighting of dialogue text.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="595" />
<location filename="../novelwriter/dialogs/preferences.py" line="593" />
<source>Add highlight colour to emphasised text</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="603" />
<location filename="../novelwriter/dialogs/preferences.py" line="596" />
<location filename="../novelwriter/dialogs/preferences.py" line="601" />
<location filename="../novelwriter/dialogs/preferences.py" line="594" />
<source>Applies to the document editor only.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="602" />
<location filename="../novelwriter/dialogs/preferences.py" line="600" />
<source>Highlight multiple or trailing spaces</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="609" />
<location filename="../novelwriter/dialogs/preferences.py" line="607" />
<source>Text Automation</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="621" />
<location filename="../novelwriter/dialogs/preferences.py" line="619" />
<source>Auto-replace text as you type</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="622" />
<location filename="../novelwriter/dialogs/preferences.py" line="620" />
<source>Allow the editor to replace symbols as you type.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="630" />
<location filename="../novelwriter/dialogs/preferences.py" line="628" />
<source>Auto-replace single quotes</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="640" />
<location filename="../novelwriter/dialogs/preferences.py" line="631" />
<location filename="../novelwriter/dialogs/preferences.py" line="638" />
<location filename="../novelwriter/dialogs/preferences.py" line="629" />
<source>Try to guess which is an opening or a closing quote.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="639" />
<location filename="../novelwriter/dialogs/preferences.py" line="637" />
<source>Auto-replace double quotes</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="648" />
<location filename="../novelwriter/dialogs/preferences.py" line="646" />
<source>Auto-replace dashes</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="649" />
<location filename="../novelwriter/dialogs/preferences.py" line="647" />
<source>Double and triple hyphens become short and long dashes.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="657" />
<location filename="../novelwriter/dialogs/preferences.py" line="655" />
<source>Auto-replace dots</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="658" />
<location filename="../novelwriter/dialogs/preferences.py" line="656" />
<source>Three consecutive dots become ellipsis.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="667" />
<location filename="../novelwriter/dialogs/preferences.py" line="665" />
<source>Insert non-breaking space before</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="668" />
<location filename="../novelwriter/dialogs/preferences.py" line="666" />
<source>Automatically add space before any of these symbols.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="677" />
<location filename="../novelwriter/dialogs/preferences.py" line="675" />
<source>Insert non-breaking space after</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="678" />
<location filename="../novelwriter/dialogs/preferences.py" line="676" />
<source>Automatically add space after any of these symbols.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="686" />
<location filename="../novelwriter/dialogs/preferences.py" line="684" />
<source>Use thin space instead</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="687" />
<location filename="../novelwriter/dialogs/preferences.py" line="685" />
<source>Inserts a thin space instead of a regular space.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="693" />
<location filename="../novelwriter/dialogs/preferences.py" line="691" />
<source>Quotation Style</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="708" />
<location filename="../novelwriter/dialogs/preferences.py" line="706" />
<source>Single quote open style</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="709" />
<location filename="../novelwriter/dialogs/preferences.py" line="707" />
<source>The symbol to use for a leading single quote.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="722" />
<location filename="../novelwriter/dialogs/preferences.py" line="720" />
<source>Single quote close style</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="723" />
<location filename="../novelwriter/dialogs/preferences.py" line="721" />
<source>The symbol to use for a trailing single quote.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="737" />
<location filename="../novelwriter/dialogs/preferences.py" line="735" />
<source>Double quote open style</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="738" />
<location filename="../novelwriter/dialogs/preferences.py" line="736" />
<source>The symbol to use for a leading double quote.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="751" />
<location filename="../novelwriter/dialogs/preferences.py" line="749" />
<source>Double quote close style</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="752" />
<location filename="../novelwriter/dialogs/preferences.py" line="750" />
<source>The symbol to use for a trailing double quote.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py" line="836" />
<location filename="../novelwriter/dialogs/preferences.py" line="821" />
<source>Backup Directory</source>
<translation type="unfinished" />
</message>
+220 -220
View File
File diff suppressed because it is too large Load Diff
+210 -210
View File
File diff suppressed because it is too large Load Diff
+210 -210
View File
File diff suppressed because it is too large Load Diff
+210 -210
View File
File diff suppressed because it is too large Load Diff
+210 -210
View File
File diff suppressed because it is too large Load Diff
+210 -210
View File
File diff suppressed because it is too large Load Diff
+210 -210
View File
File diff suppressed because it is too large Load Diff
+4988
View File
File diff suppressed because it is too large Load Diff
+213 -213
View File
File diff suppressed because it is too large Load Diff
+210 -210
View File
File diff suppressed because it is too large Load Diff
+116
View File
@@ -0,0 +1,116 @@
{
"Synopsis": "Streszczenie",
"Short Description": "Krótki opis",
"Comment": "Komentarz",
"Notes": "Notatki",
"Tag": "Znacznik",
"Point of View": "Punkt widzenia",
"Focus": "Skupienie",
"Characters": "Postacie",
"Plot": "Fabuła",
"Timeline": "Oś czasu",
"Locations": "Miejsca",
"Objects": "Obiekty",
"Entities": "Podmioty",
"Custom": "Różne",
"0": "zero",
"1": "pierwszy",
"2": "drugi",
"3": "trzeci",
"4": "czwarty",
"5": "piąty",
"6": "szósty",
"7": "siódmy",
"8": "ósmy",
"9": "dziewiąty",
"10": "dziesiąty",
"11": "jedenasty",
"12": "dwunasty",
"13": "trzynasty",
"14": "czternasty",
"15": "piętnasty",
"16": "szesnasty",
"17": "siedemnasty",
"18": "osiemnasty",
"19": "dziewiętnasty",
"20": "dwudziesty",
"21": "dwudziesty pierwszy",
"22": "dwudziesty drugi",
"23": "dwudziesty Trzeci",
"24": "dwudziesty czwarty",
"25": "dwudziesty piąty",
"26": "dwudziesty szósty",
"27": "dwudziesty siódmy",
"28": "dwudziesty ósmy",
"29": "dwudziesty dziewiąty",
"30": "trzydziesty",
"31": "trzydziesty pierwszy",
"32": "trzydziesty drugi",
"33": "trzydziesty trzeci",
"34": "trzydziesty czwarty",
"35": "trzydziesty piąty",
"36": "trzydziesty szósty",
"37": "trzydziesty siódmy",
"38": "trzydziesty ósmy",
"39": "trzydziesty dziewiaty",
"40": "czterdziesty",
"41": "czterdziesty pierwszy",
"42": "czterdziesty drugi",
"43": "czterdziesty Trzeci",
"44": "czterdziesty czwarty",
"45": "czterdziesty piąty",
"46": "czterdziesty szósty",
"47": "czterdziesty siódmy",
"48": "czterdziesty ósmy",
"49": "czterdziesty dziewiąty",
"50": "pięćdziesiąty",
"51": "pięćdziesiąty pierwszy",
"52": "pięćdziesiąty drugi",
"53": "pięćdziesiąty trzeci",
"54": "pięćdziesiąty czwarty",
"55": "pięćdziesiąty piąty",
"56": "pięćdziesiąty szósty",
"57": "pięćdziesiąty siódmy",
"58": "pięćdziesiąty ósmy",
"59": "pięćdziesiąty dziewiąty",
"60": "sześćdziesiąty",
"61": "sześćdziesiąty pierwszy",
"62": "sześćdziesiąty drugi",
"63": "sześćdziesiąty trzeci",
"64": "sześćdziesiąty czwarty",
"65": "sześćdziesiąty piąty",
"66": "sześćdziesiąty szósty",
"67": "sześćdziesiąty siódmy",
"68": "sześćdziesiąty ósmy",
"69": "sześćdziesiąty dziewiąty",
"70": "siedemdziesiąty",
"71": "siedemdziesiąty pierwszy",
"72": "siedemdziesiąty drugi",
"73": "siedemdziesiąty trzeci",
"74": "siedemdziesiąty czwarty",
"75": "siedemdziesiąty piąty",
"76": "siedemdziesiąty szósty",
"77": "siedemdziesiąty siódmy",
"78": "siedemdziesiąty ósmy",
"79": "siedemdziesiąty dziewiąty",
"80": "osiemdziesiąty",
"81": "osiemdziesiąty pierwszy",
"82": "osiemdziesiąty drugi",
"83": "osiemdziesiąty trzeci",
"84": "osiemdziesiąty czwarty",
"85": "osiemdziesiąty piąty",
"86": "osiemdziesiąty szósty",
"87": "osiemdziesiąty siódmy",
"88": "osiemdziesiąty ósmy",
"89": "osiemdziesiąty dziewiąty",
"90": "dziewięćdziesiąty",
"91": "dziewięćdziesiąty pierwszy",
"92": "dziewięćdziesiąty drugi",
"93": "dziewięćdziesiąty trzeci",
"94": "dziewięćdziesiąty czwarty",
"95": "dziewięćdziesiąty piąty",
"96": "dziewięćdziesiąty szósty",
"97": "dziewięćdziesiąty siódmy",
"98": "dziewięćdziesiąty ósmy",
"99": "dziewięćdziesiąty dziewiąty"
}
+52 -44
View File
@@ -1,84 +1,92 @@
<!DOCTYPE html public "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<body>
<h3>Main Developer</h3>
<p>Veronica Berglyd Olsen (<a href="https://github.com/vkbo">@vkbo</a>)</p>
<p>Veronica Berglyd Olsen</p>
<h3>Contributors</h3>
<p>
&nbsp;&bull;&nbsp;<b>Concept:</b> Marian Lückhof (<a href="https://github.com/Number042">@Number042</a>)<br>
&nbsp;&bull;&nbsp;<b>Internationalisation:</b> Bruno Meneguello (<a href="https://github.com/bkmeneguello">@bkmeneguello</a>)<br>
&nbsp;&bull;&nbsp;<b>Setup and Packaging:</b> Rachel Powers (<a href="https://github.com/Ryex">@Ryex</a>)
</p>
<ul>
<li><b>Early Concept:</b> Marian Lückhof</li>
<li><b>Internationalisation:</b> Bruno Meneguello</li>
<li><b>Setup and Packaging:</b> Rachel Powers</li>
</ul>
<p>For other contributions, see the project's
<a href="https://github.com/vkbo/novelWriter/graphs/contributors">Contributors</a> page.</p>
<h3>Artwork</h3>
<p>The artwork on the Welcome dialog was created by <a href="https://louisdurrant.art">Louis Durrant</a>.</p>
<p>The artwork on the Welcome dialog was created by Louis Durrant.</p>
<h3>Translations</h3>
<p>The default language is English (UK) with English (US) as an option. These are the original
translators for the languages currently available:</p>
<p>
&nbsp;&bull;&nbsp;<b>Dutch:</b> Martijn van der Kleijn (<a href="https://github.com/mvdkleijn">@mvdkleijn</a>)<br>
&nbsp;&bull;&nbsp;<b>French:</b> Jan Lüdke (<a href="https://github.com/jyhelle">@jyhelle</a>)<br>
&nbsp;&bull;&nbsp;<b>German:</b> Myian (<a href="https://github.com/heymyian">@heymyian</a>)<br>
&nbsp;&bull;&nbsp;<b>Italian:</b> Riccardo Mangili<br>
&nbsp;&bull;&nbsp;<b>Japanese:</b> hebekeg (<a href="https://github.com/hebekeg">@hebekeg</a>)<br>
&nbsp;&bull;&nbsp;<b>Latin American Spanish:</b> Tommy Marplatt (<a href="https://github.com/tmarplatt">@tmarplatt</a>)<br>
&nbsp;&bull;&nbsp;<b>Norwegian:</b> Veronica Berglyd Olsen (<a href="https://github.com/vkbo">@vkbo</a>)<br>
&nbsp;&bull;&nbsp;<b>Portuguese:</b> Bruno Meneguello (<a href="https://github.com/bkmeneguello">@bkmeneguello</a>)<br>
&nbsp;&bull;&nbsp;<b>Simplified Chinese:</b> Qianzhi Long (<a href="https://github.com/longqzh">@longqzh</a>)
</p>
<ul>
<li><b>Dutch:</b> Martijn van der Kleijn (mvdkleijn)</li>
<li><b>French:</b> Jan Lüdke (jyhelle)</li>
<li><b>German:</b> Myian (HeyMyian)</li>
<li><b>Italian:</b> Riccardo Mangili</li>
<li><b>Japanese:</b> hebekeg</li>
<li><b>Latin American Spanish:</b> Tommy Marplatt (tmarplatt)</li>
<li><b>Norwegian:</b> Veronica Berglyd Olsen (vkbo)</li>
<li><b>Polish:</b> Anna Maria Polak (Nauthiz)</li>
<li><b>Portuguese:</b> Bruno Meneguello (bkmeneguello)</li>
<li><b>Simplified Chinese:</b> Qianzhi Long (longqzh)</li>
</ul>
<p>Additional larger translation contributions:</p>
<p>
&nbsp;&bull;&nbsp;<b>French:</b> Albert Aribaud (<a href="https://github.com/aaribaud">@aaribaud</a>)
</p>
<ul>
<li><b>French:</b> Albert Aribaud (aaribaud)</li>
<li><b>Portuguese:</b> Oli Maia (olimaia)</li>
</ul>
<p>Translations are managed on <a href="https://crowdin.com/project/novelwriter">Crowdin</a>, and
more contributions are listed on the project's <a href="https://crowdin.com/project/novelwriter/members">Members</a> page.</p>
more contributions are listed on the project's Members page.</p>
<h3>Libraries</h3>
<p>The following libraries are dependencies of novelWriter:</p>
<p>
&nbsp;&bull;&nbsp;<a href="https://www.qt.io">Qt5</a> by Qt Company<br>
&nbsp;&bull;&nbsp;<a href="https://www.riverbankcomputing.com/software/pyqt">PyQt5</a> by Riverbank Computing<br>
&nbsp;&bull;&nbsp;<a href="https://abiword.github.io/enchant">Enchant</a> by Dom Lachowicz<br>
&nbsp;&bull;&nbsp;<a href="https://pyenchant.github.io/pyenchant">PyEnchant</a> by Dimitri Merejkowsky
</p>
<ul>
<li><b>Qt5</b> by Qt Company</li>
<li><b>PyQt5</b> by Riverbank Computing</li>
<li><b>Enchant</b> by Dom Lachowicz</li>
<li><b>PyEnchant</b> by Dimitri Merejkowsky</li>
</ul>
<h3>Assets</h3>
<p>Some of the assets bundled with novelWriter were adapted from the following sources:</p>
<p>
&nbsp;&bull;&nbsp;<a href="https://github.com/stephenhutchings/typicons.font">Typicons</a> icons by Stephen Hutchings (CC BY-SA 4.0)<br>
&nbsp;&bull;&nbsp;<a href="https://github.com/chriskempson/base16">Tomorrow</a> syntax themes by Chris Kempson (MIT License)<br>
&nbsp;&bull;&nbsp;<a href="https://github.com/sdras/night-owl-vscode-theme">Owl</a> syntax themes by Sarah Drasner (MIT License)<br>
&nbsp;&bull;&nbsp;<a href="https://github.com/altercation/solarized">Solarized</a> themes by Ethan Schoonover (MIT License)<br>
&nbsp;&bull;&nbsp;<a href="https://github.com/alemvigh">Cyberpunk Night</a> theme by Anders Lemvigh (CC BY-SA 4.0)<br>
&nbsp;&bull;&nbsp;<a href="https://draculatheme.com">Dracula</a> theme by Zeno Rocha (MIT License)<br>
&nbsp;&bull;&nbsp;<a href="https://github.com/loilo/vscode-snazzy-light">Snazzy Light</a> theme by Florian Reuschel (MIT License)
</p>
<ul>
<li><b>Typicons</b> icons by Stephen Hutchings (CC BY-SA 4.0)</li>
<li><b>Tomorrow</b> syntax themes by Chris Kempson (MIT License)</li>
<li><b>Owl</b> syntax themes by Sarah Drasner (MIT License)</li>
<li><b>Solarized</b> themes by Ethan Schoonover (MIT License)</li>
<li><b>Cyberpunk Night</b> theme by Anders Lemvigh (CC BY-SA 4.0)</li>
<li><b>Dracula</b> theme by Zeno Rocha (MIT License)</li>
<li><b>Snazzy Light</b> theme by Florian Reuschel (MIT License)</li>
</ul>
<h3>Fonts</h3>
<p>The font used for the main novelWriter logo, mimetype and text banners is Pridi. Other fonts are
used on buttons and icons.</p>
<p>
&nbsp;&bull;&nbsp;Pridi by Cadson Demak (Open Font License, Version 1.1)<br>
&nbsp;&bull;&nbsp;Source Sans Pro by Paul D. Hunt (SIL Open Font License)
</p>
<ul>
<li><b>Pridi</b> by Cadson Demak (Open Font License, Version 1.1)</li>
<li><b>Source Sans Pro</b> by Paul D. Hunt (SIL Open Font License)</li>
</ul>
<h3>Special Mentions</h3>
<p>Additional thanks to <a href="https://github.com/johnblommers">@johnblommers</a> who was an early user and who has provided a lot
of very useful feedback over the years.</p>
<p>Additional thanks to John Blommers who was an early user and who has provided a lot of very
useful feedback over the years.</p>
</body>
</html>
+14 -4
View File
@@ -254,13 +254,23 @@ class NWProject:
status = self._storage.initProjectStorage(projPath, clearLock)
if status != NWStorageOpen.READY:
if status == NWStorageOpen.UNKOWN:
SHARED.error(self.tr("Not a known project file format."))
SHARED.error(
self.tr("Not a known project file format."),
info=self.tr("Path: {0}").format(str(projPath))
)
elif status == NWStorageOpen.NOT_FOUND:
SHARED.error(self.tr("Project file not found."))
SHARED.error(
self.tr("Project file not found."),
info=self.tr("Path: {0}").format(str(projPath))
)
elif status == NWStorageOpen.FAILED:
SHARED.error(
self.tr("Failed to open project."),
info=self.tr("Path: {0}").format(str(projPath)),
exc=self._storage.exc
)
elif status == NWStorageOpen.LOCKED:
self._state = NWProjectState.LOCKED
elif status == NWStorageOpen.FAILED:
SHARED.error(self.tr("Failed to open project."), exc=self._storage.exc)
return False
# Read Project XML
+9 -22
View File
@@ -29,8 +29,8 @@ import logging
from PyQt5.QtCore import Qt, pyqtSignal, pyqtSlot
from PyQt5.QtGui import QCloseEvent, QKeyEvent, QKeySequence
from PyQt5.QtWidgets import (
QAbstractButton, QCompleter, QDialogButtonBox, QFileDialog, QHBoxLayout,
QLineEdit, QPushButton, QVBoxLayout, QWidget
QCompleter, QDialogButtonBox, QFileDialog, QHBoxLayout, QLineEdit,
QPushButton, QVBoxLayout, QWidget
)
from novelwriter import CONFIG, SHARED
@@ -43,10 +43,7 @@ from novelwriter.extensions.modified import (
)
from novelwriter.extensions.pagedsidebar import NPagedSideBar
from novelwriter.extensions.switch import NSwitch
from novelwriter.types import (
QtAlignCenter, QtDialogApply, QtDialogClose, QtDialogSave, QtRoleAccept,
QtRoleApply, QtRoleReject
)
from novelwriter.types import QtAlignCenter, QtDialogCancel, QtDialogSave
logger = logging.getLogger(__name__)
@@ -89,8 +86,9 @@ class GuiPreferences(NDialog):
self.mainForm.setHelpTextStyle(SHARED.theme.helpText)
# Buttons
self.buttonBox = QDialogButtonBox(QtDialogApply | QtDialogSave | QtDialogClose, self)
self.buttonBox.clicked.connect(self._dialogButtonClicked)
self.buttonBox = QDialogButtonBox(QtDialogSave | QtDialogCancel, self)
self.buttonBox.accepted.connect(self._doSave)
self.buttonBox.rejected.connect(self.reject)
# Assemble
self.searchBox = QHBoxLayout()
@@ -784,19 +782,6 @@ class GuiPreferences(NDialog):
# Private Slots
##
@pyqtSlot("QAbstractButton*")
def _dialogButtonClicked(self, button: QAbstractButton) -> None:
"""Handle button clicks from the dialog button box."""
role = self.buttonBox.buttonRole(button)
if role == QtRoleApply:
self._saveValues()
elif role == QtRoleAccept:
self._saveValues()
self.close()
elif role == QtRoleReject:
self.close()
return
@pyqtSlot(int)
def _sidebarClicked(self, section: int) -> None:
"""Process a user request to switch page."""
@@ -897,7 +882,7 @@ class GuiPreferences(NDialog):
CONFIG.setPreferencesWinSize(self.width(), self.height())
return
def _saveValues(self) -> None:
def _doSave(self) -> None:
"""Save the values set in the form."""
updateTheme = False
needsRestart = False
@@ -1012,4 +997,6 @@ class GuiPreferences(NDialog):
CONFIG.saveConfig()
self.newPreferencesReady.emit(needsRestart, refreshTree, updateTheme, updateSyntax)
self.close()
return
+18 -3
View File
@@ -281,13 +281,28 @@ class NColourLabel(QLabel):
return
def setTextColors(self, *, color: QColor | None = None, faded: QColor | None = None) -> None:
"""Set or update the text colours."""
self._color = color or self._color
self._faded = faded or self._faded
self._refeshTextColor()
return
def setColorState(self, state: bool) -> None:
"""Change the colour state."""
if self._state is not state:
self._state = state
colour = self.palette()
colour.setColor(QPalette.ColorRole.WindowText, self._color if state else self._faded)
self.setPalette(colour)
self._refeshTextColor()
return
def _refeshTextColor(self) -> None:
"""Refresh the colour of the text on the label."""
palette = self.palette()
palette.setColor(
QPalette.ColorRole.WindowText,
self._color if self._state else self._faded,
)
self.setPalette(palette)
return
+3 -3
View File
@@ -2919,10 +2919,10 @@ class GuiDocEditHeader(QWidget):
palette.setColor(QPalette.ColorRole.Window, SHARED.theme.colBack)
palette.setColor(QPalette.ColorRole.WindowText, SHARED.theme.colText)
palette.setColor(QPalette.ColorRole.Text, SHARED.theme.colText)
self.setPalette(palette)
self.itemTitle.setPalette(palette)
self.itemTitle.setTextColors(
color=palette.windowText().color(), faded=SHARED.theme.fadedText
)
return
def changeFocusState(self, state: bool) -> None:
+3 -1
View File
@@ -741,7 +741,9 @@ class GuiDocViewHeader(QWidget):
palette.setColor(QPalette.ColorRole.WindowText, SHARED.theme.colText)
palette.setColor(QPalette.ColorRole.Text, SHARED.theme.colText)
self.setPalette(palette)
self.itemTitle.setPalette(palette)
self.itemTitle.setTextColors(
color=palette.windowText().color(), faded=SHARED.theme.fadedText
)
return
def changeFocusState(self, state: bool) -> None:
+1
View File
@@ -268,6 +268,7 @@ class GuiOutlineToolBar(QToolBar):
self.aExport.setIcon(SHARED.theme.getIcon("export"))
self.tbColumns.setIcon(SHARED.theme.getIcon("menu"))
self.tbColumns.setStyleSheet("QToolButton::menu-indicator {image: none;}")
self.novelLabel.setTextColors(color=self.palette().windowText().color())
return
def populateNovelList(self) -> None:
+30 -14
View File
@@ -1006,32 +1006,48 @@ class GuiMain(QMainWindow):
def _switchFocus(self, paneNo: nwFocus) -> None:
"""Switch focus between main GUI views."""
if paneNo == nwFocus.TREE:
if self.projStack.currentWidget() is self.projView:
if self.projView.treeHasFocus():
self._changeView(nwView.NOVEL)
self.novelView.setTreeFocus()
else:
self.projView.setTreeFocus()
elif self.projStack.currentWidget() is self.novelView:
if self.novelView.treeHasFocus():
self._changeView(nwView.PROJECT)
self.projView.setTreeFocus()
else:
self.novelView.setTreeFocus()
# Decision Matrix
# vM | vP | fP | vN | fN | Focus
# ----|----|----|----|----|---------
# T | T | T | F | F | Novel
# T | T | F | F | F | Project
# T | F | F | T | T | Project
# T | F | F | T | F | Novel
# T | F | F | F | F | Project
# F | T | T | F | F | Project
# F | T | F | F | F | Project
# F | F | F | T | T | Novel
# F | F | F | T | F | Novel
# F | F | F | F | F | Project
vM = self.mainStack.currentWidget() is self.splitMain
vP = self.projStack.currentWidget() is self.projView
vN = self.projStack.currentWidget() is self.novelView
fP = self.projView.treeHasFocus()
fN = self.novelView.treeHasFocus()
self._changeView(nwView.EDITOR)
if (vM and (vP and fP or vN and not fN)) or (not vM and vN):
self._changeView(nwView.NOVEL)
self.novelView.setTreeFocus()
else:
self._changeView(nwView.PROJECT)
self.projView.setTreeFocus()
elif paneNo == nwFocus.DOCUMENT:
self._changeView(nwView.EDITOR)
if self.docEditor.anyFocus():
hasViewer = self.splitView.isVisible()
if hasViewer and self.docEditor.anyFocus():
self.docViewer.setFocus()
elif self.docViewer.anyFocus():
elif hasViewer and self.docViewer.anyFocus():
self.docEditor.setFocus()
else:
self.docEditor.setFocus()
elif paneNo == nwFocus.OUTLINE:
self._changeView(nwView.OUTLINE)
self.outlineView.setTreeFocus()
return
@pyqtSlot(bool, bool, bool, bool)
+7 -11
View File
@@ -30,7 +30,7 @@ from novelwriter import CONFIG, SHARED
from novelwriter.constants import nwUnicode
from novelwriter.dialogs.preferences import GuiPreferences
from novelwriter.dialogs.quotes import GuiQuoteSelect
from novelwriter.types import QtDialogApply, QtDialogClose, QtDialogSave, QtModNone
from novelwriter.types import QtDialogCancel, QtDialogSave, QtModNone
KEY_DELAY = 1
@@ -92,7 +92,8 @@ def testDlgPreferences_Actions(qtbot, monkeypatch, nwGUI):
"""Test the preferences dialog actions."""
monkeypatch.setattr(SHARED._spelling, "listDictionaries", lambda: [("en", "English [en]")])
prefs = GuiPreferences(nwGUI)
prefs.show()
with qtbot.waitExposed(prefs):
prefs.show()
# Check Navigation
vBar = prefs.mainForm.verticalScrollBar()
@@ -116,12 +117,6 @@ def testDlgPreferences_Actions(qtbot, monkeypatch, nwGUI):
prefs._gotoSearch()
assert value.args[0] < old
# Check Apply Button
prefs.show()
with qtbot.waitSignal(prefs.newPreferencesReady) as signal:
prefs.buttonBox.button(QtDialogApply).click()
assert signal.args == [False, False, False, False]
# Check Save Button
prefs.show()
with qtbot.waitSignal(prefs.newPreferencesReady) as signal:
@@ -130,7 +125,7 @@ def testDlgPreferences_Actions(qtbot, monkeypatch, nwGUI):
# Check Close Button
prefs.show()
prefs.buttonBox.button(QtDialogClose).click()
prefs.buttonBox.button(QtDialogCancel).click()
assert prefs.isHidden() is True
# Close Using Escape Key
@@ -152,7 +147,8 @@ def testDlgPreferences_Settings(qtbot, monkeypatch, nwGUI, tstPaths):
monkeypatch.setattr(CONFIG, "listLanguages", lambda *a: languages)
prefs = GuiPreferences(nwGUI)
prefs.show()
with qtbot.waitExposed(prefs):
prefs.show()
# Appearance
prefs.guiLocale.setCurrentIndex(prefs.guiLocale.findData("en_US"))
@@ -315,7 +311,7 @@ def testDlgPreferences_Settings(qtbot, monkeypatch, nwGUI, tstPaths):
with monkeypatch.context() as mp:
mp.setattr(QFontDatabase, "families", lambda *a: ["TestFont"])
with qtbot.waitSignal(prefs.newPreferencesReady) as signal:
prefs.buttonBox.button(QtDialogApply).click()
prefs.buttonBox.button(QtDialogSave).click()
assert signal.args == [True, True, True, True]
# Check Settings