From 45c4f3cb97dcf1b51b588fd1f8a5301cd0d6a9f6 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Wed, 16 Feb 2022 17:43:50 +0100 Subject: [PATCH 01/16] Add Out of Cheese Error (#1000) * Add error dialog window title * Add more error messages --- novelwriter/error.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/novelwriter/error.py b/novelwriter/error.py index 88268e5e..0dec56e8 100644 --- a/novelwriter/error.py +++ b/novelwriter/error.py @@ -24,6 +24,7 @@ along with this program. If not, see . """ import sys +import random import logging from PyQt5.QtCore import Qt @@ -86,6 +87,13 @@ class NWErrorMessage(QDialog): self.mainBox.addWidget(self.btnBox, 2, 0, 1, 2) self.mainBox.setSpacing(16) + self.setWindowTitle([ + "+++ Out of Cheese Error +++", + "+++ Divide by Cucumber Error +++", + "+++ Whoops! Here Comes The Cheese! +++", + "+++ Please Reinstall Universe and Reboot +++", + ][random.randint(0, 3)]) + self.setLayout(self.mainBox) self.setMinimumWidth(500) From be703c1f462886f4dc16574878dd902918d0f792 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sun, 20 Feb 2022 20:09:24 +0100 Subject: [PATCH 02/16] Merge Release 1.6 (#1003) * Update Spanish translation * Bumb version and update changelog and release notes * Add a note in the changelog --- CHANGELOG.md | 69 +- docs/source/conf.py | 2 +- i18n/nw_es_419.ts | 1743 +++++++-------------- novelwriter/__init__.py | 6 +- novelwriter/assets/text/release_notes.htm | 38 +- sample/nwProject.nwx | 6 +- 6 files changed, 637 insertions(+), 1227 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2cd954b8..1dcc02db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,72 @@ # novelWriter Changelog +## Version 1.6 [2022-02-20] + +### Release Notes + +This release does not introduce any major new features, but is instead a collection of minor +improvements and tweaks based on user requests. There are also a number of changes under the hood +to improve the structure and performance of novelWriter. + +Some key improvements to the user interface are: + +* The max text width setting in Preferences now also applies to the document viewer, and the + setting itself on the Preference dialog has been simplified a bit. +* When text is selected in the document editor, the number of words selected is displayed in the + editor's footer area. +* The search tool in the document editor now shows the number of results in the document. +* The Enter and Ctrl+O keyboard shortcuts should now work the same way in all tree views. +* It is now possible to set a blank section title format on the Build Novel Project tool and get + empty paragraphs in the output. Previously, a blank format would just remove the section break + entirely. This change allows the user to define hard and soft scene breaks using level three and + four headings. The scene and section titles can be hidden completely with two new switches added + to the user interface. + +Other feature changes include: + +* The project index is now automatically rebuilt in the event it is empty or incomplete when the + project is opened. +* The user can now add their own syntax and GUI theme files in the app folder in their user area on + the host operating system. Where the custom files must be added is described in the + documentation. +* A Windows installer is yet again provided for novelWriter. If you have novelWriter installed + using another method, make sure you uninstall it properly first as the two methods are not + compatible. +* Release versions for Ubuntu 21.04 have been dropped, and added for the upcoming Ubuntu 22.04. +* Most translations have been updated. A Dutch translation is in the works. + +In addition to these changes, the documentation has been completely restructured and a new theme +added. The theme has a light and a dark mode. + +_These Release Notes also include the changes from 1.6 Beta 1 and RC 1._ + +### Detailed Changelog + +**User Interface** + +* The default OS font is not always suitable for editing documents. The default editor font is now + Arial on Windows and Courier on macOS; if those fonts are available on the platform. Issue #988. + PR #990. +* Added some some random error messages from Discworld to the error dialog shown when novelWriter + crashes. They are visible on the dialog title bar if the title bar is visible on the platform. + This is just a fun addition made to note the #1000 addition to novelWriter. PR #1000. + +**Installation** + +* Dropped the Ubuntu 21.04 release as it is now deprecated, and added a release package for the + upcoming Ubuntu 22.04. PR #987. + +**Internationalisation** + +* The French, Norwegian and Portuguese (Brazil) translations have been updated. #992. + +**Documentation** + +* Some minor improvements have been made to the Introduction section of the documentations. + PR #991. + +---- + ## Version 1.6 RC 1 [2022-02-06] ### Release Notes @@ -97,7 +164,7 @@ final release. * Custom GUI themes and syntax themes can now be loaded from the user's data path. The actual storage path is determined by the OS. Part of Feature Request #892. PR #893. * A number of text messages and labels on the GUI have been improved. Issue #923. PR #926. -* The switch in Preferences to disbale fixed width text in the editor has been removed. Instead, +* The switch in Preferences to disable fixed width text in the editor has been removed. Instead, the user just sets the fixed with setting to 0 to disable it. The settings is now also applied to the document viewer as well. Issue #924. PR #943. * The Open Document export file produced from the build tool is now more LibreOffice and OpenOffice diff --git a/docs/source/conf.py b/docs/source/conf.py index a47d4627..b8dbf3f6 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -55,7 +55,7 @@ html_theme_options = { "light_logo": "novelwriter-light.png", "dark_logo": "novelwriter-dark.png", } -html_title = f"
Documentation
Version {release}
" +html_title = f"
Documentation Version {release}
" # -- Options for HTMLHelp Output --------------------------------------------- diff --git a/i18n/nw_es_419.ts b/i18n/nw_es_419.ts index 0c76fdcb..223d9acf 100644 --- a/i18n/nw_es_419.ts +++ b/i18n/nw_es_419.ts @@ -119,8 +119,9 @@ Objetos + - Entity + Entities Entidades @@ -131,8 +132,8 @@ - Outtakes - Material Descartado + Archive + Archivo @@ -192,11 +193,6 @@ Focus Foco - - - Entities - Entidades - Title @@ -499,7 +495,7 @@ 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. - 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. + Dejar en blanco para omitir este encabezado, o establecer un texto estático, como por ejemplo '{0}', para crear un separador. El separador se centrará automáticamente y sólo aparecerá entre las secciones del mismo tipo. @@ -507,282 +503,277 @@ No establecido - + Title Título - + Chapter Capítulo - + Unnumbered Sin numerar - + Scene Escena - + Section Sección - + Language Idioma - + + Hide scene + Hide scene + + + + Hide section + Hide section + + + Font Options Opciones de tipografía - + Font family Tipografía - + Font size Tamaño - + Line height Altura de línea - + Justify text Justificar el texto - + Disable styling Desactivar los estilos - + Styling Options Opciones de Estilo - + Include Options Opciones de inclusión - + Include synopsis Incluir sinopsis - + Include comments Incluir los comentarios - + Include keywords Incluir las palabras clave - + Include body text Incluir el cuerpo del texto - + File Filter Options Opciones de Filtrado de Archivos - - Include files with layouts other than 'Note'. - Include files with layouts other than 'Note'. - - - - Include files with layout 'Note'. - Include files with layout 'Note'. - - - - Ignore the 'Include when building project' setting and include all files in the output. - Ignore the 'Include when building project' setting and include all files in the output. - - - + Include novel files Incluir archivos de la novela - + Include note files Incluir archivos de las notas - + Ignore export flag Omitir la opción de exportado - + Export Options Opciones de exportado - + Replace tabs with spaces Reemplazar tabulaciones por espacios - + Replace Unicode in HTML Reemplazar el Unicode en HTML - + Build Preview Vista Previa de la Novela - + Print Imprimir - + Print Preview Vista Previa de Impresión - + Print to PDF Imprimir a PDF - + Save As Guardar Como - + Open Document (.odt) Open Document (.odt) - + Flat Open Document (.fodt) Flat Open Document (.fodt) - + novelWriter HTML (.htm) HTML de novelWriter (.htm) - + novelWriter Markdown (.nwd) Markdown de novelWriter (.nwd) - + Standard Markdown (.md) Markdown Estándar (.md) - + GitHub Markdown (.md) Markdown de GitHub (.md) - + JSON + novelWriter HTML (.json) JSON + HTML de novelWriter (.json) - + JSON + novelWriter Markdown (.json) JSON + Markdown de novelWriter (.json) - + Close Cerrar - + Failed to generate preview. The result is too big. No se pudo generar la vista previa. El resultado es demasiado grande. - + There were problems when building the project: Se hallaron problemas al compilar el proyecto: - + Open Document Open Document - + Flat Open Document Flat Open Document - + Plain HTML HTML plano - + novelWriter Markdown Markdown de novelWriter - + Standard Markdown Markdown Estándar - + GitHub Markdown Markdown de GitHub - + JSON + novelWriter HTML JSON + HTML de novelWriter - + JSON + novelWriter Markdown JSON + Markdown de novelWriter - + PDF PDF - + Save Document As Guardar el Documento Como - + {0} file successfully written to: El archivo {0} se ha guardado con éxito en: - + Failed to write {0} file. {1} Hubo un fallo al escribir el archivo {0}. {1} @@ -790,50 +781,50 @@ GuiBuildNovelDocView - + This area will show the content of the document to be exported or printed. Press the "Build Preview" button to generate content. - This area will show the content of the document to be exported or printed. Press the "Build Preview" button to generate content. + Esta área mostrará el contenido del documento a exportar o imprimir. Pulse el botón "Crear vista previa" para generar el contenido. - + Unknown Desconocido - + Build Time: - Build Time: + Tiempo de Compilación: GuiDocEditFooter - + Status Estado - + Line: {0} ({1}) Línea: {0} ({1}) - + Words: {0} ({1}) Palabras: {0} ({1}) - + Document size is {0} bytes El tamaño del documento es de {0} bytes - + Words: {0} selected Palabras: {0} seleccionadas - + Character count: {0} Total de caracteres: {0} @@ -841,22 +832,22 @@ GuiDocEditHeader - + Edit document meta Editar metadatos del documento - + Search document Buscar en el documento - + Toggle Focus Mode Alternar el Modo Enfocado - + Close the document Cerrar el documento @@ -880,82 +871,42 @@ Sensibilidad a Mayúsculas y Minúsculas - - Match case - Coincidir mayúsculas y minúsculas - - - + Whole Words Only Sólo Palabras Enteras - - Match whole words - Coincidir palabras enteras - - - + RegEx Mode Modo ExReg - - Search using regular expressions - Buscar usando expresiones regulares - - - + Loop Search Reiniciar la Búsqueda - - Loop the search when reaching the end - Continuar la búsqueda desde el principio tras llegar al final - - - + Search Next File Buscar en el Siguiente Archivo - - Continue searching in the next file - Continuar la búsqueda en el archivo siguiente - - - + Preserve Case Conservar Mayúsculas y Minúsculas - - Preserve case on replace - Al reemplazar, conservar mayúsculas y minúsculas - - - + Close Search Cerrar la Búsqueda - - Close the search box [{0}] - Cerrar el cuadro de búsqueda [{0}] - - - - Show/hide the replace text box - Mostrar/ocultar el cuadro de reemplazado de texto - - - + Find in current document Buscar en el documento actual - + Find and replace in current document Buscar y reemplazar en el documento actual @@ -985,7 +936,7 @@ This document has been changed outside of novelWriter while it was open. Overwrite the file on disk? - This document has been changed outside of novelWriter while it was open. Overwrite the file on disk? + Este documento ha cambiado por fuera de novelWriter estando abierto. ¿Sobreescribir en el disco? @@ -1286,7 +1237,7 @@ 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}. - 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}. + No se pudo encontrar la referencia para la etiqueta '{0}'. O no existe, o se ha desactualizado el índice. Éste se puede actualizar desde el menú Herramientas, o presionando {1}. @@ -1424,7 +1375,7 @@ - Cannot create new project when another project is open. + Cannot create a new project when another project is open. No se puede crear un nuevo proyecto mientras haya un proyecto abierto. @@ -1448,7 +1399,7 @@ ¿Cerrar el proyecto actual? - + Changes are saved automatically. Los cambios se guardan automáticamente. @@ -1466,7 +1417,7 @@ The project was locked by the computer '{0}' ({1} {2}), last active on {3}. - The project was locked by the computer '{0}' ({1} {2}), last active on {3}. + El proyecto fue bloqueado por el equipo '{0}' ({1} {2}), por última vez activo el {3}. @@ -1489,103 +1440,103 @@ El índice del proyecto está dañado o desactualizado. Recomponiendo el índice. - + Text files ({0}) Archivos de texto ({0}) - + Markdown files ({0}) Archivos de Markdown ({0}) - + novelWriter files ({0}) Archivos de novelWriter ({0}) - + All files ({0}) Todos los archivos ({0}) - + Import File Importar un Archivo - + Could not read file. The file must be an existing text file. No se pudo leer el archivo. El archivo debe ser un archivo de texto existente. - + Please open a document to import the text file into. Por favor abra un documento en el cual importar el archivo de texto. - + Import Document Importar un Documento - + Importing the file will overwrite the current content of the document. Do you want to proceed? El contenido actual del documento será sobrescrito al importar el archivo. ¿Desea continuar? - - + + Indexing: '{0}' - Indexing: '{0}' + Indexando: '{0}' - + Unknown item Ítem desconocido - + Indexing completed in {0} ms Se completó el indexado en {0} ms - + The project index has been successfully rebuilt. El índice del proyecto se ha reconstruido con éxito. - + Information Información - + Warning Advertencia - + Error Error - + This is a bug! ¡Esto es una falla del programa! - + Internal Error Error Interno - + Exit Salir - + Do you want to exit novelWriter? ¿Desea salir de novelWriter? @@ -1603,1203 +1554,670 @@ Proyecto Nuevo - - Create new project - Crea un nuevo proyecto - - - + Open Project Abrir Proyecto - - Open project - Abre un proyecto - - - + Save Project Guardar Proyecto - - Save project - Guarda el proyecto actual - - - + Close Project Cerrar Proyecto - - Close project - Cierra el proyecto actual - - - + Project Settings Configuración del Proyecto - - Project settings - Accede a la configuración del proyecto - - - + Project Details Detalles del Proyecto - - Project details - Accede a los detalles del proyecto - - - + Create Root Folder Crear Carpeta Raíz - + Novel Root Raíz para la Novela - + Plot Root Raíz para los Argumentos - + Character Root Raíz para los Personajes - + Location Root Raíz para las Ubicaciones - + Timeline Root Raíz para las Líneas de Tiempo - + Object Root Raíz para los Objetos - + Entity Root Raíz para las Entidades - + Custom Root Raíz Personalizada - - Outtakes Root - Raíz para el Material Descartado + + Archive Root + Raíz para un Archivo - + Create Folder Crear Carpeta - - Create folder - Crea una carpeta nueva - - - + Edit Item Editar Ítem - - Change project item settings - Cambia la configuración del ítem del proyecto - - - + Delete Item Eliminar Ítem - - Delete selected project item - Elimina el ítem seleccionado del proyecto - - - + Move Item Up Desplazar Ítem hacia Arriba - - Move project item up - Mueve el ítem hacia arriba - - - + Move Item Down Desplazar Ítem hacia Abajo - - Move project item down - Mueve el ítem hacia abajo - - - + Undo Last Move Deshacer el Desplazamiento - - Undo last item move - Deshace el último desplazamiento de ítem - - - + Empty Trash Vaciar la Papelera - - Permanently delete all files in the Trash folder - Elimina permanentemente todos los archivos en la carpeta Papelera - - - + Exit Salir - - Exit novelWriter - Abandona novelWriter - - - + &Document &Documento - + New Document Documento Nuevo - - Create new document - Crea un documento nuevo - - - + Open Document Abrir Documento - - Open selected document - Abre un documento - - - + Save Document Guardar Documento - - Save current document - Guarda el documento actual - - - + Close Document Cerrar Documento - - Close current document - Cierra el documento actual - - - + View Document Previsualizar Documento - - View document as HTML - Abre la vista previa HTML del documento - - - + Close Document View Cerrar Previsualización - - Close document view pane - Cierra el panel de vista previa del documento - - - + Show File Details Mostrar Detalles del Archivo - - Shows a message box with the document location in the project folder - Muestra un cuadro de texto con la ubicación del documento dentro de la carpeta del proyecto + + Import Text from File + Importar Texto desde un Archivo - - Import from File - Importar desde un Archivo - - - - Import document from a text or markdown file - Importa un documento a partir de un archivo de texto o markdown - - - + Merge Folder to Document Combinar Carpeta en Documento - - Merge a folder of documents to a single document - Combina una carpeta de documentos a un solo documento - - - + Split Document to Folder Separar Documento a Carpeta - - Split a document into a folder of multiple documents - Separa el documento en múltiples documentos en una carpeta - - - + &Edit &Editar - + Undo Deshacer - - Undo last change - Deshace el último cambio - - - + Redo Rehacer - - Redo last change - Vuelve a hacer el último cambio - - - + Cut Cortar - - Cut selected text - Corta el texto seleccionado - - - + Copy Copiar - - Copy selected text - Copia el texto seleccionado - - - + Paste Pegar - - Paste text from clipboard - Pega un texto desde el portapapeles - - - + Select All Seleccionar Todo - - Select all text in document - Selecciona todo el texto del documento - - - + Select Paragraph Seleccionar Párrafo - - Select all text in paragraph - Selecciona todo el texto del párrafo - - - + &View &Ver - - Focus Project Tree - Enfocar el Árbol del Proyecto + + Go to Project Tree + Ir al Árbol del Proyecto - - Move focus to project tree - Cambia el foco al árbol del proyecto + + Go to Document Editor + Ir al Editor de Documentos + + + + Go to Document Viewer + Ir a la Visualización + + + + Go to Outline + Ir a la Estructura + + + + Navigate Backward + Navegar hacia atrás - Focus Document Editor - Enfocar el Editor de Documentos + Navigate Forward + Navegar hacia adelante - - Move focus to left document pane - Cambia el foco al panel de documentos izquierdo - - - - Focus Document Viewer - Enfocar la Previsualización - - - - Move focus to right document pane - Cambia el foco al panel de documentos derecho - - - - Focus Outline - Enfocar Estructura - - - - Move focus to outline - Cambia el foco al panel de estructura del proyecto - - - - Go Backward - Ir Atrás - - - - Move backward in the view history of the right pane - Retrocede un paso en el historial del panel de la derecha - - - - Go Forward - Ir Adelante - - - - Move forward in the view history of the right pane - Avanza un paso en el historial del panel de la derecha - - - + Focus Mode Modo Enfocado - - Toggles a distraction free mode, only showing text editor - Alterna a un modo libre de distracciones, que solamente muestra el editor de texto - - - + Full Screen Mode Modo Pantalla Completa - - Maximises the main window - Maximiza la ventana principal - - - + &Insert &Insertar - + Dashes Rayas y Guiones - + Short Dash Guion - - Insert short dash (en dash) - Inserta un guion auxiliar - - - + Long Dash Raya - - Insert long dash (em dash) - Inserta un guion largo - - - + Horizontal Bar Barra Horizontal - - Insert a horizontal bar (quotation dash) - Inserta una barra horizontal (raya de diálogo) - - - + Figure Dash Guion de Combinación - - Insert figure dash (same width as a number character) - Inserta un guion de combinación gráfica (del mismo ancho que el carácter de un número) - - - + Quote Marks Comillas - + Left Single Quote Comilla Simple de Apertura - - Insert left single quote - Inserta una comilla simple de apertura - - - + Right Single Quote Comilla Simple de Cierre - - Insert right single quote - Inserta una comilla simple de cierre - - - + Left Double Quote Comilla Doble de Apertura - - Insert left double quote - Inserta una comilla doble de apertura - - - + Right Double Quote Comilla Doble de Cierre - - Insert right double quote - Inserta una comilla doble de cierre - - - + Alternative Apostrophe Apóstrofo Alternativo - - Insert modifier letter single apostrophe - Inserta un apóstrofo - - - + General Punctuation Puntuación General - + Ellipsis Puntos Suspensivos - - Insert ellipsis - Inserta puntos suspensivos - - - + Prime Prima - - Insert a prime symbol - Inserta el signo de prima - - - + Double Prime Doble Prima - - Insert a double prime symbol - Inserta el signo de doble prima - - - + White Spaces Espacio - + Non-Breaking Space Espacio Duro - - Insert a non-breaking space - Inserta un espacio de no separación (entre renglones) - - - + Thin Space Espacio Angosto - - Insert a thin space - Inserta un espacio angosto - - - + Thin Non-Breaking Space Espacio Duro Angosto - - Insert a thin non-breaking space - Inserta un espacio de no separación (entre renglones) angosto - - - + Other Symbols Otros Signos - + List Bullet Viñeta de Lista - - Insert a list bullet - Inserta una viñeta de lista - - - + Hyphen Bullet Viñeta Guion - - Insert a hyphen bullet (alternative bullet) - Inserta un guion como viñeta alternativa - - - + Flower Mark Signo Flor - - Insert a flower mark (alternative bullet) - Inserta un signo de puntuación en flor como viñeta alternativa - - - + Per Mille Por Mil - - Insert a per mille symbol - Inserta el signo por mil - - - + Degree Symbol Signo de Grado - - Insert a degree symbol - Inserta el signo de grado - - - + Minus Sign Signo Menos - - Insert a minus sign (not a hypen or dash) - Inserta un signo menos (no un guion ni raya) - - - + Times Sign Signo de Multiplicación - - Insert a times sign (multiplication cross) - Inserta el signo aspa de multiplicación - - - + Division Sign Signo de División - - Insert a division sign - Inserta un signo óbelo de división - - - + Tags and References Etiquetas y Referencias - + Page Break and Space Saltos - + Page Break Salto de Página - - Insert a page break command - Inserta un comando de salto de página - - - + Vertical Space (Single) Salto Vertical (Único) - - Insert a vertical space equal to one paragraph - Inserta un espacio vertical equivalente a un párrafo - - - + Vertical Space (Multi) Salto Vertical (Múltiple) - - Insert a vertical space equal to n paragraphs - Inserta un espacio vertical equivalente a n párrafos - - - + &Format &Formato - + Emphasis Énfasis - - Add emphasis to selected text (italic) - Añade énfasis (cursiva) al texto seleccionado - - - + Strong Emphasis Énfasis fuerte - - Add strong emphasis to selected text (bold) - Añade énfasis fuerte (negrita) al texto seleccionado - - - + Strikethrough Tachado - - Add strikethrough to selected text - Tacha el texto seleccionado - - - + Wrap Double Quotes Envolver con Comillas Dobles - - Wrap selected text in double quotes - Envuelve el texto seleccionado con comillas dobles - - - + Wrap Single Quotes Envolver con Comillas Simples - - Wrap selected text in single quotes - Envuelve el texto seleccionado con comillas simples - - - + Header 1 (Partition) Encabezado 1 (Partición) - - Set the text block format to Header 1 (Partition) - Cambia el formato del bloque de texto a Encabezado 1 (Partición) - - - + Header 2 (Chapter) Encabezado 2 (Capítulo) - - Set the text block format to Header 2 (Chapter) - Cambia el formato del bloque de texto a Encabezado 2 (Capítulo) - - - + Header 3 (Scene) Encabezado 3 (Escena) - - Set the text block format to Header 3 (Scene) - Cambia el formato del bloque de texto a Encabezado 3 (Escena) - - - + Header 4 (Section) Encabezado 4 (Sección) - - Set the text block format to Header 4 (Section) - Cambia el formato del bloque de texto a Encabezado 4 (Sección) - - - + Novel Title Título de la Novela - - Set the text block format to Novel Title - Cambia el formato del bloque de texto a Título de Novela - - - + Unnumbered Chapter Capítulo Sin Número - - Set the text block format to Unnumbered Chapter - Cambia el formato del bloque de texto a Capítulo Sin Numerar - - - + Align Left Alinear a la Izquierda - - Left-align the text block - Ajusta la alineación del bloque de texto a la izquierda - - - + Align Centre Alinear al Centro - - Centre the text block - Ajusta la alineación del bloque de texto al centro - - - + Align Right Alinear a la Derecha - - Right-align the text block - Ajusta la alineación del bloque a la derecha - - - + Indent Left Indentar a la Izquierda - - Increase the text block's left margin - Increase the text block's left margin - - - + Indent Right Indentar a la Derecha - - Increase the text block's right margin - Increase the text block's right margin + + Toggle Comment + Alternar a Comentario - - Comment - Comentario - - - - Change the text block format to comment - Cambia el formato del bloque de texto a comentario - - - + Remove Block Format Quitar Formato del Bloque - - Strip text block format - Elimina el formato del bloque de texto + + Convert Single Quotes + Convertir Comillas Simples de Apertura - - Replace Single Quotes - Reemplazar Comillas Simples + + Convert Double Quotes + Convertir Comillas Dobles de Apertura - - Replace all straight single quotes in the selected text - Reemplaza todas las comillas simples en el texto seleccionado - - - - Replace Double Quotes - Reemplazar Comillas Dobles - - - - Replace all straight double quotes in the selected text - Reemplaza todas las comillas dobles en el texto seleccionado - - - + Remove In-Paragraph Breaks Quitar los Quiebres de Párrafo - - Remove all line breaks within paragraphs in the selected text - Elimina todos los quiebres de línea que ocurrieran dentro de los párrafos en el texto seleccionado - - - + &Search &Búsqueda - + Find Buscar - - Find text in document - Halla un texto en el documento - - - + Replace Reemplazar - - Replace text in document - Reemplaza un texto en el documento - - - + Find Next Buscar Siguiente - - Find next occurrence of text in document - Busca la siguiente coincidencia de texto en el documento - - - + Find Previous Buscar Anterior - - Find previous occurrence of text in document - Busca la anterior coincidencia de texto en el documento - - - + Replace Next Reemplazar Siguiente - - Find and replace next occurrence of text in document - Busca y reemplaza la siguiente coincidencia de texto en el documento - - - + &Tools &Herramientas - + Check Spelling Comprobar Ortografía - - Toggle check spelling - Activa la búsqueda de errores ortográficos - - - + Re-Run Spell Check Reiniciar la Comprobación Ortográfica - - Run the spell checker on current document - Vuelve a comprobar la ortografía del documento actual - - - + Project Word List Lista de Palabras del Proyecto - - Edit the project's word list - Edit the project's word list - - - + Rebuild Index Reconstruir el Índice - - Rebuild the tag indices and word counts - Reconstruye los índices de etiquetas y el total de palabras - - - + Rebuild Outline Reconstruir Estructura - - Rebuild the novel outline tree - Reconstruye el árbol de la estructura de la novela - - - + Auto-Update Outline Actualizar Estructura Automáticamente - - Update project outline when a novel file is changed - Actualiza la estructura del proyecto cuando cambia un archivo de novela - - - - Backup Project Folder - Respaldar Datos de la Carpeta del Proyecto - - - + Backup Project Crea una copia de seguridad del proyecto - + Build Novel Project Compilar el Proyecto de Novela - - Launch the Build novel project tool - Lanza la herramienta de compilación de la novela - - - + Writing Statistics Estadísticas de Redacción - - Show the writing statistics dialogue - Muestra el diálogo de estadísticas de redacción - - - - + Preferences Preferencias - + &Help &Ayuda - - + About novelWriter Acerca de novelWriter - - + About Qt5 Acerca de Qt5 - + User Manual (Online) Manual de Usuario (En línea) - - Open documentation in browser - Abre la documentación en un navegador de internet - - - + User Manual (PDF) Manual de Usuario (PDF) - - Open PDF documentation - Abre la documentación en formato PDF - - - + Report an Issue (GitHub) Reportar un Problema (GitHub) - - Report a bug or issue on GitHub at {0} - Reporte su problema o falla en GitHub en {0} (en idioma inglés) - - - + Ask a Question (GitHub) Hacer una Pregunta (GitHub) - - Ask a question on GitHub at {0} - Realice su pregunta en GitHub en {0} (en idioma inglés) - - - + The novelWriter Website El Sitio Web de novelWriter - - Open the novelWriter website at {0} - Abre el sitio web de novelWriter en {0} - - - + Check for New Release Verificar Versiones Nuevas - - - Check for latest release of novelWriter - Comprueba cuál es la publicación más reciente de novelWriter - GuiMainStatus @@ -2998,107 +2416,103 @@ GuiPreferencesAutomation - + Automatic Features Características Automáticas - + Auto-select word under cursor Seleccionar la palabra bajo el cursor - + Apply formatting to word under cursor if no selection is made. Se aplicará el formato a la palabra situada bajo el cursor si no hay selección. - + Auto-replace text as you type Reemplazar el texto mientras se escribe - + Allow the editor to replace symbols as you type. Permite al editor reemplazar símbolos mientras escriba. - + Replace as You Type Reemplazar Mientras Escriba - + Auto-replace single quotes Reemplazar comillas simples - - Try to guess which is an opening or a closing single quote. - Se intentará adivinar cuál comilla simple es de apertura o de cierre. + + + Try to guess which is an opening or a closing quote. + Se intentará adivinar cuáles comillas son de apertura o de cierre. - + Auto-replace double quotes Reemplazar comillas dobles - - Try to guess which is an opening or a closing double quote. - Se intentará adivinar cuál comilla doble es de apertura o de cierre. - - - + Auto-replace dashes Reemplazar guiones - + Double and triple hyphens become short and long dashes. Los guiones dobles y triples se convertirán en rayas cortas y largas. - + Auto-replace dots Reemplazar puntos - + Three consecutive dots become ellipsis. Tres puntos consecutivos se convierten en el carácter de puntos suspensivos. - + Automatic Padding Relleno Automático - + Insert non-breaking space before Insertar un espacio de no separación previo - + Automatically add space before any of these symbols. Añade un espacio automáticamente delante de un símbolo de esta lista. - + Insert non-breaking space after Insertar un espacio de no separación posterior - + Automatically add space after any of these symbols. Añade un espacio automáticamente detrás de un símbolo de esta lista. - + Use thin space instead Usar un espacio angosto - + Inserts a thin space instead of a regular space. Inserta un espacio angosto en lugar de un espacio regular. @@ -3116,20 +2530,18 @@ Tipografía + + + - Font for the document editor and viewer. - Fuente a usar en el editor y el previsualizador de documentos. + Applies to both document editor and viewer. + A usar tanto en el editor como en el previsualizador de documentos. Font size Tamaño - - - Font size for the document editor and viewer. - Tamaño de la fuente para el editor y el previsualizador de documentos. - pt @@ -3143,12 +2555,12 @@ Maximum text width in "Normal Mode" - Maximum text width in "Normal Mode" + Anchura máxima del texto en "Modo Normal" Set to 0 to disable this feature. - Set to 0 to disable this feature. + Establecer en 0 para desactivar esta función. @@ -3161,42 +2573,32 @@ Maximum text width in "Focus Mode" - Maximum text width in "Focus Mode" + Anchura máxima del texto en "Modo Enfocado" The maximum width cannot be disabled. - The maximum width cannot be disabled. + La anchura máxima no se puede desactivar. Hide document footer in "Focus Mode" - Hide document footer in "Focus Mode" + Ocultar el pie del documento en el "Modo Enfocado" - Hide the information bar at the bottom of the document. - Esconde la barra de información al pie del documento. + Hide the information bar in the document editor. + Oculta la barra de información del editor del documento. - Justify the text margins in editor and viewer - Justificar los márgenes del texto en el editor y el previsualizador - - - - Lay out text with straight edges in the editor and viewer. - Alinea el texto con bordes rectos en el editor y el previsualizador. + Justify the text margins + Justificar los márgenes del texto - Text margin - Márgen del texto - - - - The minimum margin around the text in the editor and viewer. - The minimum margin around the text in the editor and viewer. + Minimum text margin + Margen mínimo del texto @@ -3228,8 +2630,8 @@ - Spell check language ({0}) - Idioma de la comprobación ortográfica ({0}) + Spell check language + Idioma de la comprobación ortográfica @@ -3263,86 +2665,66 @@ - How often the word count is updated. - Con qué frecuencia se actualizará el total de palabras. - - - seconds segundos - - Include project notes in total word count + + Include project notes in status bar word count Incluir a las notas del proyecto en el total de palabras - - Affects the word count shown on the status bar. - Afectará al total de palabras que se muestra en la barra de estado. - - - + Writing Guides Guías de Escritura - + Show tabs and spaces Mostrar tabulaciones y espacios - - Add symbols to indicate tabs and spaces in the editor. - Añade símbolos en el editor que indican la presencia de tabulaciones y espacios. - - - + Show line endings Mostrar fin de línea - - Add a symbol to indicate line endings in the editor. - Añade un símbolo en el editor que indica la presencia del final de cada línea. - - - + Scroll Behaviour Desplazamiento - + Scroll past end of the document Desplazar más allá del final del documento - + Set to 0 to disable this feature. - Set to 0 to disable this feature. + Establecer en 0 para desactivar esta función. - + lines - lines + líneas - + Typewriter style scrolling when you type Desplazamiento estilo "máquina de escribir" cuando teclea - - Try to keep the cursor at a fixed vertical position. - Intentará conservar el cursor de texto en una posición vertical fija. + + Keeps the cursor at a fixed vertical position. + Conservará el cursor de texto en una posición vertical fija. - + Minimum position for Typewriter scrolling Posicionamiento mínimo para desplazar tipo "Máquina de escribir" - + Percentage of the editor height from the top. Un porcentaje de la altura del editor desde el tope. @@ -3365,8 +2747,8 @@ - Changing this requires restarting novelWriter. - Será necesario reiniciar novelWriter tras cambiar esto. + Requires restart. + Requiere reinicio. @@ -3405,8 +2787,8 @@ - The novel document labels will be bold and underlined. - Las etiquetas de documentos de novela se mostrarán en negrita y subrayadas. + Makes them stand out in the project tree. + Hace que se destaquen en el árbol del proyecto. @@ -3449,7 +2831,7 @@ - How often the open document is automatically saved. + How often the document is automatically saved. Con qué frecuencia se guardará automáticamente el documento actual. @@ -3465,7 +2847,7 @@ - How often the open project is automatically saved. + How often the project is automatically saved. Con qué frecuencia se guardará automáticamente el proyecto actual. @@ -3548,47 +2930,47 @@ GuiPreferencesQuotes - + Quotation Style Empleo de Comillas - + Single quote open style Estilo de comilla de apertura simple - + The symbol to use for a leading single quote. El símbolo a usar para una comilla de apertura simple. - + Single quote close style Estilo de comilla de cierre simple - + The symbol to use for a trailing single quote. El símbolo a usar para una comilla de cierre simple. - + Double quote open style Estilo de comilla de apertura doble - + The symbol to use for a leading double quote. El símbolo a usar para una comilla de apertura doble. - + Double quote close style Estilo de comilla de cierre doble - + The symbol to use for a trailing double quote. El símbolo a usar para una comilla de cierre doble. @@ -3596,84 +2978,76 @@ GuiPreferencesSyntax - + Highlighting Theme Tema de Resaltado - + Highlighting theme Tema de resaltado - - Colour theme to apply to the editor and viewer. + + Colour theme for the editor and viewer. Tema de colores que aplicar al editor y al previsualizador. - + Quotes & Dialogue Citas y Diálogos - + Highlight text wrapped in quotes Resaltar el texto entrecomillado - - Applies to single, double and straight quotes. - Se aplicará a las comillas simples y dobles, y a apóstrofos. + + + + Applies to the document editor only. + A usar en el editor de documentos. - + Allow open-ended single quotes Permitir comillas simples sin cierre - + Highlight single-quoted line with no closing quote. Se resaltará la línea de la comilla simple sin una comilla de cierre. - + Allow open-ended double quotes Permitir comillas dobles sin cierre - + Highlight double-quoted line with no closing quote. Se resaltará la línea de comillas dobles sin comillas de cierre. - + Text Emphasis Énfasis - + Add highlight colour to emphasised text Añadir resalte de color al texto enfatizado - - Applies to emphasis (italic) and strong (bold). - Se aplicará al énfasis (cursiva) y al énfasis fuerte (negrita). - - - + Text Errors Errores del Texto - - Mark redundant spaces - Marcar los espacios redundantes - - - - Trailing spaces or multiple spaces between words. - Los múltiples espacios entre palabras o de fin de línea. + + Highlight multiple spaces + Resaltar espacios múltiples @@ -3693,11 +3067,6 @@ Contents Contenido - - - Close - Cerrar - GuiProjectDetailsContents @@ -3877,45 +3246,30 @@ GuiProjectEditReplace - + Text Replace List for Preview and Export Lista de Reemplazos de Texto para Previsualizar y Exportar - + Keyword Palabra Clave - + Replace With Reemplazar Con - - Add new entry - Añadir una entrada nueva - - - - Delete selected entry - Eliminar la entrada seleccionada - - - + Select item to edit Seleccionar el ítem a editar - + Save Guardar - - - Save entry - Guardar entrada - GuiProjectEditStatus @@ -3940,57 +3294,47 @@ Uso - - Add new entry - Añadir una entrada nueva - - - - Delete selected entry - Eliminar la entrada seleccionada - - - + Select item to edit Seleccionar el ítem a editar - + Colour Color - + Save Guardar - + Select Colour Escoger un Color - + New Item Nuevo Ítem - + Cannot delete a status item that is in use. No se puede eliminar un ítem de estado actualmente en uso. - + Not in use No está en uso - + Used once Un ítem lo usa - + Used by {0} items {0} ítems lo usan @@ -4056,7 +3400,7 @@ Remove '{0}' from the recent projects list? The project files will not be deleted. - Remove '{0}' from the recent projects list? The project files will not be deleted. + ¿Eliminar '{0}' de la lista de proyectos recientes? Los archivos del proyecto no se eliminarán. @@ -4130,143 +3474,143 @@ Por favor seleccione una ubicación válida en el árbol para añadir la carpeta. - - + + Did not find anywhere to add the file or folder! ¡No se encontró dónde añadir el archivo o carpeta! - + Cannot add new files or folders to the Trash folder. No se puede añadir nuevos archivos o carpetas a la carpeta Papelera. - + New File Nuevo Archivo - + Cannot add new folder to this item. Maximum folder depth has been reached. No se puede añadir una nueva carpeta a este ítem. Se alcanzó el máximo de profundidad de carpetas. - + New Folder Nueva Carpeta - + There is currently no Trash folder in this project. No hay actualmente una carpeta Papelera en este proyecto. - + The Trash folder is already empty. La carpeta Papelera ya está vacía. - + Empty Trash Vaciar la Papelera - + Permanently delete {0} file(s) from Trash? ¿Eliminar {0} archivo(s) permanentemente de la Papelera? - - + + Delete File Eliminar Archivo - + Permanently delete file '{0}'? - Permanently delete file '{0}'? + ¿Eliminar permanentemente el archivo '{0}'? - + Could not delete document file. No se puedo eliminar el archivo de documento. - + Move file '{0}' to Trash? - Move file '{0}' to Trash? + ¿Mover el archivo '{0}' a la Papelera? - + Cannot delete folder. It is not empty. Recursive deletion is not supported. Please delete the content first. No se puede eliminar la carpeta. No está vacía. No se permite eliminar recursivamente. Por favor, primero elimine los contenidos. - + Cannot delete root folder. It is not empty. Recursive deletion is not supported. Please delete the content first. No se puede eliminar la carpeta raíz. No está vacía. No se permite eliminar recursivamente. Por favor, primero elimine los contenidos. - - + + The item cannot be moved to that location. El ítem no puede moverse a esa ubicación. - + There is nowhere to add item with name '{0}'. - There is nowhere to add item with name '{0}'. + No hay ningún lugar en el que añadir un elemento nombrado '{0}'. GuiProjectTreeMenu - + Edit Project Item Editar este Ítem del Proyecto - + Open Document Abrir Documento - + View Document Previsualizar Documento - + Toggle Included Flag Alternar Compilación para el Ítem - + New File Nuevo Archivo - + New Folder Nueva Carpeta - + Delete Item Eliminar Ítem - + Empty Trash Vaciar la Papelera - + Move Item Up Desplazar Ítem hacia Arriba - + Move Item Down Desplazar Ítem hacia Abajo @@ -4314,24 +3658,14 @@ Lista de Palabras del Proyecto - - Add new entry - Añadir una entrada nueva - - - - Delete selected entry - Eliminar la entrada seleccionada - - - + Cannot add a blank word. No se puede añadir una palabra en blanco. - + The word '{0}' is already in the word list. - The word '{0}' is already in the word list. + La palabra '{0}' ya está en la lista de palabras. @@ -4490,329 +3824,314 @@ NWProject - + Duplicate root item detected. Se ha detectado un ítem raíz duplicado. - - Trash - Papelera - - - - + + New Nuevo - + Note Nota - + Draft Borrador - + Finished Terminado - + Minor Menor - + Major Mayor - + Main Principal - + New Project Proyecto Nuevo - + By Por - - + + Novel Novela - + Plot Argumento - + Characters Personajes - + World Mundo - - + + Title Page Título de la Página - - - + + + New Chapter Capítulo Nuevo - - + + New Scene Escena Nueva - + Chapter {0} Capítulo {0} - - + + Scene {0} Escena {0} - + File not found: {0} No se encontró el archivo: {0} - - + + Failed to parse project xml. Hubo un fallo al procesar el xml del proyecto. - + Attempting to open backup project file instead. En su lugar, se intentará abrir la copia de seguridad del proyecto. + - Unknown Desconocido - + Project file does not appear to be a novelWriterXML file. Aparentemente el archivo del proyecto no es un archivo novelWriterXML. - + Unknown or unsupported novelWriter project file format. The project cannot be opened by this version of novelWriter. The file was saved with novelWriter version {0}. Formato de archivo de proyecto novelWriter desconocido, o no soportado. Esta versión de novelWriter no puede abrir el proyecto. El archivo se guardó con la versión {0} de novelWriter. - + File Version Versión de Archivo - + The file format of your project is about to be updated. If you proceed, older versions of novelWriter will no longer be able to open this project. Continue? Se está por actualizar el formato de archivo de su proyecto. De continuar, ninguna versión anterior de novelWriter podrá abrir este proyecto. ¿Continuar? - - The format of your project will now be updated. You may also have to make a few minor changes to your title page and unnumbered chapters. Please check the 'Project Format Changes > File Format 1.3' section of the documentation for more information. It is available from the Help menu. - The format of your project will now be updated. You may also have to make a few minor changes to your title page and unnumbered chapters. Please check the 'Project Format Changes > File Format 1.3' section of the documentation for more information. It is available from the Help menu. - - - + Version Conflict Conflicto de Versiones - + This project was saved by a newer version of novelWriter, version {0}. This is version {1}. If you continue to open the project, some attributes and settings may not be preserved, but the overall project should be fine. Continue opening the project? Este proyecto se ha guardado en una versión nueva de novelWriter, la versión {0}. Ésta es la versión {1}. Si procede a abrir el proyecto, algunos atributos y opciones no serán preservadas, pero en general el proyecto no presentará problemas. ¿Continuar abriendo el proyecto? - + Opened Project: {0} Se Abrió el Proyecto: {0} - + Project path not set, cannot save project. No se estableció la ruta del proyecto, no se puede guardar el proyecto. - - + + Failed to save project. Hubo un fallo al guardar el proyecto. - + Saved Project: {0} Proyecto Guardado: {0} - + Backing up project ... Respaldando el proyecto ... - - Cannot backup project because no backup path is set. Please set a valid backup location in Preferences. - No se puede crear una copia de seguridad porque no hay una ruta para el respaldo. Por favor escoja una ubicación válida en las Preferencias. + + Cannot backup project because no valid backup path is set. Please set a valid backup location in Preferences. + No se puede crear una copia de seguridad porque no hay una ruta válida para el respaldo. Por favor escoja una ubicación válida en las Preferencias. - + Cannot backup project because no project name is set. Please set a Working Title in Project Settings. No se puede crear una copia de seguridad porque no se estableció el nombre del proyecto. Por favor escoja un Título Provisional en la Configuración del Proyecto. - - Cannot backup project because the backup path does not exist. Please set a valid backup location in Preferences. - No se puede crear una copia de seguridad porque la ruta para el respaldo no existe. Por favor escoja una ubicación válida en las Preferencias. - - - + Could not create backup folder. No se pudo crear la carpeta de respaldo. - + Cannot backup project because the backup path is within the project folder to be backed up. Please choose a different backup path in Preferences. No se puede crear una copia de seguridad porque la ruta para el respaldo se encuentra dentro de la carpeta del proyecto a respaldar. Por favor escoja una diferente ubicación de respaldo en las Preferencias. - + Backup from {0} Respaldo del {0} - + Backup archive file written to: {0} El archivo de respaldo se ha escrito en: {0} - + Could not write backup archive. No se puedo escribir el archivo de respaldo. - + Project backed up to '{0}' - Project backed up to '{0}' + Se ha respaldado el proyecto en '{0}' - - + + Failed to create a new example project. Hubo un fallo al crear un nuevo proyecto de ejemplo. - + Failed to create a new example project. Could not find the necessary files. They seem to be missing from this installation. Hubo un fallo al crear un nuevo proyecto de ejemplo. No se pudo encontrar los archivos necesarios. Aparentemente le faltan a esta instalación. - + Could not create new project folder. No se pudo crear la carpeta del proyecto nuevo. - + New project folder is not empty. Each project requires a dedicated project folder. La carpeta del proyecto nuevo no está vacía. Cada proyecto requiere de una carpeta de proyecto dedicada. - + You must set a valid backup path in Preferences to use the automatic project backup feature. Debe establecer una ruta válida de respaldo en las Preferencias para poder usar la característica de respaldado automático de datos. - + You must set a valid project name in Project Settings to use the automatic project backup feature. Debe establecer un nombre válido del proyecto en la Configuración del Proyecto para poder usar la característica de respaldado automático de datos. - + and y - + Could not create folder. No se pudo crear la carpeta. - + Found {0} orphaned file(s) in project folder. Se encontraron {0} archivo(s) huérfano(s) en la carpeta del proyecto. - + Recovered Restaurado - + [{0}] {1} [{0}] {1} - + Recovered File {0} Se Restauró el Archivo {0} - + One or more orphaned files could not be added back into the project. Make sure at least a Novel root folder exists. No se pudo añadir uno o más archivos huérfanos de vuelta al proyecto. Asegúrese de que exista al menos una carpeta raíz de Novela. - + Not a folder: {0} No es una carpeta: {0} - + Could not move: {0} No se pudo mover: {0} - - + + Could not delete: {0} No se pudo eliminar: {0} - + Could not make folder: {0} No se pudo crear la carpeta: {0} - + Could not move item {0} to {1}. No se pudo mover el ítem {0} a {1}. @@ -4827,7 +4146,7 @@ Select which additional root folders to make, and how to populate the Novel folder. If you don't want to add chapters or scenes, set the values to 0. You can add scenes without chapters. - Select which additional root folders to make, and how to populate the Novel folder. If you don't want to add chapters or scenes, set the values to 0. You can add scenes without chapters. + Seleccione las carpetas raíz adicionales a crear, y cómo llenar la carpeta Novel. Si no desea agregar capítulos o escenas, establezca los valores a 0. Puede añadir escenas sin capítulos. @@ -4880,7 +4199,7 @@ Press '{0}' to create the new project. - Press '{0}' to create the new project. + Pulse '{0}' para crear el nuevo proyecto. @@ -4998,7 +4317,7 @@ OK - OK + OK @@ -5006,7 +4325,7 @@ &OK - &OK + &OK @@ -5016,17 +4335,17 @@ &Cancel - &Cancel + &Cancelar &Close - &Close + &Cerrar Close without Saving - Close without Saving + Cerrar sin Guardar @@ -5034,7 +4353,7 @@ OK - OK + OK @@ -5044,47 +4363,47 @@ Save All - Save All + Guardar Todo Open - Open + Abrir &Yes - &Yes + &Sí Yes to &All - Yes to &All + Sí a &Todo &No - &No + &No N&o to All - N&o to All + N&o a Todo Abort - Abort + Abortar Retry - Retry + Reintentar Ignore - Ignore + Ignorar @@ -5094,32 +4413,32 @@ Cancel - Cancel + Cancelar Discard - Discard + Descartar Help - Help + Ayuda Apply - Apply + Aplicar Reset - Reset + Restablecer Restore Defaults - Restore Defaults + Restaurar valores predeterminados @@ -5127,53 +4446,53 @@ Go Back - Go Back + Volver < &Back - < &Back + < &Volver Continue - Continue + Continuar &Next - &Next + &Siguiente &Next > - &Next > + Seguir > Commit - Commit + Confirmar Done - Done + Listo &Finish - &Finish + &Finalizar Cancel - Cancel + Cancelar Help - Help + Ayuda @@ -5191,7 +4510,7 @@ Document '{0}' is too big ({1} MB). Skipping. - Document '{0}' is too big ({1} MB). Skipping. + El documento '{0}' es demasiado grande ({1} MB). Omitiéndolo. diff --git a/novelwriter/__init__.py b/novelwriter/__init__.py index 6fe370b9..98247c68 100644 --- a/novelwriter/__init__.py +++ b/novelwriter/__init__.py @@ -60,9 +60,9 @@ __license__ = "GPLv3" __author__ = "Veronica Berglyd Olsen" __maintainer__ = "Veronica Berglyd Olsen" __email__ = "code@vkbo.net" -__version__ = "1.6-rc1" -__hexversion__ = "0x010600c1" -__date__ = "2022-02-06" +__version__ = "1.6" +__hexversion__ = "0x010600f0" +__date__ = "2022-02-20" __status__ = "Stable" __domain__ = "novelwriter.io" __url__ = "https://novelwriter.io" diff --git a/novelwriter/assets/text/release_notes.htm b/novelwriter/assets/text/release_notes.htm index ebc4f260..d315a9a4 100644 --- a/novelwriter/assets/text/release_notes.htm +++ b/novelwriter/assets/text/release_notes.htm @@ -2,14 +2,38 @@ -

Release Notes for 1.6 RC 1

-

Released on 6 February 2022

+

Release Notes for 1.6

+

Released on 20 February 2022

-

This is a release candidate for the next release version, and is intended for testing purposes. -Please be careful when using this version on live writing projects, and make sure you take frequent -backups.

-

Please check the changelog for an overview of changes. The full release notes will be added to -the final release.

+

This release does not introduce any major new features, but is instead a collection of minor +improvements and tweaks based on user requests. There are also a number of changes under the hood +to improve the structure and performance of novelWriter.

+

Some key improvements to the user interface are:

+

✓ The max text width setting in Preferences now also applies to the document viewer, and +the setting itself on the Preference dialog has been simplified a bit.

+

✓ When text is selected in the document editor, the number of words selected is displayed +in the editor's footer area.

+

✓ The search tool in the document editor now shows the number of results in the +document.

+

✓ The Enter and Ctrl+O keyboard shortcuts should now work the same way in all tree +views.

+

✓ It is now possible to set a blank section title format on the Build Novel Project tool +and get empty paragraphs in the output. Previously, a blank format would just remove the section +break entirely. This change allows the user to define hard and soft scene breaks using level three +and four headings. The scene and section titles can be hidden completely with two new switches +added to the user interface.

+

Other feature changes include:

+

✓ The project index is now automatically rebuilt in the event it is empty or incomplete +when the project is opened.

+

✓ The user can now add their own syntax and GUI theme files in the app folder in their +user area on the host operating system. Where the custom files must be added is described in the +documentation.

+

✓ A Windows installer is yet again provided for novelWriter. If you have novelWriter +installed using another method, make sure you uninstall it properly first as the two methods are +not compatible.

+

✓ Release versions for Ubuntu 21.04 have been dropped, and added for the upcoming Ubuntu +22.04.

+

✓ Most translations have been updated. A Dutch translation is in the works.

See also the Releases page.

diff --git a/sample/nwProject.nwx b/sample/nwProject.nwx index 2510f865..9e37d34a 100644 --- a/sample/nwProject.nwx +++ b/sample/nwProject.nwx @@ -1,13 +1,13 @@ - + Sample Project Sample Project Jane Smith Jay Doh - 1297 + 1299 199 - 64424 + 64923 False From 045a595537a6390639a56a609a667d92271aa4cf Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sun, 20 Feb 2022 22:05:31 +0100 Subject: [PATCH 03/16] Implement project file format 1.4 (#993) * Update the item class with more compact item storage format * Bump version and file version * Update tests * Add explicit test coverage for format conversions for item class * Update the documentation --- docs/source/usage_projectformat.rst | 25 +- novelwriter/__init__.py | 4 +- novelwriter/core/item.py | 63 ++-- novelwriter/core/project.py | 7 +- sample/nwProject.nwx | 316 +++++------------- tests/lipsum/nwProject.nwx | 270 ++++----------- tests/minimal/nwProject.nwx | 93 ++---- .../coreProject_NewCustomA_nwProject.nwx | 274 ++++----------- .../coreProject_NewCustomB_nwProject.nwx | 163 +++------ .../coreProject_NewFile_nwProject.nwx | 117 ++----- .../coreProject_NewMinimal_nwProject.nwx | 89 ++--- .../coreProject_NewRoot_nwProject.nwx | 125 ++----- .../guiEditor_Main_Final_nwProject.nwx | 142 +++----- .../guiEditor_Main_Initial_nwProject.nwx | 89 ++--- .../guiProjSettings_Dialog_nwProject.nwx | 89 ++--- tests/test_core/test_core_item.py | 136 ++++++-- tests/test_core/test_core_tree.py | 53 ++- 17 files changed, 666 insertions(+), 1389 deletions(-) diff --git a/docs/source/usage_projectformat.rst b/docs/source/usage_projectformat.rst index ea0b55b5..6a7c4c8b 100644 --- a/docs/source/usage_projectformat.rst +++ b/docs/source/usage_projectformat.rst @@ -11,13 +11,32 @@ changes require minor actions from the user. The key changes in the formats are listed below, as well as the user actions required where applicable. +.. caution:: + + When you update a project from one format version to the next, the project can no longer be + opened by a version of novelWriter prior to the version where the new file format was + introduced. You will get a notification about any updates to your project file format and will + have the option to decline the upgrade. + + +.. _a_prjfmt_1_4: + +Format 1.4 Changes +================== + +This project format was introduced in novelWriter version 1.7. + +This format changes the way project items (folders, documents and notes) are stored. It is a more +compact format that is simpler and faster to parse, and easier to extend. The conversion is done +automatically the first time a project is loaded. No user action is required. + .. _a_prjfmt_1_3: Format 1.3 Changes ================== -This project format vas introduces in novelWriter version 1.5. +This project format was introduced in novelWriter version 1.5. With this format, the number of document layouts was reduced from 8 to 2. The conversion of document layouts is performed automatically when the project is opened. @@ -55,7 +74,7 @@ should be used only a few places in any given project. These are as follows: Format 1.2 Changes ================== -This project format was introduces in novelWriter version 0.10. +This project format was introduced in novelWriter version 0.10. With this format, the way auto-replace entries were stored in the main project XML file changed. Opening an old project automatically converts the storage format up to and including version 1.1.1. @@ -69,7 +88,7 @@ auto-replace is not being used, can still be opened in novelWriter as of version Format 1.1 Changes ================== -This project format was introduces in novelWriter version 0.7. +This project format was introduced in novelWriter version 0.7. With this format, the ``content`` folder was introduced in the project storage. Previously, all novelWriter documents were saved in a series of folders numbered from ``data_0`` to ``data_f``. diff --git a/novelwriter/__init__.py b/novelwriter/__init__.py index 98247c68..740ed327 100644 --- a/novelwriter/__init__.py +++ b/novelwriter/__init__.py @@ -60,8 +60,8 @@ __license__ = "GPLv3" __author__ = "Veronica Berglyd Olsen" __maintainer__ = "Veronica Berglyd Olsen" __email__ = "code@vkbo.net" -__version__ = "1.6" -__hexversion__ = "0x010600f0" +__version__ = "1.7-alpha0" +__hexversion__ = "0x010700a0" __date__ = "2022-02-20" __status__ = "Stable" __domain__ = "novelwriter.io" diff --git a/novelwriter/core/item.py b/novelwriter/core/item.py index 8c7b2ef4..07db4a41 100644 --- a/novelwriter/core/item.py +++ b/novelwriter/core/item.py @@ -139,24 +139,32 @@ class NWItem(): def packXML(self, xParent): """Pack all the data in the class instance into an XML object. """ - xPack = etree.SubElement(xParent, "item", attrib={ - "handle": str(self._handle), - "order": str(self._order), - "parent": str(self._parent), - }) - self._subPack(xPack, "name", text=str(self._name)) - self._subPack(xPack, "type", text=str(self._type.name)) - self._subPack(xPack, "class", text=str(self._class.name)) - self._subPack(xPack, "status", text=str(self._status)) + itemAttrib = {} + itemAttrib["handle"] = str(self._handle) + itemAttrib["parent"] = str(self._parent) + itemAttrib["order"] = str(self._order) + itemAttrib["type"] = str(self._type.name) + itemAttrib["class"] = str(self._class.name) if self._type == nwItemType.FILE: - self._subPack(xPack, "exported", text=str(self._exported)) - self._subPack(xPack, "layout", text=str(self._layout.name)) - self._subPack(xPack, "charCount", text=str(self._charCount), none=False) - self._subPack(xPack, "wordCount", text=str(self._wordCount), none=False) - self._subPack(xPack, "paraCount", text=str(self._paraCount), none=False) - self._subPack(xPack, "cursorPos", text=str(self._cursorPos), none=False) + itemAttrib["layout"] = str(self._layout.name) + + metaAttrib = {} + if self._type == nwItemType.FILE: + metaAttrib["charCount"] = str(self._charCount) + metaAttrib["wordCount"] = str(self._wordCount) + metaAttrib["paraCount"] = str(self._paraCount) + metaAttrib["cursorPos"] = str(self._cursorPos) else: - self._subPack(xPack, "expanded", text=str(self._expanded)) + metaAttrib["expanded"] = str(self._expanded) + + nameAttrib = {} + nameAttrib["status"] = str(self._status) + if self._type == nwItemType.FILE: + nameAttrib["exported"] = str(self._exported) + + xPack = etree.SubElement(xParent, "item", attrib=itemAttrib) + self._subPack(xPack, "meta", attrib=metaAttrib) + self._subPack(xPack, "name", text=str(self._name), attrib=nameAttrib) return @@ -175,19 +183,31 @@ class NWItem(): self.setParent(xItem.attrib.get("parent", None)) self.setOrder(xItem.attrib.get("order", 0)) + self.setType(xItem.attrib.get("type", None)) + self.setClass(xItem.attrib.get("class", None)) + self.setLayout(xItem.attrib.get("layout", None)) - tmpStatus = "" for xValue in xItem: - if xValue.tag == "name": + if xValue.tag == "meta": + self.setExpanded(xValue.attrib.get("expanded", False)) + self.setCharCount(xValue.attrib.get("charCount", 0)) + self.setWordCount(xValue.attrib.get("wordCount", 0)) + self.setParaCount(xValue.attrib.get("paraCount", 0)) + self.setCursorPos(xValue.attrib.get("cursorPos", 0)) + elif xValue.tag == "name": self.setName(xValue.text) + self.setStatus(xValue.attrib.get("status", None)) + self.setExported(xValue.attrib.get("exported", True)) + + # Legacy Format (1.3 and earlier) + elif xValue.tag == "status": + self.setStatus(xValue.text) elif xValue.tag == "type": self.setType(xValue.text) elif xValue.tag == "class": self.setClass(xValue.text) elif xValue.tag == "layout": self.setLayout(xValue.text) - elif xValue.tag == "status": - tmpStatus = xValue.text elif xValue.tag == "expanded": self.setExpanded(xValue.text) elif xValue.tag == "exported": @@ -206,9 +226,6 @@ class NWItem(): # version of novelWriter that doesn't know the tag logger.error("Unknown tag '%s'", xValue.tag) - # Guarantees that is parsed after - self.setStatus(tmpStatus) - return True @staticmethod diff --git a/novelwriter/core/project.py b/novelwriter/core/project.py index 26d2c098..556f6e18 100644 --- a/novelwriter/core/project.py +++ b/novelwriter/core/project.py @@ -53,7 +53,7 @@ logger = logging.getLogger(__name__) class NWProject(): - FILE_VERSION = "1.3" + FILE_VERSION = "1.4" def __init__(self, theParent): @@ -479,8 +479,11 @@ class NWProject(): # 1.3 : Reduces the number of layouts to only two. One for novel # documents and one for project notes. Introduced in # version 1.5. + # 1.4 : Introduces a more compact format for storing items. All + # settings aside from name are now attributes. Introduced + # in version 1.7. - if fileVersion not in ("1.0", "1.1", "1.2", "1.3"): + if fileVersion not in ("1.0", "1.1", "1.2", "1.3", "1.4"): self.theParent.makeAlert(self.tr( "Unknown or unsupported novelWriter project file format. " "The project cannot be opened by this version of novelWriter. " diff --git a/sample/nwProject.nwx b/sample/nwProject.nwx index 9e37d34a..bf40e1ee 100644 --- a/sample/nwProject.nwx +++ b/sample/nwProject.nwx @@ -1,13 +1,13 @@ - + Sample Project Sample Project Jane Smith Jay Doh - 1299 + 1303 199 - 64923 + 64457 False @@ -49,265 +49,105 @@ - - Novel - ROOT - NOVEL - Started - True + + + Novel - - Title Page - FILE - NOVEL - Started - True - DOCUMENT - 93 - 19 - 2 - 2 + + + Title Page - - Page - FILE - NOVEL - New - True - DOCUMENT - 186 - 39 - 2 - 212 + + + Page - - Part One - FILE - NOVEL - New - True - DOCUMENT - 26 - 6 - 1 - 33 + + + Part One - - A Folder - FOLDER - NOVEL - 1st Draft - True + + + A Folder - - Chapter One - FILE - NOVEL - Notes - True - DOCUMENT - 75 - 14 - 1 - 279 + + + Chapter One - - Making a Scene - FILE - NOVEL - 1st Draft - True - DOCUMENT - 2429 - 432 - 14 - 219 + + + Making a Scene - - Another Scene - FILE - NOVEL - 1st Draft - True - DOCUMENT - 476 - 93 - 3 - 577 + + + Another Scene - - Interlude - FILE - NOVEL - New - True - DOCUMENT - 617 - 101 - 3 - 4 + + + Interlude - - A Note on Structure - FILE - NOVEL - 2nd Draft - False - NOTE - 1692 - 313 - 6 - 1110 + + + A Note on Structure - - Chapter Two - FILE - NOVEL - 1st Draft - True - DOCUMENT - 139 - 28 - 1 - 343 + + + Chapter Two - - We Found John! - FILE - NOVEL - 1st Draft - True - DOCUMENT - 189 - 37 - 1 - 224 + + + We Found John! - - Characters - ROOT - CHARACTER - None - True + + + Characters - - Main Characters - FOLDER - CHARACTER - None - True + + + Main Characters - - John Smith - FILE - CHARACTER - Minor - True - NOTE - 49 - 9 - 1 - 24 + + + John Smith - - Jane Smith - FILE - CHARACTER - Major - True - NOTE - 55 - 9 - 1 - 25 + + + Jane Smith - - Locations - ROOT - WORLD - None - True + + + Locations - - Earth - FILE - WORLD - Main - True - NOTE - 76 - 15 - 1 - 20 + + + Earth - - Space - FILE - WORLD - Minor - True - NOTE - 115 - 24 - 1 - 133 + + + Space - - Mars - FILE - WORLD - Major - True - NOTE - 28 - 6 - 1 - 45 + + + Mars - - Archive - ROOT - ARCHIVE - New - True + + + Archive - - Scenes - FOLDER - ARCHIVE - New - True + + + Scenes - - Old File - FILE - NOVEL - 1st Draft - True - DOCUMENT - 315 - 55 - 1 - 322 + + + Old File - - Trash - TRASH - TRASH - None - True + + + Trash - - Delete Me! - FILE - NOVEL - New - True - DOCUMENT - 30 - 6 - 1 - 36 + + + Delete Me! diff --git a/tests/lipsum/nwProject.nwx b/tests/lipsum/nwProject.nwx index 02803bbd..c6eab805 100644 --- a/tests/lipsum/nwProject.nwx +++ b/tests/lipsum/nwProject.nwx @@ -1,12 +1,12 @@ - + Lorem Ipsum Lorem Ipsum lipsum.com - 17 + 21 24 - 1777 + 1847 False @@ -44,227 +44,89 @@ - - Novel - ROOT - NOVEL - New - True + + + Novel - - Lorem Ipsum - FILE - NOVEL - Finished - True - DOCUMENT - 230 - 40 - 3 - 148 + + + Lorem Ipsum - - Front Matter - FILE - NOVEL - Finished - True - DOCUMENT - 1058 - 176 - 2 - 43 + + + Front Matter - - Prologue - FILE - NOVEL - Draft - True - DOCUMENT - 584 - 92 - 1 - 4 + + + Prologue - - Act One - FILE - NOVEL - New - True - DOCUMENT - 35 - 6 - 1 - 42 + + + Act One - - Chapter One - FOLDER - NOVEL - Draft - True + + + Chapter One - - Chapter One - FILE - NOVEL - Draft - True - DOCUMENT - 419 - 67 - 1 - 56 + + + Chapter One - - Scene One - FILE - NOVEL - Finished - True - DOCUMENT - 2758 - 404 - 4 - 1528 + + + Scene One - - Scene Two - FILE - NOVEL - Finished - True - DOCUMENT - 4043 - 600 - 6 - 2335 + + + Scene Two - - Interlude - FILE - NOVEL - New - False - DOCUMENT - 631 - 109 - 3 - 376 + + + Interlude - - Chapter Two - FOLDER - NOVEL - Draft - True + + + Chapter Two - - Chapter Two - FILE - NOVEL - Draft - True - DOCUMENT - 477 - 70 - 1 - 56 + + + Chapter Two - - Scene Three - FILE - NOVEL - Finished - True - DOCUMENT - 3006 - 439 - 4 - 57 + + + Scene Three - - Scene Four - FILE - NOVEL - Finished - True - DOCUMENT - 3839 - 563 - 6 - 56 + + + Scene Four - - Scene Five - FILE - NOVEL - Finished - True - DOCUMENT - 3644 - 543 - 5 - 351 + + + Scene Five - - Characters - ROOT - CHARACTER - New - True + + + Characters - - Mr. Nobody - FILE - CHARACTER - Major - True - NOTE - 1864 - 284 - 3 - 1883 + + + Mr. Nobody - - Plot - ROOT - PLOT - New - True + + + Plot - - Main - FILE - PLOT - Main - True - NOTE - 1369 - 195 - 2 - 1387 + + + Main - - World - ROOT - WORLD - New - True + + + World - - Ancient Europe - FILE - WORLD - Minor - True - NOTE - 1770 - 259 - 3 - 1792 + + + Ancient Europe diff --git a/tests/minimal/nwProject.nwx b/tests/minimal/nwProject.nwx index c1f2a901..991d8b68 100644 --- a/tests/minimal/nwProject.nwx +++ b/tests/minimal/nwProject.nwx @@ -1,13 +1,13 @@ - + Test Minimal Minimal Jane Doe John Doh - 9 + 12 2 - 113 + 129 True @@ -42,76 +42,37 @@ - - Novel - ROOT - NOVEL - New - True + + + Novel - - Title Page - FILE - NOVEL - New - True - DOCUMENT - 28 - 6 - 1 - 33 + + + Title Page - - New Chapter - FOLDER - NOVEL - New - True + + + New Chapter - - New Chapter - FILE - NOVEL - New - True - DOCUMENT - 11 - 2 - 0 - 16 + + + New Chapter - - New Scene - FILE - NOVEL - New - True - DOCUMENT - 9 - 2 - 0 - 15 + + + New Scene - - Plot - ROOT - PLOT - New - False + + + Plot - - Characters - ROOT - CHARACTER - New - False + + + Characters - - World - ROOT - WORLD - New - False + + + World diff --git a/tests/reference/coreProject_NewCustomA_nwProject.nwx b/tests/reference/coreProject_NewCustomA_nwProject.nwx index 3ba6a538..4b8a67bf 100644 --- a/tests/reference/coreProject_NewCustomA_nwProject.nwx +++ b/tests/reference/coreProject_NewCustomA_nwProject.nwx @@ -1,5 +1,5 @@ - + Test Custom Test Novel @@ -42,231 +42,97 @@ - - Novel - ROOT - NOVEL - New - False + + + Novel - - Plot - ROOT - PLOT - New - False + + + Plot - - Characters - ROOT - CHARACTER - New - False + + + Characters - - Locations - ROOT - WORLD - New - False + + + Locations - - Timeline - ROOT - TIMELINE - New - False + + + Timeline - - Objects - ROOT - OBJECT - New - False + + + Objects - - Entities - ROOT - ENTITY - New - False + + + Entities - - Title Page - FILE - NOVEL - New - True - DOCUMENT - 0 - 0 - 0 - 0 + + + Title Page - - Chapter 1 - FOLDER - NOVEL - New - False + + + Chapter 1 - - Chapter 1 - FILE - NOVEL - New - True - DOCUMENT - 0 - 0 - 0 - 0 + + + Chapter 1 - - Scene 1.1 - FILE - NOVEL - New - True - DOCUMENT - 0 - 0 - 0 - 0 + + + Scene 1.1 - - Scene 1.2 - FILE - NOVEL - New - True - DOCUMENT - 0 - 0 - 0 - 0 + + + Scene 1.2 - - Scene 1.3 - FILE - NOVEL - New - True - DOCUMENT - 0 - 0 - 0 - 0 + + + Scene 1.3 - - Chapter 2 - FOLDER - NOVEL - New - False + + + Chapter 2 - - Chapter 2 - FILE - NOVEL - New - True - DOCUMENT - 0 - 0 - 0 - 0 + + + Chapter 2 - - Scene 2.1 - FILE - NOVEL - New - True - DOCUMENT - 0 - 0 - 0 - 0 + + + Scene 2.1 - - Scene 2.2 - FILE - NOVEL - New - True - DOCUMENT - 0 - 0 - 0 - 0 + + + Scene 2.2 - - Scene 2.3 - FILE - NOVEL - New - True - DOCUMENT - 0 - 0 - 0 - 0 + + + Scene 2.3 - - Chapter 3 - FOLDER - NOVEL - New - False + + + Chapter 3 - - Chapter 3 - FILE - NOVEL - New - True - DOCUMENT - 0 - 0 - 0 - 0 + + + Chapter 3 - - Scene 3.1 - FILE - NOVEL - New - True - DOCUMENT - 0 - 0 - 0 - 0 + + + Scene 3.1 - - Scene 3.2 - FILE - NOVEL - New - True - DOCUMENT - 0 - 0 - 0 - 0 + + + Scene 3.2 - - Scene 3.3 - FILE - NOVEL - New - True - DOCUMENT - 0 - 0 - 0 - 0 + + + Scene 3.3 diff --git a/tests/reference/coreProject_NewCustomB_nwProject.nwx b/tests/reference/coreProject_NewCustomB_nwProject.nwx index 2afad85a..3f55663e 100644 --- a/tests/reference/coreProject_NewCustomB_nwProject.nwx +++ b/tests/reference/coreProject_NewCustomB_nwProject.nwx @@ -1,5 +1,5 @@ - + Test Custom Test Novel @@ -42,138 +42,61 @@ - - Novel - ROOT - NOVEL - New - False + + + Novel - - Plot - ROOT - PLOT - New - False + + + Plot - - Characters - ROOT - CHARACTER - New - False + + + Characters - - Locations - ROOT - WORLD - New - False + + + Locations - - Timeline - ROOT - TIMELINE - New - False + + + Timeline - - Objects - ROOT - OBJECT - New - False + + + Objects - - Entities - ROOT - ENTITY - New - False + + + Entities - - Title Page - FILE - NOVEL - New - True - DOCUMENT - 0 - 0 - 0 - 0 + + + Title Page - - Scene 1 - FILE - NOVEL - New - True - DOCUMENT - 0 - 0 - 0 - 0 + + + Scene 1 - - Scene 2 - FILE - NOVEL - New - True - DOCUMENT - 0 - 0 - 0 - 0 + + + Scene 2 - - Scene 3 - FILE - NOVEL - New - True - DOCUMENT - 0 - 0 - 0 - 0 + + + Scene 3 - - Scene 4 - FILE - NOVEL - New - True - DOCUMENT - 0 - 0 - 0 - 0 + + + Scene 4 - - Scene 5 - FILE - NOVEL - New - True - DOCUMENT - 0 - 0 - 0 - 0 + + + Scene 5 - - Scene 6 - FILE - NOVEL - New - True - DOCUMENT - 0 - 0 - 0 - 0 + + + Scene 6 diff --git a/tests/reference/coreProject_NewFile_nwProject.nwx b/tests/reference/coreProject_NewFile_nwProject.nwx index 88c9aafb..d623ee2d 100644 --- a/tests/reference/coreProject_NewFile_nwProject.nwx +++ b/tests/reference/coreProject_NewFile_nwProject.nwx @@ -1,5 +1,5 @@ - + New Project @@ -40,100 +40,45 @@ - - Novel - ROOT - NOVEL - New - False + + + Novel - - Plot - ROOT - PLOT - New - False + + + Plot - - Characters - ROOT - CHARACTER - New - False + + + Characters - - World - ROOT - WORLD - New - False + + + World - - Title Page - FILE - NOVEL - New - True - DOCUMENT - 0 - 0 - 0 - 0 + + + Title Page - - New Chapter - FOLDER - NOVEL - New - False + + + New Chapter - - New Chapter - FILE - NOVEL - New - True - DOCUMENT - 0 - 0 - 0 - 0 + + + New Chapter - - New Scene - FILE - NOVEL - New - True - DOCUMENT - 0 - 0 - 0 - 0 + + + New Scene - - Hello - FILE - NOVEL - New - True - DOCUMENT - 0 - 0 - 0 - 0 + + + Hello - - Jane - FILE - CHARACTER - New - True - NOTE - 0 - 0 - 0 - 0 + + + Jane diff --git a/tests/reference/coreProject_NewMinimal_nwProject.nwx b/tests/reference/coreProject_NewMinimal_nwProject.nwx index d3702a07..6becb112 100644 --- a/tests/reference/coreProject_NewMinimal_nwProject.nwx +++ b/tests/reference/coreProject_NewMinimal_nwProject.nwx @@ -1,5 +1,5 @@ - + New Project @@ -40,76 +40,37 @@ - - Novel - ROOT - NOVEL - New - False + + + Novel - - Plot - ROOT - PLOT - New - False + + + Plot - - Characters - ROOT - CHARACTER - New - False + + + Characters - - World - ROOT - WORLD - New - False + + + World - - Title Page - FILE - NOVEL - New - True - DOCUMENT - 0 - 0 - 0 - 0 + + + Title Page - - New Chapter - FOLDER - NOVEL - New - False + + + New Chapter - - New Chapter - FILE - NOVEL - New - True - DOCUMENT - 0 - 0 - 0 - 0 + + + New Chapter - - New Scene - FILE - NOVEL - New - True - DOCUMENT - 0 - 0 - 0 - 0 + + + New Scene diff --git a/tests/reference/coreProject_NewRoot_nwProject.nwx b/tests/reference/coreProject_NewRoot_nwProject.nwx index 58344c12..cf55336e 100644 --- a/tests/reference/coreProject_NewRoot_nwProject.nwx +++ b/tests/reference/coreProject_NewRoot_nwProject.nwx @@ -1,5 +1,5 @@ - + New Project @@ -40,104 +40,53 @@ - - Novel - ROOT - NOVEL - New - False + + + Novel - - Plot - ROOT - PLOT - New - False + + + Plot - - Characters - ROOT - CHARACTER - New - False + + + Characters - - World - ROOT - WORLD - New - False + + + World - - Title Page - FILE - NOVEL - New - True - DOCUMENT - 0 - 0 - 0 - 0 + + + Title Page - - New Chapter - FOLDER - NOVEL - New - False + + + New Chapter - - New Chapter - FILE - NOVEL - New - True - DOCUMENT - 0 - 0 - 0 - 0 + + + New Chapter - - New Scene - FILE - NOVEL - New - True - DOCUMENT - 0 - 0 - 0 - 0 + + + New Scene - - Timeline - ROOT - TIMELINE - New - False + + + Timeline - - Object - ROOT - OBJECT - New - False + + + Object - - Custom1 - ROOT - CUSTOM - New - False + + + Custom1 - - Custom2 - ROOT - CUSTOM - New - False + + + Custom2 diff --git a/tests/reference/guiEditor_Main_Final_nwProject.nwx b/tests/reference/guiEditor_Main_Final_nwProject.nwx index 1111c579..4dd43b9a 100644 --- a/tests/reference/guiEditor_Main_Final_nwProject.nwx +++ b/tests/reference/guiEditor_Main_Final_nwProject.nwx @@ -1,11 +1,11 @@ - + New Project 5 2 - 4 + 3 True @@ -40,119 +40,53 @@ - - Novel - ROOT - NOVEL - New - True + + + Novel - - Title Page - FILE - NOVEL - New - True - DOCUMENT - 11 - 2 - 0 - 0 + + + Title Page - - New Chapter - FOLDER - NOVEL - New - True + + + New Chapter - - New Chapter - FILE - NOVEL - New - True - DOCUMENT - 11 - 2 - 0 - 0 + + + New Chapter - - New Scene - FILE - NOVEL - New - True - DOCUMENT - 612 - 95 - 10 - 768 + + + New Scene - - Plot - ROOT - PLOT - New - True + + + Plot - - New File - FILE - PLOT - New - True - NOTE - 48 - 10 - 1 - 69 + + + New File - - Characters - ROOT - CHARACTER - New - True + + + Characters - - New File - FILE - CHARACTER - New - True - NOTE - 34 - 8 - 1 - 51 + + + New File - - World - ROOT - WORLD - New - True + + + World - - New File - FILE - WORLD - New - True - NOTE - 51 - 9 - 1 - 68 + + + New File - - Trash - TRASH - TRASH - None - True + + + Trash diff --git a/tests/reference/guiEditor_Main_Initial_nwProject.nwx b/tests/reference/guiEditor_Main_Initial_nwProject.nwx index 7d2cfe5f..f1b17740 100644 --- a/tests/reference/guiEditor_Main_Initial_nwProject.nwx +++ b/tests/reference/guiEditor_Main_Initial_nwProject.nwx @@ -1,5 +1,5 @@ - + New Project @@ -40,76 +40,37 @@ - - Novel - ROOT - NOVEL - New - False + + + Novel - - Title Page - FILE - NOVEL - New - True - DOCUMENT - 11 - 2 - 0 - 0 + + + Title Page - - New Chapter - FOLDER - NOVEL - New - False + + + New Chapter - - New Chapter - FILE - NOVEL - New - True - DOCUMENT - 11 - 2 - 0 - 0 + + + New Chapter - - New Scene - FILE - NOVEL - New - True - DOCUMENT - 9 - 2 - 0 - 0 + + + New Scene - - Plot - ROOT - PLOT - New - False + + + Plot - - Characters - ROOT - CHARACTER - New - False + + + Characters - - World - ROOT - WORLD - New - False + + + World diff --git a/tests/reference/guiProjSettings_Dialog_nwProject.nwx b/tests/reference/guiProjSettings_Dialog_nwProject.nwx index 96334e16..b88e7f17 100644 --- a/tests/reference/guiProjSettings_Dialog_nwProject.nwx +++ b/tests/reference/guiProjSettings_Dialog_nwProject.nwx @@ -1,5 +1,5 @@ - + Project Name Project Title @@ -46,76 +46,37 @@ - - Novel - ROOT - NOVEL - New - False + + + Novel - - Title Page - FILE - NOVEL - New - True - DOCUMENT - 11 - 2 - 0 - 0 + + + Title Page - - New Chapter - FOLDER - NOVEL - New - False + + + New Chapter - - New Chapter - FILE - NOVEL - New - True - DOCUMENT - 11 - 2 - 0 - 0 + + + New Chapter - - New Scene - FILE - NOVEL - New - True - DOCUMENT - 9 - 2 - 0 - 0 + + + New Scene - - Plot - ROOT - PLOT - New - False + + + Plot - - Characters - ROOT - CHARACTER - New - False + + + Characters - - World - ROOT - WORLD - New - False + + + World diff --git a/tests/test_core/test_core_item.py b/tests/test_core/test_core_item.py index dea2b3c7..368592f1 100644 --- a/tests/test_core/test_core_item.py +++ b/tests/test_core/test_core_item.py @@ -306,22 +306,6 @@ def testCoreItem_LayoutSetter(mockGUI): theItem.setLayout("NOTE") assert theItem.itemLayout == nwItemLayout.NOTE - # Deprecated Layouts - theItem.setLayout("TITLE") - assert theItem.itemLayout == nwItemLayout.DOCUMENT - theItem.setLayout("PAGE") - assert theItem.itemLayout == nwItemLayout.DOCUMENT - theItem.setLayout("BOOK") - assert theItem.itemLayout == nwItemLayout.DOCUMENT - theItem.setLayout("PARTITION") - assert theItem.itemLayout == nwItemLayout.DOCUMENT - theItem.setLayout("UNNUMBERED") - assert theItem.itemLayout == nwItemLayout.DOCUMENT - theItem.setLayout("CHAPTER") - assert theItem.itemLayout == nwItemLayout.DOCUMENT - theItem.setLayout("SCENE") - assert theItem.itemLayout == nwItemLayout.DOCUMENT - # Alternatives theItem.setLayout(nwItemLayout.NOTE) assert theItem.itemLayout == nwItemLayout.NOTE @@ -358,12 +342,9 @@ def testCoreItem_XMLPackUnpack(mockGUI, caplog): xContent = etree.SubElement(nwXML, "content") theItem.packXML(xContent) assert etree.tostring(xContent, pretty_print=False, encoding="utf-8") == ( - b"" - b"" - b"A NameFILENOVELNew" - b"FalseNOTE7" - b"5311" - b"" + b'A Name' ) # Unpack @@ -404,11 +385,8 @@ def testCoreItem_XMLPackUnpack(mockGUI, caplog): xContent = etree.SubElement(nwXML, "content") theItem.packXML(xContent) assert etree.tostring(xContent, pretty_print=False, encoding="utf-8") == ( - b"" - b"" - b"A NameFOLDERNOVELNew" - b"True" - b"" + b'A Name' ) # Unpack @@ -462,3 +440,107 @@ def testCoreItem_XMLPackUnpack(mockGUI, caplog): ) # END Test testCoreItem_XMLPackUnpack + + +@pytest.mark.core +def testCoreItem_ConvertFromFmt12(mockGUI): + """Test the setter for all the nwItemLayout values for the NWItem + class using the class names that were present in file format 1.2. + """ + theProject = NWProject(mockGUI) + theItem = NWItem(theProject) + + # Deprecated Layouts + theItem.setLayout("TITLE") + assert theItem.itemLayout == nwItemLayout.DOCUMENT + theItem.setLayout("PAGE") + assert theItem.itemLayout == nwItemLayout.DOCUMENT + theItem.setLayout("BOOK") + assert theItem.itemLayout == nwItemLayout.DOCUMENT + theItem.setLayout("PARTITION") + assert theItem.itemLayout == nwItemLayout.DOCUMENT + theItem.setLayout("UNNUMBERED") + assert theItem.itemLayout == nwItemLayout.DOCUMENT + theItem.setLayout("CHAPTER") + assert theItem.itemLayout == nwItemLayout.DOCUMENT + theItem.setLayout("SCENE") + assert theItem.itemLayout == nwItemLayout.DOCUMENT + theItem.setLayout("MUMBOJUMBO") + assert theItem.itemLayout == nwItemLayout.NO_LAYOUT + +# END Test testCoreItem_ConvertFromFmt12 + + +@pytest.mark.core +def testCoreItem_ConvertFromFmt13(mockGUI): + """Test packing and unpacking XML objects for the NWItem class from + format version 1.3 + """ + theProject = NWProject(mockGUI) + + # Make Version 1.3 XML + nwXML = etree.Element("novelWriterXML") + xContent = etree.SubElement(nwXML, "content") + + # Folder + xPack = etree.SubElement(xContent, "item", attrib={ + "handle": "a000000000001", + "order": "1", + "parent": "b000000000001", + }) + NWItem._subPack(xPack, "name", text="Folder") + NWItem._subPack(xPack, "type", text="FOLDER") + NWItem._subPack(xPack, "class", text="NOVEL") + NWItem._subPack(xPack, "status", text="New") + NWItem._subPack(xPack, "expanded", text="True") + + # Unpack Folder + theItem = NWItem(theProject) + theItem.unpackXML(xContent[0]) + assert theItem.itemHandle == "a000000000001" + assert theItem.itemParent == "b000000000001" + assert theItem.itemOrder == 1 + assert theItem.isExpanded is True + assert theItem.isExported is True + assert theItem.charCount == 0 + assert theItem.wordCount == 0 + assert theItem.paraCount == 0 + assert theItem.cursorPos == 0 + assert theItem.itemClass == nwItemClass.NOVEL + assert theItem.itemType == nwItemType.FOLDER + assert theItem.itemLayout == nwItemLayout.NO_LAYOUT + + # File + xPack = etree.SubElement(xContent, "item", attrib={ + "handle": "c000000000001", + "order": "2", + "parent": "a000000000001", + }) + NWItem._subPack(xPack, "name", text="Scene") + NWItem._subPack(xPack, "type", text="FILE") + NWItem._subPack(xPack, "class", text="NOVEL") + NWItem._subPack(xPack, "status", text="New") + NWItem._subPack(xPack, "exported", text="True") + NWItem._subPack(xPack, "layout", text="DOCUMENT") + NWItem._subPack(xPack, "charCount", text="600") + NWItem._subPack(xPack, "wordCount", text="100") + NWItem._subPack(xPack, "paraCount", text="6") + NWItem._subPack(xPack, "cursorPos", text="50") + + # Unpack File + theItem = NWItem(theProject) + theItem.unpackXML(xContent[1]) + assert theItem.itemHandle == "c000000000001" + assert theItem.itemParent == "a000000000001" + assert theItem.itemOrder == 2 + assert theItem.isExpanded is False + assert theItem.isExported is True + assert theItem.charCount == 600 + assert theItem.wordCount == 100 + assert theItem.paraCount == 6 + assert theItem.cursorPos == 50 + assert theItem.itemClass == nwItemClass.NOVEL + assert theItem.itemType == nwItemType.FILE + assert theItem.itemLayout == nwItemLayout.DOCUMENT + +# END Test testCoreItem_ConvertFromFmt13 diff --git a/tests/test_core/test_core_tree.py b/tests/test_core/test_core_tree.py index dc49c41a..e0e82f39 100644 --- a/tests/test_core/test_core_tree.py +++ b/tests/test_core/test_core_tree.py @@ -385,36 +385,29 @@ def testCoreTree_XMLPackUnpack(mockGUI, mockItems): nwXML = etree.Element("novelWriterXML") theTree.packXML(nwXML) assert etree.tostring(nwXML, pretty_print=False, encoding="utf-8") == ( - b"" - b"" - b"" - b"NovelROOTNOVELNone" - b"True" - b"" - b"Act OneFOLDERNOVELNone" - b"True" - b"" - b"Chapter OneFILENOVELNone" - b"TrueDOCUMENT300" - b"5020" - b"" - b"Scene OneFILENOVELNone" - b"TrueDOCUMENT3000" - b"500200" - b"" - b"OuttakesROOTARCHIVENone" - b"False" - b"" - b"TrashTRASHTRASHNone" - b"False" - b"" - b"CharactersROOTCHARACTERNone" - b"True" - b"" - b"Jane DoeFILECHARACTERNone" - b"TrueNOTE2000" - b"400160" - b"" + b'' + b'' + b'' + b'Novel' + b'Act One' + b'' + b'Chapter One' + b'' + b'Scene One' + b'' + b'Outtakes' + b'' + b'Trash' + b'' + b'Characters' + b'Jane Doe' + b'' + b'' ) theTree.clear() From 011291f225d7032f375b4473a43a0749e27cf92d Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sun, 20 Feb 2022 23:35:33 +0100 Subject: [PATCH 04/16] Drop support for Python 3.6 (#1004) * Drop support for Python 3.6 * Remove unused time parsing function * Use Python 3.7 datetime function for writing stats data conversion * Test against Python 3.10 on macOS and Windows --- .github/workflows/test_linux.yml | 2 +- .github/workflows/test_mac.yml | 2 +- .github/workflows/test_win.yml | 2 +- README.md | 6 +++--- docs/source/int_started.rst | 2 +- novelwriter/__init__.py | 4 ++-- novelwriter/common.py | 13 ------------- novelwriter/core/toodt.py | 2 +- novelwriter/tools/writingstats.py | 8 ++------ setup.cfg | 3 +-- setup/debian/control | 6 +++--- setup/description_pypi.md | 6 +++--- tests/test_base/test_base_common.py | 23 +++-------------------- 13 files changed, 22 insertions(+), 57 deletions(-) diff --git a/.github/workflows/test_linux.yml b/.github/workflows/test_linux.yml index 5699d8a8..45de8226 100644 --- a/.github/workflows/test_linux.yml +++ b/.github/workflows/test_linux.yml @@ -12,7 +12,7 @@ jobs: testLinux: strategy: matrix: - python-version: ["3.6", "3.7", "3.8", "3.9", "3.10"] + python-version: ["3.7", "3.8", "3.9", "3.10"] runs-on: ubuntu-latest steps: - name: Python Setup diff --git a/.github/workflows/test_mac.yml b/.github/workflows/test_mac.yml index c9b4497c..b11a2a71 100644 --- a/.github/workflows/test_mac.yml +++ b/.github/workflows/test_mac.yml @@ -15,7 +15,7 @@ jobs: - name: Python Setup uses: actions/setup-python@v2 with: - python-version: 3.9 + python-version: "3.10" architecture: x64 - name: Install Packages run: | diff --git a/.github/workflows/test_win.yml b/.github/workflows/test_win.yml index 85a0fda6..fd0ad402 100644 --- a/.github/workflows/test_win.yml +++ b/.github/workflows/test_win.yml @@ -15,7 +15,7 @@ jobs: - name: Python Setup uses: actions/setup-python@v2 with: - python-version: 3.9 + python-version: "3.10" architecture: x64 - name: Checkout Source uses: actions/checkout@v2 diff --git a/README.md b/README.md index 36aa11d2..60ca008b 100644 --- a/README.md +++ b/README.md @@ -31,9 +31,9 @@ The full credits are listed in ## Implementation -The application is written in Python 3 (3.6+) using Qt5 and PyQt5 (5.3+). It is developed on Linux, -but should in principle work fine on other operating systems as well as long as dependencies are -met. It is regularly tested on Debian and Ubuntu Linux, Windows, and macOS. +The application is written with Python 3 (3.7+) using Qt5 and PyQt5 (5.3+). It is developed on +Linux, but should in principle work fine on other operating systems as well as long as dependencies +are met. It is regularly tested on Debian and Ubuntu Linux, Windows, and macOS. ## Installation diff --git a/docs/source/int_started.rst b/docs/source/int_started.rst index f398a8b6..5b5fff70 100644 --- a/docs/source/int_started.rst +++ b/docs/source/int_started.rst @@ -115,7 +115,7 @@ Windows ------- First, make sure you have Python installed on your system. If you don't, you can download it from -`python.org`_. Python 3.6 or higher is required, but it is recommended that you install the latest +`python.org`_. Python 3.7 or higher is required, but it is recommended that you install the latest version. Make sure you select the "Add Python to PATH" option during installation, otherwise the ``python`` diff --git a/novelwriter/__init__.py b/novelwriter/__init__.py index 740ed327..164a05e7 100644 --- a/novelwriter/__init__.py +++ b/novelwriter/__init__.py @@ -209,9 +209,9 @@ def main(sysArgs=None): # Check Packages and Versions errorData = [] errorCode = 0 - if sys.hexversion < 0x030600f0: + if sys.hexversion < 0x030700f0: errorData.append( - "At least Python 3.6 is required, found %s" % CONFIG.verPyString + "At least Python 3.7 is required, found %s" % CONFIG.verPyString ) errorCode |= 0x04 if CONFIG.verQtValue < 50300: diff --git a/novelwriter/common.py b/novelwriter/common.py index 8d6f9a8c..8e17a7ee 100644 --- a/novelwriter/common.py +++ b/novelwriter/common.py @@ -241,19 +241,6 @@ def formatTime(tS): return "ERROR" -def parseTimeStamp(theStamp, default, allowNone=False): - """Parses a text representation of a timestamp and converts it into - a float. Note that negative timestamps cause an OSError on Windows. - See https://bugs.python.org/issue29097 - """ - if str(theStamp).lower() == "none" and allowNone: - return None - try: - return datetime.strptime(theStamp, nwConst.FMT_TSTAMP).timestamp() - except Exception: - return default - - # =============================================================================================== # # String Functions # =============================================================================================== # diff --git a/novelwriter/core/toodt.py b/novelwriter/core/toodt.py index c68f8991..c0b1daee 100644 --- a/novelwriter/core/toodt.py +++ b/novelwriter/core/toodt.py @@ -330,7 +330,7 @@ class ToOdt(Tokenizer): # Meta Data xMeta = etree.SubElement(self._xMeta, _mkTag("meta", "creation-date")) - xMeta.text = datetime.now().strftime(r"%Y-%m-%dT%H:%M:%S") + xMeta.text = datetime.now().isoformat(sep="T", timespec="seconds") xMeta = etree.SubElement(self._xMeta, _mkTag("meta", "generator")) xMeta.text = f"novelWriter/{novelwriter.__version__}" diff --git a/novelwriter/tools/writingstats.py b/novelwriter/tools/writingstats.py index e0a338bb..4ce83b66 100644 --- a/novelwriter/tools/writingstats.py +++ b/novelwriter/tools/writingstats.py @@ -457,12 +457,8 @@ class GuiWritingStats(QDialog): if len(inData) < 6: continue - dStart = datetime.strptime( - "%s %s" % (inData[0], inData[1]), nwConst.FMT_TSTAMP - ) - dEnd = datetime.strptime( - "%s %s" % (inData[2], inData[3]), nwConst.FMT_TSTAMP - ) + dStart = datetime.fromisoformat(" ".join(inData[0:2])) + dEnd = datetime.fromisoformat(" ".join(inData[2:4])) sIdle = 0 if len(inData) > 6: diff --git a/setup.cfg b/setup.cfg index d3bbcf41..0e005bf5 100644 --- a/setup.cfg +++ b/setup.cfg @@ -11,7 +11,6 @@ license_file = LICENSE.md license = GNU General Public License v3 classifiers = Programming Language :: Python :: 3 :: Only - Programming Language :: Python :: 3.6 Programming Language :: Python :: 3.7 Programming Language :: Python :: 3.8 Programming Language :: Python :: 3.9 @@ -29,7 +28,7 @@ project_urls = Source Code = https://github.com/vkbo/novelWriter [options] -python_requires = >=3.6 +python_requires = >=3.7 include_package_data = True packages = find: install_requires = diff --git a/setup/debian/control b/setup/debian/control index d32c56ba..e2d40f90 100644 --- a/setup/debian/control +++ b/setup/debian/control @@ -2,14 +2,14 @@ Source: novelwriter Maintainer: Veronica Berglyd Olsen Section: text Priority: optional -Build-Depends: dh-python, python3-setuptools, python3-all, debhelper (>= 9), python3 (>=3.6), python3-pyqt5 (>= 5.3), python3-lxml (>= 4.0), python3-enchant (>= 2.0) +Build-Depends: dh-python, python3-setuptools, python3-all, debhelper (>= 9), python3 (>=3.7), python3-pyqt5 (>= 5.3), python3-lxml (>= 4.0), python3-enchant (>= 2.0) Standards-Version: 4.5.1 Homepage: https://novelwriter.io -X-Python3-Version: >= 3.6 +X-Python3-Version: >= 3.7 Package: novelwriter Architecture: all -Depends: ${misc:Depends}, ${python3:Depends}, python3 (>=3.6), python3-pyqt5 (>= 5.3), python3-lxml (>= 4.0), python3-enchant (>= 2.0) +Depends: ${misc:Depends}, ${python3:Depends}, python3 (>=3.7), python3-pyqt5 (>= 5.3), python3-lxml (>= 4.0), python3-enchant (>= 2.0) Description: A markdown-like text editor for planning and writing novels novelWriter is a plain text editor designed for writing novels assembled from many smaller text documents. It uses a minimal formatting syntax inspired by diff --git a/setup/description_pypi.md b/setup/description_pypi.md index 8c15b1be..ed98ffda 100644 --- a/setup/description_pypi.md +++ b/setup/description_pypi.md @@ -10,9 +10,9 @@ synchronisation tools. All text is saved as plain text files with a meta data he project structure is stored in a single project XML file, and other meta data is primarily saved as JSON files. -The application is written in Python 3 (3.6+) using Qt5 and PyQt5 (5.3+). It is developed on Linux, -but should in principle work fine on other operating systems as well as long as dependencies are -met. It is regularly tested on Debian and Ubuntu Linux, Windows, and macOS. +The application is written with Python 3 (3.7+) using Qt5 and PyQt5 (5.3+). It is developed on +Linux, but should in principle work fine on other operating systems as well as long as dependencies +are met. It is regularly tested on Debian and Ubuntu Linux, Windows, and macOS. novelWriter is developed and maintained by [Veronica Berglyd Olsen](https://github.com/vkbo). diff --git a/tests/test_base/test_base_common.py b/tests/test_base/test_base_common.py index 5b9b9c13..f5eef8fe 100644 --- a/tests/test_base/test_base_common.py +++ b/tests/test_base/test_base_common.py @@ -24,8 +24,6 @@ import os import time import pytest -from datetime import datetime - from mock import causeOSError from tools import writeFile @@ -33,9 +31,9 @@ from novelwriter.guimain import GuiMain from novelwriter.common import ( checkString, checkInt, checkFloat, checkBool, checkHandle, isHandle, isTitleTag, isItemClass, isItemType, isItemLayout, hexToInt, checkIntRange, - checkIntTuple, formatInt, formatTimeStamp, formatTime, parseTimeStamp, - splitVersionNumber, transferCase, fuzzyTime, numberToRoman, jsonEncode, - readTextFile, makeFileNameSafe, sha256sum, getGuiItem, NWConfigParser + checkIntTuple, formatInt, formatTimeStamp, formatTime, splitVersionNumber, + transferCase, fuzzyTime, numberToRoman, jsonEncode, readTextFile, + makeFileNameSafe, sha256sum, getGuiItem, NWConfigParser ) @@ -272,21 +270,6 @@ def testBaseCommon_FormatTime(): # END Test testBaseCommon_FormatTime -@pytest.mark.base -def testBaseCommon_ParseTimeStamp(): - """Test the parseTimeStamp function. - """ - localEpoch = datetime(2000, 1, 1).timestamp() - assert parseTimeStamp(None, 0.0, allowNone=True) is None - assert parseTimeStamp("None", 0.0, allowNone=True) is None - assert parseTimeStamp("None", 0.0) == 0.0 - assert parseTimeStamp("2000-01-01 00:00:00", 123.0) == localEpoch - assert parseTimeStamp("2000-13-01 00:00:00", 123.0) == 123.0 - assert parseTimeStamp("2000-01-32 00:00:00", 123.0) == 123.0 - -# END Test testBaseCommon_ParseTimeStamp - - @pytest.mark.base def testBaseCommon_SplitVersionNumber(): """Test the splitVersionNumber function. From 3cdba90bb04642b7ccf9a182347b172225b51933 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Thu, 24 Feb 2022 21:06:28 +0100 Subject: [PATCH 05/16] Fix document margin recursion error (#1007) --- novelwriter/gui/doceditor.py | 2 +- novelwriter/gui/docviewer.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/novelwriter/gui/doceditor.py b/novelwriter/gui/doceditor.py index 41442385..b1760be4 100644 --- a/novelwriter/gui/doceditor.py +++ b/novelwriter/gui/doceditor.py @@ -1061,8 +1061,8 @@ class GuiDocEditor(QTextEdit): """If the text editor is resized, we must make sure the document has its margins adjusted according to user preferences. """ - QTextEdit.resizeEvent(self, theEvent) self.updateDocMargins() + QTextEdit.resizeEvent(self, theEvent) return ## diff --git a/novelwriter/gui/docviewer.py b/novelwriter/gui/docviewer.py index 72c142a0..4ec59570 100644 --- a/novelwriter/gui/docviewer.py +++ b/novelwriter/gui/docviewer.py @@ -471,10 +471,11 @@ class GuiDocViewer(QTextBrowser): ## def resizeEvent(self, theEvent): - """Make sure the document title is the same width as the window. + """If the text editor is resized, we must make sure the document + has its margins adjusted according to user preferences. """ - QTextBrowser.resizeEvent(self, theEvent) self.updateDocMargins() + QTextBrowser.resizeEvent(self, theEvent) return def mouseReleaseEvent(self, theEvent): From 7532fdb1fc696066cb831baad53c0c0411e9ff89 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Thu, 24 Feb 2022 21:08:42 +0100 Subject: [PATCH 06/16] Fix project file icon path in Windows installer (#1006) --- setup/win_setup_embed.iss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/win_setup_embed.iss b/setup/win_setup_embed.iss index 84911592..7505f6c1 100644 --- a/setup/win_setup_embed.iss +++ b/setup/win_setup_embed.iss @@ -51,6 +51,6 @@ Filename: "{app}\pythonw.exe"; Parameters: "{#nwAppExeName}"; Description: "{cm [Registry] Root: HKA; Subkey: "Software\Classes\.nwx\OpenWithProgids"; ValueType: string; ValueName: "novelWriterProject.nwx"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\novelWriterProject.nwx"; ValueType: string; ValueName: ""; ValueData: "novelWriter Project File"; Flags: uninsdeletekey -Root: HKA; Subkey: "Software\Classes\novelWriterProject.nwx\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\assets\icons\x-novelwriter-project.ico" +Root: HKA; Subkey: "Software\Classes\novelWriterProject.nwx\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\novelwriter\assets\icons\x-novelwriter-project.ico" Root: HKA; Subkey: "Software\Classes\novelWriterProject.nwx\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\pythonw.exe"" ""{app}\{#nwAppExeName}"" ""%1""" Root: HKA; Subkey: "Software\Classes\Applications\{#nwAppExeName}\SupportedTypes"; ValueType: string; ValueName: ".nwx"; ValueData: ""; Flags: uninsdeletekey From 7f43584ed535a421887916e79b8074bb725850cc Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Thu, 24 Feb 2022 21:19:12 +0100 Subject: [PATCH 07/16] Merge bugfixes (#1009) * Fix document margin recursion error (#1007) * Fix project file icon path in Windows installer (#1006) --- novelwriter/gui/doceditor.py | 2 +- novelwriter/gui/docviewer.py | 5 +++-- setup/win_setup_embed.iss | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/novelwriter/gui/doceditor.py b/novelwriter/gui/doceditor.py index 41442385..b1760be4 100644 --- a/novelwriter/gui/doceditor.py +++ b/novelwriter/gui/doceditor.py @@ -1061,8 +1061,8 @@ class GuiDocEditor(QTextEdit): """If the text editor is resized, we must make sure the document has its margins adjusted according to user preferences. """ - QTextEdit.resizeEvent(self, theEvent) self.updateDocMargins() + QTextEdit.resizeEvent(self, theEvent) return ## diff --git a/novelwriter/gui/docviewer.py b/novelwriter/gui/docviewer.py index 72c142a0..4ec59570 100644 --- a/novelwriter/gui/docviewer.py +++ b/novelwriter/gui/docviewer.py @@ -471,10 +471,11 @@ class GuiDocViewer(QTextBrowser): ## def resizeEvent(self, theEvent): - """Make sure the document title is the same width as the window. + """If the text editor is resized, we must make sure the document + has its margins adjusted according to user preferences. """ - QTextBrowser.resizeEvent(self, theEvent) self.updateDocMargins() + QTextBrowser.resizeEvent(self, theEvent) return def mouseReleaseEvent(self, theEvent): diff --git a/setup/win_setup_embed.iss b/setup/win_setup_embed.iss index 84911592..7505f6c1 100644 --- a/setup/win_setup_embed.iss +++ b/setup/win_setup_embed.iss @@ -51,6 +51,6 @@ Filename: "{app}\pythonw.exe"; Parameters: "{#nwAppExeName}"; Description: "{cm [Registry] Root: HKA; Subkey: "Software\Classes\.nwx\OpenWithProgids"; ValueType: string; ValueName: "novelWriterProject.nwx"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\novelWriterProject.nwx"; ValueType: string; ValueName: ""; ValueData: "novelWriter Project File"; Flags: uninsdeletekey -Root: HKA; Subkey: "Software\Classes\novelWriterProject.nwx\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\assets\icons\x-novelwriter-project.ico" +Root: HKA; Subkey: "Software\Classes\novelWriterProject.nwx\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\novelwriter\assets\icons\x-novelwriter-project.ico" Root: HKA; Subkey: "Software\Classes\novelWriterProject.nwx\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\pythonw.exe"" ""{app}\{#nwAppExeName}"" ""%1""" Root: HKA; Subkey: "Software\Classes\Applications\{#nwAppExeName}\SupportedTypes"; ValueType: string; ValueName: ".nwx"; ValueData: ""; Flags: uninsdeletekey From ce4d3c0b5cb5e3f4d7a29db3992c1f9d256637b1 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Tue, 15 Mar 2022 22:07:33 +0100 Subject: [PATCH 08/16] Update linting settings, and drop Ubuntu 18.04 releases (#1014) * Add E133 and W503 to ignored list for flake8 * Drop making releases for Ubuntu 18.04 --- .github/workflows/syntax.yml | 4 ++-- setup.cfg | 2 +- setup.py | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/syntax.yml b/.github/workflows/syntax.yml index 560dd7dc..5294afe0 100644 --- a/.github/workflows/syntax.yml +++ b/.github/workflows/syntax.yml @@ -27,5 +27,5 @@ jobs: flake8 tests --count --select=E9,F63,F7,F82 --show-source --statistics - name: Coding Style Violations run: | - flake8 novelwriter --count --max-line-length=99 --ignore E221,E226,E228,E241 --show-source --statistics - flake8 tests --count --max-line-length=99 --ignore E221,E226,E228,E241 --show-source --statistics + flake8 novelwriter --count --max-line-length=99 --ignore E133,E221,E226,E228,E241,W503 --show-source --statistics + flake8 tests --count --max-line-length=99 --ignore E133,E221,E226,E228,E241,W503 --show-source --statistics diff --git a/setup.cfg b/setup.cfg index 0e005bf5..b88b656b 100644 --- a/setup.cfg +++ b/setup.cfg @@ -49,6 +49,6 @@ gui_scripts = universal = 0 [flake8] -ignore = E221,E226,E228,E241 +ignore = E133,E221,E226,E228,E241,W503 max-line-length = 99 exclude = docs/* diff --git a/setup.py b/setup.py index 44d5cb1f..f72ce936 100755 --- a/setup.py +++ b/setup.py @@ -786,7 +786,6 @@ def makeForLaunchpad(doSign=False, isFirst=False, isSnapshot=False): bldNum = "0" distLoop = [ - ("18.04", "bionic"), ("20.04", "focal"), ("21.10", "impish"), ("22.04", "jammy"), From 1c7708babd433de4b486efd612bbab8d2fc74bd9 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Wed, 16 Mar 2022 22:34:29 +0100 Subject: [PATCH 09/16] Fix infinite search loop bug (#1016) * Make sure the search loop in the editor cannot run infinitely * Add test coverage of infinite search case * Run GitHub actions against the patch branch --- .github/workflows/syntax.yml | 2 ++ .github/workflows/test_linux.yml | 2 ++ .github/workflows/test_mac.yml | 2 ++ .github/workflows/test_win.yml | 2 ++ novelwriter/gui/doceditor.py | 14 ++++++++++---- tests/test_gui/test_gui_doceditor.py | 17 ++++++++++++----- 6 files changed, 30 insertions(+), 9 deletions(-) diff --git a/.github/workflows/syntax.yml b/.github/workflows/syntax.yml index 560dd7dc..a0b56ce1 100644 --- a/.github/workflows/syntax.yml +++ b/.github/workflows/syntax.yml @@ -4,9 +4,11 @@ on: push: branches: - main + - patch pull_request: branches: - main + - patch jobs: checkSyntax: diff --git a/.github/workflows/test_linux.yml b/.github/workflows/test_linux.yml index 5699d8a8..caf147ef 100644 --- a/.github/workflows/test_linux.yml +++ b/.github/workflows/test_linux.yml @@ -4,9 +4,11 @@ on: push: branches: - main + - patch pull_request: branches: - main + - patch jobs: testLinux: diff --git a/.github/workflows/test_mac.yml b/.github/workflows/test_mac.yml index c9b4497c..a011b51e 100644 --- a/.github/workflows/test_mac.yml +++ b/.github/workflows/test_mac.yml @@ -4,9 +4,11 @@ on: push: branches: - main + - patch pull_request: branches: - main + - patch jobs: testMac: diff --git a/.github/workflows/test_win.yml b/.github/workflows/test_win.yml index 85a0fda6..b41ccbf5 100644 --- a/.github/workflows/test_win.yml +++ b/.github/workflows/test_win.yml @@ -4,9 +4,11 @@ on: push: branches: - main + - patch pull_request: branches: - main + - patch jobs: testWin: diff --git a/novelwriter/gui/doceditor.py b/novelwriter/gui/doceditor.py index b1760be4..4d35c978 100644 --- a/novelwriter/gui/doceditor.py +++ b/novelwriter/gui/doceditor.py @@ -1436,10 +1436,16 @@ class GuiDocEditor(QTextEdit): theCursor.setPosition(0) self.setTextCursor(theCursor) - while self.find(searchFor, findOpt): + # Search up to a maximum of 1000, and make sure certain special + # searches like a regex search for .* turns into an infinite loop + while self.find(searchFor, findOpt) and len(resE) <= 1000: theCursor = self.textCursor() - resS.append(theCursor.selectionStart()) - resE.append(theCursor.selectionEnd()) + if theCursor.hasSelection(): + resS.append(theCursor.selectionStart()) + resE.append(theCursor.selectionEnd()) + else: + logger.warning("The search returned an empty result") + break if hasSelection: theCursor.setPosition(origA, QTextCursor.MoveAnchor) @@ -2410,7 +2416,7 @@ class GuiDocEditSearch(QFrame): """Set the count values for the current search. """ currRes = "?" if currRes is None else currRes - resCount = "?" if resCount is None else resCount + resCount = "?" if resCount is None else "1000+" if resCount > 1000 else resCount minWidth = self.theTheme.getTextWidth(f"{resCount}//{resCount}", self.boxFont) self.resultLabel.setText(f"{currRes}/{resCount}") self.resultLabel.setMinimumWidth(minWidth) diff --git a/tests/test_gui/test_gui_doceditor.py b/tests/test_gui/test_gui_doceditor.py index 241acd24..8057ca41 100644 --- a/tests/test_gui/test_gui_doceditor.py +++ b/tests/test_gui/test_gui_doceditor.py @@ -1286,13 +1286,13 @@ def testGuiEditor_Search(qtbot, monkeypatch, nwGUI, nwLipsum): monkeypatch.setattr(GuiDocEditor, "hasFocus", lambda *a: True) nwGUI.theProject.projTree.setSeed(42) - assert nwGUI.openProject(nwLipsum) - assert nwGUI.openDocument("4c4f28287af27") + assert nwGUI.openProject(nwLipsum) is True + assert nwGUI.openDocument("4c4f28287af27") is True origText = nwGUI.docEditor.getText() qtbot.wait(stepDelay) # Select the Word "est" - assert nwGUI.docEditor.setCursorPosition(630) + nwGUI.docEditor.setCursorPosition(630) nwGUI.docEditor._makeSelection(QTextCursor.WordUnderCursor) theCursor = nwGUI.docEditor.textCursor() assert theCursor.selectedText() == "est" @@ -1331,7 +1331,7 @@ def testGuiEditor_Search(qtbot, monkeypatch, nwGUI, nwLipsum): assert nwGUI.docEditor.docSearch.isVisible() is True # Search for non-existing - assert nwGUI.docEditor.setCursorPosition(0) + nwGUI.docEditor.setCursorPosition(0) assert nwGUI.docEditor.docSearch.setSearchText("abcdef") qtbot.mouseClick(nwGUI.docEditor.docSearch.searchButton, Qt.LeftButton, delay=keyDelay) assert nwGUI.docEditor.getCursorPosition() < 3 # No result @@ -1342,11 +1342,18 @@ def testGuiEditor_Search(qtbot, monkeypatch, nwGUI, nwLipsum): assert nwGUI.docEditor.docSearch.isRegEx is True # Set invalid RegEx - assert nwGUI.docEditor.setCursorPosition(0) + nwGUI.docEditor.setCursorPosition(0) assert nwGUI.docEditor.docSearch.setSearchText(r"\bSus[") qtbot.mouseClick(nwGUI.docEditor.docSearch.searchButton, Qt.LeftButton, delay=keyDelay) assert nwGUI.docEditor.getCursorPosition() < 3 # No result + # Set dangerous RegEx (issue #1015) + # If this doesn't get caught, the app will hang + nwGUI.docEditor.setCursorPosition(0) + assert nwGUI.docEditor.docSearch.setSearchText(r".*") + qtbot.mouseClick(nwGUI.docEditor.docSearch.searchButton, Qt.LeftButton, delay=keyDelay) + assert abs(nwGUI.docEditor.getCursorPosition() - 14) < 3 + # Set valid RegEx assert nwGUI.docEditor.docSearch.setSearchText(r"\bSus") qtbot.mouseClick(nwGUI.docEditor.docSearch.searchButton, Qt.LeftButton, delay=keyDelay) From 9e76498f65516a102d725c5b16d0e42ecc8378ef Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Wed, 16 Mar 2022 22:41:52 +0100 Subject: [PATCH 10/16] Update Latin American Spanish translation (#1017) --- i18n/nw_es_419.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/i18n/nw_es_419.ts b/i18n/nw_es_419.ts index 223d9acf..e465c54f 100644 --- a/i18n/nw_es_419.ts +++ b/i18n/nw_es_419.ts @@ -535,12 +535,12 @@ Hide scene - Hide scene + Ocultar la escena Hide section - Hide section + Ocultar la sección From 4cbbae6d2febdba4c46b8ff336a3463b569618a3 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Wed, 16 Mar 2022 23:01:14 +0100 Subject: [PATCH 11/16] Release 1.6.1 (#1018) --- CHANGELOG.md | 33 +++++++++++++++++++++++ novelwriter/__init__.py | 6 ++--- novelwriter/assets/text/release_notes.htm | 8 ++++++ sample/nwProject.nwx | 6 ++--- 4 files changed, 47 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1dcc02db..1c864ca1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,38 @@ # novelWriter Changelog +## Version 1.6.1 [2022-03-16] + +### Release Notes + +This is a bugfix and patch release that fixes two recursion/loop issues. One can cause a crash if +the window is resized rapidly, and one can cause a hang with certain search parameters in the +editor's search box. The Latin American Spanish translation has also been updated. + +### Detailed Changelog + +**Installation** + +* When using the new installer on Windows, the project file mime type icon path would not be + correctly configured in registry. The correct path is now used. PR #1006. + +**Internationalisation** + +* The Latin American Spanish translation has been updated with two missing translation strings. + PR #1017. + +**Bugfixes** + +* Fix a bug where rapidly resizing the main window could trigger the recursion detector in Python + if done on a slower system. The actual issue may be a race condition or similar, and the change + made at least makes it harder to trigger. PR #1007. +* With some document searches, it was possible to trigger an infinite loop in the function that + counts results. It seems to be caused by the QTextEdit widget's find function returning a + successful result status, but no actual result selection. The fix will now write a warning to the + log and exit in such cases. The number of results is also now capped at 1000. Issue #1015. + PR #1016. + +---- + ## Version 1.6 [2022-02-20] ### Release Notes diff --git a/novelwriter/__init__.py b/novelwriter/__init__.py index 98247c68..485dc406 100644 --- a/novelwriter/__init__.py +++ b/novelwriter/__init__.py @@ -60,9 +60,9 @@ __license__ = "GPLv3" __author__ = "Veronica Berglyd Olsen" __maintainer__ = "Veronica Berglyd Olsen" __email__ = "code@vkbo.net" -__version__ = "1.6" -__hexversion__ = "0x010600f0" -__date__ = "2022-02-20" +__version__ = "1.6.1" +__hexversion__ = "0x010601f0" +__date__ = "2022-03-16" __status__ = "Stable" __domain__ = "novelwriter.io" __url__ = "https://novelwriter.io" diff --git a/novelwriter/assets/text/release_notes.htm b/novelwriter/assets/text/release_notes.htm index d315a9a4..6c4a7d99 100644 --- a/novelwriter/assets/text/release_notes.htm +++ b/novelwriter/assets/text/release_notes.htm @@ -37,5 +37,13 @@ not compatible.

See also the Releases page.

+

Patch Notes

+ +

Patch 1.6.1 – 16 March 2022

+ +

This is a bugfix and patch release that fixes two recursion/loop issues. One can cause a crash +if the window is resized rapidly, and one can cause a hang with certain search parameters in the +editor's search box. The Latin American Spanish translation has also been updated.

+ diff --git a/sample/nwProject.nwx b/sample/nwProject.nwx index 9e37d34a..95a4d168 100644 --- a/sample/nwProject.nwx +++ b/sample/nwProject.nwx @@ -1,13 +1,13 @@ - + Sample Project Sample Project Jane Smith Jay Doh - 1299 + 1301 199 - 64923 + 64982 False From 16ce55ba60b37e332b670d302ca253cd03a61e2f Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sun, 20 Mar 2022 15:09:46 +0100 Subject: [PATCH 12/16] Make sure empty files are indexed (#1022) * Make sure also empty files are indexed * Update comments --- novelwriter/core/index.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/novelwriter/core/index.py b/novelwriter/core/index.py index fa4f01dd..b05fa952 100644 --- a/novelwriter/core/index.py +++ b/novelwriter/core/index.py @@ -112,8 +112,7 @@ class NWIndex(): theDoc = NWDoc(self.theProject, tHandle) theText = theDoc.readDocument() - if theText: - self.scanText(tHandle, theText) + self.scanText(tHandle, theText if theText is not None else "") return True @@ -217,18 +216,19 @@ class NWIndex(): if theItem.itemType != nwItemType.FILE: logger.info("Not indexing non-file item '%s'", tHandle) return False + + # Run word counter for the whole text + cC, wC, pC = countWords(theText) + self._fileMeta[tHandle] = ["H0", cC, wC, pC] + + # If the file's meta data is missing, or the file is out of the + # main project, we don't index the content if theItem.itemLayout == nwItemLayout.NO_LAYOUT: logger.info("Not indexing no-layout item '%s'", tHandle) return False if theItem.itemParent is None: logger.info("Not indexing orphaned item '%s'", tHandle) return False - - # Run word counter for the whole text - cC, wC, pC = countWords(theText) - self._fileMeta[tHandle] = ["H0", cC, wC, pC] - - # If the file is archived or in trash, we don't index the content if self.theProject.projTree.isTrashRoot(theItem.itemParent): logger.debug("Not indexing trash item '%s'", tHandle) return False From 8c4e5b99fe1f80077e4ed3691b9b944a753638ea Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sun, 20 Mar 2022 15:22:09 +0100 Subject: [PATCH 13/16] Only compute shasum of file if it exists (#1023) --- novelwriter/core/document.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/novelwriter/core/document.py b/novelwriter/core/document.py index 71916af8..2334c77c 100644 --- a/novelwriter/core/document.py +++ b/novelwriter/core/document.py @@ -89,9 +89,10 @@ class NWDoc(): theText = "" self._docMeta = {} - self._prevHash = sha256sum(docPath) + self._prevHash = None if os.path.isfile(docPath): + self._prevHash = sha256sum(docPath) try: with open(docPath, mode="r", encoding="utf-8") as inFile: # Check the first <= 10 lines for metadata From 203e353e92a95e3f134ba79299859ded5cf807c5 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sun, 20 Mar 2022 15:44:52 +0100 Subject: [PATCH 14/16] Release 1.6.2 (#1024) --- CHANGELOG.md | 31 ++++++++++++++++++++--- novelwriter/__init__.py | 6 ++--- novelwriter/assets/text/release_notes.htm | 14 +++++++--- sample/nwProject.nwx | 6 ++--- 4 files changed, 45 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c864ca1..00509e4e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,37 @@ # novelWriter Changelog +## Version 1.6.2 [2022-03-20] + +### Release Notes + +This is a bugfix release that fixes a couple of minor issues. Projects containing one or more empty +documents would trigger a rebuild of the index each time the project was opened. This has now been +fixed. Another fix resolves an error message being written to the console logging output when a new +document was created. Both errors were harmless. + +### Detailed Changelog + +**Bugfixes** + +* Fixed an issue where projects containing empty documents would trigger an index rebuild on open, + but the empty document would be skipped due to a check that skips empty documents. As a + consequence, the index would be rebuilt each time the project was opened. Empty documents are now + added to the index, resolving this issue. Issue #1020. PR #1022. +* Fixed an issue where the shasum calculation would be performed when a new document was created, + which would fail as the file did not yet exist. The error was handled, but an error message was + printed to the console log. The shasum is now no longer called if the file doesn't already exist. + Issue #1021. PR #1023. + +---- + ## Version 1.6.1 [2022-03-16] ### Release Notes -This is a bugfix and patch release that fixes two recursion/loop issues. One can cause a crash if -the window is resized rapidly, and one can cause a hang with certain search parameters in the -editor's search box. The Latin American Spanish translation has also been updated. +This is a bugfix and patch release that fixes two recursion/loop issues. One would potentially +cause a crash if the window was resized rapidly, and one would cause a hang with certain search +parameters in the editor's search box. The Latin American Spanish translation has also been +updated. ### Detailed Changelog diff --git a/novelwriter/__init__.py b/novelwriter/__init__.py index 485dc406..0afbf118 100644 --- a/novelwriter/__init__.py +++ b/novelwriter/__init__.py @@ -60,9 +60,9 @@ __license__ = "GPLv3" __author__ = "Veronica Berglyd Olsen" __maintainer__ = "Veronica Berglyd Olsen" __email__ = "code@vkbo.net" -__version__ = "1.6.1" -__hexversion__ = "0x010601f0" -__date__ = "2022-03-16" +__version__ = "1.6.2" +__hexversion__ = "0x010602f0" +__date__ = "2022-03-20" __status__ = "Stable" __domain__ = "novelwriter.io" __url__ = "https://novelwriter.io" diff --git a/novelwriter/assets/text/release_notes.htm b/novelwriter/assets/text/release_notes.htm index 6c4a7d99..0850e30c 100644 --- a/novelwriter/assets/text/release_notes.htm +++ b/novelwriter/assets/text/release_notes.htm @@ -41,9 +41,17 @@ not compatible.

Patch 1.6.1 – 16 March 2022

-

This is a bugfix and patch release that fixes two recursion/loop issues. One can cause a crash -if the window is resized rapidly, and one can cause a hang with certain search parameters in the -editor's search box. The Latin American Spanish translation has also been updated.

+

This is a bugfix and patch release that fixes two recursion/loop issues. One would potentially +cause a crash if the window was resized rapidly, and one would cause a hang with certain search +parameters in the editor's search box. The Latin American Spanish translation has also been +updated.

+ +

Patch 1.6.2 – 20 March 2022

+ +

This is a bugfix release that fixes a couple of minor issues. Projects containing one or more +empty documents would trigger a rebuild of the index each time the project was opened. This has now +been fixed. Another fix resolves an error message being written to the console logging output when +a new document was created. Both errors were harmless.

diff --git a/sample/nwProject.nwx b/sample/nwProject.nwx index 95a4d168..5be5d7af 100644 --- a/sample/nwProject.nwx +++ b/sample/nwProject.nwx @@ -1,13 +1,13 @@ - + Sample Project Sample Project Jane Smith Jay Doh - 1301 + 1302 199 - 64982 + 64999 False From 6e3262f78e56de33ca286b7779f09b075f56196a Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sun, 20 Mar 2022 17:00:29 +0100 Subject: [PATCH 15/16] Minor fixes and updates (#1026) * Make the Tokenizer class an abstract class * Fix error message when opening non-file project items --- novelwriter/core/item.py | 6 +++--- novelwriter/core/tokenizer.py | 9 +++++++-- tests/test_core/test_core_tokenizer.py | 21 +++++++++++++-------- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/novelwriter/core/item.py b/novelwriter/core/item.py index 07db4a41..67dd836c 100644 --- a/novelwriter/core/item.py +++ b/novelwriter/core/item.py @@ -183,9 +183,9 @@ class NWItem(): self.setParent(xItem.attrib.get("parent", None)) self.setOrder(xItem.attrib.get("order", 0)) - self.setType(xItem.attrib.get("type", None)) - self.setClass(xItem.attrib.get("class", None)) - self.setLayout(xItem.attrib.get("layout", None)) + self.setType(xItem.attrib.get("type", nwItemType.NO_TYPE)) + self.setClass(xItem.attrib.get("class", nwItemClass.NO_CLASS)) + self.setLayout(xItem.attrib.get("layout", nwItemLayout.NO_LAYOUT)) for xValue in xItem: if xValue.tag == "meta": diff --git a/novelwriter/core/tokenizer.py b/novelwriter/core/tokenizer.py index 6a3a9809..271ffd2c 100644 --- a/novelwriter/core/tokenizer.py +++ b/novelwriter/core/tokenizer.py @@ -1,7 +1,7 @@ """ novelWriter – Text Tokenizer ============================ -Splits a piece of novelWriter markdown text into its elements +Split novelWriter plain text into its elements File History: Created: 2019-05-05 [0.0.1] @@ -27,6 +27,7 @@ import re import logging import novelwriter +from abc import ABC, abstractmethod from operator import itemgetter from functools import partial @@ -40,7 +41,7 @@ from novelwriter.core.document import NWDoc logger = logging.getLogger(__name__) -class Tokenizer(): +class Tokenizer(ABC): # In-Text Format FMT_B_B = 1 # Begin bold @@ -267,6 +268,10 @@ class Tokenizer(): # Class Methods ## + @abstractmethod + def doConvert(self): + raise NotImplementedError + def addRootHeading(self, theHandle): """Add a heading at the start of a new root folder. """ diff --git a/tests/test_core/test_core_tokenizer.py b/tests/test_core/test_core_tokenizer.py index 0c57214b..d277a601 100644 --- a/tests/test_core/test_core_tokenizer.py +++ b/tests/test_core/test_core_tokenizer.py @@ -28,12 +28,17 @@ from novelwriter.core import NWProject, NWDoc from novelwriter.core.tokenizer import Tokenizer +class BareTokenizer(Tokenizer): + def doConvert(self): + pass + + @pytest.mark.core def testCoreToken_Setters(mockGUI): """Test all the setters for the Tokenizer class. """ theProject = NWProject(mockGUI) - theToken = Tokenizer(theProject) + theToken = BareTokenizer(theProject) # Verify defaults assert theToken._fmtTitle == "%title%" @@ -135,7 +140,7 @@ def testCoreToken_TextOps(monkeypatch, nwMinimal, mockGUI): theProject.projLang = "en" theProject._loadProjectLocalisation() - theToken = Tokenizer(theProject) + theToken = BareTokenizer(theProject) theToken.setKeepMarkdown(True) assert theProject.openProject(nwMinimal) @@ -222,7 +227,7 @@ def testCoreToken_HeaderFormat(mockGUI): """Test the tokenization of header formats in the Tokenizer class. """ theProject = NWProject(mockGUI) - theToken = Tokenizer(theProject) + theToken = BareTokenizer(theProject) theToken.setKeepMarkdown(True) # Title @@ -426,7 +431,7 @@ def testCoreToken_MetaFormat(mockGUI): """Test the tokenization of meta formats in the Tokenizer class. """ theProject = NWProject(mockGUI) - theToken = Tokenizer(theProject) + theToken = BareTokenizer(theProject) theToken.setKeepMarkdown(True) # Comment @@ -495,7 +500,7 @@ def testCoreToken_MarginFormat(mockGUI): """Test the tokenization of margin formats in the Tokenizer class. """ theProject = NWProject(mockGUI) - theToken = Tokenizer(theProject) + theToken = BareTokenizer(theProject) theToken.setKeepMarkdown(True) # Alignment and Indentation @@ -550,7 +555,7 @@ def testCoreToken_TextFormat(mockGUI): """Test the tokenization of text formats in the Tokenizer class. """ theProject = NWProject(mockGUI) - theToken = Tokenizer(theProject) + theToken = BareTokenizer(theProject) theToken.setKeepMarkdown(True) # Text @@ -672,7 +677,7 @@ def testCoreToken_SpecialFormat(mockGUI): """Test the tokenization of special formats in the Tokenizer class. """ theProject = NWProject(mockGUI) - theToken = Tokenizer(theProject) + theToken = BareTokenizer(theProject) theToken._isNovel = True @@ -877,7 +882,7 @@ def testCoreToken_ProcessHeaders(mockGUI): theProject = NWProject(mockGUI) theProject.projLang = "en" theProject._loadProjectLocalisation() - theToken = Tokenizer(theProject) + theToken = BareTokenizer(theProject) # Nothing theToken._theText = "Some text ...\n" From 99cc3635f7b636793ea5103e972c36207d7a52be Mon Sep 17 00:00:00 2001 From: Martijn Date: Wed, 23 Mar 2022 19:22:44 +0100 Subject: [PATCH 16/16] Add Dutch translation (#1027) * Add @mvdkleijn as translator * Update about.py --- CREDITS.md | 1 + i18n/nw_nl_NL.ts | 4521 ++++++++++++++++++++++++++++++++++ novelwriter/dialogs/about.py | 1 + 3 files changed, 4523 insertions(+) create mode 100644 i18n/nw_nl_NL.ts diff --git a/CREDITS.md b/CREDITS.md index 994768ac..e770434f 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -16,6 +16,7 @@ * Portuguese: Bruno Meneguello (@bkmeneguello) * Simplified Chinese: Qianzhi Long (@longqzh) * Latin American Spanish: Tommy Marplatt (@tmarplatt) +* Dutch: Martijn van der Kleijn (@mvdkleijn) ## Libraries diff --git a/i18n/nw_nl_NL.ts b/i18n/nw_nl_NL.ts new file mode 100644 index 00000000..332ceac8 --- /dev/null +++ b/i18n/nw_nl_NL.ts @@ -0,0 +1,4521 @@ + + + + + Common + + + in the future + in de toekomst + + + + just now + zojuist + + + + a minute ago + een minuut geleden + + + + {0} minutes ago + {0} minuten geleden + + + + an hour ago + een uur geleden + + + + {0} hours ago + {0} uur geleden + + + + a day ago + een dag geleden + + + + {0} days ago + {0} dagen geleden + + + + a week ago + een week geleden + + + + {0} weeks ago + {0} weken geleden + + + + a month ago + een maand geleden + + + + {0} months ago + {0} maanden geleden + + + + a year ago + een jaar geleden + + + + {0} years ago + {0} jaren geleden + + + + Constant + + + + + None + Geen + + + + Novel + Roman + + + + + Plot + Plot + + + + + Characters + Personages + + + + + Locations + Locaties + + + + + Timeline + Tijdslijn + + + + + Objects + Objecten + + + + + Entities + Entiteiten + + + + + Custom + Custom + + + + Archive + Archief + + + + Trash + Prullenbak + + + + + Novel Document + Roman Document + + + + + Project Note + Project Notitie + + + + Root Folder + Hoofdmap + + + + Folder + Map + + + + Novel Title Page + Roman Titel Pagina + + + + Novel Chapter + Roman Hoofdstuk + + + + Novel Scene + Roman Scene + + + + Tag + Label + + + + Point of View + Perspectief + + + + + Focus + Focus + + + + Title + Titel + + + + Level + Niveau + + + + Document + Document + + + + Line + Regel + + + + Chars + Tekens + + + + Words + Woorden + + + + Pars + Par. + + + + POV + Perspectief + + + + Synopsis + Synopsis + + + + Straight single quotation mark + Recht enkel aanhalingsteken + + + + Straight double quotation mark + Recht dubbel aanhalingsteken + + + + Left single quotation mark + Linker enkel aanhalingsteken + + + + Right single quotation mark + Rechter enkel aanhalingsteken + + + + Single low-9 quotation mark + Enkel lage-9 aanhalingsteken + + + + Single high-reversed-9 quotation mark + Enkel hoog-omgekeerd-9 aanhalingsteken + + + + Left double quotation mark + Linker dubbel aanhalingsteken + + + + Right double quotation mark + Rechter dubbel aanhalingsteken + + + + Double low-9 quotation mark + Dubbel lage-9 aanhalingsteken + + + + Double high-reversed-9 quotation mark + Dubbel hoog-omgekeerd-9 aanhalingsteken + + + + Double low-reversed-9 quotation mark + Dubbel laag-omgekeerd-9 aanhalingsteken + + + + Single left-pointing angle quotation mark + Enkel links-wijzende hoek aanhalingsteken + + + + Single right-pointing angle quotation mark + Enkel rechts-wijzende hoek aanhalingsteken + + + + Double left-pointing angle quotation mark + Dubbel links-wijzende hoek aanhalingsteken + + + + Double right-pointing angle quotation mark + Dubbel rechts-wijzende hoek aanhalingsteken + + + + Left corner bracket + Linker hoekbeugel + + + + Right corner bracket + Rechter hoekbeugel + + + + Left white corner bracket + Linker holle hoekbeugel + + + + Right white corner bracket + Rechter holle hoekbeugel + + + + GuiAbout + + + + About novelWriter + Over novelWriter + + + + About + Over + + + + Release + Uitgave + + + + + + + Licence + Licentie + + + + Website: {0} + Website: {0} + + + + Credits + Bijdragen + + + + Developer + Ontwikkelaar + + + + Concept + Concept + + + + i18n + 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 een markdown-achtige tekstbewerker, ontworpen voor het organiseren en schrijven van romans. Het is geschreven in Python 3 met een Qt5 GUI met behulp van 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 gratis software: u kunt het herdistribueren en/of aanpassen onder de voorwaarden van de GNU General Public License zoals gepubliceerd door de Free Software Foundation, óf versie 3 van de Licentie, óf (naar uw keuze) elke latere versie. + + + + 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. + novelWriter wordt verspreid in de hoop dat het nuttig is, maar ZONDER ENIGE GARANTIE; zonder zelfs de geïmpliceerde garantie van VERKOOPBAARHEID of GESCHIKTHEID VOOR EEN BEPAALD DOEL. + + + + See the Licence tab for the full licence text, or visit the GNU website at {0} for more details. + Zie het tabblad Licentie voor de volledige licentietekst, of bezoek de GNU-website op {0} voor meer details. + + + + Translations + Vertalingen + + + + Theme: {0} + Thema: {0} + + + + + + Author + Auteur + + + + + + Credit + Dank aan + + + + Icons: {0} + Pictogrammen: {0} + + + + Syntax: {0} + Syntaxis: {0} + + + + GuiBuildNovel + + + Build Novel Project + Bouw Roman Project + + + + Title Formats for Novel Files + Titel Indelingen voor Roman Bestanden + + + + Formatting Codes: + Opmaak codes: + + + + {0} for the title as set in the document + {0} voor de titel zoals ingesteld in het document + + + + {0} for chapter number (1, 2, 3) + {0} voor hoofdstuk nummer (1, 2, 3) + + + + {0} for chapter number as a word (one, two) + {0} voor hoofdstuk nummer als een woord (één, twee) + + + + {0} for chapter number in upper case Roman + {0} voor hoofdstuknummer in Romeinse hoofdletters + + + + {0} for chapter number in lower case Roman + {0} voor hoofdstuknummer in Romeinse kleine letters + + + + {0} for scene number within chapter + {0} voor scène nummer binnen hoofdstuk + + + + {0} for scene number within novel + {0} voor scènenummer in de roman + + + + 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. + Laat leeg om deze kop over te slaan, of stel een statische tekst in, zoals bijvoorbeeld '{0}', om een scheiding te maken. De scheiding wordt automatisch gecentreerd en verschijnt alleen tussen secties van hetzelfde type. + + + + Not Set + Niet ingesteld + + + + Title + Titel + + + + Chapter + Hoofdstuk + + + + Unnumbered + Ongenummerd + + + + Scene + Scène + + + + Section + Sectie + + + + Language + Taal + + + + Hide scene + Verberg scène + + + + Hide section + Verberg sectie + + + + Font Options + Lettertype Opties + + + + Font family + Lettertype familie + + + + Font size + Lettertypegrootte + + + + Line height + Regelhoogte + + + + Justify text + Tekst uitvullen + + + + Disable styling + Opmaak uitschakelen + + + + Styling Options + Opmaak Opties + + + + Include Options + Invoeg Opties + + + + Include synopsis + Inclusief synopsis + + + + Include comments + Inclusief opmerkingen + + + + Include keywords + Inclusief trefwoorden + + + + Include body text + Inclusief inhoudstekst + + + + File Filter Options + Bestand Filter Opties + + + + Include novel files + Inclusief roman bestanden + + + + Include note files + Inclusief notitie bestanden + + + + Ignore export flag + Negeer export vlag + + + + Export Options + Export Opties + + + + Replace tabs with spaces + Vervang tabs door spaties + + + + Replace Unicode in HTML + Unicode in HTML vervangen + + + + Build Preview + Bouw voorbeeld + + + + Print + Afdrukken + + + + Print Preview + Afdrukvoorbeeld + + + + Print to PDF + Afdrukken naar PDF + + + + Save As + Opslaan als + + + + Open Document (.odt) + Open Document (.odt) + + + + Flat Open Document (.fodt) + Flat Open Document (.fodt) + + + + novelWriter HTML (.htm) + novelWriter HTML (.htm) + + + + novelWriter Markdown (.nwd) + novelWriter Markdown (.nwd) + + + + Standard Markdown (.md) + Standaard Markdown (.md) + + + + GitHub Markdown (.md) + GitHub Markdown (.md) + + + + JSON + novelWriter HTML (.json) + JSON + novelWriter HTML (.json) + + + + JSON + novelWriter Markdown (.json) + JSON + novelWriter Markdown (.json) + + + + Close + Sluiten + + + + Failed to generate preview. The result is too big. + Genereren van voorbeeld mislukt. Het resultaat is te groot. + + + + There were problems when building the project: + Er waren problemen bij het bouwen van het project: + + + + Open Document + Open Document + + + + Flat Open Document + Flat Open Document + + + + Plain HTML + Plain HTML + + + + novelWriter Markdown + novelWriter Markdown + + + + Standard Markdown + Standaard Markdown + + + + GitHub Markdown + GitHub Markdown + + + + JSON + novelWriter HTML + JSON + novelWriter HTML + + + + JSON + novelWriter Markdown + JSON + novelWriter Markdown + + + + PDF + PDF + + + + Save Document As + Document opslaan als + + + + {0} file successfully written to: + {0} bestand succesvol weggeschreven naar: + + + + Failed to write {0} file. {1} + Wegschrijven van {0} bestand mislukt. {1} + + + + GuiBuildNovelDocView + + + This area will show the content of the document to be exported or printed. Press the "Build Preview" button to generate content. + In dit gebied wordt de inhoud van het document getoond die geëxporteerd of afgedrukt moet worden. Druk op de knop "Bouw voorbeeld" om inhoud te genereren. + + + + Unknown + Onbekend + + + + Build Time: + Bouw tijd: + + + + GuiDocEditFooter + + + Status + Status + + + + Line: {0} ({1}) + Regel: {0} ({1}) + + + + Words: {0} ({1}) + Woorden: {0} ({1}) + + + + Document size is {0} bytes + Document grootte is {0} bytes + + + + Words: {0} selected + Woorden: {0} geselecteerd + + + + Character count: {0} + Aantal tekens: {0} + + + + GuiDocEditHeader + + + Edit document meta + Document meta-gegevens bewerken + + + + Search document + Doorzoek document + + + + Toggle Focus Mode + Schakel focus modus in/uit + + + + Close the document + Sluit het document + + + + GuiDocEditSearch + + + + Search + Zoek + + + + Replace + Vervang + + + + Case Sensitive + Hoofdlettergevoelig + + + + Whole Words Only + Alleen Hele Woorden + + + + RegEx Mode + RegEx Modus + + + + Loop Search + Zoekopdracht Herhalen + + + + Search Next File + Doorzoek Volgend Bestand + + + + Preserve Case + Behoud Hoofd/Kleine letters + + + + Close Search + Zoekopdracht Afsluiten + + + + Find in current document + Zoeken in huidige document + + + + Find and replace in current document + Zoek en vervang in huidig document + + + + GuiDocEditor + + + The document you are trying to open is too big. The document size is {0} MB. The maximum size allowed is {1} MB. + Het document dat u probeert te openen is te groot. De documentgrootte is {0} MB. De maximaal toegestane grootte is {1} MB. + + + + Opened Document: {0} + Geopend 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. + De tekst die u probeert toe te voegen is te groot. De tekst is {0} MB. De maximaal toegestane grootte is {1} MB. + + + + File Changed on Disk + Bestand Gewijzigd op Schijf + + + + This document has been changed outside of novelWriter while it was open. Overwrite the file on disk? + Dit document is gewijzigd buiten de openstaande novelWriter. Het bestand op de schijf overschrijven? + + + + Could not save document. + Kon document niet opslaan. + + + + Saved Document: {0} + Document Opgeslagen: {0} + + + + Spell checking requires the package PyEnchant. It does not appear to be installed. + Spellingscontrole vereist het pakket PyEnchant. Het lijkt niet geïnstalleerd te zijn. + + + + Spell check complete + Spellingscontrole compleet + + + + File Location + Bestands Locatie + + + + The currently open file is saved in: + Het momenteel geopende bestand is opgeslagen 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. + Het document is te groot geworden en u kunt er niet meer tekst aan toevoegen. De maximale grootte van een enkel novelWriter document is {0} MB. + + + + Follow Tag + Volg Label + + + + Cut + Knippen + + + + Copy + Kopiëren + + + + Paste + Plakken + + + + Select All + Selecteer Alles + + + + Select Word + Selecteer Woord + + + + Select Paragraph + Selecteer Paragraaf + + + + Spelling Suggestion(s) + Spelling Suggestie(s) + + + + No Suggestions + Geen Suggesties + + + + Add Word to Dictionary + Woord Toevoegen aan Woordenboek + + + + Please select some text before calling replace quotes. + Selecteer a.u.b. een tekst voordat u vervang aanhalingstekens aanroept. + + + + GuiDocMerge + + + Merge Documents + Documenten Samenvoegen + + + + Documents to Merge + Documenten om samen te voegen + + + + Drag and drop items to change the order. + Versleep items om de volgorde te wijzigen. + + + + No source documents found. Nothing to do. + Geen brondocumenten gevonden. Niets te doen. + + + + Failed to open document file. + Documentbestand openen mislukt. + + + + No source folder selected. Nothing to do. + Geen bronmap geselecteerd. Niets te doen. + + + + Internal error. + Interne fout. + + + + Could not save document. + Kon document niet opslaan. + + + + Element selected in the project tree must be a folder. + Element geselecteerd in de projectboom moet een map zijn. + + + + GuiDocSplit + + + + Split Document + Splits document + + + + Document Headers + Document kopteksten + + + + Select the maximum level to split into files. + Selecteer het maximale niveau om in bestanden op te splitsen. + + + + Split on Header Level 1 (Title) + Splits op koptekst niveau 1 (Titel) + + + + Split up to Header Level 2 (Chapter) + Opsplitsen tot kop niveau 2 (Hoofdstuk) + + + + Split up to Header Level 3 (Scene) + Opsplitsen tot kop niveau 3 (Scène) + + + + Split up to Header Level 4 (Section) + Opsplitsen tot kop niveau 4 (Sectie) + + + + No source document selected. Nothing to do. + Geen brondocument geselecteerd. Niets te doen. + + + + Could not parse source document. + Brondocument kan niet ontleden worden. + + + + Failed to open document file. + Kon documentbestand niet openen. + + + + No headers found. Nothing to do. + Geen koppen gevonden. Niets te doen. + + + + Cannot add new folder for the document split. Maximum folder depth has been reached. Please move the file to another level in the project tree. + Kan geen nieuwe map toevoegen voor de splitsing van documenten. Maximale diepte van de map is bereikt. Verplaats het bestand naar een ander niveau in de projectstructuur. + + + + The document will be split into {0} file(s) in a new folder. The original document will remain intact. + Het document zal worden opgesplitst in {0} bestand(en) in een nieuwe map. Het oorspronkelijke document blijft intact. + + + + Continue with the splitting process? + Doorgaan met het splitsings-proces? + + + + Could not save document. + Kon document niet opslaan. + + + + Element selected in the project tree must be a file. + Het in de projectboom geselecteerde element moet een bestand zijn. + + + + GuiDocViewFooter + + + Show/hide the references panel + Toon/verberg het referentiespaneel + + + + Activate to freeze the content of the references panel when changing document + Activeer om de inhoud van het referentiespaneel te bevriezen bij het wijzigen van document + + + + Show comments + Opmerkingen weergeven + + + + Show synopsis comments + Synopsis opmerkingen weergeven + + + + References + Referenties + + + + Sticky + Vastpinnen + + + + Comments + Opmerkingen + + + + Synopsis + Synopsis + + + + GuiDocViewHeader + + + Go backward + Ga achterwaarts + + + + Go forward + Ga voorwaarts + + + + Reload the document + Herlaad het document + + + + Close the document + Sluit het document + + + + GuiDocViewer + + + An error occurred while generating the preview. + Er is een fout opgetreden tijdens het genereren van het voorbeeld. + + + + 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}. + Kon de verwijzing voor tag '{0}' niet vinden. Hij bestaat niet of de index is verouderd. De index kan worden bijgewerkt in het Hulpmiddelenmenu, of door op {1} te drukken. + + + + Copy + Kopiëren + + + + Select All + Selecteer alles + + + + Select Word + Selecteer woord + + + + Select Paragraph + Selecteer paragraaf + + + + GuiItemDetails + + + Label + Label + + + + Status + Status + + + + Class + Klasse + + + + Usage + Gebruik + + + + Characters + Tekens + + + + Words + Woorden + + + + Paragraphs + Paragrafen + + + + GuiItemEditor + + + Item Settings + Item Instellingen + + + + Include when building project + Opnemen bij bouwen van project + + + + Label + Label + + + + Status + Status + + + + Layout + Indeling + + + + GuiMain + + + Project + Project + + + + Novel + Roman + + + + Project Details + Project details + + + + Writing Statistics + Schrijf statistieken + + + + Project Settings + Project instellingen + + + + Editor + Tekstbewerker + + + + Outline + Contour + + + + 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. + Je gebruikt een ongeteste ontwikkelingsversie van novelWriter. Wees voorzichtig bij het werken aan een live project en zorg ervoor dat je regelmatige reservekopieën maakt. + + + + novelWriter is ready ... + novelWriter is klaar ... + + + + Cannot create a new project when another project is open. + Kan geen nieuw project maken als een ander project geopend is. + + + + A project already exists in that location. Please choose another folder. + Er bestaat al een project op die locatie. Kies een andere map. + + + + New project created ... + Nieuw project aangemaakt... + + + + Close Project + Sluit project + + + + Close the current project? + Sluit het huidige project? + + + + + Changes are saved automatically. + Wijzigingen worden automatisch opgeslagen. + + + + Backup Project + Project reservekopie maken + + + + Backup the current project? + Reservekopie maken van het huidige project? + + + + The project was locked by the computer '{0}' ({1} {2}), last active on {3}. + Het project is vergrendeld door de computer '{0}' ({1} {2}), voor het laatst actief op {3}. + + + + Project Locked + Project vergrendeld + + + + The project is already open by another instance of novelWriter, and is therefore locked. Override lock and continue anyway? + Het project is al geopend door een andere instantie van novelWriter, en is daarom vergrendeld. Vergrendeling negeren en toch verder gaan? + + + + 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. + Opmerking: als het programma of de computer eerder is vastgelopen, kan de vergrendeling veilig worden genegeerd. Het wordt echter niet aanbevolen als het project open is in een andere instantie van novelWriter. Toch doen kan het project beschadigen. + + + + The project index is outdated or broken. Rebuilding index. + De projectindex is verouderd of gebroken. De index wordt herbouwd. + + + + Text files ({0}) + Tekst bestanden ({0}) + + + + Markdown files ({0}) + Markdown bestanden ({0}) + + + + novelWriter files ({0}) + novelWriter bestanden ({0}) + + + + All files ({0}) + Alle bestanden ({0}) + + + + Import File + Importeer bestand + + + + Could not read file. The file must be an existing text file. + Kon het bestand niet lezen. Het bestand moet een bestaand tekst bestand zijn. + + + + Please open a document to import the text file into. + Open a.u.b. een document om het tekst bestand in te importeren. + + + + Import Document + Importeer document + + + + Importing the file will overwrite the current content of the document. Do you want to proceed? + Het importeren van het bestand overschrijft de huidige inhoud van het document. Wilt u doorgaan? + + + + + Indexing: '{0}' + Indexeren: '{0}' + + + + Unknown item + Onbekend item + + + + Indexing completed in {0} ms + Indexeren voltooid in {0} ms + + + + The project index has been successfully rebuilt. + De projectindex is succesvol opnieuw opgebouwd. + + + + Information + Informatie + + + + Warning + Waarschuwing + + + + Error + Foutmelding + + + + This is a bug! + Dit is een bug! + + + + Internal Error + Interne Foutmelding + + + + Exit + Afsluiten + + + + Do you want to exit novelWriter? + Wil je novelWriter afsluiten? + + + + GuiMainMenu + + + &Project + &Project + + + + New Project + Nieuw project + + + + Open Project + Open project + + + + Save Project + Project opslaan + + + + Close Project + Sluit project + + + + Project Settings + Project instellingen + + + + Project Details + Project details + + + + Create Root Folder + Maak hoofdmap aan + + + + Novel Root + Roman hoofdmap + + + + Plot Root + Plot hoofdmap + + + + Character Root + Personage hoofdmap + + + + Location Root + Locatie hoofdmap + + + + Timeline Root + Tijdslijn hoofdmap + + + + Object Root + Object hoofdmap + + + + Entity Root + Entiteit hoofdmap + + + + Custom Root + Aangepaste hoofdmap + + + + Archive Root + Archief hoofdmap + + + + Create Folder + Map aanmaken + + + + Edit Item + Item bewerken + + + + Delete Item + Item verwijderen + + + + Move Item Up + Verplaats item omhoog + + + + Move Item Down + Verplaats item omlaag + + + + Undo Last Move + Ongedaan maken laatste verplaatsing + + + + Empty Trash + Leeg prullenbak + + + + Exit + Afsluiten + + + + &Document + &Document + + + + New Document + Nieuw document + + + + Open Document + Open document + + + + Save Document + Document opslaan + + + + Close Document + Sluit document + + + + View Document + Document weergeven + + + + Close Document View + Sluit document weergave + + + + Show File Details + Toon bestandsdetails + + + + Import Text from File + Tekst importeren uit bestand + + + + Merge Folder to Document + Samenvoegen van map naar document + + + + Split Document to Folder + Document naar map splitsen + + + + &Edit + &Bewerken + + + + Undo + Ongedaan maken + + + + Redo + Opnieuw uitvoeren + + + + Cut + Knippen + + + + Copy + Kopiëren + + + + Paste + Plakken + + + + Select All + Selecteer alles + + + + Select Paragraph + Selecteer paragraaf + + + + &View + &Weergave + + + + Go to Project Tree + Ga naar projectboom + + + + Go to Document Editor + Ga naar Documentbewerker + + + + Go to Document Viewer + Ga naar documentweergave + + + + Go to Outline + Ga naar omlijning + + + + Navigate Backward + Navigeer achteruit + + + + Navigate Forward + Navigeer vooruit + + + + Focus Mode + Focus modus + + + + Full Screen Mode + Volledig scherm modus + + + + &Insert + &Invoegen + + + + Dashes + Streepjes + + + + Short Dash + Korte streep + + + + Long Dash + Lange streep + + + + Horizontal Bar + Horizontale lijn + + + + Figure Dash + Figuur streep + + + + Quote Marks + Aanhalingstekens + + + + Left Single Quote + Enkel Aanhalingsteken Links + + + + Right Single Quote + Enkel Aanhalingsteken Rechts + + + + Left Double Quote + Dubbel Aanhalingsteken Links + + + + Right Double Quote + Dubbele Aanhalingstekens Rechts + + + + Alternative Apostrophe + Alternatieve Apostrof + + + + General Punctuation + Algemene Leestekens + + + + Ellipsis + Ellips + + + + Prime + Priem + + + + Double Prime + Dubbele priem + + + + White Spaces + Witruimtes + + + + Non-Breaking Space + Vaste spatie + + + + Thin Space + Dunne spatie + + + + Thin Non-Breaking Space + Dunne vaste spatie + + + + Other Symbols + Andere symbolen + + + + List Bullet + Lijst opsommingsteken + + + + Hyphen Bullet + Koppelteken opsommingsteken + + + + Flower Mark + Bloem markering + + + + Per Mille + Per mille + + + + Degree Symbol + Graden symbool + + + + Minus Sign + Minus teken + + + + Times Sign + Vermenigvuldigingsteken + + + + Division Sign + Deelteken + + + + Tags and References + Tags en Referenties + + + + Page Break and Space + Pagina-einde en Spatie + + + + Page Break + Nieuwe pagina + + + + Vertical Space (Single) + Verticale spatie (enkel) + + + + Vertical Space (Multi) + Verticale spatie (multi) + + + + &Format + Opmaak + + + + Emphasis + Nadruk + + + + Strong Emphasis + Sterke nadruk + + + + Strikethrough + Doorhalen + + + + Wrap Double Quotes + Dubbele aanhalingstekens omwikkelen + + + + Wrap Single Quotes + Enkel aanhalingsteken omwikkelen + + + + Header 1 (Partition) + Kop 1 (Partitie) + + + + Header 2 (Chapter) + Kop 2 (Hoofdstuk) + + + + Header 3 (Scene) + Kop 3 (Scène) + + + + Header 4 (Section) + Kop 4 (Sectie) + + + + Novel Title + Roman titel + + + + Unnumbered Chapter + Ongenummerd hoofdstuk + + + + Align Left + Links uitlijnen + + + + Align Centre + Centreren + + + + Align Right + Rechts uitlijnen + + + + Indent Left + Links inspringen + + + + Indent Right + Rechts inspringen + + + + Toggle Comment + Opmerking in-/uitschakelen + + + + Remove Block Format + Verwijder blokformaat + + + + Convert Single Quotes + Converteer enkele aanhalingstekens + + + + Convert Double Quotes + Converteer dubbele aanhalingstekens + + + + Remove In-Paragraph Breaks + Verwijder in-paragraaf onderbrekingen + + + + &Search + &Zoeken + + + + Find + Vinden + + + + Replace + Vervangen + + + + Find Next + Volgende zoeken + + + + Find Previous + Vorige zoeken + + + + Replace Next + Vervang volgende + + + + &Tools + &Hulpmiddelen + + + + Check Spelling + Spelling controleren + + + + Re-Run Spell Check + Spellingscontrole opnieuw uitvoeren + + + + Project Word List + Project woordenlijst + + + + Rebuild Index + Index opnieuw opbouwen + + + + Rebuild Outline + Herbouw omlijning + + + + Auto-Update Outline + Auto-update omlijning + + + + Backup Project + Project back-up maken + + + + Build Novel Project + Bouw Roman Project + + + + Writing Statistics + Schrijf Statistieken + + + + Preferences + Voorkeuren + + + + &Help + &Help + + + + About novelWriter + Over novelWriter + + + + About Qt5 + Over Qt5 + + + + User Manual (Online) + Gebruikershandleiding (Online) + + + + User Manual (PDF) + Gebruikershandleiding (PDF) + + + + Report an Issue (GitHub) + Meld een probleem (GitHub) + + + + Ask a Question (GitHub) + Stel een vraag (GitHub) + + + + The novelWriter Website + De novelWriter website + + + + Check for New Release + Controleer op nieuwe release + + + + GuiMainStatus + + + + None + Geen + + + + Editor + Tekstverwerker + + + + Project + Project + + + + Session Time + Sessieduur + + + + Words: {0} ({1}) + Woorden: {0} ({1}) + + + + Project word count (session change) + Aantal projectwoorden (verandering sessie) + + + + Novel word count (session change) + Roman woordtelling (sessie verandering) + + + + GuiNovelTree + + + Novel Outline + Roman omlijning + + + + Words + Woorden + + + + POV + Perspectief + + + + Section title + Sectietitel + + + + Word count + Aantal woorden + + + + Point-of-view character + Point-of-view karakter + + + + GuiOutlineDetails + + + + + + Title + Titel + + + + Chapter + Hoofdstuk + + + + Scene + Scène + + + + Section + Sectie + + + + Document + Document + + + + Status + Status + + + + Characters + Tekens + + + + Words + Woorden + + + + Paragraphs + Paragrafen + + + + Synopsis + Synopsis + + + + Title Details + Titel details + + + + Reference Tags + Referentie tags + + + + GuiOutlineHeaderMenu + + + Select Columns + Selecteer kolommen + + + + GuiPreferences + + + Preferences + Voorkeuren + + + + General + Algemeen + + + + Projects + Projecten + + + + Documents + Documenten + + + + Editor + Tekstverwerker + + + + Highlighting + Markeren + + + + Automation + Automatisering + + + + Quotes + Aanhalingstekens + + + + Some changes will not be applied until novelWriter has been restarted. + Sommige wijzigingen zullen niet worden toegepast totdat novelWriter opnieuw is gestart. + + + + GuiPreferencesAutomation + + + Automatic Features + Automatische Functies + + + + Auto-select word under cursor + Automatisch woord onder cursor selecteren + + + + Apply formatting to word under cursor if no selection is made. + Opmaak toepassen op woord onder de cursor als er geen selectie is gemaakt. + + + + Auto-replace text as you type + Automatisch tekst vervangen terwijl u typt + + + + Allow the editor to replace symbols as you type. + Sta de editor toe om symbolen te vervangen terwijl u typt. + + + + Replace as You Type + Vervang Terwijl U Typt + + + + Auto-replace single quotes + Automatisch enkele aanhalingstekens vervangen + + + + + Try to guess which is an opening or a closing quote. + Probeer te raden wat een openend of afsluitend aanhalingsteken is. + + + + Auto-replace double quotes + Automatisch dubbele aanhalingstekens vervangen + + + + Auto-replace dashes + Automatisch streepjes vervangen + + + + Double and triple hyphens become short and long dashes. + Dubbele en drievoudige koppeltekens worden korte en lange streepjes. + + + + Auto-replace dots + Automatisch stippen vervangen + + + + Three consecutive dots become ellipsis. + Drie opeenvolgende stippen worden ellips. + + + + Automatic Padding + Automatische Opvulling + + + + Insert non-breaking space before + Vaste spatie invoegen voor + + + + Automatically add space before any of these symbols. + Voeg automatisch een spatie toe voor één van deze symbolen. + + + + Insert non-breaking space after + Vaste spatie invoegen na + + + + Automatically add space after any of these symbols. + Voeg automatisch een spatie toe na één van deze symbolen. + + + + Use thin space instead + Gebruik dunne spatie in plaats van + + + + Inserts a thin space instead of a regular space. + Voegt een dunne spatie toe in plaats van een normale spatie. + + + + GuiPreferencesDocuments + + + Text Style + Tekst Stijl + + + + Font family + Lettertype familie + + + + + + + Applies to both document editor and viewer. + Van toepassing op zowel de documentbewerker als de kijker. + + + + Font size + Lettertypegrootte + + + + pt + pt + + + + Text Flow + Tekst Flow + + + + Maximum text width in "Normal Mode" + Maximale tekstbreedte in "Normale Modus" + + + + Set to 0 to disable this feature. + Stel in op 0 om deze functie uit te schakelen. + + + + + + + px + px + + + + Maximum text width in "Focus Mode" + Maximale tekstbreedte in "Focus Modus" + + + + The maximum width cannot be disabled. + De maximale breedte kan niet worden uitgeschakeld. + + + + Hide document footer in "Focus Mode" + Verberg document voettekst in "Focus Modus" + + + + Hide the information bar in the document editor. + Verberg de informatiebalk in de documentbewerker. + + + + Justify the text margins + De tekstmarges uitvullen + + + + Minimum text margin + Minimale tekstmarge + + + + Tab width + Tab breedte + + + + The width of a tab key press in the editor and viewer. + De breedte van een tab teken in de tekstbewerker en kijker. + + + + GuiPreferencesEditor + + + Spell Checking + Spellingscontrole + + + + None + Geen + + + + Not installed + Niet geïnstalleerd + + + + Spell check language + Taal voor spellingscontrole + + + + Available languages are determined by your system. + Beschikbare talen worden bepaald door uw systeem. + + + + Big document limit + Groot document limiet + + + + Full spell checking is disabled above this limit. + Volledige spellingcontrole is uitgeschakeld boven dit limiet. + + + + kB + kB + + + + Word Count + Woord Telling + + + + Word count interval + Woord tellings interval + + + + seconds + seconden + + + + Include project notes in status bar word count + Project notities opnemen in de statusbalk woord telling + + + + Writing Guides + Schrijf Hulpjes + + + + Show tabs and spaces + Tabs en spaties weergeven + + + + Show line endings + Regeleindes weergeven + + + + Scroll Behaviour + Scroll Gedrag + + + + Scroll past end of the document + Scroll voorbij het einde van het document + + + + Set to 0 to disable this feature. + Stel in op 0 om deze functie uit te schakelen. + + + + lines + regels + + + + Typewriter style scrolling when you type + Schrijfmachine stijl scrollen bij het typen + + + + Keeps the cursor at a fixed vertical position. + Houd de cursor op een vaste verticale positie. + + + + Minimum position for Typewriter scrolling + Minimumpositie voor Schrijfmachine scrollen + + + + Percentage of the editor height from the top. + Percentage van de tekstverwerker hoogte vanaf de bovenkant. + + + + GuiPreferencesGeneral + + + Look and Feel + Look and Feel + + + + Main GUI language + Hoofdtaal van GUI + + + + + + + + Requires restart. + Vereist herstart. + + + + Main GUI theme + Hoofd GUI thema + + + + Main icon theme + Hoofd pictogrammen thema + + + + Font family + Lettertype familie + + + + Font size + Lettertypegrootte + + + + pt + pt + + + + GUI Settings + GUI Instellingen + + + + Emphasise partition and chapter labels + Partitie en hoofdstuk labels benadrukken + + + + Makes them stand out in the project tree. + Laat ze opvallen in de projectboom. + + + + Show full path in document header + Volledig pad in document kop weergeven + + + + Add the parent folder names to the header. + Voeg de bovenliggende mapnamen toe aan de kop. + + + + Hide vertical scroll bars in main windows + Verticale schuifbalken in hoofdvensters verbergen + + + + + Scrolling available with mouse wheel and keys only. + Scrollen alleen beschikbaar met muiswiel en toetsen. + + + + Hide horizontal scroll bars in main windows + Verberg horizontale schuifbalken in hoofdvensters + + + + GuiPreferencesProjects + + + Automatic Save + Automatisch Opslaan + + + + Save document interval + Document opslag interval + + + + How often the document is automatically saved. + Hoe vaak het document automatisch wordt opgeslagen. + + + + + seconds + seconden + + + + Save project interval + Project opslag interval + + + + How often the project is automatically saved. + Hoe vaak het project automatisch wordt opgeslagen. + + + + Project Backup + Project Reservekopie + + + + Browse + Blader + + + + Backup storage location + Opslaglocatie voor reservekopie + + + + + Path: {0} + Pad: {0} + + + + Run backup when the project is closed + Reservekopie maken wanneer het project wordt gesloten + + + + Can be overridden for individual projects in Project Settings. + Kan voor individuele projecten overschreven worden in Projectinstellingen. + + + + Ask before running backup + Vraag voor het maken van een reservekopie + + + + If off, backups will run in the background. + Indien uit, worden reservekopieën op de achtergrond gemaakt. + + + + Session Timer + Sessie Timer + + + + Pause the session timer when not writing + De sessie timer pauzeren wanneer niet geschreven wordt + + + + Also pauses when the application window does not have focus. + Pauzeert ook wanneer het toepassingsvenster geen focus heeft. + + + + Editor inactive time before pausing timer + Inactieve tekstbewerker duur voordat timer wordt gepauzeerd + + + + User activity includes typing and changing the content. + Gebruikersactiviteit omvat typen en het wijzigen van de inhoud. + + + + minutes + minuten + + + + Backup Directory + Reservekopie map + + + + GuiPreferencesQuotes + + + Quotation Style + Citeer Stijl + + + + Single quote open style + Enkel aanhalingsteken open stijl + + + + The symbol to use for a leading single quote. + Het symbool om te gebruiken voor een leidend enkel aanhalingsteken. + + + + Single quote close style + Enkel aanhalingsteken sluit stijl + + + + The symbol to use for a trailing single quote. + Het symbool om te gebruiken voor een afsluitend enkel aanhalingsteken. + + + + Double quote open style + Dubbele aanhalingsteken open stijl + + + + The symbol to use for a leading double quote. + Het symbool om te gebruiken voor een leidend dubbel aanhalingsteken. + + + + Double quote close style + Dubbel aanhalingsteken sluit stijl + + + + The symbol to use for a trailing double quote. + Het symbool om te gebruiken voor een afsluitend dubbel aanhalingsteken. + + + + GuiPreferencesSyntax + + + Highlighting Theme + Markeer thema + + + + Highlighting theme + Markeer thema + + + + Colour theme for the editor and viewer. + Kleur thema voor de bewerker en kijker. + + + + Quotes & Dialogue + Aanhalingstekens & Dialoog + + + + Highlight text wrapped in quotes + Markeer tekst verpakt in aanhalingstekens + + + + + + Applies to the document editor only. + Alleen van toepassing op de documentbewerker. + + + + Allow open-ended single quotes + Toestaan van open einde enkele aanhalingstekens + + + + Highlight single-quoted line with no closing quote. + Markeer regel zonder afsluitend enkel aanhalingsteken. + + + + Allow open-ended double quotes + Toestaan van open einde dubbele aanhalingstekens + + + + Highlight double-quoted line with no closing quote. + Markeer regel zonder afsluitend dubbel aanhalingsteken. + + + + Text Emphasis + Tekst nadruk + + + + Add highlight colour to emphasised text + Voeg markeerkleur toe aan geaccentueerde tekst + + + + Text Errors + Tekst Foutmeldingen + + + + Highlight multiple spaces + Meerdere spaties markeren + + + + GuiProjectDetails + + + Project Details + Project Details + + + + Overview + Overzicht + + + + Contents + Inhoud + + + + GuiProjectDetailsContents + + + Title + Titel + + + + Words + Woorden + + + + Pages + Pagina's + + + + Page + Pagina + + + + Progress + Voortgang + + + + Typical word count for a 5 by 8 inch book page with 11 pt font is 350. + Typische woordtelling voor een 5 bij 8 inch boek pagina met 11 pt lettertype is 350. + + + + Start counting page numbers from this page. + Begin met het tellen van paginanummers vanaf deze pagina. + + + + Assume a new chapter or partition always start on an odd numbered page. + Neem aan dat een nieuw hoofdstuk of partitie altijd op een oneven genummerde pagina begint. + + + + Words per page + Woorden per pagina + + + + Count pages from + Pagina's tellen vanaf + + + + Clear double pages + Dubbele pagina's wissen + + + + Table of Contents + Inhoudsopgave + + + + END + EINDE + + + + Untitled + Naamloos + + + + GuiProjectDetailsMain + + + Working Title: {0} + Werktitel: {0} + + + + By {0} + Door {0} + + + + Words + Woorden + + + + Chapters + Hoofdstukken + + + + Scenes + Scènes + + + + Revisions + Revisies + + + + Editing Time + Bewerk tijd + + + + Path + Pad + + + + GuiProjectEditMain + + + Project Settings + Project Instellingen + + + + Working title + Werk titel + + + + Should be set only once. + Mag slechts één keer worden ingesteld. + + + + Novel title + Roman titel + + + + Change whenever you want! + Verander wanneer je maar wilt! + + + + Author(s) + Auteur(s) + + + + One name per line. + Eén naam per regel. + + + + Default + Standaard + + + + Spell check language + Taal voor spellingscontrole + + + + + Overrides main preferences. + Overschrijft de hoofd voorkeuren. + + + + No backup on close + Geen back-up bij sluiten + + + + GuiProjectEditReplace + + + Text Replace List for Preview and Export + Tekst Vervang Lijst voor Voorbeeld en Export + + + + Keyword + Sleutelwoord + + + + Replace With + Vervang door + + + + Select item to edit + Selecteer te bewerken item + + + + Save + Opslaan + + + + GuiProjectEditStatus + + + Novel File Status Levels + Roman Bestand Status Niveaus + + + + Note File Importance Levels + Notitie Bestand Import Niveaus + + + + Label + Label + + + + Usage + Gebruik + + + + Select item to edit + Selecteer te bewerken item + + + + Colour + Kleur + + + + Save + Opslaan + + + + Select Colour + Selecteer kleur + + + + New Item + Nieuw item + + + + Cannot delete a status item that is in use. + Kan status item dat in gebruik is niet verwijderen. + + + + Not in use + Niet in gebruik + + + + Used once + Eenmalig gebruikt + + + + Used by {0} items + Gebruikt door {0} items + + + + GuiProjectLoad + + + + Open Project + Open Project + + + + Working Title + Werk titel + + + + Words + Woorden + + + + Last Opened + Laatst geopend + + + + Recently Opened Projects + Recent Geopende Projecten + + + + Path + Pad + + + + New + Nieuw + + + + Remove + Verwijder + + + + novelWriter Project File ({0}) + novelWriter Projectbestand ({0}) + + + + All files ({0}) + Alle bestanden ({0}) + + + + Remove Entry + Vermelding verwijderen + + + + Remove '{0}' from the recent projects list? The project files will not be deleted. + '{0}' uit de lijst met recente projecten verwijderen? De project bestanden zullen niet worden verwijderd. + + + + GuiProjectSettings + + + Project Settings + Project Instellingen + + + + Settings + Instellingen + + + + Status + Status + + + + Importance + Belangrijkheid + + + + Auto-Replace + Auto-Vervang + + + + GuiProjectTree + + + Project Tree + Project Boom + + + + Words + Woorden + + + + Item label + Item label + + + + Word count + Aantal woorden + + + + Include in build + Opnemen in bouw + + + + Item status + Item status + + + + Please select a valid location in the tree to add the document. + Selecteer een geldige locatie in de boomstructuur om het document aan toe te voegen. + + + + Please select a valid location in the tree to add the folder. + Selecteer een geldige locatie in de boomstructuur om de map aan toe te voegen. + + + + + Did not find anywhere to add the file or folder! + Kon geen plek vinden om het bestand of de map aan toe te voegen! + + + + Cannot add new files or folders to the Trash folder. + Kan geen nieuwe bestanden of mappen toevoegen aan de Prullenbak map. + + + + New File + Nieuw bestand + + + + Cannot add new folder to this item. Maximum folder depth has been reached. + Kan geen nieuwe map toevoegen aan dit item. Maximum map diepte is bereikt. + + + + New Folder + Nieuwe map + + + + There is currently no Trash folder in this project. + Er is momenteel geen Prullenbak map in dit project. + + + + The Trash folder is already empty. + De Prullenbak is al leeg. + + + + Empty Trash + Prullenbak legen + + + + Permanently delete {0} file(s) from Trash? + {0} bestand(en) permanent verwijderen uit de prullenbak? + + + + + Delete File + Verwijder bestand + + + + Permanently delete file '{0}'? + Bestand '{0}' permanent verwijderen ? + + + + Could not delete document file. + Kon documentbestand niet verwijderen. + + + + Move file '{0}' to Trash? + Verplaats bestand '{0}' naar prullenbak? + + + + Cannot delete folder. It is not empty. Recursive deletion is not supported. Please delete the content first. + Kan de map niet verwijderen. Het is niet leeg. Recursief verwijderen wordt niet ondersteund. Verwijder eerst de inhoud. + + + + Cannot delete root folder. It is not empty. Recursive deletion is not supported. Please delete the content first. + Kan de hoofdmap niet verwijderen. Het is niet leeg. Recursieve verwijdering wordt niet ondersteund. Verwijder eerst de inhoud. + + + + + The item cannot be moved to that location. + Het item kan niet worden verplaatst naar die locatie. + + + + There is nowhere to add item with name '{0}'. + Er is geen plek om item toe te voegen met de naam '{0}'. + + + + GuiProjectTreeMenu + + + Edit Project Item + Bewerk projectitem + + + + Open Document + Open document + + + + View Document + Document weergeven + + + + Toggle Included Flag + Toggle inbegrepen vlag + + + + New File + Nieuw bestand + + + + New Folder + Nieuwe map + + + + Delete Item + Item verwijderen + + + + Empty Trash + Leeg prullenbak + + + + Move Item Up + Verplaats item omhoog + + + + Move Item Down + Verplaats item omlaag + + + + GuiUpdates + + + Check for Updates + Controleren op updates + + + + Current Release + Huidige versie + + + + + novelWriter {0} released on {1} + novelWriter {0} uitgebracht op {1} + + + + Latest Release + Nieuwste versie + + + + Checking ... + Wordt gecontroleerd... + + + + Download: {0} + Download: {0} + + + + GuiWordList + + + + Project Word List + Project woordenlijst + + + + Cannot add a blank word. + Kan geen blanco woord toevoegen. + + + + The word '{0}' is already in the word list. + Het woord '{0}' staat al op de woordenlijst. + + + + GuiWritingStats + + + Writing Statistics + Schrijf Statistieken + + + + Session Start + Sessie start + + + + Length + Lengte + + + + Idle + Inactief + + + + Words + Woorden + + + + Histogram + Histogram + + + + Sum Totals + Som totalen + + + + Total Time: + Totale tijd: + + + + Idle Time: + Inactief tijd: + + + + Filtered Time: + Gefilterde tijd: + + + + Novel Word Count: + Roman woord telling: + + + + Notes Word Count: + Notities woord telling: + + + + Total Word Count: + Totaal woord telling: + + + + Filters + Filters + + + + Count novel files + Roman bestanden meetellen + + + + Count note files + Notitiebestanden tellen + + + + Hide zero word count + Verberg nul woorden aantal + + + + Hide negative word count + Negatieve woordtelling verbergen + + + + Group entries by day + Vermeldingen groeperen per dag + + + + Show idle time + Inactieve tijd weergeven + + + + Word count cap for the histogram + Woorden tellingslimiet voor het histogram + + + + Save As + Opslaan als + + + + JSON Data File (.json) + JSON gegevensbestand (.json) + + + + CSV Data File (.csv) + CSV-gegevensbestand (.csv) + + + + JSON Data File + JSON gegevensbestand + + + + CSV Data File + CSV-gegevensbestand + + + + Save Data As + Gegevens opslaan als + + + + {0} file successfully written to: + {0} bestand succesvol geschreven naar: + + + + Failed to write {0} file. + Schrijven van {0} bestand mislukt. + + + + Failed to read session log file. + Kon sessie log bestand niet lezen. + + + + NWProject + + + Duplicate root item detected. + Duplicaat root item gedetecteerd. + + + + + New + Nieuw + + + + Note + Notitie + + + + Draft + Concept + + + + Finished + Voltooid + + + + Minor + Klein + + + + Major + Groot + + + + Main + Hoofd + + + + New Project + Nieuw Project + + + + By + Door + + + + + Novel + Roman + + + + Plot + Plot + + + + Characters + Personages + + + + World + Wereld + + + + + Title Page + Titel pagina + + + + + + New Chapter + Nieuw hoofdstuk + + + + + New Scene + Nieuwe scène + + + + Chapter {0} + Hoofdstuk {0} + + + + + Scene {0} + Scène {0} + + + + File not found: {0} + Bestand niet gevonden: {0} + + + + + Failed to parse project xml. + Parsen van project xml mislukt. + + + + Attempting to open backup project file instead. + Poging om in plaats daarvan het reservekopiebestand van het project te openen. + + + + + Unknown + Onbekend + + + + Project file does not appear to be a novelWriterXML file. + Projectbestand lijkt geen novelWriter XML-bestand te zijn. + + + + Unknown or unsupported novelWriter project file format. The project cannot be opened by this version of novelWriter. The file was saved with novelWriter version {0}. + Onbekend of niet ondersteund bestandsformaat van novelWriter. Het project kan niet worden geopend door deze versie van novelWriter. Het bestand was opgeslagen met versie {0} van novelWriter. + + + + File Version + Bestands versie + + + + The file format of your project is about to be updated. If you proceed, older versions of novelWriter will no longer be able to open this project. Continue? + De bestandsindeling van uw project zal worden bijgewerkt. Als u doorgaat, kunnen oudere versies van novelWriter dit project niet meer openen. Doorgaan? + + + + Version Conflict + Versie conflict + + + + This project was saved by a newer version of novelWriter, version {0}. This is version {1}. If you continue to open the project, some attributes and settings may not be preserved, but the overall project should be fine. Continue opening the project? + Dit project was aangemaakt door een nieuwere versie van novelWriter, versie {0}. Dit is versie {1}. Als je het project blijft openen, kunnen sommige kenmerken en instellingen niet worden behouden, maar over het algemeen moet het project goed zijn. Doorgaan met het openen van het project? + + + + Opened Project: {0} + Geopend project: {0} + + + + Project path not set, cannot save project. + Projectpad niet ingesteld, project kan niet worden opgeslagen. + + + + + Failed to save project. + Opslaan project mislukt. + + + + Saved Project: {0} + Project opgeslagen: {0} + + + + Backing up project ... + Project back-uppen... + + + + Cannot backup project because no valid backup path is set. Please set a valid backup location in Preferences. + Kan geen back-up maken van project omdat er geen geldig backup pad is ingesteld. Stel een geldige back-up locatie in in Voorkeuren. + + + + Cannot backup project because no project name is set. Please set a Working Title in Project Settings. + Kan geen back-up maken van een project omdat er geen projectnaam is ingesteld. Stel een werktitel in bij Projectinstellingen. + + + + Could not create backup folder. + Kan de back-up map niet maken. + + + + Cannot backup project because the backup path is within the project folder to be backed up. Please choose a different backup path in Preferences. + Kan geen back-up maken van het project omdat het back-up pad zich in de projectmap bevindt. Kies een ander backup pad in Voorkeuren. + + + + Backup from {0} + Reservekopie van {0} + + + + Backup archive file written to: {0} + Reservekopie archief bestand weggeschreven naar: {0} + + + + Could not write backup archive. + Kon reservekopie archief niet wegschrijven. + + + + Project backed up to '{0}' + Project reservekopie gemaakt naar '{0}' + + + + + Failed to create a new example project. + Aanmaken van een nieuw voorbeeldproject is mislukt. + + + + Failed to create a new example project. Could not find the necessary files. They seem to be missing from this installation. + Aanmaken van een nieuw voorbeeldproject is mislukt. Kon de benodigde bestanden niet vinden. Ze lijken te ontbreken in deze installatie. + + + + Could not create new project folder. + Kon geen nieuwe projectmap aanmaken. + + + + New project folder is not empty. Each project requires a dedicated project folder. + Nieuwe projectmap is niet leeg. Elk project vereist een eigen projectmap. + + + + You must set a valid backup path in Preferences to use the automatic project backup feature. + U moet een geldig reservekopie pad instellen in de Voorkeuren om de automatische project reservekopie functie te kunnen gebruiken. + + + + You must set a valid project name in Project Settings to use the automatic project backup feature. + U moet een geldige projectnaam instellen in Projectinstellingen om de automatische project reservekopie functie te kunnen gebruiken. + + + + and + en + + + + Could not create folder. + Kon de map niet aanmaken. + + + + Found {0} orphaned file(s) in project folder. + {0} weesbestand(en) gevonden in de projectmap. + + + + Recovered + Hersteld + + + + [{0}] {1} + [{0}] {1} + + + + Recovered File {0} + Hersteld bestand {0} + + + + One or more orphaned files could not be added back into the project. Make sure at least a Novel root folder exists. + Een of meer verweesde bestanden konden niet aan het project worden terug gevoegd. Zorg ervoor dat er tenminste een Roman hoofdmap bestaat. + + + + Not a folder: {0} + Is geen map: {0} + + + + Could not move: {0} + Kon niet verplaatsen: {0} + + + + + Could not delete: {0} + Kon niet verwijderen: {0} + + + + Could not make folder: {0} + Kon map niet maken: {0} + + + + Could not move item {0} to {1}. + Kon item {0} niet verplaatsen naar {1}. + + + + ProjWizardCustomPage + + + Custom Project Options + Aangepaste projectopties + + + + Select which additional root folders to make, and how to populate the Novel folder. If you don't want to add chapters or scenes, set the values to 0. You can add scenes without chapters. + Selecteer welke extra hoofdmappen aan te maken en hoe de Roman map gevuld moet worden. Als je geen hoofdstukken of scènes wilt toevoegen, stel de waarden in op 0. Je kunt scènes toevoegen zonder hoofdstukken. + + + + Additional Root Folders + Aanvullende hoofdmappen + + + + + + + + + {0} folder + {0} map + + + + Populate Novel Folder + Roman map vullen + + + + Add chapters + Hoofdstukken toevoegen + + + + Scenes (per chapter) + Scènes (per hoofdstuk) + + + + Add chapter folders + Hoofdstukmappen toevoegen + + + + ProjWizardFinalPage + + + Finished + Voltooid + + + + All done. + Alles is klaar. + + + + Press '{0}' to create the new project. + Druk op '{0}' om het nieuwe project aan te maken. + + + + Done + Voltooid + + + + Finish + Voltooien + + + + ProjWizardFolderPage + + + + Select Project Folder + Selecteer projectmap + + + + Select a location to store the project. A new project folder will be created in the selected location. + Selecteer een locatie om het project op te slaan. Een nieuwe projectmap zal worden gemaakt op de geselecteerde locatie. + + + + Required + Vereist + + + + Project Path + Project pad + + + + ProjWizardIntroPage + + + Create New Project + Nieuw project maken + + + + Provide at least a working title. The working title should not be change beyond this point as it is used by the application for generating file names for for instance backups. The other fields are optional and can be changed at any time in Project Settings. + Geef ten minste een werk titel op. De werktitel mag niet worden gewijzigd na dit punt, omdat het wordt gebruikt door de applicatie voor het genereren van bestandsnamen voor, bijvoorbeeld, reservekopieën. De andere velden zijn optioneel en kunnen op elk gewenst moment worden gewijzigd in Projectinstellingen. + + + + Side image by {0}, {1} + Zijbeeld door {0}, {1} + + + + Required + Vereist + + + + Optional + Optioneel + + + + Optional. One name per line. + Optioneel. Eén naam per regel. + + + + Working Title + Werk titel + + + + Novel Title + Roman titel + + + + Author(s) + Auteur(s) + + + + ProjWizardPopulatePage + + + Populate Project + Project bevolken + + + + Choose how to pre-fill the project. Either with a minimal set of starter items, an example project explaining and showing many of the features, or show further custom options on the next page. + Kies hoe het project vooraf moet worden ingevuld. Ofwel met een minimale set van starter items, een voorbeeldproject dat veel van de functies uitlegt en laat zien, of toon verdere aanpasbare opties op de volgende pagina. + + + + Fill the project with a minimal set of items + Vul het project met een minimale set items + + + + Fill the project with example files + Vul het project met voorbeeldbestanden + + + + Show detailed options for filling the project + Toon gedetailleerde opties voor het vullen van het project + + + + QDialogButtonBox + + + OK + OK + + + + QGnomeTheme + + + &OK + &OK + + + + &Save + &Opslaan + + + + &Cancel + &Annuleren + + + + &Close + &Sluiten + + + + Close without Saving + Sluiten zonder opslaan + + + + QPlatformTheme + + + OK + OK + + + + Save + Opslaan + + + + Save All + Alles opslaan + + + + Open + Openen + + + + &Yes + &Ja + + + + Yes to &All + Ja voor &alles + + + + &No + &Nee + + + + N&o to All + N&ee op alles + + + + Abort + Afbreken + + + + Retry + Opnieuw proberen + + + + Ignore + Negeren + + + + Close + Sluiten + + + + Cancel + Annuleren + + + + Discard + Weggooien + + + + Help + Help + + + + Apply + Toepassen + + + + Reset + Beginwaarden + + + + Restore Defaults + Standaardwaarden herstellen + + + + QWizard + + + Go Back + Ga terug + + + + < &Back + < &Terug + + + + Continue + Doorgaan + + + + &Next + &Volgende + + + + &Next > + &Volgende > + + + + Commit + Vastleggen + + + + Done + Gereed + + + + &Finish + Vol&tooien + + + + + Cancel + Annuleren + + + + Help + Help + + + + &Help + &Help + + + + Tokenizer + + + Synopsis + Synopsis + + + + Document '{0}' is too big ({1} MB). Skipping. + Document '{0}' is te groot ({1} MB). Overgeslagen. + + + + ERROR + FOUT + + + diff --git a/novelwriter/dialogs/about.py b/novelwriter/dialogs/about.py index c8b9c898..574fba34 100644 --- a/novelwriter/dialogs/about.py +++ b/novelwriter/dialogs/about.py @@ -187,6 +187,7 @@ class GuiAbout(QDialog): ("Português", "Bruno Meneguello"), ("简体中文", "Qianzhi Long"), ("Español Latinoamericano", "Tommy Marplatt"), + ("Nederlands", "Martijn van der Kleijn"), ]) )