ipmpv/localization.py

107 lines
3.2 KiB
Python

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