- New audio_analyzer service: loopback capture via soundcard + numpy FFT - Real-time spectrogram bars below album art with accent color gradient - Album art and vinyl pulse to bass energy beats - WebSocket subscriber pattern for opt-in audio data streaming - Audio device selection in Settings tab with auto-detect fallback - Optimized FFT pipeline: vectorized cumsum bin grouping, pre-serialized JSON broadcast - Visualizer config: enabled/fps/bins/device in config.yaml - Optional deps: soundcard + numpy (graceful degradation if missing) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
219 lines
10 KiB
JSON
219 lines
10 KiB
JSON
{
|
|
"app.title": "Media Server",
|
|
"auth.message": "Enter your API token to connect to the media server.",
|
|
"auth.placeholder": "Enter API Token",
|
|
"auth.connect": "Connect",
|
|
"auth.help": "To get your token, run:",
|
|
"auth.logout": "Logout",
|
|
"auth.logout.title": "Clear saved token",
|
|
"auth.invalid": "Invalid token. Please try again.",
|
|
"auth.cleared": "Token cleared. Please enter a new token.",
|
|
"auth.required": "Please enter a token",
|
|
"player.theme": "Toggle theme",
|
|
"accent.custom": "Custom",
|
|
"player.locale": "Change language",
|
|
"player.previous": "Previous",
|
|
"player.play": "Play/Pause",
|
|
"player.next": "Next",
|
|
"player.mute": "Mute",
|
|
"player.status.connected": "Connected",
|
|
"player.status.disconnected": "Disconnected",
|
|
"player.no_media": "No media playing",
|
|
"player.title_unavailable": "Title unavailable",
|
|
"player.source": "Source:",
|
|
"player.unknown_source": "Unknown",
|
|
"player.vinyl": "Vinyl mode",
|
|
"player.visualizer": "Audio visualizer",
|
|
"state.playing": "Playing",
|
|
"state.paused": "Paused",
|
|
"state.stopped": "Stopped",
|
|
"state.idle": "Idle",
|
|
"scripts.quick_actions": "Quick Actions",
|
|
"scripts.no_scripts": "No scripts configured",
|
|
"scripts.management": "Script Management",
|
|
"scripts.add": "Add",
|
|
"scripts.table.name": "Name",
|
|
"scripts.table.label": "Label",
|
|
"scripts.table.command": "Command",
|
|
"scripts.table.timeout": "Timeout",
|
|
"scripts.table.actions": "Actions",
|
|
"scripts.empty": "No scripts configured. Click 'Add' to create one.",
|
|
"scripts.dialog.add": "Add Script",
|
|
"scripts.dialog.edit": "Edit Script",
|
|
"scripts.field.name": "Script Name *",
|
|
"scripts.field.label": "Label",
|
|
"scripts.field.command": "Command *",
|
|
"scripts.field.description": "Description",
|
|
"scripts.field.icon": "Icon (MDI)",
|
|
"scripts.field.timeout": "Timeout (seconds)",
|
|
"scripts.placeholder.name": "Only letters, numbers, and underscores allowed",
|
|
"scripts.placeholder.label": "Human-readable name",
|
|
"scripts.placeholder.command": "e.g., shutdown /s /t 0",
|
|
"scripts.placeholder.description": "What does this script do?",
|
|
"scripts.placeholder.icon": "e.g., mdi:power",
|
|
"scripts.button.cancel": "Cancel",
|
|
"scripts.button.save": "Save",
|
|
"scripts.button.edit": "Edit",
|
|
"scripts.button.delete": "Delete",
|
|
"scripts.msg.executed": "{name} executed successfully",
|
|
"scripts.msg.execute_failed": "Failed to execute {name}",
|
|
"scripts.msg.execute_error": "Error executing {name}",
|
|
"scripts.msg.created": "Script created successfully",
|
|
"scripts.msg.updated": "Script updated successfully",
|
|
"scripts.msg.create_failed": "Failed to create script",
|
|
"scripts.msg.update_failed": "Failed to update script",
|
|
"scripts.msg.deleted": "Script deleted successfully",
|
|
"scripts.msg.delete_failed": "Failed to delete script",
|
|
"scripts.msg.not_found": "Script not found",
|
|
"scripts.msg.load_failed": "Failed to load script details",
|
|
"scripts.msg.list_failed": "Failed to load scripts",
|
|
"scripts.confirm.delete": "Are you sure you want to delete the script \"{name}\"?",
|
|
"scripts.execution.title": "Execution Result",
|
|
"scripts.execution.output": "Output",
|
|
"scripts.execution.error_output": "Error Output",
|
|
"scripts.execution.close": "Close",
|
|
"scripts.confirm.unsaved": "You have unsaved changes. Are you sure you want to discard them?",
|
|
"callbacks.management": "Callback Management",
|
|
"callbacks.description": "Callbacks are scripts triggered automatically by media control events (play, pause, stop, etc.)",
|
|
"callbacks.add": "Add",
|
|
"callbacks.table.event": "Event",
|
|
"callbacks.table.command": "Command",
|
|
"callbacks.table.timeout": "Timeout",
|
|
"callbacks.table.actions": "Actions",
|
|
"callbacks.empty": "No callbacks configured. Click 'Add' to create one.",
|
|
"callbacks.dialog.add": "Add Callback",
|
|
"callbacks.dialog.edit": "Edit Callback",
|
|
"callbacks.field.event": "Event *",
|
|
"callbacks.field.command": "Command *",
|
|
"callbacks.field.timeout": "Timeout (seconds)",
|
|
"callbacks.field.workdir": "Working Directory",
|
|
"callbacks.placeholder.event": "Select event...",
|
|
"callbacks.placeholder.command": "e.g., shutdown /s /t 0",
|
|
"callbacks.placeholder.workdir": "Optional",
|
|
"callbacks.button.cancel": "Cancel",
|
|
"callbacks.button.save": "Save",
|
|
"callbacks.button.edit": "Edit",
|
|
"callbacks.button.delete": "Delete",
|
|
"callbacks.event.on_play": "on_play - After play succeeds",
|
|
"callbacks.event.on_pause": "on_pause - After pause succeeds",
|
|
"callbacks.event.on_stop": "on_stop - After stop succeeds",
|
|
"callbacks.event.on_next": "on_next - After next track succeeds",
|
|
"callbacks.event.on_previous": "on_previous - After previous track succeeds",
|
|
"callbacks.event.on_volume": "on_volume - After volume change",
|
|
"callbacks.event.on_mute": "on_mute - After mute toggle",
|
|
"callbacks.event.on_seek": "on_seek - After seek succeeds",
|
|
"callbacks.event.on_turn_on": "on_turn_on - Callback-only action",
|
|
"callbacks.event.on_turn_off": "on_turn_off - Callback-only action",
|
|
"callbacks.event.on_toggle": "on_toggle - Callback-only action",
|
|
"callbacks.msg.created": "Callback created successfully",
|
|
"callbacks.msg.updated": "Callback updated successfully",
|
|
"callbacks.msg.create_failed": "Failed to create callback",
|
|
"callbacks.msg.update_failed": "Failed to update callback",
|
|
"callbacks.msg.deleted": "Callback deleted successfully",
|
|
"callbacks.msg.delete_failed": "Failed to delete callback",
|
|
"callbacks.msg.not_found": "Callback not found",
|
|
"callbacks.msg.load_failed": "Failed to load callback details",
|
|
"callbacks.msg.list_failed": "Failed to load callbacks",
|
|
"callbacks.confirm.delete": "Are you sure you want to delete the callback \"{name}\"?",
|
|
"callbacks.confirm.unsaved": "You have unsaved changes. Are you sure you want to discard them?",
|
|
"tab.player": "Player",
|
|
"tab.browser": "Browser",
|
|
"tab.quick_access": "Quick Access",
|
|
"tab.settings": "Settings",
|
|
"tab.display": "Display",
|
|
"settings.section.scripts": "Scripts",
|
|
"settings.section.callbacks": "Callbacks",
|
|
"settings.section.links": "Links",
|
|
"settings.section.audio": "Audio",
|
|
"settings.audio.description": "Select which audio output device to capture for the visualizer.",
|
|
"settings.audio.device": "Loopback Device",
|
|
"settings.audio.auto": "Auto-detect",
|
|
"settings.audio.status_active": "Capturing audio",
|
|
"settings.audio.status_available": "Available, not capturing",
|
|
"settings.audio.status_unavailable": "Unavailable",
|
|
"settings.audio.device_changed": "Audio device changed",
|
|
"settings.audio.device_change_failed": "Failed to change audio device",
|
|
"quick_access.no_items": "No quick actions or links configured",
|
|
"display.loading": "Loading monitors...",
|
|
"display.error": "Failed to load monitors",
|
|
"display.no_monitors": "No monitors detected",
|
|
"display.power_on": "Turn on",
|
|
"display.power_off": "Turn off",
|
|
"display.primary": "Primary",
|
|
"browser.title": "Media Browser",
|
|
"browser.home": "Home",
|
|
"browser.manage_folders": "Manage Folders",
|
|
"browser.select_folder": "Select a folder...",
|
|
"browser.select_folder_option": "Select a folder...",
|
|
"browser.no_folder_selected": "Select a folder to browse media files",
|
|
"browser.no_items": "No media files found in this folder",
|
|
"browser.view_grid": "Grid view",
|
|
"browser.view_compact": "Compact view",
|
|
"browser.view_list": "List view",
|
|
"browser.search": "Search...",
|
|
"browser.items_per_page": "Items per page:",
|
|
"browser.page": "Page",
|
|
"browser.previous": "Previous",
|
|
"browser.next": "Next",
|
|
"browser.download": "Download",
|
|
"browser.play_success": "Playing {filename}",
|
|
"browser.play_error": "Failed to play file",
|
|
"browser.play_all": "Play All",
|
|
"browser.play_all_success": "Playing {count} files",
|
|
"browser.play_all_error": "Failed to play folder",
|
|
"browser.error_loading": "Error loading directory",
|
|
"browser.error_loading_folders": "Failed to load media folders",
|
|
"browser.manage_folders_hint": "Folder management coming soon! For now, edit config.yaml to add media folders.",
|
|
"browser.folder_dialog.title_add": "Add Media Folder",
|
|
"browser.folder_dialog.title_edit": "Edit Media Folder",
|
|
"browser.folder_dialog.folder_id": "Folder ID *",
|
|
"browser.folder_dialog.folder_id_help": "Alphanumeric and underscore only",
|
|
"browser.folder_dialog.label": "Label *",
|
|
"browser.folder_dialog.label_help": "Display name for this folder",
|
|
"browser.folder_dialog.path": "Path *",
|
|
"browser.folder_dialog.path_help": "Absolute path to media directory",
|
|
"browser.folder_dialog.enabled": "Enabled",
|
|
"browser.folder_dialog.cancel": "Cancel",
|
|
"browser.folder_dialog.save": "Save",
|
|
"browser.download_error": "Failed to download file",
|
|
"connection.reconnecting": "Connection lost. Reconnecting (attempt {attempt})...",
|
|
"connection.lost": "Connection lost. Server may be unavailable.",
|
|
"connection.reconnect": "Reconnect",
|
|
"dialog.cancel": "Cancel",
|
|
"dialog.confirm": "Confirm",
|
|
"links.description": "Quick links displayed as icons in the header bar. Click an icon to open the URL in a new tab.",
|
|
"links.empty": "No links configured. Click 'Add' to create one.",
|
|
"links.table.name": "Name",
|
|
"links.table.url": "URL",
|
|
"links.table.label": "Label",
|
|
"links.table.actions": "Actions",
|
|
"links.dialog.add": "Add Link",
|
|
"links.dialog.edit": "Edit Link",
|
|
"links.field.name": "Link Name *",
|
|
"links.field.url": "URL *",
|
|
"links.field.icon": "Icon (MDI)",
|
|
"links.field.label": "Label",
|
|
"links.field.description": "Description",
|
|
"links.placeholder.name": "Only letters, numbers, and underscores allowed",
|
|
"links.placeholder.url": "https://example.com",
|
|
"links.placeholder.icon": "mdi:link",
|
|
"links.placeholder.label": "Tooltip text",
|
|
"links.placeholder.description": "What does this link point to?",
|
|
"links.button.cancel": "Cancel",
|
|
"links.button.save": "Save",
|
|
"links.button.edit": "Edit",
|
|
"links.button.delete": "Delete",
|
|
"links.msg.created": "Link created successfully",
|
|
"links.msg.updated": "Link updated successfully",
|
|
"links.msg.create_failed": "Failed to create link",
|
|
"links.msg.update_failed": "Failed to update link",
|
|
"links.msg.deleted": "Link deleted successfully",
|
|
"links.msg.delete_failed": "Failed to delete link",
|
|
"links.msg.not_found": "Link not found",
|
|
"links.msg.load_failed": "Failed to load link details",
|
|
"links.confirm.delete": "Are you sure you want to delete the link \"{name}\"?",
|
|
"links.confirm.unsaved": "You have unsaved changes. Are you sure you want to discard them?",
|
|
"footer.created_by": "Created by",
|
|
"footer.source_code": "Source Code"
|
|
}
|