From b50132e255f81594bf7615e1c7f4f6577601a587 Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Tue, 16 Feb 2021 22:02:59 +0100 Subject: [PATCH] Add support for project language file --- nw/assets/lang/project_en.json | 105 +++++++++++++++++++++++++++++++++ nw/config.py | 2 + nw/core/project.py | 30 ++++++++++ 3 files changed, 137 insertions(+) create mode 100644 nw/assets/lang/project_en.json diff --git a/nw/assets/lang/project_en.json b/nw/assets/lang/project_en.json new file mode 100644 index 00000000..e1bfbb37 --- /dev/null +++ b/nw/assets/lang/project_en.json @@ -0,0 +1,105 @@ +{ + "Synopsis": "Synopsis", + "Comment": "Comment", + "Notes": "Notes", + "0": "Zero", + "1": "One", + "2": "Two", + "3": "Three", + "4": "Four", + "5": "Five", + "6": "Six", + "7": "Seven", + "8": "Eight", + "9": "Nine", + "10": "Ten", + "11": "Eleven", + "12": "Twelve", + "13": "Thirteen", + "14": "Fourteen", + "15": "Fifteen", + "16": "Sixteen", + "17": "Seventeen", + "18": "Eighteen", + "19": "Nineteen", + "20": "Twenty", + "21": "Twenty-One", + "22": "Twenty-Two", + "23": "Twenty-Three", + "24": "Twenty-Four", + "25": "Twenty-Five", + "26": "Twenty-Six", + "27": "Twenty-Seven", + "28": "Twenty-Eight", + "29": "Twenty-Nine", + "30": "Thirty", + "31": "Thirty-One", + "32": "Thirty-Two", + "33": "Thirty-Three", + "34": "Thirty-Four", + "35": "Thirty-Five", + "36": "Thirty-Six", + "37": "Thirty-Seven", + "38": "Thirty-Eight", + "39": "Thirty-Nine", + "40": "Forty", + "41": "Forty-One", + "42": "Forty-Two", + "43": "Forty-Three", + "44": "Forty-Four", + "45": "Forty-Five", + "46": "Forty-Six", + "47": "Forty-Seven", + "48": "Forty-Eight", + "49": "Forty-Nine", + "50": "Fifty", + "51": "Fifty-One", + "52": "Fifty-Two", + "53": "Fifty-Three", + "54": "Fifty-Four", + "55": "Fifty-Five", + "56": "Fifty-Six", + "57": "Fifty-Seven", + "58": "Fifty-Eight", + "59": "Fifty-Nine", + "60": "Sixty", + "61": "Sixty-One", + "62": "Sixty-Two", + "63": "Sixty-Three", + "64": "Sixty-Four", + "65": "Sixty-Five", + "66": "Sixty-Six", + "67": "Sixty-Seven", + "68": "Sixty-Eight", + "69": "Sixty-Nine", + "70": "Seventy", + "71": "Seventy-One", + "72": "Seventy-Two", + "73": "Seventy-Three", + "74": "Seventy-Four", + "75": "Seventy-Five", + "76": "Seventy-Six", + "77": "Seventy-Seven", + "78": "Seventy-Eight", + "79": "Seventy-Nine", + "80": "Eighty", + "81": "Eighty-One", + "82": "Eighty-Two", + "83": "Eighty-Three", + "84": "Eighty-Four", + "85": "Eighty-Five", + "86": "Eighty-Six", + "87": "Eighty-Seven", + "88": "Eighty-Eight", + "89": "Eighty-Nine", + "90": "Ninety", + "91": "Ninety-One", + "92": "Ninety-Two", + "93": "Ninety-Three", + "94": "Ninety-Four", + "95": "Ninety-Five", + "96": "Ninety-Six", + "97": "Ninety-Seven", + "98": "Ninety-Eight", + "99": "Ninety-Nine" +} \ No newline at end of file diff --git a/nw/config.py b/nw/config.py index 58229ea5..1f5799b9 100644 --- a/nw/config.py +++ b/nw/config.py @@ -73,6 +73,7 @@ class Config: self.themeRoot = None # The full path to the nw/assets/themes folder self.dictPath = None # The full path to the nw/assets/dict folder self.iconPath = None # The full path to the nw/assets/icons folder + self.langPath = None # The full path to the nw/assets/lang folder self.helpPath = None # The full path to the novelwriter .qhc help file # Runtime Settings and Variables @@ -288,6 +289,7 @@ class Config: self.themeRoot = os.path.join(self.assetPath, "themes") self.dictPath = os.path.join(self.assetPath, "dict") self.iconPath = os.path.join(self.assetPath, "icons") + self.langPath = os.path.join(self.assetPath, "lang") self.appIcon = os.path.join(self.iconPath, "novelwriter.svg") logger.verbose("App path: %s" % self.appPath) diff --git a/nw/core/project.py b/nw/core/project.py index fcb675ae..bd31f1ea 100644 --- a/nw/core/project.py +++ b/nw/core/project.py @@ -27,6 +27,7 @@ along with this program. If not, see . import nw import logging import os +import json import shutil from lxml import etree @@ -58,6 +59,7 @@ class NWProject(): # Core Elements self.optState = OptionState(self) # Project-specific GUI options self.projTree = NWTree(self) # The project tree + self.langData = {} # Localisation data # Project Status self.projOpened = 0 # The time stamp of when the project file was opened @@ -605,6 +607,10 @@ class NWProject(): self.theParent.setStatus("Opened Project: %s" % self.projName) self._scanProjectFolder() + if self.projLang is None: + self._loadProjectLocalisation(self.mainConf.guiLang) + else: + self._loadProjectLocalisation(self.projLang) self.currWCount = self.lastWCount self.projOpened = time() @@ -1201,6 +1207,30 @@ class NWProject(): # Internal Functions ## + def _loadProjectLocalisation(self, theLang): + """Load the language data for the current project language. + """ + lngShort = theLang.split("_")[0] + loadFile = os.path.join(self.mainConf.langPath, "project_en.json") + chkFile1 = os.path.join(self.mainConf.langPath, "project_%s.json" % theLang) + chkFile2 = os.path.join(self.mainConf.langPath, "project_%s.json" % lngShort) + if os.path.isfile(chkFile1): + loadFile = chkFile1 + elif os.path.isfile(chkFile2): + loadFile = chkFile2 + + try: + with open(loadFile, mode="r", encoding="utf8") as inFile: + self.langData = json.load(inFile) + logger.debug("Loaded project language file: %s" % os.path.basename(loadFile)) + + except Exception: + logger.error("Failed to load index file") + nw.logException() + return False + + return True + def _readLockFile(self): """Reads the lock file in the project folder. """