From 8cde200ed03f38b3933b9ff7728dc466f25cf7f1 Mon Sep 17 00:00:00 2001 From: Oliver Hamlet Date: Tue, 21 May 2024 22:20:00 +0100 Subject: [PATCH] Add script to write strings from translations to prelude.yaml --- README.md | 9 +++++++++ import-strings.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 import-strings.py diff --git a/README.md b/README.md index 5630bd0..88f4f54 100644 --- a/README.md +++ b/README.md @@ -14,3 +14,12 @@ py -m venv .venv pip install -r requirements.txt py extract-strings.py ``` + +It's also possible to overwrite the message text in `prelude.yaml` using the contents of the `translations` directory: + +``` +py -m venv .venv +.\venv\Scripts\activate +pip install -r requirements.txt +py import-strings.py +``` diff --git a/import-strings.py b/import-strings.py new file mode 100644 index 0000000..54a4b7c --- /dev/null +++ b/import-strings.py @@ -0,0 +1,44 @@ +import math +import re +import os + +import yaml + +messages = {} +for f in os.scandir('translations'): + match = re.match(r'messages\.([^\.]+)\.yaml', f.name) + if match: + lang = match.group(1) + with open(f.path, encoding='utf8') as input: + messages[lang] = yaml.safe_load(input) + +lines = [] +with open('prelude.yaml', encoding='utf8') as input: + lines = input.readlines() + + anchor = None + lang = None + for index, line in enumerate(lines): + match = re.search(r' &([^\s]+)$', line) + if match != None: + anchor = match.group(1) + lang = None + text = None + continue + + match = re.search(r'- lang: ([a-zA-Z_]+)', line) + if match != None: + lang = match.group(1) + text = None + continue + + match = re.search(r' text: \'(.+)\'', line) + if match != None and anchor and lang: + # Replace line with a new line for this message + message = yaml.dump(messages[lang][anchor], width=math.inf, allow_unicode=True, default_style="'") + + lines[index] = re.sub(r' text: \'.+\'', f' text: {message.strip()}', line) + + +with open('prelude.yaml', mode='w', encoding='utf8') as output: + output.writelines(lines)