From a152250f1113762223bc56f76f2613d9d896b73d Mon Sep 17 00:00:00 2001 From: frederik Date: Sun, 26 Oct 2025 12:05:42 +0100 Subject: [PATCH] add language helpers --- scripts/utils/helpers.py | 39 ++++++++++++++++++++++++++++++++++++ scripts/utils/maintainer.py | 40 +++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 scripts/utils/maintainer.py diff --git a/scripts/utils/helpers.py b/scripts/utils/helpers.py index ae68cf3..59abfa2 100644 --- a/scripts/utils/helpers.py +++ b/scripts/utils/helpers.py @@ -1,8 +1,10 @@ import datetime import glob +import json import os import re import subprocess +from collections import OrderedDict from configparser import ConfigParser from itertools import chain @@ -11,6 +13,7 @@ from tzlocal import get_localzone _settings = None DB_PATH = os.path.expanduser('~/BirdNET-Pi/scripts/birds.db') +MODEL_PATH = os.path.expanduser('~/BirdNET-Pi/model') ANALYZING_NOW = os.path.expanduser('~/BirdSongs/StreamData/analyzing_now.txt') FONT_DIR = os.path.expanduser('~/BirdNET-Pi/homepage/static') @@ -118,3 +121,39 @@ def get_wav_files(): open_recs = get_open_files_in_dir(rec_dir) files = [file for file in files if file not in open_recs] return files + + +def get_language(language=None): + if language is None: + language = get_settings()['DATABASE_LANG'] + file_name = os.path.join(MODEL_PATH, f'l18n/labels_{language}.json') + with open(file_name) as f: + ret = json.loads(f.read()) + return ret + + +def save_language(labels, language): + file_name = os.path.join(MODEL_PATH, f'l18n/labels_{language}.json') + with open(file_name, 'w') as f: + f.write(json.dumps(OrderedDict(sorted(labels.items())), indent=2, ensure_ascii=False)) + + +def get_model_labels(model=None): + if model is None: + model = get_settings()['MODEL'] + file_name = os.path.join(MODEL_PATH, f'{model}_Labels.txt') + with open(file_name) as f: + labels = [line.strip() for line in f.readlines()] + if labels and labels[0].count('_') == 1: + labels = [re.sub(r'_.+$', '', label) for label in labels] + return labels + + +def set_label_file(): + lang = get_language() + labels = [f'{label}_{lang[label]}\n' for label in get_model_labels()] + file_name = os.path.join(MODEL_PATH, 'labels.txt') + if os.path.islink(file_name): + os.remove(file_name) + with open(file_name, 'w') as f: + f.writelines(labels) diff --git a/scripts/utils/maintainer.py b/scripts/utils/maintainer.py new file mode 100644 index 0000000..17d98a8 --- /dev/null +++ b/scripts/utils/maintainer.py @@ -0,0 +1,40 @@ +import os + +from scripts.utils.helpers import MODEL_PATH, save_language + + +def get_labels(model, language=None): + postfix = '' if language is None else f'_{language}' + file_name = os.path.join(MODEL_PATH, f'labels_{model}/labels{postfix}.txt') + with open(file_name) as f: + ret = [line.strip() for line in f.readlines()] + return ret + + +def as_dict(labels, den="_", key=0, value=1): + return {label.split(den)[key]: label.split(den)[value] for label in labels} + + +def create_language(language): + en_l18n = as_dict(get_labels('l18n', 'en')) + l18n = as_dict(get_labels('l18n', language)) + new_language = as_dict(get_labels('nm', language)) + + for sci_name, com_name in l18n.items(): + if sci_name not in new_language or new_language[sci_name] == sci_name: + new_language[sci_name] = com_name + continue + + # now check if the l18n version is translated + if com_name != new_language[sci_name] and new_language[sci_name] == en_l18n[sci_name]: + print(f'changing {new_language[sci_name]} -> {com_name}') + new_language[sci_name] = com_name + + save_language(new_language, language) + + +def create_all_languages(): + languages = ['af', 'ar', 'ca', 'cs', 'da', 'de', 'en', 'es', 'et', 'fi', 'fr', 'hr', 'hu', 'id', 'is', 'it', 'ja', + 'ko', 'lt', 'lv', 'nl', 'no', 'pl', 'pt', 'ro', 'ru', 'sk', 'sl', 'sr', 'sv', 'th', 'tr', 'uk', 'zh'] + for language in languages: + create_language(language)