diff --git a/setup.sh b/setup.sh index 633a9c0..8ddf160 100644 --- a/setup.sh +++ b/setup.sh @@ -197,22 +197,25 @@ logging.basicConfig() app = Flask(__name__) # Load Languages +import os import json +TRANSLATION_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'translations')) +SUPPORTED_LANGUAGES = ['de', 'en'] TRANSLATIONS = {} -SUPPORTED_LANGUAGES = os.getenv('SUPPORTED_LANGUAGES', 'en').split(',') for lang in SUPPORTED_LANGUAGES: try: - with open(f'translations/{lang}.json', encoding='utf-8') as f: + with open(os.path.join(TRANSLATION_DIR, f'{lang}.json'), encoding='utf-8') as f: TRANSLATIONS[lang] = json.load(f) except Exception: TRANSLATIONS[lang] = {} def translate(key, lang=None, **kwargs): if not lang: - lang = session.get('lang', os.getenv('DEFAULT_LANGUAGE', 'en')) - return TRANSLATIONS.get(lang, {}).get(key, key).format(**kwargs) + lang = session.get('lang', 'en') + value = TRANSLATIONS.get(lang, {}).get(key, key) + return value.format(**kwargs) if kwargs else value csrf = CSRFProtect(app) @@ -269,13 +272,9 @@ def enforce_https(): @app.context_processor def inject_template_vars(): def _(key, **kwargs): - lang = session.get('lang', os.getenv('DEFAULT_LANGUAGE', 'en')) + lang = session.get('lang', 'en') return translate(key, lang, **kwargs) - return dict( - _=_, - get_locale=lambda: session.get('lang', os.getenv('DEFAULT_LANGUAGE', 'en')), - theme='dark' if request.cookies.get('dark_mode') == 'true' else 'light' - ) + return dict(_=_) # DB Models class User(db.Model, UserMixin): @@ -865,7 +864,7 @@ services: - TZ=${TZ} volumes: - ../data:/app/data - - ../translations:/app/translations + - ../translations:/app/translations:rw - ../.env:/app/.env user: "${UID}:${GID}" restart: unless-stopped @@ -881,19 +880,13 @@ find ../data ../translations -type f -exec chmod 664 {} \; # 8. Translation and upgrade scripts cat < "$TRANSLATIONS_DIR/de.json" { - "Game List": "Spieleliste", - "Add New Game": "Neues Spiel hinzufügen", - "Search": "Suche", - "Welcome %(username)s!": "Willkommen %(username)s!" + } JSON_END cat < "$TRANSLATIONS_DIR/en.json" { - "Game List": "Game List", - "Add New Game": "Add New Game", - "Search": "Search", - "Welcome %(username)s!": "Welcome %(username)s!" + } JSON_END @@ -902,11 +895,16 @@ cat <<'SCRIPT_END' > ../translate.sh #!/bin/bash set -e -# Directories and languages TRANSLATION_DIR="./translations" LANGS=("de" "en") -# 1. Create JSON files if they do not yet exist +# Prüfe jq +if ! command -v jq &>/dev/null; then + echo "❌ jq is required. Install with: sudo apt-get install jq" + exit 1 +fi + +# 1. Lege JSON-Dateien an, falls sie fehlen for lang in "${LANGS[@]}"; do file="$TRANSLATION_DIR/$lang.json" if [ ! -f "$file" ]; then @@ -915,26 +913,27 @@ for lang in "${LANGS[@]}"; do fi done -# 2. Extract all strings to be translated from the templates and Python files -STRINGS=$(grep -hoR "_('\([^']*\)')" ./templates ./app.py | sed "s/.*_('\([^']*\)').*/\1/" | sort | uniq) +# 2. Extrahiere alle zu übersetzenden Strings +STRINGS=$(grep -rhoP "_\(\s*['\"](.+?)['\"]\s*\)" steam-gift-manager/templates steam-gift-manager/app.py | \ + sed -E "s/_\(\s*['\"](.+?)['\"]\s*\)/\1/" | sort | uniq) -# 3. Insert new keys into the JSON files without overwriting existing translations +# 3. Ergänze neue Keys in die JSON-Dateien for lang in "${LANGS[@]}"; do file="$TRANSLATION_DIR/$lang.json" tmp="$file.tmp" cp "$file" "$tmp" - for key in $STRINGS; do - # Prüfe, ob der Key schon existiert + while IFS= read -r key; do if ! jq -e --arg k "$key" 'has($k)' "$tmp" >/dev/null; then jq --arg k "$key" '. + {($k): ""}' "$tmp" > "$tmp.new" && mv "$tmp.new" "$tmp" fi - done + done <<< "$STRINGS" mv "$tmp" "$file" echo "Updated $file" done echo "✅ JSON translation files updated. Please enter your translations!" + SCRIPT_END chmod +x ../translate.sh @@ -1046,7 +1045,7 @@ mkdir -p templates static # Base Template cat < templates/base.html - + @@ -1096,13 +1095,13 @@ cat < templates/base.html {% if current_user.is_authenticated %}