diff --git a/client/src/i18n/translations/ar.ts b/client/src/i18n/translations/ar.ts index 0558340..92d18ee 100644 --- a/client/src/i18n/translations/ar.ts +++ b/client/src/i18n/translations/ar.ts @@ -145,6 +145,33 @@ const ar: Record = { 'settings.timeFormat': 'تنسيق الوقت', 'settings.routeCalculation': 'حساب المسار', 'settings.blurBookingCodes': 'إخفاء رموز الحجز', + 'settings.notifications': 'الإشعارات', + 'settings.notifyTripInvite': 'دعوات الرحلات', + 'settings.notifyBookingChange': 'تغييرات الحجز', + 'settings.notifyTripReminder': 'تذكيرات الرحلات', + 'settings.notifyVacayInvite': 'دعوات دمج الإجازات', + 'settings.notifyPhotosShared': 'صور مشتركة (Immich)', + 'settings.notifyCollabMessage': 'رسائل الدردشة (Collab)', + 'settings.notifyPackingTagged': 'قائمة الأمتعة: التعيينات', + 'settings.notifyWebhook': 'إشعارات Webhook', + 'admin.smtp.title': 'البريد والإشعارات', + 'admin.smtp.hint': 'تكوين SMTP لإشعارات البريد الإلكتروني. اختياري: عنوان Webhook لـ Discord أو Slack وغيرها.', + 'admin.smtp.testButton': 'إرسال بريد تجريبي', + 'admin.smtp.testSuccess': 'تم إرسال البريد التجريبي بنجاح', + 'admin.smtp.testFailed': 'فشل إرسال البريد التجريبي', + 'dayplan.icsTooltip': 'تصدير التقويم (ICS)', + 'share.linkTitle': 'رابط عام', + 'share.linkHint': 'أنشئ رابطًا يمكن لأي شخص استخدامه لعرض هذه الرحلة بدون تسجيل الدخول. للقراءة فقط — لا يمكن التعديل.', + 'share.createLink': 'إنشاء رابط', + 'share.deleteLink': 'حذف الرابط', + 'share.createError': 'تعذر إنشاء الرابط', + 'common.copy': 'نسخ', + 'common.copied': 'تم النسخ', + 'share.permMap': 'الخريطة والخطة', + 'share.permBookings': 'الحجوزات', + 'share.permPacking': 'الأمتعة', + 'share.permBudget': 'الميزانية', + 'share.permCollab': 'الدردشة', 'settings.on': 'تشغيل', 'settings.off': 'إيقاف', 'settings.account': 'الحساب', @@ -381,8 +408,8 @@ const ar: Record = { // Addons 'admin.addons.title': 'الإضافات', 'admin.addons.subtitle': 'فعّل أو عطّل الميزات لتخصيص تجربة TREK.', - 'admin.addons.catalog.memories.name': 'صور (Immich)', - 'admin.addons.catalog.memories.description': 'شارك صور رحلتك عبر Immich', + 'admin.addons.catalog.memories.name': 'ذكريات', + 'admin.addons.catalog.memories.description': 'ألبومات صور مشتركة لكل رحلة', 'admin.addons.catalog.packing.name': 'التعبئة', 'admin.addons.catalog.packing.description': 'قوائم تحقق لإعداد أمتعتك لكل رحلة', 'admin.addons.catalog.budget.name': 'الميزانية', @@ -548,6 +575,10 @@ const ar: Record = { 'atlas.markVisited': 'تعيين كمُزار', 'atlas.markVisitedHint': 'إضافة هذا البلد إلى قائمة المُزارة', 'atlas.addToBucket': 'إضافة إلى قائمة الأمنيات', + 'atlas.addPoi': 'إضافة مكان', + 'atlas.bucketNamePlaceholder': 'الاسم (بلد، مدينة، مكان…)', + 'atlas.month': 'الشهر', + 'atlas.year': 'السنة', 'atlas.addToBucketHint': 'حفظ كمكان تريد زيارته', 'atlas.bucketWhen': 'متى تخطط للزيارة؟', 'atlas.statsTab': 'الإحصائيات', @@ -645,11 +676,14 @@ const ar: Record = { 'places.importGpx': 'استيراد GPX', 'places.gpxImported': 'تم استيراد {count} مكان من GPX', 'places.gpxError': 'فشل استيراد GPX', + 'places.urlResolved': 'تم استيراد المكان من الرابط', 'places.assignToDay': 'إلى أي يوم تريد الإضافة؟', 'places.all': 'الكل', 'places.unplanned': 'غير مخطط', 'places.search': 'ابحث عن أماكن...', 'places.allCategories': 'كل الفئات', + 'places.categoriesSelected': 'فئات', + 'places.clearFilter': 'مسح الفلتر', 'places.count': '{count} أماكن', 'places.countSingular': 'مكان واحد', 'places.allPlanned': 'تم تخطيط جميع الأماكن', @@ -1024,7 +1058,27 @@ const ar: Record = { 'backup.auto.enable': 'تفعيل النسخ التلقائي', 'backup.auto.enableHint': 'سيتم إنشاء نسخ احتياطية تلقائيًا وفق الجدول المختار', 'backup.auto.interval': 'الفترة', + 'backup.auto.hour': 'التنفيذ في الساعة', + 'backup.auto.hourHint': 'التوقيت المحلي للخادم (تنسيق {format})', + 'backup.auto.dayOfWeek': 'يوم الأسبوع', + 'backup.auto.dayOfMonth': 'يوم الشهر', + 'backup.auto.dayOfMonthHint': 'محدود بين 1–28 للتوافق مع جميع الأشهر', + 'backup.auto.scheduleSummary': 'الجدول', + 'backup.auto.summaryDaily': 'كل يوم الساعة {hour}:00', + 'backup.auto.summaryWeekly': 'كل {day} الساعة {hour}:00', + 'backup.auto.summaryMonthly': 'اليوم {day} من كل شهر الساعة {hour}:00', + 'backup.auto.envLocked': 'Docker', + 'backup.auto.envLockedHint': 'النسخ الاحتياطي التلقائي مُعدّ عبر متغيرات بيئة Docker. لتعديل الإعدادات، حدّث docker-compose.yml وأعد تشغيل الحاوية.', + 'backup.auto.copyEnv': 'نسخ متغيرات بيئة Docker', + 'backup.auto.envCopied': 'تم نسخ متغيرات بيئة Docker إلى الحافظة', 'backup.auto.keepLabel': 'حذف النسخ القديمة بعد', + 'backup.dow.sunday': 'أحد', + 'backup.dow.monday': 'إثن', + 'backup.dow.tuesday': 'ثلا', + 'backup.dow.wednesday': 'أرب', + 'backup.dow.thursday': 'خمي', + 'backup.dow.friday': 'جمع', + 'backup.dow.saturday': 'سبت', 'backup.interval.hourly': 'كل ساعة', 'backup.interval.daily': 'يوميًا', 'backup.interval.weekly': 'أسبوعيًا', diff --git a/client/src/i18n/translations/br.ts b/client/src/i18n/translations/br.ts index 969e8a0..d742375 100644 --- a/client/src/i18n/translations/br.ts +++ b/client/src/i18n/translations/br.ts @@ -139,6 +139,34 @@ const br: Record = { 'settings.temperature': 'Unidade de temperatura', 'settings.timeFormat': 'Formato de hora', 'settings.routeCalculation': 'Cálculo de rota', + 'settings.blurBookingCodes': 'Ocultar códigos de reserva', + 'settings.notifications': 'Notificações', + 'settings.notifyTripInvite': 'Convites de viagem', + 'settings.notifyBookingChange': 'Alterações de reserva', + 'settings.notifyTripReminder': 'Lembretes de viagem', + 'settings.notifyVacayInvite': 'Convites de fusão Vacay', + 'settings.notifyPhotosShared': 'Fotos compartilhadas (Immich)', + 'settings.notifyCollabMessage': 'Mensagens de chat (Colab)', + 'settings.notifyPackingTagged': 'Lista de mala: atribuições', + 'settings.notifyWebhook': 'Notificações webhook', + 'admin.smtp.title': 'E-mail e notificações', + 'admin.smtp.hint': 'Configuração SMTP para notificações por e-mail. Opcional: URL webhook para Discord, Slack, etc.', + 'admin.smtp.testButton': 'Enviar e-mail de teste', + 'admin.smtp.testSuccess': 'E-mail de teste enviado com sucesso', + 'admin.smtp.testFailed': 'Falha ao enviar e-mail de teste', + 'dayplan.icsTooltip': 'Exportar calendário (ICS)', + 'share.linkTitle': 'Link público', + 'share.linkHint': 'Crie um link que qualquer pessoa pode usar para ver esta viagem sem fazer login. Somente leitura — sem edição possível.', + 'share.createLink': 'Criar link', + 'share.deleteLink': 'Excluir link', + 'share.createError': 'Não foi possível criar o link', + 'common.copy': 'Copiar', + 'common.copied': 'Copiado', + 'share.permMap': 'Mapa e plano', + 'share.permBookings': 'Reservas', + 'share.permPacking': 'Mala', + 'share.permBudget': 'Orçamento', + 'share.permCollab': 'Chat', 'settings.on': 'Ligado', 'settings.off': 'Desligado', 'settings.account': 'Conta', @@ -542,6 +570,10 @@ const br: Record = { 'atlas.markVisited': 'Marcar como visitado', 'atlas.markVisitedHint': 'Adicionar este país à lista de visitados', 'atlas.addToBucket': 'Adicionar à lista de desejos', + 'atlas.addPoi': 'Adicionar lugar', + 'atlas.bucketNamePlaceholder': 'Nome (país, cidade, lugar…)', + 'atlas.month': 'Mês', + 'atlas.year': 'Ano', 'atlas.addToBucketHint': 'Salvar como lugar que você quer visitar', 'atlas.bucketWhen': 'Quando pretende visitar?', 'atlas.statsTab': 'Estatísticas', @@ -627,14 +659,26 @@ const br: Record = { 'dayplan.pdf': 'PDF', 'dayplan.pdfTooltip': 'Exportar plano do dia em PDF', 'dayplan.pdfError': 'Falha ao exportar PDF', + 'dayplan.cannotReorderTransport': 'Reservas com horário fixo não podem ser reordenadas', + 'dayplan.confirmRemoveTimeTitle': 'Remover horário?', + 'dayplan.confirmRemoveTimeBody': 'Este lugar tem um horário fixo ({time}). Movê-lo removerá o horário e permitirá ordenação livre.', + 'dayplan.confirmRemoveTimeAction': 'Remover horário e mover', + 'dayplan.cannotDropOnTimed': 'Itens não podem ser colocados entre entradas com horário fixo', + 'dayplan.cannotBreakChronology': 'Isso quebraria a ordem cronológica dos itens e reservas agendados', // Places Sidebar 'places.addPlace': 'Adicionar lugar/atividade', + 'places.importGpx': 'Importar GPX', + 'places.gpxImported': '{count} lugares importados do GPX', + 'places.gpxError': 'Falha ao importar GPX', + 'places.urlResolved': 'Lugar importado da URL', 'places.assignToDay': 'Adicionar a qual dia?', 'places.all': 'Todos', 'places.unplanned': 'Não planejados', 'places.search': 'Buscar lugares...', 'places.allCategories': 'Todas as categorias', + 'places.categoriesSelected': 'categorias', + 'places.clearFilter': 'Limpar filtro', 'places.count': '{count} lugares', 'places.countSingular': '1 lugar', 'places.allPlanned': 'Todos os lugares estão planejados', @@ -733,6 +777,8 @@ const br: Record = { 'reservations.type.tour': 'Passeio', 'reservations.type.other': 'Outro', 'reservations.confirm.delete': 'Tem certeza de que deseja excluir a reserva "{name}"?', + 'reservations.confirm.deleteTitle': 'Excluir reserva?', + 'reservations.confirm.deleteBody': '"{name}" será excluído permanentemente.', 'reservations.toast.updated': 'Reserva atualizada', 'reservations.toast.removed': 'Reserva excluída', 'reservations.toast.fileUploaded': 'Arquivo enviado', @@ -790,6 +836,9 @@ const br: Record = { 'budget.paid': 'Pago', 'budget.open': 'Em aberto', 'budget.noMembers': 'Nenhum membro atribuído', + 'budget.settlement': 'Acerto', + 'budget.settlementInfo': 'Clique no avatar de um membro em um item do orçamento para marcá-lo em verde — significa que ele pagou. O acerto mostra quem deve quanto a quem.', + 'budget.netBalances': 'Saldos líquidos', // Files 'files.title': 'Arquivos', @@ -843,6 +892,15 @@ const br: Record = { // Packing 'packing.title': 'Lista de mala', 'packing.empty': 'A lista de mala está vazia', + 'packing.import': 'Importar', + 'packing.importTitle': 'Importar lista de bagagem', + 'packing.importHint': 'Um item por linha. Formato: Categoria, Nome, Peso (g), Bolsa, checked/unchecked (opcional)', + 'packing.importPlaceholder': 'Higiene, Escova de dentes\nRoupas, Camisetas, 200\nDocumentos, Passaporte, , Mala de mão\nEletrônicos, Carregador, 50, Mala, checked', + 'packing.importCsv': 'Carregar CSV/TXT', + 'packing.importAction': 'Importar {count}', + 'packing.importSuccess': '{count} itens importados', + 'packing.importError': 'Falha na importação', + 'packing.importEmpty': 'Nenhum item para importar', 'packing.progress': '{packed} de {total} na mala ({percent}%)', 'packing.clearChecked': 'Remover {count} marcado(s)', 'packing.clearCheckedShort': 'Remover {count}', @@ -994,7 +1052,27 @@ const br: Record = { 'backup.auto.enable': 'Ativar backup automático', 'backup.auto.enableHint': 'Backups serão criados automaticamente conforme a agenda escolhida', 'backup.auto.interval': 'Intervalo', + 'backup.auto.hour': 'Executar no horário', + 'backup.auto.hourHint': 'Horário local do servidor (formato {format})', + 'backup.auto.dayOfWeek': 'Dia da semana', + 'backup.auto.dayOfMonth': 'Dia do mês', + 'backup.auto.dayOfMonthHint': 'Limitado a 1–28 para compatibilidade com todos os meses', + 'backup.auto.scheduleSummary': 'Agenda', + 'backup.auto.summaryDaily': 'Todos os dias às {hour}:00', + 'backup.auto.summaryWeekly': 'Toda {day} às {hour}:00', + 'backup.auto.summaryMonthly': 'Dia {day} de cada mês às {hour}:00', + 'backup.auto.envLocked': 'Docker', + 'backup.auto.envLockedHint': 'O backup automático é configurado via variáveis de ambiente Docker. Para alterar essas configurações, atualize o docker-compose.yml e reinicie o contêiner.', + 'backup.auto.copyEnv': 'Copiar variáveis de ambiente Docker', + 'backup.auto.envCopied': 'Variáveis de ambiente Docker copiadas para a área de transferência', 'backup.auto.keepLabel': 'Excluir backups antigos após', + 'backup.dow.sunday': 'Dom', + 'backup.dow.monday': 'Seg', + 'backup.dow.tuesday': 'Ter', + 'backup.dow.wednesday': 'Qua', + 'backup.dow.thursday': 'Qui', + 'backup.dow.friday': 'Sex', + 'backup.dow.saturday': 'Sáb', 'backup.interval.hourly': 'A cada hora', 'backup.interval.daily': 'Diário', 'backup.interval.weekly': 'Semanal', diff --git a/client/src/i18n/translations/es.ts b/client/src/i18n/translations/es.ts index da26dd3..f4758b9 100644 --- a/client/src/i18n/translations/es.ts +++ b/client/src/i18n/translations/es.ts @@ -141,6 +141,33 @@ const es: Record = { 'settings.timeFormat': 'Formato de hora', 'settings.routeCalculation': 'Cálculo de ruta', 'settings.blurBookingCodes': 'Difuminar códigos de reserva', + 'settings.notifications': 'Notificaciones', + 'settings.notifyTripInvite': 'Invitaciones de viaje', + 'settings.notifyBookingChange': 'Cambios en reservas', + 'settings.notifyTripReminder': 'Recordatorios de viaje', + 'settings.notifyVacayInvite': 'Invitaciones de fusión Vacay', + 'settings.notifyPhotosShared': 'Fotos compartidas (Immich)', + 'settings.notifyCollabMessage': 'Mensajes de chat (Collab)', + 'settings.notifyPackingTagged': 'Lista de equipaje: asignaciones', + 'settings.notifyWebhook': 'Notificaciones webhook', + 'admin.smtp.title': 'Correo y notificaciones', + 'admin.smtp.hint': 'Configuración SMTP para notificaciones por correo. Opcional: URL webhook para Discord, Slack, etc.', + 'admin.smtp.testButton': 'Enviar correo de prueba', + 'admin.smtp.testSuccess': 'Correo de prueba enviado correctamente', + 'admin.smtp.testFailed': 'Error al enviar correo de prueba', + 'dayplan.icsTooltip': 'Exportar calendario (ICS)', + 'share.linkTitle': 'Enlace público', + 'share.linkHint': 'Crea un enlace que cualquiera puede usar para ver este viaje sin iniciar sesión. Solo lectura — no se puede editar.', + 'share.createLink': 'Crear enlace', + 'share.deleteLink': 'Eliminar enlace', + 'share.createError': 'No se pudo crear el enlace', + 'common.copy': 'Copiar', + 'common.copied': 'Copiado', + 'share.permMap': 'Mapa y plan', + 'share.permBookings': 'Reservas', + 'share.permPacking': 'Equipaje', + 'share.permBudget': 'Presupuesto', + 'share.permCollab': 'Chat', 'settings.on': 'Activado', 'settings.off': 'Desactivado', 'settings.account': 'Cuenta', @@ -557,6 +584,10 @@ const es: Record = { 'atlas.markVisited': 'Marcar como visitado', 'atlas.markVisitedHint': 'Añadir este país a tu lista de visitados', 'atlas.addToBucket': 'Añadir a lista de deseos', + 'atlas.addPoi': 'Añadir lugar', + 'atlas.bucketNamePlaceholder': 'Nombre (país, ciudad, lugar…)', + 'atlas.month': 'Mes', + 'atlas.year': 'Año', 'atlas.addToBucketHint': 'Guardar como lugar que quieres visitar', 'atlas.bucketWhen': '¿Cuándo planeas visitarlo?', @@ -618,11 +649,14 @@ const es: Record = { 'places.importGpx': 'Importar GPX', 'places.gpxImported': '{count} lugares importados desde GPX', 'places.gpxError': 'Error al importar GPX', + 'places.urlResolved': 'Lugar importado desde URL', 'places.assignToDay': '¿A qué día añadirlo?', 'places.all': 'Todo', 'places.unplanned': 'Sin planificar', 'places.search': 'Buscar lugares...', 'places.allCategories': 'Todas las categorías', + 'places.categoriesSelected': 'categorías', + 'places.clearFilter': 'Borrar filtro', 'places.count': '{count} lugares', 'places.countSingular': '1 lugar', 'places.allPlanned': 'Todos los lugares están planificados', @@ -958,7 +992,27 @@ const es: Record = { 'backup.auto.enable': 'Activar copia automática', 'backup.auto.enableHint': 'Se crearán copias automáticamente según la frecuencia elegida', 'backup.auto.interval': 'Intervalo', + 'backup.auto.hour': 'Ejecutar a la hora', + 'backup.auto.hourHint': 'Hora local del servidor (formato {format})', + 'backup.auto.dayOfWeek': 'Día de la semana', + 'backup.auto.dayOfMonth': 'Día del mes', + 'backup.auto.dayOfMonthHint': 'Limitado a 1–28 para compatibilidad con todos los meses', + 'backup.auto.scheduleSummary': 'Programación', + 'backup.auto.summaryDaily': 'Todos los días a las {hour}:00', + 'backup.auto.summaryWeekly': 'Cada {day} a las {hour}:00', + 'backup.auto.summaryMonthly': 'El día {day} de cada mes a las {hour}:00', + 'backup.auto.envLocked': 'Docker', + 'backup.auto.envLockedHint': 'La copia automática está configurada mediante variables de entorno Docker. Para cambiar estos ajustes, actualiza tu docker-compose.yml y reinicia el contenedor.', + 'backup.auto.copyEnv': 'Copiar variables de entorno Docker', + 'backup.auto.envCopied': 'Variables de entorno Docker copiadas al portapapeles', 'backup.auto.keepLabel': 'Eliminar copias antiguas después de', + 'backup.dow.sunday': 'Dom', + 'backup.dow.monday': 'Lun', + 'backup.dow.tuesday': 'Mar', + 'backup.dow.wednesday': 'Mié', + 'backup.dow.thursday': 'Jue', + 'backup.dow.friday': 'Vie', + 'backup.dow.saturday': 'Sáb', 'backup.interval.hourly': 'Cada hora', 'backup.interval.daily': 'Diaria', 'backup.interval.weekly': 'Semanal', @@ -978,8 +1032,8 @@ const es: Record = { 'photos.linkPlace': 'Vincular lugar', 'photos.noPlace': 'Sin lugar', 'photos.uploadN': 'Subida de {n} foto(s)', - 'admin.addons.catalog.memories.name': 'Fotos (Immich)', - 'admin.addons.catalog.memories.description': 'Comparte fotos de viaje a través de tu instancia de Immich', + 'admin.addons.catalog.memories.name': 'Recuerdos', + 'admin.addons.catalog.memories.description': 'Álbumes de fotos compartidos para cada viaje', 'admin.addons.catalog.packing.name': 'Equipaje', 'admin.addons.catalog.packing.description': 'Prepara tu equipaje con listas de comprobación para cada viaje', 'admin.addons.catalog.budget.name': 'Presupuesto', diff --git a/client/src/i18n/translations/fr.ts b/client/src/i18n/translations/fr.ts index fe01d4d..0af501b 100644 --- a/client/src/i18n/translations/fr.ts +++ b/client/src/i18n/translations/fr.ts @@ -140,6 +140,33 @@ const fr: Record = { 'settings.timeFormat': 'Format de l\'heure', 'settings.routeCalculation': 'Calcul d\'itinéraire', 'settings.blurBookingCodes': 'Masquer les codes de réservation', + 'settings.notifications': 'Notifications', + 'settings.notifyTripInvite': 'Invitations de voyage', + 'settings.notifyBookingChange': 'Modifications de réservation', + 'settings.notifyTripReminder': 'Rappels de voyage', + 'settings.notifyVacayInvite': 'Invitations de fusion Vacay', + 'settings.notifyPhotosShared': 'Photos partagées (Immich)', + 'settings.notifyCollabMessage': 'Messages de chat (Collab)', + 'settings.notifyPackingTagged': 'Liste de bagages : attributions', + 'settings.notifyWebhook': 'Notifications webhook', + 'admin.smtp.title': 'E-mail et notifications', + 'admin.smtp.hint': 'Configuration SMTP pour les notifications par e-mail. Optionnel : URL webhook pour Discord, Slack, etc.', + 'admin.smtp.testButton': 'Envoyer un e-mail de test', + 'admin.smtp.testSuccess': 'E-mail de test envoyé avec succès', + 'admin.smtp.testFailed': 'Échec de l\'e-mail de test', + 'dayplan.icsTooltip': 'Exporter le calendrier (ICS)', + 'share.linkTitle': 'Lien public', + 'share.linkHint': 'Créez un lien que n\'importe qui peut utiliser pour consulter ce voyage sans se connecter. Lecture seule — aucune modification possible.', + 'share.createLink': 'Créer un lien', + 'share.deleteLink': 'Supprimer le lien', + 'share.createError': 'Impossible de créer le lien', + 'common.copy': 'Copier', + 'common.copied': 'Copié', + 'share.permMap': 'Carte et plan', + 'share.permBookings': 'Réservations', + 'share.permPacking': 'Bagages', + 'share.permBudget': 'Budget', + 'share.permCollab': 'Chat', 'settings.on': 'Activé', 'settings.off': 'Désactivé', 'settings.account': 'Compte', @@ -374,8 +401,8 @@ const fr: Record = { 'admin.tabs.addons': 'Extensions', 'admin.addons.title': 'Extensions', 'admin.addons.subtitle': 'Activez ou désactivez des fonctionnalités pour personnaliser votre expérience TREK.', - 'admin.addons.catalog.memories.name': 'Photos (Immich)', - 'admin.addons.catalog.memories.description': 'Partagez vos photos de voyage via votre instance Immich', + 'admin.addons.catalog.memories.name': 'Souvenirs', + 'admin.addons.catalog.memories.description': 'Albums photo partagés pour chaque voyage', 'admin.addons.catalog.packing.name': 'Bagages', 'admin.addons.catalog.packing.description': 'Listes de contrôle pour préparer vos bagages pour chaque voyage', 'admin.addons.catalog.budget.name': 'Budget', @@ -484,14 +511,6 @@ const fr: Record = { 'vacay.sun': 'Dim', 'vacay.blockWeekends': 'Bloquer les week-ends', 'vacay.blockWeekendsHint': 'Empêcher les entrées de vacances les samedis et dimanches', - 'vacay.weekendDays': 'Jours de week-end', - 'vacay.mon': 'Lun', - 'vacay.tue': 'Mar', - 'vacay.wed': 'Mer', - 'vacay.thu': 'Jeu', - 'vacay.fri': 'Ven', - 'vacay.sat': 'Sam', - 'vacay.sun': 'Dim', 'vacay.publicHolidays': 'Jours fériés', 'vacay.publicHolidaysHint': 'Marquer les jours fériés dans le calendrier', 'vacay.selectCountry': 'Sélectionner un pays', @@ -586,6 +605,10 @@ const fr: Record = { 'atlas.markVisited': 'Marquer comme visité', 'atlas.markVisitedHint': 'Ajouter ce pays à votre liste de visités', 'atlas.addToBucket': 'Ajouter à la bucket list', + 'atlas.addPoi': 'Ajouter un lieu', + 'atlas.bucketNamePlaceholder': 'Nom (pays, ville, lieu…)', + 'atlas.month': 'Mois', + 'atlas.year': 'Année', 'atlas.addToBucketHint': 'Sauvegarder comme lieu à visiter', 'atlas.bucketWhen': 'Quand prévoyez-vous d\'y aller ?', @@ -647,11 +670,14 @@ const fr: Record = { 'places.importGpx': 'Importer GPX', 'places.gpxImported': '{count} lieux importés depuis GPX', 'places.gpxError': 'L\'import GPX a échoué', + 'places.urlResolved': 'Lieu importé depuis l\'URL', 'places.assignToDay': 'Ajouter à quel jour ?', 'places.all': 'Tous', 'places.unplanned': 'Non planifiés', 'places.search': 'Rechercher des lieux…', 'places.allCategories': 'Toutes les catégories', + 'places.categoriesSelected': 'catégories', + 'places.clearFilter': 'Effacer le filtre', 'places.count': '{count} lieux', 'places.countSingular': '1 lieu', 'places.allPlanned': 'Tous les lieux sont planifiés', @@ -1025,7 +1051,27 @@ const fr: Record = { 'backup.auto.enable': 'Activer la sauvegarde automatique', 'backup.auto.enableHint': 'Les sauvegardes seront créées automatiquement selon le calendrier choisi', 'backup.auto.interval': 'Intervalle', + 'backup.auto.hour': 'Exécuter à l\'heure', + 'backup.auto.hourHint': 'Heure locale du serveur (format {format})', + 'backup.auto.dayOfWeek': 'Jour de la semaine', + 'backup.auto.dayOfMonth': 'Jour du mois', + 'backup.auto.dayOfMonthHint': 'Limité à 1–28 pour la compatibilité avec tous les mois', + 'backup.auto.scheduleSummary': 'Planification', + 'backup.auto.summaryDaily': 'Tous les jours à {hour}h00', + 'backup.auto.summaryWeekly': 'Chaque {day} à {hour}h00', + 'backup.auto.summaryMonthly': 'Le {day} de chaque mois à {hour}h00', + 'backup.auto.envLocked': 'Docker', + 'backup.auto.envLockedHint': 'La sauvegarde automatique est configurée via les variables d\'environnement Docker. Pour modifier ces paramètres, mettez à jour votre docker-compose.yml et redémarrez le conteneur.', + 'backup.auto.copyEnv': 'Copier les variables d\'env Docker', + 'backup.auto.envCopied': 'Variables d\'env Docker copiées dans le presse-papiers', 'backup.auto.keepLabel': 'Supprimer les anciennes sauvegardes après', + 'backup.dow.sunday': 'Dim', + 'backup.dow.monday': 'Lun', + 'backup.dow.tuesday': 'Mar', + 'backup.dow.wednesday': 'Mer', + 'backup.dow.thursday': 'Jeu', + 'backup.dow.friday': 'Ven', + 'backup.dow.saturday': 'Sam', 'backup.interval.hourly': 'Toutes les heures', 'backup.interval.daily': 'Quotidien', 'backup.interval.weekly': 'Hebdomadaire', diff --git a/client/src/i18n/translations/nl.ts b/client/src/i18n/translations/nl.ts index fcf33b1..e4d7efe 100644 --- a/client/src/i18n/translations/nl.ts +++ b/client/src/i18n/translations/nl.ts @@ -140,6 +140,33 @@ const nl: Record = { 'settings.timeFormat': 'Tijdnotatie', 'settings.routeCalculation': 'Routeberekening', 'settings.blurBookingCodes': 'Boekingscodes vervagen', + 'settings.notifications': 'Meldingen', + 'settings.notifyTripInvite': 'Reisuitnodigingen', + 'settings.notifyBookingChange': 'Boekingswijzigingen', + 'settings.notifyTripReminder': 'Reisherinneringen', + 'settings.notifyVacayInvite': 'Vacay-fusieuitnodigingen', + 'settings.notifyPhotosShared': 'Gedeelde foto\'s (Immich)', + 'settings.notifyCollabMessage': 'Chatberichten (Collab)', + 'settings.notifyPackingTagged': 'Paklijst: toewijzingen', + 'settings.notifyWebhook': 'Webhook-meldingen', + 'admin.smtp.title': 'E-mail en meldingen', + 'admin.smtp.hint': 'SMTP-configuratie voor e-mailmeldingen. Optioneel: Webhook-URL voor Discord, Slack, etc.', + 'admin.smtp.testButton': 'Test-e-mail verzenden', + 'admin.smtp.testSuccess': 'Test-e-mail succesvol verzonden', + 'admin.smtp.testFailed': 'Test-e-mail mislukt', + 'dayplan.icsTooltip': 'Kalender exporteren (ICS)', + 'share.linkTitle': 'Openbare link', + 'share.linkHint': 'Maak een link die iedereen kan gebruiken om deze reis te bekijken zonder in te loggen. Alleen-lezen — bewerken niet mogelijk.', + 'share.createLink': 'Link aanmaken', + 'share.deleteLink': 'Link verwijderen', + 'share.createError': 'Kon link niet aanmaken', + 'common.copy': 'Kopiëren', + 'common.copied': 'Gekopieerd', + 'share.permMap': 'Kaart en plan', + 'share.permBookings': 'Boekingen', + 'share.permPacking': 'Paklijst', + 'share.permBudget': 'Budget', + 'share.permCollab': 'Chat', 'settings.on': 'Aan', 'settings.off': 'Uit', 'settings.account': 'Account', @@ -374,8 +401,8 @@ const nl: Record = { 'admin.tabs.addons': 'Add-ons', 'admin.addons.title': 'Add-ons', 'admin.addons.subtitle': 'Schakel functies in of uit om je TREK-ervaring aan te passen.', - 'admin.addons.catalog.memories.name': 'Foto\'s (Immich)', - 'admin.addons.catalog.memories.description': 'Deel reisfoto\'s via je Immich-instantie', + 'admin.addons.catalog.memories.name': 'Herinneringen', + 'admin.addons.catalog.memories.description': 'Gedeelde fotoalbums voor elke reis', 'admin.addons.catalog.packing.name': 'Inpakken', 'admin.addons.catalog.packing.description': 'Checklists om je bagage voor elke reis voor te bereiden', 'admin.addons.catalog.budget.name': 'Budget', @@ -578,6 +605,10 @@ const nl: Record = { 'atlas.markVisited': 'Markeren als bezocht', 'atlas.markVisitedHint': 'Dit land toevoegen aan je bezochte lijst', 'atlas.addToBucket': 'Aan bucket list toevoegen', + 'atlas.addPoi': 'Plaats toevoegen', + 'atlas.bucketNamePlaceholder': 'Naam (land, stad, plek…)', + 'atlas.month': 'Maand', + 'atlas.year': 'Jaar', 'atlas.addToBucketHint': 'Opslaan als plek die je wilt bezoeken', 'atlas.bucketWhen': 'Wanneer ben je van plan te gaan?', @@ -639,11 +670,14 @@ const nl: Record = { 'places.importGpx': 'GPX importeren', 'places.gpxImported': '{count} plaatsen geïmporteerd uit GPX', 'places.gpxError': 'GPX-import mislukt', + 'places.urlResolved': 'Plaats geïmporteerd van URL', 'places.assignToDay': 'Aan welke dag toevoegen?', 'places.all': 'Alle', 'places.unplanned': 'Ongepland', 'places.search': 'Plaatsen zoeken...', 'places.allCategories': 'Alle categorieën', + 'places.categoriesSelected': 'categorieën', + 'places.clearFilter': 'Filter wissen', 'places.count': '{count} plaatsen', 'places.countSingular': '1 plaats', 'places.allPlanned': 'Alle plaatsen zijn gepland', @@ -1017,7 +1051,27 @@ const nl: Record = { 'backup.auto.enable': 'Auto-back-up inschakelen', 'backup.auto.enableHint': 'Back-ups worden automatisch aangemaakt volgens het gekozen schema', 'backup.auto.interval': 'Interval', + 'backup.auto.hour': 'Uitvoeren om', + 'backup.auto.hourHint': 'Lokale servertijd ({format}-notatie)', + 'backup.auto.dayOfWeek': 'Dag van de week', + 'backup.auto.dayOfMonth': 'Dag van de maand', + 'backup.auto.dayOfMonthHint': 'Beperkt tot 1–28 voor compatibiliteit met alle maanden', + 'backup.auto.scheduleSummary': 'Planning', + 'backup.auto.summaryDaily': 'Elke dag om {hour}:00', + 'backup.auto.summaryWeekly': 'Elke {day} om {hour}:00', + 'backup.auto.summaryMonthly': 'Dag {day} van elke maand om {hour}:00', + 'backup.auto.envLocked': 'Docker', + 'backup.auto.envLockedHint': 'Auto-back-up is geconfigureerd via Docker-omgevingsvariabelen. Pas je docker-compose.yml aan en herstart de container om deze instellingen te wijzigen.', + 'backup.auto.copyEnv': 'Docker-omgevingsvariabelen kopiëren', + 'backup.auto.envCopied': 'Docker-omgevingsvariabelen gekopieerd naar klembord', 'backup.auto.keepLabel': 'Oude back-ups verwijderen na', + 'backup.dow.sunday': 'Zo', + 'backup.dow.monday': 'Ma', + 'backup.dow.tuesday': 'Di', + 'backup.dow.wednesday': 'Wo', + 'backup.dow.thursday': 'Do', + 'backup.dow.friday': 'Vr', + 'backup.dow.saturday': 'Za', 'backup.interval.hourly': 'Elk uur', 'backup.interval.daily': 'Dagelijks', 'backup.interval.weekly': 'Wekelijks', diff --git a/client/src/i18n/translations/ru.ts b/client/src/i18n/translations/ru.ts index 97bed29..ace3bda 100644 --- a/client/src/i18n/translations/ru.ts +++ b/client/src/i18n/translations/ru.ts @@ -140,6 +140,33 @@ const ru: Record = { 'settings.timeFormat': 'Формат времени', 'settings.routeCalculation': 'Расчёт маршрута', 'settings.blurBookingCodes': 'Скрыть коды бронирования', + 'settings.notifications': 'Уведомления', + 'settings.notifyTripInvite': 'Приглашения в поездку', + 'settings.notifyBookingChange': 'Изменения бронирований', + 'settings.notifyTripReminder': 'Напоминания о поездке', + 'settings.notifyVacayInvite': 'Приглашения слияния Vacay', + 'settings.notifyPhotosShared': 'Общие фото (Immich)', + 'settings.notifyCollabMessage': 'Сообщения чата (Collab)', + 'settings.notifyPackingTagged': 'Список вещей: назначения', + 'settings.notifyWebhook': 'Webhook-уведомления', + 'admin.smtp.title': 'Почта и уведомления', + 'admin.smtp.hint': 'Настройка SMTP для уведомлений по почте. Необязательно: Webhook URL для Discord, Slack и т.д.', + 'admin.smtp.testButton': 'Отправить тестовое письмо', + 'admin.smtp.testSuccess': 'Тестовое письмо успешно отправлено', + 'admin.smtp.testFailed': 'Ошибка отправки тестового письма', + 'dayplan.icsTooltip': 'Экспорт календаря (ICS)', + 'share.linkTitle': 'Публичная ссылка', + 'share.linkHint': 'Создайте ссылку, по которой любой сможет просмотреть эту поездку без входа в систему. Только чтение — редактирование невозможно.', + 'share.createLink': 'Создать ссылку', + 'share.deleteLink': 'Удалить ссылку', + 'share.createError': 'Не удалось создать ссылку', + 'common.copy': 'Копировать', + 'common.copied': 'Скопировано', + 'share.permMap': 'Карта и план', + 'share.permBookings': 'Бронирования', + 'share.permPacking': 'Вещи', + 'share.permBudget': 'Бюджет', + 'share.permCollab': 'Чат', 'settings.on': 'Вкл.', 'settings.off': 'Выкл.', 'settings.account': 'Аккаунт', @@ -374,8 +401,8 @@ const ru: Record = { 'admin.tabs.addons': 'Дополнения', 'admin.addons.title': 'Дополнения', 'admin.addons.subtitle': 'Включайте или отключайте функции для настройки TREK под себя.', - 'admin.addons.catalog.memories.name': 'Фото (Immich)', - 'admin.addons.catalog.memories.description': 'Делитесь фотографиями из поездок через Immich', + 'admin.addons.catalog.memories.name': 'Воспоминания', + 'admin.addons.catalog.memories.description': 'Общие фотоальбомы для каждой поездки', 'admin.addons.catalog.packing.name': 'Сборы', 'admin.addons.catalog.packing.description': 'Чек-листы для подготовки багажа к каждой поездке', 'admin.addons.catalog.budget.name': 'Бюджет', @@ -578,6 +605,10 @@ const ru: Record = { 'atlas.markVisited': 'Отметить как посещённую', 'atlas.markVisitedHint': 'Добавить эту страну в список посещённых', 'atlas.addToBucket': 'В список желаний', + 'atlas.addPoi': 'Добавить место', + 'atlas.bucketNamePlaceholder': 'Название (страна, город, место…)', + 'atlas.month': 'Месяц', + 'atlas.year': 'Год', 'atlas.addToBucketHint': 'Сохранить как место для посещения', 'atlas.bucketWhen': 'Когда вы планируете поехать?', @@ -639,11 +670,14 @@ const ru: Record = { 'places.importGpx': 'Импорт GPX', 'places.gpxImported': '{count} мест импортировано из GPX', 'places.gpxError': 'Ошибка импорта GPX', + 'places.urlResolved': 'Место импортировано из URL', 'places.assignToDay': 'Добавить в какой день?', 'places.all': 'Все', 'places.unplanned': 'Незапланированные', 'places.search': 'Поиск мест...', 'places.allCategories': 'Все категории', + 'places.categoriesSelected': 'категорий', + 'places.clearFilter': 'Сбросить фильтр', 'places.count': '{count} мест', 'places.countSingular': '1 место', 'places.allPlanned': 'Все места запланированы', @@ -1017,7 +1051,27 @@ const ru: Record = { 'backup.auto.enable': 'Включить автокопирование', 'backup.auto.enableHint': 'Резервные копии будут создаваться автоматически по выбранному расписанию', 'backup.auto.interval': 'Интервал', + 'backup.auto.hour': 'Запуск в час', + 'backup.auto.hourHint': 'Местное время сервера (формат {format})', + 'backup.auto.dayOfWeek': 'День недели', + 'backup.auto.dayOfMonth': 'День месяца', + 'backup.auto.dayOfMonthHint': 'Ограничено 1–28 для совместимости со всеми месяцами', + 'backup.auto.scheduleSummary': 'Расписание', + 'backup.auto.summaryDaily': 'Каждый день в {hour}:00', + 'backup.auto.summaryWeekly': 'Каждый {day} в {hour}:00', + 'backup.auto.summaryMonthly': '{day}-го числа каждого месяца в {hour}:00', + 'backup.auto.envLocked': 'Docker', + 'backup.auto.envLockedHint': 'Автокопирование настроено через переменные окружения Docker. Чтобы изменить параметры, обновите docker-compose.yml и перезапустите контейнер.', + 'backup.auto.copyEnv': 'Скопировать переменные окружения Docker', + 'backup.auto.envCopied': 'Переменные окружения Docker скопированы в буфер обмена', 'backup.auto.keepLabel': 'Удалять старые копии через', + 'backup.dow.sunday': 'Вс', + 'backup.dow.monday': 'Пн', + 'backup.dow.tuesday': 'Вт', + 'backup.dow.wednesday': 'Ср', + 'backup.dow.thursday': 'Чт', + 'backup.dow.friday': 'Пт', + 'backup.dow.saturday': 'Сб', 'backup.interval.hourly': 'Каждый час', 'backup.interval.daily': 'Ежедневно', 'backup.interval.weekly': 'Еженедельно', diff --git a/client/src/i18n/translations/zh.ts b/client/src/i18n/translations/zh.ts index 03f9c38..f822e53 100644 --- a/client/src/i18n/translations/zh.ts +++ b/client/src/i18n/translations/zh.ts @@ -140,6 +140,33 @@ const zh: Record = { 'settings.timeFormat': '时间格式', 'settings.routeCalculation': '路线计算', 'settings.blurBookingCodes': '模糊预订代码', + 'settings.notifications': '通知', + 'settings.notifyTripInvite': '旅行邀请', + 'settings.notifyBookingChange': '预订变更', + 'settings.notifyTripReminder': '旅行提醒', + 'settings.notifyVacayInvite': 'Vacay 融合邀请', + 'settings.notifyPhotosShared': '共享照片 (Immich)', + 'settings.notifyCollabMessage': '聊天消息 (Collab)', + 'settings.notifyPackingTagged': '行李清单:分配', + 'settings.notifyWebhook': 'Webhook 通知', + 'admin.smtp.title': '邮件与通知', + 'admin.smtp.hint': '用于邮件通知的 SMTP 配置。可选:Discord、Slack 等的 Webhook URL。', + 'admin.smtp.testButton': '发送测试邮件', + 'admin.smtp.testSuccess': '测试邮件发送成功', + 'admin.smtp.testFailed': '测试邮件发送失败', + 'dayplan.icsTooltip': '导出日历 (ICS)', + 'share.linkTitle': '公开链接', + 'share.linkHint': '创建一个链接,任何人无需登录即可查看此旅行。仅可查看,无法编辑。', + 'share.createLink': '创建链接', + 'share.deleteLink': '删除链接', + 'share.createError': '无法创建链接', + 'common.copy': '复制', + 'common.copied': '已复制', + 'share.permMap': '地图与计划', + 'share.permBookings': '预订', + 'share.permPacking': '行李', + 'share.permBudget': '预算', + 'share.permCollab': '聊天', 'settings.on': '开', 'settings.off': '关', 'settings.account': '账户', @@ -374,8 +401,8 @@ const zh: Record = { 'admin.tabs.addons': '扩展', 'admin.addons.title': '扩展', 'admin.addons.subtitle': '启用或禁用功能以自定义你的 TREK 体验。', - 'admin.addons.catalog.memories.name': '照片 (Immich)', - 'admin.addons.catalog.memories.description': '通过 Immich 实例分享旅行照片', + 'admin.addons.catalog.memories.name': '回忆', + 'admin.addons.catalog.memories.description': '每次旅行的共享相册', 'admin.addons.catalog.packing.name': '行李', 'admin.addons.catalog.packing.description': '每次旅行的行李准备清单', 'admin.addons.catalog.budget.name': '预算', @@ -578,6 +605,10 @@ const zh: Record = { 'atlas.markVisited': '标记为已访问', 'atlas.markVisitedHint': '将此国家添加到已访问列表', 'atlas.addToBucket': '添加到心愿单', + 'atlas.addPoi': '添加地点', + 'atlas.bucketNamePlaceholder': '名称(国家、城市、地点…)', + 'atlas.month': '月份', + 'atlas.year': '年份', 'atlas.addToBucketHint': '保存为想去的地方', 'atlas.bucketWhen': '你计划什么时候去?', @@ -639,11 +670,14 @@ const zh: Record = { 'places.importGpx': '导入 GPX', 'places.gpxImported': '已从 GPX 导入 {count} 个地点', 'places.gpxError': 'GPX 导入失败', + 'places.urlResolved': '已从 URL 导入地点', 'places.assignToDay': '添加到哪一天?', 'places.all': '全部', 'places.unplanned': '未规划', 'places.search': '搜索地点...', 'places.allCategories': '所有分类', + 'places.categoriesSelected': '个分类', + 'places.clearFilter': '清除筛选', 'places.count': '{count} 个地点', 'places.countSingular': '1 个地点', 'places.allPlanned': '所有地点已规划', @@ -1017,7 +1051,27 @@ const zh: Record = { 'backup.auto.enable': '启用自动备份', 'backup.auto.enableHint': '将按所选计划自动创建备份', 'backup.auto.interval': '间隔', + 'backup.auto.hour': '执行时间', + 'backup.auto.hourHint': '服务器本地时间({format} 格式)', + 'backup.auto.dayOfWeek': '星期几', + 'backup.auto.dayOfMonth': '每月几号', + 'backup.auto.dayOfMonthHint': '限 1–28 以兼容所有月份', + 'backup.auto.scheduleSummary': '计划', + 'backup.auto.summaryDaily': '每天 {hour}:00', + 'backup.auto.summaryWeekly': '每{day} {hour}:00', + 'backup.auto.summaryMonthly': '每月 {day} 号 {hour}:00', + 'backup.auto.envLocked': 'Docker', + 'backup.auto.envLockedHint': '自动备份通过 Docker 环境变量配置。要更改设置,请更新 docker-compose.yml 并重启容器。', + 'backup.auto.copyEnv': '复制 Docker 环境变量', + 'backup.auto.envCopied': 'Docker 环境变量已复制到剪贴板', 'backup.auto.keepLabel': '自动删除旧备份', + 'backup.dow.sunday': '周日', + 'backup.dow.monday': '周一', + 'backup.dow.tuesday': '周二', + 'backup.dow.wednesday': '周三', + 'backup.dow.thursday': '周四', + 'backup.dow.friday': '周五', + 'backup.dow.saturday': '周六', 'backup.interval.hourly': '每小时', 'backup.interval.daily': '每天', 'backup.interval.weekly': '每周',