Compare commits

..

No commits in common. "b1aee9e5b8b2224d6f7428a753095da24ecb7016" and "d3eb37ebff3c6d9805884b0594c911f2ef9c16db" have entirely different histories.

7 changed files with 123 additions and 133 deletions

View file

@ -63,6 +63,7 @@ cd steam-gift-manager
```bash ```bash
git clone https://git.nocci.it/nocci/GameKeyManager git clone https://git.nocci.it/nocci/GameKeyManager
cd steam-gift-manager
``` ```
### 2. **Setup Docker** ### 2. **Setup Docker**

View file

@ -1,13 +1,13 @@
#!/bin/bash #!/bin/bash
set -e set -e
# Colors # Color definitions
RED='\033[1;31m' RED='\033[1;31m'
GREEN='\033[1;32m' GREEN='\033[1;32m'
YELLOW='\033[1;33m' YELLOW='\033[1;33m'
NC='\033[0m' NC='\033[0m'
# 1. Docker check (incl. Arch Linux) # 1. Docker check (including Arch Linux)
if ! command -v docker &>/dev/null; then if ! command -v docker &>/dev/null; then
echo -e "${RED}❗ Docker is not installed.${NC}" echo -e "${RED}❗ Docker is not installed.${NC}"
read -p "Would you like to install Docker automatically now? [y/N]: " install_docker read -p "Would you like to install Docker automatically now? [y/N]: " install_docker
@ -23,7 +23,7 @@ if ! command -v docker &>/dev/null; then
rm get-docker.sh rm get-docker.sh
fi fi
# Docker group membership prüfen # Check Docker group membership
if ! groups | grep -q '\bdocker\b'; then if ! groups | grep -q '\bdocker\b'; then
echo -e "${YELLOW}⚠️ Your user is not in the docker group. Adding now...${NC}" echo -e "${YELLOW}⚠️ Your user is not in the docker group. Adding now...${NC}"
sudo usermod -aG docker $USER sudo usermod -aG docker $USER
@ -37,7 +37,7 @@ if ! command -v docker &>/dev/null; then
fi fi
fi fi
# 2. Check Docker compose (V1 und V2 Plugin, incl. Arch Support) # 2. Docker Compose check (V1 and V2 plugin, with Arch support)
DOCKER_COMPOSE_CMD="" DOCKER_COMPOSE_CMD=""
if command -v docker-compose &>/dev/null; then if command -v docker-compose &>/dev/null; then
DOCKER_COMPOSE_CMD="docker-compose" DOCKER_COMPOSE_CMD="docker-compose"
@ -74,12 +74,13 @@ else
fi fi
fi fi
# Configuration # Configuration
PROJECT_DIR="steam-gift-manager" PROJECT_DIR="steam-gift-manager"
TRANSLATIONS_DIR="$PWD/translations" TRANSLATIONS_DIR="../translations"
DATA_DIR="$PWD/data" DATA_DIR="../data"
# 1. Create folders # 1. Create project folder & translations folder
mkdir -p "$PROJECT_DIR"/{templates,static} mkdir -p "$PROJECT_DIR"/{templates,static}
mkdir -p "$TRANSLATIONS_DIR"/de/LC_MESSAGES mkdir -p "$TRANSLATIONS_DIR"/de/LC_MESSAGES
mkdir -p "$TRANSLATIONS_DIR"/en/LC_MESSAGES mkdir -p "$TRANSLATIONS_DIR"/en/LC_MESSAGES
@ -110,7 +111,7 @@ pillow
gunicorn gunicorn
EOL EOL
# 3. .env Datei in Parent-VFolder # 3. Create .env file in parent directory
cd .. cd ..
SECRET_KEY=$(python3 -c 'import secrets; print(secrets.token_hex(24))') SECRET_KEY=$(python3 -c 'import secrets; print(secrets.token_hex(24))')
REDEEM_SECRET=$(python3 -c 'import secrets; print(secrets.token_hex(16))') REDEEM_SECRET=$(python3 -c 'import secrets; print(secrets.token_hex(16))')
@ -153,11 +154,13 @@ MATRIX_ACCESS_TOKEN=""
MATRIX_ROOM_ID="" MATRIX_ROOM_ID=""
EOL EOL
# Back to project directory
cd $PROJECT_DIR cd $PROJECT_DIR
# 4. app.py (the main app) # 4. app.py (the main app)
cat <<'PYTHON_END' > app.py cat <<'PYTHON_END' > app.py
import os import os
import logging
import warnings import warnings
from sqlalchemy.exc import LegacyAPIWarning from sqlalchemy.exc import LegacyAPIWarning
warnings.simplefilter("ignore", category=LegacyAPIWarning) warnings.simplefilter("ignore", category=LegacyAPIWarning)
@ -199,11 +202,8 @@ from reportlab.lib.utils import ImageReader
from reportlab.lib.units import cm, inch, mm from reportlab.lib.units import cm, inch, mm
from io import BytesIO from io import BytesIO
import reportlab.lib import reportlab.lib
import logging
logging.basicConfig()
logging.getLogger('babel').setLevel(logging.DEBUG)
app = Flask(__name__)
app = Flask(__name__)
csrf = CSRFProtect(app) csrf = CSRFProtect(app)
convention = { convention = {
@ -223,19 +223,14 @@ load_dotenv(override=True)
# App-Configuration # App-Configuration
app.config.update( app.config.update(
SECRET_KEY=os.getenv('SECRET_KEY'), SECRET_KEY=os.getenv('SECRET_KEY'),
SQLALCHEMY_DATABASE_URI='sqlite:////app/data/games.db', SQLALCHEMY_DATABASE_URI=('sqlite:////app/data/games.db'),
SQLALCHEMY_TRACK_MODIFICATIONS=False, SQLALCHEMY_TRACK_MODIFICATIONS=False,
BABEL_DEFAULT_LOCALE=os.getenv('BABEL_DEFAULT_LOCALE', 'en'), BABEL_DEFAULT_LOCALE=os.getenv('BABEL_DEFAULT_LOCALE'),
BABEL_SUPPORTED_LOCALES=os.getenv('BABEL_SUPPORTED_LOCALES', 'de,en').split(','), BABEL_SUPPORTED_LOCALES=os.getenv('BABEL_SUPPORTED_LOCALES').split(','),
BABEL_TRANSLATION_DIRECTORIES=os.path.join(app.root_path, 'translations'), BABEL_TRANSLATION_DIRECTORIES=os.getenv('BABEL_TRANSLATION_DIRECTORIES'),
SESSION_COOKIE_SECURE=os.getenv('SESSION_COOKIE_SECURE', 'False') == 'True', SESSION_COOKIE_SECURE=os.getenv('SESSION_COOKIE_SECURE') == 'True',
SESSION_COOKIE_SAMESITE='Lax', WTF_CSRF_ENABLED=os.getenv('CSRF_ENABLED') == 'True',
PERMANENT_SESSION_LIFETIME=timedelta(days=30), REGISTRATION_ENABLED=os.getenv('REGISTRATION_ENABLED', 'True').lower() == 'true'
SESSION_REFRESH_EACH_REQUEST=False,
WTF_CSRF_ENABLED=os.getenv('CSRF_ENABLED', 'True') == 'True',
REGISTRATION_ENABLED=os.getenv('REGISTRATION_ENABLED', 'True').lower() == 'true',
SEND_FILE_MAX_AGE_DEFAULT=int(os.getenv('SEND_FILE_MAX_AGE_DEFAULT', 0)),
TEMPLATES_AUTO_RELOAD=os.getenv('TEMPLATES_AUTO_RELOAD', 'True') == 'True'
) )
interval_hours = int(os.getenv('CHECK_EXPIRING_KEYS_INTERVAL_HOURS', 12)) interval_hours = int(os.getenv('CHECK_EXPIRING_KEYS_INTERVAL_HOURS', 12))
@ -257,11 +252,6 @@ def get_locale():
return session['lang'] return session['lang']
return request.accept_languages.best_match(app.config['BABEL_SUPPORTED_LOCALES']) return request.accept_languages.best_match(app.config['BABEL_SUPPORTED_LOCALES'])
@app.before_request
def reload_translations():
if app.config['DEBUG']:
babel.reload()
@app.context_processor @app.context_processor
def inject_template_vars(): def inject_template_vars():
return dict( return dict(
@ -728,13 +718,6 @@ def redeem_page(token):
redeem_token=redeem_token, redeem_token=redeem_token,
platform_link='https://store.steampowered.com/account/registerkey?key=' if game.steam_appid else 'https://www.gog.com/redeem') platform_link='https://store.steampowered.com/account/registerkey?key=' if game.steam_appid else 'https://www.gog.com/redeem')
@app.route('/debug-session')
def debug_session():
return jsonify({
'session_lang': session.get('lang'),
'config_locales': app.config['BABEL_SUPPORTED_LOCALES']
})
# Benachrichtigungsfunktionen # Benachrichtigungsfunktionen
def send_pushover_notification(user, game): def send_pushover_notification(user, game):
"""Sendet Pushover-Benachrichtigung für ablaufenden Key""" """Sendet Pushover-Benachrichtigung für ablaufenden Key"""
@ -914,44 +897,46 @@ services:
- TZ=${TZ} - TZ=${TZ}
volumes: volumes:
- ../data:/app/data - ../data:/app/data
- ../translations:/app/translations:rw - ../translations:/app/translations
- ../.env:/app/.env - ../.env:/app/.env
user: "${UID}:${GID}" user: "1000:1000"
restart: unless-stopped restart: unless-stopped
COMPOSE_END COMPOSE_END
# 7. Directories and permissions # 7. Directories and permissions
mkdir -p ../data ../translations mkdir -p ../data ../translations
chmod -R a+rwX ../data ../translations chmod -R a+rwX ../data ../translations
find ../data ../translations -type d -exec chmod 775 {} \;
find ../data ../translations -type f -exec chmod 664 {} \;
# 8. Translation and upgrade scripts # 8. Translation and upgrade scripts
cat <<'SCRIPT_END' > ../translate.sh cat <<'SCRIPT_END' > ../translate.sh
#!/bin/bash #!/bin/bash
set -e set -e
# 0.1 Change to the project directory (where docker-compose.yml is located)
cd "$(dirname "$0")/steam-gift-manager" cd "$(dirname "$0")/steam-gift-manager"
declare -a locales=("de" "en") declare -A locales=(
["de"]="de"
["en"]="en"
)
# 1. POT-Datei aktualisieren # create POT-file
docker-compose run --rm steam-manager pybabel extract -F babel.cfg -o translations/messages.pot . docker-compose exec steam-manager pybabel extract -F babel.cfg -o translations/messages.pot .
# 2. PO files for each language # Check for each language and initialize if necessary
for lang in "${locales[@]}"; do for lang in "${!locales[@]}"; do
docker-compose run --rm steam-manager pybabel update \ if [ ! -f "translations/${locales[$lang]}/LC_MESSAGES/messages.po" ]; then
-i translations/messages.pot \ docker-compose exec steam-manager pybabel init \
-d translations \ -i translations/messages.pot \
-l $lang --previous -d translations \
-l "${locales[$lang]}"
fi
done done
# 3. Compile MO files (without fuzzy entries) # Update and compile translations
docker-compose run --rm steam-manager pybabel compile -d translations docker-compose exec steam-manager pybabel update -i translations/messages.pot -d translations
docker-compose exec steam-manager pybabel compile -d translations
echo "✅ Translations successfully updated!" echo "✅ Translations updated!"
SCRIPT_END SCRIPT_END
chmod +x ../translate.sh chmod +x ../translate.sh
@ -1020,8 +1005,6 @@ 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">
<!-- DEBUG: Current locale {{ get_locale() }} -->
<div hidden id="locale-debug" data-locale="{{ get_locale() }}"></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 get_locale() == 'de' %} Deutsch {% elif get_locale() == 'en' %} English {% else %} Sprache {% endif %}
</button> </button>

View file

@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2025-04-29 15:53+0000\n" "POT-Creation-Date: 2025-04-29 13:06+0000\n"
"PO-Revision-Date: 2025-04-29 15:42+0000\n" "PO-Revision-Date: 2025-04-29 13:06+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: de\n" "Language: de\n"
"Language-Team: de <LL@li.org>\n" "Language-Team: de <LL@li.org>\n"
@ -18,63 +18,63 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.17.0\n" "Generated-By: Babel 2.17.0\n"
#: app.py:194 #: app.py:187
msgid "Invalid credentials" msgid "Invalid credentials"
msgstr "Ungültige Anmeldedaten" msgstr "Ungültige Anmeldedaten"
#: app.py:200 #: app.py:193
msgid "No new registrations. They are deactivated!" msgid "No new registrations. They are deactivated!"
msgstr "Keine neuen Registrierungen. Sie sind deaktiviert!" msgstr "Upps. Keine neuen Registrierungen, sorry!"
#: app.py:208 #: app.py:201
msgid "Username already exists" msgid "Username already exists"
msgstr "Benutzername existiert bereits" msgstr "Benutzername existiert bereits"
#: app.py:234 #: app.py:227
msgid "Current passwort is wrong" msgid "Current passwort is wrong"
msgstr "Aktuelles Passwort ist falsch" msgstr "Das aktuelle Passwort ist falsch"
#: app.py:238 #: app.py:231
msgid "New Passwords are not matching" msgid "New Passwords are not matching"
msgstr "Neue Passwörter stimmen nicht überein" msgstr "Die neuen Passwörter stimmen nicht überein"
#: app.py:243 #: app.py:236
msgid "Password changed successfully" msgid "Password changed successfully"
msgstr "Passwort erfolgreich geändert" msgstr "Passwort erfolgreich geändert"
#: app.py:273 #: app.py:266
msgid "Game added successfully!" msgid "Game added successfully!"
msgstr "Spiel erfolgreich hinzugefügt!" msgstr "Spiel erfolgreich hinzugefügt!"
#: app.py:278 #: app.py:271
msgid "Steam Key already exists!" msgid "Steam Key already exists!"
msgstr "Steam-Key existiert bereits!" msgstr "Game-Key existiert bereits!"
#: app.py:281 app.py:325 #: app.py:274 app.py:318
msgid "Error: " msgid "Error: "
msgstr "Fehler: " msgstr "Fehler: "
#: app.py:320 #: app.py:313
msgid "Changes saved!" msgid "Changes saved!"
msgstr "Änderungen gespeichert!" msgstr "Änderungen gespeichert!"
#: app.py:408 #: app.py:401
msgid "Game List (without Keys)" msgid "Game List (without Keys)"
msgstr "Spieleliste (ohne Keys)" msgstr "Spieleliste (ohne Keys)"
#: app.py:501 #: app.py:494
#, python-format #, python-format
msgid "%(new)d new games imported, %(dup)d skipped duplicates" msgid "%(new)d new games imported, %(dup)d skipped duplicates"
msgstr "%(new)d neue Spiele importiert, %(dup)d Duplikate übersprungen" msgstr "%(new)d neue Spiele importiert, %(dup)d Duplikate übersprungen"
#: app.py:505 #: app.py:498
#, python-format #, python-format
msgid "Import error: %(error)s" msgid "Import error: %(error)s"
msgstr "Importfehler: %(error)s" msgstr "Importfehler: %(error)s"
#: app.py:509 #: app.py:502
msgid "Please upload a valid CSV file." msgid "Please upload a valid CSV file."
msgstr "Bitte eine gültige CSV-Datei hochladen." msgstr "Bitte lade eine gültige CSV-Datei hoch."
#: templates/add_game.html:4 templates/index.html:9 #: templates/add_game.html:4 templates/index.html:9
msgid "Add New Game" msgid "Add New Game"
@ -86,27 +86,32 @@ msgstr "Name"
#: templates/add_game.html:13 templates/edit_game.html:13 #: templates/add_game.html:13 templates/edit_game.html:13
msgid "Game Key" msgid "Game Key"
msgstr "Spiele-Key" msgstr "Spiel-Key"
#: templates/add_game.html:17 templates/edit_game.html:21 templates/index.html:21 #: templates/add_game.html:17 templates/edit_game.html:21
#: templates/index.html:21
msgid "Status" msgid "Status"
msgstr "Status" msgstr "Status"
#: templates/add_game.html:19 templates/edit_game.html:23 templates/index.html:41 #: templates/add_game.html:19 templates/edit_game.html:23
#: templates/index.html:41
msgid "Not redeemed" msgid "Not redeemed"
msgstr "Nicht eingelöst" msgstr "Nicht eingelöst"
#: templates/add_game.html:20 templates/edit_game.html:24 templates/index.html:43 #: templates/add_game.html:20 templates/edit_game.html:24
#: templates/index.html:43
msgid "Gifted" msgid "Gifted"
msgstr ""
#: templates/add_game.html:21 templates/edit_game.html:25
#: templates/index.html:45
msgid "Redeemed"
msgstr "Verschenkt" msgstr "Verschenkt"
#: templates/add_game.html:21 templates/edit_game.html:25 templates/index.html:45 #: templates/add_game.html:25 templates/edit_game.html:29
msgid "Redeemed" #: templates/index.html:23
msgstr "Eingelöst"
#: templates/add_game.html:25 templates/edit_game.html:29 templates/index.html:23
msgid "Redeem by" msgid "Redeem by"
msgstr "Einzulösen bis" msgstr "Einzulösen vor"
#: templates/add_game.html:29 templates/edit_game.html:33 #: templates/add_game.html:29 templates/edit_game.html:33
msgid "Recipient" msgid "Recipient"
@ -124,13 +129,14 @@ msgstr "Notizen"
msgid "Save" msgid "Save"
msgstr "Speichern" msgstr "Speichern"
#: templates/add_game.html:42 templates/edit_game.html:61 templates/import.html:12 #: templates/add_game.html:42 templates/edit_game.html:61
#: templates/import.html:12
msgid "Cancel" msgid "Cancel"
msgstr "Abbrechen" msgstr "Abbrechen"
#: templates/base.html:7 #: templates/base.html:7
msgid "Game Key Manager" msgid "Game Key Manager"
msgstr "Game-Key-Verwaltung" msgstr "Game Key Manager"
#: templates/base.html:23 #: templates/base.html:23
msgid "Search" msgid "Search"
@ -138,13 +144,13 @@ msgstr "Suche"
#: templates/base.html:31 #: templates/base.html:31
msgid "Dark Mode" msgid "Dark Mode"
msgstr "Dunkler Modus" msgstr "Dark Mode"
#: templates/base.html:46 templates/login.html:16 templates/register.html:15 #: templates/base.html:44 templates/login.html:16 templates/register.html:15
msgid "Password" msgid "Password"
msgstr "Passwort" msgstr "Passwort"
#: templates/base.html:49 #: templates/base.html:47
msgid "Logout" msgid "Logout"
msgstr "Abmelden" msgstr "Abmelden"
@ -170,7 +176,7 @@ msgstr "Spiel bearbeiten"
#: templates/edit_game.html:17 #: templates/edit_game.html:17
msgid "Steam AppID (optional)" msgid "Steam AppID (optional)"
msgstr "Steam-AppID (optional)" msgstr "Steam AppID (optional)"
#: templates/edit_game.html:47 #: templates/edit_game.html:47
msgid "Active Redeem Link" msgid "Active Redeem Link"
@ -178,7 +184,7 @@ msgstr "Aktiver Einlöse-Link"
#: templates/edit_game.html:54 #: templates/edit_game.html:54
msgid "Expires at" msgid "Expires at"
msgstr "Ablaufdatum" msgstr "Läuft ab"
#: templates/import.html:4 #: templates/import.html:4
msgid "Import Games" msgid "Import Games"
@ -226,7 +232,7 @@ msgstr "Aktionen"
#: templates/index.html:63 #: templates/index.html:63
msgid "Generate redeem link" msgid "Generate redeem link"
msgstr "Einlöse-Link generieren" msgstr "Geschenk-Link generieren"
#: templates/index.html:70 #: templates/index.html:70
msgid "Really delete?" msgid "Really delete?"
@ -234,7 +240,7 @@ msgstr "Wirklich löschen?"
#: templates/index.html:96 #: templates/index.html:96
msgid "Redeem link copied to clipboard!" msgid "Redeem link copied to clipboard!"
msgstr "Einlöse-Link in die Zwischenablage kopiert!" msgstr "Geschenk-Link in die Zwischenablage kopiert!"
#: templates/index.html:100 #: templates/index.html:100
msgid "Error generating link" msgid "Error generating link"
@ -254,7 +260,7 @@ msgstr "Benutzername"
#: templates/login.html:22 #: templates/login.html:22
msgid "No account yet? Register" msgid "No account yet? Register"
msgstr "Noch kein Konto? Jetzt registrieren" msgstr "Noch kein Konto? Registrieren"
#: templates/redeem.html:16 #: templates/redeem.html:16
msgid "Your Key:" msgid "Your Key:"
@ -262,7 +268,7 @@ msgstr "Dein Key:"
#: templates/redeem.html:22 #: templates/redeem.html:22
msgid "Redeem now on" msgid "Redeem now on"
msgstr "Jetzt einlösen bei" msgstr "Jetzt einlösen auf"
#: templates/redeem.html:26 #: templates/redeem.html:26
msgid "This page will expire in" msgid "This page will expire in"

View file

@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2025-04-29 15:53+0000\n" "POT-Creation-Date: 2025-04-29 13:06+0000\n"
"PO-Revision-Date: 2025-04-29 15:42+0000\n" "PO-Revision-Date: 2025-04-29 13:06+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: en\n" "Language: en\n"
"Language-Team: en <LL@li.org>\n" "Language-Team: en <LL@li.org>\n"
@ -18,61 +18,61 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.17.0\n" "Generated-By: Babel 2.17.0\n"
#: app.py:194 #: app.py:187
msgid "Invalid credentials" msgid "Invalid credentials"
msgstr "" msgstr ""
#: app.py:200 #: app.py:193
msgid "No new registrations. They are deactivated!" msgid "No new registrations. They are deactivated!"
msgstr "" msgstr ""
#: app.py:208 #: app.py:201
msgid "Username already exists" msgid "Username already exists"
msgstr "" msgstr ""
#: app.py:234 #: app.py:227
msgid "Current passwort is wrong" msgid "Current passwort is wrong"
msgstr "" msgstr ""
#: app.py:238 #: app.py:231
msgid "New Passwords are not matching" msgid "New Passwords are not matching"
msgstr "" msgstr ""
#: app.py:243 #: app.py:236
msgid "Password changed successfully" msgid "Password changed successfully"
msgstr "" msgstr ""
#: app.py:273 #: app.py:266
msgid "Game added successfully!" msgid "Game added successfully!"
msgstr "" msgstr ""
#: app.py:278 #: app.py:271
msgid "Steam Key already exists!" msgid "Steam Key already exists!"
msgstr "" msgstr ""
#: app.py:281 app.py:325 #: app.py:274 app.py:318
msgid "Error: " msgid "Error: "
msgstr "" msgstr ""
#: app.py:320 #: app.py:313
msgid "Changes saved!" msgid "Changes saved!"
msgstr "" msgstr ""
#: app.py:408 #: app.py:401
msgid "Game List (without Keys)" msgid "Game List (without Keys)"
msgstr "" msgstr ""
#: app.py:501 #: app.py:494
#, python-format #, python-format
msgid "%(new)d new games imported, %(dup)d skipped duplicates" msgid "%(new)d new games imported, %(dup)d skipped duplicates"
msgstr "" msgstr ""
#: app.py:505 #: app.py:498
#, python-format #, python-format
msgid "Import error: %(error)s" msgid "Import error: %(error)s"
msgstr "" msgstr ""
#: app.py:509 #: app.py:502
msgid "Please upload a valid CSV file." msgid "Please upload a valid CSV file."
msgstr "" msgstr ""
@ -146,11 +146,11 @@ msgstr ""
msgid "Dark Mode" msgid "Dark Mode"
msgstr "" msgstr ""
#: templates/base.html:46 templates/login.html:16 templates/register.html:15 #: templates/base.html:44 templates/login.html:16 templates/register.html:15
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: templates/base.html:49 #: templates/base.html:47
msgid "Logout" msgid "Logout"
msgstr "" msgstr ""

View file

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2025-04-29 15:53+0000\n" "POT-Creation-Date: 2025-04-29 13:06+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -17,61 +17,61 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.17.0\n" "Generated-By: Babel 2.17.0\n"
#: app.py:194 #: app.py:187
msgid "Invalid credentials" msgid "Invalid credentials"
msgstr "" msgstr ""
#: app.py:200 #: app.py:193
msgid "No new registrations. They are deactivated!" msgid "No new registrations. They are deactivated!"
msgstr "" msgstr ""
#: app.py:208 #: app.py:201
msgid "Username already exists" msgid "Username already exists"
msgstr "" msgstr ""
#: app.py:234 #: app.py:227
msgid "Current passwort is wrong" msgid "Current passwort is wrong"
msgstr "" msgstr ""
#: app.py:238 #: app.py:231
msgid "New Passwords are not matching" msgid "New Passwords are not matching"
msgstr "" msgstr ""
#: app.py:243 #: app.py:236
msgid "Password changed successfully" msgid "Password changed successfully"
msgstr "" msgstr ""
#: app.py:273 #: app.py:266
msgid "Game added successfully!" msgid "Game added successfully!"
msgstr "" msgstr ""
#: app.py:278 #: app.py:271
msgid "Steam Key already exists!" msgid "Steam Key already exists!"
msgstr "" msgstr ""
#: app.py:281 app.py:325 #: app.py:274 app.py:318
msgid "Error: " msgid "Error: "
msgstr "" msgstr ""
#: app.py:320 #: app.py:313
msgid "Changes saved!" msgid "Changes saved!"
msgstr "" msgstr ""
#: app.py:408 #: app.py:401
msgid "Game List (without Keys)" msgid "Game List (without Keys)"
msgstr "" msgstr ""
#: app.py:501 #: app.py:494
#, python-format #, python-format
msgid "%(new)d new games imported, %(dup)d skipped duplicates" msgid "%(new)d new games imported, %(dup)d skipped duplicates"
msgstr "" msgstr ""
#: app.py:505 #: app.py:498
#, python-format #, python-format
msgid "Import error: %(error)s" msgid "Import error: %(error)s"
msgstr "" msgstr ""
#: app.py:509 #: app.py:502
msgid "Please upload a valid CSV file." msgid "Please upload a valid CSV file."
msgstr "" msgstr ""
@ -145,11 +145,11 @@ msgstr ""
msgid "Dark Mode" msgid "Dark Mode"
msgstr "" msgstr ""
#: templates/base.html:46 templates/login.html:16 templates/register.html:15 #: templates/base.html:44 templates/login.html:16 templates/register.html:15
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: templates/base.html:49 #: templates/base.html:47
msgid "Logout" msgid "Logout"
msgstr "" msgstr ""