Added system language detection
This commit is contained in:
17
README.md
17
README.md
@@ -4,11 +4,11 @@ BagheeraView is an image viewer specifically designed for the KDE ecosystem. Bui
|
|||||||
|
|
||||||
## 🚀 Key Features
|
## 🚀 Key Features
|
||||||
|
|
||||||
- **Enhanced Baloo Search:** Blazing fast image retrieval using the KDE Baloo indexing framework, featuring advanced capabilities not natively available in Baloo, such as **folder recursive search** and results **text exclusion**.
|
- **Enhanced Baloo Search:** Blazing fast image retrieval using the KDE Baloo indexing framework, featuring advanced capabilities not natively available in Baloo, such as **folder recursive search** and results **text exclusion**, if BagheeraSearch library is available.
|
||||||
|
|
||||||
- **Versatile Thumbnail Grid:** A fluid and responsive browser for large collections, offering both **Flat View**, several **Date View** modes, **Rating View** and **Folder View** modes.
|
- **Versatile Thumbnail Grid:** A fluid and responsive browser for large collections, offering both **Flat View**, several **Date View** modes, **Rating View** and **Folder View** modes.
|
||||||
|
|
||||||
- **Face & Pet Detection:** Integrated computer vision to detect faces and pets within your photos and assign names. Object and Landmark tags are supported to but without computer vision detection.
|
- **Face & Pet Detection:** Integrated computer vision to detect faces and pets within your photos and assign names. Body, Object and Landmark tags are supported too but without computer vision detection.
|
||||||
|
|
||||||
- **Metadata:** A basic viewer for **EXIF, IPTC, and XMP** data.
|
- **Metadata:** A basic viewer for **EXIF, IPTC, and XMP** data.
|
||||||
|
|
||||||
@@ -24,8 +24,7 @@ BagheeraView is an image viewer specifically designed for the KDE ecosystem. Bui
|
|||||||
|
|
||||||
- **KDE Integration:** Baloo search and basic management
|
- **KDE Integration:** Baloo search and basic management
|
||||||
|
|
||||||
- **Metadata Handling:** Advanced image header manipulation to store faces, pets, objects and landmarks and support to file extended attributes
|
- **Metadata Handling:** Advanced image header manipulation to store faces, pets, body, objects and landmarks and support to file extended attributes
|
||||||
|
|
||||||
|
|
||||||
## 🌐 Internationalization (i18n)
|
## 🌐 Internationalization (i18n)
|
||||||
|
|
||||||
@@ -36,7 +35,6 @@ BagheeraView is designed for a global audience with localized interface support.
|
|||||||
- **Galician**
|
- **Galician**
|
||||||
|
|
||||||
- **Spanish**
|
- **Spanish**
|
||||||
|
|
||||||
> **Note:** Following internal configuration standards, all source code labels and developer logs are maintained in English for technical consistency.
|
> **Note:** Following internal configuration standards, all source code labels and developer logs are maintained in English for technical consistency.
|
||||||
|
|
||||||
## ⚙️ Configuration & Persistence
|
## ⚙️ Configuration & Persistence
|
||||||
@@ -49,10 +47,9 @@ BagheeraView is built for workflow continuity. The application stores the user's
|
|||||||
|
|
||||||
- **Interface Language:** The application automatically detects the system locale and applies the corresponding translation on startup or user can decide main language.
|
- **Interface Language:** The application automatically detects the system locale and applies the corresponding translation on startup or user can decide main language.
|
||||||
|
|
||||||
|
|
||||||
## 📥 Installation (Development)
|
## 📥 Installation (Development)
|
||||||
|
|
||||||
Ensure you have at least Python 3.13, the necessary PySide6 dependencies and KDE development headers for Baloo installed on your system. For best integration install at least PySide6 in your system but for better results install all required libraries if they are available in your distro.
|
Ensure you have at least Python 3.13, the necessary PySide6 dependencies and KDE development headers for Baloo installed on your system. For best integration install at least PySide6 in your system but for better results install all required libraries if they are available in your Linux distribution.
|
||||||
|
|
||||||
Bash
|
Bash
|
||||||
|
|
||||||
@@ -73,7 +70,7 @@ BagheeraSearch tool and librery are available at https://git.aynoa.net/ignacio/B
|
|||||||
|
|
||||||
## 📥 Installation (Production with BagheeraSearch)
|
## 📥 Installation (Production with BagheeraSearch)
|
||||||
|
|
||||||
Ensure you have at least Python 3.13, the necessary PySide6 dependencies and KDE development headers for Baloo installed on your system. For best integration install at least PySide6 in your system but for better results install all required libraries if they are available in your distro.
|
Ensure you have at least Python 3.13, the necessary PySide6 dependencies and KDE development headers for Baloo installed on your system. For best integration install at least PySide6 in your system but for better results install all required libraries if they are available in your Linux distribution.
|
||||||
|
|
||||||
Bash
|
Bash
|
||||||
|
|
||||||
@@ -83,6 +80,7 @@ cd /tmp
|
|||||||
git clone https://git.aynoa.net/ignacio/BagheeraSearch.git
|
git clone https://git.aynoa.net/ignacio/BagheeraSearch.git
|
||||||
git clone https://git.aynoa.net/ignacio/BagheeraView.git
|
git clone https://git.aynoa.net/ignacio/BagheeraView.git
|
||||||
|
|
||||||
|
# Create an installation directory
|
||||||
mkdir <a path you like/bagheeraview>
|
mkdir <a path you like/bagheeraview>
|
||||||
cd <a path you like/bagheeraview>
|
cd <a path you like/bagheeraview>
|
||||||
python -m venv --system-site-packages .venv
|
python -m venv --system-site-packages .venv
|
||||||
@@ -98,7 +96,7 @@ python bagheeraview.py
|
|||||||
|
|
||||||
## 📥 Installation (Production without BagheeraSearch)
|
## 📥 Installation (Production without BagheeraSearch)
|
||||||
|
|
||||||
Ensure you have at least Python 3.13, the necessary PySide6 dependencies and KDE development headers for Baloo installed on your system. For best integration install at least PySide6 in your system but for better results install all required libraries if they are available in your distro.
|
Ensure you have at least Python 3.13, the necessary PySide6 dependencies and KDE development headers for Baloo installed on your system. For best integration install at least PySide6 in your system but for better results install all required libraries if they are available in your Linux distribution.
|
||||||
|
|
||||||
Bash
|
Bash
|
||||||
|
|
||||||
@@ -107,6 +105,7 @@ Bash
|
|||||||
cd /tmp
|
cd /tmp
|
||||||
git clone https://git.aynoa.net/ignacio/BagheeraView.git
|
git clone https://git.aynoa.net/ignacio/BagheeraView.git
|
||||||
|
|
||||||
|
# Create an installation directory
|
||||||
mkdir <a path you like/bagheeraview>
|
mkdir <a path you like/bagheeraview>
|
||||||
cd <a path you like/bagheeraview>
|
cd <a path you like/bagheeraview>
|
||||||
python -m venv --system-site-packages .venv
|
python -m venv --system-site-packages .venv
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ Classes:
|
|||||||
MainWindow: The main application window containing the thumbnail grid and docks.
|
MainWindow: The main application window containing the thumbnail grid and docks.
|
||||||
"""
|
"""
|
||||||
__appname__ = "BagheeraView"
|
__appname__ = "BagheeraView"
|
||||||
__version__ = "0.9.14"
|
__version__ = "0.9.15"
|
||||||
__author__ = "Ignacio Serantes"
|
__author__ = "Ignacio Serantes"
|
||||||
__email__ = "kde@aynoa.net"
|
__email__ = "kde@aynoa.net"
|
||||||
__license__ = "LGPL"
|
__license__ = "LGPL"
|
||||||
@@ -53,7 +53,7 @@ from PySide6.QtDBus import QDBusConnection, QDBusMessage, QDBus
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from constants import (
|
from constants import (
|
||||||
APP_CONFIG, CONFIG_PATH, CURRENT_LANGUAGE, DEFAULT_GLOBAL_SHORTCUTS,
|
APP_CONFIG, CONFIG_PATH, DEFAULT_GLOBAL_SHORTCUTS, DEFAULT_LANGUAGE,
|
||||||
DEFAULT_VIEWER_SHORTCUTS, GLOBAL_ACTIONS, HISTORY_PATH, ICON_THEME,
|
DEFAULT_VIEWER_SHORTCUTS, GLOBAL_ACTIONS, HISTORY_PATH, ICON_THEME,
|
||||||
ICON_THEME_FALLBACK, IMAGE_MIME_TYPES, LAYOUTS_DIR, FAVORITES_PATH, PROG_AUTHOR,
|
ICON_THEME_FALLBACK, IMAGE_MIME_TYPES, LAYOUTS_DIR, FAVORITES_PATH, PROG_AUTHOR,
|
||||||
PROG_NAME, PROG_VERSION, RATING_XATTR_NAME, SCANNER_GENERATE_SIZES,
|
PROG_NAME, PROG_VERSION, RATING_XATTR_NAME, SCANNER_GENERATE_SIZES,
|
||||||
@@ -1236,6 +1236,12 @@ class MainWindow(QMainWindow):
|
|||||||
self.favorites_tab.favorites_changed.connect(
|
self.favorites_tab.favorites_changed.connect(
|
||||||
self.shortcut_controller.refresh_favorite_shortcuts)
|
self.shortcut_controller.refresh_favorite_shortcuts)
|
||||||
|
|
||||||
|
# Initialize FileSystemWatcher
|
||||||
|
self.fs_watcher = FileSystemWatcher()
|
||||||
|
self.fs_watcher.file_created.connect(self.on_fs_file_created)
|
||||||
|
self.fs_watcher.file_deleted.connect(self.on_fs_file_deleted)
|
||||||
|
self.fs_watcher.file_modified.connect(self.on_fs_file_modified)
|
||||||
|
|
||||||
self.main_dock.setWidget(self.tags_tabs)
|
self.main_dock.setWidget(self.tags_tabs)
|
||||||
self.addDockWidget(Qt.RightDockWidgetArea, self.main_dock)
|
self.addDockWidget(Qt.RightDockWidgetArea, self.main_dock)
|
||||||
|
|
||||||
@@ -1687,7 +1693,7 @@ class MainWindow(QMainWindow):
|
|||||||
for code, name in SUPPORTED_LANGUAGES.items():
|
for code, name in SUPPORTED_LANGUAGES.items():
|
||||||
action = QAction(name, self, checkable=True)
|
action = QAction(name, self, checkable=True)
|
||||||
action.setData(code)
|
action.setData(code)
|
||||||
if code == CURRENT_LANGUAGE:
|
if code == APP_CONFIG.get("language", DEFAULT_LANGUAGE):
|
||||||
action.setChecked(True)
|
action.setChecked(True)
|
||||||
language_menu.addAction(action)
|
language_menu.addAction(action)
|
||||||
lang_group.addAction(action)
|
lang_group.addAction(action)
|
||||||
@@ -4429,7 +4435,7 @@ class MainWindow(QMainWindow):
|
|||||||
for code, name in SUPPORTED_LANGUAGES.items():
|
for code, name in SUPPORTED_LANGUAGES.items():
|
||||||
action = QAction(name, self, checkable=True)
|
action = QAction(name, self, checkable=True)
|
||||||
action.setData(code)
|
action.setData(code)
|
||||||
if code == CURRENT_LANGUAGE:
|
if code == APP_CONFIG.get("language", DEFAULT_LANGUAGE):
|
||||||
action.setChecked(True)
|
action.setChecked(True)
|
||||||
language_menu.addAction(action)
|
language_menu.addAction(action)
|
||||||
lang_group.addAction(action)
|
lang_group.addAction(action)
|
||||||
@@ -4438,7 +4444,7 @@ class MainWindow(QMainWindow):
|
|||||||
"""Handles language change, saves config, and prompts for restart."""
|
"""Handles language change, saves config, and prompts for restart."""
|
||||||
new_lang = action.data()
|
new_lang = action.data()
|
||||||
# Only save and show message if the language actually changed
|
# Only save and show message if the language actually changed
|
||||||
if new_lang != APP_CONFIG.get("language", CURRENT_LANGUAGE):
|
if new_lang != APP_CONFIG.get("language", DEFAULT_LANGUAGE):
|
||||||
APP_CONFIG["language"] = new_lang
|
APP_CONFIG["language"] = new_lang
|
||||||
constants.save_app_config()
|
constants.save_app_config()
|
||||||
|
|
||||||
@@ -4457,7 +4463,7 @@ def main():
|
|||||||
app = QApplication(sys.argv)
|
app = QApplication(sys.argv)
|
||||||
|
|
||||||
# Increase QPixmapCache limit (default is usually small, ~10MB) to ~100MB
|
# Increase QPixmapCache limit (default is usually small, ~10MB) to ~100MB
|
||||||
QPixmapCache.setCacheLimit(102400)
|
QPixmapCache.setCacheLimit(104857600) # Old value: 102400
|
||||||
|
|
||||||
thread_pool_manager = ThreadPoolManager()
|
thread_pool_manager = ThreadPoolManager()
|
||||||
cache = ThumbnailCache()
|
cache = ThumbnailCache()
|
||||||
|
|||||||
43
constants.py
43
constants.py
@@ -29,7 +29,7 @@ if FORCE_X11:
|
|||||||
# --- CONFIGURATION ---
|
# --- CONFIGURATION ---
|
||||||
PROG_NAME = "Bagheera Image Viewer"
|
PROG_NAME = "Bagheera Image Viewer"
|
||||||
PROG_ID = "bagheeraview"
|
PROG_ID = "bagheeraview"
|
||||||
PROG_VERSION = "0.9.14"
|
PROG_VERSION = "0.9.15-dev"
|
||||||
PROG_AUTHOR = "Ignacio Serantes"
|
PROG_AUTHOR = "Ignacio Serantes"
|
||||||
|
|
||||||
# --- CACHE SETTINGS ---
|
# --- CACHE SETTINGS ---
|
||||||
@@ -341,23 +341,16 @@ DEFAULT_VIEWER_SHORTCUTS = {
|
|||||||
|
|
||||||
# Supported languages
|
# Supported languages
|
||||||
SUPPORTED_LANGUAGES = {
|
SUPPORTED_LANGUAGES = {
|
||||||
|
"system": "System",
|
||||||
"en": "English",
|
"en": "English",
|
||||||
"es": "Español",
|
"es": "Español",
|
||||||
"gl": "Galego"
|
"gl": "Galego"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Default language
|
# Default language for configuration
|
||||||
DEFAULT_LANGUAGE = "en"
|
DEFAULT_LANGUAGE = "system"
|
||||||
# Determine current language:
|
# Fallback language for translations
|
||||||
# 1. Environment variable (for debugging/override)
|
FALLBACK_LANGUAGE = "en"
|
||||||
# 2. Saved configuration
|
|
||||||
# 3. Default
|
|
||||||
CURRENT_LANGUAGE = os.getenv("BAGHEERA_LANG") or \
|
|
||||||
APP_CONFIG.get("language", DEFAULT_LANGUAGE)
|
|
||||||
|
|
||||||
# Ensure the loaded language is supported, otherwise fallback to default
|
|
||||||
if CURRENT_LANGUAGE not in SUPPORTED_LANGUAGES:
|
|
||||||
CURRENT_LANGUAGE = DEFAULT_LANGUAGE
|
|
||||||
|
|
||||||
_UI_TEXTS = {
|
_UI_TEXTS = {
|
||||||
"en": {
|
"en": {
|
||||||
@@ -1770,6 +1763,26 @@ _UI_TEXTS = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Determine which language to use for UI strings
|
||||||
|
def _get_current_language():
|
||||||
|
lang = os.getenv("BAGHEERA_LANG") or APP_CONFIG.get("language", DEFAULT_LANGUAGE)
|
||||||
|
|
||||||
|
if lang == "system":
|
||||||
|
sys_lang = os.getenv("LANG")
|
||||||
|
if sys_lang:
|
||||||
|
# LANG is usually something like 'en_US.UTF-8'
|
||||||
|
lang = sys_lang[0:2].lower()
|
||||||
|
else:
|
||||||
|
lang = FALLBACK_LANGUAGE
|
||||||
|
|
||||||
|
# If the resolved language is not supported by our translation dictionaries,
|
||||||
|
# fallback to English.
|
||||||
|
return lang if lang in _UI_TEXTS else FALLBACK_LANGUAGE
|
||||||
|
|
||||||
|
|
||||||
|
CURRENT_LANGUAGE = _get_current_language()
|
||||||
|
|
||||||
|
|
||||||
class _UITextsProxy:
|
class _UITextsProxy:
|
||||||
"""
|
"""
|
||||||
A proxy class to access UI strings from the _UI_TEXTS dictionary.
|
A proxy class to access UI strings from the _UI_TEXTS dictionary.
|
||||||
@@ -1781,12 +1794,12 @@ class _UITextsProxy:
|
|||||||
"""
|
"""
|
||||||
def __getattr__(self, name):
|
def __getattr__(self, name):
|
||||||
# Get the dictionary for the current language, or fallback to the default.
|
# Get the dictionary for the current language, or fallback to the default.
|
||||||
lang_texts = _UI_TEXTS.get(CURRENT_LANGUAGE, _UI_TEXTS[DEFAULT_LANGUAGE])
|
lang_texts = _UI_TEXTS.get(CURRENT_LANGUAGE, _UI_TEXTS[FALLBACK_LANGUAGE])
|
||||||
# Get the specific string. If not found in the current language,
|
# Get the specific string. If not found in the current language,
|
||||||
# try the default language.
|
# try the default language.
|
||||||
text = lang_texts.get(name)
|
text = lang_texts.get(name)
|
||||||
if text is None:
|
if text is None:
|
||||||
default_texts = _UI_TEXTS[DEFAULT_LANGUAGE]
|
default_texts = _UI_TEXTS[FALLBACK_LANGUAGE]
|
||||||
# Return a placeholder if not found anywhere
|
# Return a placeholder if not found anywhere
|
||||||
text = default_texts.get(name, f"_{name}_")
|
text = default_texts.get(name, f"_{name}_")
|
||||||
return text
|
return text
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "bagheeraview"
|
name = "bagheeraview"
|
||||||
version = "0.9.14"
|
version = "0.9.15"
|
||||||
authors = [
|
authors = [
|
||||||
{ name = "Ignacio Serantes" }
|
{ name = "Ignacio Serantes" }
|
||||||
]
|
]
|
||||||
|
|||||||
2
setup.py
2
setup.py
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
|
|||||||
|
|
||||||
setup(
|
setup(
|
||||||
name="bagheeraview",
|
name="bagheeraview",
|
||||||
version="0.9.14",
|
version="0.9.15",
|
||||||
author="Ignacio Serantes",
|
author="Ignacio Serantes",
|
||||||
description="Bagheera Image Viewer - An image viewer for KDE with Baloo in mind",
|
description="Bagheera Image Viewer - An image viewer for KDE with Baloo in mind",
|
||||||
long_description="A fast image viewer built with PySide6, featuring search and "
|
long_description="A fast image viewer built with PySide6, featuring search and "
|
||||||
|
|||||||
Reference in New Issue
Block a user