feat: Implement writing streak tracking, add chapter API routes, and introduce a BookSettings component with i18n support.

This commit is contained in:
2026-03-06 11:28:57 +01:00
parent 0c4bb60dce
commit 893560737a
9 changed files with 213 additions and 52 deletions

View File

@@ -94,6 +94,8 @@ export const translations = {
'book_settings.confirm_delete': 'Oui, supprimer définitivement',
'book_settings.cancel': 'Annuler',
'book_settings.delete_button': 'Supprimer ce projet',
'book_settings.save': 'Sauvegarder',
'book_settings.saved': 'Sauvegardé',
// Landing Page
'landing.nav_features': 'Fonctionnalités',
@@ -323,11 +325,12 @@ export const translations = {
'sw.save_color': '+ SAUVER',
// Genre, Tense Constants Translation Setup
'pov_options.première_personne': 'Première Personne',
'pov_options.troisième_personne_limitée': 'Troisième Personne Limitée',
'pov_options.troisième_personne_omnisciente': 'Troisième Personne Omnisciente',
'tense_options.présent': 'Présent',
'tense_options.passé': 'Passé',
'pov_options.1ère_personne_(je)': '1ère personne (Je)',
'pov_options.3ème_personne_(limitée_au_protagoniste)': '3ème personne (Limitée au protagoniste)',
'pov_options.3ème_personne_(omnisciente)': '3ème personne (Omnisciente)',
'pov_options.multi-points_de_vue_(alterné)': 'Multi-points de vue (Alterné)',
'tense_options.passé_(passé_simple_/_imparfait)': 'Passé (Passé simple / Imparfait)',
'tense_options.présent_de_narration': 'Présent de narration',
},
en: {
// General Navigation
@@ -422,6 +425,8 @@ export const translations = {
'book_settings.confirm_delete': 'Yes, delete permanently',
'book_settings.cancel': 'Cancel',
'book_settings.delete_button': 'Delete this project',
'book_settings.save': 'Save',
'book_settings.saved': 'Saved',
// Landing Page
'landing.nav_features': 'Features',
@@ -651,11 +656,12 @@ export const translations = {
'sw.save_color': '+ SAVE',
// Genre, Tense Constants Translation Setup
'pov_options.première_personne': 'First Person',
'pov_options.troisième_personne_limitée': 'Third Person Limited',
'pov_options.troisième_personne_omnisciente': 'Third Person Omniscient',
'tense_options.présent': 'Present',
'tense_options.passé': 'Past',
'pov_options.1ère_personne_(je)': '1st Person (I)',
'pov_options.3ème_personne_(limitée_au_protagoniste)': '3rd Person (Limited)',
'pov_options.3ème_personne_(omnisciente)': '3rd Person (Omniscient)',
'pov_options.multi-points_de_vue_(alterné)': 'Multi-POV (Alternating)',
'tense_options.passé_(passé_simple_/_imparfait)': 'Past Tense',
'tense_options.présent_de_narration': 'Present Tense',
},
es: {
// General Navigation
@@ -750,6 +756,8 @@ export const translations = {
'book_settings.confirm_delete': 'Sí, eliminar permanentemente',
'book_settings.cancel': 'Cancelar',
'book_settings.delete_button': 'Eliminar este proyecto',
'book_settings.save': 'Guardar',
'book_settings.saved': 'Guardado',
// Landing Page
'landing.nav_features': 'Características',
@@ -979,11 +987,12 @@ export const translations = {
'sw.save_color': '+ GUARDAR',
// Genre, Tense Constants Translation Setup
'pov_options.première_personne': 'Primera Persona',
'pov_options.troisième_personne_limitée': 'Tercera Persona Limitada',
'pov_options.troisième_personne_omnisciente': 'Tercera Persona Omnisciente',
'tense_options.présent': 'Presente',
'tense_options.passé': 'Pasado',
'pov_options.1ère_personne_(je)': ' Persona (Yo)',
'pov_options.3ème_personne_(limitée_au_protagoniste)': ' Persona (Limitada)',
'pov_options.3ème_personne_(omnisciente)': ' Persona (Omnisciente)',
'pov_options.multi-points_de_vue_(alterné)': 'Múltiples POV (Alternando)',
'tense_options.passé_(passé_simple_/_imparfait)': 'Tiempo Pasado',
'tense_options.présent_de_narration': 'Tiempo Presente',
},
de: {
// General Navigation
@@ -1078,6 +1087,8 @@ export const translations = {
'book_settings.confirm_delete': 'Ja, dauerhaft löschen',
'book_settings.cancel': 'Abbrechen',
'book_settings.delete_button': 'Dieses Projekt löschen',
'book_settings.save': 'Speichern',
'book_settings.saved': 'Gespeichert',
// Landing Page
'landing.nav_features': 'Funktionen',
@@ -1307,11 +1318,12 @@ export const translations = {
'sw.save_color': '+ SPEICHERN',
// Genre, Tense Constants Translation Setup
'pov_options.première_personne': 'Ich-Perspektive',
'pov_options.troisième_personne_limitée': 'Personale Erzählsituation',
'pov_options.troisième_personne_omnisciente': 'Auktorialer Erzähler',
'tense_options.présent': 'Präsens',
'tense_options.passé': 'Präteritum',
'pov_options.1ère_personne_(je)': 'Ich-Perspektive',
'pov_options.3ème_personne_(limitée_au_protagoniste)': 'Er/Sie-Perspektive (personal)',
'pov_options.3ème_personne_(omnisciente)': 'Er/Sie-Perspektive (auktorial)',
'pov_options.multi-points_de_vue_(alterné)': 'Mehrere Perspektiven',
'tense_options.passé_(passé_simple_/_imparfait)': 'Vergangenheit (Präteritum)',
'tense_options.présent_de_narration': 'Gegenwart (Präsens)',
}
};