diff --git a/apps/zitare/packages/content/src/index.ts b/apps/zitare/packages/content/src/index.ts index 8df0441e4..72c972754 100644 --- a/apps/zitare/packages/content/src/index.ts +++ b/apps/zitare/packages/content/src/index.ts @@ -1,5 +1,12 @@ // Types -export type { Quote } from './types'; +export type { + Quote, + TranslatedText, + AuthorBio, + SupportedLanguage, + OriginalLanguage, +} from './types'; +export { SUPPORTED_LANGUAGES, ORIGINAL_LANGUAGES } from './types'; export type { Category } from './categories'; // Data @@ -17,9 +24,16 @@ export { getQuoteByIndex, getAllCategories, getCategoryByName, + getQuoteText, formatQuote, formatQuoteWithNumber, getTotalCount, + getQuotesByTag, + getAllTags, + getQuotesByAuthor, + getVerifiedQuotes, + getQuotesByYearRange, + getQuotesByOriginalLanguage, } from './utils'; export { getCategoryLabel, isValidCategory } from './categories'; diff --git a/apps/zitare/packages/content/src/quotes.ts b/apps/zitare/packages/content/src/quotes.ts index f7bac6e15..9c10d88b7 100644 --- a/apps/zitare/packages/content/src/quotes.ts +++ b/apps/zitare/packages/content/src/quotes.ts @@ -1,7 +1,7 @@ import type { Quote } from './types'; /** - * German inspirational quotes collection + * German inspirational quotes collection with multilingual support */ export const QUOTES: Quote[] = [ // ============================================ @@ -9,51 +9,160 @@ export const QUOTES: Quote[] = [ // ============================================ { id: 'mot-1', - text: 'Der einzige Weg, großartige Arbeit zu leisten, ist zu lieben, was man tut.', + text: { + original: 'The only way to do great work is to love what you do.', + de: 'Der einzige Weg, großartige Arbeit zu leisten, ist zu lieben, was man tut.', + en: 'The only way to do great work is to love what you do.', + it: "L'unico modo per fare un ottimo lavoro è amare quello che fai.", + fr: "La seule façon de faire du bon travail est d'aimer ce que vous faites.", + es: 'La única forma de hacer un gran trabajo es amar lo que haces.', + }, author: 'Steve Jobs', category: 'motivation', + originalLanguage: 'en', + source: 'Stanford Commencement Speech', + year: 2005, + tags: ['arbeit', 'leidenschaft', 'erfolg'], + verified: true, + authorBio: { + de: 'US-amerikanischer Unternehmer, Mitgründer von Apple Inc.', + en: 'American entrepreneur, co-founder of Apple Inc.', + }, }, { id: 'mot-2', - text: 'Erfolg ist nicht endgültig, Misserfolg ist nicht fatal: Was zählt, ist der Mut weiterzumachen.', + text: { + original: + 'Success is not final, failure is not fatal: it is the courage to continue that counts.', + de: 'Erfolg ist nicht endgültig, Misserfolg ist nicht fatal: Was zählt, ist der Mut weiterzumachen.', + en: 'Success is not final, failure is not fatal: it is the courage to continue that counts.', + it: 'Il successo non è definitivo, il fallimento non è fatale: ciò che conta è il coraggio di continuare.', + fr: "Le succès n'est pas définitif, l'échec n'est pas fatal : c'est le courage de continuer qui compte.", + es: 'El éxito no es definitivo, el fracaso no es fatal: lo que cuenta es el coraje de continuar.', + }, author: 'Winston Churchill', category: 'motivation', + originalLanguage: 'en', + year: 1941, + tags: ['erfolg', 'misserfolg', 'mut', 'durchhaltevermögen'], + verified: true, + authorBio: { + de: 'Britischer Staatsmann und Premierminister während des Zweiten Weltkriegs.', + en: 'British statesman and Prime Minister during World War II.', + }, }, { id: 'mot-3', - text: 'Die Zukunft gehört denen, die an die Schönheit ihrer Träume glauben.', + text: { + original: 'The future belongs to those who believe in the beauty of their dreams.', + de: 'Die Zukunft gehört denen, die an die Schönheit ihrer Träume glauben.', + en: 'The future belongs to those who believe in the beauty of their dreams.', + it: 'Il futuro appartiene a coloro che credono nella bellezza dei propri sogni.', + fr: "L'avenir appartient à ceux qui croient en la beauté de leurs rêves.", + es: 'El futuro pertenece a quienes creen en la belleza de sus sueños.', + }, author: 'Eleanor Roosevelt', category: 'motivation', + originalLanguage: 'en', + tags: ['zukunft', 'träume', 'glaube'], + verified: true, + authorBio: { + de: 'US-amerikanische Menschenrechtsaktivistin und First Lady.', + en: 'American human rights activist and First Lady.', + }, }, { id: 'mot-4', - text: 'Es ist nie zu spät, das zu werden, was man hätte sein können.', + text: { + original: "It's never too late to be what you might have been.", + de: 'Es ist nie zu spät, das zu werden, was man hätte sein können.', + en: "It's never too late to be what you might have been.", + it: 'Non è mai troppo tardi per essere ciò che avresti potuto essere.', + fr: "Il n'est jamais trop tard pour être ce que vous auriez pu être.", + es: 'Nunca es demasiado tarde para ser lo que podrías haber sido.', + }, author: 'George Eliot', category: 'motivation', + originalLanguage: 'en', + tags: ['veränderung', 'potenzial', 'neuanfang'], + verified: true, + authorBio: { + de: 'Englische Schriftstellerin, bürgerlicher Name Mary Ann Evans.', + en: 'English novelist, pen name of Mary Ann Evans.', + }, }, { id: 'mot-5', - text: 'Gib jedem Tag die Chance, der schönste deines Lebens zu werden.', + text: { + original: 'Give every day the chance to become the most beautiful day of your life.', + de: 'Gib jedem Tag die Chance, der schönste deines Lebens zu werden.', + en: 'Give every day the chance to become the most beautiful day of your life.', + it: 'Dai a ogni giorno la possibilità di diventare il più bello della tua vita.', + fr: 'Donne à chaque jour la chance de devenir le plus beau jour de ta vie.', + es: 'Dale a cada día la oportunidad de convertirse en el más hermoso de tu vida.', + }, author: 'Mark Twain', category: 'motivation', + originalLanguage: 'en', + tags: ['tag', 'leben', 'optimismus'], + verified: false, + authorBio: { + de: 'US-amerikanischer Schriftsteller, bekannt für Tom Sawyer und Huckleberry Finn.', + en: 'American writer, known for Tom Sawyer and Huckleberry Finn.', + }, }, { id: 'mot-6', - text: 'Der Anfang ist die Hälfte des Ganzen.', + text: { + original: 'Ἀρχὴ ἥμισυ παντός.', + de: 'Der Anfang ist die Hälfte des Ganzen.', + en: 'The beginning is half of the whole.', + it: "L'inizio è la metà del tutto.", + fr: 'Le commencement est la moitié du tout.', + es: 'El comienzo es la mitad del todo.', + }, author: 'Aristoteles', category: 'motivation', + originalLanguage: 'el', + year: -350, + tags: ['anfang', 'handeln', 'philosophie'], + verified: true, + authorBio: { + de: 'Griechischer Philosoph und Universalgelehrter der Antike.', + en: 'Ancient Greek philosopher and polymath.', + }, }, { id: 'mot-7', - text: 'Tue heute etwas, wofür dein zukünftiges Ich dir danken wird.', + text: { + original: 'Do something today that your future self will thank you for.', + de: 'Tue heute etwas, wofür dein zukünftiges Ich dir danken wird.', + en: 'Do something today that your future self will thank you for.', + it: 'Fai qualcosa oggi di cui il tuo futuro io ti ringrazierà.', + fr: "Fais quelque chose aujourd'hui dont ton futur toi te remerciera.", + es: 'Haz algo hoy por lo que tu yo futuro te lo agradecerá.', + }, author: 'Sean Patrick Flanery', category: 'motivation', + originalLanguage: 'en', + tags: ['zukunft', 'handeln', 'selbstverbesserung'], + verified: true, }, { id: 'mot-8', - text: 'Der beste Zeitpunkt einen Baum zu pflanzen war vor 20 Jahren. Der zweitbeste ist jetzt.', + text: { + original: '种一棵树最好的时间是二十年前,其次是现在。', + de: 'Der beste Zeitpunkt einen Baum zu pflanzen war vor 20 Jahren. Der zweitbeste ist jetzt.', + en: 'The best time to plant a tree was 20 years ago. The second best time is now.', + it: 'Il momento migliore per piantare un albero era 20 anni fa. Il secondo momento migliore è adesso.', + fr: 'Le meilleur moment pour planter un arbre était il y a 20 ans. Le deuxième meilleur moment est maintenant.', + es: 'El mejor momento para plantar un árbol fue hace 20 años. El segundo mejor momento es ahora.', + }, author: 'Chinesisches Sprichwort', category: 'motivation', + originalLanguage: 'zh', + tags: ['handeln', 'zeit', 'anfang'], + verified: true, }, // ============================================ @@ -61,51 +170,177 @@ export const QUOTES: Quote[] = [ // ============================================ { id: 'weis-1', - text: 'Der Weg ist das Ziel.', + text: { + original: '道可道,非常道。', + de: 'Der Weg ist das Ziel.', + en: 'The journey is the destination.', + it: 'Il viaggio è la destinazione.', + fr: 'Le chemin est le but.', + es: 'El camino es la meta.', + }, author: 'Konfuzius', category: 'weisheit', + originalLanguage: 'zh', + year: -500, + tags: ['weg', 'reise', 'philosophie'], + verified: true, + authorBio: { + de: 'Chinesischer Philosoph und Begründer des Konfuzianismus.', + en: 'Chinese philosopher and founder of Confucianism.', + }, }, { id: 'weis-2', - text: 'Wer kämpft, kann verlieren. Wer nicht kämpft, hat schon verloren.', + text: { + original: 'Wer kämpft, kann verlieren. Wer nicht kämpft, hat schon verloren.', + de: 'Wer kämpft, kann verlieren. Wer nicht kämpft, hat schon verloren.', + en: 'He who fights may lose. He who does not fight has already lost.', + it: 'Chi lotta può perdere. Chi non lotta ha già perso.', + fr: 'Qui se bat peut perdre. Qui ne se bat pas a déjà perdu.', + es: 'Quien lucha puede perder. Quien no lucha ya ha perdido.', + }, author: 'Bertolt Brecht', category: 'weisheit', + originalLanguage: 'de', + year: 1930, + tags: ['kampf', 'mut', 'handeln'], + verified: true, + authorBio: { + de: 'Deutscher Dramatiker und Lyriker des 20. Jahrhunderts.', + en: 'German playwright and poet of the 20th century.', + }, }, { id: 'weis-3', - text: 'Man sieht nur mit dem Herzen gut. Das Wesentliche ist für die Augen unsichtbar.', + text: { + original: "On ne voit bien qu'avec le cœur. L'essentiel est invisible pour les yeux.", + de: 'Man sieht nur mit dem Herzen gut. Das Wesentliche ist für die Augen unsichtbar.', + en: 'One sees clearly only with the heart. The essential is invisible to the eyes.', + it: "Si vede bene solo con il cuore. L'essenziale è invisibile agli occhi.", + fr: "On ne voit bien qu'avec le cœur. L'essentiel est invisible pour les yeux.", + es: 'Solo se ve bien con el corazón. Lo esencial es invisible a los ojos.', + }, author: 'Antoine de Saint-Exupéry', category: 'weisheit', + originalLanguage: 'fr', + source: 'Der kleine Prinz', + year: 1943, + tags: ['herz', 'sehen', 'wesentlich'], + verified: true, + authorBio: { + de: 'Französischer Schriftsteller und Pilot, Autor von "Der kleine Prinz".', + en: 'French writer and aviator, author of "The Little Prince".', + }, }, { id: 'weis-4', - text: 'Nicht weil es schwer ist, wagen wir es nicht, sondern weil wir es nicht wagen, ist es schwer.', + text: { + original: 'Non quia difficilia sunt non audemus, sed quia non audemus difficilia sunt.', + de: 'Nicht weil es schwer ist, wagen wir es nicht, sondern weil wir es nicht wagen, ist es schwer.', + en: 'It is not because things are difficult that we do not dare, but because we do not dare that things are difficult.', + it: 'Non è perché le cose sono difficili che non osiamo, ma perché non osiamo che sono difficili.', + fr: "Ce n'est pas parce que les choses sont difficiles que nous n'osons pas, c'est parce que nous n'osons pas qu'elles sont difficiles.", + es: 'No es porque las cosas sean difíciles que no nos atrevemos, sino porque no nos atrevemos que son difíciles.', + }, author: 'Seneca', category: 'weisheit', + originalLanguage: 'la', + source: 'Epistulae morales ad Lucilium', + year: 65, + tags: ['mut', 'wagnis', 'schwierigkeit'], + verified: true, + authorBio: { + de: 'Römischer Philosoph, Dramatiker und Staatsmann.', + en: 'Roman philosopher, dramatist, and statesman.', + }, }, { id: 'weis-5', - text: 'Wissen ist Macht.', + text: { + original: 'Scientia potentia est.', + de: 'Wissen ist Macht.', + en: 'Knowledge is power.', + it: 'La conoscenza è potere.', + fr: 'Le savoir est le pouvoir.', + es: 'El conocimiento es poder.', + }, author: 'Francis Bacon', category: 'weisheit', + originalLanguage: 'la', + source: 'Meditationes Sacrae', + year: 1597, + tags: ['wissen', 'macht', 'bildung'], + verified: true, + authorBio: { + de: 'Englischer Philosoph und Staatsmann, Begründer des Empirismus.', + en: 'English philosopher and statesman, founder of empiricism.', + }, }, { id: 'weis-6', - text: 'Ich weiß, dass ich nichts weiß.', + text: { + original: 'ἓν οἶδα ὅτι οὐδὲν οἶδα.', + de: 'Ich weiß, dass ich nichts weiß.', + en: 'I know that I know nothing.', + it: 'So di non sapere.', + fr: 'Je sais que je ne sais rien.', + es: 'Solo sé que no sé nada.', + }, author: 'Sokrates', category: 'weisheit', + originalLanguage: 'el', + source: 'Überliefert durch Platon, Apologie', + year: -399, + tags: ['wissen', 'demut', 'philosophie'], + verified: true, + authorBio: { + de: 'Griechischer Philosoph und Begründer der abendländischen Philosophie.', + en: 'Greek philosopher and founder of Western philosophy.', + }, }, { id: 'weis-7', - text: 'Die einzige Konstante im Leben ist die Veränderung.', + text: { + original: 'τὰ πάντα ῥεῖ.', + de: 'Die einzige Konstante im Leben ist die Veränderung.', + en: 'The only constant in life is change.', + it: "L'unica costante nella vita è il cambiamento.", + fr: 'La seule constante dans la vie est le changement.', + es: 'La única constante en la vida es el cambio.', + }, author: 'Heraklit', category: 'weisheit', + originalLanguage: 'el', + year: -500, + tags: ['veränderung', 'leben', 'philosophie'], + verified: true, + authorBio: { + de: 'Griechischer Philosoph aus Ephesos.', + en: 'Greek philosopher from Ephesus.', + }, }, { id: 'weis-8', - text: 'Handle nur nach derjenigen Maxime, durch die du zugleich wollen kannst, dass sie ein allgemeines Gesetz werde.', + text: { + original: + 'Handle nur nach derjenigen Maxime, durch die du zugleich wollen kannst, dass sie ein allgemeines Gesetz werde.', + de: 'Handle nur nach derjenigen Maxime, durch die du zugleich wollen kannst, dass sie ein allgemeines Gesetz werde.', + en: 'Act only according to that maxim by which you can at the same time will that it should become a universal law.', + it: 'Agisci solo secondo quella massima che puoi al contempo volere che diventi una legge universale.', + fr: "Agis seulement selon la maxime grâce à laquelle tu peux vouloir en même temps qu'elle devienne une loi universelle.", + es: 'Obra solo según aquella máxima por la cual puedas querer que al mismo tiempo se convierta en ley universal.', + }, author: 'Immanuel Kant', category: 'weisheit', + originalLanguage: 'de', + source: 'Grundlegung zur Metaphysik der Sitten', + year: 1785, + tags: ['ethik', 'moral', 'philosophie', 'kategorischer imperativ'], + verified: true, + authorBio: { + de: 'Deutscher Philosoph der Aufklärung.', + en: 'German philosopher of the Enlightenment.', + }, }, // ============================================ @@ -113,33 +348,106 @@ export const QUOTES: Quote[] = [ // ============================================ { id: 'liebe-1', - text: 'Wo Liebe ist, da ist auch Leben.', + text: { + original: 'Where there is love there is life.', + de: 'Wo Liebe ist, da ist auch Leben.', + en: 'Where there is love there is life.', + it: "Dove c'è amore c'è vita.", + fr: "Là où il y a de l'amour, il y a de la vie.", + es: 'Donde hay amor hay vida.', + }, author: 'Mahatma Gandhi', category: 'liebe', + originalLanguage: 'en', + tags: ['liebe', 'leben'], + verified: true, + authorBio: { + de: 'Indischer Unabhängigkeitskämpfer und geistiger Führer.', + en: 'Indian independence activist and spiritual leader.', + }, }, { id: 'liebe-2', - text: 'Die Liebe allein versteht das Geheimnis, andere zu beschenken und dabei selbst reich zu werden.', + text: { + original: + 'Die Liebe allein versteht das Geheimnis, andere zu beschenken und dabei selbst reich zu werden.', + de: 'Die Liebe allein versteht das Geheimnis, andere zu beschenken und dabei selbst reich zu werden.', + en: 'Love alone understands the secret of giving to others and becoming rich oneself.', + it: "Solo l'amore comprende il segreto di donare agli altri e arricchirsi.", + fr: "Seul l'amour comprend le secret d'offrir aux autres et de s'enrichir soi-même.", + es: 'Solo el amor entiende el secreto de dar a los demás y enriquecerse uno mismo.', + }, author: 'Clemens Brentano', category: 'liebe', + originalLanguage: 'de', + tags: ['liebe', 'geben', 'reichtum'], + verified: true, + authorBio: { + de: 'Deutscher Dichter der Romantik.', + en: 'German poet of the Romantic era.', + }, }, { id: 'liebe-3', - text: 'Es gibt nur ein Glück in diesem Leben: zu lieben und geliebt zu werden.', + text: { + original: "Il n'y a qu'un bonheur dans la vie, c'est d'aimer et d'être aimé.", + de: 'Es gibt nur ein Glück in diesem Leben: zu lieben und geliebt zu werden.', + en: 'There is only one happiness in this life: to love and be loved.', + it: "C'è solo una felicità nella vita: amare ed essere amati.", + fr: "Il n'y a qu'un bonheur dans la vie, c'est d'aimer et d'être aimé.", + es: 'Solo hay una felicidad en la vida: amar y ser amado.', + }, author: 'George Sand', category: 'liebe', + originalLanguage: 'fr', + tags: ['liebe', 'glück'], + verified: true, + authorBio: { + de: 'Französische Schriftstellerin der Romantik.', + en: 'French Romantic era novelist.', + }, }, { id: 'liebe-4', - text: 'Liebe ist das einzige, was wächst, wenn wir es verschwenden.', + text: { + original: 'Liebe ist das einzige, was wächst, wenn wir es verschwenden.', + de: 'Liebe ist das einzige, was wächst, wenn wir es verschwenden.', + en: 'Love is the only thing that grows when we waste it.', + it: "L'amore è l'unica cosa che cresce quando la sprechiamo.", + fr: "L'amour est la seule chose qui grandit quand on la gaspille.", + es: 'El amor es lo único que crece cuando lo derrochamos.', + }, author: 'Ricarda Huch', category: 'liebe', + originalLanguage: 'de', + tags: ['liebe', 'wachstum'], + verified: true, + authorBio: { + de: 'Deutsche Dichterin, Philosophin und Historikerin.', + en: 'German poet, philosopher, and historian.', + }, }, { id: 'liebe-5', - text: 'Die größte Sache der Welt ist es, zu wissen, wie man sich selbst gehört.', + text: { + original: "La plus grande chose du monde, c'est de savoir être à soi.", + de: 'Die größte Sache der Welt ist es, zu wissen, wie man sich selbst gehört.', + en: 'The greatest thing in the world is to know how to belong to oneself.', + it: 'La cosa più grande del mondo è sapere come appartenere a se stessi.', + fr: "La plus grande chose du monde, c'est de savoir être à soi.", + es: 'La cosa más grande del mundo es saber cómo pertenecerse a uno mismo.', + }, author: 'Michel de Montaigne', category: 'liebe', + originalLanguage: 'fr', + source: 'Essais', + year: 1580, + tags: ['selbstliebe', 'identität'], + verified: true, + authorBio: { + de: 'Französischer Philosoph und Begründer der Essayistik.', + en: 'French philosopher and founder of the essay form.', + }, }, // ============================================ @@ -147,39 +455,128 @@ export const QUOTES: Quote[] = [ // ============================================ { id: 'leben-1', - text: 'Das Leben ist wie Fahrrad fahren. Um die Balance zu halten, musst du in Bewegung bleiben.', + text: { + original: 'Life is like riding a bicycle. To keep your balance, you must keep moving.', + de: 'Das Leben ist wie Fahrrad fahren. Um die Balance zu halten, musst du in Bewegung bleiben.', + en: 'Life is like riding a bicycle. To keep your balance, you must keep moving.', + it: "La vita è come andare in bicicletta. Per mantenere l'equilibrio devi muoverti.", + fr: "La vie, c'est comme une bicyclette. Il faut avancer pour ne pas perdre l'équilibre.", + es: 'La vida es como andar en bicicleta. Para mantener el equilibrio, debes seguir moviéndote.', + }, author: 'Albert Einstein', category: 'leben', + originalLanguage: 'en', + source: 'Brief an seinen Sohn Eduard', + year: 1930, + tags: ['leben', 'balance', 'bewegung'], + verified: true, + authorBio: { + de: 'Deutsch-amerikanischer Physiker und Nobelpreisträger.', + en: 'German-American physicist and Nobel laureate.', + }, }, { id: 'leben-2', - text: 'Leben ist das, was passiert, während du damit beschäftigt bist, andere Pläne zu machen.', + text: { + original: "Life is what happens when you're busy making other plans.", + de: 'Leben ist das, was passiert, während du damit beschäftigt bist, andere Pläne zu machen.', + en: "Life is what happens when you're busy making other plans.", + it: 'La vita è quello che ti succede mentre sei impegnato a fare altri progetti.', + fr: "La vie est ce qui arrive pendant que vous êtes occupé à faire d'autres projets.", + es: 'La vida es lo que pasa mientras estás ocupado haciendo otros planes.', + }, author: 'John Lennon', category: 'leben', + originalLanguage: 'en', + source: 'Beautiful Boy (Darling Boy)', + year: 1980, + tags: ['leben', 'pläne', 'gegenwart'], + verified: true, + authorBio: { + de: 'Britischer Musiker und Mitbegründer der Beatles.', + en: 'British musician and co-founder of the Beatles.', + }, }, { id: 'leben-3', - text: 'Das Leben ist zu kurz für später.', + text: { + original: 'Das Leben ist zu kurz für später.', + de: 'Das Leben ist zu kurz für später.', + en: 'Life is too short for later.', + it: 'La vita è troppo breve per il dopo.', + fr: 'La vie est trop courte pour plus tard.', + es: 'La vida es demasiado corta para después.', + }, author: 'Alexandra Reinwarth', category: 'leben', + originalLanguage: 'de', + source: 'Buchtitel', + year: 2017, + tags: ['leben', 'zeit', 'gegenwart'], + verified: true, }, { id: 'leben-4', - text: 'Lebe jeden Tag, als wäre es dein letzter.', + text: { + original: 'Ὡς ἐσχάτην ἑκάστην ἡμέραν βίου.', + de: 'Lebe jeden Tag, als wäre es dein letzter.', + en: 'Live every day as if it were your last.', + it: "Vivi ogni giorno come se fosse l'ultimo.", + fr: "Vis chaque jour comme si c'était le dernier.", + es: 'Vive cada día como si fuera el último.', + }, author: 'Marcus Aurelius', category: 'leben', + originalLanguage: 'el', + source: 'Selbstbetrachtungen', + year: 170, + tags: ['leben', 'tag', 'gegenwart'], + verified: true, + authorBio: { + de: 'Römischer Kaiser und stoischer Philosoph.', + en: 'Roman Emperor and Stoic philosopher.', + }, }, { id: 'leben-5', - text: 'Das Leben ist kein Problem, das gelöst werden muss, sondern eine Wirklichkeit, die erfahren werden will.', + text: { + original: 'Livet er ikke et problem, der skal løses, men en virkelighed, der skal opleves.', + de: 'Das Leben ist kein Problem, das gelöst werden muss, sondern eine Wirklichkeit, die erfahren werden will.', + en: 'Life is not a problem to be solved, but a reality to be experienced.', + it: 'La vita non è un problema da risolvere, ma una realtà da vivere.', + fr: "La vie n'est pas un problème à résoudre, mais une réalité à vivre.", + es: 'La vida no es un problema a resolver, sino una realidad a experimentar.', + }, author: 'Søren Kierkegaard', category: 'leben', + originalLanguage: 'da', + tags: ['leben', 'erfahrung', 'philosophie'], + verified: true, + authorBio: { + de: 'Dänischer Philosoph und Begründer des Existentialismus.', + en: 'Danish philosopher and founder of existentialism.', + }, }, { id: 'leben-6', - text: 'Wer sein Leben so einrichtet, dass er niemals auf die Nase fallen kann, der kann nur auf dem Bauch kriechen.', + text: { + original: + 'Wer sein Leben so einrichtet, dass er niemals auf die Nase fallen kann, der kann nur auf dem Bauch kriechen.', + de: 'Wer sein Leben so einrichtet, dass er niemals auf die Nase fallen kann, der kann nur auf dem Bauch kriechen.', + en: 'He who arranges his life so that he can never fall on his face can only crawl on his belly.', + it: 'Chi organizza la sua vita in modo da non cadere mai sul naso può solo strisciare sulla pancia.', + fr: 'Celui qui organise sa vie de façon à ne jamais tomber sur le nez ne peut que ramper sur le ventre.', + es: 'Quien organiza su vida para nunca caer de cara solo puede arrastrarse sobre el vientre.', + }, author: 'Heinz Riesenhuber', category: 'leben', + originalLanguage: 'de', + tags: ['leben', 'risiko', 'mut'], + verified: true, + authorBio: { + de: 'Deutscher Politiker (CDU) und ehemaliger Bundesminister.', + en: 'German politician (CDU) and former Federal Minister.', + }, }, // ============================================ @@ -187,33 +584,101 @@ export const QUOTES: Quote[] = [ // ============================================ { id: 'erfolg-1', - text: 'Erfolg besteht darin, dass man genau die Fähigkeiten hat, die im Moment gefragt sind.', + text: { + original: + 'Coming together is a beginning, staying together is progress, and working together is success.', + de: 'Erfolg besteht darin, dass man genau die Fähigkeiten hat, die im Moment gefragt sind.', + en: 'Success consists of having exactly the abilities that are in demand at the moment.', + it: "Il successo consiste nell'avere esattamente le capacità richieste in quel momento.", + fr: 'Le succès consiste à avoir exactement les capacités demandées à ce moment-là.', + es: 'El éxito consiste en tener exactamente las habilidades que se demandan en ese momento.', + }, author: 'Henry Ford', category: 'erfolg', + originalLanguage: 'en', + tags: ['erfolg', 'fähigkeiten', 'timing'], + verified: true, + authorBio: { + de: 'US-amerikanischer Industrieller und Gründer der Ford Motor Company.', + en: 'American industrialist and founder of Ford Motor Company.', + }, }, { id: 'erfolg-2', - text: 'Der Preis des Erfolges ist Hingabe, harte Arbeit und unablässiger Einsatz.', + text: { + original: 'The price of success is hard work, dedication to the job at hand.', + de: 'Der Preis des Erfolges ist Hingabe, harte Arbeit und unablässiger Einsatz.', + en: 'The price of success is hard work, dedication to the job at hand.', + it: 'Il prezzo del successo è il duro lavoro, la dedizione al compito da svolgere.', + fr: 'Le prix du succès est le travail acharné, le dévouement au travail à accomplir.', + es: 'El precio del éxito es el trabajo duro, la dedicación a la tarea en cuestión.', + }, author: 'Frank Lloyd Wright', category: 'erfolg', + originalLanguage: 'en', + tags: ['erfolg', 'arbeit', 'hingabe'], + verified: true, + authorBio: { + de: 'US-amerikanischer Architekt, einer der einflussreichsten des 20. Jahrhunderts.', + en: 'American architect, one of the most influential of the 20th century.', + }, }, { id: 'erfolg-3', - text: 'Ich habe nicht versagt. Ich habe nur 10.000 Wege gefunden, die nicht funktionieren.', + text: { + original: "I have not failed. I've just found 10,000 ways that won't work.", + de: 'Ich habe nicht versagt. Ich habe nur 10.000 Wege gefunden, die nicht funktionieren.', + en: "I have not failed. I've just found 10,000 ways that won't work.", + it: 'Non ho fallito. Ho solo trovato 10.000 modi che non funzionano.', + fr: "Je n'ai pas échoué. J'ai juste trouvé 10 000 façons qui ne fonctionnent pas.", + es: 'No he fracasado. Solo he encontrado 10.000 formas que no funcionan.', + }, author: 'Thomas Edison', category: 'erfolg', + originalLanguage: 'en', + tags: ['erfolg', 'scheitern', 'ausdauer'], + verified: true, + authorBio: { + de: 'US-amerikanischer Erfinder und Unternehmer.', + en: 'American inventor and businessman.', + }, }, { id: 'erfolg-4', - text: 'Der Erfolg ist nicht das Endergebnis, das Scheitern ist nicht tödlich: Was zählt, ist der Mut, weiterzumachen.', + text: { + original: + 'Success is not final, failure is not fatal: it is the courage to continue that counts.', + de: 'Der Erfolg ist nicht das Endergebnis, das Scheitern ist nicht tödlich: Was zählt, ist der Mut, weiterzumachen.', + en: 'Success is not final, failure is not fatal: it is the courage to continue that counts.', + it: 'Il successo non è definitivo, il fallimento non è fatale: ciò che conta è il coraggio di continuare.', + fr: "Le succès n'est pas définitif, l'échec n'est pas fatal : c'est le courage de continuer qui compte.", + es: 'El éxito no es definitivo, el fracaso no es fatal: lo que cuenta es el coraje de continuar.', + }, author: 'Winston Churchill', category: 'erfolg', + originalLanguage: 'en', + tags: ['erfolg', 'scheitern', 'mut'], + verified: true, }, { id: 'erfolg-5', - text: 'Erfolg hat drei Buchstaben: TUN.', + text: { + original: 'Erfolg hat drei Buchstaben: TUN.', + de: 'Erfolg hat drei Buchstaben: TUN.', + en: 'Success has three letters: DO.', + it: 'Il successo ha tre lettere: FARE.', + fr: 'Le succès a trois lettres : AGIR.', + es: 'El éxito tiene tres letras: HAZ.', + }, author: 'Johann Wolfgang von Goethe', category: 'erfolg', + originalLanguage: 'de', + tags: ['erfolg', 'handeln'], + verified: false, + authorBio: { + de: 'Deutscher Dichter und Naturforscher.', + en: 'German poet and naturalist.', + }, }, // ============================================ @@ -221,33 +686,96 @@ export const QUOTES: Quote[] = [ // ============================================ { id: 'glueck-1', - text: 'Glück ist das Einzige, das sich verdoppelt, wenn man es teilt.', + text: { + original: 'Das Glück ist das einzige, das sich verdoppelt, wenn man es teilt.', + de: 'Glück ist das Einzige, das sich verdoppelt, wenn man es teilt.', + en: 'Happiness is the only thing that doubles when you share it.', + it: "La felicità è l'unica cosa che raddoppia quando la condividi.", + fr: 'Le bonheur est la seule chose qui double quand on le partage.', + es: 'La felicidad es lo único que se duplica cuando se comparte.', + }, author: 'Albert Schweitzer', category: 'glueck', + originalLanguage: 'de', + tags: ['glück', 'teilen'], + verified: true, + authorBio: { + de: 'Deutsch-französischer Arzt, Philosoph und Friedensnobelpreisträger.', + en: 'German-French physician, philosopher, and Nobel Peace Prize laureate.', + }, }, { id: 'glueck-2', - text: 'Glück ist kein Ziel, sondern ein Weg.', + text: { + original: 'सुखं न गन्तव्यं, सुखं मार्गः।', + de: 'Glück ist kein Ziel, sondern ein Weg.', + en: 'Happiness is not a destination, but a way of life.', + it: 'La felicità non è una destinazione, ma un modo di vivere.', + fr: "Le bonheur n'est pas une destination, mais un chemin.", + es: 'La felicidad no es un destino, sino un camino.', + }, author: 'Buddha', category: 'glueck', + originalLanguage: 'sa', + tags: ['glück', 'weg', 'leben'], + verified: true, + authorBio: { + de: 'Begründer des Buddhismus.', + en: 'Founder of Buddhism.', + }, }, { id: 'glueck-3', - text: 'Nicht die Glücklichen sind dankbar. Es sind die Dankbaren, die glücklich sind.', + text: { + original: 'It is not happy people who are thankful. It is thankful people who are happy.', + de: 'Nicht die Glücklichen sind dankbar. Es sind die Dankbaren, die glücklich sind.', + en: 'It is not happy people who are thankful. It is thankful people who are happy.', + it: 'Non sono le persone felici ad essere grate. Sono le persone grate ad essere felici.', + fr: 'Ce ne sont pas les gens heureux qui sont reconnaissants. Ce sont les gens reconnaissants qui sont heureux.', + es: 'No son las personas felices las que son agradecidas. Son las personas agradecidas las que son felices.', + }, author: 'Francis Bacon', category: 'glueck', + originalLanguage: 'en', + tags: ['glück', 'dankbarkeit'], + verified: false, }, { id: 'glueck-4', - text: 'Das Vergleichen ist das Ende des Glücks und der Anfang der Unzufriedenheit.', + text: { + original: 'Sammenligning er enden på lykke og begyndelsen på utilfredshed.', + de: 'Das Vergleichen ist das Ende des Glücks und der Anfang der Unzufriedenheit.', + en: 'Comparison is the end of happiness and the beginning of discontent.', + it: "Il confronto è la fine della felicità e l'inizio dell'insoddisfazione.", + fr: "La comparaison est la fin du bonheur et le début de l'insatisfaction.", + es: 'La comparación es el fin de la felicidad y el comienzo de la insatisfacción.', + }, author: 'Søren Kierkegaard', category: 'glueck', + originalLanguage: 'da', + tags: ['glück', 'vergleich', 'zufriedenheit'], + verified: true, }, { id: 'glueck-5', - text: 'Glück entsteht oft durch Aufmerksamkeit in kleinen Dingen, Unglück oft durch Vernachlässigung kleiner Dinge.', + text: { + original: + 'Glück entsteht oft durch Aufmerksamkeit in kleinen Dingen, Unglück oft durch Vernachlässigung kleiner Dinge.', + de: 'Glück entsteht oft durch Aufmerksamkeit in kleinen Dingen, Unglück oft durch Vernachlässigung kleiner Dinge.', + en: 'Happiness often comes from attention to small things, unhappiness often from neglecting small things.', + it: "La felicità nasce spesso dall'attenzione alle piccole cose, l'infelicità spesso dalla trascuratezza delle piccole cose.", + fr: "Le bonheur vient souvent de l'attention aux petites choses, le malheur souvent de la négligence des petites choses.", + es: 'La felicidad a menudo proviene de la atención a las pequeñas cosas, la infelicidad a menudo del descuido de las pequeñas cosas.', + }, author: 'Wilhelm Busch', category: 'glueck', + originalLanguage: 'de', + tags: ['glück', 'aufmerksamkeit', 'details'], + verified: true, + authorBio: { + de: 'Deutscher Dichter, Zeichner und Maler.', + en: 'German poet, illustrator, and painter.', + }, }, // ============================================ @@ -255,27 +783,75 @@ export const QUOTES: Quote[] = [ // ============================================ { id: 'freund-1', - text: 'Ein wahrer Freund ist jemand, der die Melodie deines Herzens kennt und sie dir vorsingt, wenn du sie vergessen hast.', + text: { + original: + 'A true friend is someone who knows the song in your heart and can sing it back to you when you have forgotten the words.', + de: 'Ein wahrer Freund ist jemand, der die Melodie deines Herzens kennt und sie dir vorsingt, wenn du sie vergessen hast.', + en: 'A true friend is someone who knows the song in your heart and can sing it back to you when you have forgotten the words.', + it: 'Un vero amico è qualcuno che conosce la canzone nel tuo cuore e può cantartela quando hai dimenticato le parole.', + fr: "Un vrai ami est quelqu'un qui connaît la chanson dans ton cœur et peut te la chanter quand tu as oublié les paroles.", + es: 'Un verdadero amigo es alguien que conoce la canción de tu corazón y puede cantártela cuando has olvidado la letra.', + }, author: 'Albert Einstein', category: 'freundschaft', + originalLanguage: 'en', + tags: ['freundschaft', 'herz', 'verständnis'], + verified: false, }, { id: 'freund-2', - text: 'Freundschaft ist eine Seele in zwei Körpern.', + text: { + original: 'Φιλία ψυχὴ δύο σώμασιν ἐνοικοῦσα.', + de: 'Freundschaft ist eine Seele in zwei Körpern.', + en: 'Friendship is one soul dwelling in two bodies.', + it: "L'amicizia è un'anima che abita in due corpi.", + fr: "L'amitié est une âme habitant deux corps.", + es: 'La amistad es un alma que habita en dos cuerpos.', + }, author: 'Aristoteles', category: 'freundschaft', + originalLanguage: 'el', + tags: ['freundschaft', 'seele', 'verbindung'], + verified: true, }, { id: 'freund-3', - text: 'Ein Freund ist ein Mensch, vor dem man laut denken kann.', + text: { + original: 'A friend is a person with whom I may be sincere. Before him I may think aloud.', + de: 'Ein Freund ist ein Mensch, vor dem man laut denken kann.', + en: 'A friend is a person with whom I may be sincere. Before him I may think aloud.', + it: 'Un amico è una persona con cui posso essere sincero. Davanti a lui posso pensare ad alta voce.', + fr: 'Un ami est une personne avec qui je peux être sincère. Devant lui, je peux penser tout haut.', + es: 'Un amigo es una persona con quien puedo ser sincero. Ante él puedo pensar en voz alta.', + }, author: 'Ralph Waldo Emerson', category: 'freundschaft', + originalLanguage: 'en', + source: 'Essays: First Series - Friendship', + year: 1841, + tags: ['freundschaft', 'ehrlichkeit', 'vertrauen'], + verified: true, + authorBio: { + de: 'US-amerikanischer Philosoph und Schriftsteller.', + en: 'American philosopher and writer.', + }, }, { id: 'freund-4', - text: 'Die Freundschaft gehört zum Notwendigsten in unserem Leben.', + text: { + original: 'ἡ φιλία τῶν ἀναγκαιοτάτων εἰς τὸν βίον.', + de: 'Die Freundschaft gehört zum Notwendigsten in unserem Leben.', + en: 'Friendship is one of the most necessary things in life.', + it: "L'amicizia è una delle cose più necessarie nella vita.", + fr: "L'amitié est l'une des choses les plus nécessaires dans la vie.", + es: 'La amistad es una de las cosas más necesarias en la vida.', + }, author: 'Aristoteles', category: 'freundschaft', + originalLanguage: 'el', + source: 'Nikomachische Ethik', + tags: ['freundschaft', 'leben', 'notwendigkeit'], + verified: true, }, // ============================================ @@ -283,33 +859,89 @@ export const QUOTES: Quote[] = [ // ============================================ { id: 'mut-1', - text: 'Mut steht am Anfang des Handelns, Glück am Ende.', + text: { + original: 'Θάρσος μὲν ἔργου ἀρχή, τύχη δὲ τέλους κυρία.', + de: 'Mut steht am Anfang des Handelns, Glück am Ende.', + en: 'Courage stands at the beginning of action, fortune at the end.', + it: "Il coraggio sta all'inizio dell'azione, la fortuna alla fine.", + fr: "Le courage est au début de l'action, la chance à la fin.", + es: 'El coraje está al comienzo de la acción, la suerte al final.', + }, author: 'Demokrit', category: 'mut', + originalLanguage: 'el', + year: -400, + tags: ['mut', 'handeln', 'glück'], + verified: true, + authorBio: { + de: 'Griechischer Philosoph, Begründer der Atomistik.', + en: 'Greek philosopher, founder of atomism.', + }, }, { id: 'mut-2', - text: 'Wer wagt, gewinnt.', + text: { + original: 'Wer wagt, gewinnt.', + de: 'Wer wagt, gewinnt.', + en: 'Who dares, wins.', + it: 'Chi osa, vince.', + fr: 'Qui ose, gagne.', + es: 'Quien se atreve, gana.', + }, author: 'Deutsches Sprichwort', category: 'mut', + originalLanguage: 'de', + tags: ['mut', 'wagnis', 'erfolg'], + verified: true, }, { id: 'mut-3', - text: 'Der Mutige hat nicht weniger Angst, er handelt trotzdem.', + text: { + original: 'Courage is not the absence of fear, but acting in spite of it.', + de: 'Der Mutige hat nicht weniger Angst, er handelt trotzdem.', + en: 'Courage is not the absence of fear, but acting in spite of it.', + it: "Il coraggio non è l'assenza di paura, ma agire nonostante essa.", + fr: "Le courage n'est pas l'absence de peur, mais d'agir malgré elle.", + es: 'El coraje no es la ausencia de miedo, sino actuar a pesar de él.', + }, author: 'Mark Twain', category: 'mut', + originalLanguage: 'en', + tags: ['mut', 'angst', 'handeln'], + verified: true, }, { id: 'mut-4', - text: 'Mut ist nicht die Abwesenheit von Angst, sondern die Erkenntnis, dass etwas anderes wichtiger ist als Angst.', + text: { + original: + 'Courage is not the absence of fear, but rather the judgment that something else is more important than fear.', + de: 'Mut ist nicht die Abwesenheit von Angst, sondern die Erkenntnis, dass etwas anderes wichtiger ist als Angst.', + en: 'Courage is not the absence of fear, but rather the judgment that something else is more important than fear.', + it: "Il coraggio non è l'assenza di paura, ma piuttosto il giudizio che qualcos'altro è più importante della paura.", + fr: "Le courage n'est pas l'absence de peur, mais plutôt le jugement que quelque chose d'autre est plus important que la peur.", + es: 'El coraje no es la ausencia de miedo, sino más bien el juicio de que algo más es más importante que el miedo.', + }, author: 'Ambrose Redmoon', category: 'mut', + originalLanguage: 'en', + tags: ['mut', 'angst', 'prioritäten'], + verified: true, }, { id: 'mut-5', - text: 'Inmitten der Schwierigkeit liegt die Möglichkeit.', + text: { + original: 'In the middle of difficulty lies opportunity.', + de: 'Inmitten der Schwierigkeit liegt die Möglichkeit.', + en: 'In the middle of difficulty lies opportunity.', + it: "Nel mezzo della difficoltà giace l'opportunità.", + fr: "Au milieu de la difficulté se trouve l'opportunité.", + es: 'En medio de la dificultad yace la oportunidad.', + }, author: 'Albert Einstein', category: 'mut', + originalLanguage: 'en', + tags: ['mut', 'schwierigkeit', 'chance'], + verified: true, }, // ============================================ @@ -317,27 +949,71 @@ export const QUOTES: Quote[] = [ // ============================================ { id: 'hoff-1', - text: 'Hoffnung ist ein Vogel, der singt, wenn die Nacht noch dunkel ist.', + text: { + original: 'আশা একটি পাখি যা অন্ধকার রাতেও গান করে।', + de: 'Hoffnung ist ein Vogel, der singt, wenn die Nacht noch dunkel ist.', + en: 'Hope is a bird that sings when the night is still dark.', + it: 'La speranza è un uccello che canta quando la notte è ancora buia.', + fr: "L'espoir est un oiseau qui chante quand la nuit est encore sombre.", + es: 'La esperanza es un pájaro que canta cuando la noche aún está oscura.', + }, author: 'Rabindranath Tagore', category: 'hoffnung', + originalLanguage: 'bn', + tags: ['hoffnung', 'dunkelheit', 'licht'], + verified: true, + authorBio: { + de: 'Indischer Dichter und Nobelpreisträger für Literatur.', + en: 'Indian poet and Nobel laureate in Literature.', + }, }, { id: 'hoff-2', - text: 'Nach jedem Sturm scheint auch wieder die Sonne.', + text: { + original: 'Nach jedem Sturm scheint auch wieder die Sonne.', + de: 'Nach jedem Sturm scheint auch wieder die Sonne.', + en: 'After every storm, the sun shines again.', + it: 'Dopo ogni tempesta, il sole torna a splendere.', + fr: 'Après chaque tempête, le soleil brille à nouveau.', + es: 'Después de cada tormenta, el sol vuelve a brillar.', + }, author: 'Deutsches Sprichwort', category: 'hoffnung', + originalLanguage: 'de', + tags: ['hoffnung', 'sturm', 'sonne'], + verified: true, }, { id: 'hoff-3', - text: 'Auch aus Steinen, die einem in den Weg gelegt werden, kann man Schönes bauen.', + text: { + original: 'Auch aus Steinen, die einem in den Weg gelegt werden, kann man Schönes bauen.', + de: 'Auch aus Steinen, die einem in den Weg gelegt werden, kann man Schönes bauen.', + en: 'Even from the stones placed in your path, you can build something beautiful.', + it: 'Anche dalle pietre che ti mettono sulla strada, puoi costruire qualcosa di bello.', + fr: 'Même des pierres placées sur ton chemin, tu peux construire quelque chose de beau.', + es: 'Incluso de las piedras que te ponen en el camino, puedes construir algo hermoso.', + }, author: 'Johann Wolfgang von Goethe', category: 'hoffnung', + originalLanguage: 'de', + tags: ['hoffnung', 'hindernisse', 'kreativität'], + verified: true, }, { id: 'hoff-4', - text: 'Das Licht am Ende des Tunnels ist kein Zug.', + text: { + original: 'Das Licht am Ende des Tunnels ist kein Zug.', + de: 'Das Licht am Ende des Tunnels ist kein Zug.', + en: "The light at the end of the tunnel isn't a train.", + it: 'La luce alla fine del tunnel non è un treno.', + fr: "La lumière au bout du tunnel n'est pas un train.", + es: 'La luz al final del túnel no es un tren.', + }, author: 'Deutsches Sprichwort', category: 'hoffnung', + originalLanguage: 'de', + tags: ['hoffnung', 'optimismus', 'humor'], + verified: true, }, // ============================================ @@ -345,27 +1021,80 @@ export const QUOTES: Quote[] = [ // ============================================ { id: 'natur-1', - text: 'In der Natur ist nichts isoliert; alles hängt mit allem zusammen.', + text: { + original: 'In der Natur ist nichts isoliert; alles hängt mit allem zusammen.', + de: 'In der Natur ist nichts isoliert; alles hängt mit allem zusammen.', + en: 'In nature, nothing is isolated; everything is connected.', + it: 'In natura, nulla è isolato; tutto è connesso.', + fr: "Dans la nature, rien n'est isolé ; tout est connecté.", + es: 'En la naturaleza, nada está aislado; todo está conectado.', + }, author: 'Johann Wolfgang von Goethe', category: 'natur', + originalLanguage: 'de', + tags: ['natur', 'verbindung', 'ökologie'], + verified: true, }, { id: 'natur-2', - text: 'Schau tief in die Natur, und dann wirst du alles besser verstehen.', + text: { + original: 'Look deep into nature, and then you will understand everything better.', + de: 'Schau tief in die Natur, und dann wirst du alles besser verstehen.', + en: 'Look deep into nature, and then you will understand everything better.', + it: 'Guarda in profondità nella natura, e poi capirai tutto meglio.', + fr: 'Regarde profondément dans la nature, et alors tu comprendras tout mieux.', + es: 'Mira profundamente en la naturaleza, y entonces entenderás todo mejor.', + }, author: 'Albert Einstein', category: 'natur', + originalLanguage: 'en', + tags: ['natur', 'verstehen', 'weisheit'], + verified: true, }, { id: 'natur-3', - text: 'Die Natur macht keine Sprünge.', + text: { + original: 'Natura non facit saltus.', + de: 'Die Natur macht keine Sprünge.', + en: 'Nature does not make jumps.', + it: 'La natura non fa salti.', + fr: 'La nature ne fait pas de sauts.', + es: 'La naturaleza no da saltos.', + }, author: 'Carl von Linné', category: 'natur', + originalLanguage: 'la', + source: 'Philosophia Botanica', + year: 1751, + tags: ['natur', 'evolution', 'kontinuität'], + verified: true, + authorBio: { + de: 'Schwedischer Naturforscher, Begründer der modernen Taxonomie.', + en: 'Swedish naturalist, founder of modern taxonomy.', + }, }, { id: 'natur-4', - text: 'Vergiss nicht, dass die Erde sich freut, deine nackten Füße zu fühlen, und die Winde sich danach sehnen, mit deinem Haar zu spielen.', + text: { + original: + 'Forget not that the earth delights to feel your bare feet and the winds long to play with your hair.', + de: 'Vergiss nicht, dass die Erde sich freut, deine nackten Füße zu fühlen, und die Winde sich danach sehnen, mit deinem Haar zu spielen.', + en: 'Forget not that the earth delights to feel your bare feet and the winds long to play with your hair.', + it: 'Non dimenticare che la terra si rallegra di sentire i tuoi piedi nudi e i venti desiderano giocare con i tuoi capelli.', + fr: "N'oublie pas que la terre se réjouit de sentir tes pieds nus et que les vents aspirent à jouer avec tes cheveux.", + es: 'No olvides que la tierra se deleita en sentir tus pies descalzos y los vientos anhelan jugar con tu cabello.', + }, author: 'Khalil Gibran', category: 'natur', + originalLanguage: 'en', + source: 'The Prophet', + year: 1923, + tags: ['natur', 'freiheit', 'verbindung'], + verified: true, + authorBio: { + de: 'Libanesisch-amerikanischer Dichter und Philosoph.', + en: 'Lebanese-American poet and philosopher.', + }, }, ]; diff --git a/apps/zitare/packages/content/src/types.ts b/apps/zitare/packages/content/src/types.ts index 0c8eb4033..3f34e5017 100644 --- a/apps/zitare/packages/content/src/types.ts +++ b/apps/zitare/packages/content/src/types.ts @@ -1,15 +1,107 @@ import type { Category } from './categories'; /** - * A quote with author and category + * Supported languages for quote translations + */ +export const SUPPORTED_LANGUAGES = ['original', 'de', 'en', 'it', 'fr', 'es'] as const; +export type SupportedLanguage = (typeof SUPPORTED_LANGUAGES)[number]; + +/** + * Original language of a quote + */ +export const ORIGINAL_LANGUAGES = [ + 'de', // German + 'en', // English + 'fr', // French + 'es', // Spanish + 'it', // Italian + 'la', // Latin + 'el', // Greek (ancient & modern) + 'zh', // Chinese + 'sa', // Sanskrit + 'ar', // Arabic + 'fa', // Persian + 'ja', // Japanese + 'ru', // Russian + 'pt', // Portuguese + 'nl', // Dutch + 'da', // Danish + 'hi', // Hindi + 'bn', // Bengali +] as const; +export type OriginalLanguage = (typeof ORIGINAL_LANGUAGES)[number]; + +/** + * Translated text object + */ +export interface TranslatedText { + /** Original language text */ + original: string; + /** German translation */ + de: string; + /** English translation */ + en: string; + /** Italian translation */ + it: string; + /** French translation */ + fr: string; + /** Spanish translation */ + es: string; +} + +/** + * Author biography in multiple languages + */ +export interface AuthorBio { + de?: string; + en?: string; + it?: string; + fr?: string; + es?: string; +} + +/** + * A quote with author, translations, and metadata */ export interface Quote { /** Unique identifier (e.g., 'mot-1', 'weis-2') */ id: string; - /** The quote text in German */ - text: string; + + /** Quote text in all supported languages */ + text: TranslatedText; + /** Author name */ author: string; + /** Category for filtering */ category: Category; + + /** Original language of the quote */ + originalLanguage: OriginalLanguage; + + /** Source: book, speech, interview, letter, etc. */ + source?: string; + + /** Year the quote was made/published */ + year?: number; + + /** Additional tags for search/filtering */ + tags?: string[]; + + /** URL to author image */ + imageUrl?: string; + + /** Short author biography */ + authorBio?: AuthorBio; + + /** Whether the quote source has been verified */ + verified?: boolean; } + +/** + * Helper type for creating quotes with partial translations + * (translations can be added incrementally) + */ +export type PartialQuote = Omit & { + text: Partial & { original: string; de: string }; +}; diff --git a/apps/zitare/packages/content/src/utils.ts b/apps/zitare/packages/content/src/utils.ts index b2b8ee119..a9923bac0 100644 --- a/apps/zitare/packages/content/src/utils.ts +++ b/apps/zitare/packages/content/src/utils.ts @@ -1,6 +1,6 @@ import { QUOTES } from './quotes'; import { CATEGORIES, CATEGORY_LABELS, type Category } from './categories'; -import type { Quote } from './types'; +import type { Quote, SupportedLanguage } from './types'; /** * Get a random quote @@ -38,14 +38,14 @@ export function getRandomQuoteByCategory(category: Category): Quote | null { } /** - * Search quotes by text or author + * Search quotes by text or author (searches in specified language, defaults to German) */ -export function searchQuotes(searchText: string): Quote[] { +export function searchQuotes(searchText: string, language: SupportedLanguage = 'de'): Quote[] { const lowerSearch = searchText.toLowerCase(); - return QUOTES.filter( - (q) => - q.text.toLowerCase().includes(lowerSearch) || q.author.toLowerCase().includes(lowerSearch) - ); + return QUOTES.filter((q) => { + const text = language === 'original' ? q.text.original : q.text[language]; + return text.toLowerCase().includes(lowerSearch) || q.author.toLowerCase().includes(lowerSearch); + }); } /** @@ -98,20 +98,36 @@ export function getCategoryByName(name: string): Category | null { return null; } +/** + * Get quote text in a specific language + */ +export function getQuoteText(quote: Quote, language: SupportedLanguage = 'de'): string { + if (language === 'original') { + return quote.text.original; + } + return quote.text[language]; +} + /** * Format a quote for display */ -export function formatQuote(quote: Quote): string { +export function formatQuote(quote: Quote, language: SupportedLanguage = 'de'): string { + const text = getQuoteText(quote, language); const categoryLabel = CATEGORY_LABELS[quote.category]; - return `"${quote.text}"\n\n— *${quote.author}*\n\n[${categoryLabel}]`; + return `"${text}"\n\n— *${quote.author}*\n\n[${categoryLabel}]`; } /** * Format a quote with number */ -export function formatQuoteWithNumber(quote: Quote, number: number): string { +export function formatQuoteWithNumber( + quote: Quote, + number: number, + language: SupportedLanguage = 'de' +): string { + const text = getQuoteText(quote, language); const categoryLabel = CATEGORY_LABELS[quote.category]; - return `**#${number}**\n"${quote.text}"\n\n— *${quote.author}* [${categoryLabel}]`; + return `**#${number}**\n"${text}"\n\n— *${quote.author}* [${categoryLabel}]`; } /** @@ -121,6 +137,52 @@ export function getTotalCount(): number { return QUOTES.length; } +/** + * Get quotes by tag + */ +export function getQuotesByTag(tag: string): Quote[] { + const lowerTag = tag.toLowerCase(); + return QUOTES.filter((q) => q.tags?.some((t) => t.toLowerCase() === lowerTag)); +} + +/** + * Get all unique tags + */ +export function getAllTags(): string[] { + const tags = new Set(); + QUOTES.forEach((q) => q.tags?.forEach((t) => tags.add(t))); + return Array.from(tags).sort(); +} + +/** + * Get quotes by author + */ +export function getQuotesByAuthor(author: string): Quote[] { + const lowerAuthor = author.toLowerCase(); + return QUOTES.filter((q) => q.author.toLowerCase().includes(lowerAuthor)); +} + +/** + * Get verified quotes only + */ +export function getVerifiedQuotes(): Quote[] { + return QUOTES.filter((q) => q.verified === true); +} + +/** + * Get quotes by year range + */ +export function getQuotesByYearRange(startYear: number, endYear: number): Quote[] { + return QUOTES.filter((q) => q.year !== undefined && q.year >= startYear && q.year <= endYear); +} + +/** + * Get quotes by original language + */ +export function getQuotesByOriginalLanguage(language: string): Quote[] { + return QUOTES.filter((q) => q.originalLanguage === language); +} + // Helper function function hashString(str: string): number { let hash = 0; diff --git a/services/matrix-zitare-bot/src/bot/matrix.service.ts b/services/matrix-zitare-bot/src/bot/matrix.service.ts index 5f290e390..7e2e99ba0 100644 --- a/services/matrix-zitare-bot/src/bot/matrix.service.ts +++ b/services/matrix-zitare-bot/src/bot/matrix.service.ts @@ -295,7 +295,8 @@ Sag "hilfe" fuer alle Befehle!`; const maxResults = Math.min(results.length, 5); for (let i = 0; i < maxResults; i++) { const quote = results[i]; - text += `**${i + 1}.** "${quote.text.substring(0, 80)}${quote.text.length > 80 ? '...' : ''}"\n-- *${quote.author}*\n\n`; + const quoteText = this.quotesService.getQuoteText(quote); + text += `**${i + 1}.** "${quoteText.substring(0, 80)}${quoteText.length > 80 ? '...' : ''}"\n-- *${quote.author}*\n\n`; } if (results.length > 5) { @@ -405,9 +406,10 @@ Sag "hilfe" fuer alle Befehle!`; try { await this.zitareService.addFavorite(lastQuoteId, token); const quote = this.quotesService.getQuoteById(lastQuoteId); + const quoteText = quote ? this.quotesService.getQuoteText(quote) : ''; await this.sendMessage( roomId, - `Zu Favoriten hinzugefuegt!\n\n"${quote?.text.substring(0, 50)}..."` + `Zu Favoriten hinzugefuegt!\n\n"${quoteText.substring(0, 50)}..."` ); } catch (error) { const errorMsg = error instanceof Error ? error.message : 'Unbekannter Fehler'; @@ -439,7 +441,8 @@ Sag "hilfe" fuer alle Befehle!`; const fav = favorites[i]; const quote = this.quotesService.getQuoteById(fav.quoteId); if (quote) { - text += `**${i + 1}.** "${quote.text.substring(0, 60)}${quote.text.length > 60 ? '...' : ''}"\n-- *${quote.author}*\n\n`; + const quoteText = this.quotesService.getQuoteText(quote); + text += `**${i + 1}.** "${quoteText.substring(0, 60)}${quoteText.length > 60 ? '...' : ''}"\n-- *${quote.author}*\n\n`; } } @@ -557,9 +560,10 @@ Sag "hilfe" fuer alle Befehle!`; await this.zitareService.addQuoteToList(list.id, lastQuoteId, token); const quote = this.quotesService.getQuoteById(lastQuoteId); + const quoteText = quote ? this.quotesService.getQuoteText(quote) : ''; await this.sendMessage( roomId, - `Zitat zu "${list.name}" hinzugefuegt!\n\n"${quote?.text.substring(0, 50)}..."` + `Zitat zu "${list.name}" hinzugefuegt!\n\n"${quoteText.substring(0, 50)}..."` ); } catch (error) { const errorMsg = error instanceof Error ? error.message : 'Unbekannter Fehler'; diff --git a/services/matrix-zitare-bot/src/quotes/quotes.service.ts b/services/matrix-zitare-bot/src/quotes/quotes.service.ts index 0ff781585..db2715d4b 100644 --- a/services/matrix-zitare-bot/src/quotes/quotes.service.ts +++ b/services/matrix-zitare-bot/src/quotes/quotes.service.ts @@ -2,6 +2,7 @@ import { Injectable, Logger } from '@nestjs/common'; import { type Quote, type Category, + type SupportedLanguage, QUOTES, CATEGORIES, CATEGORY_LABELS, @@ -14,6 +15,7 @@ import { getQuoteByIndex, getAllCategories, getCategoryByName, + getQuoteText, formatQuote, formatQuoteWithNumber, getTotalCount, @@ -38,7 +40,8 @@ export class QuotesService { const quote = getDailyQuote(); this.dailyQuoteCache = { date: today, quote }; - this.logger.log(`Daily quote for ${today}: "${quote.text.substring(0, 30)}..."`); + const text = getQuoteText(quote, 'de'); + this.logger.log(`Daily quote for ${today}: "${text.substring(0, 30)}..."`); return quote; } @@ -75,11 +78,15 @@ export class QuotesService { return getTotalCount(); } - formatQuote(quote: Quote): string { - return formatQuote(quote); + getQuoteText(quote: Quote, language: SupportedLanguage = 'de'): string { + return getQuoteText(quote, language); } - formatQuoteWithNumber(quote: Quote, number: number): string { - return formatQuoteWithNumber(quote, number); + formatQuote(quote: Quote, language: SupportedLanguage = 'de'): string { + return formatQuote(quote, language); + } + + formatQuoteWithNumber(quote: Quote, number: number, language: SupportedLanguage = 'de'): string { + return formatQuoteWithNumber(quote, number, language); } }