Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2,481 changes: 0 additions & 2,481 deletions webapp/src/state/i18n.tsx

This file was deleted.

121 changes: 121 additions & 0 deletions webapp/src/state/i18n/en/admin.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
// Administration, scans, maintenance and missing files.
export const admin = {
"admin.title": "Administration",
"admin.detail": "Libraries, scans and accounts",
"admin.libraries": "Libraries",
"admin.libraryName": "Library name",
"admin.libraryPath": "Absolute server folder path",
"admin.registering": "Registering…",
"admin.register": "Register and scan",
"admin.scan": "Scan now",
"admin.accounts": "Accounts",
"admin.webPassword": "Web password, 12 characters minimum",
"admin.creating": "Creating…",
"admin.create": "Create account",
"admin.enable": "Enable",
"admin.disable": "Disable",
"admin.currentAccount": "You cannot disable your current account",
"admin.libraryError": "The library path could not be registered.",
"admin.accountError": "The account could not be created.",
"admin.statusError": "The account status could not be changed.",
"admin.scanError": "The scan could not be started.",
"admin.scanQueued": "Scan {id} queued.",
"admin.initialScan": "Initial scan {id} queued.",
"admin.scanning": "Scan in progress",
"admin.nowPlaying": "Playing now",
"admin.nobodyListening": "Nobody is listening right now.",
"admin.tokens": "API tokens for {username}",
"admin.tokenName": "What is it for?",
"admin.tokenCreate": "Issue",
"admin.tokenOnce": "Copy it now. It is shown once and never again:",
"admin.tokenError": "The token could not be issued.",
"admin.tokenRevoke": "Revoke",
"admin.tokenUsed": "already used",
"admin.tokenUnused": "never used",
"admin.tokenNone": "No token on this account.",
"admin.members": "Who may see this library",
"admin.memberRole": "Role",
"admin.memberRemove": "Remove",
"admin.memberOwner": "owner, and stays one",
"admin.memberAdd": "Give access to",
"admin.memberChoose": "Choose an account…",
"admin.memberError": "That membership could not be changed.",
"admin.manage": "Name, folder and deletion",
"admin.rename": "Name",
"admin.path": "Folder on the server",
"admin.followLinks":
"Follow symbolic links whose target stays inside the library",
"admin.watch":
"Watch the folder and scan what changes (off for a network share changed by other machines)",
"admin.save": "Save",
"admin.saved": "Saved.",
"admin.savedScan": "Saved. Scan {id} queued.",
"admin.saveError":
"That change could not be saved. A folder must exist on the server and must not be a symbolic link.",
"admin.saveBusy":
"The library is being scanned, or another library already uses that folder. Try again once the scan is over.",
"admin.delete": "Delete this library",
"admin.deleteNote":
"Removes the library from the catalogue for every member: its tracks, albums and artists, with their playlist entries, favourites and plays. No file is touched on disk. Type the library’s name to confirm.",
"admin.deleteConfirm": "The library’s name, to confirm",
"admin.deleteButton": "Delete for good",
"admin.deleted": "{name} was deleted: {tracks} tracks left the catalogue.",
"admin.deleteError": "The library could not be deleted.",
"scan.connecting": "Waiting for the first reading…",
"scan.queued": "Queued",
"scan.running": "Scanning",
"scan.completed": "Finished",
"scan.failed": "Failed",
"scan.progress": "Scan progress",
"scan.counted": "{processed} of {total} files",
"scan.tally":
"{added} added · {updated} updated · {moved} moved · {skipped} unchanged · {errors} errors",
"scan.lost":
"The progress stream could not be opened. The scan itself is unaffected.",
"scan.leftOut": "{excluded} left out · {links} links not followed",
"maintenance.sections": "Maintenance sections",
"maintenance.none": "Nothing here is yours to maintain in this library.",
"missing.total": {
one: "{count} file the scans can no longer find",
other: "{count} files the scans can no longer find",
},
"missing.nothing": "Every file is where the catalogue expects it.",
"missing.notYours":
"Only the owners and managers of this library, and administrators, see its missing files.",
"missing.note":
"These tracks stay in the catalogue, with their favourites, playlist entries and plays, until they are purged; a file that comes back first keeps its track. A purge can be taken back for a while, then the track, and everything that hangs off it for every member, goes for good.",
"missing.since": "missing since {date}",
"missing.cost":
"{playlists} in playlists · {favorites} favourites · {plays} plays",
"missing.select": "Select {title}",
"missing.purgeSelected": "Purge the selected ({count})",
"missing.purgeAll": "Purge them all",
"missing.confirm": "Confirm: purge {count}",
"missing.purged": {
one: "{count} track purged.",
other: "{count} tracks purged.",
},
"missing.scanning":
"The library is being scanned. Try again once the scan is over.",
"missing.failed": "The purge did not work. Try again.",
"missing.more": "Show more",
"missing.purgedUntil": {
one: "{count} track purged. It can be restored until {date}.",
other: "{count} tracks purged. They can be restored until {date}.",
},
"missing.purgedTitle": {
one: "Purged, still restorable ({count})",
other: "Purged, still restorable ({count})",
},
"missing.purgedNote":
"Nothing of these is lost yet. Restored, a track goes back to the missing files with everything that hung off it; a file that comes back restores its track by itself.",
"missing.deletedAfter": "deleted for good after {date}",
"missing.restore": "Restore",
"missing.restoreOne": "Restore {title}",
"missing.restoreAll": "Restore them all",
"missing.restored": {
one: "{count} track restored.",
other: "{count} tracks restored.",
},
"missing.restoreFailed": "The restoration did not work. Try again.",
} as const;
53 changes: 53 additions & 0 deletions webapp/src/state/i18n/en/attention.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
// The attention lists and artist splits.
export const attention = {
"attention.lists": "Lists",
"attention.total": {
one: "{count} thing to look at",
other: "{count} things to look at",
},
"attention.nothing": "Nothing needs attention.",
"attention.notYours":
"Only the owners and managers of this library see what needs attention in it.",
"attention.empty": "Nothing in this list.",
"attention.tracksNote":
"Fix a track from its menu: once corrected, it leaves the list.",
"attention.creditsNote":
"Each of these credits names several artists in one string. Split it into the artists it names, or keep it as one when it is a single name. Every later scan applies the decision.",
"attention.pending": "To decide",
"attention.decided": "Decided",
"attention.split": "Split",
"attention.confirmSplit": "Confirm: split into {count}",
"attention.keep": "Keep as one",
"attention.splitDone": "{name} is split.",
"attention.keepDone": "{name} stays as one.",
"attention.undone": "The decision about {name} is undone.",
"attention.alreadyDecided":
"This credit was decided in the meantime. The list has been reloaded.",
"attention.failed": "That did not work. Try again.",
"attention.noCredits": "No credit is waiting for a decision.",
"attention.noDecisions": "Nothing has been decided yet.",
"attention.fragments": "What {name} would split into",
"attention.knownFragment": "Already an artist in this library",
"attention.decidedSplit": "Split into {parts}",
"attention.decidedKeep": "Kept as one",
"attention.decidedBy": "By {who}, {when}",
"attention.undo": "Undo",
"attention.duplicateGroup": "Probable duplicate {group}",
"attention.split_credits": "Artists to split",
"attention.missing_artist": "Missing artist",
"attention.missing_album": "Missing album",
"attention.missing_year": "Missing year",
"attention.missing_track_number": "Missing track number",
"attention.missing_cover": "Missing cover",
"attention.album_year_conflict": "Albums with several years",
"attention.compilation_no_album_artist":
"Compilations without an album artist",
"attention.duplicate_track_number": "Duplicate track numbers",
"attention.track_number_gap": "Gaps in track numbers",
"attention.probable_duplicate": "Probable duplicates",
"attention.probable_fake_lossless": "Probable fake lossless",
"artistSplit.offer": "Split into {count} artists",
"artistSplit.confirm": "Confirm: split into {count}",
"artistSplit.done": "Split into {parts}.",
"artistSplit.failed": "This credit could not be split. Try again.",
} as const;
48 changes: 48 additions & 0 deletions webapp/src/state/i18n/en/clients.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
// Registered clients, the Subsonic password and OAuth consent.
export const clients = {
"clients.title": "Registered clients",
"clients.detail":
"Devices and scripts holding a credential on your library. Revoking one stops it at once.",
"clients.name": "What it is for",
"clients.register": "Register",
"clients.once":
"Copy this now. Only its hash is stored, so it is shown once and never again:",
"clients.revoke": "Revoke",
"clients.none": "No client holds a credential on your library.",
"clients.error": "That did not work. Nothing changed.",
"clients.registered": "registered {when}",
"clients.used": "last used {when}",
"clients.unused": "never used",
"subsonic.title": "Subsonic password",
"subsonic.detail":
"The separate password Subsonic clients sign in with. Changing it replaces the API key too, so a leaked one stops working.",
"subsonic.set": "set {when}",
"subsonic.changed": "last changed {when}",
"subsonic.password": "New password",
"subsonic.rotate": "Change it",
"subsonic.revoke": "Switch it off",
"subsonic.confirm": "Yes, switch it off",
"subsonic.once":
"Copy this API key now. Only its hash is stored, so it is shown once and never again:",
"subsonic.gone":
"Your Subsonic clients will stop working until you set it again in each of them.",
"subsonic.none":
"You have no Subsonic password, so no Subsonic client can read your library. Ask the administrator for one.",
"subsonic.short": "Use at least 12 characters.",
"subsonic.error": "That did not work. Nothing changed.",
"credential.password": "Dedicated Subsonic password",
"credential.rotate": "Rotate credential",
"credential.copy": "Copy this API key now:",
"credential.error": "Credential rotation failed.",
"authorize.title": "Authorisation",
"authorize.invalid":
"This authorisation link is incomplete or asks to send you somewhere we do not trust.",
"authorize.client": "Authorise {client}",
"authorize.detail":
"It will be able to browse your libraries, play your music and manage your playlists, favourites and ratings, everything this account can do.",
"authorize.redirect": "Sending you back to {url}",
"authorize.error":
"The application sent an authorisation request we cannot honour.",
"authorize.busy": "Authorising…",
"authorize.approve": "Authorise",
} as const;
23 changes: 23 additions & 0 deletions webapp/src/state/i18n/en/common.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// Words shared across screens, file sizes, card buttons and ratings.
export const common = {
"common.loading": "Loading",
"common.loadError": "We could not load this view",
"common.noAlbums": "No albums yet.",
"common.noArtists": "No artists yet.",
"common.variousArtists": "Various artists",
"common.unknownArtist": "Unknown artist",
"common.album": "Album",
"common.artist": "Artist",
"common.albums": { one: "{count} album", other: "{count} albums" },
"common.tracks": { one: "{count} track", other: "{count} tracks" },
"common.delete": "Delete",
"common.cancel": "Cancel",
"common.back": "Back",
"file.megabytes": "{size} MB",
"file.kilobytes": "{size} kB",
"file.channels": { one: "mono", other: "{count} ch" },
"card.play": "Play",
"card.queue": "Add to queue",
"rating.label": "Rating",
"rating.stars": { one: "{count} star", other: "{count} stars" },
} as const;
101 changes: 101 additions & 0 deletions webapp/src/state/i18n/en/folders.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
// Folders, filing and uploads.
export const folders = {
"folders.count": {
one: "{count} folder created in this library",
other: "{count} folders created in this library",
},
"folders.where": "Folder path",
"folders.subfolders": "Folders",
"folders.noLibrary": "No library is available to this account.",
"folders.none": "No folder has been created in this library yet.",
"folders.system": "Kept by WaveFlow",
"folders.systemNote":
"To sort gathers every track that is in no folder. WaveFlow keeps it itself: it is not counted among the folders above, and it cannot be renamed, moved or deleted.",
"filed.unfiled": "To sort",
"filed.automatic": "Automatic",
"filed.topLevel": "Top level",
"filed.here": "Here now",
"filed.destinations": "Folders to choose from",
"filed.loadError": "The folders could not be loaded.",
"filed.moveFailed": "The move failed. Try again.",
"filed.moveTrack": "Move “{title}” to a folder",
"filed.moveFolder": "Move “{name}”",
"filed.note":
"Folders that exist only in WaveFlow. Filing a track here moves no file.",
"filed.newFolder": "New folder",
"filed.name": "Folder name",
"filed.renameLabel": "New name",
"filed.create": "Create",
"filed.save": "Save",
"filed.cancel": "Cancel",
"filed.rename": "Rename",
"filed.move": "Move…",
"filed.delete": "Delete",
"filed.confirmDelete":
"Delete “{name}” and its sub-folders? Their tracks go back to To sort; no file is touched.",
"filed.created": "“{name}” created.",
"filed.renamed": "Renamed to “{name}”.",
"filed.deleted": {
one: "Folder deleted: {count} track is back in To sort.",
other: "Folder deleted: {count} tracks are back in To sort.",
},
"filed.filed": {
one: "{count} track filed in {folder}.",
other: "{count} tracks filed in {folder}.",
},
"filed.folderMoved": "“{name}” moved.",
"filed.nameTaken": "A folder of that name is already here.",
"filed.refused":
"That folder cannot go there: check its name, or the tree is too deep or full.",
"filed.failed": "That did not work. Try again.",
"filed.missing": "This folder no longer exists.",
"filed.empty": "Nothing is filed here yet.",
"filed.allFiled": "Every track is filed.",
"filed.uploadHere": "Upload here",
"filed.unfiledNote":
"Every track that is in no folder yet. WaveFlow keeps this list itself: a track leaves it as soon as it is filed, and it cannot be renamed or deleted. To file a track, open its menu and choose “Move to folder…”.",
"filed.unfiledNoteReader":
"Every track that is in no folder yet. WaveFlow keeps this list itself: a track leaves it as soon as it is filed.",
"upload.into": "Received files go into the folder {folder}.",
"upload.doneUnfiled": "Added to the library, in To sort",
"upload.folderMissing":
"The folder this upload was opened for cannot be found: received files will go to To sort.",
"upload.folderUnchecked":
"The folder this upload was opened for could not be checked, so no file is taken yet.",
"upload.checkAgain": "Check again",
"upload.title": "Upload to {library}",
"upload.detail":
"Each file is fingerprinted in your browser first, so a file the library already holds is never sent again, and an interrupted transfer picks up where it stopped.",
"upload.pick": "Choose audio files",
"upload.formats": "Formats the library can index: {extensions}",
"upload.noLibrary": "Choose a library first.",
"upload.notAllowed":
"Only an owner or a manager of this library can add files to it.",
"upload.closed":
"This library does not take files. Its operator decides that on the server.",
"upload.waiting": "Waiting",
"upload.hashing": "Fingerprinting…",
"upload.negotiating": "Asking the server…",
"upload.uploading": "Sending…",
"upload.committing": "Adding to the library…",
"upload.done": "Added to the library",
"upload.present": "Already in the library",
"upload.refused": "Refused: {reason}",
"upload.failed": "Failed: {reason}",
"upload.progress": "Progress: {name}",
"upload.reason.unsupportedFormat":
"not an audio format the library can index",
"upload.reason.tooLarge": "larger than the server accepts",
"upload.reason.quotaExceeded": "the library has no room left",
"upload.reason.libraryClosed": "the library does not take files",
"upload.reason.tooManySessions":
"too many transfers already open — try again shortly",
"upload.reason.refusedFile":
"what arrived did not match the file, or is not audio the library can read",
"upload.reason.unavailable":
"the server could not take it just now — try again",
"upload.reason.network": "the connection was lost",
"upload.reason.notAllowed": "you may no longer add files to this library",
"upload.reason.error": "something went wrong",
"upload.reason.hashing": "this browser could not fingerprint the file",
} as const;
38 changes: 38 additions & 0 deletions webapp/src/state/i18n/en/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
// The English strings, assembled from one file per domain.
import { admin } from "./admin";
import { attention } from "./attention";
import { clients } from "./clients";
import { common } from "./common";
import { folders } from "./folders";
import { library } from "./library";
import { login } from "./login";
import { nav } from "./nav";
import { player } from "./player";
import { playlists } from "./playlists";
import { podcasts } from "./podcasts";
import { preferences } from "./preferences";
import { quality } from "./quality";
import { scrobbling } from "./scrobbling";
import { smart } from "./smart";
import { stats } from "./stats";
import { track } from "./track";

export const en = {
...nav,
...preferences,
...common,
...library,
...clients,
...quality,
...track,
...login,
...playlists,
...player,
...admin,
...attention,
...folders,
...scrobbling,
...stats,
...smart,
...podcasts,
};
Loading
Loading