feat: uv config other feats

- add uv configuration for the backend
- update frontend to make auth work
- add new auth endpoints
- add bookmars feat
- add reader feat
This commit is contained in:
2026-06-03 22:06:01 -05:00
parent 730c748f5f
commit 6b4c0c43f8
137 changed files with 20319 additions and 2340 deletions
+240
View File
@@ -0,0 +1,240 @@
const enUS = {
common: {
loading: "Loading...",
back: "Back",
save: "Save",
saving: "Saving...",
retry: "Retry",
dismiss: "Dismiss",
cancel: "Cancel",
delete: "Delete",
deleting: "Deleting...",
edit: "Edit",
unknownError: "Something went wrong",
unknownAuthor: "Unknown Author",
appName: "Cloud Reader",
},
auth: {
signIn: "Sign In",
createAccount: "Create Account",
email: "Email",
password: "Password",
confirmPassword: "Confirm Password",
emailPlaceholder: "you@example.com",
passwordPlaceholder: "At least 8 characters",
confirmPasswordPlaceholder: "Repeat your password",
signingIn: "Signing in...",
creatingAccount: "Creating account...",
noAccount: "Don't have an account?",
hasAccount: "Already have an account?",
register: "Register",
passwordsMismatch: "Passwords do not match.",
loginFailed: "Login failed",
registrationFailed: "Registration failed",
},
library: {
title: "Library",
bookCountOne: "{{count}} book",
bookCountMany: "{{count}} books",
addBook: "Add Book",
bookmarks: "Bookmarks",
settings: "Settings",
logout: "Logout",
searchPlaceholder: "Search by title, author, or genre...",
voiceSearchTitle: "Search with voice",
voiceSearchStopTitle: "Stop listening",
filtersShow: "Filters",
filtersHide: "Filters",
filtersLabel: "Filters",
genre: "Genre",
author: "Author",
status: "Status",
allGenres: "All Genres",
allAuthors: "All Authors",
allStatuses: "All Statuses",
clearFilters: "Clear",
loadFailed: "Failed to load books",
listening: "Listening... speak now",
stop: "Stop",
voiceNoSpeech: "No speech detected. Try again.",
voiceError: "Voice search: {{message}}",
pdfNotice: "PDF reading is not supported in the web reader. Upload an EPUB to read here.",
emptyTitle: "Your library is empty",
emptyFilteredTitle: "No books found",
emptyDescription: "Add a book to get started building your collection.",
emptyFilteredDescription: "Try adjusting your search query or filters to discover more books.",
clearAllFilters: "Clear All Filters",
addFirstBook: "Add Your First Book",
readingStatus: {
wantToRead: "Want to Read",
reading: "Reading",
readingWithProgress: "Reading · {{percent}}%",
finished: "Finished",
dnf: "Did Not Finish",
uploaded: "Uploaded",
},
finishedSection: "Finished",
finishedCount: "{{count}} finished",
finishedCountShort: "{{count}} finished",
allInFinishedShelf: "Your finished books are in the panel below. Tap to expand.",
},
contextMenu: {
syncMetadata: "Sync metadata",
syncingMetadata: "Syncing metadata…",
remove: "Remove",
removing: "Removing…",
confirmRemove: 'Remove "{{title}}" from your library?',
},
toast: {
metadataSynced: 'Metadata synced for "{{title}}"',
noMatch: "No Open Library match found",
refreshDone: "Metadata refresh completed",
removed: '"{{title}}" removed from your library',
},
settings: {
title: "Reading Settings",
loading: "Loading settings...",
loadFailed: "Failed to load settings",
saveFailed: "Failed to save settings",
saved: "Settings saved!",
uiLanguage: "UI Language",
uiLanguageEn: "English",
uiLanguageEs: "Español",
fontSize: "Font Size ({{size}}px)",
fontStyle: "Font Style",
backgroundColor: "Background Color",
fontSans: "Sans Serif",
fontSerif: "Serif",
fontMonospace: "Monospace",
bgWhite: "White",
bgSepia: "Sepia",
bgDark: "Dark",
bgGreen: "Green",
saveSettings: "Save Settings",
},
reader: {
loading: "Loading reader...",
reading: "Reading",
loadBookFailed: "Failed to load book details",
epubOnly: "PDF reading is not supported in the web reader. EPUB only.",
unableToOpen: "Unable to open this book.",
backToLibrary: "Back to library",
prevPage: "Previous page",
nextPage: "Next page",
resumeReading: "Back to reading",
resumeReadingAria: "Return to where you were reading",
backToLibraryAria: "Back to library",
tocAria: "Table of contents",
settingsAria: "Reading settings",
settingsTitle: "Reading Settings",
closeSettingsAria: "Close settings",
theme: "Theme",
font: "Font",
fontSize: "Font Size: {{size}}px",
lineHeight: "Line Height: {{value}}",
margins: "Margins: {{value}}px",
brightness: "Brightness: {{value}}%",
orientation: "Orientation",
themeSepia: "Sepia",
themeDark: "Dark",
themeLight: "Light",
themePaper: "Paper",
fontSans: "Sans-serif",
fontSerif: "Serif",
fontMonospace: "Monospace",
orientationAuto: "Auto",
orientationPortrait: "Portrait",
orientationLandscape: "Landscape",
fontSizeAria: "Font size",
lineHeightAria: "Line height",
marginWidthAria: "Margin width",
brightnessAria: "Brightness",
tocTitle: "Contents",
closeTocAria: "Close table of contents",
tocEmpty: "No chapters available.",
},
addBook: {
title: "Add Book",
fileLabel: "File (EPUB or PDF) *",
selected: "Selected: {{name}}",
titleLabel: "Title *",
titlePlaceholder: "Book title",
authorLabel: "Author",
authorPlaceholder: "Author name",
uploading: "Uploading...",
upload: "Upload Book",
fileTypeError: "Only EPUB and PDF files are supported.",
requiredError: "Title and file are required.",
uploadFailed: "Upload failed.",
},
bookDetail: {
backToLibrary: "Back to Library",
back: "Back",
notFound: "Book not found",
notFoundDescription: "The book you're looking for doesn't exist or has been removed.",
invalidId: "Invalid book ID",
loadFailed: "Failed to load book details",
byAuthor: "by {{author}}",
pages: "{{count}} pages",
description: "Description",
added: "Added {{date}}",
updated: "Updated {{date}}",
},
search: {
searching: "Searching...",
noSuggestions: "No quick suggestions",
},
annotations: {
title: "Bookmarks & Notes",
loading: "Loading markers...",
empty: "No bookmarks or notes yet.",
bookmarkCount: "{{count}} bookmarks",
noteCount: "{{count}} notes",
markerCount: "{{count}} markers",
bookmark: "Bookmark",
note: "Note",
bookmarkOnly: "Bookmark",
saveMarker: "Save",
markerSaved: "Bookmark saved",
markerSavedWithNote: "Note saved",
thoughtPlaceholder: "Your thought about this passage (optional)",
highlightColor: "Highlight color",
highlightCustom: "Custom color",
highlightYellow: "Yellow",
highlightGreen: "Green",
highlightPink: "Pink",
highlightBlue: "Blue",
highlightPurple: "Purple",
selectTextHint: "Select text in the reader to add a bookmark or note.",
showMore: "Show more",
showLess: "Show less",
goToPassage: "Go to passage",
goToPage: "Go to page",
inBookPanel: "Bookmarks in this book",
chapterIndex: "Chapter {{index}}",
page: "Page {{page}}",
pageShort: "p.{{page}}",
loadingBookmarks: "Loading bookmarks...",
bookmarksEmpty: "No bookmarks yet. Select a passage and add a bookmark while reading.",
loadingNotes: "Loading notes...",
notesEmpty: "No notes yet. Select a passage and add a note while reading.",
addToPage: "Add to Page {{page}}",
addBookmark: "Add Bookmark",
addNote: "Add Note",
noteLabel: "Note:",
notePlaceholder: "Write your note here...",
noteEmpty: "Note content cannot be empty.",
saveFailed: "Failed to save annotation.",
close: "Close",
home: "Home",
bookmarksNotes: "Bookmarks & Notes",
},
} as const;
export default enUS;
type LocaleStrings<T> = {
[K in keyof T]: T[K] extends string ? string : LocaleStrings<T[K]>;
};
export type Locale = LocaleStrings<typeof enUS>;