diff --git a/manuskript/converters/pandocConverter.py b/manuskript/converters/pandocConverter.py index 566c580..1a49aef 100644 --- a/manuskript/converters/pandocConverter.py +++ b/manuskript/converters/pandocConverter.py @@ -9,7 +9,7 @@ from PyQt5.QtWidgets import qApp, QMessageBox from PyQt5.QtGui import QCursor from manuskript.converters import abstractConverter -from manuskript.functions import mainWindow +from manuskript.functions import mainWindow, safeTranslate import logging LOGGER = logging.getLogger(__name__) @@ -74,7 +74,7 @@ class pandocConverter(abstractConverter): err = stderr.decode("utf-8") LOGGER.error(err) QMessageBox.critical(mainWindow().dialog, - qApp.translate("Export", "Error"), err) + safeTranslate(qApp, "Export", "Error"), err) return None return stdout.decode("utf-8") diff --git a/manuskript/exporter/manuskript/HTML.py b/manuskript/exporter/manuskript/HTML.py index 89c0dcf..ab18747 100644 --- a/manuskript/exporter/manuskript/HTML.py +++ b/manuskript/exporter/manuskript/HTML.py @@ -6,6 +6,8 @@ from PyQt5.QtWidgets import QPlainTextEdit, qApp, QTabWidget, QFrame, QTextEdit from manuskript.exporter.manuskript.markdown import markdown, markdownSettings from manuskript.ui.views.webView import webView from manuskript.ui.exporters.manuskript.plainTextSettings import exporterSettings +from manuskript.functions import safeTranslate + import os try: @@ -15,8 +17,8 @@ except ImportError: class HTML(markdown): name = "HTML" - description = qApp.translate("Export", "Basic HTML output using the Python module 'markdown'.") - InvalidBecause = qApp.translate("Export", "Python module 'markdown'.") + description = safeTranslate(qApp, "Export", "Basic HTML output using the Python module 'markdown'.") + InvalidBecause = safeTranslate(qApp, "Export", "Python module 'markdown'.") icon = "text-html" exportVarName = "lastManuskriptHTML" @@ -51,12 +53,12 @@ class HTML(markdown): w1 = QPlainTextEdit() w1.setFrameShape(QFrame.NoFrame) w1.setReadOnly(True) - t.addTab(w0, qApp.translate("Export", "Markdown source")) - t.addTab(w1, qApp.translate("Export", "HTML Source")) + t.addTab(w0, safeTranslate(qApp, "Export", "Markdown source")) + t.addTab(w1, safeTranslate(qApp, "Export", "HTML Source")) if webView: w2 = webView() - t.addTab(w2, qApp.translate("Export", "HTML Output")) + t.addTab(w2, safeTranslate(qApp, "Export", "HTML Output")) t.setCurrentIndex(2) return t diff --git a/manuskript/exporter/manuskript/__init__.py b/manuskript/exporter/manuskript/__init__.py index f6337c6..7fa799b 100644 --- a/manuskript/exporter/manuskript/__init__.py +++ b/manuskript/exporter/manuskript/__init__.py @@ -6,13 +6,13 @@ from manuskript.exporter.basic import basicExporter, basicFormat from manuskript.exporter.manuskript.HTML import HTML from manuskript.exporter.manuskript.markdown import markdown from manuskript.exporter.manuskript.plainText import plainText -from manuskript.functions import appPath +from manuskript.functions import appPath, safeTranslate class manuskriptExporter(basicExporter): name = "Manuskript" - description = qApp.translate("Export", "Default exporter, provides basic formats used by other exporters.") + description = safeTranslate(qApp, "Export", "Default exporter, provides basic formats used by other exporters.") exportTo = [ plainText(), markdown(), diff --git a/manuskript/exporter/manuskript/markdown.py b/manuskript/exporter/manuskript/markdown.py index 7bcae10..fb24e77 100644 --- a/manuskript/exporter/manuskript/markdown.py +++ b/manuskript/exporter/manuskript/markdown.py @@ -4,14 +4,14 @@ from PyQt5.QtGui import QTextCharFormat, QFont from PyQt5.QtWidgets import QPlainTextEdit, QGroupBox, qApp, QVBoxLayout, QCheckBox from manuskript.exporter.manuskript.plainText import plainText -from manuskript.functions import mainWindow +from manuskript.functions import mainWindow, safeTranslate from manuskript.ui.highlighters import MMDHighlighter from manuskript.ui.exporters.manuskript.plainTextSettings import exporterSettings class markdown(plainText): name = "Markdown" - description = qApp.translate("Export", """Just like plain text, excepts adds markdown titles. + description = safeTranslate(qApp, "Export", """Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown.""") exportVarName = "lastManuskriptMarkdown" @@ -57,7 +57,7 @@ class markdownSettings(exporterSettings): w = self.toolBox.widget(self.toolBox.count() - 1) self.grpMarkdown = QGroupBox(self.tr("Markdown")) self.grpMarkdown.setLayout(QVBoxLayout()) - self.chkMarkdownHighlighter = QCheckBox(qApp.translate("Export", "Preview with highlighter.")) + self.chkMarkdownHighlighter = QCheckBox(safeTranslate(qApp, "Export", "Preview with highlighter.")) self.grpMarkdown.layout().addWidget(self.chkMarkdownHighlighter) w.layout().insertWidget(w.layout().count() - 1, self.grpMarkdown) diff --git a/manuskript/exporter/manuskript/plainText.py b/manuskript/exporter/manuskript/plainText.py index 187e863..c809a85 100644 --- a/manuskript/exporter/manuskript/plainText.py +++ b/manuskript/exporter/manuskript/plainText.py @@ -5,7 +5,7 @@ from PyQt5.QtGui import QFont, QTextCharFormat from PyQt5.QtWidgets import QPlainTextEdit, qApp, QFrame, QFileDialog, QMessageBox from manuskript.exporter.basic import basicFormat -from manuskript.functions import mainWindow, getSaveFileNameWithSuffix +from manuskript.functions import mainWindow, getSaveFileNameWithSuffix, safeTranslate from manuskript.models import outlineItem from manuskript.ui.exporters.manuskript.plainTextSettings import exporterSettings import codecs @@ -14,8 +14,8 @@ import logging LOGGER = logging.getLogger(__name__) class plainText(basicFormat): - name = qApp.translate("Export", "Plain text") - description = qApp.translate("Export", """Simplest export to plain text. Allows you to use your own markup not understood + name = safeTranslate(qApp, "Export", "Plain text") + description = safeTranslate(qApp, "Export", """Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example Fountain.""") implemented = True requires = { @@ -48,8 +48,8 @@ class plainText(basicFormat): try: return self.concatenate(mainWindow().mdlOutline.rootItem, settings) except re.error as e: - QMessageBox.warning(mainWindow().dialog, qApp.translate("Export", "Error"), - qApp.translate("Export", "Could not process regular expression: \n{}").format(str(e))) + QMessageBox.warning(mainWindow().dialog, safeTranslate(qApp, "Export", "Error"), + safeTranslate(qApp, "Export", "Could not process regular expression: \n{}").format(str(e))) return "" def getExportFilename(self, settingsWidget, varName=None, filter=None): @@ -69,7 +69,7 @@ class plainText(basicFormat): filename = "" filename, filter = getSaveFileNameWithSuffix(settingsWidget.parent(), - caption=qApp.translate("Export", "Choose output file…"), + caption=safeTranslate(qApp, "Export", "Choose output file…"), filter=filter, directory=filename, defaultSuffix=self.exportDefaultSuffix) diff --git a/manuskript/exporter/pandoc/HTML.py b/manuskript/exporter/pandoc/HTML.py index 4204441..3a2c5af 100644 --- a/manuskript/exporter/pandoc/HTML.py +++ b/manuskript/exporter/pandoc/HTML.py @@ -5,12 +5,14 @@ from PyQt5.QtCore import QUrl from manuskript.exporter.manuskript import HTML as MskHTML from manuskript.exporter.pandoc.abstractPlainText import abstractPlainText +from manuskript.functions import safeTranslate + import os class HTML(abstractPlainText): name = "HTML" - description = qApp.translate("Export", """A little known format modestly used. You know, web sites for example.""") + description = safeTranslate(qApp, "Export", """A little known format modestly used. You know, web sites for example.""") icon = "text-html" exportVarName = "lastPandocHTML" diff --git a/manuskript/exporter/pandoc/PDF.py b/manuskript/exporter/pandoc/PDF.py index 7e67c42..1bef6b7 100644 --- a/manuskript/exporter/pandoc/PDF.py +++ b/manuskript/exporter/pandoc/PDF.py @@ -7,7 +7,7 @@ from PyQt5.QtCore import QUrl from PyQt5.QtWidgets import qApp from manuskript.exporter.pandoc.abstractOutput import abstractOutput -from manuskript.functions import tempFile +from manuskript.functions import tempFile, safeTranslate from manuskript.ui.views.PDFViewer import PDFViewer @@ -15,8 +15,8 @@ class PDF(abstractOutput): """PDF Viewer using PDF.js. Cf. https://github.com/mozilla/pdf.js/wiki/Setup-PDF.js-in-a-website""" name = "PDF" - description = qApp.translate("Export", "Needs LaTeX to be installed.") - InvalidBecause = qApp.translate("Export", """a valid LaTeX installation. Pandoc recommendations can be found on: + description = safeTranslate(qApp, "Export", "Needs LaTeX to be installed.") + InvalidBecause = safeTranslate(qApp, "Export", """a valid LaTeX installation. Pandoc recommendations can be found on: pandoc.org/installing.html. If you want Unicode support, you need XeLaTeX.""") icon = "application-pdf" diff --git a/manuskript/exporter/pandoc/__init__.py b/manuskript/exporter/pandoc/__init__.py index b3af62a..5d67f94 100644 --- a/manuskript/exporter/pandoc/__init__.py +++ b/manuskript/exporter/pandoc/__init__.py @@ -11,7 +11,7 @@ from manuskript.exporter.pandoc.HTML import HTML from manuskript.exporter.pandoc.PDF import PDF from manuskript.exporter.pandoc.outputFormats import ePub, OpenDocument, DocX from manuskript.exporter.pandoc.plainText import reST, markdown, latex, OPML -from manuskript.functions import mainWindow +from manuskript.functions import mainWindow, safeTranslate import logging LOGGER = logging.getLogger(__name__) @@ -19,7 +19,7 @@ LOGGER = logging.getLogger(__name__) class pandocExporter(basicExporter): name = "Pandoc" - description = qApp.translate("Export", """

A universal document converter. Can be used to convert Markdown to a wide range of other + description = safeTranslate(qApp, "Export", """

A universal document converter. Can be used to convert Markdown to a wide range of other formats.

Website: http://pandoc.org/

""") @@ -106,7 +106,7 @@ class pandocExporter(basicExporter): + "Stderr content:\n" + stderr.decode("utf-8") if p.returncode != 0: LOGGER.error(err) - QMessageBox.critical(mainWindow().dialog, qApp.translate("Export", "Error"), err) + QMessageBox.critical(mainWindow().dialog, safeTranslate(qApp, "Export", "Error"), err) else: LOGGER.warning(err) return None diff --git a/manuskript/exporter/pandoc/abstractPlainText.py b/manuskript/exporter/pandoc/abstractPlainText.py index 2b3f64e..719d651 100644 --- a/manuskript/exporter/pandoc/abstractPlainText.py +++ b/manuskript/exporter/pandoc/abstractPlainText.py @@ -7,6 +7,7 @@ from PyQt5.QtWidgets import qApp, QVBoxLayout, QCheckBox, QWidget, QHBoxLayout, from manuskript.exporter.manuskript.markdown import markdown, markdownSettings from manuskript.ui.collapsibleGroupBox2 import collapsibleGroupBox2 +from manuskript.functions import safeTranslate import logging LOGGER = logging.getLogger(__name__) @@ -150,80 +151,80 @@ class pandocSettings(markdownSettings): settingsList = { # General "standalone": pandocSetting("--standalone", "checkbox", "", - qApp.translate("Export", "Standalone document (not just a fragment)"), + safeTranslate(qApp, "Export", "Standalone document (not just a fragment)"), default=True), "TOC": pandocSetting("--toc", "checkbox", "", - qApp.translate("Export", "Include a table of contents."), toc=True), + safeTranslate(qApp, "Export", "Include a table of contents."), toc=True), "TOC-depth": pandocSetting("--toc-depth=", "number", "", - qApp.translate("Export", "Number of sections level to include in TOC: "), + safeTranslate(qApp, "Export", "Number of sections level to include in TOC: "), default=3, min=1, max=6, toc=True, minVersion="1.10"), # pandoc v1 only "smart": pandocSetting("--smart", "checkbox", "", - qApp.translate("Export", "Typographically correct output"), + safeTranslate(qApp, "Export", "Typographically correct output"), maxVersion="1.19.2.4"), # pandoc v1 only "normalize": pandocSetting("--normalize", "checkbox", "", - qApp.translate("Export", "Normalize the document (cleaner)"), + safeTranslate(qApp, "Export", "Normalize the document (cleaner)"), minVersion="1.8", maxVersion="1.19.2.4"), # pandoc v1.5 to 2.7.3 "base-header": pandocSetting("--base-header-level=", "number", "", - qApp.translate("Export", "Specify the base level for headers: "), + safeTranslate(qApp, "Export", "Specify the base level for headers: "), default=1, min=1, minVersion="1.5", maxVersion="2.7.3"), # pandoc v2.8+ "shift-heading": pandocSetting("--shift-heading-level-by=", "number", "", - qApp.translate("Export", "Specify the base level for headers: "), + safeTranslate(qApp, "Export", "Specify the base level for headers: "), default=0, min=0, minVersion="2.8"), "disable-YAML": pandocSetting("EXT-yaml_metadata_block", "checkbox", "", - qApp.translate("Export", "Disable YAML metadata block.\nUse that if you get YAML related error."), + safeTranslate(qApp, "Export", "Disable YAML metadata block.\nUse that if you get YAML related error."), minVersion="1.12"), "hard-line-breaks": pandocSetting("EXT-hard_line_block", "checkbox", "", - qApp.translate("Export", "Enable the support on markdown for line break on new line."), + safeTranslate(qApp, "Export", "Enable the support on markdown for line break on new line."), minVersion="1.16"), # Specific "ref-link": pandocSetting("--reference-links", "checkbox", "markdown rst", - qApp.translate("Export", "Use reference-style links instead of inline links"), + safeTranslate(qApp, "Export", "Use reference-style links instead of inline links"), specific=True), # pandoc v1.9 to v2.11.1 "atx": pandocSetting("--atx-headers", "checkbox", "markdown asciidoc", - qApp.translate("Export", "Use ATX-style headers"), specific=True, + safeTranslate(qApp, "Export", "Use ATX-style headers"), specific=True, minVersion="1.9", maxVersion="2.11.1"), # pandoc v2.11.2+ "atx-heading": pandocSetting("--markdown-headings=atx|setext", "checkbox", "markdown asciidoc", - qApp.translate("Export", "Use ATX-style headers"), specific=True, + safeTranslate(qApp, "Export", "Use ATX-style headers"), specific=True, minVersion="2.11.2"), "self-contained": pandocSetting("--self-contained", "checkbox", "html", - qApp.translate("Export", "Self-contained HTML files, with no dependencies"), + safeTranslate(qApp, "Export", "Self-contained HTML files, with no dependencies"), specific=True, minVersion="1.9"), "q-tags": pandocSetting("--html-q-tags", "checkbox", "html", - qApp.translate("Export", "Use tags for quotes in HTML"), specific=True, + safeTranslate(qApp, "Export", "Use tags for quotes in HTML"), specific=True, minVersion="1.10"), # pandoc v1 only "latex-engine": pandocSetting("--latex-engine=", "combo", "pdf", - qApp.translate("Export", "LaTeX engine used to produce the PDF."), + safeTranslate(qApp, "Export", "LaTeX engine used to produce the PDF."), vals="pdflatex|lualatex|xelatex", specific=True, minVersion="1.9", maxVersion="1.19.2.4"), # pandoc v2 "pdf-engine": pandocSetting("--pdf-engine=", "combo", "pdf", - qApp.translate("Export", "LaTeX engine used to produce the PDF."), + safeTranslate(qApp, "Export", "LaTeX engine used to produce the PDF."), vals="pdflatex|lualatex|xelatex", minVersion="2.0", specific=True), "epub3": pandocSetting("EXTepub3", "checkbox", "epub", - qApp.translate("Export", "Convert to ePUB3"), specific=True, + safeTranslate(qApp, "Export", "Convert to ePUB3"), specific=True, minVersion="1.10"), # PDF "latex-ps": pandocSetting("--variable=papersize:", "combo", "pdf latex", # FIXME: does not work with default template - qApp.translate("Export", "Paper size:"), + safeTranslate(qApp, "Export", "Paper size:"), vals="letter|A4|A5", specific=True, minVersion="1.4"), "latex-fs": pandocSetting("--variable=fontsize:", "number", "pdf latex", # FIXME: does not work with default template - qApp.translate("Export", "Font size:"), + safeTranslate(qApp, "Export", "Font size:"), min=8, max=88, default=12, suffix="pt", specific=True, minVersion="1.4"), "latex-class": pandocSetting("--variable=documentclass:", "combo", "pdf latex", - qApp.translate("Export", "Class:"), + safeTranslate(qApp, "Export", "Class:"), vals="article|report|book|memoir", specific=True, minVersion="1.4"), "latex-ls": pandocSetting("--variable=linestretch:", "combo", "pdf latex", - qApp.translate("Export", "Line spacing:"), + safeTranslate(qApp, "Export", "Line spacing:"), vals="1|1.25|1.5|2", specific=True, minVersion="1.4"), # FIXME: complete with http://pandoc.org/README.html#variables-for-latex diff --git a/manuskript/exporter/pandoc/outputFormats.py b/manuskript/exporter/pandoc/outputFormats.py index 9fa00a8..c9997b7 100644 --- a/manuskript/exporter/pandoc/outputFormats.py +++ b/manuskript/exporter/pandoc/outputFormats.py @@ -3,11 +3,12 @@ from PyQt5.QtWidgets import qApp from manuskript.exporter.pandoc.abstractOutput import abstractOutput +from manuskript.functions import safeTranslate class ePub(abstractOutput): name = "ePub" - description = qApp.translate("Export", """Books that don't kill trees.""") + description = safeTranslate(qApp, "Export", """Books that don't kill trees.""") icon = "application-epub+zip" exportVarName = "lastPandocePub" @@ -18,7 +19,7 @@ class ePub(abstractOutput): class OpenDocument(abstractOutput): name = "OpenDocument" - description = qApp.translate("Export", "OpenDocument format. Used by LibreOffice for example.") + description = safeTranslate(qApp, "Export", "OpenDocument format. Used by LibreOffice for example.") exportVarName = "lastPandocODT" toFormat = "odt" @@ -29,7 +30,7 @@ class OpenDocument(abstractOutput): class DocX(abstractOutput): name = "DocX" - description = qApp.translate("Export", "Microsoft Office (.docx) document.") + description = safeTranslate(qApp, "Export", "Microsoft Office (.docx) document.") exportVarName = "lastPandocDocX" toFormat = "docx" diff --git a/manuskript/exporter/pandoc/plainText.py b/manuskript/exporter/pandoc/plainText.py index be4eb94..cc06a4d 100644 --- a/manuskript/exporter/pandoc/plainText.py +++ b/manuskript/exporter/pandoc/plainText.py @@ -3,11 +3,12 @@ from PyQt5.QtWidgets import qApp from manuskript.exporter.pandoc.abstractPlainText import abstractPlainText +from manuskript.functions import safeTranslate class markdown(abstractPlainText): name = "Markdown" - description = qApp.translate("Export", """Export to markdown, using pandoc. Allows more formatting options + description = safeTranslate(qApp, "Export", """Export to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter.""") icon = "text-x-markdown" @@ -19,7 +20,7 @@ class markdown(abstractPlainText): class reST(abstractPlainText): name = "reST" - description = qApp.translate("Export", """reStructuredText is a lightweight markup language.""") + description = safeTranslate(qApp, "Export", """reStructuredText is a lightweight markup language.""") exportVarName = "lastPandocreST" toFormat = "rst" @@ -30,7 +31,7 @@ class reST(abstractPlainText): class latex(abstractPlainText): name = "LaTeX" - description = qApp.translate("Export", """LaTeX is a word processor and document markup language used to create + description = safeTranslate(qApp, "Export", """LaTeX is a word processor and document markup language used to create beautiful documents.""") exportVarName = "lastPandocLatex" @@ -42,7 +43,7 @@ class latex(abstractPlainText): class OPML(abstractPlainText): name = "OPML" - description = qApp.translate("Export", """The purpose of this format is to provide a way to exchange information + description = safeTranslate(qApp, "Export", """The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner.""") diff --git a/manuskript/functions/__init__.py b/manuskript/functions/__init__.py index b2910a9..0d15af6 100644 --- a/manuskript/functions/__init__.py +++ b/manuskript/functions/__init__.py @@ -23,6 +23,12 @@ AUC = Qt.AutoConnection | Qt.UniqueConnection MW = None +def safeTranslate(qApp, group, text): + try: + return qApp.translate(group, text) + except: + return text + def wordCount(text): return len(re.findall(r"\S+", text)) diff --git a/manuskript/importer/folderImporter.py b/manuskript/importer/folderImporter.py index c36ff43..b6aa6c9 100644 --- a/manuskript/importer/folderImporter.py +++ b/manuskript/importer/folderImporter.py @@ -5,6 +5,8 @@ import os from manuskript.importer.abstractImporter import abstractImporter from manuskript.models import outlineItem from manuskript.enums import Outline +from manuskript.functions import safeTranslate + from PyQt5.QtWidgets import qApp @@ -94,27 +96,27 @@ class folderImporter(abstractImporter): # Add group group = self.addGroup(widget.toolBox.widget(0), - qApp.translate("Import", "Folder import")) + safeTranslate(qApp, "Import", "Folder import")) #group = cls.addPage(widget, "Folder import") self.addSetting("info", "label", - qApp.translate("Import", """

Info: Imports a whole + safeTranslate(qApp, "Import", """

Info: Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.

Only text files are supported (not images, binary or others).

""")) self.addSetting("ext", "text", - qApp.translate("Import", "Include only those extensions:"), + safeTranslate(qApp, "Import", "Include only those extensions:"), default="*.txt, *.md", - tooltip=qApp.translate("Import", "Comma separated values")), + tooltip=safeTranslate(qApp, "Import", "Comma separated values")), self.addSetting("sortItems", "checkbox", - qApp.translate("Import", "Sort items by name"), + safeTranslate(qApp, "Import", "Sort items by name"), default=True), self.addSetting("separateFolderFiles", "checkbox", - qApp.translate("Import", "Import folder then files"), + safeTranslate(qApp, "Import", "Import folder then files"), default=True), self.addSettingsTo(group) diff --git a/manuskript/importer/markdownImporter.py b/manuskript/importer/markdownImporter.py index d135485..b0d0d7e 100644 --- a/manuskript/importer/markdownImporter.py +++ b/manuskript/importer/markdownImporter.py @@ -4,6 +4,8 @@ from manuskript.importer.abstractImporter import abstractImporter from manuskript.models import outlineItem from manuskript.enums import Outline +from manuskript.functions import safeTranslate + from PyQt5.QtWidgets import qApp import re, os @@ -173,11 +175,11 @@ class markdownImporter(abstractImporter): # Add group group = self.addGroup(widget.toolBox.widget(0), - qApp.translate("Import", "Markdown import")) + safeTranslate(qApp, "Import", "Markdown import")) #group = cls.addPage(widget, "Folder import") self.addSetting("info", "label", - qApp.translate("Import", """Info: A very simple + safeTranslate(qApp, "Import", """Info: A very simple parser that will go through a markdown document and create items for each titles.
 """)) diff --git a/manuskript/importer/mindMapImporter.py b/manuskript/importer/mindMapImporter.py index 7999bdf..03a7cc4 100644 --- a/manuskript/importer/mindMapImporter.py +++ b/manuskript/importer/mindMapImporter.py @@ -5,10 +5,11 @@ from PyQt5.QtWidgets import qApp, QMessageBox from manuskript.models import outlineItem from manuskript.enums import Outline from lxml import etree as ET -from manuskript.functions import mainWindow +from manuskript.functions import mainWindow, safeTranslate from manuskript.importer.abstractImporter import abstractImporter from manuskript.converters import HTML2MD, HTML2PlainText + class mindMapImporter(abstractImporter): name = "Mind Map" @@ -54,8 +55,8 @@ class mindMapImporter(abstractImporter): if not ret: QMessageBox.critical( settingsWidget, - qApp.translate("Import", "Mind Map Import"), - qApp.translate("Import", "This does not appear to be a valid Mind Map file.")) + safeTranslate(qApp, "Import", "Mind Map Import"), + safeTranslate(qApp, "Import", "This does not appear to be a valid Mind Map file.")) return None @@ -68,10 +69,10 @@ class mindMapImporter(abstractImporter): # Add group group = self.addGroup(widget.toolBox.widget(0), - qApp.translate("Import", "Mind Map import")) + safeTranslate(qApp, "Import", "Mind Map import")) self.addSetting("importTipAs", "combo", - qApp.translate("Import", "Import tip as:"), + safeTranslate(qApp, "Import", "Import tip as:"), vals="Text|Folder", ) @@ -86,7 +87,7 @@ class mindMapImporter(abstractImporter): # Title title = underElement.get('TEXT', "").replace("\n", " ") if not title: - title = qApp.translate("Import", "Untitled") + title = safeTranslate(qApp, "Import", "Untitled") item = outlineItem(parent=parentItem, title=title) items.append(item) diff --git a/manuskript/importer/opmlImporter.py b/manuskript/importer/opmlImporter.py index 79d871e..4cc537d 100644 --- a/manuskript/importer/opmlImporter.py +++ b/manuskript/importer/opmlImporter.py @@ -5,9 +5,10 @@ from PyQt5.QtWidgets import qApp, QMessageBox from manuskript.models import outlineItem from manuskript.enums import Outline from lxml import etree as ET -from manuskript.functions import mainWindow +from manuskript.functions import mainWindow, safeTranslate from manuskript.importer.abstractImporter import abstractImporter + class opmlImporter(abstractImporter): name = "OPML" @@ -34,8 +35,8 @@ class opmlImporter(abstractImporter): opmlContent = opmlFile.read() except: QMessageBox.critical(settingsWidget, - qApp.translate("Import", "OPML Import"), - qApp.translate("Import", "File open failed.")) + safeTranslate(qApp, "Import", "OPML Import"), + safeTranslate(qApp, "Import", "File open failed.")) return None elif fromString == "": @@ -63,8 +64,8 @@ class opmlImporter(abstractImporter): if not ret: QMessageBox.critical( settingsWidget, - qApp.translate("Import", "OPML Import"), - qApp.translate("Import", "This does not appear to be a valid OPML file.")) + safeTranslate(qApp, "Import", "OPML Import"), + safeTranslate(qApp, "Import", "This does not appear to be a valid OPML file.")) return None diff --git a/manuskript/importer/pandocImporters.py b/manuskript/importer/pandocImporters.py index 9a0e99d..e2f9267 100644 --- a/manuskript/importer/pandocImporters.py +++ b/manuskript/importer/pandocImporters.py @@ -5,6 +5,8 @@ from manuskript.importer.abstractImporter import abstractImporter from manuskript.exporter.pandoc import pandocExporter from manuskript.importer.opmlImporter import opmlImporter from manuskript.importer.markdownImporter import markdownImporter +from manuskript.functions import safeTranslate + from PyQt5.QtWidgets import qApp @@ -55,10 +57,10 @@ class pandocImporter(abstractImporter): # Add group group = self.addGroup(widget.toolBox.widget(0), - qApp.translate("Import", "Pandoc import")) + safeTranslate(qApp, "Import", "Pandoc import")) self.addSetting("info", "label", - qApp.translate("Import", """Info: Manuskript can + safeTranslate(qApp, "Import", """Info: Manuskript can import from markdown or OPML. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other @@ -66,14 +68,14 @@ class pandocImporter(abstractImporter):
 """)) self.addSetting("formatTo", "combo", - qApp.translate("Import", "Import using:"), + safeTranslate(qApp, "Import", "Import using:"), vals="markdown|OPML") self.addSetting("wrap", "combo", - qApp.translate("Import", "Wrap lines:"), + safeTranslate(qApp, "Import", "Wrap lines:"), vals="auto|none|preserve", default="none", - tooltip=qApp.translate("Import", """

Should pandoc create + tooltip=safeTranslate(qApp, "Import", """

Should pandoc create cosmetic / non-semantic line-breaks?

auto: wraps at 72 characters.
none: no line wrap.
diff --git a/manuskript/models/outlineItem.py b/manuskript/models/outlineItem.py index a25511a..99f0010 100644 --- a/manuskript/models/outlineItem.py +++ b/manuskript/models/outlineItem.py @@ -256,12 +256,12 @@ class outlineItem(abstractItem, searchableItem): if not wc: wc = 0 if goal: - return qApp.translate("outlineItem", "{} words / {} ({})").format( + return F.safeTranslate(qApp, "outlineItem", "{} words / {} ({})").format( locale.format_string("%d", wc, grouping=True), locale.format_string("%d", goal, grouping=True), "{}%".format(str(int(progress * 100)))) else: - return qApp.translate("outlineItem", "{} words").format( + return F.safeTranslate(qApp, "outlineItem", "{} words").format( locale.format_string("%d", wc, grouping=True)) ####################################################################### diff --git a/manuskript/models/references.py b/manuskript/models/references.py index 9baa8db..ea882a9 100644 --- a/manuskript/models/references.py +++ b/manuskript/models/references.py @@ -19,7 +19,7 @@ from manuskript.enums import Outline from manuskript.enums import Character from manuskript.enums import Plot from manuskript.enums import PlotStep -from manuskript.functions import mainWindow, mixColors +from manuskript.functions import mainWindow, mixColors, safeTranslate from manuskript.ui import style as S @@ -87,7 +87,7 @@ def infos(ref): """ match = re.fullmatch(RegEx, ref) if not match: - return qApp.translate("references", "Not a reference: {}.").format(ref) + return safeTranslate(qApp, "references", "Not a reference: {}.").format(ref) _type = match.group(1) _ref = match.group(2) @@ -98,19 +98,19 @@ def infos(ref): idx = m.getIndexByID(_ref) if not idx.isValid(): - return qApp.translate("references", "Unknown reference: {}.").format(ref) + return safeTranslate(qApp, "references", "Unknown reference: {}.").format(ref) item = idx.internalPointer() # Titles - pathTitle = qApp.translate("references", "Path:") - statsTitle = qApp.translate("references", "Stats:") - POVTitle = qApp.translate("references", "POV:") - statusTitle = qApp.translate("references", "Status:") - labelTitle = qApp.translate("references", "Label:") - ssTitle = qApp.translate("references", "Short summary:") - lsTitle = qApp.translate("references", "Long summary:") - notesTitle = qApp.translate("references", "Notes:") + pathTitle = safeTranslate(qApp, "references", "Path:") + statsTitle = safeTranslate(qApp, "references", "Stats:") + POVTitle = safeTranslate(qApp, "references", "POV:") + statusTitle = safeTranslate(qApp, "references", "Status:") + labelTitle = safeTranslate(qApp, "references", "Label:") + ssTitle = safeTranslate(qApp, "references", "Short summary:") + lsTitle = safeTranslate(qApp, "references", "Long summary:") + notesTitle = safeTranslate(qApp, "references", "Notes:") # The POV of the scene POV = "" @@ -191,30 +191,30 @@ def infos(ref): m = mainWindow().mdlCharacter c = m.getCharacterByID(int(_ref)) if c == None: - return qApp.translate("references", "Unknown reference: {}.").format(ref) + return safeTranslate(qApp, "references", "Unknown reference: {}.").format(ref) index = c.index() name = c.name() # Titles - basicTitle = qApp.translate("references", "Basic info") - detailedTitle = qApp.translate("references", "Detailed info") - POVof = qApp.translate("references", "POV of:") + basicTitle = safeTranslate(qApp, "references", "Basic info") + detailedTitle = safeTranslate(qApp, "references", "Detailed info") + POVof = safeTranslate(qApp, "references", "POV of:") # Goto (link) - goto = qApp.translate("references", "Go to {}.") + goto = safeTranslate(qApp, "references", "Go to {}.") goto = goto.format(refToLink(ref)) # basic infos basic = [] for i in [ - (Character.motivation, qApp.translate("references", "Motivation"), False), - (Character.goal, qApp.translate("references", "Goal"), False), - (Character.conflict, qApp.translate("references", "Conflict"), False), - (Character.epiphany, qApp.translate("references", "Epiphany"), False), - (Character.summarySentence, qApp.translate("references", "Short summary"), True), - (Character.summaryPara, qApp.translate("references", "Longer summary"), True), + (Character.motivation, safeTranslate(qApp, "references", "Motivation"), False), + (Character.goal, safeTranslate(qApp, "references", "Goal"), False), + (Character.conflict, safeTranslate(qApp, "references", "Conflict"), False), + (Character.epiphany, safeTranslate(qApp, "references", "Epiphany"), False), + (Character.summarySentence, safeTranslate(qApp, "references", "Short summary"), True), + (Character.summaryPara, safeTranslate(qApp, "references", "Longer summary"), True), ]: val = m.data(index.sibling(index.row(), i[0].value)) @@ -274,16 +274,16 @@ def infos(ref): name = m.getPlotNameByID(_ref) if not index.isValid(): - return qApp.translate("references", "Unknown reference: {}.").format(ref) + return safeTranslate(qApp, "references", "Unknown reference: {}.").format(ref) # Titles - descriptionTitle = qApp.translate("references", "Description") - resultTitle = qApp.translate("references", "Result") - charactersTitle = qApp.translate("references", "Characters") - stepsTitle = qApp.translate("references", "Resolution steps") + descriptionTitle = safeTranslate(qApp, "references", "Description") + resultTitle = safeTranslate(qApp, "references", "Result") + charactersTitle = safeTranslate(qApp, "references", "Characters") + stepsTitle = safeTranslate(qApp, "references", "Resolution steps") # Goto (link) - goto = qApp.translate("references", "Go to {}.") + goto = safeTranslate(qApp, "references", "Go to {}.") goto = goto.format(refToLink(ref)) # Description @@ -353,15 +353,15 @@ def infos(ref): name = m.name(index) if not index.isValid(): - return qApp.translate("references", "Unknown reference: {}.").format(ref) + return safeTranslate(qApp, "references", "Unknown reference: {}.").format(ref) # Titles - descriptionTitle = qApp.translate("references", "Description") - passionTitle = qApp.translate("references", "Passion") - conflictTitle = qApp.translate("references", "Conflict") + descriptionTitle = safeTranslate(qApp, "references", "Description") + passionTitle = safeTranslate(qApp, "references", "Passion") + conflictTitle = safeTranslate(qApp, "references", "Conflict") # Goto (link) - goto = qApp.translate("references", "Go to {}.") + goto = safeTranslate(qApp, "references", "Go to {}.") goto = goto.format(refToLink(ref)) # Description @@ -396,7 +396,7 @@ def infos(ref): return text else: - return qApp.translate("references", "Unknown reference: {}.").format(ref) + return safeTranslate(qApp, "references", "Unknown reference: {}.").format(ref) def shortInfos(ref): @@ -495,28 +495,28 @@ def tooltip(ref): infos = shortInfos(ref) if not infos: - return qApp.translate("references", "Unknown reference: {}.").format(ref) + return safeTranslate(qApp, "references", "Unknown reference: {}.").format(ref) if infos == -1: - return qApp.translate("references", "Not a reference: {}.").format(ref) + return safeTranslate(qApp, "references", "Not a reference: {}.").format(ref) if infos["type"] == TextLetter: if infos["text_type"] == "folder": - tt = qApp.translate("references", "Folder: {}").format(infos["title"]) + tt = safeTranslate(qApp, "references", "Folder: {}").format(infos["title"]) else: - tt = qApp.translate("references", "Text: {}").format(infos["title"]) + tt = safeTranslate(qApp, "references", "Text: {}").format(infos["title"]) tt += "
{}".format(infos["path"]) return tt elif infos["type"] == CharacterLetter: - return qApp.translate("references", "Character: {}").format(infos["title"]) + return safeTranslate(qApp, "references", "Character: {}").format(infos["title"]) elif infos["type"] == PlotLetter: - return qApp.translate("references", "Plot: {}").format(infos["title"]) + return safeTranslate(qApp, "references", "Plot: {}").format(infos["title"]) elif infos["type"] == WorldLetter: - return qApp.translate("references", "World: {name}{path}").format( + return safeTranslate(qApp, "references", "World: {name}{path}").format( name=infos["title"], path=" ({})".format(infos["path"]) if infos["path"] else "") @@ -589,7 +589,7 @@ def findReferencesTo(ref, parent=None, recursive=True): return lst -def listReferences(ref, title=qApp.translate("references", "Referenced in:")): +def listReferences(ref, title=safeTranslate(qApp, "references", "Referenced in:")): oM = mainWindow().mdlOutline listRefs = "" diff --git a/manuskript/ui/editors/fullScreenEditor.py b/manuskript/ui/editors/fullScreenEditor.py index a4c7139..ee9e06d 100644 --- a/manuskript/ui/editors/fullScreenEditor.py +++ b/manuskript/ui/editors/fullScreenEditor.py @@ -12,7 +12,7 @@ from PyQt5.QtWidgets import QFrame, QWidget, QPushButton, qApp, QStyle, QComboBo from manuskript import settings from manuskript.enums import Outline from manuskript.models import outlineItem -from manuskript.functions import allPaths, drawProgress +from manuskript.functions import allPaths, drawProgress, safeTranslate from manuskript.ui.editors.locker import locker from manuskript.ui.editors.themes import findThemePath, generateTheme, setThemeEditorDatas from manuskript.ui.editors.themes import loadThemeDatas @@ -414,7 +414,7 @@ class fullScreenEditor(QWidget): def createNewText(self): item = self._index.internalPointer() - newItem = outlineItem(title=qApp.translate("outlineBasics", "New"), _type=settings.defaultTextType) + newItem = outlineItem(title=safeTranslate(qApp, "outlineBasics", "New"), _type=settings.defaultTextType) self._index.model().insertItem(newItem, item.row() + 1, item.parent().index()) self.setCurrentModelIndex(newItem.index()) diff --git a/manuskript/ui/views/outlineBasics.py b/manuskript/ui/views/outlineBasics.py index aaa1781..5f7ea89 100644 --- a/manuskript/ui/views/outlineBasics.py +++ b/manuskript/ui/views/outlineBasics.py @@ -9,7 +9,7 @@ from PyQt5.QtWidgets import QAbstractItemView, qApp, QMenu, QAction, \ from manuskript import settings from manuskript.enums import Outline from manuskript.functions import mainWindow, statusMessage -from manuskript.functions import toInt, customIcons +from manuskript.functions import toInt, customIcons, safeTranslate from manuskript.models import outlineItem from manuskript.ui.tools.splitDialog import splitDialog @@ -58,24 +58,24 @@ class outlineBasics(QAbstractItemView): title = mouseIndex.internalPointer().title() else: - title = qApp.translate("outlineBasics", "Root") + title = safeTranslate(qApp, "outlineBasics", "Root") if len(title) > 25: title = title[:25] + "…" # Open Item action self.actOpen = QAction(QIcon.fromTheme("go-right"), - qApp.translate("outlineBasics", "Open {}".format(title)), + safeTranslate(qApp, "outlineBasics", "Open {}".format(title)), menu) self.actOpen.triggered.connect(self.openItem) menu.addAction(self.actOpen) # Open item(s) in new tab if mouseIndex in sel and len(sel) > 1: - actionTitle = qApp.translate("outlineBasics", "Open {} items in new tabs").format(len(sel)) + actionTitle = safeTranslate(qApp, "outlineBasics", "Open {} items in new tabs").format(len(sel)) self._indexesToOpen = sel else: - actionTitle = qApp.translate("outlineBasics", "Open {} in a new tab").format(title) + actionTitle = safeTranslate(qApp, "outlineBasics", "Open {} in a new tab").format(title) self._indexesToOpen = [mouseIndex] self.actNewTab = QAction(QIcon.fromTheme("go-right"), actionTitle, menu) @@ -86,13 +86,13 @@ class outlineBasics(QAbstractItemView): # Add text / folder self.actAddFolder = QAction(QIcon.fromTheme("folder-new"), - qApp.translate("outlineBasics", "New &Folder"), + safeTranslate(qApp, "outlineBasics", "New &Folder"), menu) self.actAddFolder.triggered.connect(self.addFolder) menu.addAction(self.actAddFolder) self.actAddText = QAction(QIcon.fromTheme("document-new"), - qApp.translate("outlineBasics", "New &Text"), + safeTranslate(qApp, "outlineBasics", "New &Text"), menu) self.actAddText.triggered.connect(self.addText) menu.addAction(self.actAddText) @@ -101,29 +101,29 @@ class outlineBasics(QAbstractItemView): # Copy, cut, paste, duplicate self.actCut = QAction(QIcon.fromTheme("edit-cut"), - qApp.translate("outlineBasics", "C&ut"), menu) + safeTranslate(qApp, "outlineBasics", "C&ut"), menu) self.actCut.triggered.connect(self.cut) menu.addAction(self.actCut) self.actCopy = QAction(QIcon.fromTheme("edit-copy"), - qApp.translate("outlineBasics", "&Copy"), menu) + safeTranslate(qApp, "outlineBasics", "&Copy"), menu) self.actCopy.triggered.connect(self.copy) menu.addAction(self.actCopy) self.actPaste = QAction(QIcon.fromTheme("edit-paste"), - qApp.translate("outlineBasics", "&Paste"), menu) + safeTranslate(qApp, "outlineBasics", "&Paste"), menu) self.actPaste.triggered.connect(self.paste) menu.addAction(self.actPaste) # Rename / duplicate / remove items self.actDelete = QAction(QIcon.fromTheme("edit-delete"), - qApp.translate("outlineBasics", "&Delete"), + safeTranslate(qApp, "outlineBasics", "&Delete"), menu) self.actDelete.triggered.connect(self.delete) menu.addAction(self.actDelete) self.actRename = QAction(QIcon.fromTheme("edit-rename"), - qApp.translate("outlineBasics", "&Rename"), + safeTranslate(qApp, "outlineBasics", "&Rename"), menu) self.actRename.triggered.connect(self.rename) menu.addAction(self.actRename) @@ -131,17 +131,17 @@ class outlineBasics(QAbstractItemView): menu.addSeparator() # POV - self.menuPOV = QMenu(qApp.translate("outlineBasics", "Set POV"), menu) + self.menuPOV = QMenu(safeTranslate(qApp, "outlineBasics", "Set POV"), menu) mw = mainWindow() - a = QAction(QIcon.fromTheme("dialog-no"), qApp.translate("outlineBasics", "None"), self.menuPOV) + a = QAction(QIcon.fromTheme("dialog-no"), safeTranslate(qApp, "outlineBasics", "None"), self.menuPOV) a.triggered.connect(lambda: self.setPOV("")) self.menuPOV.addAction(a) self.menuPOV.addSeparator() menus = [] - for i in [qApp.translate("outlineBasics", "Main"), - qApp.translate("outlineBasics", "Secondary"), - qApp.translate("outlineBasics", "Minor")]: + for i in [safeTranslate(qApp, "outlineBasics", "Main"), + safeTranslate(qApp, "outlineBasics", "Secondary"), + safeTranslate(qApp, "outlineBasics", "Minor")]: m = QMenu(i, self.menuPOV) menus.append(m) self.menuPOV.addMenu(m) @@ -160,8 +160,8 @@ class outlineBasics(QAbstractItemView): menu.addMenu(self.menuPOV) # Status - self.menuStatus = QMenu(qApp.translate("outlineBasics", "Set Status"), menu) - # a = QAction(QIcon.fromTheme("dialog-no"), qApp.translate("outlineBasics", "None"), self.menuStatus) + self.menuStatus = QMenu(safeTranslate(qApp, "outlineBasics", "Set Status"), menu) + # a = QAction(QIcon.fromTheme("dialog-no"), safeTranslate(qApp, "outlineBasics", "None"), self.menuStatus) # a.triggered.connect(lambda: self.setStatus("")) # self.menuStatus.addAction(a) # self.menuStatus.addSeparator() @@ -176,7 +176,7 @@ class outlineBasics(QAbstractItemView): menu.addMenu(self.menuStatus) # Labels - self.menuLabel = QMenu(qApp.translate("outlineBasics", "Set Label"), menu) + self.menuLabel = QMenu(safeTranslate(qApp, "outlineBasics", "Set Label"), menu) mpr = QSignalMapper(self.menuLabel) for i in range(mw.mdlLabels.rowCount()): a = QAction(mw.mdlLabels.item(i, 0).icon(), @@ -194,8 +194,8 @@ class outlineBasics(QAbstractItemView): if self.menuCustomIcons: menu.addMenu(self.menuCustomIcons) else: - self.menuCustomIcons = QMenu(qApp.translate("outlineBasics", "Set Custom Icon"), menu) - a = QAction(qApp.translate("outlineBasics", "Restore to default"), self.menuCustomIcons) + self.menuCustomIcons = QMenu(safeTranslate(qApp, "outlineBasics", "Set Custom Icon"), menu) + a = QAction(safeTranslate(qApp, "outlineBasics", "Restore to default"), self.menuCustomIcons) a.triggered.connect(lambda: self.setCustomIcon("")) self.menuCustomIcons.addAction(a) self.menuCustomIcons.addSeparator() @@ -280,7 +280,7 @@ class outlineBasics(QAbstractItemView): if _type == "text": _type = settings.defaultTextType - item = outlineItem(title=qApp.translate("outlineBasics", "New"), _type=_type) + item = outlineItem(title=safeTranslate(qApp, "outlineBasics", "New"), _type=_type) self.model().appendItem(item, parent) def copy(self): @@ -312,7 +312,7 @@ class outlineBasics(QAbstractItemView): if not settings.dontShowDeleteWarning: msgInfo = list() msgInfo.append("

") - msgInfo.append(qApp.translate("outlineBasics", "You're about to delete {} item(s).").format( + msgInfo.append(safeTranslate(qApp, "outlineBasics", "You're about to delete {} item(s).").format( len(self.getSelection()) )) @@ -322,11 +322,11 @@ class outlineBasics(QAbstractItemView): msgInfo.append("

  • {}
  • ".format(str(title))) msgInfo.append("

    ") - msgInfo.append(qApp.translate("outlineBasics", "Are you sure?")) + msgInfo.append(safeTranslate(qApp, "outlineBasics", "Are you sure?")) msgInfo.append("

    ") msg = QMessageBox(QMessageBox.Warning, - qApp.translate("outlineBasics", "About to remove"), + safeTranslate(qApp, "outlineBasics", "About to remove"), "".join(msgInfo), QMessageBox.Yes | QMessageBox.Cancel) @@ -431,7 +431,7 @@ class outlineBasics(QAbstractItemView): # Check that we have at least 2 items if len(items) < 2: - statusMessage(qApp.translate("outlineBasics", + statusMessage(safeTranslate(qApp, "outlineBasics", "Select at least two items. Folders are ignored."), importance=2) return @@ -440,7 +440,7 @@ class outlineBasics(QAbstractItemView): p = items[0].parent() for i in items: if i.parent() != p: - statusMessage(qApp.translate("outlineBasics", + statusMessage(safeTranslate(qApp, "outlineBasics", "All items must be on the same level (share the same parent)."), importance=2) return