ci / contract / contract (сгенерированный код совпадает с openapi.yaml) (push) Successful in 50s
ci / ts / ts (packages + web) (push) Successful in 43s
ci / docker / docker (образы собираются — их сервер собирает сам при обновлении) (push) Successful in 27s
ci / mobile / mobile (Metro-бандл Android) (push) Successful in 1m22s
- core: AuthSession keeps the access token in memory, refreshes it once for all parallel requests (single-flight) and retries them; refresh races between tabs are retried, reuse signs out; ApiError carries problem+json codes and field errors - web: TanStack Router with guards — guests go to /login, the bootstrap admin to /setup/admin, temporary passwords to /setup/password, admin pages by role - login, setup screens, Classic shell (top bar, role-based sidebar, empty player), settings: name, theme, language, password, devices - users admin: search, role filter, create with a one-time temporary password, reset, block, role change, delete as the policy allows; audit log for admins - ru/en strings for auth, admin and error codes; language and theme are saved in the profile Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
84 lines
2.2 KiB
JSON
84 lines
2.2 KiB
JSON
{
|
|
"app": {
|
|
"name": "pipu",
|
|
"tagline": "Your music from your own server"
|
|
},
|
|
"server": {
|
|
"title": "Server",
|
|
"checking": "Checking the server…",
|
|
"online": "Server {{version}} is online",
|
|
"offline": "The server is not responding. Check the address and your network.",
|
|
"address": "Server address",
|
|
"check": "Check",
|
|
"invalid_address": "Enter the server address, e.g. https://music.home.lan",
|
|
"unsupported_app": "This app version is too old for the server — please update the app"
|
|
},
|
|
"language": {
|
|
"label": "Language",
|
|
"ru": "Русский",
|
|
"en": "English"
|
|
},
|
|
"nav": {
|
|
"main": "Navigation",
|
|
"home": "Home",
|
|
"admin": "Admin",
|
|
"users": "Users",
|
|
"audit": "Audit log"
|
|
},
|
|
"profile": {
|
|
"menu": "Profile menu",
|
|
"settings": "Settings",
|
|
"logout": "Sign out"
|
|
},
|
|
"roles": {
|
|
"admin": "Administrator",
|
|
"moderator": "Moderator",
|
|
"user": "User"
|
|
},
|
|
"home": {
|
|
"greeting": "Hi, {{name}}!",
|
|
"wave": "My Wave",
|
|
"wave_soon": "An endless stream tuned to your taste will appear once the server has a library."
|
|
},
|
|
"player": {
|
|
"empty": "Nothing is playing"
|
|
},
|
|
"settings": {
|
|
"title": "Settings",
|
|
"account": "Account",
|
|
"display_name": "Display name",
|
|
"save": "Save",
|
|
"saved": "Saved",
|
|
"appearance": "Appearance",
|
|
"theme": "Theme",
|
|
"theme_dark": "Dark",
|
|
"theme_light": "Light",
|
|
"theme_system": "System",
|
|
"password": "Password",
|
|
"current_password": "Current password",
|
|
"new_password": "New password",
|
|
"repeat_password": "Repeat the password",
|
|
"change_password": "Change password",
|
|
"password_changed": "Password changed. Other devices have been signed out.",
|
|
"sessions": "Devices",
|
|
"session_current": "This device",
|
|
"session_last_used": "Active: {{date}}",
|
|
"session_end": "Sign out",
|
|
"logout_all": "Sign out everywhere"
|
|
},
|
|
"form": {
|
|
"show_password": "Show password",
|
|
"hide_password": "Hide password",
|
|
"passwords_mismatch": "Passwords don't match",
|
|
"required": "Fill in this field",
|
|
"cancel": "Cancel",
|
|
"close": "Close",
|
|
"copy": "Copy",
|
|
"copied": "Copied"
|
|
},
|
|
"loading": "Loading…",
|
|
"route_error": {
|
|
"reload": "Reload the page"
|
|
}
|
|
}
|