Files
pipu-music/packages/i18n/locales/en/admin.json
T
mrleo1nidandClaude Opus 5.5 f66be2ba0a
ci / api / api (push) Successful in 33s
ci / contract / contract (сгенерированный код совпадает с openapi.yaml) (push) Successful in 43s
ci / mobile / mobile (Metro-бандл Android) (push) Successful in 1m11s
ci / ts / ts (packages + web) (push) Successful in 1m10s
ci / docker / docker (образы собираются — их сервер собирает сам при обновлении) (push) Successful in 51s
feat: storage writes via storage-agent, accepts_uploads and write_template (M5.5)
- storage-agent: POST /internal/files copies a staged file into a source
  (temp file, fsync, SHA-256 check, hard link so nothing is overwritten,
  " (2)" suffix on conflict, owner PIPU_FILE_UID/GID) and
  POST /internal/files/test. NFS sources that accept uploads are mounted
  rw in an agent-only /library-rw and bind-mounted read-only for others;
  local sources are written through /library-host-rw.
- meta: write templates ({track:02}, {disc:1-}, [optional]) with name
  sanitising and length limits, suggestion from the source's regexes
  and a reversibility check against 50 catalogue tracks.
- API and admin UI: accepts_uploads / write_template on sources,
  write-template suggest and check endpoints, write test result.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 13:46:56 +03:00

188 lines
7.1 KiB
JSON

