From 4da9a2184a2e99b6688597b9a9d07c1db4c7e0d3 Mon Sep 17 00:00:00 2001 From: Mazarin Date: Fri, 5 May 2023 14:01:55 -0400 Subject: [PATCH] feat: calendar view in a vault (monicahq/chandler#464) --- .yarnrc.yml | 2 + .../Controllers/VaultCalendarController.php | 60 ++++ .../VaultCalendarIndexViewHelper.php | 152 ++++++++++ .../Services/UpdateVaultTabVisibility.php | 2 + .../Web/ViewHelpers/VaultIndexViewHelper.php | 4 + .../VaultSettingsTabVisibilityController.php | 1 + .../VaultSettingsIndexViewHelper.php | 1 + app/Models/Vault.php | 2 + .../2014_10_12_000010_create_vaults_table.php | 1 + lang/de.json | 14 + lang/de/vault.php | 5 + lang/es.json | 14 + lang/es/vault.php | 5 + lang/fr.json | 14 + lang/fr/vault.php | 5 + lang/it.json | 14 + lang/it/vault.php | 5 + lang/pt.json | 14 + lang/pt/vault.php | 5 + lang/ru.json | 14 + lang/ru/vault.php | 5 + package.json | 6 +- phpstan.neon | 3 + public/img/calendar_day_blank.svg | 1 + resources/js/Pages/Vault/Calendar/Index.vue | 269 ++++++++++++++++++ .../Vault/Settings/Partials/TabVisibility.vue | 16 ++ resources/js/Shared/Layout.vue | 8 + routes/web.php | 6 + tailwind.config.js | 1 + .../VaultCalendarIndexViewHelperTest.php | 186 ++++++++++++ .../Services/UpdateVaultTabVisibilityTest.php | 2 + .../ViewHelpers/VaultIndexViewHelperTest.php | 2 + .../VaultSettingsIndexViewHelperTest.php | 1 + yarn.lock | 10 +- 34 files changed, 843 insertions(+), 7 deletions(-) create mode 100644 app/Domains/Vault/ManageCalendar/Web/Controllers/VaultCalendarController.php create mode 100644 app/Domains/Vault/ManageCalendar/Web/ViewHelpers/VaultCalendarIndexViewHelper.php create mode 100644 lang/de/vault.php create mode 100644 lang/es/vault.php create mode 100644 lang/fr/vault.php create mode 100644 lang/it/vault.php create mode 100644 lang/pt/vault.php create mode 100644 lang/ru/vault.php create mode 100644 public/img/calendar_day_blank.svg create mode 100644 resources/js/Pages/Vault/Calendar/Index.vue create mode 100644 tests/Unit/Domains/Vault/ManageCalendar/Web/ViewHelpers/VaultCalendarIndexViewHelperTest.php diff --git a/.yarnrc.yml b/.yarnrc.yml index 07e7cc8737c..6878beb7869 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -1,3 +1,5 @@ nodeLinker: node-modules yarnPath: .yarn/releases/yarn-3.5.0.cjs + +checksumBehavior: update diff --git a/app/Domains/Vault/ManageCalendar/Web/Controllers/VaultCalendarController.php b/app/Domains/Vault/ManageCalendar/Web/Controllers/VaultCalendarController.php new file mode 100644 index 00000000000..7cf5f240d8a --- /dev/null +++ b/app/Domains/Vault/ManageCalendar/Web/Controllers/VaultCalendarController.php @@ -0,0 +1,60 @@ +id); + + return Inertia::render('Vault/Calendar/Index', [ + 'layoutData' => VaultIndexViewHelper::layoutData($vault), + 'data' => VaultCalendarIndexViewHelper::data( + vault: $vault, + user: Auth::user(), + year: Carbon::now()->year, + month: Carbon::now()->month, + ), + ]); + } + + public function month(Request $request, Vault $vault, int $year, int $month) + { + $vault = Vault::findOrFail($vault->id); + + return Inertia::render('Vault/Calendar/Index', [ + 'layoutData' => VaultIndexViewHelper::layoutData($vault), + 'data' => VaultCalendarIndexViewHelper::data( + vault: $vault, + user: Auth::user(), + year: $year, + month: $month, + ), + ]); + } + + public function day(Request $request, Vault $vault, int $year, int $month, int $day) + { + $vault = Vault::findOrFail($vault->id); + + return response()->json([ + 'data' => VaultCalendarIndexViewHelper::getDayInformation( + vault: $vault, + user: Auth::user(), + year: $year, + month: $month, + day: $day, + ), + ], 200); + } +} diff --git a/app/Domains/Vault/ManageCalendar/Web/ViewHelpers/VaultCalendarIndexViewHelper.php b/app/Domains/Vault/ManageCalendar/Web/ViewHelpers/VaultCalendarIndexViewHelper.php new file mode 100644 index 00000000000..9bb1b11ce79 --- /dev/null +++ b/app/Domains/Vault/ManageCalendar/Web/ViewHelpers/VaultCalendarIndexViewHelper.php @@ -0,0 +1,152 @@ +copy()->subMonth(); + $nextMonth = $date->copy()->addMonth(); + + $collection = self::buildMonth($vault, $user, $year, $month); + + return [ + 'weeks' => $collection, + 'current_month' => DateHelper::formatLongMonthAndYear($date), + 'previous_month' => DateHelper::formatLongMonthAndYear($previousMonth), + 'next_month' => DateHelper::formatLongMonthAndYear($nextMonth), + 'url' => [ + 'previous' => route('vault.calendar.month', [ + 'vault' => $vault->id, + 'year' => $previousMonth->year, + 'month' => $previousMonth->month, + ]), + 'next' => route('vault.calendar.month', [ + 'vault' => $vault->id, + 'year' => $nextMonth->year, + 'month' => $nextMonth->month, + ]), + ], + ]; + } + + /** + * Completely copied from https://tighten.com/insights/building-a-calendar-with-carbon/. + */ + public static function buildMonth(Vault $vault, User $user, int $year, int $month): Collection + { + $firstDayOfMonth = CarbonImmutable::create($year, $month, 1)->startOfMonth(); + $lastDayOfMonth = CarbonImmutable::create($year, $month, 1)->endOfMonth(); + $startOfWeek = $firstDayOfMonth->startOfWeek(); + $endOfWeek = $lastDayOfMonth->endOfWeek(); + $contactsId = $vault->contacts()->pluck('id'); + + // @phpstan-ignore-next-line + return collect($startOfWeek->toPeriod($endOfWeek)->toArray()) + ->map(fn (CarbonImmutable $day) => [ + 'id' => $day->day, + 'date' => $day->format('d'), + 'is_today' => $day->isToday(), + 'is_in_month' => $day->month === $firstDayOfMonth->month, + 'important_dates' => self::getImportantDates($day->month, $day->day, $contactsId), + 'mood_events' => self::getMood($vault, $user, $day), + 'posts' => self::getJournalEntries($vault, $day), + 'url' => [ + 'show' => route('vault.calendar.day', [ + 'vault' => $vault->id, + 'year' => $day->year, + 'month' => $day->month, + 'day' => $day->day, + ]), + ], + ]) + ->chunk(7); + } + + public static function getImportantDates(int $month, int $day, Collection $contactsId): Collection + { + return ContactImportantDate::where('day', $day) + ->where('month', $month) + ->whereIn('contact_id', $contactsId) + ->with('contact') + ->get() + ->unique('contact_id') + ->map(fn (ContactImportantDate $importantDate) => [ + 'id' => $importantDate->id, + 'label' => $importantDate->label, + 'type' => [ + 'id' => $importantDate->contactImportantDateType?->id, + 'label' => $importantDate->contactImportantDateType?->label, + ], + 'contact' => ContactCardHelper::data($importantDate->contact), + ]); + } + + public static function getMood(Vault $vault, User $user, CarbonImmutable $date): Collection + { + $contact = $user->getContactInVault($vault); + + return $contact->moodTrackingEvents() + ->with('moodTrackingParameter') + ->whereDate('rated_at', $date) + ->get() + ->map(fn (MoodTrackingEvent $moodTrackingEvent) => [ + 'id' => $moodTrackingEvent->id, + 'note' => $moodTrackingEvent->note, + 'number_of_hours_slept' => $moodTrackingEvent->number_of_hours_slept, + 'mood_tracking_parameter' => [ + 'id' => $moodTrackingEvent->moodTrackingParameter->id, + 'label' => $moodTrackingEvent->moodTrackingParameter->label, + 'hex_color' => $moodTrackingEvent->moodTrackingParameter->hex_color, + ], + ]); + } + + public static function getJournalEntries(Vault $vault, CarbonImmutable $day): Collection + { + $journalIds = $vault->journals->pluck('id'); + + return Post::whereIn('journal_id', $journalIds) + ->whereDate('written_at', $day) + ->with('journal') + ->get() + ->map(fn (Post $post) => [ + 'id' => $post->id, + 'title' => $post->title, + 'url' => [ + 'show' => route('post.show', [ + 'vault' => $post->journal->vault_id, + 'journal' => $post->journal_id, + 'post' => $post->id, + ]), + ], + ]); + } + + public static function getDayInformation(Vault $vault, User $user, int $year, int $month, int $day): array + { + $date = Carbon::createFromDate($year, $month, $day); + $immutableDate = CarbonImmutable::createFromDate($year, $month, $day); + $contactsId = $vault->contacts()->pluck('id'); + + return [ + 'day' => DateHelper::formatFullDate($date), + 'important_dates' => self::getImportantDates($date->month, $date->day, $contactsId), + 'mood_events' => self::getMood($vault, $user, $immutableDate), + 'posts' => self::getJournalEntries($vault, $immutableDate), + ]; + } +} diff --git a/app/Domains/Vault/ManageVault/Services/UpdateVaultTabVisibility.php b/app/Domains/Vault/ManageVault/Services/UpdateVaultTabVisibility.php index 3a5f3446e3e..2734403593f 100644 --- a/app/Domains/Vault/ManageVault/Services/UpdateVaultTabVisibility.php +++ b/app/Domains/Vault/ManageVault/Services/UpdateVaultTabVisibility.php @@ -23,6 +23,7 @@ public function rules(): array 'show_journal_tab' => 'required|boolean', 'show_companies_tab' => 'required|boolean', 'show_reports_tab' => 'required|boolean', + 'show_calendar_tab' => 'required|boolean', ]; } @@ -51,6 +52,7 @@ public function execute(array $data): Vault $this->vault->show_journal_tab = $data['show_journal_tab']; $this->vault->show_companies_tab = $data['show_companies_tab']; $this->vault->show_reports_tab = $data['show_reports_tab']; + $this->vault->show_calendar_tab = $data['show_calendar_tab']; $this->vault->save(); return $this->vault; diff --git a/app/Domains/Vault/ManageVault/Web/ViewHelpers/VaultIndexViewHelper.php b/app/Domains/Vault/ManageVault/Web/ViewHelpers/VaultIndexViewHelper.php index b68d5ebbf1c..c5b2c096467 100644 --- a/app/Domains/Vault/ManageVault/Web/ViewHelpers/VaultIndexViewHelper.php +++ b/app/Domains/Vault/ManageVault/Web/ViewHelpers/VaultIndexViewHelper.php @@ -35,6 +35,7 @@ public static function layoutData(Vault $vault = null): array 'show_journal_tab' => $vault->show_journal_tab, 'show_companies_tab' => $vault->show_companies_tab, 'show_reports_tab' => $vault->show_reports_tab, + 'show_calendar_tab' => $vault->show_calendar_tab, ], 'url' => [ 'dashboard' => route('vault.show', [ @@ -43,6 +44,9 @@ public static function layoutData(Vault $vault = null): array 'contacts' => route('contact.index', [ 'vault' => $vault->id, ]), + 'calendar' => route('vault.calendar.index', [ + 'vault' => $vault->id, + ]), 'journals' => route('journal.index', [ 'vault' => $vault->id, ]), diff --git a/app/Domains/Vault/ManageVaultSettings/Web/Controllers/VaultSettingsTabVisibilityController.php b/app/Domains/Vault/ManageVaultSettings/Web/Controllers/VaultSettingsTabVisibilityController.php index 8e6727a5f10..c1ace3991e0 100644 --- a/app/Domains/Vault/ManageVaultSettings/Web/Controllers/VaultSettingsTabVisibilityController.php +++ b/app/Domains/Vault/ManageVaultSettings/Web/Controllers/VaultSettingsTabVisibilityController.php @@ -21,6 +21,7 @@ public function update(Request $request, string $vaultId) 'show_journal_tab' => $request->boolean('show_journal_tab'), 'show_companies_tab' => $request->boolean('show_companies_tab'), 'show_reports_tab' => $request->boolean('show_reports_tab'), + 'show_calendar_tab' => $request->boolean('show_calendar_tab'), ]; (new UpdateVaultTabVisibility())->execute($data); diff --git a/app/Domains/Vault/ManageVaultSettings/Web/ViewHelpers/VaultSettingsIndexViewHelper.php b/app/Domains/Vault/ManageVaultSettings/Web/ViewHelpers/VaultSettingsIndexViewHelper.php index 3036f655ea0..ff4088073be 100644 --- a/app/Domains/Vault/ManageVaultSettings/Web/ViewHelpers/VaultSettingsIndexViewHelper.php +++ b/app/Domains/Vault/ManageVaultSettings/Web/ViewHelpers/VaultSettingsIndexViewHelper.php @@ -152,6 +152,7 @@ public static function data(Vault $vault): array 'show_journal_tab' => $vault->show_journal_tab, 'show_companies_tab' => $vault->show_companies_tab, 'show_reports_tab' => $vault->show_reports_tab, + 'show_calendar_tab' => $vault->show_calendar_tab, ], 'url' => [ 'template_update' => route('vault.settings.template.update', [ diff --git a/app/Models/Vault.php b/app/Models/Vault.php index 20d66af086b..b8c24e22359 100644 --- a/app/Models/Vault.php +++ b/app/Models/Vault.php @@ -48,6 +48,7 @@ class Vault extends Model 'show_files_tab', 'show_journal_tab', 'show_companies_tab', + 'show_calendar_tab', ]; /** @@ -57,6 +58,7 @@ class Vault extends Model */ protected $casts = [ 'show_group_tab' => 'boolean', + 'show_calendar_tab' => 'boolean', 'show_tasks_tab' => 'boolean', 'show_files_tab' => 'boolean', 'show_journal_tab' => 'boolean', diff --git a/database/migrations/2014_10_12_000010_create_vaults_table.php b/database/migrations/2014_10_12_000010_create_vaults_table.php index 1faf73703a6..1a36bacf515 100644 --- a/database/migrations/2014_10_12_000010_create_vaults_table.php +++ b/database/migrations/2014_10_12_000010_create_vaults_table.php @@ -28,6 +28,7 @@ public function up() $table->boolean('show_journal_tab')->default(true); $table->boolean('show_companies_tab')->default(true); $table->boolean('show_reports_tab')->default(true); + $table->boolean('show_calendar_tab')->default(true); $table->timestamps(); }); } diff --git a/lang/de.json b/lang/de.json index 5b7afa333ee..2d2c0110bdc 100644 --- a/lang/de.json +++ b/lang/de.json @@ -24,6 +24,7 @@ "+ pronoun": "+ Pronomen", "+ suffix": "+ Suffix", ":count contact|:count contacts": ":count Kontakte", + ":count hours slept": ":count Stunden geschlafen", ":count min read": ":count Min. Lesezeit", ":count post|:count posts": ":count Beiträge", ":count template section|:count template sections": ":count Vorlagenabschnitte", @@ -219,6 +220,7 @@ "Browser Sessions": "Browsersitzungen", "Buddhist": "Buddhist", "Business": "Geschäftlich", + "Calendar": "Kalender", "Call reasons": "Anrufgründe", "Call reasons let you indicate the reason of calls you make to your contacts.": "Anrufgründe ermöglichen es Ihnen, den Grund der Anrufe anzugeben, die Sie mit Ihren Kontakten führen.", "Calls": "Anrufe", @@ -250,6 +252,7 @@ "Christmas": "Weihnachten", "City": "Stadt", "Click here to re-send the verification email.": "Klicke hier, um eine neue Verifizierungs-E-Mail zu erhalten.", + "Click on a day to see the details": "Klicken Sie auf einen Tag, um die Details zu sehen", "Close": "Schließen", "close edit mode": "Bearbeitungsmodus schließen", "Club": "Club", @@ -423,6 +426,7 @@ "Forgot your password? No problem. Just let us know your email address and we will email you a password reset link that will allow you to choose a new one.": "Haben Sie Ihr Passwort vergessen? Kein Problem. Teilen Sie uns einfach Ihre E-Mail-Adresse mit und wir senden Ihnen per E-Mail einen Link zum Zurücksetzen des Passworts, über den Sie ein Neues auswählen können.", "For your security, please confirm your password to continue.": "Um fortzufahren, bestätigen Sie zu Ihrer Sicherheit bitte Ihr Passwort.", "Found": "Gefunden", + "Friday": "Freitag", "Friend": "Freund", "friend": "Freund", "Gender": "Geschlecht", @@ -590,6 +594,7 @@ "miles": "Meilen", "miles (mi)": "Meilen (mi)", "Modules in this page": "Module auf dieser Seite", + "Monday": "Montag", "Monica. All rights reserved. 2017 — :date.": "Monica. Alle Rechte vorbehalten. 2017 — :date.", "Monica is open source, made by hundreds of people from all around the world.": "Monica ist Open Source und wurde von Hunderten von Menschen aus der ganzen Welt erstellt.", "Monica was made to help you document your life and your social interactions.": "Monica wurde entwickelt, um Ihnen bei der Dokumentation Ihres Lebens und Ihrer sozialen Interaktionen zu helfen.", @@ -707,6 +712,7 @@ "Postal code": "Postleitzahl", "Post metrics": "Post-Metriken", "Posts": "Beiträge", + "Posts in your journals": "Beiträge in Ihren Tagebüchern", "Post templates": "Beitrag-Vorlagen", "Prefix": "Präfix", "Previous": "Vorherige", @@ -776,6 +782,7 @@ "Role": "Rolle", "Roles:": "Rollen:", "Roomates": "Mitbewohner", + "Saturday": "Samstag", "Save": "Speichern", "Saved.": "Gespeichert.", "Saving in progress": "Speichern in Bearbeitung", @@ -801,6 +808,7 @@ "Setup Telegram": "Telegram einrichten", "she\/her": "sie\/ihr", "Shintoist": "Shintoist", + "Show Calendar tab": "Kalender-Tab anzeigen", "Show Companies tab": "Unternehmen-Tab anzeigen", "Show completed tasks (:count)": "Abgeschlossene Aufgaben anzeigen (:count)", "Show Files tab": "Dateien-Tab anzeigen", @@ -832,6 +840,7 @@ "subordinate": "Untergebener", "Suffix": "Suffix", "Summary": "Zusammenfassung", + "Sunday": "Sonntag", "Switch role": "Rolle wechseln", "Switch Teams": "Teams wechseln", "Tabs visibility": "Tab-Sichtbarkeit", @@ -967,6 +976,7 @@ "There are no calls logged yet.": "Es sind noch keine Anrufe protokolliert.", "There are no contact information yet.": "Es sind noch keine Kontaktinformationen vorhanden.", "There are no documents yet.": "Es sind noch keine Dokumente vorhanden.", + "There are no events on that day, future or past.": "Es gibt keine Ereignisse an diesem Tag, weder in der Zukunft noch in der Vergangenheit.", "There are no files yet.": "Es gibt noch keine Dateien.", "There are no goals yet.": "Es sind noch keine Ziele vorhanden.", "There are no journal metrics.": "Es gibt keine Journal-Metriken.", @@ -1044,6 +1054,7 @@ "This user will be part of your account, but won’t get access to all the vaults in this account unless you give specific access to them. This person will be able to create vaults as well.": "Dieser Benutzer wird Teil Ihres Kontos sein, hat jedoch keinen Zugriff auf alle Tresore in diesem Konto, es sei denn, Sie geben ihnen spezifischen Zugriff darauf. Diese Person wird auch in der Lage sein, Tresore zu erstellen.", "This will immediately:": "Dies wird sofort:", "Three things that happened today": "Drei Dinge, die heute passiert sind", + "Thursday": "Donnerstag", "Timezone": "Zeitzone", "Title": "Titel", "to": "bis", @@ -1063,6 +1074,7 @@ "Total streaks": "Gesamtzahl von Serien", "Track a new metric": "Eine neue Metrik verfolgen", "Transportation": "Transport", + "Tuesday": "Dienstag", "Two-factor Confirmation": "Zwei-Faktor-Bestätigung", "Two Factor Authentication": "Zwei-Faktor-Authentifizierung", "Two factor authentication is now enabled. Scan the following QR code using your phone's authenticator application or enter the setup key.": "Die Zwei-Faktor-Authentifizierung ist jetzt aktiviert. Scannen Sie den folgenden QR-Code mit der Authentifizierungsanwendung Ihres Smartphones oder geben Sie den Einrichtungsschlüssel ein.", @@ -1139,6 +1151,7 @@ "WebAuthn only supports secure connections. Please load this page with https scheme.": "WebAuthn unterstützt nur sichere Verbindungen. Bitte laden Sie diese Seite mit dem https-Schema.", "We call them a relation, and its reverse relation. For each relation you define, you need to define its counterpart.": "Wir nennen sie Beziehung und ihre umgekehrte Beziehung. Für jede Beziehung, die Sie definieren, müssen Sie deren Gegenstück definieren.", "Wedding": "Hochzeit", + "Wednesday": "Mittwoch", "We hope you will like what we’ve done.": "Wir hoffen, dass Ihnen gefällt, was wir getan haben.", "Welcome to Monica.": "Willkommen bei Monika.", "Went to a bar": "In eine Bar gegangen", @@ -1206,6 +1219,7 @@ "Your email address is unverified.": "Ihre E-Mail-Adresse ist nicht verifiziert.", "Your life events": "Deine Lebensereignisse", "Your mood has been recorded!": "Deine Stimmung wurde erfasst!", + "Your mood that day": "Ihre Stimmung an diesem Tag", "Your mood that you logged at this date": "Ihre Stimmung, die Sie an diesem Datum protokolliert haben", "Your mood this year": "Ihre Stimmung in diesem Jahr", "Your name here will be used to add yourself as a contact.": "Ihr Name hier wird verwendet, um sich selbst als Kontakt hinzuzufügen.", diff --git a/lang/de/vault.php b/lang/de/vault.php new file mode 100644 index 00000000000..3a8fc529724 --- /dev/null +++ b/lang/de/vault.php @@ -0,0 +1,5 @@ + '', +]; diff --git a/lang/es.json b/lang/es.json index fcd8cf9ecc3..e4aa10e45fd 100644 --- a/lang/es.json +++ b/lang/es.json @@ -24,6 +24,7 @@ "+ pronoun": "+ pronombre", "+ suffix": "+ sufijo", ":count contact|:count contacts": ":count contactos", + ":count hours slept": ":count horas dormidas", ":count min read": ":count minutos de lectura.", ":count post|:count posts": ":count publicaciones.", ":count template section|:count template sections": ":count secciones de plantilla.", @@ -219,6 +220,7 @@ "Browser Sessions": "Sesiones del navegador", "Buddhist": "Budista", "Business": "Negocios", + "Calendar": "Calendario", "Call reasons": "Razones de llamada", "Call reasons let you indicate the reason of calls you make to your contacts.": "Las razones de llamada te permiten indicar la razón de las llamadas que realizas a tus contactos.", "Calls": "Llamadas", @@ -250,6 +252,7 @@ "Christmas": "Navidad", "City": "Ciudad", "Click here to re-send the verification email.": "Haga clic aquí para reenviar el correo de verificación.", + "Click on a day to see the details": "Haga clic en un día para ver los detalles", "Close": "Cerrar", "close edit mode": "cerrar el modo de edición", "Club": "Club", @@ -423,6 +426,7 @@ "Forgot your password? No problem. Just let us know your email address and we will email you a password reset link that will allow you to choose a new one.": "¿Olvidó su contraseña? No hay problema. Simplemente déjenos saber su dirección de correo electrónico y le enviaremos un enlace para restablecer la contraseña que le permitirá elegir una nueva.", "For your security, please confirm your password to continue.": "Por su seguridad, confirme su contraseña para continuar.", "Found": "Encontrado", + "Friday": "Viernes", "Friend": "Amigo", "friend": "amigo", "Gender": "Género", @@ -590,6 +594,7 @@ "miles": "millas", "miles (mi)": "millas (mi)", "Modules in this page": "Módulos en esta página", + "Monday": "Lunes", "Monica. All rights reserved. 2017 — :date.": "Monica. Todos los derechos reservados. 2017 — :date.", "Monica is open source, made by hundreds of people from all around the world.": "Monica es de código abierto, creada por cientos de personas de todo el mundo.", "Monica was made to help you document your life and your social interactions.": "Monica fue creada para ayudarlo a documentar su vida y sus interacciones sociales.", @@ -707,6 +712,7 @@ "Postal code": "Código postal", "Post metrics": "Métricas de publicaciones", "Posts": "Entradas de diario", + "Posts in your journals": "Entradas de diario en tus diarios", "Post templates": "Plantillas de publicación", "Prefix": "Prefijo", "Previous": "Anterior", @@ -776,6 +782,7 @@ "Role": "Rol", "Roles:": "Roles:", "Roomates": "Compañeros de habitación", + "Saturday": "Sábado", "Save": "Guardar", "Saved.": "Guardado.", "Saving in progress": "Guardando en progreso.", @@ -801,6 +808,7 @@ "Setup Telegram": "Configurar Telegram", "she\/her": "ella\/ella", "Shintoist": "Shintoísta", + "Show Calendar tab": "Mostrar pestaña de calendario", "Show Companies tab": "Mostrar pestaña de empresas", "Show completed tasks (:count)": "Mostrar tareas completadas (:count)", "Show Files tab": "Mostrar pestaña de archivos", @@ -832,6 +840,7 @@ "subordinate": "subordinado", "Suffix": "Sufijo", "Summary": "Resumen", + "Sunday": "Domingo", "Switch role": "Cambiar rol", "Switch Teams": "Cambiar de equipo", "Tabs visibility": "Visibilidad de las pestañas", @@ -967,6 +976,7 @@ "There are no calls logged yet.": "Todavía no se han registrado llamadas.", "There are no contact information yet.": "Todavía no hay información de contacto.", "There are no documents yet.": "Todavía no hay documentos.", + "There are no events on that day, future or past.": "No hay eventos en ese día, futuro o pasado.", "There are no files yet.": "Todavía no hay archivos.", "There are no goals yet.": "Todavía no hay metas.", "There are no journal metrics.": "No hay métricas de diarios.", @@ -1044,6 +1054,7 @@ "This user will be part of your account, but won’t get access to all the vaults in this account unless you give specific access to them. This person will be able to create vaults as well.": "Este usuario será parte de su cuenta, pero no tendrá acceso a todas las bóvedas de esta cuenta a menos que les dé acceso específico. Esta persona también podrá crear bóvedas.", "This will immediately:": "Esto inmediatamente:", "Three things that happened today": "Tres cosas que sucedieron hoy", + "Thursday": "Jueves", "Timezone": "Zona horaria", "Title": "Título", "to": "al", @@ -1063,6 +1074,7 @@ "Total streaks": "Rachas totales", "Track a new metric": "Seguir una nueva métrica", "Transportation": "Transporte", + "Tuesday": "Martes", "Two-factor Confirmation": "Confirmación de dos factores", "Two Factor Authentication": "Autenticación de dos factores", "Two factor authentication is now enabled. Scan the following QR code using your phone's authenticator application or enter the setup key.": "La autenticación de dos factores ahora está habilitada. Escanee el siguiente código QR usando la aplicación de autenticación de su teléfono o ingrese la clave de configuración.", @@ -1139,6 +1151,7 @@ "WebAuthn only supports secure connections. Please load this page with https scheme.": "WebAuthn solo admite conexiones seguras. Cargue esta página con el esquema https.", "We call them a relation, and its reverse relation. For each relation you define, you need to define its counterpart.": "Los llamamos una relación y su relación inversa. Por cada relación que definas, necesitas definir su contraparte.", "Wedding": "Boda", + "Wednesday": "Miércoles", "We hope you will like what we’ve done.": "Esperamos que te guste lo que hemos hecho.", "Welcome to Monica.": "Bienvenido a Mónica.", "Went to a bar": "Fue a un bar", @@ -1206,6 +1219,7 @@ "Your email address is unverified.": "Su dirección de correo electrónico no está verificada.", "Your life events": "Eventos de tu vida", "Your mood has been recorded!": "¡Tu estado de ánimo ha sido registrado!", + "Your mood that day": "Tu estado de ánimo ese día", "Your mood that you logged at this date": "Tu estado de ánimo que registraste en esta fecha", "Your mood this year": "Tu estado de ánimo este año", "Your name here will be used to add yourself as a contact.": "Su nombre aquí se utilizará para agregarse como contacto.", diff --git a/lang/es/vault.php b/lang/es/vault.php new file mode 100644 index 00000000000..3a8fc529724 --- /dev/null +++ b/lang/es/vault.php @@ -0,0 +1,5 @@ + '', +]; diff --git a/lang/fr.json b/lang/fr.json index 4ba55b389aa..f757383906b 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -24,6 +24,7 @@ "+ pronoun": "+ pronom", "+ suffix": "+ suffixe", ":count contact|:count contacts": ":count contact|:count contacts", + ":count hours slept": ":count heures de sommeil", ":count min read": ":count min de lecture", ":count post|:count posts": ":count publication|:count publications", ":count template section|:count template sections": ":count section de modèle|:count sections de modèle", @@ -219,6 +220,7 @@ "Browser Sessions": "Sessions de navigateur", "Buddhist": "Bouddhiste", "Business": "Entreprise", + "Calendar": "Calendrier", "Call reasons": "Raisons d’appel", "Call reasons let you indicate the reason of calls you make to your contacts.": "Les raisons d’appel vous permettent d’indiquer la raison des appels que vous passez à vos contacts.", "Calls": "Appels", @@ -250,6 +252,7 @@ "Christmas": "Noël", "City": "Ville", "Click here to re-send the verification email.": "Cliquez ici pour renvoyer l’e-mail de vérification.", + "Click on a day to see the details": "Cliquez sur un jour pour voir les détails", "Close": "Fermer", "close edit mode": "fermer le mode d’édition", "Club": "Club", @@ -423,6 +426,7 @@ "Forgot your password? No problem. Just let us know your email address and we will email you a password reset link that will allow you to choose a new one.": "Mot de passe oublié ? Pas de soucis. Veuillez nous indiquer votre adresse e-mail et nous vous enverrons un lien de réinitialisation du mot de passe.", "For your security, please confirm your password to continue.": "Par mesure de sécurité, veuillez confirmer votre mot de passe pour continuer.", "Found": "Trouvé", + "Friday": "Vendredi", "Friend": "Ami", "friend": "ami", "Gender": "Genre", @@ -590,6 +594,7 @@ "miles": "miles", "miles (mi)": "miles (mi)", "Modules in this page": "Modules dans cette page", + "Monday": "Lundi", "Monica. All rights reserved. 2017 — :date.": "Monica. Tous droits réservés. 2017 — :date.", "Monica is open source, made by hundreds of people from all around the world.": "Monica est open source, créé par des centaines de personnes du monde entier.", "Monica was made to help you document your life and your social interactions.": "Monica a été créée pour vous aider à documenter votre vie et vos interactions sociales.", @@ -707,6 +712,7 @@ "Postal code": "Code postal", "Post metrics": "Métriques de publication", "Posts": "Entrées de journal", + "Posts in your journals": "Entrées de journal dans vos journaux", "Post templates": "Modèles d’entrée de journal", "Prefix": "Préfixe", "Previous": "Précédent", @@ -776,6 +782,7 @@ "Role": "Rôle", "Roles:": "Rôles :", "Roomates": "Colocataires", + "Saturday": "Samedi", "Save": "Sauvegarder", "Saved.": "Sauvegardé.", "Saving in progress": "Sauvegarde en cours", @@ -801,6 +808,7 @@ "Setup Telegram": "Configurer Telegram", "she\/her": "elle\/elle", "Shintoist": "Shintoïste", + "Show Calendar tab": "Afficher l’onglet Calendrier", "Show Companies tab": "Afficher l’onglet Entreprises", "Show completed tasks (:count)": "Afficher les tâches terminées (:count)", "Show Files tab": "Afficher l’onglet Fichiers", @@ -832,6 +840,7 @@ "subordinate": "subordonné", "Suffix": "Suffixe", "Summary": "Résumé", + "Sunday": "Dimanche", "Switch role": "Changer de rôle", "Switch Teams": "Permuter les équipes", "Tabs visibility": "Visibilité des onglets", @@ -967,6 +976,7 @@ "There are no calls logged yet.": "Il n’y a pas encore d’appel enregistré.", "There are no contact information yet.": "Il n’y a pas encore d’information de contact.", "There are no documents yet.": "Il n’y a pas encore de document.", + "There are no events on that day, future or past.": "Il n’y a pas d’événement ce jour-là, futur ou passé.", "There are no files yet.": "Il n’y a pas encore de fichiers.", "There are no goals yet.": "Il n’y a pas encore d’objectif.", "There are no journal metrics.": "Il n’y a pas de métriques de journal.", @@ -1044,6 +1054,7 @@ "This user will be part of your account, but won’t get access to all the vaults in this account unless you give specific access to them. This person will be able to create vaults as well.": "Cet utilisateur fera partie de votre compte, mais n’aura pas accès à tous les coffres-forts de ce compte à moins que vous ne lui donniez un accès spécifique. Cette personne pourra également créer des coffres-forts.", "This will immediately:": "Cela va immédiatement:", "Three things that happened today": "Trois choses qui se sont passées aujourd’hui", + "Thursday": "Jeudi", "Timezone": "Fuseau horaire", "Title": "Titre", "to": "à", @@ -1063,6 +1074,7 @@ "Total streaks": "Total des séries", "Track a new metric": "Suivre une nouvelle métrique", "Transportation": "Transport", + "Tuesday": "Mardi", "Two-factor Confirmation": "Confirmation à deux facteurs", "Two Factor Authentication": "Authentification à deux facteurs", "Two factor authentication is now enabled. Scan the following QR code using your phone's authenticator application or enter the setup key.": "L’authentification à deux facteurs est maintenant activée. Scannez le code QR suivant à l’aide de l’application d’authentification de votre téléphone ou entrez la clé de configuration.", @@ -1139,6 +1151,7 @@ "WebAuthn only supports secure connections. Please load this page with https scheme.": "WebAuthn ne prend en charge que les connexions sécurisées. Veuillez charger cette page avec le schéma https.", "We call them a relation, and its reverse relation. For each relation you define, you need to define its counterpart.": "Nous les appelons une relation, et sa relation inverse. Pour chaque relation que vous définissez, vous devez définir son homologue.", "Wedding": "Mariage", + "Wednesday": "Mercredi", "We hope you will like what we’ve done.": "Nous espérons que vous aimerez ce que nous avons fait.", "Welcome to Monica.": "Bienvenue à Monica.", "Went to a bar": "Est allé dans un bar", @@ -1206,6 +1219,7 @@ "Your email address is unverified.": "Votre adresse e-mail n’est pas vérifiée.", "Your life events": "Vos événements de vie", "Your mood has been recorded!": "Votre humeur a été enregistrée !", + "Your mood that day": "Votre humeur ce jour-là", "Your mood that you logged at this date": "Votre humeur que vous avez enregistrée à cette date", "Your mood this year": "Votre humeur cette année", "Your name here will be used to add yourself as a contact.": "Votre nom ici sera utilisé pour vous ajouter en tant que contact.", diff --git a/lang/fr/vault.php b/lang/fr/vault.php new file mode 100644 index 00000000000..3a8fc529724 --- /dev/null +++ b/lang/fr/vault.php @@ -0,0 +1,5 @@ + '', +]; diff --git a/lang/it.json b/lang/it.json index 2325d153098..49343262e07 100644 --- a/lang/it.json +++ b/lang/it.json @@ -24,6 +24,7 @@ "+ pronoun": "+ pronome", "+ suffix": "+ suffisso", ":count contact|:count contacts": ":count contatti", + ":count hours slept": ":count ore di sonno", ":count min read": "Lettura di :count minuti", ":count post|:count posts": ":count post", ":count template section|:count template sections": ":count sezioni del modello", @@ -219,6 +220,7 @@ "Browser Sessions": "Sessioni del Browser", "Buddhist": "Buddista", "Business": "Business", + "Calendar": "Calendario", "Call reasons": "Motivi di chiamata", "Call reasons let you indicate the reason of calls you make to your contacts.": "I motivi di chiamata ti permettono di indicare il motivo delle chiamate che fai ai tuoi contatti.", "Calls": "Chiamate", @@ -250,6 +252,7 @@ "Christmas": "Natale", "City": "Città", "Click here to re-send the verification email.": "Clicca qui per inviare nuovamente una email di verifica.", + "Click on a day to see the details": "Clicca su un giorno per vedere i dettagli", "Close": "Chiudi", "close edit mode": "chiudi la modalità di modifica", "Club": "Club", @@ -423,6 +426,7 @@ "Forgot your password? No problem. Just let us know your email address and we will email you a password reset link that will allow you to choose a new one.": "Password dimenticata? Nessun problema. Inserisci l'email sulla quale ricevere un link con il reset della password che ti consentirà di sceglierne una nuova.", "For your security, please confirm your password to continue.": "Per la tua sicurezza, conferma la tua password per continuare.", "Found": "Trovato", + "Friday": "Venerdì", "Friend": "Amico", "friend": "amico", "Gender": "Genere", @@ -590,6 +594,7 @@ "miles": "miglia", "miles (mi)": "miglia (mi)", "Modules in this page": "Moduli in questa pagina", + "Monday": "Lunedì", "Monica. All rights reserved. 2017 — :date.": "Monica. Tutti i diritti riservati. 2017 — :date.", "Monica is open source, made by hundreds of people from all around the world.": "Monica è open source, creata da centinaia di persone provenienti da tutto il mondo.", "Monica was made to help you document your life and your social interactions.": "Monica è stata creata per aiutarti a documentare la tua vita e le tue interazioni sociali.", @@ -707,6 +712,7 @@ "Postal code": "Codice postale", "Post metrics": "Metriche del post", "Posts": "Post", + "Posts in your journals": "Post nei tuoi diari", "Post templates": "Modelli di post", "Prefix": "Prefisso", "Previous": "Precedente", @@ -776,6 +782,7 @@ "Role": "Ruolo", "Roles:": "Ruoli:", "Roomates": "Coinquilini", + "Saturday": "Sabato", "Save": "Salva", "Saved.": "Salvato.", "Saving in progress": "Salvataggio in corso", @@ -801,6 +808,7 @@ "Setup Telegram": "Imposta Telegram", "she\/her": "lei\/lei", "Shintoist": "Shintoista", + "Show Calendar tab": "Mostra la scheda Calendario", "Show Companies tab": "Mostra la scheda Aziende", "Show completed tasks (:count)": "Mostra compiti completati (:count)", "Show Files tab": "Mostra la scheda File", @@ -832,6 +840,7 @@ "subordinate": "subordinato", "Suffix": "Suffisso", "Summary": "Sommario", + "Sunday": "Domenica", "Switch role": "Cambia ruolo", "Switch Teams": "Cambia Team", "Tabs visibility": "Visibilità schede", @@ -967,6 +976,7 @@ "There are no calls logged yet.": "Non ci sono ancora chiamate registrate.", "There are no contact information yet.": "Non ci sono ancora informazioni di contatto.", "There are no documents yet.": "Non ci sono ancora documenti.", + "There are no events on that day, future or past.": "Non ci sono eventi in quel giorno, futuro o passato.", "There are no files yet.": "Non ci sono ancora file.", "There are no goals yet.": "Non ci sono ancora obiettivi.", "There are no journal metrics.": "Non ci sono metriche di diario.", @@ -1044,6 +1054,7 @@ "This user will be part of your account, but won’t get access to all the vaults in this account unless you give specific access to them. This person will be able to create vaults as well.": "Questo utente farà parte del tuo account, ma non avrà accesso a tutte le cassette di sicurezza in questo account a meno che tu non dia loro un accesso specifico. Questa persona potrà anche creare cassette di sicurezza.", "This will immediately:": "Questo farà immediatamente:", "Three things that happened today": "Tre cose che sono successe oggi", + "Thursday": "Giovedì", "Timezone": "Fuso orario", "Title": "Titolo", "to": "a", @@ -1063,6 +1074,7 @@ "Total streaks": "Totale delle strisce", "Track a new metric": "Tieni traccia di una nuova metrica", "Transportation": "Trasporti", + "Tuesday": "Martedì", "Two-factor Confirmation": "Conferma a due fattori", "Two Factor Authentication": "Autenticazione a due fattori", "Two factor authentication is now enabled. Scan the following QR code using your phone's authenticator application or enter the setup key.": "L'autenticazione a due fattori è stata attivata. Scansiona il QR code seguente usando l'app di autenticazione sul tuo cellulare oppure scrivi il codice di configurazione.", @@ -1139,6 +1151,7 @@ "WebAuthn only supports secure connections. Please load this page with https scheme.": "WebAuthn supporta solo connessioni sicure. Carica questa pagina con lo schema https.", "We call them a relation, and its reverse relation. For each relation you define, you need to define its counterpart.": "Li chiamiamo una relazione e la sua relazione inversa. Per ogni relazione che definisci, devi definire il suo controparte.", "Wedding": "Matrimonio", + "Wednesday": "Mercoledì", "We hope you will like what we’ve done.": "Speriamo che ti piacerà ciò che abbiamo fatto.", "Welcome to Monica.": "Benvenuto in Monica.", "Went to a bar": "È andato\/a in un bar", @@ -1206,6 +1219,7 @@ "Your email address is unverified.": "Il tuo indirizzo email non è verificato.", "Your life events": "I tuoi eventi di vita", "Your mood has been recorded!": "Il tuo stato d'animo è stato registrato!", + "Your mood that day": "Il tuo umore quel giorno", "Your mood that you logged at this date": "Il tuo umore che hai registrato in questa data", "Your mood this year": "Il tuo umore di quest'anno", "Your name here will be used to add yourself as a contact.": "Il tuo nome qui verrà utilizzato per aggiungerti come contatto.", diff --git a/lang/it/vault.php b/lang/it/vault.php new file mode 100644 index 00000000000..3a8fc529724 --- /dev/null +++ b/lang/it/vault.php @@ -0,0 +1,5 @@ + '', +]; diff --git a/lang/pt.json b/lang/pt.json index c755597d15a..58ed58281c9 100644 --- a/lang/pt.json +++ b/lang/pt.json @@ -24,6 +24,7 @@ "+ pronoun": "+ pronome", "+ suffix": "+ sufixo", ":count contact|:count contacts": ":count contatos", + ":count hours slept": ":count horas dormidas", ":count min read": ":contagem min de leitura", ":count post|:count posts": ":contagem posts", ":count template section|:count template sections": ":contagem seções do modelo", @@ -219,6 +220,7 @@ "Browser Sessions": "Sessões em Browser", "Buddhist": "Budista", "Business": "Negócios", + "Calendar": "Calendário", "Call reasons": "Motivos da chamada", "Call reasons let you indicate the reason of calls you make to your contacts.": "Os motivos da chamada permitem indicar o motivo das chamadas que você faz para seus contatos.", "Calls": "Ligações", @@ -250,6 +252,7 @@ "Christmas": "Natal", "City": "Cidade", "Click here to re-send the verification email.": "Clique aqui para reenviar o e-mail de verificação.", + "Click on a day to see the details": "Clique em um dia para ver os detalhes", "Close": "Fechar", "close edit mode": "fechar modo de edição", "Club": "Clube", @@ -423,6 +426,7 @@ "Forgot your password? No problem. Just let us know your email address and we will email you a password reset link that will allow you to choose a new one.": "Esqueceu a palavra-passe? Não há problema. Indique-nos o seu e-mail e vamos enviar-lhe um link para redefinir a palavra-passe que lhe vai permitir escolher uma nova.", "For your security, please confirm your password to continue.": "Por razões de segurança, por favor confirme a sua palavra-passe antes de continuar .", "Found": "Encontrado", + "Friday": "Sexta-feira", "Friend": "Amigo", "friend": "amigo", "Gender": "Gênero", @@ -590,6 +594,7 @@ "miles": "milhas", "miles (mi)": "milhas (mi)", "Modules in this page": "Módulos nesta página", + "Monday": "Segunda-feira", "Monica. All rights reserved. 2017 — :date.": "Monica. Todos os direitos reservados. 2017 - :date.", "Monica is open source, made by hundreds of people from all around the world.": "Monica é de código aberto, criada por centenas de pessoas de todo o mundo.", "Monica was made to help you document your life and your social interactions.": "A Monica foi criada para ajudá-lo a documentar sua vida e suas interações sociais.", @@ -707,6 +712,7 @@ "Postal code": "Código postal", "Post metrics": "Métricas de postagem", "Posts": "Publicações", + "Posts in your journals": "Publicações nos seus jornais", "Post templates": "Modelos de postagem", "Prefix": "Prefixo", "Previous": "Anterior", @@ -776,6 +782,7 @@ "Role": "Função", "Roles:": "Funções:", "Roomates": "Colegas de quarto", + "Saturday": "Sábado", "Save": "Guardar", "Saved.": "Guardado.", "Saving in progress": "Salvando em andamento", @@ -801,6 +808,7 @@ "Setup Telegram": "Configurar Telegram", "she\/her": "ela\/ela", "Shintoist": "Xintoísta", + "Show Calendar tab": "Mostrar guia Calendário", "Show Companies tab": "Mostrar guia Empresas", "Show completed tasks (:count)": "Mostrar tarefas concluídas (:count)", "Show Files tab": "Mostrar guia Arquivos", @@ -832,6 +840,7 @@ "subordinate": "subordinado", "Suffix": "Sufixo", "Summary": "Resumo", + "Sunday": "Domingo", "Switch role": "Alternar papel", "Switch Teams": "Trocar de Equipa", "Tabs visibility": "Visibilidade das abas", @@ -967,6 +976,7 @@ "There are no calls logged yet.": "Não há chamadas registradas ainda.", "There are no contact information yet.": "Ainda não há informações de contato.", "There are no documents yet.": "Ainda não há documentos.", + "There are no events on that day, future or past.": "Não há eventos nesse dia, futuro ou passado.", "There are no files yet.": "Ainda não há arquivos.", "There are no goals yet.": "Ainda não há metas.", "There are no journal metrics.": "Não há métricas de jornal.", @@ -1044,6 +1054,7 @@ "This user will be part of your account, but won’t get access to all the vaults in this account unless you give specific access to them. This person will be able to create vaults as well.": "Este usuário fará parte da sua conta, mas não terá acesso a todos os cofres a menos que você conceda acesso específico a eles. Essa pessoa também poderá criar cofres.", "This will immediately:": "Isso imediatamente:", "Three things that happened today": "Três coisas que aconteceram hoje", + "Thursday": "Quinta-feira", "Timezone": "Fuso horário", "Title": "Título", "to": "até", @@ -1063,6 +1074,7 @@ "Total streaks": "Total de sequências", "Track a new metric": "Acompanhar uma nova métrica", "Transportation": "Transporte", + "Tuesday": "Terça-feira", "Two-factor Confirmation": "Confirmação de dois fatores", "Two Factor Authentication": "Autenticação de dois fatores", "Two factor authentication is now enabled. Scan the following QR code using your phone's authenticator application or enter the setup key.": "A autenticação de dois factores está agora ativa. Digitalize o seguinte código QR utilizando a aplicação autenticadora do seu telemóvel ou introduza a chave de configuração.", @@ -1139,6 +1151,7 @@ "WebAuthn only supports secure connections. Please load this page with https scheme.": "O WebAuthn só suporta conexões seguras. Carregue esta página com o esquema https.", "We call them a relation, and its reverse relation. For each relation you define, you need to define its counterpart.": "Nós os chamamos de relação e sua relação inversa. Para cada relação que você define, é necessário definir sua contraparte.", "Wedding": "Casamento", + "Wednesday": "Quarta-feira", "We hope you will like what we’ve done.": "Esperamos que você goste do que fizemos.", "Welcome to Monica.": "Bem-vindo ao Monica.", "Went to a bar": "Fui a um bar", @@ -1206,6 +1219,7 @@ "Your email address is unverified.": "Seu endereço de e-mail não foi verificado.", "Your life events": "Seus eventos de vida", "Your mood has been recorded!": "Seu humor foi registrado!", + "Your mood that day": "Seu humor naquele dia", "Your mood that you logged at this date": "Seu humor que você registrou nesta data", "Your mood this year": "Seu humor este ano", "Your name here will be used to add yourself as a contact.": "Seu nome aqui será usado para adicionar você mesmo como contato.", diff --git a/lang/pt/vault.php b/lang/pt/vault.php new file mode 100644 index 00000000000..3a8fc529724 --- /dev/null +++ b/lang/pt/vault.php @@ -0,0 +1,5 @@ + '', +]; diff --git a/lang/ru.json b/lang/ru.json index 94bfc16a623..7a25dbe4861 100644 --- a/lang/ru.json +++ b/lang/ru.json @@ -24,6 +24,7 @@ "+ pronoun": "+ местоимение", "+ suffix": "+ суффикс", ":count contact|:count contacts": ":count контакт|:count контакта|:count контактов", + ":count hours slept": "", ":count min read": ":count мин чтения|:count мин чтения|:count мин чтения", ":count post|:count posts": ":count пост|:count поста|:count постов", ":count template section|:count template sections": ":count раздел шаблона|:count раздела шаблона|:count разделов шаблона", @@ -219,6 +220,7 @@ "Browser Sessions": "Сеансы", "Buddhist": "Буддист", "Business": "Бизнес", + "Calendar": "Календарь", "Call reasons": "Причины звонков", "Call reasons let you indicate the reason of calls you make to your contacts.": "Причины звонков позволяют указать причину звонков, которые вы совершаете своим контактам.", "Calls": "Звонки", @@ -250,6 +252,7 @@ "Christmas": "Рождество", "City": "Город", "Click here to re-send the verification email.": "Нажмите здесь, чтобы повторно отправить электронное письмо для подтверждения.", + "Click on a day to see the details": "Нажмите на день, чтобы увидеть подробности", "Close": "Закрыть", "close edit mode": "закрыть режим редактирования", "Club": "Клуб", @@ -423,6 +426,7 @@ "Forgot your password? No problem. Just let us know your email address and we will email you a password reset link that will allow you to choose a new one.": "Забыли пароль? Нет проблем. Просто сообщите Ваш адрес электронной почты и мы пришлём Вам ссылку для сброса пароля.", "For your security, please confirm your password to continue.": "Для продолжения подтвердите пароль для Вашей безопасности.", "Found": "Найдено", + "Friday": "Пятница", "Friend": "Друг", "friend": "друг", "Gender": "Пол", @@ -590,6 +594,7 @@ "miles": "мили", "miles (mi)": "мили (ми)", "Modules in this page": "Модули на этой странице", + "Monday": "Понедельник", "Monica. All rights reserved. 2017 — :date.": "Monica. Все права защищены. 2017 — :date.", "Monica is open source, made by hundreds of people from all around the world.": "Monica - это проект с открытым исходным кодом, созданный сотнями людей со всего мира.", "Monica was made to help you document your life and your social interactions.": "Monica создана, чтобы помочь вам документировать свою жизнь и социальные взаимодействия.", @@ -707,6 +712,7 @@ "Postal code": "Почтовый индекс", "Post metrics": "Метрики поста", "Posts": "Посты", + "Posts in your journals": "Посты в ваших журналах", "Post templates": "Шаблоны поста", "Prefix": "Префикс", "Previous": "Предыдущий", @@ -776,6 +782,7 @@ "Role": "Роль", "Roles:": "Роли:", "Roomates": "Сожители", + "Saturday": "Суббота", "Save": "Сохранить", "Saved.": "Сохранено.", "Saving in progress": "Процесс сохранения", @@ -801,6 +808,7 @@ "Setup Telegram": "Настройка Telegram", "she\/her": "она\/ее", "Shintoist": "Синтоист", + "Show Calendar tab": "Показать вкладку календаря", "Show Companies tab": "Показать вкладку компаний", "Show completed tasks (:count)": "Показать выполненные задачи (:count)", "Show Files tab": "Показать вкладку файлов", @@ -832,6 +840,7 @@ "subordinate": "Подчиненный", "Suffix": "Суффикс", "Summary": "Сводка", + "Sunday": "Воскресенье", "Switch role": "Переключить роль", "Switch Teams": "Сменить команды", "Tabs visibility": "Видимость вкладок", @@ -967,6 +976,7 @@ "There are no calls logged yet.": "Еще нет зарегистрированных звонков.", "There are no contact information yet.": "Контактная информация еще не добавлена.", "There are no documents yet.": "Документов пока нет.", + "There are no events on that day, future or past.": "В этот день, будущий или прошлый, событий нет.", "There are no files yet.": "Файлов пока нет.", "There are no goals yet.": "Целей пока нет.", "There are no journal metrics.": "Метрик журнала пока нет.", @@ -1044,6 +1054,7 @@ "This user will be part of your account, but won’t get access to all the vaults in this account unless you give specific access to them. This person will be able to create vaults as well.": "Этот пользователь будет частью вашего аккаунта, но не получит доступа ко всем хранилищам в этом аккаунте, если вы не предоставите им конкретный доступ. Этот человек сможет также создавать хранилища.", "This will immediately:": "Это немедленно:", "Three things that happened today": "Три вещи, которые произошли сегодня", + "Thursday": "Четверг", "Timezone": "Часовой пояс", "Title": "Заголовок", "to": "по", @@ -1063,6 +1074,7 @@ "Total streaks": "Всего серий", "Track a new metric": "Отслеживать новую метрику", "Transportation": "Транспорт", + "Tuesday": "Вторник", "Two-factor Confirmation": "Двухфакторное подтверждение", "Two Factor Authentication": "Двухфакторная аутентификация", "Two factor authentication is now enabled. Scan the following QR code using your phone's authenticator application or enter the setup key.": "Двухфакторная аутентификация успешно активирована. Отсканируйте следующий QR-код при помощи приложения аутентификации на Вашем телефоне для проверки подлинности или введите ключ настройки.", @@ -1139,6 +1151,7 @@ "WebAuthn only supports secure connections. Please load this page with https scheme.": "WebAuthn поддерживает только безопасные соединения. Пожалуйста, загрузите эту страницу с помощью схемы https.", "We call them a relation, and its reverse relation. For each relation you define, you need to define its counterpart.": "Мы называем их отношением и обратным отношением. Для каждого отношения, которое вы определяете, вам нужно определить его аналог.", "Wedding": "Свадьба", + "Wednesday": "Среда", "We hope you will like what we’ve done.": "Мы надеемся, что вам понравится то, что мы сделали.", "Welcome to Monica.": "Добро пожаловать в Монику.", "Went to a bar": "Ходили в бар", @@ -1206,6 +1219,7 @@ "Your email address is unverified.": "Ваш адрес электронной почты не подтверждён.", "Your life events": "События в вашей жизни", "Your mood has been recorded!": "Ваше настроение записано!", + "Your mood that day": "Ваше настроение в этот день", "Your mood that you logged at this date": "Ваше настроение на эту дату", "Your mood this year": "Ваше настроение в этом году", "Your name here will be used to add yourself as a contact.": "Ваше имя будет использовано для добавления себя в контакты.", diff --git a/lang/ru/vault.php b/lang/ru/vault.php new file mode 100644 index 00000000000..3a8fc529724 --- /dev/null +++ b/lang/ru/vault.php @@ -0,0 +1,5 @@ + '', +]; diff --git a/package.json b/package.json index 018c7331206..5197d0b2b86 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,6 @@ "tailwindcss": "^3.0.24", "tiny-emitter": "^2.1.0", "uploadcare-vue": "^1.0.0", - "v-calendar": "^3.0.0-alpha.8", "vite": "^4.0.4", "vue": "^3.2.36", "vue-clipboard3": "^2.0.0", @@ -61,5 +60,8 @@ "vendor/bin/pint" ] }, - "packageManager": "yarn@3.5.0" + "packageManager": "yarn@3.5.0", + "dependencies": { + "v-calendar": "next" + } } diff --git a/phpstan.neon b/phpstan.neon index fb56b33220e..a284b1b10e1 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -10,6 +10,9 @@ parameters: inferPrivatePropertyTypeFromConstructor: true + excludePaths: + - */app/Domains/Vault/ManageCalendar/Web/ViewHelpers/VaultCalendarIndexViewHelper.php + level: 5 ignoreErrors: # Global ignore of VCard properties access diff --git a/public/img/calendar_day_blank.svg b/public/img/calendar_day_blank.svg new file mode 100644 index 00000000000..659fe484d8a --- /dev/null +++ b/public/img/calendar_day_blank.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/js/Pages/Vault/Calendar/Index.vue b/resources/js/Pages/Vault/Calendar/Index.vue new file mode 100644 index 00000000000..5409f20d33f --- /dev/null +++ b/resources/js/Pages/Vault/Calendar/Index.vue @@ -0,0 +1,269 @@ + + + + + diff --git a/resources/js/Pages/Vault/Settings/Partials/TabVisibility.vue b/resources/js/Pages/Vault/Settings/Partials/TabVisibility.vue index bcdac27d3fe..7bfed2123df 100644 --- a/resources/js/Pages/Vault/Settings/Partials/TabVisibility.vue +++ b/resources/js/Pages/Vault/Settings/Partials/TabVisibility.vue @@ -13,6 +13,7 @@ const form = useForm({ show_journal_tab: false, show_companies_tab: false, show_reports_tab: false, + show_calendar_tab: false, }); onMounted(() => { @@ -22,6 +23,7 @@ onMounted(() => { form.show_journal_tab = props.data.visibility.show_journal_tab; form.show_companies_tab = props.data.visibility.show_companies_tab; form.show_reports_tab = props.data.visibility.show_reports_tab; + form.show_calendar_tab = props.data.visibility.show_calendar_tab; }); const update = () => { @@ -56,6 +58,20 @@ const update = () => {