i18n: Update settings navigation and section translations

- Restructure settings.sections and settings.nav in en.json
- Restore translations for existing keys across all locales (de, es, fr, he, ja, ko, ru, zh-CN, zh-TW)
- Add translations for new keys: metadata, library
- Translate autoOrganize section titles
- Complete all TODO translations in settings.search
This commit is contained in:
Will Miao
2026-02-25 13:16:38 +08:00
parent 0f5b442ec4
commit 41d2f9d8b4
11 changed files with 314 additions and 378 deletions

View File

@@ -255,33 +255,28 @@
"clipboardFallback": "Einstellungspfad: {{path}}" "clipboardFallback": "Einstellungspfad: {{path}}"
}, },
"sections": { "sections": {
"apiConfiguration": "[TODO: Translate] API Configuration",
"contentFiltering": "Inhaltsfilterung", "contentFiltering": "Inhaltsfilterung",
"videoSettings": "Video-Einstellungen", "videoSettings": "Video-Einstellungen",
"layoutSettings": "Layout-Einstellungen", "layoutSettings": "Layout-Einstellungen",
"folderSettings": "Standard-Roots",
"priorityTags": "Prioritäts-Tags",
"downloadPathTemplates": "Download-Pfad-Vorlagen",
"exampleImages": "Beispielbilder",
"updateFlags": "Update-Markierungen",
"autoOrganize": "Auto-organize",
"misc": "Verschiedenes", "misc": "Verschiedenes",
"metadataArchive": "Metadaten-Archiv-Datenbank", "folderSettings": "Standard-Roots",
"storageLocation": "Einstellungsort", "downloadPathTemplates": "Download-Pfad-Vorlagen",
"priorityTags": "Prioritäts-Tags",
"updateFlags": "Update-Markierungen",
"exampleImages": "Beispielbilder",
"autoOrganize": "Auto-Organisierung",
"metadata": "Metadaten",
"proxySettings": "Proxy-Einstellungen" "proxySettings": "Proxy-Einstellungen"
}, },
"nav": { "nav": {
"general": "Allgemein", "general": "Allgemein",
"interface": "Oberfläche", "interface": "Oberfläche",
"download": "Download", "library": "Bibliothek"
"organization": "Organisation",
"system": "System",
"network": "Netzwerk"
}, },
"search": { "search": {
"placeholder": "[TODO: Translate] Search settings...", "placeholder": "Einstellungen durchsuchen...",
"clear": "[TODO: Translate] Clear search", "clear": "Suche löschen",
"noResults": "[TODO: Translate] No settings found matching \"{query}\"" "noResults": "Keine Einstellungen gefunden für \"{query}\""
}, },
"storage": { "storage": {
"locationLabel": "Portabler Modus", "locationLabel": "Portabler Modus",

View File

@@ -255,28 +255,23 @@
"clipboardFallback": "Settings path: {{path}}" "clipboardFallback": "Settings path: {{path}}"
}, },
"sections": { "sections": {
"apiConfiguration": "API Configuration",
"contentFiltering": "Content Filtering", "contentFiltering": "Content Filtering",
"videoSettings": "Video Settings", "videoSettings": "Video Settings",
"layoutSettings": "Layout Settings", "layoutSettings": "Layout Settings",
"misc": "Miscellaneous",
"folderSettings": "Default Roots", "folderSettings": "Default Roots",
"priorityTags": "Priority Tags",
"downloadPathTemplates": "Download Path Templates", "downloadPathTemplates": "Download Path Templates",
"exampleImages": "Example Images", "priorityTags": "Priority Tags",
"updateFlags": "Update Flags", "updateFlags": "Update Flags",
"exampleImages": "Example Images",
"autoOrganize": "Auto-organize", "autoOrganize": "Auto-organize",
"misc": "Misc.", "metadata": "Metadata",
"metadataArchive": "Metadata Archive Database",
"storageLocation": "Settings Location",
"proxySettings": "Proxy Settings" "proxySettings": "Proxy Settings"
}, },
"nav": { "nav": {
"general": "General", "general": "General",
"interface": "Interface", "interface": "Interface",
"download": "Download", "library": "Library"
"organization": "Organization",
"system": "System",
"network": "Network"
}, },
"search": { "search": {
"placeholder": "Search settings...", "placeholder": "Search settings...",

View File

@@ -255,33 +255,28 @@
"clipboardFallback": "Ruta de configuración: {{path}}" "clipboardFallback": "Ruta de configuración: {{path}}"
}, },
"sections": { "sections": {
"apiConfiguration": "[TODO: Translate] API Configuration",
"contentFiltering": "Filtrado de contenido", "contentFiltering": "Filtrado de contenido",
"videoSettings": "Configuración de video", "videoSettings": "Configuración de video",
"layoutSettings": "Configuración de diseño", "layoutSettings": "Configuración de diseño",
"folderSettings": "Raíces predeterminadas",
"priorityTags": "Etiquetas prioritarias",
"downloadPathTemplates": "Plantillas de rutas de descarga",
"exampleImages": "Imágenes de ejemplo",
"updateFlags": "Indicadores de actualización",
"autoOrganize": "Auto-organize",
"misc": "Varios", "misc": "Varios",
"metadataArchive": "Base de datos de archivo de metadatos", "folderSettings": "Raíces predeterminadas",
"storageLocation": "Ubicación de ajustes", "downloadPathTemplates": "Plantillas de rutas de descarga",
"priorityTags": "Etiquetas prioritarias",
"updateFlags": "Indicadores de actualización",
"exampleImages": "Imágenes de ejemplo",
"autoOrganize": "Organización automática",
"metadata": "Metadatos",
"proxySettings": "Configuración de proxy" "proxySettings": "Configuración de proxy"
}, },
"nav": { "nav": {
"general": "General", "general": "General",
"interface": "Interfaz", "interface": "Interfaz",
"download": "Descarga", "library": "Biblioteca"
"organization": "Organización",
"system": "Sistema",
"network": "Red"
}, },
"search": { "search": {
"placeholder": "[TODO: Translate] Search settings...", "placeholder": "Buscar ajustes...",
"clear": "[TODO: Translate] Clear search", "clear": "Limpiar búsqueda",
"noResults": "[TODO: Translate] No settings found matching \"{query}\"" "noResults": "No se encontraron ajustes que coincidan con \"{query}\""
}, },
"storage": { "storage": {
"locationLabel": "Modo portátil", "locationLabel": "Modo portátil",

View File

@@ -255,33 +255,28 @@
"clipboardFallback": "Chemin des paramètres: {{path}}" "clipboardFallback": "Chemin des paramètres: {{path}}"
}, },
"sections": { "sections": {
"apiConfiguration": "[TODO: Translate] API Configuration",
"contentFiltering": "Filtrage du contenu", "contentFiltering": "Filtrage du contenu",
"videoSettings": "Paramètres vidéo", "videoSettings": "Paramètres vidéo",
"layoutSettings": "Paramètres d'affichage", "layoutSettings": "Paramètres d'affichage",
"folderSettings": "Racines par défaut",
"priorityTags": "Étiquettes prioritaires",
"downloadPathTemplates": "Modèles de chemin de téléchargement",
"exampleImages": "Images d'exemple",
"updateFlags": "Indicateurs de mise à jour",
"autoOrganize": "Auto-organize",
"misc": "Divers", "misc": "Divers",
"metadataArchive": "Base de données d'archive des métadonnées", "folderSettings": "Racines par défaut",
"storageLocation": "Emplacement des paramètres", "downloadPathTemplates": "Modèles de chemin de téléchargement",
"priorityTags": "Étiquettes prioritaires",
"updateFlags": "Indicateurs de mise à jour",
"exampleImages": "Images d'exemple",
"autoOrganize": "Organisation automatique",
"metadata": "Métadonnées",
"proxySettings": "Paramètres du proxy" "proxySettings": "Paramètres du proxy"
}, },
"nav": { "nav": {
"general": "Général", "general": "Général",
"interface": "Interface", "interface": "Interface",
"download": "Téléchargement", "library": "Bibliothèque"
"organization": "Organisation",
"system": "Système",
"network": "Réseau"
}, },
"search": { "search": {
"placeholder": "[TODO: Translate] Search settings...", "placeholder": "Rechercher dans les paramètres...",
"clear": "[TODO: Translate] Clear search", "clear": "Effacer la recherche",
"noResults": "[TODO: Translate] No settings found matching \"{query}\"" "noResults": "Aucun paramètre trouvé correspondant à \"{query}\""
}, },
"storage": { "storage": {
"locationLabel": "Mode portable", "locationLabel": "Mode portable",

View File

@@ -255,33 +255,28 @@
"clipboardFallback": "נתיב ההגדרות: {{path}}" "clipboardFallback": "נתיב ההגדרות: {{path}}"
}, },
"sections": { "sections": {
"apiConfiguration": "[TODO: Translate] API Configuration",
"contentFiltering": "סינון תוכן", "contentFiltering": "סינון תוכן",
"videoSettings": "הגדרות וידאו", "videoSettings": "הגדרות וידאו",
"layoutSettings": "הגדרות פריסה", "layoutSettings": "הגדרות פריסה",
"folderSettings": "תיקיות ברירת מחדל",
"priorityTags": "תגיות עדיפות",
"downloadPathTemplates": "תבניות נתיב הורדה",
"exampleImages": "תמונות דוגמה",
"updateFlags": "תגי עדכון",
"autoOrganize": "Auto-organize",
"misc": "שונות", "misc": "שונות",
"metadataArchive": "מסד נתונים של ארכיון מטא-דאטה", "folderSettings": "תיקיות ברירת מחדל",
"storageLocation": "מיקום ההגדרות", "downloadPathTemplates": "תבניות נתיב הורדה",
"priorityTags": "תגיות עדיפות",
"updateFlags": "תגי עדכון",
"exampleImages": "תמונות דוגמה",
"autoOrganize": "ארגון אוטומטי",
"metadata": "מטא-נתונים",
"proxySettings": "הגדרות פרוקסי" "proxySettings": "הגדרות פרוקסי"
}, },
"nav": { "nav": {
"general": "כללי", "general": "כללי",
"interface": "ממשק", "interface": "ממשק",
"download": "הורדה", "library": "ספרייה"
"organization": "ארגון",
"system": "מערכת",
"network": "רשת"
}, },
"search": { "search": {
"placeholder": "[TODO: Translate] Search settings...", "placeholder": "חיפוש בהגדרות...",
"clear": "[TODO: Translate] Clear search", "clear": "נקה חיפוש",
"noResults": "[TODO: Translate] No settings found matching \"{query}\"" "noResults": "לא נמצאו הגדרות תואמות ל-\"{query}\""
}, },
"storage": { "storage": {
"locationLabel": "מצב נייד", "locationLabel": "מצב נייד",

View File

@@ -255,33 +255,28 @@
"clipboardFallback": "設定パス: {{path}}" "clipboardFallback": "設定パス: {{path}}"
}, },
"sections": { "sections": {
"apiConfiguration": "[TODO: Translate] API Configuration",
"contentFiltering": "コンテンツフィルタリング", "contentFiltering": "コンテンツフィルタリング",
"videoSettings": "動画設定", "videoSettings": "動画設定",
"layoutSettings": "レイアウト設定", "layoutSettings": "レイアウト設定",
"folderSettings": "デフォルトルート",
"priorityTags": "優先タグ",
"downloadPathTemplates": "ダウンロードパステンプレート",
"exampleImages": "例画像",
"updateFlags": "アップデートフラグ",
"autoOrganize": "Auto-organize",
"misc": "その他", "misc": "その他",
"metadataArchive": "メタデータアーカイブデータベース", "folderSettings": "デフォルトルート",
"storageLocation": "設定の場所", "downloadPathTemplates": "ダウンロードパステンプレート",
"priorityTags": "優先タグ",
"updateFlags": "アップデートフラグ",
"exampleImages": "例画像",
"autoOrganize": "自動整理",
"metadata": "メタデータ",
"proxySettings": "プロキシ設定" "proxySettings": "プロキシ設定"
}, },
"nav": { "nav": {
"general": "一般", "general": "一般",
"interface": "インターフェース", "interface": "インターフェース",
"download": "ダウンロード", "library": "ライブラリ"
"organization": "整理",
"system": "システム",
"network": "ネットワーク"
}, },
"search": { "search": {
"placeholder": "[TODO: Translate] Search settings...", "placeholder": "設定を検索...",
"clear": "[TODO: Translate] Clear search", "clear": "検索をクリア",
"noResults": "[TODO: Translate] No settings found matching \"{query}\"" "noResults": "\"{query}\" に一致する設定が見つかりません"
}, },
"storage": { "storage": {
"locationLabel": "ポータブルモード", "locationLabel": "ポータブルモード",

View File

@@ -255,33 +255,28 @@
"clipboardFallback": "설정 경로: {{path}}" "clipboardFallback": "설정 경로: {{path}}"
}, },
"sections": { "sections": {
"apiConfiguration": "[TODO: Translate] API Configuration",
"contentFiltering": "콘텐츠 필터링", "contentFiltering": "콘텐츠 필터링",
"videoSettings": "비디오 설정", "videoSettings": "비디오 설정",
"layoutSettings": "레이아웃 설정", "layoutSettings": "레이아웃 설정",
"folderSettings": "기본 루트",
"priorityTags": "우선순위 태그",
"downloadPathTemplates": "다운로드 경로 템플릿",
"exampleImages": "예시 이미지",
"updateFlags": "업데이트 표시",
"autoOrganize": "Auto-organize",
"misc": "기타", "misc": "기타",
"metadataArchive": "메타데이터 아카이브 데이터베이스", "folderSettings": "기본 루트",
"storageLocation": "설정 위치", "downloadPathTemplates": "다운로드 경로 템플릿",
"priorityTags": "우선순위 태그",
"updateFlags": "업데이트 표시",
"exampleImages": "예시 이미지",
"autoOrganize": "자동 정리",
"metadata": "메타데이터",
"proxySettings": "프록시 설정" "proxySettings": "프록시 설정"
}, },
"nav": { "nav": {
"general": "일반", "general": "일반",
"interface": "인터페이스", "interface": "인터페이스",
"download": "다운로드", "library": "라이브러리"
"organization": "정리",
"system": "시스템",
"network": "네트워크"
}, },
"search": { "search": {
"placeholder": "[TODO: Translate] Search settings...", "placeholder": "설정 검색...",
"clear": "[TODO: Translate] Clear search", "clear": "검색 지우기",
"noResults": "[TODO: Translate] No settings found matching \"{query}\"" "noResults": "\"{query}\"와 일치하는 설정을 찾을 수 없습니다"
}, },
"storage": { "storage": {
"locationLabel": "휴대용 모드", "locationLabel": "휴대용 모드",

View File

@@ -255,33 +255,28 @@
"clipboardFallback": "Путь настроек: {{path}}" "clipboardFallback": "Путь настроек: {{path}}"
}, },
"sections": { "sections": {
"apiConfiguration": "[TODO: Translate] API Configuration",
"contentFiltering": "Фильтрация контента", "contentFiltering": "Фильтрация контента",
"videoSettings": "Настройки видео", "videoSettings": "Настройки видео",
"layoutSettings": "Настройки макета", "layoutSettings": "Настройки макета",
"folderSettings": "Корневые папки",
"priorityTags": "Приоритетные теги",
"downloadPathTemplates": "Шаблоны путей загрузки",
"exampleImages": "Примеры изображений",
"updateFlags": "Метки обновлений",
"autoOrganize": "Auto-organize",
"misc": "Разное", "misc": "Разное",
"metadataArchive": "Архив метаданных", "folderSettings": "Корневые папки",
"storageLocation": "Расположение настроек", "downloadPathTemplates": "Шаблоны путей загрузки",
"priorityTags": "Приоритетные теги",
"updateFlags": "Метки обновлений",
"exampleImages": "Примеры изображений",
"autoOrganize": "Автоорганизация",
"metadata": "Метаданные",
"proxySettings": "Настройки прокси" "proxySettings": "Настройки прокси"
}, },
"nav": { "nav": {
"general": "Общее", "general": "Общее",
"interface": "Интерфейс", "interface": "Интерфейс",
"download": "Загрузка", "library": "Библиотека"
"organization": "Организация",
"system": "Система",
"network": "Сеть"
}, },
"search": { "search": {
"placeholder": "[TODO: Translate] Search settings...", "placeholder": "Поиск в настройках...",
"clear": "[TODO: Translate] Clear search", "clear": "Очистить поиск",
"noResults": "[TODO: Translate] No settings found matching \"{query}\"" "noResults": "Настройки, соответствующие \"{query}\", не найдены"
}, },
"storage": { "storage": {
"locationLabel": "Портативный режим", "locationLabel": "Портативный режим",

View File

@@ -255,33 +255,28 @@
"clipboardFallback": "设置路径:{{path}}" "clipboardFallback": "设置路径:{{path}}"
}, },
"sections": { "sections": {
"apiConfiguration": "[TODO: Translate] API Configuration",
"contentFiltering": "内容过滤", "contentFiltering": "内容过滤",
"videoSettings": "视频设置", "videoSettings": "视频设置",
"layoutSettings": "布局设置", "layoutSettings": "布局设置",
"folderSettings": "默认根目录",
"priorityTags": "优先标签",
"downloadPathTemplates": "下载路径模板",
"exampleImages": "示例图片",
"updateFlags": "更新标记",
"autoOrganize": "Auto-organize",
"misc": "其他", "misc": "其他",
"metadataArchive": "元数据归档数据库", "folderSettings": "默认根目录",
"storageLocation": "设置位置", "downloadPathTemplates": "下载路径模板",
"priorityTags": "优先标签",
"updateFlags": "更新标记",
"exampleImages": "示例图片",
"autoOrganize": "自动整理",
"metadata": "元数据",
"proxySettings": "代理设置" "proxySettings": "代理设置"
}, },
"nav": { "nav": {
"general": "通用", "general": "通用",
"interface": "界面", "interface": "界面",
"download": "下载", "library": "库"
"organization": "整理",
"system": "系统",
"network": "网络"
}, },
"search": { "search": {
"placeholder": "[TODO: Translate] Search settings...", "placeholder": "搜索设置...",
"clear": "[TODO: Translate] Clear search", "clear": "清除搜索",
"noResults": "[TODO: Translate] No settings found matching \"{query}\"" "noResults": "未找到匹配 \"{query}\" 的设置"
}, },
"storage": { "storage": {
"locationLabel": "便携模式", "locationLabel": "便携模式",

View File

@@ -255,33 +255,28 @@
"clipboardFallback": "設定路徑:{{path}}" "clipboardFallback": "設定路徑:{{path}}"
}, },
"sections": { "sections": {
"apiConfiguration": "[TODO: Translate] API Configuration",
"contentFiltering": "內容過濾", "contentFiltering": "內容過濾",
"videoSettings": "影片設定", "videoSettings": "影片設定",
"layoutSettings": "版面設定", "layoutSettings": "版面設定",
"folderSettings": "預設根目錄",
"priorityTags": "優先標籤",
"downloadPathTemplates": "下載路徑範本",
"exampleImages": "範例圖片",
"updateFlags": "更新標記",
"autoOrganize": "Auto-organize",
"misc": "其他", "misc": "其他",
"metadataArchive": "中繼資料封存資料庫", "folderSettings": "預設根目錄",
"storageLocation": "設定位置", "downloadPathTemplates": "下載路徑範本",
"priorityTags": "優先標籤",
"updateFlags": "更新標記",
"exampleImages": "範例圖片",
"autoOrganize": "自動整理",
"metadata": "中繼資料",
"proxySettings": "代理設定" "proxySettings": "代理設定"
}, },
"nav": { "nav": {
"general": "通用", "general": "通用",
"interface": "介面", "interface": "介面",
"download": "下載", "library": "模型庫"
"organization": "整理",
"system": "系統",
"network": "網路"
}, },
"search": { "search": {
"placeholder": "[TODO: Translate] Search settings...", "placeholder": "搜尋設定...",
"clear": "[TODO: Translate] Clear search", "clear": "清除搜尋",
"noResults": "[TODO: Translate] No settings found matching \"{query}\"" "noResults": "未找到符合 \"{query}\" 的設定"
}, },
"storage": { "storage": {
"locationLabel": "可攜式模式", "locationLabel": "可攜式模式",

View File

@@ -35,10 +35,7 @@
<li class="settings-nav-group"> <li class="settings-nav-group">
<button type="button" class="settings-nav-item active" data-section="general">{{ t('settings.nav.general') }}</button> <button type="button" class="settings-nav-item active" data-section="general">{{ t('settings.nav.general') }}</button>
<button type="button" class="settings-nav-item" data-section="interface">{{ t('settings.nav.interface') }}</button> <button type="button" class="settings-nav-item" data-section="interface">{{ t('settings.nav.interface') }}</button>
<button type="button" class="settings-nav-item" data-section="download">{{ t('settings.nav.download') }}</button> <button type="button" class="settings-nav-item" data-section="library">{{ t('settings.nav.library') }}</button>
<button type="button" class="settings-nav-item" data-section="organization">{{ t('settings.nav.organization') }}</button>
<button type="button" class="settings-nav-item" data-section="system">{{ t('settings.nav.system') }}</button>
<button type="button" class="settings-nav-item" data-section="network">{{ t('settings.nav.network') }}</button>
</li> </li>
</ul> </ul>
</nav> </nav>
@@ -75,56 +72,170 @@
</div> </div>
</div> </div>
<!-- API Configuration --> <!-- Storage Location -->
<div class="settings-subsection"> <div class="setting-item">
<div class="settings-subsection-header"> <div class="setting-row">
<h4>{{ t('settings.sections.apiConfiguration') }}</h4> <div class="setting-info">
<label for="usePortableSettings">
{{ t('settings.storage.locationLabel') }}
<i class="fas fa-info-circle info-icon" data-tooltip="{{ t('settings.storage.locationHelp') }}"></i>
</label>
</div>
<div class="setting-control">
<label class="toggle-switch">
<input type="checkbox" id="usePortableSettings" {% if settings.get('use_portable_settings', False) %}checked{% endif %}
onchange="settingsManager.saveToggleSetting('usePortableSettings', 'use_portable_settings')">
<span class="toggle-slider"></span>
</label>
</div>
</div> </div>
<div class="setting-item api-key-item"> </div>
<div class="setting-row">
<div class="setting-info"> <!-- API Configuration -->
<label for="civitaiApiKey">{{ t('settings.civitaiApiKey') }}</label> <div class="setting-item api-key-item">
<i class="fas fa-info-circle info-icon" data-tooltip="{{ t('settings.civitaiApiKeyHelp') }}"></i> <div class="setting-row">
</div> <div class="setting-info">
<div class="setting-control"> <label for="civitaiApiKey">{{ t('settings.civitaiApiKey') }}</label>
<div class="api-key-input"> <i class="fas fa-info-circle info-icon" data-tooltip="{{ t('settings.civitaiApiKeyHelp') }}"></i>
<input type="password" </div>
id="civitaiApiKey" <div class="setting-control">
placeholder="{{ t('settings.civitaiApiKeyPlaceholder') }}" <div class="api-key-input">
value="{{ settings.get('civitai_api_key', '') }}" <input type="password"
onblur="settingsManager.saveInputSetting('civitaiApiKey', 'civitai_api_key')" id="civitaiApiKey"
onkeydown="if(event.key === 'Enter') { this.blur(); }" /> placeholder="{{ t('settings.civitaiApiKeyPlaceholder') }}"
<button class="toggle-visibility"> value="{{ settings.get('civitai_api_key', '') }}"
<i class="fas fa-eye"></i> onblur="settingsManager.saveInputSetting('civitaiApiKey', 'civitai_api_key')"
</button> onkeydown="if(event.key === 'Enter') { this.blur(); }" />
</div> <button class="toggle-visibility">
<i class="fas fa-eye"></i>
</button>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<!-- Storage Location --> <!-- Proxy Settings -->
<div class="settings-subsection"> <div class="settings-subsection">
<div class="settings-subsection-header"> <div class="settings-subsection-header">
<h4>{{ t('settings.sections.storageLocation') }}</h4> <h4>{{ t('settings.sections.proxySettings') }}</h4>
</div> </div>
<div class="setting-item"> <div class="setting-item">
<div class="setting-row"> <div class="setting-row">
<div class="setting-info"> <div class="setting-info">
<label for="usePortableSettings"> <label for="proxyEnabled">
{{ t('settings.storage.locationLabel') }} {{ t('settings.proxySettings.enableProxy') }}
<i class="fas fa-info-circle info-icon" data-tooltip="{{ t('settings.storage.locationHelp') }}"></i> <i class="fas fa-info-circle info-icon" data-tooltip="{{ t('settings.proxySettings.enableProxyHelp') }}"></i>
</label> </label>
</div> </div>
<div class="setting-control"> <div class="setting-control">
<label class="toggle-switch"> <label class="toggle-switch">
<input type="checkbox" id="usePortableSettings" {% if settings.get('use_portable_settings', False) %}checked{% endif %} <input type="checkbox" id="proxyEnabled"
onchange="settingsManager.saveToggleSetting('usePortableSettings', 'use_portable_settings')"> onchange="settingsManager.saveToggleSetting('proxyEnabled', 'proxy_enabled')">
<span class="toggle-slider"></span> <span class="toggle-slider"></span>
</label> </label>
</div> </div>
</div> </div>
</div> </div>
<div id="proxySettingsGroup" class="proxy-settings-group" style="display: none;">
<div class="setting-item">
<div class="setting-row">
<div class="setting-info">
<label for="proxyType">
{{ t('settings.proxySettings.proxyType') }}
<i class="fas fa-info-circle info-icon" data-tooltip="{{ t('settings.proxySettings.proxyTypeHelp') }}"></i>
</label>
</div>
<div class="setting-control select-control">
<select id="proxyType" onchange="settingsManager.saveSelectSetting('proxyType', 'proxy_type')">
<option value="http">HTTP</option>
<option value="https">HTTPS</option>
<option value="socks4">SOCKS4</option>
<option value="socks5">SOCKS5</option>
</select>
</div>
</div>
</div>
<div class="setting-item">
<div class="setting-row">
<div class="setting-info">
<label for="proxyHost">
{{ t('settings.proxySettings.proxyHost') }}
<i class="fas fa-info-circle info-icon" data-tooltip="{{ t('settings.proxySettings.proxyHostHelp') }}"></i>
</label>
</div>
<div class="setting-control">
<div class="text-input-wrapper">
<input type="text" id="proxyHost"
placeholder="{{ t('settings.proxySettings.proxyHostPlaceholder') }}"
onblur="settingsManager.saveInputSetting('proxyHost', 'proxy_host')"
onkeydown="if(event.key === 'Enter') { this.blur(); }" />
</div>
</div>
</div>
</div>
<div class="setting-item">
<div class="setting-row">
<div class="setting-info">
<label for="proxyPort">
{{ t('settings.proxySettings.proxyPort') }}
<i class="fas fa-info-circle info-icon" data-tooltip="{{ t('settings.proxySettings.proxyPortHelp') }}"></i>
</label>
</div>
<div class="setting-control">
<div class="text-input-wrapper">
<input type="text" id="proxyPort"
placeholder="{{ t('settings.proxySettings.proxyPortPlaceholder') }}"
onblur="settingsManager.saveInputSetting('proxyPort', 'proxy_port')"
onkeydown="if(event.key === 'Enter') { this.blur(); }" />
</div>
</div>
</div>
</div>
<div class="setting-item">
<div class="setting-row">
<div class="setting-info">
<label for="proxyUsername">
{{ t('settings.proxySettings.proxyUsername') }}
<i class="fas fa-info-circle info-icon" data-tooltip="{{ t('settings.proxySettings.proxyUsernameHelp') }}"></i>
</label>
</div>
<div class="setting-control">
<div class="text-input-wrapper">
<input type="text" id="proxyUsername"
placeholder="{{ t('settings.proxySettings.proxyUsernamePlaceholder') }}"
onblur="settingsManager.saveInputSetting('proxyUsername', 'proxy_username')"
onkeydown="if(event.key === 'Enter') { this.blur(); }" />
</div>
</div>
</div>
</div>
<div class="setting-item">
<div class="setting-row">
<div class="setting-info">
<label for="proxyPassword">
{{ t('settings.proxySettings.proxyPassword') }}
<i class="fas fa-info-circle info-icon" data-tooltip="{{ t('settings.proxySettings.proxyPasswordHelp') }}"></i>
</label>
</div>
<div class="setting-control">
<div class="api-key-input">
<input type="password" id="proxyPassword"
placeholder="{{ t('settings.proxySettings.proxyPasswordPlaceholder') }}"
onblur="settingsManager.saveInputSetting('proxyPassword', 'proxy_password')"
onkeydown="if(event.key === 'Enter') { this.blur(); }" />
<button class="toggle-visibility">
<i class="fas fa-eye"></i>
</button>
</div>
</div>
</div>
</div>
</div>
</div> </div>
</div> </div>
@@ -295,10 +406,34 @@
</div> </div>
</div> </div>
</div> </div>
<!-- Miscellaneous -->
<div class="settings-subsection">
<div class="settings-subsection-header">
<h4>{{ t('settings.sections.misc') }}</h4>
</div>
<div class="setting-item">
<div class="setting-row">
<div class="setting-info">
<label for="includeTriggerWords">
{{ t('settings.misc.includeTriggerWords') }}
<i class="fas fa-info-circle info-icon" data-tooltip="{{ t('settings.misc.includeTriggerWordsHelp') }}"></i>
</label>
</div>
<div class="setting-control">
<label class="toggle-switch">
<input type="checkbox" id="includeTriggerWords"
onchange="settingsManager.saveToggleSetting('includeTriggerWords', 'include_trigger_words')">
<span class="toggle-slider"></span>
</label>
</div>
</div>
</div>
</div>
</div> </div>
<!-- Section 3: Download --> <!-- Section 3: Library -->
<div id="section-download" class="settings-section" data-section="download"> <div id="section-library" class="settings-section" data-section="library">
<!-- Folder Settings --> <!-- Folder Settings -->
<div class="settings-subsection"> <div class="settings-subsection">
<div class="settings-subsection-header"> <div class="settings-subsection-header">
@@ -643,46 +778,49 @@
</div> </div>
</div> </div>
</div> </div>
</div>
<!-- Section 4: Organization -->
<div id="section-organization" class="settings-section" data-section="organization">
<!-- Auto-organize Exclusions -->
<div class="setting-item auto-organize-exclusions-item">
<div class="setting-row">
<div class="setting-info">
<label for="autoOrganizeExclusions">
{{ t('settings.autoOrganizeExclusions.label') }}
<i class="fas fa-info-circle info-icon" data-tooltip="{{ t('settings.autoOrganizeExclusions.help') }}"></i>
</label>
</div>
</div>
<textarea id="autoOrganizeExclusions" class="priority-tags-input auto-organize-exclusions-input" placeholder="{{ t('settings.autoOrganizeExclusions.placeholder') }}"></textarea>
<div class="settings-input-error-message" id="autoOrganizeExclusionsError"></div>
</div>
<!-- Metadata Refresh Skip Paths --> <!-- Auto-organize -->
<div class="setting-item">
<div class="setting-row">
<div class="setting-info">
<label for="metadataRefreshSkipPaths">
{{ t('settings.metadataRefreshSkipPaths.label') }}
<i class="fas fa-info-circle info-icon" data-tooltip="{{ t('settings.metadataRefreshSkipPaths.help') }}"></i>
</label>
</div>
</div>
<textarea id="metadataRefreshSkipPaths" class="priority-tags-input auto-organize-exclusions-input" placeholder="{{ t('settings.metadataRefreshSkipPaths.placeholder') }}"></textarea>
<div class="settings-input-error-message" id="metadataRefreshSkipPathsError"></div>
</div>
</div>
<!-- Section 5: System -->
<div id="section-system" class="settings-section" data-section="system">
<!-- Metadata Archive -->
<div class="settings-subsection"> <div class="settings-subsection">
<div class="settings-subsection-header"> <div class="settings-subsection-header">
<h4>{{ t('settings.sections.metadataArchive') }}</h4> <h4>{{ t('settings.sections.autoOrganize') }}</h4>
</div> </div>
<!-- Auto-organize Exclusions -->
<div class="setting-item auto-organize-exclusions-item">
<div class="setting-row">
<div class="setting-info">
<label for="autoOrganizeExclusions">
{{ t('settings.autoOrganizeExclusions.label') }}
<i class="fas fa-info-circle info-icon" data-tooltip="{{ t('settings.autoOrganizeExclusions.help') }}"></i>
</label>
</div>
</div>
<textarea id="autoOrganizeExclusions" class="priority-tags-input auto-organize-exclusions-input" placeholder="{{ t('settings.autoOrganizeExclusions.placeholder') }}"></textarea>
<div class="settings-input-error-message" id="autoOrganizeExclusionsError"></div>
</div>
</div>
<!-- Metadata -->
<div class="settings-subsection">
<div class="settings-subsection-header">
<h4>{{ t('settings.sections.metadata') }}</h4>
</div>
<!-- Metadata Refresh Skip Paths -->
<div class="setting-item">
<div class="setting-row">
<div class="setting-info">
<label for="metadataRefreshSkipPaths">
{{ t('settings.metadataRefreshSkipPaths.label') }}
<i class="fas fa-info-circle info-icon" data-tooltip="{{ t('settings.metadataRefreshSkipPaths.help') }}"></i>
</label>
</div>
</div>
<textarea id="metadataRefreshSkipPaths" class="priority-tags-input auto-organize-exclusions-input" placeholder="{{ t('settings.metadataRefreshSkipPaths.placeholder') }}"></textarea>
<div class="settings-input-error-message" id="metadataRefreshSkipPathsError"></div>
</div>
<!-- Metadata Archive -->
<div class="setting-item"> <div class="setting-item">
<div class="setting-row"> <div class="setting-row">
<div class="setting-info"> <div class="setting-info">
@@ -726,159 +864,7 @@
</div> </div>
</div> </div>
</div> </div>
<!-- Misc -->
<div class="settings-subsection">
<div class="settings-subsection-header">
<h4>{{ t('settings.sections.misc') }}</h4>
</div>
<div class="setting-item">
<div class="setting-row">
<div class="setting-info">
<label for="includeTriggerWords">
{{ t('settings.misc.includeTriggerWords') }}
<i class="fas fa-info-circle info-icon" data-tooltip="{{ t('settings.misc.includeTriggerWordsHelp') }}"></i>
</label>
</div>
<div class="setting-control">
<label class="toggle-switch">
<input type="checkbox" id="includeTriggerWords"
onchange="settingsManager.saveToggleSetting('includeTriggerWords', 'include_trigger_words')">
<span class="toggle-slider"></span>
</label>
</div>
</div>
</div>
</div>
</div> </div>
<!-- Section 6: Network -->
<div id="section-network" class="settings-section" data-section="network">
<!-- Proxy Settings -->
<div class="settings-subsection">
<div class="settings-subsection-header">
<h4>{{ t('settings.sections.proxySettings') }}</h4>
</div>
<div class="setting-item">
<div class="setting-row">
<div class="setting-info">
<label for="proxyEnabled">
{{ t('settings.proxySettings.enableProxy') }}
<i class="fas fa-info-circle info-icon" data-tooltip="{{ t('settings.proxySettings.enableProxyHelp') }}"></i>
</label>
</div>
<div class="setting-control">
<label class="toggle-switch">
<input type="checkbox" id="proxyEnabled"
onchange="settingsManager.saveToggleSetting('proxyEnabled', 'proxy_enabled')">
<span class="toggle-slider"></span>
</label>
</div>
</div>
</div>
<div id="proxySettingsGroup" class="proxy-settings-group" style="display: none;">
<div class="setting-item">
<div class="setting-row">
<div class="setting-info">
<label for="proxyType">
{{ t('settings.proxySettings.proxyType') }}
<i class="fas fa-info-circle info-icon" data-tooltip="{{ t('settings.proxySettings.proxyTypeHelp') }}"></i>
</label>
</div>
<div class="setting-control select-control">
<select id="proxyType" onchange="settingsManager.saveSelectSetting('proxyType', 'proxy_type')">
<option value="http">HTTP</option>
<option value="https">HTTPS</option>
<option value="socks4">SOCKS4</option>
<option value="socks5">SOCKS5</option>
</select>
</div>
</div>
</div>
<div class="setting-item">
<div class="setting-row">
<div class="setting-info">
<label for="proxyHost">
{{ t('settings.proxySettings.proxyHost') }}
<i class="fas fa-info-circle info-icon" data-tooltip="{{ t('settings.proxySettings.proxyHostHelp') }}"></i>
</label>
</div>
<div class="setting-control">
<div class="text-input-wrapper">
<input type="text" id="proxyHost"
placeholder="{{ t('settings.proxySettings.proxyHostPlaceholder') }}"
onblur="settingsManager.saveInputSetting('proxyHost', 'proxy_host')"
onkeydown="if(event.key === 'Enter') { this.blur(); }" />
</div>
</div>
</div>
</div>
<div class="setting-item">
<div class="setting-row">
<div class="setting-info">
<label for="proxyPort">
{{ t('settings.proxySettings.proxyPort') }}
<i class="fas fa-info-circle info-icon" data-tooltip="{{ t('settings.proxySettings.proxyPortHelp') }}"></i>
</label>
</div>
<div class="setting-control">
<div class="text-input-wrapper">
<input type="text" id="proxyPort"
placeholder="{{ t('settings.proxySettings.proxyPortPlaceholder') }}"
onblur="settingsManager.saveInputSetting('proxyPort', 'proxy_port')"
onkeydown="if(event.key === 'Enter') { this.blur(); }" />
</div>
</div>
</div>
</div>
<div class="setting-item">
<div class="setting-row">
<div class="setting-info">
<label for="proxyUsername">
{{ t('settings.proxySettings.proxyUsername') }}
<i class="fas fa-info-circle info-icon" data-tooltip="{{ t('settings.proxySettings.proxyUsernameHelp') }}"></i>
</label>
</div>
<div class="setting-control">
<div class="text-input-wrapper">
<input type="text" id="proxyUsername"
placeholder="{{ t('settings.proxySettings.proxyUsernamePlaceholder') }}"
onblur="settingsManager.saveInputSetting('proxyUsername', 'proxy_username')"
onkeydown="if(event.key === 'Enter') { this.blur(); }" />
</div>
</div>
</div>
</div>
<div class="setting-item">
<div class="setting-row">
<div class="setting-info">
<label for="proxyPassword">
{{ t('settings.proxySettings.proxyPassword') }}
<i class="fas fa-info-circle info-icon" data-tooltip="{{ t('settings.proxySettings.proxyPasswordHelp') }}"></i>
</label>
</div>
<div class="setting-control">
<div class="api-key-input">
<input type="password" id="proxyPassword"
placeholder="{{ t('settings.proxySettings.proxyPasswordPlaceholder') }}"
onblur="settingsManager.saveInputSetting('proxyPassword', 'proxy_password')"
onkeydown="if(event.key === 'Enter') { this.blur(); }" />
<button class="toggle-visibility">
<i class="fas fa-eye"></i>
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>