update readme due release on codeberg #2
63
setup.sh
63
setup.sh
|
@ -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 %}
|
||||||
|
|
Loading…
Reference in New Issue