mirror of
https://gitlab.com/octtspacc/sitoctt
synced 2025-06-05 22:09:20 +02:00
.
This commit is contained in:
9
Scripts/Translate/Apply.sh
Executable file
9
Scripts/Translate/Apply.sh
Executable file
@ -0,0 +1,9 @@
|
||||
#!/bin/sh
|
||||
. "$(dirname "$(realpath "$0")")/../Lib/Globals.sh"
|
||||
cd "${swd}/../build"
|
||||
|
||||
if [ -n "$(ls ./translate)" ]
|
||||
then cp -r ./translate/* ./content/
|
||||
fi
|
||||
|
||||
cd "${owd}"
|
9
Scripts/Translate/Get.sh
Executable file
9
Scripts/Translate/Get.sh
Executable file
@ -0,0 +1,9 @@
|
||||
#!/bin/sh
|
||||
. "$(dirname "$(realpath "$0")")/../Lib/Globals.sh"
|
||||
cd "${swd}/../build"
|
||||
|
||||
if [ ! -d ./translate ]
|
||||
then git clone --depth 1 --branch "${BranchTranslate}" "${RepoUrl}" ./translate
|
||||
fi
|
||||
|
||||
cd "${owd}"
|
100
Scripts/Translate/Main.py
Executable file
100
Scripts/Translate/Main.py
Executable file
@ -0,0 +1,100 @@
|
||||
#!/usr/bin/env python3
|
||||
DestinationLanguages = ["it", "en"] # "de", "eo", "es", "fr"
|
||||
IncludePaths = ["/"]
|
||||
ExcludePaths = ["/Categories"]
|
||||
|
||||
from os import getcwd, listdir
|
||||
from os.path import dirname, realpath, isfile, isdir
|
||||
from pathlib import Path
|
||||
from translate_shell.translate import translate
|
||||
|
||||
# TODO handle frontmatter properly, some data must be translated (title, ...) but other must not (date, ...)
|
||||
# TODO also somehow handle overriding data for some translation (title, slug, ...)
|
||||
# TODO add warning about automatic translation at the beginning
|
||||
# TODO handle deleted files? (it should probably be done in another sh script, not here)
|
||||
|
||||
def printf(*objects):
|
||||
print(*objects, end='')
|
||||
|
||||
def get_source_language(document_path):
|
||||
return document_path.split('/')[0]
|
||||
|
||||
def make_destination_path(document_path, destination_language):
|
||||
return ('./translate/' + destination_language + '/'
|
||||
+ '/'.join(document_path.split('/')[1:]))
|
||||
|
||||
# TODO check for edit date in already translated documents and update them if needed
|
||||
def is_translation_uptodate(source_path, destination_path):
|
||||
return True
|
||||
|
||||
# TODO handle when the same document is available in multiple source languages?
|
||||
def needs_translation(source_path, destination_language=None):
|
||||
for folder_path in ExcludePaths:
|
||||
if ('/' + '/'.join(source_path.split('/')[1:])).startswith(folder_path + '/'):
|
||||
return False
|
||||
if not open('../content/' + source_path).read().strip():
|
||||
return False
|
||||
if destination_language:
|
||||
destination_path = make_destination_path(source_path, destination_language)
|
||||
if isfile(destination_path) and is_translation_uptodate(source_path, destination_path):
|
||||
return False
|
||||
return True
|
||||
|
||||
def find_documents(folder_path):
|
||||
documents_queue, documents = [], {}
|
||||
for document_path in Path(folder_path).rglob('*.*'):
|
||||
if isfile(document_path):
|
||||
documents_queue.append('/'.join(str(document_path).split('/')[2:]))
|
||||
for document in documents_queue:
|
||||
if needs_translation(document):
|
||||
documents[document] = []
|
||||
for destination_language in list(set(DestinationLanguages) - {get_source_language(document)}):
|
||||
if needs_translation(document, destination_language):
|
||||
documents[document].append(destination_language)
|
||||
return documents
|
||||
|
||||
def translate_document(document_path, documents):
|
||||
printf(f'* {document_path} ->')
|
||||
for destination_language in documents[document_path]:
|
||||
source_language = get_source_language(document_path)
|
||||
printf('', destination_language)
|
||||
try:
|
||||
translated = translate(
|
||||
open(('../content/' + document_path), 'r').read(),
|
||||
destination_language,
|
||||
source_language)
|
||||
if not len(translated.results):
|
||||
raise Exception("Unhandled error")
|
||||
printf('✅')
|
||||
except Exception as exception:
|
||||
printf('❌', exception)
|
||||
continue
|
||||
translated_text = translated.results[0].paraphrase
|
||||
text_header = translated_text.strip().splitlines()[0].strip()
|
||||
translated_preamble = ("\n\n{{< noticeAutomaticTranslation " + source_language + " >}}\n\n")
|
||||
if text_header in ["---", "+++"]:
|
||||
text_tokens = translated_text.split(text_header)
|
||||
translated_text = (text_header + text_tokens[:1] + translated_preamble + text_header.join([''] + text_tokens[2:]))
|
||||
else:
|
||||
translated_text = (translated_preamble + translated_text)
|
||||
destination_path = make_destination_path(document_path, destination_language)
|
||||
Path('/'.join(destination_path.split('/')[:-1])).mkdir(parents=True, exist_ok=True)
|
||||
open(destination_path, 'w').write(translated_text)
|
||||
printf('\n')
|
||||
|
||||
def main():
|
||||
for source_language in listdir('../content'):
|
||||
for folder_path in IncludePaths:
|
||||
documents = find_documents('../content/' + source_language + folder_path)
|
||||
for document_path in documents:
|
||||
if len(documents[document_path]):
|
||||
translate_document(document_path, documents)
|
||||
|
||||
def read_from_scripts(relative_path:str):
|
||||
return open((dirname(realpath(__file__)) + '/../' + relative_path), 'r').read()
|
||||
|
||||
if __name__ == "__main__":
|
||||
globals_text = read_from_scripts('Lib/Globals.sh')
|
||||
exec(globals_text.split('#' + globals_text.splitlines()[0].split('#!')[1] + '!')[0])
|
||||
exec(read_from_scripts('../config.toml'))
|
||||
main()
|
9
Scripts/Translate/Push.sh
Executable file
9
Scripts/Translate/Push.sh
Executable file
@ -0,0 +1,9 @@
|
||||
#!/bin/sh
|
||||
. "$(dirname "$(realpath "$0")")/../Lib/Globals.sh"
|
||||
cd "${swd}/../build"
|
||||
|
||||
cd ./translate
|
||||
git add . && git commit -m . && git push || true
|
||||
cd ..
|
||||
|
||||
cd "${owd}"
|
Reference in New Issue
Block a user