nextcloud-android/scripts/metadata/generate_metadata.py
Andy Scherzinger e3d57e7c42
Update SPDX header to reflect correct state
Resolves #12920

Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2024-04-30 12:18:45 +02:00

135 lines
4.3 KiB
Python

#!/usr/bin/env python3
# Author: Torsten Grote
# License: GPLv3 or later
# copied on 2017/11/06 from https://github.com/grote/Transportr/blob/master/fastlane/generate_metadata.py
# adapted by Tobias Kaminsky
# SPDX-FileCopyrightText: 2017 Torsten Grote
# SPDX-FileCopyrightText: 2017-2018 Tobias Kaminsky <tobias@kaminsky.me>
# SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only
import codecs
import os
import shutil
from xml.etree import ElementTree
XML_PATH = '../../app/src/main/res'
METADATA_PATH = '../../src/generic/fastlane/metadata/android/'
METADATA_DEV_PATH = '../../src/versionDev/fastlane/metadata/android/'
DEFAULT_LANG = 'en-US'
LANG_MAP = {
'values': 'en-US',
'values-en-rGB': 'en-GB',
'values-ca': 'ca',
'values-cs': 'cs-CZ',
'values-de': 'de-DE',
'values-es': 'es-ES',
'values-fr': 'fr-FR',
'values-hu': 'hu-HU',
'values-it': 'it-IT',
'values-pt-rBR': 'pt-BR',
'values-pt-rPT': 'pt-PT',
'values-ta': 'ta-IN',
'values-sv': 'sv-SE',
'values-sq-rAL': 'sq-AL',
'values-sq-rMK': 'sq-MK',
'values-iw-rIL': 'iw-IL',
'values-ar': 'ar-AR',
'values-bg-rBG': 'bg-BG',
'values-da': 'da-DK',
'values-fi-rFI': 'fi-FI',
'values-gl-rES': 'gl-ES',
'values-tr': 'tr-TR',
'values-uk': 'uk-UK',
'values-vi': 'vi-VI',
'values-ro': 'ro-RO',
'values-ou': 'ru-RU',
'values-sr': 'sr-SR',
'values-pl': 'pl-PL',
'values-el': 'el-GR',
'values-ko': 'ko-KR',
'values-nl': 'nl-NL',
'values-ja': 'ja-JP',
'values-no-rNO': 'no-NO',
'values-eu': 'eu-ES',
'values-lt-rLT': 'lt-LT',
'values-zh-rKN': 'zh-HK',
'values-zk': 'zk-CN',
'values-is': 'is-IS',
'values-id': 'id-ID',
'values-cs-rCZ': 'cs-CZ',
'values-sl': 'sl-SL',
'values-fa': 'fa-FA'
}
PATH = os.path.dirname(os.path.realpath(__file__))
def main():
path = os.path.join(PATH, XML_PATH)
for entry in os.listdir(path):
directory = os.path.join(path, entry)
if not os.path.isdir(directory) or entry not in LANG_MAP.keys():
continue
strings_file = os.path.join(directory, 'strings.xml')
if not os.path.isfile(strings_file):
print("Error: %s does not exist" % strings_file)
continue
print()
print(LANG_MAP[entry])
print("Parsing %s..." % strings_file)
e = ElementTree.parse(strings_file).getroot()
short_desc = e.find('.//string[@name="store_short_desc"]')
full_desc = e.find('.//string[@name="store_full_desc"]')
short_dev_desc = e.find('.//string[@name="store_short_dev_desc"]')
full_dev_desc = e.find('.//string[@name="store_full_dev_desc"]')
if short_desc is not None:
save_file(short_desc.text, LANG_MAP[entry], 'short_description.txt', False)
if short_dev_desc is not None:
save_file(short_dev_desc.text, LANG_MAP[entry], 'short_description.txt', True)
if full_desc is not None:
save_file(full_desc.text, LANG_MAP[entry], 'full_description.txt', False)
if full_dev_desc is not None:
save_file(full_dev_desc.text, LANG_MAP[entry], 'full_description.txt', True)
def save_file(text, directory, filename, dev):
if dev:
directory_path = os.path.join(PATH, METADATA_DEV_PATH, directory)
else:
directory_path = os.path.join(PATH, METADATA_PATH, directory)
if not os.path.exists(directory_path):
os.makedirs(directory_path)
if filename == 'short_description.txt':
limit = 80
else:
limit = 0
text = clean_text(text, limit)
check_title(directory_path)
file_path = os.path.join(directory_path, filename)
print("Writing %s..." % file_path)
with codecs.open(file_path, 'w', 'utf-8') as f:
f.write(text)
def clean_text(text, limit=0):
text = text.replace('\\\'', '\'').replace('\\n', '\n')
if limit != 0 and len(text) > limit:
print("Warning: Short Description longer than 80 characters, truncating...")
text = text[:limit]
return text
def check_title(directory):
title_path = os.path.join(directory, 'title.txt')
if os.path.exists(title_path):
return
default_title_path = os.path.join(directory, '..', DEFAULT_LANG, 'title.txt')
shutil.copy(default_title_path, title_path)
if __name__ == "__main__":
main()