{
"users": {
"title": "Users",
"subtitle": "Create users and moderators, manage roles, reset passwords, block accounts",
"create": "Create user",
"search": "Name or username",
"all": "All",
"col_user": "User",
"col_role": "Role",
"col_status": "Status",
"col_last_login": "Last seen",
"status_active": "Active",
"status_blocked": "Blocked",
"status_must_change": "Must change password",
"never": "Never signed in",
"empty": "Nobody found",
"more": "Show more",
"actions": "Actions for {{username}}",
"reset_password": "Reset password",
"block": "Block",
"unblock": "Unblock",
"make_role": "Make {{role}}",
"delete": "Delete",
"delete_confirm": "Delete {{username}}? Their history and likes will be lost.",
"block_confirm": "Block {{username}}? All their sessions will end.",
"reset_confirm": "Reset {{username}}'s password? All their sessions will end.",
"confirm": "Confirm",
"you": "you"
},
"create": {
"title": "New user",
"username": "Username",
"username_hint": "Latin letters, digits, \".\", \"_\", \"-\"",
"display_name": "Name",
"role": "Role",
"password_note": "The server will generate a password and show it once.",
"submit": "Create"
},
"temp_password": {
"title": "Temporary password",
"text": "Give this password to {{username}}. It is shown only now; they will be asked to change it on sign-in.",
"done": "Done"
},
"audit": {
"title": "Audit log",
"subtitle": "Actions of administrators and moderators",
"col_when": "When",
"col_who": "Who",
"col_action": "Action",
"col_details": "Details",
"system": "System",
"empty": "No entries yet",
"more": "Show more",
"actions": {
"user.bootstrap_create": "Initial administrator created",
"user.bootstrap_credentials": "Administrator credentials set",
"user.create": "User created",
"user.rename": "Name changed",
"user.role_change": "Role changed",
"user.block": "User blocked",
"user.unblock": "User unblocked",
"user.password_reset": "Password reset",
"user.delete": "User deleted"
}
},
"sources": {
"title": "Storage",
"subtitle": "Where the server takes music from: a folder on the server or NFS",
"add": "Add storage",
"empty": "No storage yet. Connect a music folder to get started.",
"type_local": "Server folder",
"type_nfs": "NFS",
"status_pending": "Connecting",
"status_mounted": "Connected",
"status_error": "Error",
"status_disabled": "Disabled",
"last_scan": "Last scan: {{date}}",
"never_scanned": "Not scanned yet",
"scan": "Scan",
"full_scan": "Full scan",
"test": "Test",
"patterns": "Path patterns",
"edit": "Edit",
"delete": "Delete",
"disable": "Disable",
"enable": "Enable",
"delete_confirm": "Delete “{{name}}”? Tracks that exist only in this storage will disappear from the library along with their likes.",
"scanning": "Scanning: {{processed}} of {{total}}",
"scan_walking": "Walking folders…",
"scan_done": "Found {{found}} · new {{added}} · updated {{updated}} · moved {{moved}} · missing {{missing}} · errors {{errors}}",
"scan_failed": "Scan stopped: {{error}}",
"test_ok": "Reachable, audio files found: {{count}}",
"test_fail": "Not reachable: {{message}}",
"form_title_new": "New storage",
"form_title_edit": "Storage",
"name": "Name",
"type": "Type",
"folder": "Folder",
"folder_root": "Whole folder",
"folder_hint": "A subfolder of LIBRARY_HOST on the server",
"up": "Up",
"nfs_server": "Server",
"nfs_server_hint": "Host name or IP, e.g. nas.lan",
"nfs_export": "Export",
"nfs_export_hint": "Path on the server, e.g. /export/music",
"nfs_options": "Mount options",
"nfs_options_hint": "Read-only is added automatically",
"tag_priority": "Prefer",
"tags_first": "File tags",
"path_first": "Path patterns",
"interval": "Auto scan",
"interval_off": "Manual",
"interval_hours": "Every {{count}} h",
"save": "Save"
},
"patterns": {
"title": "Path patterns: {{name}}",
"intro": "RE2 regular expressions with named groups are matched against the file path relative to the storage root. The first match wins.",
"groups": "Groups: artist, albumartist, album, year, disc, track, title, genre; skip ignores the file.",
"add": "Add pattern",
"regex": "Pattern {{n}}",
"enabled": "Enabled",
"up": "Up",
"down": "Down",
"remove": "Remove",
"preview": "Preview",
"save": "Save",
"saved": "Saved. Run a full scan to apply it to files already found.",
"col_path": "Path",
"col_pattern": "Pattern",
"col_result": "Result",
"no_match": "no match",
"skipped": "skipped",
"unmatched": "No pattern matched: {{count}} of {{total}}",
"from_tags": "from tags",
"error_at": "Error in pattern {{n}}: {{reason}}",
"examples": "Examples"
},
"library": {
"title": "Library",
"subtitle": "Catalog and scan status",
"artists": "Artists",
"albums": "Albums",
"tracks": "Tracks",
"files": "Files",
"missing": "Missing files",
"errors": "Unreadable",
"sources": "Storage",
"error_files": "Files with errors",
"reindex": "Rebuild search index",
"reindex_started": "Rebuild started",
"analysis": "Audio analysis",
"analysis_progress": "Analysed {{done}} of {{total}}",
"analysis_failed": "Could not analyse: {{count}}",
"analyzer": "Analyzer version: {{ver}}",
"wave": "My Wave, last 7 days",
"wave_served": "Tracks served",
"wave_sessions": "Sessions",
"wave_listen": "Played ≥ 50%",
"wave_early_skip": "Early skips",
"wave_likes": "Likes per 100"
},
"write_template": {
"title": "Uploads and path template",
"intro": "Approved tracks from the upload queue are placed here using a template that repeats this storage's folder layout.",
"accepts": "Accept uploads into this storage",
"nfs_rw_hint": "The storage will be reconnected: the agent also mounts it for writing (visible only to the agent). The NFS export must allow writes for PIPU_FILE_UID.",
"template": "Path template",
"hint": "For example {albumartist}/{year} - {album}/{disc:1-}{track:02} - {title}.{ext}; [ … ] is an optional part",
"suggest": "Suggest from layout",
"check": "Check",
"save": "Save",
"saved": "Saved",
"required": "Set a path template to accept uploads.",
"no_tracks": "The storage has no tracks yet, so there is nothing to check the template against.",
"check_ok": "The template is reversible: {{round_trip}} of {{total}} paths parse back unchanged, {{same_path}} match the real ones.",
"check_warn": "Mismatches found: {{round_trip}} of {{total}} parse back unchanged, {{same_path}} match the real paths (90% needed). New files may be laid out differently from existing ones.",
"col_real": "Real path",
"col_rendered": "From template",
"col_problem": "Mismatch",
"no_pattern": "no pattern matched",
"other_path": "different path",
"badge": "accepts uploads",
"write_ok": "Write: ok",
"write_fail": "Write failed: {{message}}"
}
}