This commit is contained in:
2026-07-27 16:42:04 +02:00
parent 45a7704ea6
commit 018b751723
23 changed files with 2327 additions and 635 deletions

187
constants/socialProof.ts Normal file
View File

@@ -0,0 +1,187 @@
import { Language } from '../types';
/**
* EINZIGE QUELLE FUER SOCIAL PROOF IN DER APP.
*
* Regel: Hier steht ausschliesslich, was im App Store / Play Store nachweisbar ist.
* Keine erfundenen Zitate, keine geschaetzten Sterne, keine Rundungen nach oben.
* Wenn eine Angabe nicht belegbar ist, wird sie hier entfernt - nicht im UI kaschiert.
*
* Stand: 27.07.2026 - 6 Bewertungen, Durchschnitt 5,0.
* Bei jeder Aktualisierung des Store-Listings hier nachziehen.
*/
export const APP_STORE_RATING = {
value: 5.0,
count: 6,
/** Datum der letzten Verifikation gegen App Store Connect. */
verifiedOn: '2026-07-27',
};
export type Testimonial = {
/** Titel der Bewertung im Store. */
title: string;
/** Wortlaut exakt wie im Store veroeffentlicht (gekuerzt nur mit […]). */
quote: string;
/** Store-Anzeigename - kein erfundener Klarname. */
author: string;
stars: 1 | 2 | 3 | 4 | 5;
/** Sprache, in der die Bewertung tatsaechlich verfasst wurde. */
sourceLanguage: Language;
/** Veroeffentlichungsdatum im Store (ISO), fuer die Nachvollziehbarkeit. */
publishedOn: string;
/**
* Wie stark die Bewertung die Positionierung stuetzt (1 = staerkste).
* Kriterium: benennt sie Triage ("sagt mir, was los ist und was ich tun soll")
* oder nur allgemeine Zufriedenheit? Erstere ueberzeugt, letztere ist Rauschen.
*/
priority: number;
/** Freigegebene Uebersetzungen. Wird im UI als Uebersetzung gekennzeichnet. */
translations?: Partial<Record<Language, string>>;
};
/**
* ECHTE Store-Bewertungen, Stand 27.07.2026 (6 von 6, alle 5 Sterne).
* Wortlaut, Anzeigename und Sternezahl unveraendert uebernommen.
*/
export const TESTIMONIALS: Testimonial[] = [
{
// Staerkste Bewertung im gesamten Bestand: beschreibt exakt die Positionierung
// (Triage statt Identifikation) in den Worten eines echten Nutzers.
title: 'Exactly what I needed',
quote:
"Finally an app that actually helps me keep my plants alive. Snap a photo and it tells you what's wrong and how to fix it - no more guessing why the leaves are turning yellow. Super easy to use and the care reminders are a nice touch. Highly recommend if you're bad at keeping plants alive like me!",
author: 'Chrispetersssss',
stars: 5,
sourceLanguage: 'en',
publishedOn: '2026-07-22',
priority: 1,
translations: {
de: 'Endlich eine App, die mir wirklich hilft, meine Pflanzen am Leben zu halten. Foto machen und sie sagt dir, was nicht stimmt und wie du es behebst - kein Rätselraten mehr, warum die Blätter gelb werden. Sehr einfach zu bedienen, und die Pflege-Erinnerungen sind ein netter Zusatz. Klare Empfehlung, wenn du wie ich schlecht darin bist, Pflanzen am Leben zu halten!',
es: 'Por fin una app que de verdad me ayuda a mantener vivas mis plantas. Haces una foto y te dice qué le pasa y cómo arreglarlo: se acabó adivinar por qué se ponen amarillas las hojas. Muy fácil de usar, y los recordatorios de cuidado son un buen extra. Muy recomendable si se te dan mal las plantas, como a mí.',
},
},
{
// Direkter Wettbewerbsvergleich - stuetzt Belief 5 (Abo statt Alternativen).
title: 'Wow',
quote:
'Die Pflanzenanalyse toppt echt jede andere App die ich bisher ausprobiert habe! Der Hammer!',
author: 'warumistjedernamevergeben',
stars: 5,
sourceLanguage: 'de',
publishedOn: '2026-04-12',
priority: 2,
translations: {
en: 'The plant analysis genuinely beats every other app I have tried so far! Amazing!',
es: '¡El análisis de plantas supera de verdad a cualquier otra app que haya probado! ¡Increíble!',
},
},
{
// Trifft den Avatar woertlich ("keinen gruenen Daumen").
title: 'Mega',
quote:
'Ich habe schon viele Apps ausprobiert, weil ich keinen grünen Daumen habe. Keine hat mich bisher so überzeugt wie diese ! Kann sie jedem ans Herz legen',
author: 'Annastasia2104',
stars: 5,
sourceLanguage: 'de',
publishedOn: '2026-07-02',
priority: 3,
translations: {
en: 'I have tried a lot of apps because I do not have a green thumb. None has convinced me as much as this one! I can recommend it to anyone.',
es: 'He probado muchas apps porque no tengo mano para las plantas. ¡Ninguna me había convencido tanto como esta! Se la recomiendo a cualquiera.',
},
},
{
title: 'Beste App',
quote: 'Bisher mit Abstand die beste App für meine Pflanzen!',
author: 'lina_einhorn',
stars: 5,
sourceLanguage: 'de',
publishedOn: '2026-07-02',
priority: 4,
translations: {
en: 'By far the best app for my plants so far!',
es: '¡Con diferencia, la mejor app para mis plantas hasta ahora!',
},
},
{
title: 'Endlich ....',
quote:
'… vergesse ich nicht, meine Pflanzen zu gießen, um zu pflegen!!! Einfache Bedienung - top App',
author: 'ClaKnu',
stars: 5,
sourceLanguage: 'de',
publishedOn: '2026-07-02',
priority: 5,
translations: {
en: '… I no longer forget to water and care for my plants!!! Easy to use - top app',
es: '… ¡ya no me olvido de regar y cuidar mis plantas!!! Fácil de usar, app estupenda',
},
},
{
title: 'Tolle App',
quote: 'Ich bin richtig zufrieden ! Tolle App',
author: 'annabelle_gouz',
stars: 5,
sourceLanguage: 'de',
publishedOn: '2026-07-04',
priority: 6,
translations: {
en: 'I am really happy with it! Great app',
es: '¡Estoy muy contenta! Gran app',
},
},
];
export type DisplayTestimonial = {
title: string;
quote: string;
author: string;
stars: 1 | 2 | 3 | 4 | 5;
/** true, wenn der angezeigte Text eine Uebersetzung des Originals ist. */
isTranslated: boolean;
};
/**
* Waehlt die staerkste Bewertung fuer die UI-Sprache.
*
* Vorrang hat eine im Original passende Sprache; gibt es keine, wird die
* hoechstpriorisierte Bewertung mit freigegebener Uebersetzung genommen und
* im UI als Uebersetzung gekennzeichnet. Nie wird ein fremdsprachiges
* Original unkommentiert als muttersprachlich ausgegeben.
*/
export const getTestimonialForLanguage = (language: Language): DisplayTestimonial | null => {
if (TESTIMONIALS.length === 0) return null;
const byPriority = [...TESTIMONIALS].sort((a, b) => a.priority - b.priority);
const native = byPriority.find((t) => t.sourceLanguage === language);
if (native) {
return {
title: native.title,
quote: native.quote,
author: native.author,
stars: native.stars,
isTranslated: false,
};
}
const translated = byPriority.find((t) => t.translations?.[language]);
if (translated) {
return {
title: translated.title,
quote: translated.translations![language]!,
author: translated.author,
stars: translated.stars,
isTranslated: true,
};
}
return null;
};
/** Hinweis, der erscheint, wenn eine Bewertung nicht in der UI-Sprache verfasst wurde. */
export const translatedNote = (language: Language): string => {
if (language === 'de') return 'Übersetzt';
if (language === 'es') return 'Traducido';
return 'Translated';
};