From 6a36efbf1a9bdee9918661608eacd1094a6c930b Mon Sep 17 00:00:00 2001 From: jubnl Date: Sun, 5 Apr 2026 04:33:24 +0200 Subject: [PATCH] feat(i18n): translate missing keys across all 12 language files --- client/src/i18n/translations/ar.ts | 108 ++++++++++++++-------------- client/src/i18n/translations/br.ts | 108 ++++++++++++++-------------- client/src/i18n/translations/cs.ts | 108 ++++++++++++++-------------- client/src/i18n/translations/de.ts | 26 +++---- client/src/i18n/translations/es.ts | 108 ++++++++++++++-------------- client/src/i18n/translations/fr.ts | 102 +++++++++++++------------- client/src/i18n/translations/hu.ts | 108 ++++++++++++++-------------- client/src/i18n/translations/it.ts | 108 ++++++++++++++-------------- client/src/i18n/translations/nl.ts | 110 ++++++++++++++-------------- client/src/i18n/translations/pl.ts | 112 ++++++++++++++--------------- client/src/i18n/translations/ru.ts | 108 ++++++++++++++-------------- client/src/i18n/translations/zh.ts | 108 ++++++++++++++-------------- 12 files changed, 607 insertions(+), 607 deletions(-) diff --git a/client/src/i18n/translations/ar.ts b/client/src/i18n/translations/ar.ts index 4a251a5..bb65525 100644 --- a/client/src/i18n/translations/ar.ts +++ b/client/src/i18n/translations/ar.ts @@ -513,8 +513,8 @@ const ar: Record = { 'admin.addons.catalog.memories.description': 'شارك صور رحلتك عبر Immich', 'admin.addons.catalog.mcp.name': 'MCP', 'admin.addons.catalog.mcp.description': 'بروتوكول سياق النموذج لتكامل مساعد الذكاء الاصطناعي', - 'admin.addons.catalog.packing.name': 'Lists', - 'admin.addons.catalog.packing.description': 'Packing lists and to-do tasks for your trips', + 'admin.addons.catalog.packing.name': 'القوائم', + 'admin.addons.catalog.packing.description': 'قوائم التعبئة والمهام لرحلاتك', 'admin.addons.catalog.budget.name': 'الميزانية', 'admin.addons.catalog.budget.description': 'تتبع النفقات وخطط ميزانية الرحلة', 'admin.addons.catalog.documents.name': 'المستندات', @@ -743,8 +743,8 @@ const ar: Record = { 'trip.tabs.reservationsShort': 'حجز', 'trip.tabs.packing': 'قائمة التجهيز', 'trip.tabs.packingShort': 'تجهيز', - 'trip.tabs.lists': 'Lists', - 'trip.tabs.listsShort': 'Lists', + 'trip.tabs.lists': 'القوائم', + 'trip.tabs.listsShort': 'القوائم', 'trip.tabs.budget': 'الميزانية', 'trip.tabs.files': 'الملفات', 'trip.loading': 'جارٍ تحميل الرحلة...', @@ -940,11 +940,11 @@ const ar: Record = { 'reservations.linkAssignment': 'ربط بخطة اليوم', 'reservations.pickAssignment': 'اختر عنصرًا من خطتك...', 'reservations.noAssignment': 'بلا ربط', - 'reservations.price': 'Price', - 'reservations.budgetCategory': 'Budget category', - 'reservations.budgetCategoryPlaceholder': 'e.g. Transport, Accommodation', - 'reservations.budgetCategoryAuto': 'Auto (from booking type)', - 'reservations.budgetHint': 'A budget entry will be created automatically when saving.', + 'reservations.price': 'السعر', + 'reservations.budgetCategory': 'فئة الميزانية', + 'reservations.budgetCategoryPlaceholder': 'مثال: المواصلات، الإقامة', + 'reservations.budgetCategoryAuto': 'تلقائي (حسب نوع الحجز)', + 'reservations.budgetHint': 'سيتم إنشاء إدخال في الميزانية تلقائيًا عند الحفظ.', 'reservations.departureDate': 'المغادرة', 'reservations.arrivalDate': 'الوصول', 'reservations.departureTime': 'وقت المغادرة', @@ -1576,42 +1576,42 @@ const ar: Record = { 'notifications.test.tripText': 'إشعار تجريبي للرحلة "{trip}".', // Todo - 'todo.subtab.packing': 'Packing List', - 'todo.subtab.todo': 'To-Do', - 'todo.completed': 'completed', - 'todo.filter.all': 'All', - 'todo.filter.open': 'Open', - 'todo.filter.done': 'Done', - 'todo.uncategorized': 'Uncategorized', - 'todo.namePlaceholder': 'Task name', - 'todo.descriptionPlaceholder': 'Description (optional)', - 'todo.unassigned': 'Unassigned', - 'todo.noCategory': 'No category', - 'todo.hasDescription': 'Has description', - 'todo.addItem': 'Add new task...', - 'todo.newCategory': 'Category name', - 'todo.addCategory': 'Add category', - 'todo.newItem': 'New task', - 'todo.empty': 'No tasks yet. Add a task to get started!', - 'todo.filter.my': 'My Tasks', - 'todo.filter.overdue': 'Overdue', - 'todo.sidebar.tasks': 'Tasks', - 'todo.sidebar.categories': 'Categories', - 'todo.detail.title': 'Task', - 'todo.detail.description': 'Description', - 'todo.detail.category': 'Category', - 'todo.detail.dueDate': 'Due date', - 'todo.detail.assignedTo': 'Assigned to', - 'todo.detail.delete': 'Delete', - 'todo.detail.save': 'Save changes', - 'todo.detail.create': 'Create task', - 'todo.detail.priority': 'Priority', - 'todo.detail.noPriority': 'None', - 'todo.sortByPrio': 'Priority', + 'todo.subtab.packing': 'قائمة الأمتعة', + 'todo.subtab.todo': 'المهام', + 'todo.completed': 'مكتمل', + 'todo.filter.all': 'الكل', + 'todo.filter.open': 'مفتوح', + 'todo.filter.done': 'منجز', + 'todo.uncategorized': 'بدون تصنيف', + 'todo.namePlaceholder': 'اسم المهمة', + 'todo.descriptionPlaceholder': 'وصف (اختياري)', + 'todo.unassigned': 'غير مُسنَد', + 'todo.noCategory': 'بدون فئة', + 'todo.hasDescription': 'له وصف', + 'todo.addItem': 'إضافة مهمة جديدة...', + 'todo.newCategory': 'اسم الفئة', + 'todo.addCategory': 'إضافة فئة', + 'todo.newItem': 'مهمة جديدة', + 'todo.empty': 'لا توجد مهام بعد. أضف مهمة للبدء!', + 'todo.filter.my': 'مهامي', + 'todo.filter.overdue': 'متأخرة', + 'todo.sidebar.tasks': 'المهام', + 'todo.sidebar.categories': 'الفئات', + 'todo.detail.title': 'مهمة', + 'todo.detail.description': 'وصف', + 'todo.detail.category': 'فئة', + 'todo.detail.dueDate': 'تاريخ الاستحقاق', + 'todo.detail.assignedTo': 'مسند إلى', + 'todo.detail.delete': 'حذف', + 'todo.detail.save': 'حفظ التغييرات', + 'todo.detail.create': 'إنشاء مهمة', + 'todo.detail.priority': 'الأولوية', + 'todo.detail.noPriority': 'لا شيء', + 'todo.sortByPrio': 'الأولوية', // Notification system (added from feat/notification-system) - 'settings.notifyVersionAvailable': 'New version available', - 'settings.notificationPreferences.noChannels': 'No notification channels are configured. Ask an admin to set up email or webhook notifications.', + 'settings.notifyVersionAvailable': 'إصدار جديد متاح', + 'settings.notificationPreferences.noChannels': 'لم يتم تكوين قنوات إشعارات. اطلب من المسؤول إعداد إشعارات البريد الإلكتروني أو webhook.', 'settings.webhookUrl.label': 'رابط Webhook', 'settings.webhookUrl.placeholder': 'https://discord.com/api/webhooks/...', 'settings.webhookUrl.hint': 'أدخل رابط Webhook الخاص بـ Discord أو Slack أو المخصص لتلقي الإشعارات.', @@ -1626,7 +1626,7 @@ const ar: Record = { 'admin.notifications.emailPanel.title': 'Email (SMTP)', 'admin.notifications.webhookPanel.title': 'Webhook', 'admin.notifications.inappPanel.title': 'In-App', - 'admin.notifications.inappPanel.hint': 'In-app notifications are always active and cannot be disabled globally.', + 'admin.notifications.inappPanel.hint': 'الإشعارات داخل التطبيق نشطة دائمًا ولا يمكن تعطيلها بشكل عام.', 'admin.notifications.adminWebhookPanel.title': 'Webhook المسؤول', 'admin.notifications.adminWebhookPanel.hint': 'يُستخدم هذا الـ Webhook حصريًا لإشعارات المسؤول (مثل تنبيهات الإصدارات). وهو مستقل عن Webhooks المستخدمين ويُرسل تلقائيًا عند تعيين رابط URL.', 'admin.notifications.adminWebhookPanel.saved': 'تم حفظ رابط Webhook المسؤول', @@ -1634,16 +1634,16 @@ const ar: Record = { 'admin.notifications.adminWebhookPanel.testFailed': 'فشل إرسال Webhook الاختباري', 'admin.notifications.adminWebhookPanel.alwaysOnHint': 'يُرسل Webhook المسؤول تلقائيًا عند تعيين رابط URL', 'admin.notifications.adminNotificationsHint': 'حدد القنوات التي تُسلّم إشعارات المسؤول (مثل تنبيهات الإصدارات). يُرسل الـ Webhook تلقائيًا عند تعيين رابط URL لـ Webhook المسؤول.', - 'admin.tabs.notifications': 'Notifications', + 'admin.tabs.notifications': 'الإشعارات', 'admin.tabs.notificationChannels': 'قنوات الإشعارات', 'admin.tabs.adminNotifications': 'إشعارات المسؤول', - 'notifications.versionAvailable.title': 'Update Available', - 'notifications.versionAvailable.text': 'TREK {version} is now available.', - 'notifications.versionAvailable.button': 'View Details', - 'notif.test.title': '[Test] Notification', - 'notif.test.simple.text': 'This is a simple test notification.', - 'notif.test.boolean.text': 'Do you accept this test notification?', - 'notif.test.navigate.text': 'Click below to navigate to the dashboard.', + 'notifications.versionAvailable.title': 'تحديث متاح', + 'notifications.versionAvailable.text': 'TREK {version} متاح الآن.', + 'notifications.versionAvailable.button': 'عرض التفاصيل', + 'notif.test.title': '[اختبار] إشعار', + 'notif.test.simple.text': 'هذا إشعار اختبار بسيط.', + 'notif.test.boolean.text': 'هل تقبل هذا الإشعار الاختباري؟', + 'notif.test.navigate.text': 'انقر أدناه للانتقال إلى لوحة التحكم.', // Notifications 'notif.trip_invite.title': 'دعوة للرحلة', @@ -1673,8 +1673,8 @@ const ar: Record = { 'notif.action.decline': 'رفض', 'notif.generic.title': 'إشعار', 'notif.generic.text': 'لديك إشعار جديد', - 'notif.dev.unknown_event.title': '[DEV] Unknown Event', - 'notif.dev.unknown_event.text': 'Event type "{event}" is not registered in EVENT_NOTIFICATION_CONFIG', + 'notif.dev.unknown_event.title': '[DEV] حدث غير معروف', + 'notif.dev.unknown_event.text': 'نوع الحدث "{event}" غير مسجل في EVENT_NOTIFICATION_CONFIG', } export default ar diff --git a/client/src/i18n/translations/br.ts b/client/src/i18n/translations/br.ts index 5325f4a..7123387 100644 --- a/client/src/i18n/translations/br.ts +++ b/client/src/i18n/translations/br.ts @@ -490,8 +490,8 @@ const br: Record = { 'admin.addons.subtitle': 'Ative ou desative recursos para personalizar sua experiência no TREK.', 'admin.addons.catalog.memories.name': 'Memórias', 'admin.addons.catalog.memories.description': 'Álbuns de fotos compartilhados em cada viagem', - 'admin.addons.catalog.packing.name': 'Lists', - 'admin.addons.catalog.packing.description': 'Packing lists and to-do tasks for your trips', + 'admin.addons.catalog.packing.name': 'Listas', + 'admin.addons.catalog.packing.description': 'Listas de bagagem e tarefas a fazer para suas viagens', 'admin.addons.catalog.budget.name': 'Orçamento', 'admin.addons.catalog.budget.description': 'Acompanhe despesas e planeje o orçamento da viagem', 'admin.addons.catalog.documents.name': 'Documentos', @@ -725,8 +725,8 @@ const br: Record = { 'trip.tabs.reservationsShort': 'Reservas', 'trip.tabs.packing': 'Lista de mala', 'trip.tabs.packingShort': 'Mala', - 'trip.tabs.lists': 'Lists', - 'trip.tabs.listsShort': 'Lists', + 'trip.tabs.lists': 'Listas', + 'trip.tabs.listsShort': 'Listas', 'trip.tabs.budget': 'Orçamento', 'trip.tabs.files': 'Arquivos', 'trip.loading': 'Carregando viagem...', @@ -921,11 +921,11 @@ const br: Record = { 'reservations.linkAssignment': 'Vincular à atribuição do dia', 'reservations.pickAssignment': 'Selecione uma atribuição do seu plano...', 'reservations.noAssignment': 'Sem vínculo (avulsa)', - 'reservations.price': 'Price', - 'reservations.budgetCategory': 'Budget category', - 'reservations.budgetCategoryPlaceholder': 'e.g. Transport, Accommodation', - 'reservations.budgetCategoryAuto': 'Auto (from booking type)', - 'reservations.budgetHint': 'A budget entry will be created automatically when saving.', + 'reservations.price': 'Preço', + 'reservations.budgetCategory': 'Categoria de orçamento', + 'reservations.budgetCategoryPlaceholder': 'ex. Transporte, Acomodação', + 'reservations.budgetCategoryAuto': 'Automático (pelo tipo de reserva)', + 'reservations.budgetHint': 'Uma entrada de orçamento será criada automaticamente ao salvar.', 'reservations.departureDate': 'Partida', 'reservations.arrivalDate': 'Chegada', 'reservations.departureTime': 'Hora partida', @@ -1571,42 +1571,42 @@ const br: Record = { 'notifications.test.tripText': 'Notificação de teste para a viagem "{trip}".', // Todo - 'todo.subtab.packing': 'Packing List', - 'todo.subtab.todo': 'To-Do', - 'todo.completed': 'completed', - 'todo.filter.all': 'All', - 'todo.filter.open': 'Open', - 'todo.filter.done': 'Done', - 'todo.uncategorized': 'Uncategorized', - 'todo.namePlaceholder': 'Task name', - 'todo.descriptionPlaceholder': 'Description (optional)', - 'todo.unassigned': 'Unassigned', - 'todo.noCategory': 'No category', - 'todo.hasDescription': 'Has description', - 'todo.addItem': 'Add new task...', - 'todo.newCategory': 'Category name', - 'todo.addCategory': 'Add category', - 'todo.newItem': 'New task', - 'todo.empty': 'No tasks yet. Add a task to get started!', - 'todo.filter.my': 'My Tasks', - 'todo.filter.overdue': 'Overdue', - 'todo.sidebar.tasks': 'Tasks', - 'todo.sidebar.categories': 'Categories', - 'todo.detail.title': 'Task', - 'todo.detail.description': 'Description', - 'todo.detail.category': 'Category', - 'todo.detail.dueDate': 'Due date', - 'todo.detail.assignedTo': 'Assigned to', - 'todo.detail.delete': 'Delete', - 'todo.detail.save': 'Save changes', - 'todo.detail.create': 'Create task', - 'todo.detail.priority': 'Priority', - 'todo.detail.noPriority': 'None', - 'todo.sortByPrio': 'Priority', + 'todo.subtab.packing': 'Lista de bagagem', + 'todo.subtab.todo': 'A fazer', + 'todo.completed': 'concluído(s)', + 'todo.filter.all': 'Todos', + 'todo.filter.open': 'Aberto', + 'todo.filter.done': 'Concluído', + 'todo.uncategorized': 'Sem categoria', + 'todo.namePlaceholder': 'Nome da tarefa', + 'todo.descriptionPlaceholder': 'Descrição (opcional)', + 'todo.unassigned': 'Não atribuído', + 'todo.noCategory': 'Sem categoria', + 'todo.hasDescription': 'Com descrição', + 'todo.addItem': 'Adicionar nova tarefa...', + 'todo.newCategory': 'Nome da categoria', + 'todo.addCategory': 'Adicionar categoria', + 'todo.newItem': 'Nova tarefa', + 'todo.empty': 'Nenhuma tarefa ainda. Adicione uma tarefa para começar!', + 'todo.filter.my': 'Minhas tarefas', + 'todo.filter.overdue': 'Atrasada', + 'todo.sidebar.tasks': 'Tarefas', + 'todo.sidebar.categories': 'Categorias', + 'todo.detail.title': 'Tarefa', + 'todo.detail.description': 'Descrição', + 'todo.detail.category': 'Categoria', + 'todo.detail.dueDate': 'Data de vencimento', + 'todo.detail.assignedTo': 'Atribuído a', + 'todo.detail.delete': 'Excluir', + 'todo.detail.save': 'Salvar alterações', + 'todo.detail.create': 'Criar tarefa', + 'todo.detail.priority': 'Prioridade', + 'todo.detail.noPriority': 'Nenhuma', + 'todo.sortByPrio': 'Prioridade', // Notification system (added from feat/notification-system) - 'settings.notifyVersionAvailable': 'New version available', - 'settings.notificationPreferences.noChannels': 'No notification channels are configured. Ask an admin to set up email or webhook notifications.', + 'settings.notifyVersionAvailable': 'Nova versão disponível', + 'settings.notificationPreferences.noChannels': 'Nenhum canal de notificação configurado. Peça a um administrador para configurar notificações por e-mail ou webhook.', 'settings.webhookUrl.label': 'URL do webhook', 'settings.webhookUrl.placeholder': 'https://discord.com/api/webhooks/...', 'settings.webhookUrl.hint': 'Insira a URL do seu webhook do Discord, Slack ou personalizado para receber notificações.', @@ -1621,7 +1621,7 @@ const br: Record = { 'admin.notifications.emailPanel.title': 'Email (SMTP)', 'admin.notifications.webhookPanel.title': 'Webhook', 'admin.notifications.inappPanel.title': 'In-App', - 'admin.notifications.inappPanel.hint': 'In-app notifications are always active and cannot be disabled globally.', + 'admin.notifications.inappPanel.hint': 'As notificações no aplicativo estão sempre ativas e não podem ser desativadas globalmente.', 'admin.notifications.adminWebhookPanel.title': 'Webhook de admin', 'admin.notifications.adminWebhookPanel.hint': 'Este webhook é usado exclusivamente para notificações de admin (ex. alertas de versão). É independente dos webhooks de usuários e dispara automaticamente quando uma URL está configurada.', 'admin.notifications.adminWebhookPanel.saved': 'URL do webhook de admin salva', @@ -1629,16 +1629,16 @@ const br: Record = { 'admin.notifications.adminWebhookPanel.testFailed': 'Falha no webhook de teste', 'admin.notifications.adminWebhookPanel.alwaysOnHint': 'O webhook de admin dispara automaticamente quando uma URL está configurada', 'admin.notifications.adminNotificationsHint': 'Configure quais canais entregam notificações de admin (ex. alertas de versão). O webhook dispara automaticamente se uma URL de webhook de admin estiver definida.', - 'admin.tabs.notifications': 'Notifications', + 'admin.tabs.notifications': 'Notificações', 'admin.tabs.notificationChannels': 'Canais de notificação', 'admin.tabs.adminNotifications': 'Notificações de admin', - 'notifications.versionAvailable.title': 'Update Available', - 'notifications.versionAvailable.text': 'TREK {version} is now available.', - 'notifications.versionAvailable.button': 'View Details', - 'notif.test.title': '[Test] Notification', - 'notif.test.simple.text': 'This is a simple test notification.', - 'notif.test.boolean.text': 'Do you accept this test notification?', - 'notif.test.navigate.text': 'Click below to navigate to the dashboard.', + 'notifications.versionAvailable.title': 'Atualização disponível', + 'notifications.versionAvailable.text': 'TREK {version} já está disponível.', + 'notifications.versionAvailable.button': 'Ver detalhes', + 'notif.test.title': '[Teste] Notificação', + 'notif.test.simple.text': 'Esta é uma notificação de teste simples.', + 'notif.test.boolean.text': 'Você aceita esta notificação de teste?', + 'notif.test.navigate.text': 'Clique abaixo para ir ao painel.', // Notifications 'notif.trip_invite.title': 'Convite para viagem', @@ -1668,8 +1668,8 @@ const br: Record = { 'notif.action.decline': 'Recusar', 'notif.generic.title': 'Notificação', 'notif.generic.text': 'Você tem uma nova notificação', - 'notif.dev.unknown_event.title': '[DEV] Unknown Event', - 'notif.dev.unknown_event.text': 'Event type "{event}" is not registered in EVENT_NOTIFICATION_CONFIG', + 'notif.dev.unknown_event.title': '[DEV] Evento desconhecido', + 'notif.dev.unknown_event.text': 'O tipo de evento "{event}" não está registrado em EVENT_NOTIFICATION_CONFIG', } export default br diff --git a/client/src/i18n/translations/cs.ts b/client/src/i18n/translations/cs.ts index 1b53296..6f6608b 100644 --- a/client/src/i18n/translations/cs.ts +++ b/client/src/i18n/translations/cs.ts @@ -490,8 +490,8 @@ const cs: Record = { 'admin.addons.subtitle': 'Zapněte nebo vypněte funkce a přizpůsobte si TREK.', 'admin.addons.catalog.memories.name': 'Fotky (Immich)', 'admin.addons.catalog.memories.description': 'Sdílejte cestovní fotky přes vaši instanci Immich', - 'admin.addons.catalog.packing.name': 'Lists', - 'admin.addons.catalog.packing.description': 'Packing lists and to-do tasks for your trips', + 'admin.addons.catalog.packing.name': 'Seznamy', + 'admin.addons.catalog.packing.description': 'Balicí seznamy a úkoly pro vaše výlety', 'admin.addons.catalog.budget.name': 'Rozpočet', 'admin.addons.catalog.budget.description': 'Sledování výdajů a plánování rozpočtu cesty', 'admin.addons.catalog.documents.name': 'Dokumenty', @@ -741,8 +741,8 @@ const cs: Record = { 'trip.tabs.reservationsShort': 'Rez.', 'trip.tabs.packing': 'Seznam věcí', 'trip.tabs.packingShort': 'Balení', - 'trip.tabs.lists': 'Lists', - 'trip.tabs.listsShort': 'Lists', + 'trip.tabs.lists': 'Seznamy', + 'trip.tabs.listsShort': 'Seznamy', 'trip.tabs.budget': 'Rozpočet', 'trip.tabs.files': 'Soubory', 'trip.loading': 'Načítání cesty...', @@ -938,11 +938,11 @@ const cs: Record = { 'reservations.linkAssignment': 'Propojit s přiřazením dne', 'reservations.pickAssignment': 'Vyberte přiřazení z vašeho plánu...', 'reservations.noAssignment': 'Bez propojení (samostatné)', - 'reservations.price': 'Price', - 'reservations.budgetCategory': 'Budget category', - 'reservations.budgetCategoryPlaceholder': 'e.g. Transport, Accommodation', - 'reservations.budgetCategoryAuto': 'Auto (from booking type)', - 'reservations.budgetHint': 'A budget entry will be created automatically when saving.', + 'reservations.price': 'Cena', + 'reservations.budgetCategory': 'Kategorie rozpočtu', + 'reservations.budgetCategoryPlaceholder': 'např. Doprava, Ubytování', + 'reservations.budgetCategoryAuto': 'Auto (podle typu rezervace)', + 'reservations.budgetHint': 'Při ukládání bude automaticky vytvořena položka rozpočtu.', 'reservations.departureDate': 'Odlet', 'reservations.arrivalDate': 'Přílet', 'reservations.departureTime': 'Čas odletu', @@ -1576,42 +1576,42 @@ const cs: Record = { 'notifications.test.tripText': 'Testovací oznámení pro výlet "{trip}".', // Todo - 'todo.subtab.packing': 'Packing List', - 'todo.subtab.todo': 'To-Do', - 'todo.completed': 'completed', - 'todo.filter.all': 'All', - 'todo.filter.open': 'Open', - 'todo.filter.done': 'Done', - 'todo.uncategorized': 'Uncategorized', - 'todo.namePlaceholder': 'Task name', - 'todo.descriptionPlaceholder': 'Description (optional)', - 'todo.unassigned': 'Unassigned', - 'todo.noCategory': 'No category', - 'todo.hasDescription': 'Has description', - 'todo.addItem': 'Add new task...', - 'todo.newCategory': 'Category name', - 'todo.addCategory': 'Add category', - 'todo.newItem': 'New task', - 'todo.empty': 'No tasks yet. Add a task to get started!', - 'todo.filter.my': 'My Tasks', - 'todo.filter.overdue': 'Overdue', - 'todo.sidebar.tasks': 'Tasks', - 'todo.sidebar.categories': 'Categories', - 'todo.detail.title': 'Task', - 'todo.detail.description': 'Description', - 'todo.detail.category': 'Category', - 'todo.detail.dueDate': 'Due date', - 'todo.detail.assignedTo': 'Assigned to', - 'todo.detail.delete': 'Delete', - 'todo.detail.save': 'Save changes', - 'todo.detail.create': 'Create task', - 'todo.detail.priority': 'Priority', - 'todo.detail.noPriority': 'None', - 'todo.sortByPrio': 'Priority', + 'todo.subtab.packing': 'Balicí seznam', + 'todo.subtab.todo': 'Úkoly', + 'todo.completed': 'dokončeno', + 'todo.filter.all': 'Vše', + 'todo.filter.open': 'Otevřené', + 'todo.filter.done': 'Hotové', + 'todo.uncategorized': 'Bez kategorie', + 'todo.namePlaceholder': 'Název úkolu', + 'todo.descriptionPlaceholder': 'Popis (volitelné)', + 'todo.unassigned': 'Nepřiřazeno', + 'todo.noCategory': 'Bez kategorie', + 'todo.hasDescription': 'Má popis', + 'todo.addItem': 'Přidat nový úkol...', + 'todo.newCategory': 'Název kategorie', + 'todo.addCategory': 'Přidat kategorii', + 'todo.newItem': 'Nový úkol', + 'todo.empty': 'Zatím žádné úkoly. Přidejte úkol a začněte!', + 'todo.filter.my': 'Moje úkoly', + 'todo.filter.overdue': 'Po termínu', + 'todo.sidebar.tasks': 'Úkoly', + 'todo.sidebar.categories': 'Kategorie', + 'todo.detail.title': 'Úkol', + 'todo.detail.description': 'Popis', + 'todo.detail.category': 'Kategorie', + 'todo.detail.dueDate': 'Termín splnění', + 'todo.detail.assignedTo': 'Přiřazeno', + 'todo.detail.delete': 'Smazat', + 'todo.detail.save': 'Uložit změny', + 'todo.detail.create': 'Vytvořit úkol', + 'todo.detail.priority': 'Priorita', + 'todo.detail.noPriority': 'Žádná', + 'todo.sortByPrio': 'Priorita', // Notification system (added from feat/notification-system) - 'settings.notifyVersionAvailable': 'New version available', - 'settings.notificationPreferences.noChannels': 'No notification channels are configured. Ask an admin to set up email or webhook notifications.', + 'settings.notifyVersionAvailable': 'Nová verze k dispozici', + 'settings.notificationPreferences.noChannels': 'Nejsou nakonfigurovány žádné kanály oznámení. Požádejte správce o nastavení e-mailových nebo webhook oznámení.', 'settings.webhookUrl.label': 'URL webhooku', 'settings.webhookUrl.placeholder': 'https://discord.com/api/webhooks/...', 'settings.webhookUrl.hint': 'Zadejte URL vašeho Discord, Slack nebo vlastního webhooku pro příjem oznámení.', @@ -1626,7 +1626,7 @@ const cs: Record = { 'admin.notifications.emailPanel.title': 'Email (SMTP)', 'admin.notifications.webhookPanel.title': 'Webhook', 'admin.notifications.inappPanel.title': 'In-App', - 'admin.notifications.inappPanel.hint': 'In-app notifications are always active and cannot be disabled globally.', + 'admin.notifications.inappPanel.hint': 'In-app oznámení jsou vždy aktivní a nelze je globálně vypnout.', 'admin.notifications.adminWebhookPanel.title': 'Admin webhook', 'admin.notifications.adminWebhookPanel.hint': 'Tento webhook se používá výhradně pro admin oznámení (např. upozornění na verze). Je nezávislý na uživatelských webhooků a odesílá automaticky, pokud je nastavena URL.', 'admin.notifications.adminWebhookPanel.saved': 'URL admin webhooku uložena', @@ -1634,16 +1634,16 @@ const cs: Record = { 'admin.notifications.adminWebhookPanel.testFailed': 'Testovací webhook selhal', 'admin.notifications.adminWebhookPanel.alwaysOnHint': 'Admin webhook odesílá automaticky, pokud je nastavena URL', 'admin.notifications.adminNotificationsHint': 'Nastavte, které kanály doručují admin oznámení (např. upozornění na verze). Webhook odesílá automaticky, pokud je nastavena URL admin webhooku.', - 'admin.tabs.notifications': 'Notifications', + 'admin.tabs.notifications': 'Oznámení', 'admin.tabs.notificationChannels': 'Kanály oznámení', 'admin.tabs.adminNotifications': 'Admin oznámení', - 'notifications.versionAvailable.title': 'Update Available', - 'notifications.versionAvailable.text': 'TREK {version} is now available.', - 'notifications.versionAvailable.button': 'View Details', - 'notif.test.title': '[Test] Notification', - 'notif.test.simple.text': 'This is a simple test notification.', - 'notif.test.boolean.text': 'Do you accept this test notification?', - 'notif.test.navigate.text': 'Click below to navigate to the dashboard.', + 'notifications.versionAvailable.title': 'Dostupná aktualizace', + 'notifications.versionAvailable.text': 'TREK {version} je nyní k dispozici.', + 'notifications.versionAvailable.button': 'Zobrazit podrobnosti', + 'notif.test.title': '[Test] Oznámení', + 'notif.test.simple.text': 'Toto je jednoduché testovací oznámení.', + 'notif.test.boolean.text': 'Přijmete toto testovací oznámení?', + 'notif.test.navigate.text': 'Klikněte níže pro přechod na přehled.', // Notifications 'notif.trip_invite.title': 'Pozvánka na výlet', @@ -1673,8 +1673,8 @@ const cs: Record = { 'notif.action.decline': 'Odmítnout', 'notif.generic.title': 'Oznámení', 'notif.generic.text': 'Máte nové oznámení', - 'notif.dev.unknown_event.title': '[DEV] Unknown Event', - 'notif.dev.unknown_event.text': 'Event type "{event}" is not registered in EVENT_NOTIFICATION_CONFIG', + 'notif.dev.unknown_event.title': '[DEV] Neznámá událost', + 'notif.dev.unknown_event.text': 'Typ události "{event}" není registrován v EVENT_NOTIFICATION_CONFIG', } export default cs diff --git a/client/src/i18n/translations/de.ts b/client/src/i18n/translations/de.ts index 68c5b46..394b5d8 100644 --- a/client/src/i18n/translations/de.ts +++ b/client/src/i18n/translations/de.ts @@ -1607,8 +1607,8 @@ const de: Record = { 'todo.detail.create': 'Aufgabe erstellen', // Notification system (added from feat/notification-system) - 'settings.notifyVersionAvailable': 'New version available', - 'settings.notificationPreferences.noChannels': 'No notification channels are configured. Ask an admin to set up email or webhook notifications.', + 'settings.notifyVersionAvailable': 'Neue Version verfügbar', + 'settings.notificationPreferences.noChannels': 'Keine Benachrichtigungskanäle konfiguriert. Bitte einen Administrator, E-Mail- oder Webhook-Benachrichtigungen einzurichten.', 'settings.webhookUrl.label': 'Webhook URL', 'settings.webhookUrl.placeholder': 'https://discord.com/api/webhooks/...', 'settings.webhookUrl.hint': 'Gib deine Discord-, Slack- oder benutzerdefinierte Webhook-URL ein, um Benachrichtigungen zu erhalten.', @@ -1623,7 +1623,7 @@ const de: Record = { 'admin.notifications.emailPanel.title': 'Email (SMTP)', 'admin.notifications.webhookPanel.title': 'Webhook', 'admin.notifications.inappPanel.title': 'In-App', - 'admin.notifications.inappPanel.hint': 'In-app notifications are always active and cannot be disabled globally.', + 'admin.notifications.inappPanel.hint': 'In-App-Benachrichtigungen sind immer aktiv und können nicht global deaktiviert werden.', 'admin.notifications.adminWebhookPanel.title': 'Admin-Webhook', 'admin.notifications.adminWebhookPanel.hint': 'Dieser Webhook wird ausschließlich für Admin-Benachrichtigungen verwendet (z. B. Versions-Updates). Er ist unabhängig von den Benutzer-Webhooks und sendet automatisch, wenn eine URL konfiguriert ist.', 'admin.notifications.adminWebhookPanel.saved': 'Admin-Webhook-URL gespeichert', @@ -1631,16 +1631,16 @@ const de: Record = { 'admin.notifications.adminWebhookPanel.testFailed': 'Test-Webhook fehlgeschlagen', 'admin.notifications.adminWebhookPanel.alwaysOnHint': 'Admin-Webhook sendet automatisch, wenn eine URL konfiguriert ist', 'admin.notifications.adminNotificationsHint': 'Konfiguriere, welche Kanäle Admin-Benachrichtigungen liefern (z. B. Versions-Updates). Der Webhook sendet automatisch, wenn eine Admin-Webhook-URL gesetzt ist.', - 'admin.tabs.notifications': 'Notifications', + 'admin.tabs.notifications': 'Benachrichtigungen', 'admin.tabs.notificationChannels': 'Benachrichtigungskanäle', 'admin.tabs.adminNotifications': 'Admin-Benachrichtigungen', - 'notifications.versionAvailable.title': 'Update Available', - 'notifications.versionAvailable.text': 'TREK {version} is now available.', - 'notifications.versionAvailable.button': 'View Details', - 'notif.test.title': '[Test] Notification', - 'notif.test.simple.text': 'This is a simple test notification.', - 'notif.test.boolean.text': 'Do you accept this test notification?', - 'notif.test.navigate.text': 'Click below to navigate to the dashboard.', + 'notifications.versionAvailable.title': 'Update verfügbar', + 'notifications.versionAvailable.text': 'TREK {version} ist jetzt verfügbar.', + 'notifications.versionAvailable.button': 'Details anzeigen', + 'notif.test.title': '[Test] Benachrichtigung', + 'notif.test.simple.text': 'Dies ist eine einfache Testbenachrichtigung.', + 'notif.test.boolean.text': 'Akzeptierst du diese Testbenachrichtigung?', + 'notif.test.navigate.text': 'Klicke unten, um zum Dashboard zu navigieren.', // Notifications 'notif.trip_invite.title': 'Reiseeinladung', @@ -1670,8 +1670,8 @@ const de: Record = { 'notif.action.decline': 'Ablehnen', 'notif.generic.title': 'Benachrichtigung', 'notif.generic.text': 'Du hast eine neue Benachrichtigung', - 'notif.dev.unknown_event.title': '[DEV] Unknown Event', - 'notif.dev.unknown_event.text': 'Event type "{event}" is not registered in EVENT_NOTIFICATION_CONFIG', + 'notif.dev.unknown_event.title': '[DEV] Unbekanntes Ereignis', + 'notif.dev.unknown_event.text': 'Ereignistyp "{event}" ist nicht in EVENT_NOTIFICATION_CONFIG registriert', } export default de diff --git a/client/src/i18n/translations/es.ts b/client/src/i18n/translations/es.ts index b2b0af4..2f07691 100644 --- a/client/src/i18n/translations/es.ts +++ b/client/src/i18n/translations/es.ts @@ -717,8 +717,8 @@ const es: Record = { 'trip.tabs.reservationsShort': 'Reservas', 'trip.tabs.packing': 'Lista de equipaje', 'trip.tabs.packingShort': 'Equipaje', - 'trip.tabs.lists': 'Lists', - 'trip.tabs.listsShort': 'Lists', + 'trip.tabs.lists': 'Listas', + 'trip.tabs.listsShort': 'Listas', 'trip.tabs.budget': 'Presupuesto', 'trip.tabs.files': 'Archivos', 'trip.loading': 'Cargando viaje...', @@ -897,11 +897,11 @@ const es: Record = { 'reservations.linkAssignment': 'Vincular a una asignación del día', 'reservations.pickAssignment': 'Selecciona una asignación de tu plan...', 'reservations.noAssignment': 'Sin vínculo (independiente)', - 'reservations.price': 'Price', - 'reservations.budgetCategory': 'Budget category', - 'reservations.budgetCategoryPlaceholder': 'e.g. Transport, Accommodation', - 'reservations.budgetCategoryAuto': 'Auto (from booking type)', - 'reservations.budgetHint': 'A budget entry will be created automatically when saving.', + 'reservations.price': 'Precio', + 'reservations.budgetCategory': 'Categoría de presupuesto', + 'reservations.budgetCategoryPlaceholder': 'ej. Transporte, Alojamiento', + 'reservations.budgetCategoryAuto': 'Automático (según tipo de reserva)', + 'reservations.budgetHint': 'Se creará automáticamente una entrada presupuestaria al guardar.', 'reservations.departureDate': 'Salida', 'reservations.arrivalDate': 'Llegada', 'reservations.departureTime': 'Hora salida', @@ -1193,8 +1193,8 @@ const es: Record = { 'admin.addons.catalog.memories.description': 'Comparte fotos de viaje a través de tu instancia de Immich', 'admin.addons.catalog.mcp.name': 'MCP', 'admin.addons.catalog.mcp.description': 'Protocolo de contexto de modelo para integración con asistentes de IA', - 'admin.addons.catalog.packing.name': 'Lists', - 'admin.addons.catalog.packing.description': 'Packing lists and to-do tasks for your trips', + 'admin.addons.catalog.packing.name': 'Listas', + 'admin.addons.catalog.packing.description': 'Listas de equipaje y tareas pendientes para tus viajes', 'admin.addons.catalog.budget.name': 'Presupuesto', 'admin.addons.catalog.budget.description': 'Controla los gastos y planifica el presupuesto del viaje', 'admin.addons.catalog.documents.name': 'Documentos', @@ -1578,42 +1578,42 @@ const es: Record = { 'notifications.test.tripText': 'Notificación de prueba para el viaje "{trip}".', // Todo - 'todo.subtab.packing': 'Packing List', - 'todo.subtab.todo': 'To-Do', - 'todo.completed': 'completed', - 'todo.filter.all': 'All', - 'todo.filter.open': 'Open', - 'todo.filter.done': 'Done', - 'todo.uncategorized': 'Uncategorized', - 'todo.namePlaceholder': 'Task name', - 'todo.descriptionPlaceholder': 'Description (optional)', - 'todo.unassigned': 'Unassigned', - 'todo.noCategory': 'No category', - 'todo.hasDescription': 'Has description', - 'todo.addItem': 'Add new task...', - 'todo.newCategory': 'Category name', - 'todo.addCategory': 'Add category', - 'todo.newItem': 'New task', - 'todo.empty': 'No tasks yet. Add a task to get started!', - 'todo.filter.my': 'My Tasks', - 'todo.filter.overdue': 'Overdue', - 'todo.sidebar.tasks': 'Tasks', - 'todo.sidebar.categories': 'Categories', - 'todo.detail.title': 'Task', - 'todo.detail.description': 'Description', - 'todo.detail.category': 'Category', - 'todo.detail.dueDate': 'Due date', - 'todo.detail.assignedTo': 'Assigned to', - 'todo.detail.delete': 'Delete', - 'todo.detail.save': 'Save changes', - 'todo.detail.create': 'Create task', - 'todo.detail.priority': 'Priority', - 'todo.detail.noPriority': 'None', - 'todo.sortByPrio': 'Priority', + 'todo.subtab.packing': 'Lista de equipaje', + 'todo.subtab.todo': 'Por hacer', + 'todo.completed': 'completado(s)', + 'todo.filter.all': 'Todo', + 'todo.filter.open': 'Abierto', + 'todo.filter.done': 'Hecho', + 'todo.uncategorized': 'Sin categoría', + 'todo.namePlaceholder': 'Nombre de la tarea', + 'todo.descriptionPlaceholder': 'Descripción (opcional)', + 'todo.unassigned': 'Sin asignar', + 'todo.noCategory': 'Sin categoría', + 'todo.hasDescription': 'Con descripción', + 'todo.addItem': 'Añadir nueva tarea...', + 'todo.newCategory': 'Nombre de la categoría', + 'todo.addCategory': 'Añadir categoría', + 'todo.newItem': 'Nueva tarea', + 'todo.empty': 'Aún no hay tareas. ¡Añade una tarea para empezar!', + 'todo.filter.my': 'Mis tareas', + 'todo.filter.overdue': 'Vencida', + 'todo.sidebar.tasks': 'Tareas', + 'todo.sidebar.categories': 'Categorías', + 'todo.detail.title': 'Tarea', + 'todo.detail.description': 'Descripción', + 'todo.detail.category': 'Categoría', + 'todo.detail.dueDate': 'Fecha límite', + 'todo.detail.assignedTo': 'Asignado a', + 'todo.detail.delete': 'Eliminar', + 'todo.detail.save': 'Guardar cambios', + 'todo.detail.create': 'Crear tarea', + 'todo.detail.priority': 'Prioridad', + 'todo.detail.noPriority': 'Ninguna', + 'todo.sortByPrio': 'Prioridad', // Notification system (added from feat/notification-system) - 'settings.notifyVersionAvailable': 'New version available', - 'settings.notificationPreferences.noChannels': 'No notification channels are configured. Ask an admin to set up email or webhook notifications.', + 'settings.notifyVersionAvailable': 'Nueva versión disponible', + 'settings.notificationPreferences.noChannels': 'No hay canales de notificación configurados. Pide a un administrador que configure notificaciones por correo o webhook.', 'settings.webhookUrl.label': 'URL del webhook', 'settings.webhookUrl.placeholder': 'https://discord.com/api/webhooks/...', 'settings.webhookUrl.hint': 'Introduce tu URL de webhook de Discord, Slack o personalizada para recibir notificaciones.', @@ -1628,7 +1628,7 @@ const es: Record = { 'admin.notifications.emailPanel.title': 'Email (SMTP)', 'admin.notifications.webhookPanel.title': 'Webhook', 'admin.notifications.inappPanel.title': 'In-App', - 'admin.notifications.inappPanel.hint': 'In-app notifications are always active and cannot be disabled globally.', + 'admin.notifications.inappPanel.hint': 'Las notificaciones in-app siempre están activas y no se pueden desactivar globalmente.', 'admin.notifications.adminWebhookPanel.title': 'Webhook de admin', 'admin.notifications.adminWebhookPanel.hint': 'Este webhook se usa exclusivamente para notificaciones de admin (ej. alertas de versión). Es independiente de los webhooks de usuario y se activa automáticamente si hay una URL configurada.', 'admin.notifications.adminWebhookPanel.saved': 'URL del webhook de admin guardada', @@ -1636,16 +1636,16 @@ const es: Record = { 'admin.notifications.adminWebhookPanel.testFailed': 'Error al enviar el webhook de prueba', 'admin.notifications.adminWebhookPanel.alwaysOnHint': 'El webhook de admin se activa automáticamente si hay una URL configurada', 'admin.notifications.adminNotificationsHint': 'Configura qué canales entregan notificaciones de admin (ej. alertas de versión). El webhook se activa automáticamente si hay una URL de webhook de admin configurada.', - 'admin.tabs.notifications': 'Notifications', + 'admin.tabs.notifications': 'Notificaciones', 'admin.tabs.notificationChannels': 'Canales de notificación', 'admin.tabs.adminNotifications': 'Notificaciones de admin', - 'notifications.versionAvailable.title': 'Update Available', - 'notifications.versionAvailable.text': 'TREK {version} is now available.', - 'notifications.versionAvailable.button': 'View Details', - 'notif.test.title': '[Test] Notification', - 'notif.test.simple.text': 'This is a simple test notification.', - 'notif.test.boolean.text': 'Do you accept this test notification?', - 'notif.test.navigate.text': 'Click below to navigate to the dashboard.', + 'notifications.versionAvailable.title': 'Actualización disponible', + 'notifications.versionAvailable.text': 'TREK {version} ya está disponible.', + 'notifications.versionAvailable.button': 'Ver detalles', + 'notif.test.title': '[Test] Notificación', + 'notif.test.simple.text': 'Esta es una notificación de prueba simple.', + 'notif.test.boolean.text': '¿Aceptas esta notificación de prueba?', + 'notif.test.navigate.text': 'Haz clic abajo para ir al panel de control.', // Notifications 'notif.trip_invite.title': 'Invitación al viaje', @@ -1675,8 +1675,8 @@ const es: Record = { 'notif.action.decline': 'Rechazar', 'notif.generic.title': 'Notificación', 'notif.generic.text': 'Tienes una nueva notificación', - 'notif.dev.unknown_event.title': '[DEV] Unknown Event', - 'notif.dev.unknown_event.text': 'Event type "{event}" is not registered in EVENT_NOTIFICATION_CONFIG', + 'notif.dev.unknown_event.title': '[DEV] Evento desconocido', + 'notif.dev.unknown_event.text': 'El tipo de evento "{event}" no está registrado en EVENT_NOTIFICATION_CONFIG', } export default es diff --git a/client/src/i18n/translations/fr.ts b/client/src/i18n/translations/fr.ts index 4dab49c..bbc2683 100644 --- a/client/src/i18n/translations/fr.ts +++ b/client/src/i18n/translations/fr.ts @@ -491,8 +491,8 @@ const fr: Record = { 'admin.addons.catalog.memories.description': 'Partagez vos photos de voyage via votre instance Immich', 'admin.addons.catalog.mcp.name': 'MCP', 'admin.addons.catalog.mcp.description': 'Protocole de contexte de modèle pour l\'intégration d\'assistants IA', - 'admin.addons.catalog.packing.name': 'Lists', - 'admin.addons.catalog.packing.description': 'Packing lists and to-do tasks for your trips', + 'admin.addons.catalog.packing.name': 'Listes', + 'admin.addons.catalog.packing.description': 'Listes de bagages et tâches à faire pour vos voyages', 'admin.addons.catalog.budget.name': 'Budget', 'admin.addons.catalog.budget.description': 'Suivez les dépenses et planifiez votre budget de voyage', 'admin.addons.catalog.documents.name': 'Documents', @@ -740,8 +740,8 @@ const fr: Record = { 'trip.tabs.reservationsShort': 'Résa', 'trip.tabs.packing': 'Liste de bagages', 'trip.tabs.packingShort': 'Bagages', - 'trip.tabs.lists': 'Lists', - 'trip.tabs.listsShort': 'Lists', + 'trip.tabs.lists': 'Listes', + 'trip.tabs.listsShort': 'Listes', 'trip.tabs.budget': 'Budget', 'trip.tabs.files': 'Fichiers', 'trip.loading': 'Chargement du voyage…', @@ -936,11 +936,11 @@ const fr: Record = { 'reservations.linkAssignment': 'Lier à l\'affectation du jour', 'reservations.pickAssignment': 'Sélectionnez une affectation de votre plan…', 'reservations.noAssignment': 'Aucun lien (autonome)', - 'reservations.price': 'Price', - 'reservations.budgetCategory': 'Budget category', - 'reservations.budgetCategoryPlaceholder': 'e.g. Transport, Accommodation', - 'reservations.budgetCategoryAuto': 'Auto (from booking type)', - 'reservations.budgetHint': 'A budget entry will be created automatically when saving.', + 'reservations.price': 'Prix', + 'reservations.budgetCategory': 'Catégorie budgétaire', + 'reservations.budgetCategoryPlaceholder': 'ex. Transport, Hébergement', + 'reservations.budgetCategoryAuto': 'Auto (selon le type de réservation)', + 'reservations.budgetHint': 'Une entrée budgétaire sera créée automatiquement lors de l\'enregistrement.', 'reservations.departureDate': 'Départ', 'reservations.arrivalDate': 'Arrivée', 'reservations.departureTime': 'Heure dép.', @@ -1572,42 +1572,42 @@ const fr: Record = { 'notifications.test.tripText': 'Notification de test pour le voyage "{trip}".', // Todo - 'todo.subtab.packing': 'Packing List', - 'todo.subtab.todo': 'To-Do', - 'todo.completed': 'completed', - 'todo.filter.all': 'All', - 'todo.filter.open': 'Open', - 'todo.filter.done': 'Done', - 'todo.uncategorized': 'Uncategorized', - 'todo.namePlaceholder': 'Task name', - 'todo.descriptionPlaceholder': 'Description (optional)', - 'todo.unassigned': 'Unassigned', - 'todo.noCategory': 'No category', - 'todo.hasDescription': 'Has description', - 'todo.addItem': 'Add new task...', - 'todo.newCategory': 'Category name', - 'todo.addCategory': 'Add category', - 'todo.newItem': 'New task', - 'todo.empty': 'No tasks yet. Add a task to get started!', - 'todo.filter.my': 'My Tasks', - 'todo.filter.overdue': 'Overdue', - 'todo.sidebar.tasks': 'Tasks', - 'todo.sidebar.categories': 'Categories', - 'todo.detail.title': 'Task', + 'todo.subtab.packing': 'Liste de bagages', + 'todo.subtab.todo': 'À faire', + 'todo.completed': 'terminé(s)', + 'todo.filter.all': 'Tout', + 'todo.filter.open': 'En cours', + 'todo.filter.done': 'Terminé', + 'todo.uncategorized': 'Sans catégorie', + 'todo.namePlaceholder': 'Nom de la tâche', + 'todo.descriptionPlaceholder': 'Description (facultative)', + 'todo.unassigned': 'Non assigné', + 'todo.noCategory': 'Aucune catégorie', + 'todo.hasDescription': 'Avec description', + 'todo.addItem': 'Ajouter une tâche...', + 'todo.newCategory': 'Nom de la catégorie', + 'todo.addCategory': 'Ajouter une catégorie', + 'todo.newItem': 'Nouvelle tâche', + 'todo.empty': 'Aucune tâche pour l\'instant. Ajoutez une tâche pour commencer !', + 'todo.filter.my': 'Mes tâches', + 'todo.filter.overdue': 'En retard', + 'todo.sidebar.tasks': 'Tâches', + 'todo.sidebar.categories': 'Catégories', + 'todo.detail.title': 'Tâche', 'todo.detail.description': 'Description', - 'todo.detail.category': 'Category', - 'todo.detail.dueDate': 'Due date', - 'todo.detail.assignedTo': 'Assigned to', - 'todo.detail.delete': 'Delete', - 'todo.detail.save': 'Save changes', - 'todo.detail.create': 'Create task', - 'todo.detail.priority': 'Priority', - 'todo.detail.noPriority': 'None', - 'todo.sortByPrio': 'Priority', + 'todo.detail.category': 'Catégorie', + 'todo.detail.dueDate': 'Date d\'échéance', + 'todo.detail.assignedTo': 'Assigné à', + 'todo.detail.delete': 'Supprimer', + 'todo.detail.save': 'Enregistrer les modifications', + 'todo.detail.create': 'Créer la tâche', + 'todo.detail.priority': 'Priorité', + 'todo.detail.noPriority': 'Aucune', + 'todo.sortByPrio': 'Priorité', // Notification system (added from feat/notification-system) - 'settings.notifyVersionAvailable': 'New version available', - 'settings.notificationPreferences.noChannels': 'No notification channels are configured. Ask an admin to set up email or webhook notifications.', + 'settings.notifyVersionAvailable': 'Nouvelle version disponible', + 'settings.notificationPreferences.noChannels': 'Aucun canal de notification n\'est configuré. Demandez à un administrateur de configurer les notifications par e-mail ou webhook.', 'settings.webhookUrl.label': 'URL du webhook', 'settings.webhookUrl.placeholder': 'https://discord.com/api/webhooks/...', 'settings.webhookUrl.hint': 'Entrez votre URL de webhook Discord, Slack ou personnalisée pour recevoir des notifications.', @@ -1622,7 +1622,7 @@ const fr: Record = { 'admin.notifications.emailPanel.title': 'Email (SMTP)', 'admin.notifications.webhookPanel.title': 'Webhook', 'admin.notifications.inappPanel.title': 'In-App', - 'admin.notifications.inappPanel.hint': 'In-app notifications are always active and cannot be disabled globally.', + 'admin.notifications.inappPanel.hint': 'Les notifications in-app sont toujours actives et ne peuvent pas être désactivées globalement.', 'admin.notifications.adminWebhookPanel.title': 'Webhook admin', 'admin.notifications.adminWebhookPanel.hint': 'Ce webhook est utilisé exclusivement pour les notifications admin (ex. alertes de version). Il est séparé des webhooks utilisateur et s\'active automatiquement si une URL est configurée.', 'admin.notifications.adminWebhookPanel.saved': 'URL du webhook admin enregistrée', @@ -1633,13 +1633,13 @@ const fr: Record = { 'admin.tabs.notifications': 'Notifications', 'admin.tabs.notificationChannels': 'Canaux de notification', 'admin.tabs.adminNotifications': 'Notifications admin', - 'notifications.versionAvailable.title': 'Update Available', - 'notifications.versionAvailable.text': 'TREK {version} is now available.', - 'notifications.versionAvailable.button': 'View Details', + 'notifications.versionAvailable.title': 'Mise à jour disponible', + 'notifications.versionAvailable.text': 'TREK {version} est maintenant disponible.', + 'notifications.versionAvailable.button': 'Voir les détails', 'notif.test.title': '[Test] Notification', - 'notif.test.simple.text': 'This is a simple test notification.', - 'notif.test.boolean.text': 'Do you accept this test notification?', - 'notif.test.navigate.text': 'Click below to navigate to the dashboard.', + 'notif.test.simple.text': 'Ceci est une simple notification de test.', + 'notif.test.boolean.text': 'Acceptez-vous cette notification de test ?', + 'notif.test.navigate.text': 'Cliquez ci-dessous pour accéder au tableau de bord.', // Notifications 'notif.trip_invite.title': 'Invitation au voyage', @@ -1669,8 +1669,8 @@ const fr: Record = { 'notif.action.decline': 'Refuser', 'notif.generic.title': 'Notification', 'notif.generic.text': 'Vous avez une nouvelle notification', - 'notif.dev.unknown_event.title': '[DEV] Unknown Event', - 'notif.dev.unknown_event.text': 'Event type "{event}" is not registered in EVENT_NOTIFICATION_CONFIG', + 'notif.dev.unknown_event.title': '[DEV] Événement inconnu', + 'notif.dev.unknown_event.text': 'Le type d\'événement "{event}" n\'est pas enregistré dans EVENT_NOTIFICATION_CONFIG', } export default fr diff --git a/client/src/i18n/translations/hu.ts b/client/src/i18n/translations/hu.ts index a91f6c8..a631658 100644 --- a/client/src/i18n/translations/hu.ts +++ b/client/src/i18n/translations/hu.ts @@ -488,8 +488,8 @@ const hu: Record = { 'admin.tabs.addons': 'Bővítmények', 'admin.addons.title': 'Bővítmények', 'admin.addons.subtitle': 'Funkciók engedélyezése vagy letiltása a TREK testreszabásához.', - 'admin.addons.catalog.packing.name': 'Lists', - 'admin.addons.catalog.packing.description': 'Packing lists and to-do tasks for your trips', + 'admin.addons.catalog.packing.name': 'Listák', + 'admin.addons.catalog.packing.description': 'Csomagolási listák és teendők az utazásaidhoz', 'admin.addons.catalog.budget.name': 'Költségvetés', 'admin.addons.catalog.budget.description': 'Kiadások nyomon követése és az utazási költségvetés tervezése', 'admin.addons.catalog.documents.name': 'Dokumentumok', @@ -741,8 +741,8 @@ const hu: Record = { 'trip.tabs.reservationsShort': 'Foglalás', 'trip.tabs.packing': 'Csomagolási lista', 'trip.tabs.packingShort': 'Csomag', - 'trip.tabs.lists': 'Lists', - 'trip.tabs.listsShort': 'Lists', + 'trip.tabs.lists': 'Listák', + 'trip.tabs.listsShort': 'Listák', 'trip.tabs.budget': 'Költségvetés', 'trip.tabs.files': 'Fájlok', 'trip.loading': 'Utazás betöltése...', @@ -937,11 +937,11 @@ const hu: Record = { 'reservations.linkAssignment': 'Összekapcsolás napi tervvel', 'reservations.pickAssignment': 'Válassz hozzárendelést a tervedből...', 'reservations.noAssignment': 'Nincs összekapcsolás (önálló)', - 'reservations.price': 'Price', - 'reservations.budgetCategory': 'Budget category', - 'reservations.budgetCategoryPlaceholder': 'e.g. Transport, Accommodation', - 'reservations.budgetCategoryAuto': 'Auto (from booking type)', - 'reservations.budgetHint': 'A budget entry will be created automatically when saving.', + 'reservations.price': 'Ár', + 'reservations.budgetCategory': 'Költségvetési kategória', + 'reservations.budgetCategoryPlaceholder': 'pl. Közlekedés, Szállás', + 'reservations.budgetCategoryAuto': 'Automatikus (foglalás típusa alapján)', + 'reservations.budgetHint': 'Mentéskor automatikusan létrejön egy költségvetési tétel.', 'reservations.departureDate': 'Indulás', 'reservations.arrivalDate': 'Érkezés', 'reservations.departureTime': 'Indulási idő', @@ -1573,42 +1573,42 @@ const hu: Record = { 'notifications.test.tripText': 'Teszt értesítés a(z) "{trip}" utazáshoz.', // Todo - 'todo.subtab.packing': 'Packing List', - 'todo.subtab.todo': 'To-Do', - 'todo.completed': 'completed', - 'todo.filter.all': 'All', - 'todo.filter.open': 'Open', - 'todo.filter.done': 'Done', - 'todo.uncategorized': 'Uncategorized', - 'todo.namePlaceholder': 'Task name', - 'todo.descriptionPlaceholder': 'Description (optional)', - 'todo.unassigned': 'Unassigned', - 'todo.noCategory': 'No category', - 'todo.hasDescription': 'Has description', - 'todo.addItem': 'Add new task...', - 'todo.newCategory': 'Category name', - 'todo.addCategory': 'Add category', - 'todo.newItem': 'New task', - 'todo.empty': 'No tasks yet. Add a task to get started!', - 'todo.filter.my': 'My Tasks', - 'todo.filter.overdue': 'Overdue', - 'todo.sidebar.tasks': 'Tasks', - 'todo.sidebar.categories': 'Categories', - 'todo.detail.title': 'Task', - 'todo.detail.description': 'Description', - 'todo.detail.category': 'Category', - 'todo.detail.dueDate': 'Due date', - 'todo.detail.assignedTo': 'Assigned to', - 'todo.detail.delete': 'Delete', - 'todo.detail.save': 'Save changes', - 'todo.detail.create': 'Create task', - 'todo.detail.priority': 'Priority', - 'todo.detail.noPriority': 'None', - 'todo.sortByPrio': 'Priority', + 'todo.subtab.packing': 'Csomagolási lista', + 'todo.subtab.todo': 'Teendők', + 'todo.completed': 'kész', + 'todo.filter.all': 'Mind', + 'todo.filter.open': 'Nyitott', + 'todo.filter.done': 'Kész', + 'todo.uncategorized': 'Kategória nélküli', + 'todo.namePlaceholder': 'Feladat neve', + 'todo.descriptionPlaceholder': 'Leírás (opcionális)', + 'todo.unassigned': 'Nem hozzárendelt', + 'todo.noCategory': 'Nincs kategória', + 'todo.hasDescription': 'Van leírás', + 'todo.addItem': 'Új feladat hozzáadása...', + 'todo.newCategory': 'Kategória neve', + 'todo.addCategory': 'Kategória hozzáadása', + 'todo.newItem': 'Új feladat', + 'todo.empty': 'Még nincsenek feladatok. Adj hozzá egyet a kezdéshez!', + 'todo.filter.my': 'Saját feladataim', + 'todo.filter.overdue': 'Lejárt', + 'todo.sidebar.tasks': 'Feladatok', + 'todo.sidebar.categories': 'Kategóriák', + 'todo.detail.title': 'Feladat', + 'todo.detail.description': 'Leírás', + 'todo.detail.category': 'Kategória', + 'todo.detail.dueDate': 'Határidő', + 'todo.detail.assignedTo': 'Hozzárendelve', + 'todo.detail.delete': 'Törlés', + 'todo.detail.save': 'Módosítások mentése', + 'todo.detail.create': 'Feladat létrehozása', + 'todo.detail.priority': 'Prioritás', + 'todo.detail.noPriority': 'Nincs', + 'todo.sortByPrio': 'Prioritás', // Notification system (added from feat/notification-system) - 'settings.notifyVersionAvailable': 'New version available', - 'settings.notificationPreferences.noChannels': 'No notification channels are configured. Ask an admin to set up email or webhook notifications.', + 'settings.notifyVersionAvailable': 'Új verzió elérhető', + 'settings.notificationPreferences.noChannels': 'Nincsenek értesítési csatornák beállítva. Kérd meg a rendszergazdát, hogy állítson be e-mail vagy webhook értesítéseket.', 'settings.webhookUrl.label': 'Webhook URL', 'settings.webhookUrl.placeholder': 'https://discord.com/api/webhooks/...', 'settings.webhookUrl.hint': 'Adja meg a Discord, Slack vagy egyéni webhook URL-jét az értesítések fogadásához.', @@ -1623,7 +1623,7 @@ const hu: Record = { 'admin.notifications.emailPanel.title': 'Email (SMTP)', 'admin.notifications.webhookPanel.title': 'Webhook', 'admin.notifications.inappPanel.title': 'In-App', - 'admin.notifications.inappPanel.hint': 'In-app notifications are always active and cannot be disabled globally.', + 'admin.notifications.inappPanel.hint': 'Az alkalmazáson belüli értesítések mindig aktívak, és globálisan nem kapcsolhatók ki.', 'admin.notifications.adminWebhookPanel.title': 'Admin webhook', 'admin.notifications.adminWebhookPanel.hint': 'Ez a webhook kizárólag admin értesítésekhez használatos (pl. verziófrissítési figyelmeztetések). Független a felhasználói webhookoktól, és automatikusan küld, ha URL van beállítva.', 'admin.notifications.adminWebhookPanel.saved': 'Admin webhook URL mentve', @@ -1631,16 +1631,16 @@ const hu: Record = { 'admin.notifications.adminWebhookPanel.testFailed': 'Teszt webhook sikertelen', 'admin.notifications.adminWebhookPanel.alwaysOnHint': 'Az admin webhook automatikusan küld, ha URL van beállítva', 'admin.notifications.adminNotificationsHint': 'Állítsa be, hogy mely csatornák szállítsák az admin értesítéseket (pl. verziófrissítési figyelmeztetések). A webhook automatikusan küld, ha admin webhook URL van megadva.', - 'admin.tabs.notifications': 'Notifications', + 'admin.tabs.notifications': 'Értesítések', 'admin.tabs.notificationChannels': 'Értesítési csatornák', 'admin.tabs.adminNotifications': 'Admin értesítések', - 'notifications.versionAvailable.title': 'Update Available', - 'notifications.versionAvailable.text': 'TREK {version} is now available.', - 'notifications.versionAvailable.button': 'View Details', - 'notif.test.title': '[Test] Notification', - 'notif.test.simple.text': 'This is a simple test notification.', - 'notif.test.boolean.text': 'Do you accept this test notification?', - 'notif.test.navigate.text': 'Click below to navigate to the dashboard.', + 'notifications.versionAvailable.title': 'Elérhető frissítés', + 'notifications.versionAvailable.text': 'A TREK {version} már elérhető.', + 'notifications.versionAvailable.button': 'Részletek megtekintése', + 'notif.test.title': '[Teszt] Értesítés', + 'notif.test.simple.text': 'Ez egy egyszerű teszt értesítés.', + 'notif.test.boolean.text': 'Elfogadod ezt a teszt értesítést?', + 'notif.test.navigate.text': 'Kattints alább az irányítópultra navigáláshoz.', // Notifications 'notif.trip_invite.title': 'Utazásra meghívó', @@ -1670,8 +1670,8 @@ const hu: Record = { 'notif.action.decline': 'Elutasítás', 'notif.generic.title': 'Értesítés', 'notif.generic.text': 'Új értesítésed érkezett', - 'notif.dev.unknown_event.title': '[DEV] Unknown Event', - 'notif.dev.unknown_event.text': 'Event type "{event}" is not registered in EVENT_NOTIFICATION_CONFIG', + 'notif.dev.unknown_event.title': '[DEV] Ismeretlen esemény', + 'notif.dev.unknown_event.text': 'A(z) "{event}" eseménytípus nincs regisztrálva az EVENT_NOTIFICATION_CONFIG-ban', } export default hu diff --git a/client/src/i18n/translations/it.ts b/client/src/i18n/translations/it.ts index 38a2bbf..a2e1819 100644 --- a/client/src/i18n/translations/it.ts +++ b/client/src/i18n/translations/it.ts @@ -487,8 +487,8 @@ const it: Record = { 'admin.tabs.addons': 'Moduli', 'admin.addons.title': 'Moduli', 'admin.addons.subtitle': 'Abilita o disabilita le funzionalità per personalizzare la tua esperienza TREK.', - 'admin.addons.catalog.packing.name': 'Lists', - 'admin.addons.catalog.packing.description': 'Packing lists and to-do tasks for your trips', + 'admin.addons.catalog.packing.name': 'Liste', + 'admin.addons.catalog.packing.description': 'Liste di imballaggio e attività da svolgere per i tuoi viaggi', 'admin.addons.catalog.budget.name': 'Budget', 'admin.addons.catalog.budget.description': 'Tieni traccia delle spese e pianifica il budget del tuo viaggio', 'admin.addons.catalog.documents.name': 'Documenti', @@ -741,8 +741,8 @@ const it: Record = { 'trip.tabs.reservationsShort': 'Pren.', 'trip.tabs.packing': 'Lista valigia', 'trip.tabs.packingShort': 'Valigia', - 'trip.tabs.lists': 'Lists', - 'trip.tabs.listsShort': 'Lists', + 'trip.tabs.lists': 'Liste', + 'trip.tabs.listsShort': 'Liste', 'trip.tabs.budget': 'Budget', 'trip.tabs.files': 'File', 'trip.loading': 'Caricamento viaggio...', @@ -937,11 +937,11 @@ const it: Record = { 'reservations.linkAssignment': 'Collega all\'assegnazione del giorno', 'reservations.pickAssignment': 'Seleziona un\'assegnazione dal tuo programma...', 'reservations.noAssignment': 'Nessun collegamento (autonomo)', - 'reservations.price': 'Price', - 'reservations.budgetCategory': 'Budget category', - 'reservations.budgetCategoryPlaceholder': 'e.g. Transport, Accommodation', - 'reservations.budgetCategoryAuto': 'Auto (from booking type)', - 'reservations.budgetHint': 'A budget entry will be created automatically when saving.', + 'reservations.price': 'Prezzo', + 'reservations.budgetCategory': 'Categoria budget', + 'reservations.budgetCategoryPlaceholder': 'es. Trasporto, Alloggio', + 'reservations.budgetCategoryAuto': 'Auto (dal tipo di prenotazione)', + 'reservations.budgetHint': 'Una voce di budget verrà creata automaticamente al salvataggio.', 'reservations.departureDate': 'Partenza', 'reservations.arrivalDate': 'Arrivo', 'reservations.departureTime': 'Ora part.', @@ -1002,7 +1002,7 @@ const it: Record = { // Files 'files.title': 'File', 'files.count': '{count} file', - 'files.countSingular': '1 file', + 'files.countSingular': '1 documento', 'files.uploaded': '{count} caricati', 'files.uploadError': 'Caricamento non riuscito', 'files.dropzone': 'Trascina qui i file', @@ -1573,42 +1573,42 @@ const it: Record = { 'notifications.test.tripText': 'Notifica di test per il viaggio "{trip}".', // Todo - 'todo.subtab.packing': 'Packing List', - 'todo.subtab.todo': 'To-Do', - 'todo.completed': 'completed', - 'todo.filter.all': 'All', - 'todo.filter.open': 'Open', - 'todo.filter.done': 'Done', - 'todo.uncategorized': 'Uncategorized', - 'todo.namePlaceholder': 'Task name', - 'todo.descriptionPlaceholder': 'Description (optional)', - 'todo.unassigned': 'Unassigned', - 'todo.noCategory': 'No category', - 'todo.hasDescription': 'Has description', - 'todo.addItem': 'Add new task...', - 'todo.newCategory': 'Category name', - 'todo.addCategory': 'Add category', - 'todo.newItem': 'New task', - 'todo.empty': 'No tasks yet. Add a task to get started!', - 'todo.filter.my': 'My Tasks', - 'todo.filter.overdue': 'Overdue', - 'todo.sidebar.tasks': 'Tasks', - 'todo.sidebar.categories': 'Categories', - 'todo.detail.title': 'Task', - 'todo.detail.description': 'Description', - 'todo.detail.category': 'Category', - 'todo.detail.dueDate': 'Due date', - 'todo.detail.assignedTo': 'Assigned to', - 'todo.detail.delete': 'Delete', - 'todo.detail.save': 'Save changes', - 'todo.detail.create': 'Create task', - 'todo.detail.priority': 'Priority', - 'todo.detail.noPriority': 'None', - 'todo.sortByPrio': 'Priority', + 'todo.subtab.packing': 'Lista di imballaggio', + 'todo.subtab.todo': 'Da fare', + 'todo.completed': 'completato/i', + 'todo.filter.all': 'Tutti', + 'todo.filter.open': 'Aperto', + 'todo.filter.done': 'Fatto', + 'todo.uncategorized': 'Senza categoria', + 'todo.namePlaceholder': 'Nome attività', + 'todo.descriptionPlaceholder': 'Descrizione (facoltativa)', + 'todo.unassigned': 'Non assegnato', + 'todo.noCategory': 'Nessuna categoria', + 'todo.hasDescription': 'Ha descrizione', + 'todo.addItem': 'Aggiungi nuova attività...', + 'todo.newCategory': 'Nome categoria', + 'todo.addCategory': 'Aggiungi categoria', + 'todo.newItem': 'Nuova attività', + 'todo.empty': 'Nessuna attività ancora. Aggiungi un\'attività per iniziare!', + 'todo.filter.my': 'Le mie attività', + 'todo.filter.overdue': 'Scaduta', + 'todo.sidebar.tasks': 'Attività', + 'todo.sidebar.categories': 'Categorie', + 'todo.detail.title': 'Attività', + 'todo.detail.description': 'Descrizione', + 'todo.detail.category': 'Categoria', + 'todo.detail.dueDate': 'Scadenza', + 'todo.detail.assignedTo': 'Assegnato a', + 'todo.detail.delete': 'Elimina', + 'todo.detail.save': 'Salva modifiche', + 'todo.detail.create': 'Crea attività', + 'todo.detail.priority': 'Priorità', + 'todo.detail.noPriority': 'Nessuna', + 'todo.sortByPrio': 'Priorità', // Notification system (added from feat/notification-system) - 'settings.notifyVersionAvailable': 'New version available', - 'settings.notificationPreferences.noChannels': 'No notification channels are configured. Ask an admin to set up email or webhook notifications.', + 'settings.notifyVersionAvailable': 'Nuova versione disponibile', + 'settings.notificationPreferences.noChannels': 'Nessun canale di notifica configurato. Chiedi a un amministratore di configurare notifiche via e-mail o webhook.', 'settings.webhookUrl.label': 'URL webhook', 'settings.webhookUrl.placeholder': 'https://discord.com/api/webhooks/...', 'settings.webhookUrl.hint': 'Inserisci il tuo URL webhook Discord, Slack o personalizzato per ricevere notifiche.', @@ -1623,7 +1623,7 @@ const it: Record = { 'admin.notifications.emailPanel.title': 'Email (SMTP)', 'admin.notifications.webhookPanel.title': 'Webhook', 'admin.notifications.inappPanel.title': 'In-App', - 'admin.notifications.inappPanel.hint': 'In-app notifications are always active and cannot be disabled globally.', + 'admin.notifications.inappPanel.hint': 'Le notifiche in-app sono sempre attive e non possono essere disabilitate globalmente.', 'admin.notifications.adminWebhookPanel.title': 'Webhook admin', 'admin.notifications.adminWebhookPanel.hint': 'Questo webhook viene usato esclusivamente per le notifiche admin (es. avvisi di versione). È separato dai webhook utente e si attiva automaticamente quando è configurato un URL.', 'admin.notifications.adminWebhookPanel.saved': 'URL webhook admin salvato', @@ -1634,13 +1634,13 @@ const it: Record = { 'admin.tabs.notifications': 'Notifications', 'admin.tabs.notificationChannels': 'Canali di notifica', 'admin.tabs.adminNotifications': 'Notifiche admin', - 'notifications.versionAvailable.title': 'Update Available', - 'notifications.versionAvailable.text': 'TREK {version} is now available.', - 'notifications.versionAvailable.button': 'View Details', - 'notif.test.title': '[Test] Notification', - 'notif.test.simple.text': 'This is a simple test notification.', - 'notif.test.boolean.text': 'Do you accept this test notification?', - 'notif.test.navigate.text': 'Click below to navigate to the dashboard.', + 'notifications.versionAvailable.title': 'Aggiornamento disponibile', + 'notifications.versionAvailable.text': 'TREK {version} è ora disponibile.', + 'notifications.versionAvailable.button': 'Visualizza dettagli', + 'notif.test.title': '[Test] Notifica', + 'notif.test.simple.text': 'Questa è una semplice notifica di test.', + 'notif.test.boolean.text': 'Accetti questa notifica di test?', + 'notif.test.navigate.text': 'Clicca qui sotto per accedere alla dashboard.', // Notifications 'notif.trip_invite.title': 'Invito al viaggio', @@ -1670,8 +1670,8 @@ const it: Record = { 'notif.action.decline': 'Rifiuta', 'notif.generic.title': 'Notifica', 'notif.generic.text': 'Hai una nuova notifica', - 'notif.dev.unknown_event.title': '[DEV] Unknown Event', - 'notif.dev.unknown_event.text': 'Event type "{event}" is not registered in EVENT_NOTIFICATION_CONFIG', + 'notif.dev.unknown_event.title': '[DEV] Evento sconosciuto', + 'notif.dev.unknown_event.text': 'Il tipo di evento "{event}" non è registrato in EVENT_NOTIFICATION_CONFIG', } export default it diff --git a/client/src/i18n/translations/nl.ts b/client/src/i18n/translations/nl.ts index d2889a2..098d0d2 100644 --- a/client/src/i18n/translations/nl.ts +++ b/client/src/i18n/translations/nl.ts @@ -492,8 +492,8 @@ const nl: Record = { 'admin.addons.catalog.memories.description': 'Deel reisfoto\'s via je Immich-instantie', 'admin.addons.catalog.mcp.name': 'MCP', 'admin.addons.catalog.mcp.description': 'Model Context Protocol voor AI-assistent integratie', - 'admin.addons.catalog.packing.name': 'Lists', - 'admin.addons.catalog.packing.description': 'Packing lists and to-do tasks for your trips', + 'admin.addons.catalog.packing.name': 'Lijsten', + 'admin.addons.catalog.packing.description': 'Paklijsten en to-dotaken voor je reizen', 'admin.addons.catalog.budget.name': 'Budget', 'admin.addons.catalog.budget.description': 'Houd uitgaven bij en plan je reisbudget', 'admin.addons.catalog.documents.name': 'Documenten', @@ -740,8 +740,8 @@ const nl: Record = { 'trip.tabs.reservationsShort': 'Boek', 'trip.tabs.packing': 'Paklijst', 'trip.tabs.packingShort': 'Inpakken', - 'trip.tabs.lists': 'Lists', - 'trip.tabs.listsShort': 'Lists', + 'trip.tabs.lists': 'Lijsten', + 'trip.tabs.listsShort': 'Lijsten', 'trip.tabs.budget': 'Budget', 'trip.tabs.files': 'Bestanden', 'trip.loading': 'Reis laden...', @@ -936,11 +936,11 @@ const nl: Record = { 'reservations.linkAssignment': 'Koppelen aan dagtoewijzing', 'reservations.pickAssignment': 'Selecteer een toewijzing uit je plan...', 'reservations.noAssignment': 'Geen koppeling (zelfstandig)', - 'reservations.price': 'Price', - 'reservations.budgetCategory': 'Budget category', - 'reservations.budgetCategoryPlaceholder': 'e.g. Transport, Accommodation', - 'reservations.budgetCategoryAuto': 'Auto (from booking type)', - 'reservations.budgetHint': 'A budget entry will be created automatically when saving.', + 'reservations.price': 'Prijs', + 'reservations.budgetCategory': 'Budgetcategorie', + 'reservations.budgetCategoryPlaceholder': 'bijv. Transport, Accommodatie', + 'reservations.budgetCategoryAuto': 'Automatisch (op basis van boekingstype)', + 'reservations.budgetHint': 'Er wordt automatisch een budgetpost aangemaakt bij het opslaan.', 'reservations.departureDate': 'Vertrek', 'reservations.arrivalDate': 'Aankomst', 'reservations.departureTime': 'Vertrektijd', @@ -1406,7 +1406,7 @@ const nl: Record = { // Collab Addon 'collab.tabs.chat': 'Chat', 'collab.tabs.notes': 'Notities', - 'collab.tabs.polls': 'Polls', + 'collab.tabs.polls': 'Peilingen', 'collab.whatsNext.title': 'Wat komt er', 'collab.whatsNext.today': 'Vandaag', 'collab.whatsNext.tomorrow': 'Morgen', @@ -1452,7 +1452,7 @@ const nl: Record = { 'collab.notes.attachFiles': 'Bestanden bijvoegen', 'collab.notes.noCategoriesYet': 'Nog geen categorieën', 'collab.notes.emptyDesc': 'Maak een notitie om te beginnen', - 'collab.polls.title': 'Polls', + 'collab.polls.title': 'Peilingen', 'collab.polls.new': 'Nieuwe poll', 'collab.polls.empty': 'Nog geen polls', 'collab.polls.emptyHint': 'Stel de groep een vraag en stem samen', @@ -1572,42 +1572,42 @@ const nl: Record = { 'notifications.test.tripText': 'Testmelding voor reis "{trip}".', // Todo - 'todo.subtab.packing': 'Packing List', - 'todo.subtab.todo': 'To-Do', - 'todo.completed': 'completed', - 'todo.filter.all': 'All', + 'todo.subtab.packing': 'Paklijst', + 'todo.subtab.todo': 'Taken', + 'todo.completed': 'voltooid', + 'todo.filter.all': 'Alles', 'todo.filter.open': 'Open', - 'todo.filter.done': 'Done', - 'todo.uncategorized': 'Uncategorized', - 'todo.namePlaceholder': 'Task name', - 'todo.descriptionPlaceholder': 'Description (optional)', - 'todo.unassigned': 'Unassigned', - 'todo.noCategory': 'No category', - 'todo.hasDescription': 'Has description', - 'todo.addItem': 'Add new task...', - 'todo.newCategory': 'Category name', - 'todo.addCategory': 'Add category', - 'todo.newItem': 'New task', - 'todo.empty': 'No tasks yet. Add a task to get started!', - 'todo.filter.my': 'My Tasks', - 'todo.filter.overdue': 'Overdue', - 'todo.sidebar.tasks': 'Tasks', - 'todo.sidebar.categories': 'Categories', - 'todo.detail.title': 'Task', - 'todo.detail.description': 'Description', - 'todo.detail.category': 'Category', - 'todo.detail.dueDate': 'Due date', - 'todo.detail.assignedTo': 'Assigned to', - 'todo.detail.delete': 'Delete', - 'todo.detail.save': 'Save changes', - 'todo.detail.create': 'Create task', - 'todo.detail.priority': 'Priority', - 'todo.detail.noPriority': 'None', - 'todo.sortByPrio': 'Priority', + 'todo.filter.done': 'Klaar', + 'todo.uncategorized': 'Zonder categorie', + 'todo.namePlaceholder': 'Taaknaam', + 'todo.descriptionPlaceholder': 'Beschrijving (optioneel)', + 'todo.unassigned': 'Niet toegewezen', + 'todo.noCategory': 'Geen categorie', + 'todo.hasDescription': 'Heeft beschrijving', + 'todo.addItem': 'Nieuwe taak toevoegen...', + 'todo.newCategory': 'Categorienaam', + 'todo.addCategory': 'Categorie toevoegen', + 'todo.newItem': 'Nieuwe taak', + 'todo.empty': 'Nog geen taken. Voeg een taak toe om te beginnen!', + 'todo.filter.my': 'Mijn taken', + 'todo.filter.overdue': 'Verlopen', + 'todo.sidebar.tasks': 'Taken', + 'todo.sidebar.categories': 'Categorieën', + 'todo.detail.title': 'Taak', + 'todo.detail.description': 'Beschrijving', + 'todo.detail.category': 'Categorie', + 'todo.detail.dueDate': 'Vervaldatum', + 'todo.detail.assignedTo': 'Toegewezen aan', + 'todo.detail.delete': 'Verwijderen', + 'todo.detail.save': 'Wijzigingen opslaan', + 'todo.detail.create': 'Taak aanmaken', + 'todo.detail.priority': 'Prioriteit', + 'todo.detail.noPriority': 'Geen', + 'todo.sortByPrio': 'Prioriteit', // Notification system (added from feat/notification-system) - 'settings.notifyVersionAvailable': 'New version available', - 'settings.notificationPreferences.noChannels': 'No notification channels are configured. Ask an admin to set up email or webhook notifications.', + 'settings.notifyVersionAvailable': 'Nieuwe versie beschikbaar', + 'settings.notificationPreferences.noChannels': 'Er zijn geen meldingskanalen geconfigureerd. Vraag een beheerder om e-mail- of webhookmeldingen in te stellen.', 'settings.webhookUrl.label': 'Webhook-URL', 'settings.webhookUrl.placeholder': 'https://discord.com/api/webhooks/...', 'settings.webhookUrl.hint': 'Voer je Discord-, Slack- of aangepaste webhook-URL in om meldingen te ontvangen.', @@ -1622,7 +1622,7 @@ const nl: Record = { 'admin.notifications.emailPanel.title': 'Email (SMTP)', 'admin.notifications.webhookPanel.title': 'Webhook', 'admin.notifications.inappPanel.title': 'In-App', - 'admin.notifications.inappPanel.hint': 'In-app notifications are always active and cannot be disabled globally.', + 'admin.notifications.inappPanel.hint': 'In-app-meldingen zijn altijd actief en kunnen niet globaal worden uitgeschakeld.', 'admin.notifications.adminWebhookPanel.title': 'Admin-webhook', 'admin.notifications.adminWebhookPanel.hint': 'Deze webhook wordt uitsluitend gebruikt voor admin-meldingen (bijv. versie-updates). Hij staat los van gebruikerswebhooks en verstuurt automatisch als er een URL is ingesteld.', 'admin.notifications.adminWebhookPanel.saved': 'Admin-webhook-URL opgeslagen', @@ -1630,16 +1630,16 @@ const nl: Record = { 'admin.notifications.adminWebhookPanel.testFailed': 'Test-webhook mislukt', 'admin.notifications.adminWebhookPanel.alwaysOnHint': 'Admin-webhook verstuurt automatisch als er een URL is ingesteld', 'admin.notifications.adminNotificationsHint': 'Stel in via welke kanalen admin-meldingen worden bezorgd (bijv. versie-updates). De webhook verstuurt automatisch als er een admin-webhook-URL is ingesteld.', - 'admin.tabs.notifications': 'Notifications', + 'admin.tabs.notifications': 'Meldingen', 'admin.tabs.notificationChannels': 'Meldingskanalen', 'admin.tabs.adminNotifications': 'Admin-meldingen', - 'notifications.versionAvailable.title': 'Update Available', - 'notifications.versionAvailable.text': 'TREK {version} is now available.', - 'notifications.versionAvailable.button': 'View Details', - 'notif.test.title': '[Test] Notification', - 'notif.test.simple.text': 'This is a simple test notification.', - 'notif.test.boolean.text': 'Do you accept this test notification?', - 'notif.test.navigate.text': 'Click below to navigate to the dashboard.', + 'notifications.versionAvailable.title': 'Update beschikbaar', + 'notifications.versionAvailable.text': 'TREK {version} is nu beschikbaar.', + 'notifications.versionAvailable.button': 'Details bekijken', + 'notif.test.title': '[Test] Melding', + 'notif.test.simple.text': 'Dit is een eenvoudige testmelding.', + 'notif.test.boolean.text': 'Accepteer je deze testmelding?', + 'notif.test.navigate.text': 'Klik hieronder om naar het dashboard te gaan.', // Notifications 'notif.trip_invite.title': 'Reisuitnodiging', @@ -1669,8 +1669,8 @@ const nl: Record = { 'notif.action.decline': 'Weigeren', 'notif.generic.title': 'Melding', 'notif.generic.text': 'Je hebt een nieuwe melding', - 'notif.dev.unknown_event.title': '[DEV] Unknown Event', - 'notif.dev.unknown_event.text': 'Event type "{event}" is not registered in EVENT_NOTIFICATION_CONFIG', + 'notif.dev.unknown_event.title': '[DEV] Onbekende gebeurtenis', + 'notif.dev.unknown_event.text': 'Gebeurtenistype "{event}" is niet geregistreerd in EVENT_NOTIFICATION_CONFIG', } export default nl diff --git a/client/src/i18n/translations/pl.ts b/client/src/i18n/translations/pl.ts index e8f65bd..ca58b11 100644 --- a/client/src/i18n/translations/pl.ts +++ b/client/src/i18n/translations/pl.ts @@ -149,7 +149,7 @@ const pl: Record = { 'settings.notifyCollabMessage': 'Wiadomości czatu (Collab)', 'settings.notifyPackingTagged': 'Lista pakowania: przypisania', 'settings.notifyWebhook': 'Powiadomienia Webhook', - 'settings.notifyVersionAvailable': 'New version available', + 'settings.notifyVersionAvailable': 'Nowa wersja dostępna', 'admin.smtp.title': 'E-maile i powiadomienia', 'admin.smtp.hint': 'Konfiguracja SMTP dla powiadomień e-mail. Opcjonalnie: URL Webhooka dla Discorda, Slacka, itp.', 'admin.smtp.testButton': 'Wyślij testowego e-maila', @@ -350,7 +350,7 @@ const pl: Record = { 'admin.tabs.users': 'Użytkownicy', 'admin.tabs.categories': 'Kategorie', 'admin.tabs.backup': 'Backupy', - 'admin.tabs.notifications': 'Notifications', + 'admin.tabs.notifications': 'Powiadomienia', 'admin.tabs.notificationChannels': 'Kanały powiadomień', 'admin.tabs.adminNotifications': 'Powiadomienia admina', 'admin.tabs.audit': 'Aktywność', @@ -459,8 +459,8 @@ const pl: Record = { 'admin.tabs.addons': 'Dodatki', 'admin.addons.title': 'Dodatki', 'admin.addons.subtitle': 'Włączaj lub wyłączaj funkcje, aby dostosować swoje doświadczenie w TREK.', - 'admin.addons.catalog.packing.name': 'Lists', - 'admin.addons.catalog.packing.description': 'Packing lists and to-do tasks for your trips', + 'admin.addons.catalog.packing.name': 'Listy', + 'admin.addons.catalog.packing.description': 'Listy pakowania i zadania do wykonania dla Twoich podróży', 'admin.addons.catalog.budget.name': 'Budżet', 'admin.addons.catalog.budget.description': 'Śledź wydatki i planuj budżet podróży', 'admin.addons.catalog.documents.name': 'Dokumenty', @@ -476,7 +476,7 @@ const pl: Record = { 'admin.addons.catalog.mcp.name': 'MCP', 'admin.addons.catalog.mcp.description': 'Model Context Protocol dla integracji asystenta AI', 'admin.addons.subtitleBefore': 'Włączaj lub wyłączaj funkcje, aby dostosować swoje doświadczenie w ', - 'admin.addons.subtitleAfter': '', + 'admin.addons.subtitleAfter': '.', 'admin.addons.enabled': 'Włączone', 'admin.addons.disabled': 'Wyłączone', 'admin.addons.type.trip': 'Podróż', @@ -707,8 +707,8 @@ const pl: Record = { 'trip.tabs.reservationsShort': 'Rezerwacje', 'trip.tabs.packing': 'Lista pakowania', 'trip.tabs.packingShort': 'Pakowanie', - 'trip.tabs.lists': 'Lists', - 'trip.tabs.listsShort': 'Lists', + 'trip.tabs.lists': 'Listy', + 'trip.tabs.listsShort': 'Listy', 'trip.tabs.budget': 'Budżet', 'trip.tabs.files': 'Pliki', 'trip.loading': 'Ładowanie podróży...', @@ -896,11 +896,11 @@ const pl: Record = { 'reservations.linkAssignment': 'Przypisz do miejsca', 'reservations.pickAssignment': 'Wybierz miejsce z planu...', 'reservations.noAssignment': 'Brak przypisania (samodzielna)', - 'reservations.price': 'Price', - 'reservations.budgetCategory': 'Budget category', - 'reservations.budgetCategoryPlaceholder': 'e.g. Transport, Accommodation', - 'reservations.budgetCategoryAuto': 'Auto (from booking type)', - 'reservations.budgetHint': 'A budget entry will be created automatically when saving.', + 'reservations.price': 'Cena', + 'reservations.budgetCategory': 'Kategoria budżetu', + 'reservations.budgetCategoryPlaceholder': 'np. Transport, Zakwaterowanie', + 'reservations.budgetCategoryAuto': 'Auto (na podstawie typu rezerwacji)', + 'reservations.budgetHint': 'Wpis budżetowy zostanie automatycznie utworzony podczas zapisywania.', 'reservations.departureDate': 'Wylot', 'reservations.arrivalDate': 'Przylot', 'reservations.departureTime': 'Godz. wylotu', @@ -1452,7 +1452,7 @@ const pl: Record = { 'admin.notifications.emailPanel.title': 'Email (SMTP)', 'admin.notifications.webhookPanel.title': 'Webhook', 'admin.notifications.inappPanel.title': 'In-App', - 'admin.notifications.inappPanel.hint': 'In-app notifications are always active and cannot be disabled globally.', + 'admin.notifications.inappPanel.hint': 'Powiadomienia w aplikacji są zawsze aktywne i nie można ich globalnie wyłączyć.', 'admin.notifications.adminWebhookPanel.title': 'Webhook admina', 'admin.notifications.adminWebhookPanel.hint': 'Ten webhook służy wyłącznie do powiadomień admina (np. alertów o nowych wersjach). Jest niezależny od webhooków użytkowników i wysyła automatycznie, gdy URL jest skonfigurowany.', 'admin.notifications.adminWebhookPanel.saved': 'URL webhooka admina zapisany', @@ -1462,7 +1462,7 @@ const pl: Record = { 'admin.notifications.adminNotificationsHint': 'Skonfiguruj, które kanały dostarczają powiadomienia admina (np. alerty o wersjach). Webhook wysyła automatycznie, gdy ustawiony jest URL webhooka admina.', 'admin.webhook.hint': 'Pozwól użytkownikom konfigurować własne adresy URL webhooka dla powiadomień (Discord, Slack itp.).', 'settings.notificationsDisabled': 'Powiadomienia nie są skonfigurowane.', - 'settings.notificationPreferences.noChannels': 'No notification channels are configured. Ask an admin to set up email or webhook notifications.', + 'settings.notificationPreferences.noChannels': 'Brak skonfigurowanych kanałów powiadomień. Poproś administratora o skonfigurowanie powiadomień e-mail lub webhook.', 'settings.webhookUrl.label': 'URL webhooka', 'settings.webhookUrl.placeholder': 'https://discord.com/api/webhooks/...', 'settings.webhookUrl.hint': 'Wprowadź adres URL webhooka Discord, Slack lub własnego, aby otrzymywać powiadomienia.', @@ -1570,16 +1570,16 @@ const pl: Record = { 'notifications.deleteAll': 'Usuń wszystkie', 'notifications.showAll': 'Pokaż wszystkie', 'notifications.empty': 'Brak powiadomień', - 'notifications.emptyDescription': "You're all caught up!", + 'notifications.emptyDescription': 'Jesteś na bieżąco!', 'notifications.all': 'Wszystkie', 'notifications.unreadOnly': 'Nieprzeczytane', 'notifications.markRead': 'Oznacz jako przeczytane', 'notifications.markUnread': 'Oznacz jako nieprzeczytane', 'notifications.delete': 'Usuń', 'notifications.system': 'System', - 'notifications.versionAvailable.title': 'Update Available', - 'notifications.versionAvailable.text': 'TREK {version} is now available.', - 'notifications.versionAvailable.button': 'View Details', + 'notifications.versionAvailable.title': 'Dostępna aktualizacja', + 'notifications.versionAvailable.text': 'TREK {version} jest już dostępny.', + 'notifications.versionAvailable.button': 'Zobacz szczegóły', 'notifications.test.title': 'Testowe powiadomienie od {actor}', 'notifications.test.text': 'To jest powiadomienie testowe.', 'notifications.test.booleanTitle': '{actor} prosi o akceptację', @@ -1595,44 +1595,44 @@ const pl: Record = { 'notifications.test.tripText': 'Testowe powiadomienie dla podróży "{trip}".', // Todo - 'todo.subtab.packing': 'Packing List', - 'todo.subtab.todo': 'To-Do', - 'todo.completed': 'completed', - 'todo.filter.all': 'All', - 'todo.filter.open': 'Open', - 'todo.filter.done': 'Done', - 'todo.uncategorized': 'Uncategorized', - 'todo.namePlaceholder': 'Task name', - 'todo.descriptionPlaceholder': 'Description (optional)', - 'todo.unassigned': 'Unassigned', - 'todo.noCategory': 'No category', - 'todo.hasDescription': 'Has description', - 'todo.addItem': 'Add new task...', - 'todo.newCategory': 'Category name', - 'todo.addCategory': 'Add category', - 'todo.newItem': 'New task', - 'todo.empty': 'No tasks yet. Add a task to get started!', - 'todo.filter.my': 'My Tasks', - 'todo.filter.overdue': 'Overdue', - 'todo.sidebar.tasks': 'Tasks', - 'todo.sidebar.categories': 'Categories', - 'todo.detail.title': 'Task', - 'todo.detail.description': 'Description', - 'todo.detail.category': 'Category', - 'todo.detail.dueDate': 'Due date', - 'todo.detail.assignedTo': 'Assigned to', - 'todo.detail.delete': 'Delete', - 'todo.detail.save': 'Save changes', - 'todo.detail.create': 'Create task', - 'todo.detail.priority': 'Priority', - 'todo.detail.noPriority': 'None', - 'todo.sortByPrio': 'Priority', + 'todo.subtab.packing': 'Lista pakowania', + 'todo.subtab.todo': 'Do zrobienia', + 'todo.completed': 'ukończono', + 'todo.filter.all': 'Wszystkie', + 'todo.filter.open': 'Otwarte', + 'todo.filter.done': 'Gotowe', + 'todo.uncategorized': 'Bez kategorii', + 'todo.namePlaceholder': 'Nazwa zadania', + 'todo.descriptionPlaceholder': 'Opis (opcjonalnie)', + 'todo.unassigned': 'Nieprzypisane', + 'todo.noCategory': 'Brak kategorii', + 'todo.hasDescription': 'Ma opis', + 'todo.addItem': 'Dodaj nowe zadanie...', + 'todo.newCategory': 'Nazwa kategorii', + 'todo.addCategory': 'Dodaj kategorię', + 'todo.newItem': 'Nowe zadanie', + 'todo.empty': 'Brak zadań. Dodaj zadanie, aby zacząć!', + 'todo.filter.my': 'Moje zadania', + 'todo.filter.overdue': 'Przeterminowane', + 'todo.sidebar.tasks': 'Zadania', + 'todo.sidebar.categories': 'Kategorie', + 'todo.detail.title': 'Zadanie', + 'todo.detail.description': 'Opis', + 'todo.detail.category': 'Kategoria', + 'todo.detail.dueDate': 'Termin', + 'todo.detail.assignedTo': 'Przypisano do', + 'todo.detail.delete': 'Usuń', + 'todo.detail.save': 'Zapisz zmiany', + 'todo.detail.create': 'Utwórz zadanie', + 'todo.detail.priority': 'Priorytet', + 'todo.detail.noPriority': 'Brak', + 'todo.sortByPrio': 'Priorytet', // Notifications — dev test events - 'notif.test.title': '[Test] Notification', - 'notif.test.simple.text': 'This is a simple test notification.', - 'notif.test.boolean.text': 'Do you accept this test notification?', - 'notif.test.navigate.text': 'Click below to navigate to the dashboard.', + 'notif.test.title': '[Test] Powiadomienie', + 'notif.test.simple.text': 'To jest proste powiadomienie testowe.', + 'notif.test.boolean.text': 'Czy akceptujesz to powiadomienie testowe?', + 'notif.test.navigate.text': 'Kliknij poniżej, aby przejść do pulpitu.', // Notifications 'notif.trip_invite.title': 'Zaproszenie do podróży', @@ -1662,8 +1662,8 @@ const pl: Record = { 'notif.action.decline': 'Odrzuć', 'notif.generic.title': 'Powiadomienie', 'notif.generic.text': 'Masz nowe powiadomienie', - 'notif.dev.unknown_event.title': '[DEV] Unknown Event', - 'notif.dev.unknown_event.text': 'Event type "{event}" is not registered in EVENT_NOTIFICATION_CONFIG', + 'notif.dev.unknown_event.title': '[DEV] Nieznane zdarzenie', + 'notif.dev.unknown_event.text': 'Typ zdarzenia "{event}" nie jest zarejestrowany w EVENT_NOTIFICATION_CONFIG', } export default pl diff --git a/client/src/i18n/translations/ru.ts b/client/src/i18n/translations/ru.ts index 7d0f79f..118e8de 100644 --- a/client/src/i18n/translations/ru.ts +++ b/client/src/i18n/translations/ru.ts @@ -492,8 +492,8 @@ const ru: Record = { 'admin.addons.catalog.memories.description': 'Делитесь фотографиями из поездок через Immich', 'admin.addons.catalog.mcp.name': 'MCP', 'admin.addons.catalog.mcp.description': 'Протокол контекста модели для интеграции с ИИ-ассистентами', - 'admin.addons.catalog.packing.name': 'Lists', - 'admin.addons.catalog.packing.description': 'Packing lists and to-do tasks for your trips', + 'admin.addons.catalog.packing.name': 'Списки', + 'admin.addons.catalog.packing.description': 'Списки вещей и задачи для ваших поездок', 'admin.addons.catalog.budget.name': 'Бюджет', 'admin.addons.catalog.budget.description': 'Отслеживайте расходы и планируйте бюджет поездки', 'admin.addons.catalog.documents.name': 'Документы', @@ -740,8 +740,8 @@ const ru: Record = { 'trip.tabs.reservationsShort': 'Брони', 'trip.tabs.packing': 'Список вещей', 'trip.tabs.packingShort': 'Вещи', - 'trip.tabs.lists': 'Lists', - 'trip.tabs.listsShort': 'Lists', + 'trip.tabs.lists': 'Списки', + 'trip.tabs.listsShort': 'Списки', 'trip.tabs.budget': 'Бюджет', 'trip.tabs.files': 'Файлы', 'trip.loading': 'Загрузка поездки...', @@ -936,11 +936,11 @@ const ru: Record = { 'reservations.linkAssignment': 'Привязать к назначению дня', 'reservations.pickAssignment': 'Выберите назначение из вашего плана...', 'reservations.noAssignment': 'Без привязки (самостоятельное)', - 'reservations.price': 'Price', - 'reservations.budgetCategory': 'Budget category', - 'reservations.budgetCategoryPlaceholder': 'e.g. Transport, Accommodation', - 'reservations.budgetCategoryAuto': 'Auto (from booking type)', - 'reservations.budgetHint': 'A budget entry will be created automatically when saving.', + 'reservations.price': 'Цена', + 'reservations.budgetCategory': 'Категория бюджета', + 'reservations.budgetCategoryPlaceholder': 'напр. Транспорт, Проживание', + 'reservations.budgetCategoryAuto': 'Авто (по типу бронирования)', + 'reservations.budgetHint': 'При сохранении будет автоматически создана запись бюджета.', 'reservations.departureDate': 'Вылет', 'reservations.arrivalDate': 'Прилёт', 'reservations.departureTime': 'Время вылета', @@ -1572,42 +1572,42 @@ const ru: Record = { 'notifications.test.tripText': 'Тестовое уведомление для поездки "{trip}".', // Todo - 'todo.subtab.packing': 'Packing List', - 'todo.subtab.todo': 'To-Do', - 'todo.completed': 'completed', - 'todo.filter.all': 'All', - 'todo.filter.open': 'Open', - 'todo.filter.done': 'Done', - 'todo.uncategorized': 'Uncategorized', - 'todo.namePlaceholder': 'Task name', - 'todo.descriptionPlaceholder': 'Description (optional)', - 'todo.unassigned': 'Unassigned', - 'todo.noCategory': 'No category', - 'todo.hasDescription': 'Has description', - 'todo.addItem': 'Add new task...', - 'todo.newCategory': 'Category name', - 'todo.addCategory': 'Add category', - 'todo.newItem': 'New task', - 'todo.empty': 'No tasks yet. Add a task to get started!', - 'todo.filter.my': 'My Tasks', - 'todo.filter.overdue': 'Overdue', - 'todo.sidebar.tasks': 'Tasks', - 'todo.sidebar.categories': 'Categories', - 'todo.detail.title': 'Task', - 'todo.detail.description': 'Description', - 'todo.detail.category': 'Category', - 'todo.detail.dueDate': 'Due date', - 'todo.detail.assignedTo': 'Assigned to', - 'todo.detail.delete': 'Delete', - 'todo.detail.save': 'Save changes', - 'todo.detail.create': 'Create task', - 'todo.detail.priority': 'Priority', - 'todo.detail.noPriority': 'None', - 'todo.sortByPrio': 'Priority', + 'todo.subtab.packing': 'Список вещей', + 'todo.subtab.todo': 'Задачи', + 'todo.completed': 'выполнено', + 'todo.filter.all': 'Все', + 'todo.filter.open': 'Открытые', + 'todo.filter.done': 'Выполненные', + 'todo.uncategorized': 'Без категории', + 'todo.namePlaceholder': 'Название задачи', + 'todo.descriptionPlaceholder': 'Описание (необязательно)', + 'todo.unassigned': 'Не назначено', + 'todo.noCategory': 'Без категории', + 'todo.hasDescription': 'Есть описание', + 'todo.addItem': 'Добавить новую задачу...', + 'todo.newCategory': 'Название категории', + 'todo.addCategory': 'Добавить категорию', + 'todo.newItem': 'Новая задача', + 'todo.empty': 'Задач пока нет. Добавьте задачу, чтобы начать!', + 'todo.filter.my': 'Мои задачи', + 'todo.filter.overdue': 'Просроченные', + 'todo.sidebar.tasks': 'Задачи', + 'todo.sidebar.categories': 'Категории', + 'todo.detail.title': 'Задача', + 'todo.detail.description': 'Описание', + 'todo.detail.category': 'Категория', + 'todo.detail.dueDate': 'Срок выполнения', + 'todo.detail.assignedTo': 'Назначено', + 'todo.detail.delete': 'Удалить', + 'todo.detail.save': 'Сохранить изменения', + 'todo.detail.create': 'Создать задачу', + 'todo.detail.priority': 'Приоритет', + 'todo.detail.noPriority': 'Нет', + 'todo.sortByPrio': 'Приоритет', // Notification system (added from feat/notification-system) - 'settings.notifyVersionAvailable': 'New version available', - 'settings.notificationPreferences.noChannels': 'No notification channels are configured. Ask an admin to set up email or webhook notifications.', + 'settings.notifyVersionAvailable': 'Доступна новая версия', + 'settings.notificationPreferences.noChannels': 'Каналы уведомлений не настроены. Попросите администратора настроить уведомления по электронной почте или через webhook.', 'settings.webhookUrl.label': 'URL вебхука', 'settings.webhookUrl.placeholder': 'https://discord.com/api/webhooks/...', 'settings.webhookUrl.hint': 'Введите URL вашего вебхука Discord, Slack или пользовательского для получения уведомлений.', @@ -1622,7 +1622,7 @@ const ru: Record = { 'admin.notifications.emailPanel.title': 'Email (SMTP)', 'admin.notifications.webhookPanel.title': 'Webhook', 'admin.notifications.inappPanel.title': 'In-App', - 'admin.notifications.inappPanel.hint': 'In-app notifications are always active and cannot be disabled globally.', + 'admin.notifications.inappPanel.hint': 'Уведомления в приложении всегда активны и не могут быть отключены глобально.', 'admin.notifications.adminWebhookPanel.title': 'Вебхук администратора', 'admin.notifications.adminWebhookPanel.hint': 'Этот вебхук используется исключительно для уведомлений администратора (например, оповещения о версиях). Он независим от пользовательских вебхуков и отправляется автоматически при наличии URL.', 'admin.notifications.adminWebhookPanel.saved': 'URL вебхука администратора сохранён', @@ -1630,16 +1630,16 @@ const ru: Record = { 'admin.notifications.adminWebhookPanel.testFailed': 'Ошибка тестового вебхука', 'admin.notifications.adminWebhookPanel.alwaysOnHint': 'Вебхук администратора отправляется автоматически при наличии URL', 'admin.notifications.adminNotificationsHint': 'Настройте, какие каналы доставляют уведомления администратора (например, оповещения о версиях). Вебхук отправляется автоматически, если задан URL вебхука администратора.', - 'admin.tabs.notifications': 'Notifications', + 'admin.tabs.notifications': 'Уведомления', 'admin.tabs.notificationChannels': 'Каналы уведомлений', 'admin.tabs.adminNotifications': 'Уведомления администратора', - 'notifications.versionAvailable.title': 'Update Available', - 'notifications.versionAvailable.text': 'TREK {version} is now available.', - 'notifications.versionAvailable.button': 'View Details', - 'notif.test.title': '[Test] Notification', - 'notif.test.simple.text': 'This is a simple test notification.', - 'notif.test.boolean.text': 'Do you accept this test notification?', - 'notif.test.navigate.text': 'Click below to navigate to the dashboard.', + 'notifications.versionAvailable.title': 'Доступно обновление', + 'notifications.versionAvailable.text': 'TREK {version} теперь доступен.', + 'notifications.versionAvailable.button': 'Подробнее', + 'notif.test.title': '[Тест] Уведомление', + 'notif.test.simple.text': 'Это простое тестовое уведомление.', + 'notif.test.boolean.text': 'Вы принимаете это тестовое уведомление?', + 'notif.test.navigate.text': 'Нажмите ниже для перехода на панель управления.', // Notifications 'notif.trip_invite.title': 'Приглашение в поездку', @@ -1669,8 +1669,8 @@ const ru: Record = { 'notif.action.decline': 'Отклонить', 'notif.generic.title': 'Уведомление', 'notif.generic.text': 'У вас новое уведомление', - 'notif.dev.unknown_event.title': '[DEV] Unknown Event', - 'notif.dev.unknown_event.text': 'Event type "{event}" is not registered in EVENT_NOTIFICATION_CONFIG', + 'notif.dev.unknown_event.title': '[DEV] Неизвестное событие', + 'notif.dev.unknown_event.text': 'Тип события "{event}" не зарегистрирован в EVENT_NOTIFICATION_CONFIG', } export default ru diff --git a/client/src/i18n/translations/zh.ts b/client/src/i18n/translations/zh.ts index dea8863..1ba8d42 100644 --- a/client/src/i18n/translations/zh.ts +++ b/client/src/i18n/translations/zh.ts @@ -492,8 +492,8 @@ const zh: Record = { 'admin.addons.catalog.memories.description': '通过 Immich 实例分享旅行照片', 'admin.addons.catalog.mcp.name': 'MCP', 'admin.addons.catalog.mcp.description': '用于 AI 助手集成的模型上下文协议', - 'admin.addons.catalog.packing.name': 'Lists', - 'admin.addons.catalog.packing.description': 'Packing lists and to-do tasks for your trips', + 'admin.addons.catalog.packing.name': '列表', + 'admin.addons.catalog.packing.description': '行程打包清单与待办任务', 'admin.addons.catalog.budget.name': '预算', 'admin.addons.catalog.budget.description': '跟踪支出并规划旅行预算', 'admin.addons.catalog.documents.name': '文档', @@ -740,8 +740,8 @@ const zh: Record = { 'trip.tabs.reservationsShort': '预订', 'trip.tabs.packing': '行李清单', 'trip.tabs.packingShort': '行李', - 'trip.tabs.lists': 'Lists', - 'trip.tabs.listsShort': 'Lists', + 'trip.tabs.lists': '列表', + 'trip.tabs.listsShort': '列表', 'trip.tabs.budget': '预算', 'trip.tabs.files': '文件', 'trip.loading': '加载旅行中...', @@ -936,11 +936,11 @@ const zh: Record = { 'reservations.linkAssignment': '关联日程分配', 'reservations.pickAssignment': '从计划中选择一个分配...', 'reservations.noAssignment': '无关联(独立)', - 'reservations.price': 'Price', - 'reservations.budgetCategory': 'Budget category', - 'reservations.budgetCategoryPlaceholder': 'e.g. Transport, Accommodation', - 'reservations.budgetCategoryAuto': 'Auto (from booking type)', - 'reservations.budgetHint': 'A budget entry will be created automatically when saving.', + 'reservations.price': '价格', + 'reservations.budgetCategory': '预算类别', + 'reservations.budgetCategoryPlaceholder': '例:交通、住宿', + 'reservations.budgetCategoryAuto': '自动(按预订类型)', + 'reservations.budgetHint': '保存时将自动创建预算条目。', 'reservations.departureDate': '出发', 'reservations.arrivalDate': '到达', 'reservations.departureTime': '出发时间', @@ -1572,42 +1572,42 @@ const zh: Record = { 'notifications.test.tripText': '行程"{trip}"的测试通知。', // Todo - 'todo.subtab.packing': 'Packing List', - 'todo.subtab.todo': 'To-Do', - 'todo.completed': 'completed', - 'todo.filter.all': 'All', - 'todo.filter.open': 'Open', - 'todo.filter.done': 'Done', - 'todo.uncategorized': 'Uncategorized', - 'todo.namePlaceholder': 'Task name', - 'todo.descriptionPlaceholder': 'Description (optional)', - 'todo.unassigned': 'Unassigned', - 'todo.noCategory': 'No category', - 'todo.hasDescription': 'Has description', - 'todo.addItem': 'Add new task...', - 'todo.newCategory': 'Category name', - 'todo.addCategory': 'Add category', - 'todo.newItem': 'New task', - 'todo.empty': 'No tasks yet. Add a task to get started!', - 'todo.filter.my': 'My Tasks', - 'todo.filter.overdue': 'Overdue', - 'todo.sidebar.tasks': 'Tasks', - 'todo.sidebar.categories': 'Categories', - 'todo.detail.title': 'Task', - 'todo.detail.description': 'Description', - 'todo.detail.category': 'Category', - 'todo.detail.dueDate': 'Due date', - 'todo.detail.assignedTo': 'Assigned to', - 'todo.detail.delete': 'Delete', - 'todo.detail.save': 'Save changes', - 'todo.detail.create': 'Create task', - 'todo.detail.priority': 'Priority', - 'todo.detail.noPriority': 'None', - 'todo.sortByPrio': 'Priority', + 'todo.subtab.packing': '行李清单', + 'todo.subtab.todo': '待办事项', + 'todo.completed': '已完成', + 'todo.filter.all': '全部', + 'todo.filter.open': '进行中', + 'todo.filter.done': '已完成', + 'todo.uncategorized': '未分类', + 'todo.namePlaceholder': '任务名称', + 'todo.descriptionPlaceholder': '描述(可选)', + 'todo.unassigned': '未分配', + 'todo.noCategory': '无分类', + 'todo.hasDescription': '有描述', + 'todo.addItem': '添加新任务...', + 'todo.newCategory': '分类名称', + 'todo.addCategory': '添加分类', + 'todo.newItem': '新任务', + 'todo.empty': '暂无任务,添加一个任务开始吧!', + 'todo.filter.my': '我的任务', + 'todo.filter.overdue': '已逾期', + 'todo.sidebar.tasks': '任务', + 'todo.sidebar.categories': '分类', + 'todo.detail.title': '任务', + 'todo.detail.description': '描述', + 'todo.detail.category': '分类', + 'todo.detail.dueDate': '截止日期', + 'todo.detail.assignedTo': '分配给', + 'todo.detail.delete': '删除', + 'todo.detail.save': '保存更改', + 'todo.detail.create': '创建任务', + 'todo.detail.priority': '优先级', + 'todo.detail.noPriority': '无', + 'todo.sortByPrio': '优先级', // Notification system (added from feat/notification-system) - 'settings.notifyVersionAvailable': 'New version available', - 'settings.notificationPreferences.noChannels': 'No notification channels are configured. Ask an admin to set up email or webhook notifications.', + 'settings.notifyVersionAvailable': '有新版本可用', + 'settings.notificationPreferences.noChannels': '未配置通知渠道。请联系管理员设置电子邮件或 Webhook 通知。', 'settings.webhookUrl.label': 'Webhook URL', 'settings.webhookUrl.placeholder': 'https://discord.com/api/webhooks/...', 'settings.webhookUrl.hint': '输入您的 Discord、Slack 或自定义 Webhook URL 以接收通知。', @@ -1622,7 +1622,7 @@ const zh: Record = { 'admin.notifications.emailPanel.title': 'Email (SMTP)', 'admin.notifications.webhookPanel.title': 'Webhook', 'admin.notifications.inappPanel.title': 'In-App', - 'admin.notifications.inappPanel.hint': 'In-app notifications are always active and cannot be disabled globally.', + 'admin.notifications.inappPanel.hint': '应用内通知始终处于活跃状态,无法全局禁用。', 'admin.notifications.adminWebhookPanel.title': '管理员 Webhook', 'admin.notifications.adminWebhookPanel.hint': '此 Webhook 专用于管理员通知(如版本更新提醒)。它与用户 Webhook 相互独立,配置 URL 后自动触发。', 'admin.notifications.adminWebhookPanel.saved': '管理员 Webhook URL 已保存', @@ -1630,16 +1630,16 @@ const zh: Record = { 'admin.notifications.adminWebhookPanel.testFailed': '测试 Webhook 失败', 'admin.notifications.adminWebhookPanel.alwaysOnHint': '配置 URL 后管理员 Webhook 自动触发', 'admin.notifications.adminNotificationsHint': '配置哪些渠道发送管理员通知(如版本更新提醒)。设置管理员 Webhook URL 后,Webhook 将自动触发。', - 'admin.tabs.notifications': 'Notifications', + 'admin.tabs.notifications': '通知', 'admin.tabs.notificationChannels': '通知渠道', 'admin.tabs.adminNotifications': '管理员通知', - 'notifications.versionAvailable.title': 'Update Available', - 'notifications.versionAvailable.text': 'TREK {version} is now available.', - 'notifications.versionAvailable.button': 'View Details', - 'notif.test.title': '[Test] Notification', - 'notif.test.simple.text': 'This is a simple test notification.', - 'notif.test.boolean.text': 'Do you accept this test notification?', - 'notif.test.navigate.text': 'Click below to navigate to the dashboard.', + 'notifications.versionAvailable.title': '有可用更新', + 'notifications.versionAvailable.text': 'TREK {version} 现已可用。', + 'notifications.versionAvailable.button': '查看详情', + 'notif.test.title': '[测试] 通知', + 'notif.test.simple.text': '这是一条简单的测试通知。', + 'notif.test.boolean.text': '您是否接受此测试通知?', + 'notif.test.navigate.text': '点击下方前往控制台。', // Notifications 'notif.trip_invite.title': '旅行邀请', @@ -1669,8 +1669,8 @@ const zh: Record = { 'notif.action.decline': '拒绝', 'notif.generic.title': '通知', 'notif.generic.text': '您有一条新通知', - 'notif.dev.unknown_event.title': '[DEV] Unknown Event', - 'notif.dev.unknown_event.text': 'Event type "{event}" is not registered in EVENT_NOTIFICATION_CONFIG', + 'notif.dev.unknown_event.title': '[DEV] 未知事件', + 'notif.dev.unknown_event.text': '事件类型 "{event}" 未在 EVENT_NOTIFICATION_CONFIG 中注册', } export default zh