Files
TREK/shared/src/i18n/gr/externalNotifications.ts
T
Maurice 2e1dca9fe9 feat(tours): let a background check hint at changes of your own wanderer trails
Settings, Integrations, wanderer gains an optional background check of the
trails you imported, off until you switch it on. While on, TREK reads the
short record of each such trail at most once a day (never its GPX file) and
leaves a hint when the trail may have moved on: "may have changed" when only
wanderer's change time moved, "changed" when its name or description proves
it, and "not checkable" when the trail is gone, no longer yours or carries no
change time. Nothing is ever said to be unchanged. A new hint arrives as a
notification that opens the tour (a new ?place= link in the planner); the
tour's provenance shows it with the source check right beside it, and the
card lists all open hints in a dialog, each leading to its tour. The check
reads the source in full as before and spends the hint; taking a change in
stays the confirmed reimport. No tour is ever changed or deleted.

The check only asks through your own connection, only about trails your
account imported into trips you can still open, and stops when you switch it
off, remove the connection, wanderer refuses the token (until a test passes
or a new token is saved) or the admin switches wanderer off; hints and
snapshots stay. A run asks at most 25 connections for at most 10 records
each, one after another, and an instance that fails (an outage, a rate
limit) is left alone for an hour, doubling up to two days.

Server: migration 046120 adds the switch and the run bookkeeping to
wanderer_connections and the tour_source_hints table (one row per snapshot,
for its importer, gone with it). WandererWatchService and an hourly
wanderer-watch job on the CronRegistrar live in the tours domain and read
through WandererService; GET and PUT /api/integrations/wanderer/watch and GET
/api/trips/:tripId/tours/wanderer/sources/:placeId/hint (place_edit, like the
check) answer with @trek/shared contracts. A new user notification event,
wanderer_source_hint, can be muted per channel. Saving a new token now clears
what the last check said about the old one. There is no MCP tool, as for the
rest of the personal wanderer connection. All 27 locales carry the strings,
and the admin wiki page says what the check does.
2026-10-20 15:35:32 +02:00

