diff --git a/apps/readest-app/i18next-scanner.config.js b/apps/readest-app/i18next-scanner.config.js
new file mode 100644
index 00000000..c48b5f8a
--- /dev/null
+++ b/apps/readest-app/i18next-scanner.config.js
@@ -0,0 +1,30 @@
+module.exports = {
+ input: ['src/**/*.{js,jsx,ts,tsx}', '!src/**/*.test.{js,jsx,ts,tsx}'],
+ output: '.',
+ options: {
+ debug: false,
+ sort: true,
+ func: {
+ list: ['_'],
+ extensions: ['.js', '.jsx', '.ts', '.tsx'],
+ },
+ lngs: ['de', 'ja', 'es', 'fr', 'it', 'ko', 'pt', 'ru', 'tr', 'vi', 'zh-CN', 'zh-TW'],
+ ns: ['translation'],
+ defaultNs: 'translation',
+ defaultValue: '__STRING_NOT_TRANSLATED__',
+ resource: {
+ loadPath: './public/locales/{{lng}}/{{ns}}.json',
+ savePath: './public/locales/{{lng}}/{{ns}}.json',
+ jsonIndent: 2,
+ lineEnding: '\n',
+ },
+ keySeparator: true,
+ nsSeparator: false,
+ interpolation: {
+ prefix: '{{',
+ suffix: '}}',
+ },
+ metadata: {},
+ allowDynamicKeys: true,
+ },
+};
diff --git a/apps/readest-app/package.json b/apps/readest-app/package.json
index 67c8e4b2..a4823bed 100644
--- a/apps/readest-app/package.json
+++ b/apps/readest-app/package.json
@@ -9,6 +9,7 @@
"dev-web": "dotenv -e .env.web -- next dev",
"build-web": "dotenv -e .env.web -- next build",
"start-web": "dotenv -e .env.web -- next start",
+ "i18n:extract": "i18next-scanner",
"lint": "next lint",
"tauri": "tauri",
"prepare-public-vendor": "mkdirp ./public/vendor/pdfjs",
@@ -48,11 +49,15 @@
"cors": "^2.8.5",
"cssbeautify": "^0.3.1",
"foliate-js": "workspace:*",
+ "i18next": "^24.2.0",
+ "i18next-browser-languagedetector": "^8.0.2",
+ "i18next-http-backend": "^3.0.1",
"js-md5": "^0.8.3",
"next": "15.1.0",
"posthog-js": "^1.194.1",
"react": "19.0.0",
"react-dom": "19.0.0",
+ "react-i18next": "^15.2.0",
"react-icons": "^5.3.0",
"tinycolor2": "^1.6.0",
"zustand": "5.0.1"
@@ -71,6 +76,7 @@
"dotenv-cli": "^7.4.4",
"eslint": "^9.16.0",
"eslint-config-next": "15.0.3",
+ "i18next-scanner": "^4.6.0",
"mkdirp": "^3.0.1",
"node-env-run": "^4.0.2",
"postcss": "^8.4.49",
diff --git a/apps/readest-app/public/locales/de/translation.json b/apps/readest-app/public/locales/de/translation.json
new file mode 100644
index 00000000..24ec9b11
--- /dev/null
+++ b/apps/readest-app/public/locales/de/translation.json
@@ -0,0 +1,92 @@
+{
+ "About Readest": "Über Readest",
+ "Add your notes here...": "Fügen Sie hier Ihre Notizen hinzu...",
+ "Animation": "Animation",
+ "Auto Mode": "Automatischer Modus",
+ "Behavior": "Verhalten",
+ "Book": "Buch",
+ "Book Cover": "Buchcover",
+ "Bookmark": "Lesezeichen",
+ "Cancel": "Abbrechen",
+ "Chapter": "Kapitel",
+ "Color": "Farbe",
+ "Confirm": "Bestätigen",
+ "Confirm Deletion": "Löschen bestätigen",
+ "Custom CSS": "Benutzerdefiniertes CSS",
+ "Dark Mode": "Dunkelmodus",
+ "Default Font": "Standardschriftart",
+ "Delete": "Löschen",
+ "Disable Click-to-Flip": "Klick zum Blättern deaktivieren",
+ "Download Readest": "Readest herunterladen",
+ "Edit": "Bearbeiten",
+ "Excerpts": "Auszüge",
+ "Font": "Schriftart",
+ "Font & Layout": "Schrift & Layout",
+ "Font Face": "Schriftschnitt",
+ "Font Family": "Schriftfamilie",
+ "Font Size": "Schriftgröße",
+ "From Local File": "Aus lokaler Datei",
+ "Full Justification": "Blocksatz",
+ "Gaps (%)": "Abstände (%)",
+ "Global Settings": "Globale Einstellungen",
+ "Go Back": "Zurück",
+ "Go Forward": "Vorwärts",
+ "Go Left": "Nach links",
+ "Go Right": "Nach rechts",
+ "Hyphenation": "Silbentrennung",
+ "Identifier:": "Kennung:",
+ "Import Books": "Bücher importieren",
+ "Invert Colors in Dark Mode": "Farben im Dunkelmodus invertieren",
+ "Language:": "Sprache:",
+ "Layout": "Layout",
+ "Light Mode": "Hellmodus",
+ "Loading...": "Wird geladen...",
+ "Loc. {{currentPage}} / {{totalPage}}": "Pos. {{currentPage}} / {{totalPage}}",
+ "Logged in": "Angemeldet",
+ "Logged in as {{userDisplayName}}": "Angemeldet als {{userDisplayName}}",
+ "Margins (px)": "Ränder (px)",
+ "Match Case": "Groß-/Kleinschreibung beachten",
+ "Match Diacritics": "Akzente beachten",
+ "Match Whole Words": "Ganze Wörter",
+ "Maximum Block Size": "Maximale Blockgröße",
+ "Maximum Inline Size": "Maximale Zeilengröße",
+ "Maximum Number of Columns": "Maximale Spaltenanzahl",
+ "Misc": "Sonstiges",
+ "Monospace Font": "Monospace-Schriftart",
+ "More Info": "Weitere Informationen",
+ "Notebook": "Notizbuch",
+ "Notes": "Notizen",
+ "Open": "Öffnen",
+ "Override Publisher Font": "Verleger-Schriftart überschreiben",
+ "Page": "Seite",
+ "Paging Animation": "Blätter-Animation",
+ "Paragraph": "Absatz",
+ "Parallel Read": "Paralleles Lesen",
+ "Published:": "Veröffentlicht:",
+ "Publisher:": "Verlag:",
+ "Reload Page": "Seite neu laden",
+ "Reveal in File Explorer": "Im Datei-Explorer anzeigen",
+ "Reveal in Finder": "Im Finder anzeigen",
+ "Reveal in Folder": "Im Ordner anzeigen",
+ "Sans-Serif Font": "Serifenlose Schriftart",
+ "Save": "Speichern",
+ "Scrolled Mode": "Scroll-Modus",
+ "Search books...": "Bücher suchen...",
+ "Search...": "Suchen...",
+ "Select books": "Bücher auswählen",
+ "Select multiple books": "Mehrere Bücher auswählen",
+ "Serif Font": "Serifenschrift",
+ "Sidebar": "Seitenleiste",
+ "Sign In": "Anmelden",
+ "Sign Out": "Abmelden",
+ "Subjects:": "Themen:",
+ "Theme Color": "Themenfarbe",
+ "Theme Mode": "Themenmodus",
+ "Unknown": "Unbekannt",
+ "Untitled": "Ohne Titel",
+ "Updated:": "Aktualisiert:",
+ "User avatar": "Benutzer-Avatar",
+ "Version {{version}}": "Version {{version}}",
+ "Welcome to your library. You can import your books here and read them anytime.": "Willkommen in Ihrer Bibliothek. Sie können hier Ihre Bücher importieren und jederzeit lesen.",
+ "Your Library": "Ihre Bibliothek"
+}
diff --git a/apps/readest-app/public/locales/en/translation.json b/apps/readest-app/public/locales/en/translation.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/apps/readest-app/public/locales/en/translation.json
@@ -0,0 +1 @@
+{}
diff --git a/apps/readest-app/public/locales/es/translation.json b/apps/readest-app/public/locales/es/translation.json
new file mode 100644
index 00000000..5bb4c440
--- /dev/null
+++ b/apps/readest-app/public/locales/es/translation.json
@@ -0,0 +1,92 @@
+{
+ "About Readest": "Acerca de Readest",
+ "Add your notes here...": "Añade tus notas aquí...",
+ "Animation": "Animación",
+ "Auto Mode": "Modo automático",
+ "Behavior": "Comportamiento",
+ "Book": "Libro",
+ "Book Cover": "Portada del libro",
+ "Bookmark": "Marcador",
+ "Cancel": "Cancelar",
+ "Chapter": "Capítulo",
+ "Color": "Color",
+ "Confirm": "Confirmar",
+ "Confirm Deletion": "Confirmar eliminación",
+ "Custom CSS": "CSS personalizado",
+ "Dark Mode": "Modo oscuro",
+ "Default Font": "Fuente predeterminada",
+ "Delete": "Eliminar",
+ "Disable Click-to-Flip": "Desactivar clic para voltear",
+ "Download Readest": "Descargar Readest",
+ "Edit": "Editar",
+ "Excerpts": "Extractos",
+ "Font": "Fuente",
+ "Font & Layout": "Fuente y diseño",
+ "Font Face": "Tipo de fuente",
+ "Font Family": "Familia de fuente",
+ "Font Size": "Tamaño de fuente",
+ "From Local File": "Desde archivo local",
+ "Full Justification": "Justificación completa",
+ "Gaps (%)": "Espacios (%)",
+ "Global Settings": "Configuración global",
+ "Go Back": "Volver",
+ "Go Forward": "Avanzar",
+ "Go Left": "Ir a la izquierda",
+ "Go Right": "Ir a la derecha",
+ "Hyphenation": "Guionización",
+ "Identifier:": "Identificador:",
+ "Import Books": "Importar libros",
+ "Invert Colors in Dark Mode": "Invertir colores en modo oscuro",
+ "Language:": "Idioma:",
+ "Layout": "Diseño",
+ "Light Mode": "Modo claro",
+ "Loading...": "Cargando...",
+ "Loc. {{currentPage}} / {{totalPage}}": "Pos. {{currentPage}} / {{totalPage}}",
+ "Logged in": "Sesión iniciada",
+ "Logged in as {{userDisplayName}}": "Sesión iniciada como {{userDisplayName}}",
+ "Margins (px)": "Márgenes (px)",
+ "Match Case": "Coincidir mayúsculas y minúsculas",
+ "Match Diacritics": "Coincidir diacríticos",
+ "Match Whole Words": "Coincidir palabras completas",
+ "Maximum Block Size": "Tamaño máximo de bloque",
+ "Maximum Inline Size": "Tamaño máximo en línea",
+ "Maximum Number of Columns": "Número máximo de columnas",
+ "Misc": "Varios",
+ "Monospace Font": "Fuente monoespaciada",
+ "More Info": "Más información",
+ "Notebook": "Cuaderno",
+ "Notes": "Notas",
+ "Open": "Abrir",
+ "Override Publisher Font": "Sobrescribir fuente del editor",
+ "Page": "Página",
+ "Paging Animation": "Animación de paginación",
+ "Paragraph": "Párrafo",
+ "Parallel Read": "Lectura paralela",
+ "Published:": "Publicado:",
+ "Publisher:": "Editorial:",
+ "Reload Page": "Recargar página",
+ "Reveal in File Explorer": "Mostrar en el Explorador de archivos",
+ "Reveal in Finder": "Mostrar en Finder",
+ "Reveal in Folder": "Mostrar en carpeta",
+ "Sans-Serif Font": "Fuente sans-serif",
+ "Save": "Guardar",
+ "Scrolled Mode": "Modo desplazamiento",
+ "Search books...": "Buscar libros...",
+ "Search...": "Buscar...",
+ "Select books": "Seleccionar libros",
+ "Select multiple books": "Seleccionar varios libros",
+ "Serif Font": "Fuente serif",
+ "Sidebar": "Barra lateral",
+ "Sign In": "Iniciar sesión",
+ "Sign Out": "Cerrar sesión",
+ "Subjects:": "Temas:",
+ "Theme Color": "Color del tema",
+ "Theme Mode": "Modo del tema",
+ "Unknown": "Desconocido",
+ "Untitled": "Sin título",
+ "Updated:": "Actualizado:",
+ "User avatar": "Avatar del usuario",
+ "Version {{version}}": "Versión {{version}}",
+ "Welcome to your library. You can import your books here and read them anytime.": "Bienvenido a tu biblioteca. Puedes importar tus libros aquí y leerlos en cualquier momento.",
+ "Your Library": "Tu biblioteca"
+}
diff --git a/apps/readest-app/public/locales/fr/translation.json b/apps/readest-app/public/locales/fr/translation.json
new file mode 100644
index 00000000..40247aae
--- /dev/null
+++ b/apps/readest-app/public/locales/fr/translation.json
@@ -0,0 +1,92 @@
+{
+ "About Readest": "À propos de Readest",
+ "Add your notes here...": "Ajoutez vos notes ici...",
+ "Animation": "Animation",
+ "Auto Mode": "Mode automatique",
+ "Behavior": "Comportement",
+ "Book": "Livre",
+ "Book Cover": "Couverture du livre",
+ "Bookmark": "Signet",
+ "Cancel": "Annuler",
+ "Chapter": "Chapitre",
+ "Color": "Couleur",
+ "Confirm": "Confirmer",
+ "Confirm Deletion": "Confirmer la suppression",
+ "Custom CSS": "CSS personnalisé",
+ "Dark Mode": "Mode sombre",
+ "Default Font": "Police par défaut",
+ "Delete": "Supprimer",
+ "Disable Click-to-Flip": "Désactiver le clic pour tourner",
+ "Download Readest": "Télécharger Readest",
+ "Edit": "Modifier",
+ "Excerpts": "Extraits",
+ "Font": "Police",
+ "Font & Layout": "Police et mise en page",
+ "Font Face": "Style de police",
+ "Font Family": "Famille de police",
+ "Font Size": "Taille de police",
+ "From Local File": "Depuis un fichier local",
+ "Full Justification": "Justification complète",
+ "Gaps (%)": "Espaces (%)",
+ "Global Settings": "Paramètres globaux",
+ "Go Back": "Retour",
+ "Go Forward": "Avancer",
+ "Go Left": "Aller à gauche",
+ "Go Right": "Aller à droite",
+ "Hyphenation": "Césure",
+ "Identifier:": "Identifiant :",
+ "Import Books": "Importer des livres",
+ "Invert Colors in Dark Mode": "Inverser les couleurs en mode sombre",
+ "Language:": "Langue :",
+ "Layout": "Mise en page",
+ "Light Mode": "Mode clair",
+ "Loading...": "Chargement...",
+ "Loc. {{currentPage}} / {{totalPage}}": "Pos. {{currentPage}} / {{totalPage}}",
+ "Logged in": "Connecté",
+ "Logged in as {{userDisplayName}}": "Connecté en tant que {{userDisplayName}}",
+ "Margins (px)": "Marges (px)",
+ "Match Case": "Respecter la casse",
+ "Match Diacritics": "Respecter les accents",
+ "Match Whole Words": "Mots entiers",
+ "Maximum Block Size": "Taille maximale du bloc",
+ "Maximum Inline Size": "Taille maximale en ligne",
+ "Maximum Number of Columns": "Nombre maximal de colonnes",
+ "Misc": "Divers",
+ "Monospace Font": "Police monospace",
+ "More Info": "Plus d'informations",
+ "Notebook": "Carnet de notes",
+ "Notes": "Notes",
+ "Open": "Ouvrir",
+ "Override Publisher Font": "Remplacer la police de l'éditeur",
+ "Page": "Page",
+ "Paging Animation": "Animation de page",
+ "Paragraph": "Paragraphe",
+ "Parallel Read": "Lecture parallèle",
+ "Published:": "Publié :",
+ "Publisher:": "Éditeur :",
+ "Reload Page": "Recharger la page",
+ "Reveal in File Explorer": "Afficher dans l'explorateur de fichiers",
+ "Reveal in Finder": "Afficher dans le Finder",
+ "Reveal in Folder": "Afficher dans le dossier",
+ "Sans-Serif Font": "Police sans empattement",
+ "Save": "Enregistrer",
+ "Scrolled Mode": "Mode défilement",
+ "Search books...": "Rechercher des livres...",
+ "Search...": "Rechercher...",
+ "Select books": "Sélectionner des livres",
+ "Select multiple books": "Sélectionner plusieurs livres",
+ "Serif Font": "Police avec empattement",
+ "Sidebar": "Barre latérale",
+ "Sign In": "Se connecter",
+ "Sign Out": "Se déconnecter",
+ "Subjects:": "Sujets :",
+ "Theme Color": "Couleur du thème",
+ "Theme Mode": "Mode du thème",
+ "Unknown": "Inconnu",
+ "Untitled": "Sans titre",
+ "Updated:": "Mis à jour :",
+ "User avatar": "Avatar de l'utilisateur",
+ "Version {{version}}": "Version {{version}}",
+ "Welcome to your library. You can import your books here and read them anytime.": "Bienvenue dans votre bibliothèque. Vous pouvez importer vos livres ici et les lire à tout moment.",
+ "Your Library": "Votre bibliothèque"
+}
diff --git a/apps/readest-app/public/locales/it/translation.json b/apps/readest-app/public/locales/it/translation.json
new file mode 100644
index 00000000..47a6efad
--- /dev/null
+++ b/apps/readest-app/public/locales/it/translation.json
@@ -0,0 +1,92 @@
+{
+ "About Readest": "Informazioni su Readest",
+ "Add your notes here...": "Aggiungi qui le tue note...",
+ "Animation": "Animazione",
+ "Auto Mode": "Modalità automatica",
+ "Behavior": "Comportamento",
+ "Book": "Libro",
+ "Book Cover": "Copertina",
+ "Bookmark": "Segnalibro",
+ "Cancel": "Annulla",
+ "Chapter": "Capitolo",
+ "Color": "Colore",
+ "Confirm": "Conferma",
+ "Confirm Deletion": "Conferma eliminazione",
+ "Custom CSS": "CSS personalizzato",
+ "Dark Mode": "Modalità scura",
+ "Default Font": "Font predefinito",
+ "Delete": "Elimina",
+ "Disable Click-to-Flip": "Disattiva click per voltare pagina",
+ "Download Readest": "Scarica Readest",
+ "Edit": "Modifica",
+ "Excerpts": "Estratti",
+ "Font": "Font",
+ "Font & Layout": "Font e Layout",
+ "Font Face": "Tipo di carattere",
+ "Font Family": "Famiglia di caratteri",
+ "Font Size": "Dimensione carattere",
+ "From Local File": "Da file locale",
+ "Full Justification": "Giustificazione completa",
+ "Gaps (%)": "Spaziature (%)",
+ "Global Settings": "Impostazioni globali",
+ "Go Back": "Indietro",
+ "Go Forward": "Avanti",
+ "Go Left": "Vai a sinistra",
+ "Go Right": "Vai a destra",
+ "Hyphenation": "Sillabazione",
+ "Identifier:": "Identificatore:",
+ "Import Books": "Importa libri",
+ "Invert Colors in Dark Mode": "Inverti colori in modalità scura",
+ "Language:": "Lingua:",
+ "Layout": "Layout",
+ "Light Mode": "Modalità chiara",
+ "Loading...": "Caricamento...",
+ "Loc. {{currentPage}} / {{totalPage}}": "Pos. {{currentPage}} / {{totalPage}}",
+ "Logged in": "Accesso effettuato",
+ "Logged in as {{userDisplayName}}": "Accesso effettuato come {{userDisplayName}}",
+ "Margins (px)": "Margini (px)",
+ "Match Case": "Maiuscole/minuscole",
+ "Match Diacritics": "Corrispondenza diacritici",
+ "Match Whole Words": "Parole intere",
+ "Maximum Block Size": "Dimensione massima blocco",
+ "Maximum Inline Size": "Dimensione massima in linea",
+ "Maximum Number of Columns": "Numero massimo di colonne",
+ "Misc": "Varie",
+ "Monospace Font": "Font monospazio",
+ "More Info": "Maggiori informazioni",
+ "Notebook": "Quaderno",
+ "Notes": "Note",
+ "Open": "Apri",
+ "Override Publisher Font": "Sostituisci font editore",
+ "Page": "Pagina",
+ "Paging Animation": "Animazione cambio pagina",
+ "Paragraph": "Paragrafo",
+ "Parallel Read": "Lettura parallela",
+ "Published:": "Pubblicato:",
+ "Publisher:": "Editore:",
+ "Reload Page": "Ricarica pagina",
+ "Reveal in File Explorer": "Mostra in Esplora file",
+ "Reveal in Finder": "Mostra nel Finder",
+ "Reveal in Folder": "Mostra nella cartella",
+ "Sans-Serif Font": "Font sans-serif",
+ "Save": "Salva",
+ "Scrolled Mode": "Modalità scorrimento",
+ "Search books...": "Cerca libri...",
+ "Search...": "Cerca...",
+ "Select books": "Seleziona libri",
+ "Select multiple books": "Seleziona più libri",
+ "Serif Font": "Font serif",
+ "Sidebar": "Barra laterale",
+ "Sign In": "Accedi",
+ "Sign Out": "Esci",
+ "Subjects:": "Argomenti:",
+ "Theme Color": "Colore tema",
+ "Theme Mode": "Modalità tema",
+ "Unknown": "Sconosciuto",
+ "Untitled": "Senza titolo",
+ "Updated:": "Aggiornato:",
+ "User avatar": "Avatar utente",
+ "Version {{version}}": "Versione {{version}}",
+ "Welcome to your library. You can import your books here and read them anytime.": "Benvenuto nella tua biblioteca. Puoi importare i tuoi libri qui e leggerli in qualsiasi momento.",
+ "Your Library": "La tua biblioteca"
+}
diff --git a/apps/readest-app/public/locales/ja/translation.json b/apps/readest-app/public/locales/ja/translation.json
new file mode 100644
index 00000000..281c0336
--- /dev/null
+++ b/apps/readest-app/public/locales/ja/translation.json
@@ -0,0 +1,92 @@
+{
+ "About Readest": "Readestについて",
+ "Add your notes here...": "ここにメモを追加...",
+ "Animation": "アニメーション",
+ "Auto Mode": "自動モード",
+ "Behavior": "動作",
+ "Book": "書籍",
+ "Book Cover": "表紙",
+ "Bookmark": "ブックマーク",
+ "Cancel": "キャンセル",
+ "Chapter": "章",
+ "Color": "色",
+ "Confirm": "確認",
+ "Confirm Deletion": "削除の確認",
+ "Custom CSS": "カスタムCSS",
+ "Dark Mode": "ダークモード",
+ "Default Font": "デフォルトフォント",
+ "Delete": "削除",
+ "Disable Click-to-Flip": "クリックめくりを無効化",
+ "Download Readest": "Readestをダウンロード",
+ "Edit": "編集",
+ "Excerpts": "抜粋",
+ "Font": "フォント",
+ "Font & Layout": "フォントとレイアウト",
+ "Font Face": "書体",
+ "Font Family": "フォントファミリー",
+ "Font Size": "フォントサイズ",
+ "From Local File": "ローカルファイルから",
+ "Full Justification": "両端揃え",
+ "Gaps (%)": "間隔 (%)",
+ "Global Settings": "全体設定",
+ "Go Back": "戻る",
+ "Go Forward": "進む",
+ "Go Left": "左へ",
+ "Go Right": "右へ",
+ "Hyphenation": "ハイフネーション",
+ "Identifier:": "識別子:",
+ "Import Books": "書籍をインポート",
+ "Invert Colors in Dark Mode": "ダークモードで色を反転",
+ "Language:": "言語:",
+ "Layout": "レイアウト",
+ "Light Mode": "ライトモード",
+ "Loading...": "読み込み中...",
+ "Loc. {{currentPage}} / {{totalPage}}": "位置 {{currentPage}} / {{totalPage}}",
+ "Logged in": "ログイン済み",
+ "Logged in as {{userDisplayName}}": "{{userDisplayName}}としてログイン中",
+ "Margins (px)": "余白 (px)",
+ "Match Case": "大文字・小文字を区別",
+ "Match Diacritics": "アクセント記号を区別",
+ "Match Whole Words": "単語全体を一致",
+ "Maximum Block Size": "最大ブロックサイズ",
+ "Maximum Inline Size": "最大インラインサイズ",
+ "Maximum Number of Columns": "最大列数",
+ "Misc": "その他",
+ "Monospace Font": "等幅フォント",
+ "More Info": "詳細情報",
+ "Notebook": "ノート",
+ "Notes": "メモ",
+ "Open": "開く",
+ "Override Publisher Font": "出版社フォントを上書き",
+ "Page": "ページ",
+ "Paging Animation": "ページめくりアニメーション",
+ "Paragraph": "段落",
+ "Parallel Read": "並列読書",
+ "Published:": "出版日:",
+ "Publisher:": "出版社:",
+ "Reload Page": "ページを再読み込み",
+ "Reveal in File Explorer": "エクスプローラーで表示",
+ "Reveal in Finder": "Finderで表示",
+ "Reveal in Folder": "フォルダーで表示",
+ "Sans-Serif Font": "ゴシック体",
+ "Save": "保存",
+ "Scrolled Mode": "スクロールモード",
+ "Search books...": "書籍を検索...",
+ "Search...": "検索...",
+ "Select books": "書籍を選択",
+ "Select multiple books": "複数の書籍を選択",
+ "Serif Font": "明朝体",
+ "Sidebar": "サイドバー",
+ "Sign In": "サインイン",
+ "Sign Out": "サインアウト",
+ "Subjects:": "主題:",
+ "Theme Color": "テーマカラー",
+ "Theme Mode": "テーマモード",
+ "Unknown": "不明",
+ "Untitled": "無題",
+ "Updated:": "更新日:",
+ "User avatar": "ユーザーアバター",
+ "Version {{version}}": "バージョン {{version}}",
+ "Welcome to your library. You can import your books here and read them anytime.": "ライブラリーへようこそ。ここに書籍をインポートして、いつでも読むことができます。",
+ "Your Library": "ライブラリー"
+}
diff --git a/apps/readest-app/public/locales/ko/translation.json b/apps/readest-app/public/locales/ko/translation.json
new file mode 100644
index 00000000..a54b24c8
--- /dev/null
+++ b/apps/readest-app/public/locales/ko/translation.json
@@ -0,0 +1,92 @@
+{
+ "About Readest": "Readest 정보",
+ "Add your notes here...": "여기에 메모를 추가하세요...",
+ "Animation": "애니메이션",
+ "Auto Mode": "자동 모드",
+ "Behavior": "동작",
+ "Book": "책",
+ "Book Cover": "책 표지",
+ "Bookmark": "북마크",
+ "Cancel": "취소",
+ "Chapter": "챕터",
+ "Color": "색상",
+ "Confirm": "확인",
+ "Confirm Deletion": "삭제 확인",
+ "Custom CSS": "사용자 정의 CSS",
+ "Dark Mode": "다크 모드",
+ "Default Font": "기본 글꼴",
+ "Delete": "삭제",
+ "Disable Click-to-Flip": "클릭 넘기기 비활성화",
+ "Download Readest": "Readest 다운로드",
+ "Edit": "편집",
+ "Excerpts": "발췌",
+ "Font": "글꼴",
+ "Font & Layout": "글꼴 및 레이아웃",
+ "Font Face": "글꼴 스타일",
+ "Font Family": "글꼴 패밀리",
+ "Font Size": "글꼴 크기",
+ "From Local File": "로컬 파일에서",
+ "Full Justification": "양쪽 정렬",
+ "Gaps (%)": "간격 (%)",
+ "Global Settings": "전역 설정",
+ "Go Back": "뒤로",
+ "Go Forward": "앞으로",
+ "Go Left": "왼쪽으로",
+ "Go Right": "오른쪽으로",
+ "Hyphenation": "하이픈 넣기",
+ "Identifier:": "식별자:",
+ "Import Books": "책 가져오기",
+ "Invert Colors in Dark Mode": "다크 모드에서 색상 반전",
+ "Language:": "언어:",
+ "Layout": "레이아웃",
+ "Light Mode": "라이트 모드",
+ "Loading...": "로딩 중...",
+ "Loc. {{currentPage}} / {{totalPage}}": "위치 {{currentPage}} / {{totalPage}}",
+ "Logged in": "로그인됨",
+ "Logged in as {{userDisplayName}}": "{{userDisplayName}}(으)로 로그인됨",
+ "Margins (px)": "여백 (px)",
+ "Match Case": "대소문자 구분",
+ "Match Diacritics": "발음 구별 부호 구분",
+ "Match Whole Words": "전체 단어 일치",
+ "Maximum Block Size": "최대 블록 크기",
+ "Maximum Inline Size": "최대 인라인 크기",
+ "Maximum Number of Columns": "최대 열 수",
+ "Misc": "기타",
+ "Monospace Font": "고정폭 글꼴",
+ "More Info": "추가 정보",
+ "Notebook": "노트북",
+ "Notes": "메모",
+ "Open": "열기",
+ "Override Publisher Font": "출판사 글꼴 재정의",
+ "Page": "페이지",
+ "Paging Animation": "페이지 넘김 애니메이션",
+ "Paragraph": "단락",
+ "Parallel Read": "병렬 읽기",
+ "Published:": "출판일:",
+ "Publisher:": "출판사:",
+ "Reload Page": "페이지 새로고침",
+ "Reveal in File Explorer": "파일 탐색기에서 표시",
+ "Reveal in Finder": "Finder에서 표시",
+ "Reveal in Folder": "폴더에서 표시",
+ "Sans-Serif Font": "산세리프체",
+ "Save": "저장",
+ "Scrolled Mode": "스크롤 모드",
+ "Search books...": "책 검색...",
+ "Search...": "검색...",
+ "Select books": "책 선택",
+ "Select multiple books": "여러 책 선택",
+ "Serif Font": "세리프체",
+ "Sidebar": "사이드바",
+ "Sign In": "로그인",
+ "Sign Out": "로그아웃",
+ "Subjects:": "주제:",
+ "Theme Color": "테마 색상",
+ "Theme Mode": "테마 모드",
+ "Unknown": "알 수 없음",
+ "Untitled": "제목 없음",
+ "Updated:": "업데이트일:",
+ "User avatar": "사용자 아바타",
+ "Version {{version}}": "버전 {{version}}",
+ "Welcome to your library. You can import your books here and read them anytime.": "내 서재에 오신 것을 환영합니다. 여기에서 책을 가져와 언제든지 읽을 수 있습니다.",
+ "Your Library": "내 서재"
+}
diff --git a/apps/readest-app/public/locales/pt/translation.json b/apps/readest-app/public/locales/pt/translation.json
new file mode 100644
index 00000000..90aebfc2
--- /dev/null
+++ b/apps/readest-app/public/locales/pt/translation.json
@@ -0,0 +1,92 @@
+{
+ "About Readest": "Sobre o Readest",
+ "Add your notes here...": "Adicione suas notas aqui...",
+ "Animation": "Animação",
+ "Auto Mode": "Modo Automático",
+ "Behavior": "Comportamento",
+ "Book": "Livro",
+ "Book Cover": "Capa do Livro",
+ "Bookmark": "Marcador",
+ "Cancel": "Cancelar",
+ "Chapter": "Capítulo",
+ "Color": "Cor",
+ "Confirm": "Confirmar",
+ "Confirm Deletion": "Confirmar Exclusão",
+ "Custom CSS": "CSS Personalizado",
+ "Dark Mode": "Modo Escuro",
+ "Default Font": "Fonte Padrão",
+ "Delete": "Excluir",
+ "Disable Click-to-Flip": "Desativar Clique para Virar",
+ "Download Readest": "Baixar Readest",
+ "Edit": "Editar",
+ "Excerpts": "Trechos",
+ "Font": "Fonte",
+ "Font & Layout": "Fonte e Layout",
+ "Font Face": "Estilo da Fonte",
+ "Font Family": "Família da Fonte",
+ "Font Size": "Tamanho da Fonte",
+ "From Local File": "Do Arquivo Local",
+ "Full Justification": "Justificação Completa",
+ "Gaps (%)": "Espaçamentos (%)",
+ "Global Settings": "Configurações Globais",
+ "Go Back": "Voltar",
+ "Go Forward": "Avançar",
+ "Go Left": "Ir para Esquerda",
+ "Go Right": "Ir para Direita",
+ "Hyphenation": "Hifenização",
+ "Identifier:": "Identificador:",
+ "Import Books": "Importar Livros",
+ "Invert Colors in Dark Mode": "Inverter Cores no Modo Escuro",
+ "Language:": "Idioma:",
+ "Layout": "Layout",
+ "Light Mode": "Modo Claro",
+ "Loading...": "Carregando...",
+ "Loc. {{currentPage}} / {{totalPage}}": "Loc. {{currentPage}} / {{totalPage}}",
+ "Logged in": "Conectado",
+ "Logged in as {{userDisplayName}}": "Conectado como {{userDisplayName}}",
+ "Margins (px)": "Margens (px)",
+ "Match Case": "Diferenciar Maiúsculas e Minúsculas",
+ "Match Diacritics": "Corresponder Acentos",
+ "Match Whole Words": "Corresponder Palavras Inteiras",
+ "Maximum Block Size": "Tamanho Máximo do Bloco",
+ "Maximum Inline Size": "Tamanho Máximo em Linha",
+ "Maximum Number of Columns": "Número Máximo de Colunas",
+ "Misc": "Diversos",
+ "Monospace Font": "Fonte Monoespaçada",
+ "More Info": "Mais Informações",
+ "Notebook": "Caderno",
+ "Notes": "Notas",
+ "Open": "Abrir",
+ "Override Publisher Font": "Substituir Fonte do Editor",
+ "Page": "Página",
+ "Paging Animation": "Animação de Página",
+ "Paragraph": "Parágrafo",
+ "Parallel Read": "Leitura Paralela",
+ "Published:": "Publicado:",
+ "Publisher:": "Editora:",
+ "Reload Page": "Recarregar Página",
+ "Reveal in File Explorer": "Mostrar no Explorador de Arquivos",
+ "Reveal in Finder": "Mostrar no Finder",
+ "Reveal in Folder": "Mostrar na Pasta",
+ "Sans-Serif Font": "Fonte Sans-Serif",
+ "Save": "Salvar",
+ "Scrolled Mode": "Modo de Rolagem",
+ "Search books...": "Procurar livros...",
+ "Search...": "Pesquisar...",
+ "Select books": "Selecionar livros",
+ "Select multiple books": "Selecionar múltiplos livros",
+ "Serif Font": "Fonte Serif",
+ "Sidebar": "Barra Lateral",
+ "Sign In": "Entrar",
+ "Sign Out": "Sair",
+ "Subjects:": "Assuntos:",
+ "Theme Color": "Cor do Tema",
+ "Theme Mode": "Modo do Tema",
+ "Unknown": "Desconhecido",
+ "Untitled": "Sem Título",
+ "Updated:": "Atualizado:",
+ "User avatar": "Avatar do usuário",
+ "Version {{version}}": "Versão {{version}}",
+ "Welcome to your library. You can import your books here and read them anytime.": "Bem-vindo à sua biblioteca. Você pode importar seus livros aqui e lê-los a qualquer momento.",
+ "Your Library": "Sua Biblioteca"
+}
diff --git a/apps/readest-app/public/locales/ru/translation.json b/apps/readest-app/public/locales/ru/translation.json
new file mode 100644
index 00000000..49c32e0f
--- /dev/null
+++ b/apps/readest-app/public/locales/ru/translation.json
@@ -0,0 +1,92 @@
+{
+ "About Readest": "О Readest",
+ "Add your notes here...": "Добавьте свои заметки здесь...",
+ "Animation": "Анимация",
+ "Auto Mode": "Автоматический режим",
+ "Behavior": "Поведение",
+ "Book": "Книга",
+ "Book Cover": "Обложка книги",
+ "Bookmark": "Закладка",
+ "Cancel": "Отмена",
+ "Chapter": "Глава",
+ "Color": "Цвет",
+ "Confirm": "Подтвердить",
+ "Confirm Deletion": "Подтвердить удаление",
+ "Custom CSS": "Пользовательский CSS",
+ "Dark Mode": "Тёмная тема",
+ "Default Font": "Шрифт по умолчанию",
+ "Delete": "Удалить",
+ "Disable Click-to-Flip": "Отключить переворот по клику",
+ "Download Readest": "Скачать Readest",
+ "Edit": "Редактировать",
+ "Excerpts": "Отрывки",
+ "Font": "Шрифт",
+ "Font & Layout": "Шрифт и макет",
+ "Font Face": "Начертание шрифта",
+ "Font Family": "Семейство шрифтов",
+ "Font Size": "Размер шрифта",
+ "From Local File": "Из локального файла",
+ "Full Justification": "Полное выравнивание",
+ "Gaps (%)": "Промежутки (%)",
+ "Global Settings": "Общие настройки",
+ "Go Back": "Назад",
+ "Go Forward": "Вперёд",
+ "Go Left": "Влево",
+ "Go Right": "Вправо",
+ "Hyphenation": "Перенос слов",
+ "Identifier:": "Идентификатор:",
+ "Import Books": "Импорт книг",
+ "Invert Colors in Dark Mode": "Инвертировать цвета в тёмной теме",
+ "Language:": "Язык:",
+ "Layout": "Макет",
+ "Light Mode": "Светлая тема",
+ "Loading...": "Загрузка...",
+ "Loc. {{currentPage}} / {{totalPage}}": "Поз. {{currentPage}} / {{totalPage}}",
+ "Logged in": "Выполнен вход",
+ "Logged in as {{userDisplayName}}": "Вход выполнен как {{userDisplayName}}",
+ "Margins (px)": "Отступы (px)",
+ "Match Case": "Учитывать регистр",
+ "Match Diacritics": "Учитывать диакритические знаки",
+ "Match Whole Words": "Только целые слова",
+ "Maximum Block Size": "Максимальный размер блока",
+ "Maximum Inline Size": "Максимальный размер строки",
+ "Maximum Number of Columns": "Максимальное количество колонок",
+ "Misc": "Разное",
+ "Monospace Font": "Моноширинный шрифт",
+ "More Info": "Подробнее",
+ "Notebook": "Блокнот",
+ "Notes": "Заметки",
+ "Open": "Открыть",
+ "Override Publisher Font": "Переопределить шрифт издателя",
+ "Page": "Страница",
+ "Paging Animation": "Анимация перелистывания",
+ "Paragraph": "Абзац",
+ "Parallel Read": "Параллельное чтение",
+ "Published:": "Опубликовано:",
+ "Publisher:": "Издатель:",
+ "Reload Page": "Перезагрузить страницу",
+ "Reveal in File Explorer": "Показать в проводнике",
+ "Reveal in Finder": "Показать в Finder",
+ "Reveal in Folder": "Показать в папке",
+ "Sans-Serif Font": "Шрифт без засечек",
+ "Save": "Сохранить",
+ "Scrolled Mode": "Режим прокрутки",
+ "Search books...": "Поиск книг...",
+ "Search...": "Поиск...",
+ "Select books": "Выбрать книги",
+ "Select multiple books": "Выбрать несколько книг",
+ "Serif Font": "Шрифт с засечками",
+ "Sidebar": "Боковая панель",
+ "Sign In": "Войти",
+ "Sign Out": "Выйти",
+ "Subjects:": "Темы:",
+ "Theme Color": "Цвет темы",
+ "Theme Mode": "Режим темы",
+ "Unknown": "Неизвестно",
+ "Untitled": "Без названия",
+ "Updated:": "Обновлено:",
+ "User avatar": "Аватар пользователя",
+ "Version {{version}}": "Версия {{version}}",
+ "Welcome to your library. You can import your books here and read them anytime.": "Добро пожаловать в вашу библиотеку. Вы можете импортировать сюда книги и читать их в любое время.",
+ "Your Library": "Ваша библиотека"
+}
diff --git a/apps/readest-app/public/locales/tr/translation.json b/apps/readest-app/public/locales/tr/translation.json
new file mode 100644
index 00000000..84bbf5fa
--- /dev/null
+++ b/apps/readest-app/public/locales/tr/translation.json
@@ -0,0 +1,92 @@
+{
+ "About Readest": "Readest Hakkında",
+ "Add your notes here...": "Notlarınızı buraya ekleyin...",
+ "Animation": "Animasyon",
+ "Auto Mode": "Otomatik Mod",
+ "Behavior": "Davranış",
+ "Book": "Kitap",
+ "Book Cover": "Kitap Kapağı",
+ "Bookmark": "Yer İmi",
+ "Cancel": "İptal",
+ "Chapter": "Bölüm",
+ "Color": "Renk",
+ "Confirm": "Onayla",
+ "Confirm Deletion": "Silmeyi Onayla",
+ "Custom CSS": "Özel CSS",
+ "Dark Mode": "Karanlık Mod",
+ "Default Font": "Varsayılan Yazı Tipi",
+ "Delete": "Sil",
+ "Disable Click-to-Flip": "Tıkla-Çevir'i Devre Dışı Bırak",
+ "Download Readest": "Readest'i İndir",
+ "Edit": "Düzenle",
+ "Excerpts": "Alıntılar",
+ "Font": "Yazı Tipi",
+ "Font & Layout": "Yazı Tipi ve Düzen",
+ "Font Face": "Yazı Tipi Yüzü",
+ "Font Family": "Yazı Tipi Ailesi",
+ "Font Size": "Yazı Boyutu",
+ "From Local File": "Yerel Dosyadan",
+ "Full Justification": "Tam Hizalama",
+ "Gaps (%)": "Boşluklar (%)",
+ "Global Settings": "Genel Ayarlar",
+ "Go Back": "Geri Git",
+ "Go Forward": "İleri Git",
+ "Go Left": "Sola Git",
+ "Go Right": "Sağa Git",
+ "Hyphenation": "Heceleme",
+ "Identifier:": "Tanımlayıcı:",
+ "Import Books": "Kitapları İçe Aktar",
+ "Invert Colors in Dark Mode": "Karanlık Modda Renkleri Ters Çevir",
+ "Language:": "Dil:",
+ "Layout": "Düzen",
+ "Light Mode": "Aydınlık Mod",
+ "Loading...": "Yükleniyor...",
+ "Loc. {{currentPage}} / {{totalPage}}": "Konum {{currentPage}} / {{totalPage}}",
+ "Logged in": "Giriş Yapıldı",
+ "Logged in as {{userDisplayName}}": "{{userDisplayName}} olarak giriş yapıldı",
+ "Margins (px)": "Kenar Boşlukları (px)",
+ "Match Case": "Büyük/Küçük Harf Eşleştir",
+ "Match Diacritics": "Aksan İşaretlerini Eşleştir",
+ "Match Whole Words": "Tam Kelimeleri Eşleştir",
+ "Maximum Block Size": "Maksimum Blok Boyutu",
+ "Maximum Inline Size": "Maksimum Satır İçi Boyut",
+ "Maximum Number of Columns": "Maksimum Sütun Sayısı",
+ "Misc": "Diğer",
+ "Monospace Font": "Eş Aralıklı Yazı Tipi",
+ "More Info": "Daha Fazla Bilgi",
+ "Notebook": "Not Defteri",
+ "Notes": "Notlar",
+ "Open": "Aç",
+ "Override Publisher Font": "Yayıncı Yazı Tipini Geçersiz Kıl",
+ "Page": "Sayfa",
+ "Paging Animation": "Sayfa Çevirme Animasyonu",
+ "Paragraph": "Paragraf",
+ "Parallel Read": "Paralel Okuma",
+ "Published:": "Yayınlanma:",
+ "Publisher:": "Yayıncı:",
+ "Reload Page": "Sayfayı Yenile",
+ "Reveal in File Explorer": "Dosya Gezgininde Göster",
+ "Reveal in Finder": "Finder'da Göster",
+ "Reveal in Folder": "Klasörde Göster",
+ "Sans-Serif Font": "Sans-Serif Yazı Tipi",
+ "Save": "Kaydet",
+ "Scrolled Mode": "Kaydırma Modu",
+ "Search books...": "Kitap ara...",
+ "Search...": "Ara...",
+ "Select books": "Kitapları seç",
+ "Select multiple books": "Birden fazla kitap seç",
+ "Serif Font": "Serif Yazı Tipi",
+ "Sidebar": "Kenar Çubuğu",
+ "Sign In": "Giriş Yap",
+ "Sign Out": "Çıkış Yap",
+ "Subjects:": "Konular:",
+ "Theme Color": "Tema Rengi",
+ "Theme Mode": "Tema Modu",
+ "Unknown": "Bilinmiyor",
+ "Untitled": "Başlıksız",
+ "Updated:": "Güncellendi:",
+ "User avatar": "Kullanıcı avatarı",
+ "Version {{version}}": "Sürüm {{version}}",
+ "Welcome to your library. You can import your books here and read them anytime.": "Kütüphanenize hoş geldiniz. Buradan kitaplarınızı içe aktarabilir ve istediğiniz zaman okuyabilirsiniz.",
+ "Your Library": "Kütüphaneniz"
+}
diff --git a/apps/readest-app/public/locales/vi/translation.json b/apps/readest-app/public/locales/vi/translation.json
new file mode 100644
index 00000000..e5504ce2
--- /dev/null
+++ b/apps/readest-app/public/locales/vi/translation.json
@@ -0,0 +1,92 @@
+{
+ "About Readest": "Về Readest",
+ "Add your notes here...": "Thêm ghi chú của bạn vào đây...",
+ "Animation": "Hiệu ứng động",
+ "Auto Mode": "Chế độ tự động",
+ "Behavior": "Hành vi",
+ "Book": "Sách",
+ "Book Cover": "Bìa sách",
+ "Bookmark": "Đánh dấu",
+ "Cancel": "Hủy",
+ "Chapter": "Chương",
+ "Color": "Màu sắc",
+ "Confirm": "Xác nhận",
+ "Confirm Deletion": "Xác nhận xóa",
+ "Custom CSS": "CSS tùy chỉnh",
+ "Dark Mode": "Chế độ tối",
+ "Default Font": "Phông chữ mặc định",
+ "Delete": "Xóa",
+ "Disable Click-to-Flip": "Tắt tính năng nhấp để lật trang",
+ "Download Readest": "Tải Readest",
+ "Edit": "Chỉnh sửa",
+ "Excerpts": "Trích dẫn",
+ "Font": "Phông chữ",
+ "Font & Layout": "Phông chữ & Bố cục",
+ "Font Face": "Kiểu chữ",
+ "Font Family": "Họ phông chữ",
+ "Font Size": "Cỡ chữ",
+ "From Local File": "Từ tệp cục bộ",
+ "Full Justification": "Căn đều hai bên",
+ "Gaps (%)": "Khoảng cách (%)",
+ "Global Settings": "Cài đặt chung",
+ "Go Back": "Quay lại",
+ "Go Forward": "Tiến tới",
+ "Go Left": "Sang trái",
+ "Go Right": "Sang phải",
+ "Hyphenation": "Gạch nối từ",
+ "Identifier:": "Định danh:",
+ "Import Books": "Nhập sách",
+ "Invert Colors in Dark Mode": "Đảo màu trong chế độ tối",
+ "Language:": "Ngôn ngữ:",
+ "Layout": "Bố cục",
+ "Light Mode": "Chế độ sáng",
+ "Loading...": "Đang tải...",
+ "Loc. {{currentPage}} / {{totalPage}}": "Vị trí {{currentPage}} / {{totalPage}}",
+ "Logged in": "Đã đăng nhập",
+ "Logged in as {{userDisplayName}}": "Đăng nhập với tên {{userDisplayName}}",
+ "Margins (px)": "Lề (px)",
+ "Match Case": "Phân biệt chữ hoa/thường",
+ "Match Diacritics": "Phân biệt dấu",
+ "Match Whole Words": "Khớp toàn bộ từ",
+ "Maximum Block Size": "Kích thước khối tối đa",
+ "Maximum Inline Size": "Kích thước nội tuyến tối đa",
+ "Maximum Number of Columns": "Số cột tối đa",
+ "Misc": "Khác",
+ "Monospace Font": "Phông chữ đơn cách",
+ "More Info": "Thông tin thêm",
+ "Notebook": "Sổ ghi chép",
+ "Notes": "Ghi chú",
+ "Open": "Mở",
+ "Override Publisher Font": "Ghi đè phông chữ của nhà xuất bản",
+ "Page": "Trang",
+ "Paging Animation": "Hiệu ứng lật trang",
+ "Paragraph": "Đoạn văn",
+ "Parallel Read": "Đọc song song",
+ "Published:": "Xuất bản:",
+ "Publisher:": "Nhà xuất bản:",
+ "Reload Page": "Tải lại trang",
+ "Reveal in File Explorer": "Hiển thị trong File Explorer",
+ "Reveal in Finder": "Hiển thị trong Finder",
+ "Reveal in Folder": "Hiển thị trong thư mục",
+ "Sans-Serif Font": "Phông chữ không chân",
+ "Save": "Lưu",
+ "Scrolled Mode": "Chế độ cuộn",
+ "Search books...": "Tìm kiếm sách...",
+ "Search...": "Tìm kiếm...",
+ "Select books": "Chọn sách",
+ "Select multiple books": "Chọn nhiều sách",
+ "Serif Font": "Phông chữ có chân",
+ "Sidebar": "Thanh bên",
+ "Sign In": "Đăng nhập",
+ "Sign Out": "Đăng xuất",
+ "Subjects:": "Chủ đề:",
+ "Theme Color": "Màu chủ đề",
+ "Theme Mode": "Chế độ chủ đề",
+ "Unknown": "Không xác định",
+ "Untitled": "Không có tiêu đề",
+ "Updated:": "Cập nhật:",
+ "User avatar": "Ảnh đại diện",
+ "Version {{version}}": "Phiên bản {{version}}",
+ "Welcome to your library. You can import your books here and read them anytime.": "Chào mừng đến với thư viện của bạn. Bạn có thể nhập sách vào đây và đọc bất cứ lúc nào.",
+ "Your Library": "Thư viện của bạn"
+}
diff --git a/apps/readest-app/public/locales/zh-CN/translation.json b/apps/readest-app/public/locales/zh-CN/translation.json
new file mode 100644
index 00000000..63f57c55
--- /dev/null
+++ b/apps/readest-app/public/locales/zh-CN/translation.json
@@ -0,0 +1,92 @@
+{
+ "About Readest": "关于 Readest",
+ "Add your notes here...": "在这里添加您的笔记...",
+ "Animation": "动画",
+ "Auto Mode": "自动主题",
+ "Behavior": "行为",
+ "Book": "书籍",
+ "Book Cover": "书籍封面",
+ "Bookmark": "书签",
+ "Cancel": "取消",
+ "Chapter": "章节",
+ "Color": "颜色",
+ "Confirm": "确认",
+ "Confirm Deletion": "确认删除",
+ "Custom CSS": "自定义 CSS",
+ "Dark Mode": "深色主题",
+ "Default Font": "默认字体",
+ "Delete": "删除",
+ "Disable Click-to-Flip": "禁用点击翻页",
+ "Download Readest": "下载 Readest",
+ "Edit": "编辑",
+ "Excerpts": "摘录",
+ "Font": "字体",
+ "Font & Layout": "字体和布局",
+ "Font Face": "字型",
+ "Font Family": "字族",
+ "Font Size": "字号",
+ "From Local File": "从本地文件导入",
+ "Full Justification": "两端对齐",
+ "Gaps (%)": "间距 (%)",
+ "Global Settings": "全局设置",
+ "Go Back": "返回",
+ "Go Forward": "前进",
+ "Go Left": "向左",
+ "Go Right": "向右",
+ "Hyphenation": "断字",
+ "Identifier:": "识别码",
+ "Import Books": "导入书籍",
+ "Invert Colors in Dark Mode": "深色主题下反色",
+ "Language:": "语言",
+ "Layout": "布局",
+ "Light Mode": "浅色主题",
+ "Loading...": "加载中...",
+ "Loc. {{currentPage}} / {{totalPage}}": "位置 {{currentPage}} / {{totalPage}}",
+ "Logged in": "已登录",
+ "Logged in as {{userDisplayName}}": "{{userDisplayName}} 已登录",
+ "Margins (px)": "页边距 (px)",
+ "Match Case": "匹配大小写",
+ "Match Diacritics": "匹配重音符号",
+ "Match Whole Words": "匹配整个单词",
+ "Maximum Block Size": "内容最大宽度",
+ "Maximum Inline Size": "每栏最大宽度",
+ "Maximum Number of Columns": "分栏数",
+ "Misc": "杂项",
+ "Monospace Font": "等宽字体",
+ "More Info": "更多信息",
+ "Notebook": "笔记本",
+ "Notes": "笔记",
+ "Open": "打开",
+ "Override Publisher Font": "覆盖内置字体",
+ "Page": "页",
+ "Paging Animation": "翻页动画",
+ "Paragraph": "段落",
+ "Parallel Read": "并排阅读",
+ "Published:": "出版日期",
+ "Publisher:": "出版商",
+ "Reload Page": "重新加载页面",
+ "Reveal in File Explorer": "在文件管理器中显示",
+ "Reveal in Finder": "在访达中显示",
+ "Reveal in Folder": "在文件夹中显示",
+ "Sans-Serif Font": "无衬线字体",
+ "Save": "保存",
+ "Scrolled Mode": "滚动模式",
+ "Search books...": "搜索书籍...",
+ "Search...": "搜索...",
+ "Select books": "选择书籍",
+ "Select multiple books": "选择多本书籍",
+ "Serif Font": "衬线字体",
+ "Sidebar": "侧边栏",
+ "Sign In": "登录",
+ "Sign Out": "登出",
+ "Subjects:": "主题",
+ "Theme Color": "主题颜色",
+ "Theme Mode": "主题模式",
+ "Unknown": "未知",
+ "Untitled": "无标题",
+ "Updated:": "更新日期",
+ "User avatar": "用户头像",
+ "Version {{version}}": "版本 {{version}}",
+ "Welcome to your library. You can import your books here and read them anytime.": "书库空空如也,您可以导入您的书籍并随时阅读。",
+ "Your Library": "书库"
+}
diff --git a/apps/readest-app/public/locales/zh-TW/translation.json b/apps/readest-app/public/locales/zh-TW/translation.json
new file mode 100644
index 00000000..28400d1a
--- /dev/null
+++ b/apps/readest-app/public/locales/zh-TW/translation.json
@@ -0,0 +1,92 @@
+{
+ "About Readest": "關於 Readest",
+ "Add your notes here...": "在這裡添加您的筆記...",
+ "Animation": "動畫",
+ "Auto Mode": "自動主題",
+ "Behavior": "行為",
+ "Book": "書籍",
+ "Book Cover": "書籍封面",
+ "Bookmark": "書籤",
+ "Cancel": "取消",
+ "Chapter": "章節",
+ "Color": "顏色",
+ "Confirm": "確認",
+ "Confirm Deletion": "確認刪除",
+ "Custom CSS": "自定義 CSS",
+ "Dark Mode": "深色主題",
+ "Default Font": "預設字體",
+ "Delete": "刪除",
+ "Disable Click-to-Flip": "禁用點擊翻頁",
+ "Download Readest": "下載 Readest",
+ "Edit": "編輯",
+ "Excerpts": "摘錄",
+ "Font": "字體",
+ "Font & Layout": "字體和版面",
+ "Font Face": "字型",
+ "Font Family": "字族",
+ "Font Size": "字號",
+ "From Local File": "從本地檔案導入",
+ "Full Justification": "兩端對齊",
+ "Gaps (%)": "間距 (%)",
+ "Global Settings": "全局設置",
+ "Go Back": "返回",
+ "Go Forward": "前進",
+ "Go Left": "向左",
+ "Go Right": "向右",
+ "Hyphenation": "斷字",
+ "Identifier:": "識別碼",
+ "Import Books": "導入書籍",
+ "Invert Colors in Dark Mode": "深色主題下反色",
+ "Language:": "語言",
+ "Layout": "版面",
+ "Light Mode": "淺色主題",
+ "Loading...": "載入中...",
+ "Loc. {{currentPage}} / {{totalPage}}": "位置 {{currentPage}} / {{totalPage}}",
+ "Logged in": "已登入",
+ "Logged in as {{userDisplayName}}": "{{userDisplayName}} 已登入",
+ "Margins (px)": "頁邊距 (px)",
+ "Match Case": "匹配大小寫",
+ "Match Diacritics": "匹配重音符號",
+ "Match Whole Words": "匹配整個單詞",
+ "Maximum Block Size": "內容最大寬度",
+ "Maximum Inline Size": "每欄最大寬度",
+ "Maximum Number of Columns": "分欄數",
+ "Misc": "雜項",
+ "Monospace Font": "等寬字體",
+ "More Info": "更多信息",
+ "Notebook": "筆記本",
+ "Notes": "筆記",
+ "Open": "打開",
+ "Override Publisher Font": "覆蓋內置字體",
+ "Page": "頁",
+ "Paging Animation": "翻頁動畫",
+ "Paragraph": "段落",
+ "Parallel Read": "並排閱讀",
+ "Published:": "出版日期",
+ "Publisher:": "出版商",
+ "Reload Page": "重新載入頁面",
+ "Reveal in File Explorer": "在檔案管理器中顯示",
+ "Reveal in Finder": "在訪達中顯示",
+ "Reveal in Folder": "在資料夾中顯示",
+ "Sans-Serif Font": "無襯線字體",
+ "Save": "保存",
+ "Scrolled Mode": "滾動模式",
+ "Search books...": "搜索書籍...",
+ "Search...": "搜索...",
+ "Select books": "選擇書籍",
+ "Select multiple books": "選擇多本書籍",
+ "Serif Font": "襯線字體",
+ "Sidebar": "側邊欄",
+ "Sign In": "登入",
+ "Sign Out": "登出",
+ "Subjects:": "主題",
+ "Theme Color": "主題顏色",
+ "Theme Mode": "主題模式",
+ "Unknown": "未知",
+ "Untitled": "無標題",
+ "Updated:": "更新日期",
+ "User avatar": "用戶頭像",
+ "Version {{version}}": "版本 {{version}}",
+ "Welcome to your library. You can import your books here and read them anytime.": "書庫空空如也,您可以導入您的書籍並隨時閱讀。",
+ "Your Library": "書庫"
+}
diff --git a/apps/readest-app/src/app/layout.tsx b/apps/readest-app/src/app/layout.tsx
index 2970069e..82fb0bea 100644
--- a/apps/readest-app/src/app/layout.tsx
+++ b/apps/readest-app/src/app/layout.tsx
@@ -15,7 +15,7 @@ const previewImage = 'https://cdn.readest.com/images/open_graph_preview_read_now
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
-
+
{title}
diff --git a/apps/readest-app/src/app/library/components/Bookshelf.tsx b/apps/readest-app/src/app/library/components/Bookshelf.tsx
index 7c7552bd..5fed7a9c 100644
--- a/apps/readest-app/src/app/library/components/Bookshelf.tsx
+++ b/apps/readest-app/src/app/library/components/Bookshelf.tsx
@@ -4,7 +4,7 @@ import { useEffect, useRef, useState } from 'react';
import { PiPlus } from 'react-icons/pi';
import { MdDelete, MdOpenInNew } from 'react-icons/md';
import { MdCheckCircle, MdCheckCircleOutline } from 'react-icons/md';
-import { CiCircleMore } from "react-icons/ci";
+import { CiCircleMore } from 'react-icons/ci';
import { useRouter, useSearchParams } from 'next/navigation';
import Image from 'next/image';
@@ -15,6 +15,7 @@ import { Book, BooksGroup } from '@/types/book';
import { useEnv } from '@/context/EnvContext';
import { useLibraryStore } from '@/store/libraryStore';
import { useSettingsStore } from '@/store/settingsStore';
+import { useTranslation } from '@/hooks/useTranslation';
import { navigateToReader } from '@/utils/nav';
import { getOSPlatform } from '@/utils/misc';
import { getFilename } from '@/utils/book';
@@ -58,6 +59,7 @@ interface BookshelfProps {
}
const Bookshelf: React.FC = ({ libraryBooks, isSelectMode, onImportBooks }) => {
+ const _ = useTranslation();
const router = useRouter();
const searchParams = useSearchParams();
const { envConfig, appService } = useEnv();
@@ -153,14 +155,14 @@ const Bookshelf: React.FC = ({ libraryBooks, isSelectMode, onImp
const fileRevealLabel =
FILE_REVEAL_LABELS[osPlatform as FILE_REVEAL_PLATFORMS] || FILE_REVEAL_LABELS.default;
const showBookInFinderMenuItem = await MenuItem.new({
- text: fileRevealLabel,
+ text: _(fileRevealLabel),
action: async () => {
const folder = `${settings.localBooksDir}/${getFilename(book)}`;
revealItemInDir(folder);
},
});
const deleteBookMenuItem = await MenuItem.new({
- text: 'Delete',
+ text: _('Delete'),
action: async () => {
deleteBook(envConfig, book);
},
@@ -185,7 +187,8 @@ const Bookshelf: React.FC = ({ libraryBooks, isSelectMode, onImp
className='book-item cursor-pointer'
onContextMenu={bookContextMenuHandler.bind(null, item as Book)}
>
- handleBookClick(item.hash)}
>
@@ -276,11 +279,11 @@ const Bookshelf: React.FC
= ({ libraryBooks, isSelectMode, onImp
)}
@@ -291,16 +294,15 @@ const Bookshelf: React.FC = ({ libraryBooks, isSelectMode, onImp
)}
{showDeleteAlert && (
setShowDeleteAlert(false)}
onClickConfirm={confirmDelete}
/>
)}
-
- {/* Modal Component */}
+
{selectedBook && (
-
+
)}
);
diff --git a/apps/readest-app/src/app/library/components/LibraryHeader.tsx b/apps/readest-app/src/app/library/components/LibraryHeader.tsx
index af30cbd1..56007c22 100644
--- a/apps/readest-app/src/app/library/components/LibraryHeader.tsx
+++ b/apps/readest-app/src/app/library/components/LibraryHeader.tsx
@@ -3,12 +3,13 @@ import React, { useEffect, useRef } from 'react';
import { FaSearch } from 'react-icons/fa';
import { PiPlus } from 'react-icons/pi';
import { PiSelectionAllDuotone } from 'react-icons/pi';
+import { MdOutlineMenu } from 'react-icons/md';
import { useEnv } from '@/context/EnvContext';
+import { useTranslation } from '@/hooks/useTranslation';
import useTrafficLight from '@/hooks/useTrafficLight';
import WindowButtons from '@/components/WindowButtons';
import Dropdown from '@/components/Dropdown';
-import { MdOutlineMenu } from 'react-icons/md';
import SettingsMenu from './SettingsMenu';
interface LibraryHeaderProps {
@@ -22,6 +23,7 @@ const LibraryHeader: React.FC = ({
onImportBooks,
onToggleSelectMode,
}) => {
+ const _ = useTranslation();
const { appService } = useEnv();
const { isTrafficLightVisible } = useTrafficLight();
const headerRef = useRef(null);
@@ -53,7 +55,7 @@ const LibraryHeader: React.FC = ({
= ({
>
-