update readme due release on codeberg #2

Open
nocci wants to merge 26 commits from dev into main
1 changed files with 31 additions and 32 deletions
Showing only changes of commit 8ac8e839c7 - Show all commits

View File

@ -197,22 +197,25 @@ logging.basicConfig()
app = Flask(__name__) app = Flask(__name__)
# Load Languages # Load Languages
import os
import json import json
TRANSLATION_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'translations'))
SUPPORTED_LANGUAGES = ['de', 'en']
TRANSLATIONS = {} TRANSLATIONS = {}
SUPPORTED_LANGUAGES = os.getenv('SUPPORTED_LANGUAGES', 'en').split(',')
for lang in SUPPORTED_LANGUAGES: for lang in SUPPORTED_LANGUAGES:
try: 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) TRANSLATIONS[lang] = json.load(f)
except Exception: except Exception:
TRANSLATIONS[lang] = {} TRANSLATIONS[lang] = {}
def translate(key, lang=None, **kwargs): def translate(key, lang=None, **kwargs):
if not lang: if not lang:
lang = session.get('lang', os.getenv('DEFAULT_LANGUAGE', 'en')) lang = session.get('lang', 'en')
return TRANSLATIONS.get(lang, {}).get(key, key).format(**kwargs) value = TRANSLATIONS.get(lang, {}).get(key, key)
return value.format(**kwargs) if kwargs else value
csrf = CSRFProtect(app) csrf = CSRFProtect(app)
@ -269,13 +272,9 @@ def enforce_https():
@app.context_processor @app.context_processor
def inject_template_vars(): def inject_template_vars():
def _(key, **kwargs): def _(key, **kwargs):
lang = session.get('lang', os.getenv('DEFAULT_LANGUAGE', 'en')) lang = session.get('lang', 'en')
return translate(key, lang, **kwargs) return translate(key, lang, **kwargs)
return dict( return dict(_=_)
_=_,
get_locale=lambda: session.get('lang', os.getenv('DEFAULT_LANGUAGE', 'en')),
theme='dark' if request.cookies.get('dark_mode') == 'true' else 'light'
)
# DB Models # DB Models
class User(db.Model, UserMixin): class User(db.Model, UserMixin):
@ -865,7 +864,7 @@ services:
- TZ=${TZ} - TZ=${TZ}
volumes: volumes:
- ../data:/app/data - ../data:/app/data
- ../translations:/app/translations - ../translations:/app/translations:rw
- ../.env:/app/.env - ../.env:/app/.env
user: "${UID}:${GID}" user: "${UID}:${GID}"
restart: unless-stopped restart: unless-stopped
@ -881,19 +880,13 @@ find ../data ../translations -type f -exec chmod 664 {} \;
# 8. Translation and upgrade scripts # 8. Translation and upgrade scripts
cat <<JSON_END > "$TRANSLATIONS_DIR/de.json" cat <<JSON_END > "$TRANSLATIONS_DIR/de.json"
{ {
"Game List": "Spieleliste",
"Add New Game": "Neues Spiel hinzufügen",
"Search": "Suche",
"Welcome %(username)s!": "Willkommen %(username)s!"
} }
JSON_END JSON_END
cat <<JSON_END > "$TRANSLATIONS_DIR/en.json" cat <<JSON_END > "$TRANSLATIONS_DIR/en.json"
{ {
"Game List": "Game List",
"Add New Game": "Add New Game",
"Search": "Search",
"Welcome %(username)s!": "Welcome %(username)s!"
} }
JSON_END JSON_END
@ -902,11 +895,16 @@ cat <<'SCRIPT_END' > ../translate.sh
#!/bin/bash #!/bin/bash
set -e set -e
# Directories and languages
TRANSLATION_DIR="./translations" TRANSLATION_DIR="./translations"
LANGS=("de" "en") 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 for lang in "${LANGS[@]}"; do
file="$TRANSLATION_DIR/$lang.json" file="$TRANSLATION_DIR/$lang.json"
if [ ! -f "$file" ]; then if [ ! -f "$file" ]; then
@ -915,26 +913,27 @@ for lang in "${LANGS[@]}"; do
fi fi
done done
# 2. Extract all strings to be translated from the templates and Python files # 2. Extrahiere alle zu übersetzenden Strings
STRINGS=$(grep -hoR "_('\([^']*\)')" ./templates ./app.py | sed "s/.*_('\([^']*\)').*/\1/" | sort | uniq) 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 for lang in "${LANGS[@]}"; do
file="$TRANSLATION_DIR/$lang.json" file="$TRANSLATION_DIR/$lang.json"
tmp="$file.tmp" tmp="$file.tmp"
cp "$file" "$tmp" cp "$file" "$tmp"
for key in $STRINGS; do while IFS= read -r key; do
# Prüfe, ob der Key schon existiert
if ! jq -e --arg k "$key" 'has($k)' "$tmp" >/dev/null; then if ! jq -e --arg k "$key" 'has($k)' "$tmp" >/dev/null; then
jq --arg k "$key" '. + {($k): ""}' "$tmp" > "$tmp.new" && mv "$tmp.new" "$tmp" jq --arg k "$key" '. + {($k): ""}' "$tmp" > "$tmp.new" && mv "$tmp.new" "$tmp"
fi fi
done done <<< "$STRINGS"
mv "$tmp" "$file" mv "$tmp" "$file"
echo "Updated $file" echo "Updated $file"
done done
echo "✅ JSON translation files updated. Please enter your translations!" echo "✅ JSON translation files updated. Please enter your translations!"
SCRIPT_END SCRIPT_END
chmod +x ../translate.sh chmod +x ../translate.sh
@ -1046,7 +1045,7 @@ mkdir -p templates static
# Base Template # Base Template
cat <<HTML_END > templates/base.html cat <<HTML_END > templates/base.html
<!DOCTYPE html> <!DOCTYPE html>
<html lang="{{ get_locale() if get_locale() in ['en', 'de'] else 'en' }}" data-bs-theme="{{ theme }}"> <html lang="{{ session.get('lang', 'en') }}" data-bs-theme="{{ theme }}">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
@ -1096,13 +1095,13 @@ cat <<HTML_END > templates/base.html
<label class="form-check-label" for="darkModeSwitch">{{ _('Dark Mode') }}</label> <label class="form-check-label" for="darkModeSwitch">{{ _('Dark Mode') }}</label>
</div> </div>
<div class="dropdown ms-3"> <div class="dropdown ms-3">
<div hidden id="locale-debug" data-locale="{{ get_locale() }}"></div> <div hidden id="locale-debug" data-locale="{{ session.get('lang', 'en') }}"></div>
<button class="btn btn-outline-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false"> <button class="btn btn-outline-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
{% if get_locale() == 'de' %} Deutsch {% elif get_locale() == 'en' %} English {% else %} Sprache {% endif %} {% if session.get('lang', 'en') == 'de' %} Deutsch {% elif session.get('lang', 'en') == 'en' %} English {% else %} Sprache {% endif %}
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item {% if get_locale() == 'de' %}active{% endif %}" href="{{ url_for('set_lang', lang='de') }}">Deutsch</a></li> <li><a class="dropdown-item {% if session.get('lang', 'en') == 'de' %}active{% endif %}" href="{{ url_for('set_lang', lang='de') }}">Deutsch</a></li>
<li><a class="dropdown-item {% if get_locale() == 'en' %}active{% endif %}" href="{{ url_for('set_lang', lang='en') }}">English</a></li> <li><a class="dropdown-item {% if session.get('lang', 'en') == 'en' %}active{% endif %}" href="{{ url_for('set_lang', lang='en') }}">English</a></li>
</ul> </ul>
</div> </div>
{% if current_user.is_authenticated %} {% if current_user.is_authenticated %}