Files
media-player-server/media_server/static/locales/en.json
T
alexei.dolgolyov 14e9f2294e feat(ui): rebuild player view to match Studio Reference mockup
Restructures the player tab DOM to actually look like the editorial
mockup, not just inherit new fonts. The previous commit only swapped
tokens & typography on the legacy Spotify-clone layout.

DOM additions (all preserve existing JS-touched IDs):
- Vinyl stage: rotating vinyl wrapping the existing #album-art as a
  circular center label; spins only when state=playing via CSS hook
- SVG tonearm: pivots in/out based on data-playstate
- Kicker line: copper italic mono header above the track title
- Editorial 4-cell metadata grid: State / Source / Elapsed / Length
- Decorative spectrum bars (30, CSS-only animation, paused when idle)
- VU meter cluster: needle visual driven by volume %, alongside the
  preserved volume slider for a11y
- Folio marks: top-left and top-right of the player container

JS hooks (small, additive):
- updatePlaybackState now sets :root[data-playstate] for CSS
- progress tick mirrors timecode into meta-grid cells
- volume update rotates the VU needle
- folio-version mirrors the version label

i18n:
- new keys: player.kicker, player.modes, player.folio_*, meta.*
- added to both en.json and ru.json

Restored: media_server/static/redesign-mockup.html (Studio Reference
visual reference; deleting it in the prior commit was a mistake).
2026-04-25 01:24:11 +03:00

264 lines
13 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.kicker": "Now Playing",
"player.modes": "Modes",
"player.folio_left": "Now Spinning",
"player.folio_right": "Vol. I — Studio Reference",
"meta.state": "State",
"meta.source": "Source",
"meta.elapsed": "Elapsed",
"meta.length": "Length",
"player.title_unavailable": "Title unavailable",
"player.source": "Source:",
"player.unknown_source": "Unknown",
"player.vinyl": "Vinyl mode",
"player.visualizer": "Audio visualizer",
"player.background": "Dynamic background",
"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?",
"scripts.field.parameters": "Parameters",
"scripts.params.add": "+ Add",
"scripts.params.remove": "Remove parameter",
"scripts.params.required": "Required",
"scripts.params.name_placeholder": "param_name",
"scripts.params.description_placeholder": "Parameter description",
"scripts.params.default_placeholder": "Default",
"scripts.params.options_placeholder": "option1, option2, ...",
"scripts.params.execute": "Execute",
"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": "Now Spinning",
"tab.browser": "Library",
"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 is disabled. Set media_folders_management: true in config.yaml to enable.",
"browser.unavailable": "Unavailable",
"browser.folder_available": "Available",
"browser.folder_unavailable": "Unavailable (path not reachable)",
"browser.folder_disabled": "disabled",
"browser.folder_edit": "Edit folder",
"browser.folder_delete": "Delete folder",
"browser.folder_created": "Media folder created successfully",
"browser.folder_updated": "Media folder updated successfully",
"browser.folder_deleted": "Media folder deleted successfully",
"browser.folder_save_error": "Failed to save media folder",
"browser.folder_delete_error": "Failed to delete media folder",
"browser.folder_confirm_delete": "Are you sure you want to delete the folder \"{name}\"?",
"browser.folders_description": "Media folders available for browsing. Folders on network shares show availability status.",
"browser.folders_empty": "No media folders configured. Click \"+\" to add one.",
"browser.folders_table.id": "ID",
"browser.folders_table.label": "Label",
"browser.folders_table.path": "Path",
"browser.folders_table.status": "Status",
"browser.folders_table.actions": "Actions",
"settings.section.media_folders": "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.list_header.name": "Name",
"browser.list_header.bitrate": "Bitrate",
"browser.list_header.duration": "Duration",
"browser.list_header.size": "Size",
"browser.showing_items": "Showing {from}\u2013{to} of {total}",
"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",
"update.available": "Update available: v{version}",
"update.view_release": "View Release"
}