I guess we doin cookies now

This commit is contained in:
Ignacio Rivero 2025-03-15 13:57:10 -03:00
parent f42149125c
commit e8fae1a14b
2 changed files with 100 additions and 82 deletions

View File

@ -1,88 +1,106 @@
import os import os
import json import json
from flask import request, session from flask import request, make_response
class Localization: class Localization:
"""Handles localization for IPMPV""" """Handles localization for IPMPV"""
def __init__(self, default_language='en'): def __init__(self, default_language='en'):
"""Initialize the localization system""" """Initialize the localization system"""
self.default_language = default_language self.default_language = default_language
self.translations = {} self.translations = {}
self.available_languages = [] self.available_languages = []
self._load_translations() self.cookie_name = 'ipmpv_language'
self.cookie_max_age = 31536000 # 1 year in seconds
def _load_translations(self): self._load_translations()
"""Load all translation files from the locales directory"""
locales_dir = os.path.join(os.path.dirname(__file__), 'locales') def _load_translations(self):
"""Load all translation files from the locales directory"""
# Create locales directory if it doesn't exist locales_dir = os.path.join(os.path.dirname(__file__), 'locales')
if not os.path.exists(locales_dir):
os.makedirs(locales_dir) # Create locales directory if it doesn't exist
if not os.path.exists(locales_dir):
# Load each translation file os.makedirs(locales_dir)
for filename in os.listdir(locales_dir):
if filename.endswith('.json'): # Load each translation file
language_code = filename.split('.')[0] for filename in os.listdir(locales_dir):
self.available_languages.append(language_code) if filename.endswith('.json'):
language_code = filename.split('.')[0]
with open(os.path.join(locales_dir, filename), 'r', encoding='utf-8') as f: self.available_languages.append(language_code)
self.translations[language_code] = json.load(f)
with open(os.path.join(locales_dir, filename), 'r', encoding='utf-8') as f:
# If no translations are available, create an empty one for the default language self.translations[language_code] = json.load(f)
if not self.translations:
self.available_languages.append(self.default_language) # If no translations are available, create an empty one for the default language
self.translations[self.default_language] = {} if not self.translations:
self.available_languages.append(self.default_language)
def get_language(self): self.translations[self.default_language] = {}
"""Get the current language based on session or browser settings"""
# Check session first def get_language(self):
if 'language' in session: """Get the current language based on cookies or browser settings"""
lang = session['language'] # Check cookie first
if lang in self.available_languages: lang_cookie = request.cookies.get(self.cookie_name)
return lang if lang_cookie and lang_cookie in self.available_languages:
return lang_cookie
# Check browser Accept-Language header
if request.accept_languages: # Check browser Accept-Language header
for lang in request.accept_languages.values(): if request.accept_languages:
if lang[:2] in self.available_languages: for lang in request.accept_languages.values():
session['language'] = lang[:2] if lang[:2] in self.available_languages:
return lang[:2] return lang[:2]
# Fallback to default language # Fallback to default language
return self.default_language return self.default_language
def set_language(self, language_code): def set_language(self, language_code, response=None):
"""Set the current language""" """
if language_code in self.available_languages: Set the current language in a cookie
session['language'] = language_code
return True Args:
return False language_code (str): The language code to set
response (flask.Response, optional): A Flask response object to add the cookie to
def translate(self, key, language=None):
"""Translate a key to the specified or current language""" Returns:
if language is None: bool: Whether the language was set successfully
language = self.get_language() """
if language_code in self.available_languages:
# If the language doesn't exist, use default # If a response was provided, add the cookie to it
if language not in self.translations: if response:
language = self.default_language response.set_cookie(
self.cookie_name,
# If the key exists in the language, return the translation language_code,
if key in self.translations[language]: max_age=self.cookie_max_age,
return self.translations[language][key] path='/',
httponly=True,
# If not found in the current language, try the default language samesite='Strict'
if language != self.default_language and key in self.translations[self.default_language]: )
return self.translations[self.default_language][key] return True
return False
# If still not found, return the key itself
return key def translate(self, key, language=None):
"""Translate a key to the specified or current language"""
if language is None:
language = self.get_language()
# If the language doesn't exist, use default
if language not in self.translations:
language = self.default_language
# If the key exists in the language, return the translation
if key in self.translations[language]:
return self.translations[language][key]
# If not found in the current language, try the default language
if language != self.default_language and key in self.translations[self.default_language]:
return self.translations[self.default_language][key]
# If still not found, return the key itself
return key
# Create a global localization instance # Create a global localization instance
localization = Localization() localization = Localization()
# Helper function to use in templates # Helper function to use in templates
def _(key): def _(key):
"""Shorthand for translating a key""" """Shorthand for translating a key"""
return localization.translate(key) return localization.translate(key)

View File

@ -6,7 +6,7 @@ import re
import subprocess import subprocess
import threading import threading
import flask import flask
from flask import request, jsonify, send_from_directory, session, redirect, url_for from flask import request, jsonify, send_from_directory, redirect, url_for, make_response
from localization import localization, _ from localization import localization, _
from utils import is_valid_url, change_resolution, get_current_resolution, is_wayland, get_or_create_secret_key from utils import is_valid_url, change_resolution, get_current_resolution, is_wayland, get_or_create_secret_key
@ -26,7 +26,6 @@ class IPMPVServer:
self.ipmpv_retroarch_cmd = ipmpv_retroarch_cmd self.ipmpv_retroarch_cmd = ipmpv_retroarch_cmd
self.retroarch_p = None self.retroarch_p = None
self.volume_control = volume_control self.volume_control = volume_control
self.app.secret_key = get_or_create_secret_key()
# Register routes # Register routes
self._register_routes() self._register_routes()
@ -40,8 +39,9 @@ class IPMPVServer:
@self.app.route("/switch_language/<language>") @self.app.route("/switch_language/<language>")
def switch_language(language): def switch_language(language):
localization.set_language(language) response = make_response(redirect(request.referrer or url_for('index')))
return redirect(request.referrer or url_for('index')) localization.set_language(language, response)
return response
@self.app.route("/") @self.app.route("/")
def index(): def index():