103 lines
6.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type { NotificationLocale } from '../externalNotifications/types';
import { pluralForm } from '../plural';
const gr: NotificationLocale = {
email: {
footer: 'Λάβατε αυτό το μήνυμα επειδή έχετε ενεργοποιήσει τις ειδοποιήσεις στο TREK.',
manage: 'Διαχείριση προτιμήσεων στις Ρυθμίσεις',
madeWith: 'Δημιουργήθηκε με',
openTrek: 'Άνοιγμα TREK',
},
events: {
trip_invite: (p) => ({
title: `Πρόσκληση ταξιδιού: "${p.trip}"`,
body: `Ο/Η ${p.actor} προσκάλεσε ${p.invitee || 'ένα μέλος'} στο ταξίδι "${p.trip}".`,
}),
booking_change: (p) => ({
title: `Νέα κράτηση: ${p.booking}`,
body: `Ο/Η ${p.actor} πρόσθεσε μια νέα κράτηση "${p.booking}" (${p.type}) στο "${p.trip}".`,
}),
trip_reminder: (p) => ({
title: `Υπενθύμιση ταξιδιού: ${p.trip}`,
body: `Το ταξίδι σας "${p.trip}" πλησιάζει!`,
}),
todo_due: (p) => ({
title: `Εκκρεμότητα προς εκτέλεση: ${p.todo}`,
body: `Η εκκρεμότητα "${p.todo}" στο "${p.trip}" λήγει στις ${p.due}.`,
}),
vacay_invite: (p) => ({
title: 'Πρόσκληση συγχώνευσης διακοπών',
body: `Ο/Η ${p.actor} σας προσκάλεσε να συγχωνεύσετε τα σχέδια διακοπών σας. Ανοίξτε το TREK για να αποδεχτείτε ή να απορρίψετε.`,
}),
vacay_share: (p) => ({
title: 'Κοινοποίηση Ημερολογίου Vacay',
body: `Ο/Η ${p.actor} κοινοποίησε το ημερολόγιο διακοπών του/της σε εσάς. Ανοίξτε το TREK για να το δείτε.`,
}),
collection_invite: (p) => ({
title: 'Πρόσκληση σε συλλογή',
body: `Ο/Η ${p.actor} σας προσκάλεσε να μοιραστείτε μια συλλογή. Ανοίξτε το TREK για να αποδεχτείτε ή να απορρίψετε.`,
}),
photos_shared: (p) => ({
title: pluralForm(p.count, 'el', {
one: `${p.count} φωτογραφία κοινοποιήθηκε`,
other: `${p.count} φωτογραφίες κοινοποιήθηκαν`,
}),
body: pluralForm(p.count, 'el', {
one: `Ο/Η ${p.actor} κοινοποίησε ${p.count} φωτογραφία στο "${p.trip}".`,
other: `Ο/Η ${p.actor} κοινοποίησε ${p.count} φωτογραφίες στο "${p.trip}".`,
}),
}),
collab_message: (p) => ({
title: `Νέο μήνυμα στο "${p.trip}"`,
body: `${p.actor}: ${p.preview}`,
}),
packing_tagged: (p) => ({
title: `Λίστα συσκευασίας: ${p.category}`,
body: `Ο/Η ${p.actor} σας ανέθεσε στην κατηγορία "${p.category}" της λίστας συσκευασίας στο "${p.trip}".`,
}),
version_available: (p) => ({
title: 'Νέα έκδοση TREK διαθέσιμη',
body: `Η έκδοση TREK ${p.version} είναι τώρα διαθέσιμη. Επισκεφθείτε τον πίνακα διαχείρισης για να ενημερώσετε.`,
}),
replica_failure: (p) => ({
title: 'Αποτυχία αντιγράφου αποθήκευσης',
body:
`Η εγγραφή στο αντίγραφο '${p.backend}' απέτυχε: ${p.op} του ${p.key} — ${p.error}.` +
(p.suppressed !== '0'
? pluralForm(p.suppressed, 'el', {
one: ` ${p.suppressed} επιπλέον αποτυχία αποκρύφθηκε από την τελευταία ειδοποίηση και μετά.`,
other: ` ${p.suppressed} επιπλέον αποτυχίες αποκρύφθηκαν από την τελευταία ειδοποίηση και μετά.`,
})
: ''),
}),
paddle_region_requested: (p) => ({
title: 'Αίτημα περιοχής κανό',
body: `${p.actor} σχεδιάζει διαδρομή κανό στην περιοχή ${p.region}. Φόρτωσε ή απόρριψε τα δεδομένα νερού στη διαχείριση, στα Πρόσθετα.`,
}),
synology_session_cleared: () => ({
title: 'Η σύνδεση Synology τερματίστηκε',
body: 'Ο λογαριασμός σας Synology ή το URL άλλαξε. Έχετε αποσυνδεθεί από το Synology Photos.',
}),
wanderer_source_hint: (p) => ({
title: `Μονοπάτι wanderer: ${p.tour}`,
body:
p.state === 'changed'
? `«${p.tour}» στο «${p.trip}» άλλαξε στο wanderer. Άνοιξε τη διαδρομή και έλεγξε την πηγή της για να δεις όλες τις αλλαγές. Στο ταξίδι τίποτα δεν αλλάζει από μόνο του.`
: p.state === 'unverifiable'
? `«${p.tour}» στο «${p.trip}» δεν ελέγχεται πια στο wanderer. Η διαδρομή στο ταξίδι σου μένει ως έχει.`
: `«${p.tour}» στο «${p.trip}» ίσως άλλαξε στο wanderer. Άνοιξε τη διαδρομή και έλεγξε την πηγή της. Στο ταξίδι τίποτα δεν αλλάζει από μόνο του.`,
}),
plugin_notification: (p) => ({ title: p.title ?? '', body: p.body ?? '' }),
},
passwordReset: {
subject: 'Επαναφορά κωδικού πρόσβασης',
greeting: 'Γεια σας',
body: 'Λάβαμε ένα αίτημα επαναφοράς του κωδικού πρόσβασης για τον λογαριασμό σας στο TREK. Κάντε κλικ στο παρακάτω κουμπί για να ορίσετε νέο κωδικό πρόσβασης.',
ctaIntro: 'Επαναφορά κωδικού',
expiry: 'Αυτός ο σύνδεσμος λήγει σε 60 λεπτά.',
ignore: 'Εάν δεν ζητήσατε αυτή την αλλαγή, μπορείτε να αγνοήσετε αυτό το μήνυμα — ο κωδικός σας δεν θα αλλάξει.',
},
};
export default gr;