feat(notifications): Web Push delivers notifications to every device, even with TREK closed

A fourth built-in channel next to email, webhook and ntfy. Browsers
register per device, the server encrypts per RFC 8291 and signs per RFC
8292 with node:crypto and sends only to known push services through the
SSRF guard. The event matrix decides per category what arrives by push;
admins switch the channel on under Notifications.

VAPID keys come from the environment or are generated once, only while
neither stored row exists, and kept encrypted. A pair that does not
decrypt or match is never overwritten and never swapped for another one:
push stays off with an error in the log and every device stays
registered until the key is fixed. The subject is VAPID_SUBJECT, then an
https APP_URL, then the project URL.

Only chat messages collapse into one notification per trip, and a
replacement still alerts. A 403 removes a device only after three
failures in a row; 404 and 410 remove it at once. Password change, reset
and an admin setting a password drop the user's devices with the other
credentials. The request log redacts subscriptions and endpoints, boot
errors print *** for every secret variable, and logout forgets the
device with a plain fetch so an expired session cannot redirect midway.

Addresses discussion #894.
This commit is contained in:
Maurice
2026-09-24 23:17:03 +00:00
parent 7ce31756a3
commit 650451bdf7
177 changed files with 7809 additions and 271 deletions
+3
View File
@@ -720,6 +720,9 @@ const admin: TranslationStrings = {
'admin.notifications.ntfy': 'Ntfy', // en-fallback
'admin.notifications.emailPanel.title': 'Email (SMTP)', // en-fallback
'admin.notifications.webhookPanel.title': 'Webhook', // en-fallback
'admin.notifications.webPushPanel.title': 'إشعارات الويب الفورية',
'admin.notifications.webPushPanel.hint':
'تتيح للمستخدمين تلقي الإشعارات على هواتفهم وحواسيبهم عبر المتصفح، حتى عندما يكون TREK مغلقًا. يتطلب HTTPS؛ وعلى iPhone وiPad يجب إضافة TREK إلى الشاشة الرئيسية.',
'admin.notifications.inappPanel.title': 'In-App', // en-fallback
'admin.notifications.adminNtfyPanel.serverPlaceholder': 'https://ntfy.sh', // en-fallback
'admin.notifications.adminNtfyPanel.topicPlaceholder': 'trek-admin-alerts', // en-fallback
+5 -3
View File
@@ -960,11 +960,13 @@ const help: TranslationStrings = {
'«وضع الجودة العالية» لتنعيم الحواف وإسقاط الكرة الأرضية؛ و«حفظ الخريطة» يثبّت الاختيار.',
'help.ctx.settings-notifications.title': 'الإشعارات',
'help.ctx.settings-notifications.summary':
'أين يصلك TREK خارج التطبيق: موضوع ntfy، أو webhook، أو قناة توفرها إضافة. تحت القنوات، صف لكل حدث يحدد ما يذهب إلى أين.',
'أين يصلك TREK خارج التطبيق: إشعارات فورية على هذا الجهاز، أو موضوع ntfy، أو webhook، أو قناة توفرها إضافة. تحت القنوات، صف لكل حدث يحدد ما يذهب إلى أين.',
'help.ctx.settings-notifications.bullet.1':
'ntfy: الموضوع، وخادم خاص بك اختياري، ورمز وصول اختياري، مع «اختبار» لإرسال رسالة على الفور.',
'help.ctx.settings-notifications.bullet.2': 'Webhook: عنوان URL واحد يستقبل كل حدث بصيغة JSON، مع «اختبار».',
'help.ctx.settings-notifications.bullet.3':
'الإشعارات الفورية على هذا الجهاز: «تشغيل على هذا الجهاز» يشمل المتصفح الذي تستخدمه فقط، لذا كرّره على كل هاتف أو حاسوب. «إرسال اختبار» يصل إليها جميعًا.',
'help.ctx.settings-notifications.bullet.4':
'صفوف التفضيلات: لكل حدث، أي قناة مفعّلة. تعرض قنوات الإضافات «تهيئة» حتى يتم إعدادها.',
'help.ctx.settings-integrations.title': 'التكاملات',
'help.ctx.settings-integrations.summary':
@@ -1266,7 +1268,7 @@ const help: TranslationStrings = {
'help.ctx.admin-notifications.summary':
'القنوات التي تقدمها النسخة لمستخدميها، والقنوات التي تصلك أنت بصفتك المسؤول. يختار المستخدمون مواضيعهم وعناوين URL الخاصة بهم في «الإعدادات»؛ وأنت تقرر ما يوجد وتهيّئ البريد الإلكتروني.',
'help.ctx.admin-notifications.bullet.1':
'«In-App» و«Email (SMTP)» و«Ntfy» و«Webhook»: لوحة لكل منها، مع مفتاح يقدّم القناة للمستخدمين، والتهيئة التي تحتاجها من جهة الخادم.',
'«In-App» و«Email (SMTP)» و«Ntfy» و«Webhook» و«إشعارات الويب الفورية»: لوحة لكل منها، مع مفتاح يقدّم القناة للمستخدمين، والتهيئة التي تحتاجها من جهة الخادم.',
'help.ctx.admin-notifications.bullet.2': '«تذكيرات الرحلات»: هل يرسل الخادم التذكير قبل بدء الرحلة.',
'help.ctx.admin-notifications.bullet.3':
'«Ntfy المسؤول» و«Webhook المسؤول»: وجهة أحداث المسؤول مثل فشل نسخة احتياطية أو صدور إصدار جديد، مع «اختبار».',
@@ -1482,7 +1484,7 @@ const help: TranslationStrings = {
'help.guide.channels-instance.step.1':
'تحت «Email (SMTP)»، أدخل SMTP Host وSMTP Port وSMTP User وSMTP Password وFrom Address؛ و«إرسال بريد تجريبي» يرسل رسالة إليك.',
'help.guide.channels-instance.step.2':
'شغّل «Ntfy» و«Webhook» لتقديمهما؛ ثم يدخل المستخدمون موضوعهم أو عنوان URL الخاص بهم في «الإعدادات»، «الإشعارات».',
'شغّل «إشعارات الويب الفورية» و«Ntfy» و«Webhook» لتقديمها؛ ثم يشغّل المستخدمون الإشعارات الفورية لكل جهاز، أو يدخلون موضوعهم أو عنوان URL الخاص بهم، في «الإعدادات»، «الإشعارات».',
'help.guide.channels-instance.step.3':
'«تذكيرات الرحلات» تشغّل التذكير قبل بدء الرحلة؛ و«In-App» مفعّل دائمًا ويُشرح هنا فحسب.',
'help.guide.channels-instance.result': 'يعرض تبويب «الإشعارات» لدى كل مستخدم القنوات التي شغّلتها.',
+12
View File
@@ -300,6 +300,18 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.testFailed': 'فشل الاختبار.',
'settings.notificationPreferences.pluginConfigured': 'تم الإعداد. أدر بيانات الاعتماد من صفحة إعدادات الإضافة.',
'settings.notificationPreferences.ntfy': 'Ntfy', // en-fallback
'settings.notificationPreferences.push': 'إشعارات فورية',
'settings.webPush.title': 'الإشعارات الفورية على هذا الجهاز',
'settings.webPush.hint':
'يعرض إشعارات TREK على هذا الجهاز حتى عندما يكون TREK مغلقًا. الأحداث التي تصل تتبع عمود «إشعارات فورية».',
'settings.webPush.enable': 'تشغيل على هذا الجهاز',
'settings.webPush.disable': 'إيقاف على هذا الجهاز',
'settings.webPush.enabled': 'مُفعّل على هذا الجهاز',
'settings.webPush.unsupported': 'لا يمكن لهذا المتصفح تلقي الإشعارات الفورية.',
'settings.webPush.insecure': 'تتطلب الإشعارات الفورية فتح TREK عبر HTTPS.',
'settings.webPush.iosInstall': 'على iPhone وiPad، أضف TREK أولًا إلى الشاشة الرئيسية ثم افتحه من هناك.',
'settings.webPush.denied': 'الإشعارات محظورة لـ TREK في هذا المتصفح. اسمح بها في إعدادات المتصفح، ثم حاول مرة أخرى.',
'settings.webPush.failed': 'تعذّر تشغيل الإشعارات الفورية على هذا الجهاز.',
'settings.webhookUrl.placeholder': 'https://discord.com/api/webhooks/...', // en-fallback
'settings.ntfyUrl.topicPlaceholder': 'my-trek-alerts', // en-fallback
'settings.ntfyUrl.serverPlaceholder': 'https://ntfy.sh', // en-fallback
+3
View File
@@ -19,6 +19,9 @@ const admin: TranslationStrings = {
'admin.notifications.testNtfyFailed': 'Sınaq ntfy bildirişi uğursuz oldu',
'admin.notifications.emailPanel.title': 'E-poçt (SMTP)',
'admin.notifications.webhookPanel.title': 'Webhook',
'admin.notifications.webPushPanel.title': 'Web Push',
'admin.notifications.webPushPanel.hint':
'İstifadəçilərə TREK bağlı olanda belə brauzer vasitəsilə telefon və kompüterlərində bildiriş almağa imkan verir. HTTPS tələb olunur; iPhone və iPad-də TREK Əsas ekrana əlavə edilməlidir.',
'admin.notifications.inappPanel.title': 'Tətbiqdaxili',
'admin.notifications.inappPanel.hint':
'Tətbiqdaxili bildirişlər həmişə aktivdir və ümumi şəkildə deaktiv edilə bilməz.',
+5 -3
View File
@@ -1085,11 +1085,13 @@ const help: TranslationStrings = {
'Hamarlaşdırma və qlobus proyeksiyası üçün Yüksək keyfiyyət rejimi; Xəritəni yadda saxla seçimi saxlayır.',
'help.ctx.settings-notifications.title': 'Bildirişlər',
'help.ctx.settings-notifications.summary':
'TREK-in tətbiqdən kənarda sizə harada çatdığı: ntfy mövzusu, webhook və ya plaginin təqdim etdiyi kanal. Kanalların altında hər hadisə üçün bir sətir nəyin hara getdiyini müəyyən edir.',
'TREK-in tətbiqdən kənarda sizə harada çatdığı: bu cihazda push bildirişləri, ntfy mövzusu, webhook və ya plaginin təqdim etdiyi kanal. Kanalların altında hər hadisə üçün bir sətir nəyin hara getdiyini müəyyən edir.',
'help.ctx.settings-notifications.bullet.1':
'ntfy: mövzu, istəyə bağlı öz serveriniz və istəyə bağlı giriş tokeni, dərhal test göndərmək üçün Sına düyməsi ilə.',
'help.ctx.settings-notifications.bullet.2': 'Webhook: hər hadisəni JSON kimi qəbul edən bir URL, Sına düyməsi ilə.',
'help.ctx.settings-notifications.bullet.3':
'Bu cihazda push bildirişləri: Bu cihaz üçün aktiv et yalnız istifadə etdiyiniz brauzerə aiddir, ona görə də bunu hər telefonda və ya kompüterdə təkrarlayın. Test göndər hamısına çatır.',
'help.ctx.settings-notifications.bullet.4':
'Tənzimləmə sətirləri: hər hadisə üçün hansı kanalın aktiv olduğu. Plagin kanalları qurulana qədər Konfiqurasiya et göstərir.',
'help.ctx.settings-integrations.title': 'İnteqrasiyalar',
'help.ctx.settings-integrations.summary':
@@ -1418,7 +1420,7 @@ const help: TranslationStrings = {
'help.ctx.admin-notifications.summary':
'İnstansiyanın istifadəçilərə təklif etdiyi kanallar və sizə administrator kimi çatan kanallar. İstifadəçilər öz mövzularını və URL-lərini Tənzimləmələr bölməsində seçir; nəyin mövcud olacağını siz müəyyən edirsiniz və e-poçtu siz konfiqurasiya edirsiniz.',
'help.ctx.admin-notifications.bullet.1':
'Tətbiqdaxili, E-poçt (SMTP), Ntfy və Webhook: hər biri üçün kanalı istifadəçilərə təklif edən açarı və tələb etdiyi server tərəfi konfiqurasiyası olan ayrıca panel.',
'Tətbiqdaxili, E-poçt (SMTP), Ntfy, Webhook və Web Push: hər biri üçün kanalı istifadəçilərə təklif edən açarı və tələb etdiyi server tərəfi konfiqurasiyası olan ayrıca panel.',
'help.ctx.admin-notifications.bullet.2':
'Səyahət xatırlatmaları: serverin səyahət başlamazdan əvvəl xatırlatma göndərib-göndərməməsi.',
'help.ctx.admin-notifications.bullet.3':
@@ -1687,7 +1689,7 @@ const help: TranslationStrings = {
'help.guide.channels-instance.step.1':
'E-poçt (SMTP) bölməsində SMTP hostu, SMTP portu, SMTP istifadəçisi, SMTP parolu və Göndərən ünvanı daxil edin; Sınaq e-poçtu göndər sizə məktub göndərir.',
'help.guide.channels-instance.step.2':
'Ntfy və Webhook-u təklif etmək üçün onları aktiv edin; sonra istifadəçilər Tənzimləmələr, Bildirişlər bölməsində öz mövzularını və ya URL-lərini daxil edirlər.',
'Web Push, Ntfy və Webhook-u təklif etmək üçün onları aktiv edin; sonra istifadəçilər Tənzimləmələr, Bildirişlər bölməsində push-u hər cihaz üçün aktiv edir və ya öz mövzularını və ya URL-lərini daxil edirlər.',
'help.guide.channels-instance.step.3':
'Səyahət xatırlatmaları səyahət başlamazdan əvvəlki xatırlatmanı aktiv və ya deaktiv edir; Tətbiqdaxili həmişə aktivdir və burada yalnız izah olunur.',
'help.guide.channels-instance.result':
+13
View File
@@ -163,6 +163,19 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.pluginConfigured':
'Konfiqurasiya edilib. Giriş məlumatlarını plaginin tənzimləmələr səhifəsindən idarə edin.',
'settings.notificationPreferences.ntfy': 'Ntfy',
'settings.notificationPreferences.push': 'Push',
'settings.webPush.title': 'Bu cihazda push bildirişləri',
'settings.webPush.hint':
'TREK bağlı olanda belə TREK bildirişlərini bu cihazda göstərir. Hansı hadisələrin gəldiyini Push sütunu müəyyən edir.',
'settings.webPush.enable': 'Bu cihaz üçün aktiv et',
'settings.webPush.disable': 'Bu cihaz üçün deaktiv et',
'settings.webPush.enabled': 'Bu cihaz üçün aktivdir',
'settings.webPush.unsupported': 'Bu brauzer push bildirişlərini qəbul edə bilmir.',
'settings.webPush.insecure': 'Push üçün TREK HTTPS vasitəsilə açılmalıdır.',
'settings.webPush.iosInstall': 'iPhone və iPad-də əvvəlcə TREK-i Əsas ekrana əlavə edin və onu oradan açın.',
'settings.webPush.denied':
'Bu brauzerdə TREK üçün bildirişlər bloklanıb. Onlara brauzer tənzimləmələrində icazə verin, sonra yenidən cəhd edin.',
'settings.webPush.failed': 'Bu cihaz üçün push aktiv edilə bilmədi.',
'settings.notificationPreferences.noChannels':
'Heç bir bildiriş kanalı konfiqurasiya edilməyib. Administratordan e-poçt və ya webhook bildirişlərini quraşdırmasını istəyin.',
+3
View File
@@ -714,6 +714,9 @@ const admin: TranslationStrings = {
'admin.oauthSessions.loadError': 'Falha ao carregar sessões OAuth',
'admin.notifications.emailPanel.title': 'Email (SMTP)',
'admin.notifications.webhookPanel.title': 'Webhook',
'admin.notifications.webPushPanel.title': 'Web Push',
'admin.notifications.webPushPanel.hint':
'Permite que os usuários recebam notificações no celular e no computador pelo navegador, mesmo com o TREK fechado. Requer HTTPS; no iPhone e no iPad, o TREK precisa ser adicionado à Tela de Início.',
'admin.notifications.inappPanel.title': 'In-App',
'admin.notifications.inappPanel.hint':
'As notificações no aplicativo estão sempre ativas e não podem ser desativadas globalmente.',
+5 -3
View File
@@ -1051,11 +1051,13 @@ const help: TranslationStrings = {
'Modo alta qualidade para antialiasing e a projeção de globo; Salvar mapa grava a escolha.',
'help.ctx.settings-notifications.title': 'Notificações',
'help.ctx.settings-notifications.summary':
'Onde o TREK alcança você fora do app: um tópico ntfy, um webhook ou um canal que um plugin fornece. Abaixo dos canais, uma linha por evento decide o que vai para onde.',
'Onde o TREK alcança você fora do app: notificações push neste dispositivo, um tópico ntfy, um webhook ou um canal que um plugin fornece. Abaixo dos canais, uma linha por evento decide o que vai para onde.',
'help.ctx.settings-notifications.bullet.1':
'ntfy: o tópico, um servidor próprio opcional e um token de acesso opcional, com Testar para enviar um na hora.',
'help.ctx.settings-notifications.bullet.2': 'Webhook: uma URL que recebe cada evento como JSON, com Testar.',
'help.ctx.settings-notifications.bullet.3':
'Notificações push neste dispositivo: Ativar neste dispositivo vale só para o navegador que você está usando, então repita em cada celular ou computador. Enviar teste chega a todos eles.',
'help.ctx.settings-notifications.bullet.4':
'As linhas de preferências: por evento, qual canal está ligado. Canais de plugin mostram Configurar até serem configurados.',
'help.ctx.settings-integrations.title': 'Integrações',
'help.ctx.settings-integrations.summary':
@@ -1377,7 +1379,7 @@ const help: TranslationStrings = {
'help.ctx.admin-notifications.summary':
'Os canais que a instância oferece aos usuários, e os que chegam até você como admin. Os usuários escolhem seus próprios tópicos e URLs em Configurações; você decide o que existe e configura o e-mail.',
'help.ctx.admin-notifications.bullet.1':
'In-App, Email (SMTP), Ntfy e Webhook: um painel para cada, com uma chave que oferece o canal aos usuários e a configuração do lado do servidor de que ele precisa.',
'In-App, Email (SMTP), Ntfy, Webhook e Web Push: um painel para cada, com uma chave que oferece o canal aos usuários e a configuração do lado do servidor de que ele precisa.',
'help.ctx.admin-notifications.bullet.2':
'Lembretes de viagem: se o servidor envia o lembrete antes de uma viagem começar.',
'help.ctx.admin-notifications.bullet.3':
@@ -1620,7 +1622,7 @@ const help: TranslationStrings = {
'help.guide.channels-instance.step.1':
'Em Email (SMTP), informe SMTP Host, SMTP Port, SMTP User, SMTP Password e a From Address; Enviar e-mail de teste manda um e-mail para você.',
'help.guide.channels-instance.step.2':
'Ligue Ntfy e Webhook para oferecê-los; os usuários então informam o próprio tópico ou URL em Configurações, Notificações.',
'Ligue Web Push, Ntfy e Webhook para oferecê-los; os usuários então ativam o push em cada dispositivo, ou informam o próprio tópico ou URL, em Configurações, Notificações.',
'help.guide.channels-instance.step.3':
'Lembretes de viagem controla o lembrete antes de uma viagem começar; In-App está sempre ligado e aqui só é explicado.',
'help.guide.channels-instance.result': 'A aba Notificações de cada usuário mostra os canais que você ligou.',
+13
View File
@@ -322,6 +322,19 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.webhook': 'Webhook',
'settings.notificationPreferences.email': 'Email',
'settings.notificationPreferences.ntfy': 'Ntfy',
'settings.notificationPreferences.push': 'Push',
'settings.webPush.title': 'Notificações push neste dispositivo',
'settings.webPush.hint':
'Mostra as notificações do TREK neste dispositivo mesmo com o TREK fechado. Os eventos que chegam seguem a coluna Push.',
'settings.webPush.enable': 'Ativar neste dispositivo',
'settings.webPush.disable': 'Desativar neste dispositivo',
'settings.webPush.enabled': 'Ativado neste dispositivo',
'settings.webPush.unsupported': 'Este navegador não pode receber notificações push.',
'settings.webPush.insecure': 'O push exige que o TREK seja aberto via HTTPS.',
'settings.webPush.iosInstall': 'No iPhone e no iPad, adicione primeiro o TREK à Tela de Início e abra-o por lá.',
'settings.webPush.denied':
'As notificações do TREK estão bloqueadas neste navegador. Permita-as nas configurações do navegador e tente novamente.',
'settings.webPush.failed': 'Não foi possível ativar o push neste dispositivo.',
'settings.currency': 'Moeda de exibição',
'settings.currencyHint':
'Os valores em Custos são exibidos convertidos para esta moeda apenas para visualização — os valores originais permanecem inalterados.',
+3
View File
@@ -361,6 +361,9 @@ const admin: TranslationStrings = {
'admin.group.maintenance': 'Manteniment',
'admin.notifications.emailPanel.title': 'Correu (SMTP)',
'admin.notifications.webhookPanel.title': 'Webhook',
'admin.notifications.webPushPanel.title': 'Web Push',
'admin.notifications.webPushPanel.hint':
"Permet als usuaris rebre notificacions als telèfons i ordinadors a través del navegador, fins i tot amb TREK tancat. Cal HTTPS; a l'iPhone i l'iPad, TREK s'ha d'afegir a la pantalla d'inici.",
'admin.notifications.inappPanel.title': 'In-App',
'admin.notifications.inappPanel.hint':
'Les notificacions in-app sempre estan actives i no es poden desactivar globalment.',
+5 -3
View File
@@ -1068,11 +1068,13 @@ const help: TranslationStrings = {
"Mode d'alta qualitat per a l’antialiàsing i la projecció de globus; Desa el mapa escriu la tria.",
'help.ctx.settings-notifications.title': 'Notificacions',
'help.ctx.settings-notifications.summary':
'On et troba TREK fora de l’app: un tema de ntfy, un webhook o un canal que aporta un connector. Sota els canals, una fila per esdeveniment decideix què va on.',
'On et troba TREK fora de l’app: notificacions push en aquest dispositiu, un tema de ntfy, un webhook o un canal que aporta un connector. Sota els canals, una fila per esdeveniment decideix què va on.',
'help.ctx.settings-notifications.bullet.1':
'ntfy: el tema, un servidor propi opcional i un token d’accés opcional, amb Prova per enviar-ne un a l’instant.',
'help.ctx.settings-notifications.bullet.2': 'Webhook: una URL que rep cada esdeveniment com a JSON, amb Prova.',
'help.ctx.settings-notifications.bullet.3':
'Notificacions push en aquest dispositiu: Activa en aquest dispositiu només afecta el navegador que fas servir, així que repeteix-ho a cada mòbil o ordinador. Envia una prova arriba a tots.',
'help.ctx.settings-notifications.bullet.4':
'Les files de preferències: per esdeveniment, quin canal està actiu. Els canals de connectors mostren Configura fins que estan configurats.',
'help.ctx.settings-integrations.title': 'Integracions',
'help.ctx.settings-integrations.summary':
@@ -1401,7 +1403,7 @@ const help: TranslationStrings = {
'help.ctx.admin-notifications.summary':
'Els canals que la instància ofereix als seus usuaris, i els que t’arriben a tu com a admin. Els usuaris trien els seus propis temes i URL a Configuració; tu decideixes què existeix i configures el correu.',
'help.ctx.admin-notifications.bullet.1':
'In-App, Correu (SMTP), Ntfy i Webhook: un panell cadascun, amb un interruptor que ofereix el canal als usuaris i la configuració del costat del servidor que necessita.',
'In-App, Correu (SMTP), Ntfy, Webhook i Web Push: un panell cadascun, amb un interruptor que ofereix el canal als usuaris i la configuració del costat del servidor que necessita.',
'help.ctx.admin-notifications.bullet.2':
'Recordatoris de viatge: si el servidor envia el recordatori abans que comenci un viatge.',
'help.ctx.admin-notifications.bullet.3':
@@ -1653,7 +1655,7 @@ const help: TranslationStrings = {
'help.guide.channels-instance.step.1':
'A Correu (SMTP), introdueix SMTP Host, SMTP Port, SMTP User, SMTP Password i la From Address; Enviar correu de prova t’envia un correu a tu.',
'help.guide.channels-instance.step.2':
'Activa Ntfy i Webhook per oferir-los; els usuaris introdueixen llavors el seu propi tema o URL a Configuració, Notificacions.',
'Activa Web Push, Ntfy i Webhook per oferir-los; els usuaris activen llavors el push per a cada dispositiu, o introdueixen el seu propi tema o URL, a Configuració, Notificacions.',
'help.guide.channels-instance.step.3':
'Recordatoris de viatge controla el recordatori abans que comenci un viatge; In-App sempre està activat i aquí només s’explica.',
'help.guide.channels-instance.result': 'La pestanya Notificacions de cada usuari mostra els canals que has activat.',
+13
View File
@@ -296,6 +296,19 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.webhook': 'Webhook',
'settings.notificationPreferences.email': 'Correu electrònic',
'settings.notificationPreferences.ntfy': 'Ntfy',
'settings.notificationPreferences.push': 'Push',
'settings.webPush.title': 'Notificacions push en aquest dispositiu',
'settings.webPush.hint':
'Mostra les notificacions de TREK en aquest dispositiu fins i tot quan TREK està tancat. Els esdeveniments que arriben segueixen la columna Push.',
'settings.webPush.enable': 'Activa en aquest dispositiu',
'settings.webPush.disable': 'Desactiva en aquest dispositiu',
'settings.webPush.enabled': 'Activat en aquest dispositiu',
'settings.webPush.unsupported': 'Aquest navegador no pot rebre notificacions push.',
'settings.webPush.insecure': "Push necessita que TREK s'obri per HTTPS.",
'settings.webPush.iosInstall': "A l'iPhone i l'iPad, afegeix primer TREK a la pantalla d'inici i obre'l des d'allà.",
'settings.webPush.denied':
'Les notificacions de TREK estan bloquejades en aquest navegador. Permet-les a la configuració del navegador i torna-ho a provar.',
'settings.webPush.failed': "No s'ha pogut activar push en aquest dispositiu.",
'settings.passkey.title': 'Passkeys',
'settings.passkey.description':
'Inicia la sessió més ràpidament i amb protecció contra el phishing utilitzant una passkey: la teva empremta, la teva cara, el teu PIN o una clau de seguretat física. La teva contrasenya continua disponible com a alternativa.',
+3
View File
@@ -709,6 +709,9 @@ const admin: TranslationStrings = {
'admin.tabs.permissions': 'Oprávnění',
'admin.notifications.emailPanel.title': 'Email (SMTP)',
'admin.notifications.webhookPanel.title': 'Webhook',
'admin.notifications.webPushPanel.title': 'Web Push',
'admin.notifications.webPushPanel.hint':
'Umožňuje uživatelům přijímat oznámení na telefonech a počítačích přes prohlížeč, i když je TREK zavřený. Vyžaduje HTTPS; na iPhonu a iPadu musí být TREK přidán na plochu.',
'admin.notifications.inappPanel.title': 'In-App',
'admin.notifications.inappPanel.hint': 'In-app oznámení jsou vždy aktivní a nelze je globálně vypnout.',
'admin.notifications.adminWebhookPanel.title': 'Admin webhook',
+5 -3
View File
@@ -1021,12 +1021,14 @@ const help: TranslationStrings = {
'Režim vysoké kvality pro vyhlazování a projekci glóbu; Uložit nastavení mapy volbu zapíše.',
'help.ctx.settings-notifications.title': 'Oznámení',
'help.ctx.settings-notifications.summary':
'Kde vás TREK zastihne mimo aplikaci: téma ntfy, webhook nebo kanál, který poskytuje doplněk. Pod kanály rozhoduje jeden řádek na událost, co kam půjde.',
'Kde vás TREK zastihne mimo aplikaci: push notifikace na tomto zařízení, téma ntfy, webhook nebo kanál, který poskytuje doplněk. Pod kanály rozhoduje jeden řádek na událost, co kam půjde.',
'help.ctx.settings-notifications.bullet.1':
'ntfy: téma, volitelně vlastní server a volitelný přístupový token, s tlačítkem Otestovat, které hned jedno odešle.',
'help.ctx.settings-notifications.bullet.2':
'Webhook: jedna URL, která dostává každou událost jako JSON, s tlačítkem Otestovat.',
'help.ctx.settings-notifications.bullet.3':
'Push notifikace na tomto zařízení: Zapnout pro toto zařízení platí jen pro prohlížeč, který právě používáte, takže to zopakujte na každém telefonu nebo počítači. Odeslat test dorazí na všechny.',
'help.ctx.settings-notifications.bullet.4':
'Řádky předvoleb: pro každou událost, který kanál je zapnutý. Kanály doplňků ukazují Nastavit, dokud nejsou nastavené.',
'help.ctx.settings-integrations.title': 'Integrace',
'help.ctx.settings-integrations.summary':
@@ -1345,7 +1347,7 @@ const help: TranslationStrings = {
'help.ctx.admin-notifications.summary':
'Kanály, které instance nabízí svým uživatelům, a ty, které zastihnou vás jako administrátora. Uživatelé si vybírají vlastní témata a URL pod Nastavení; vy rozhodujete, co existuje, a nastavujete e-mail.',
'help.ctx.admin-notifications.bullet.1':
'In-App, Email (SMTP), Ntfy a Webhook: jeden panel pro každý, s přepínačem, který kanál nabídne uživatelům, a konfigurací na straně serveru, kterou potřebuje.',
'In-App, Email (SMTP), Ntfy, Webhook a Web Push: jeden panel pro každý, s přepínačem, který kanál nabídne uživatelům, a konfigurací na straně serveru, kterou potřebuje.',
'help.ctx.admin-notifications.bullet.2': 'Připomínky výletů: zda server posílá připomínku před začátkem cesty.',
'help.ctx.admin-notifications.bullet.3':
'Admin Ntfy a Admin webhook: kam jdou události pro administrátory, jako neúspěšná záloha nebo nové vydání, s tlačítkem pro test.',
@@ -1580,7 +1582,7 @@ const help: TranslationStrings = {
'help.guide.channels-instance.step.1':
'Pod Email (SMTP) zadejte SMTP Host, SMTP Port, SMTP User, SMTP Password a From Address; Odeslat testovací e-mail vám pošle zprávu.',
'help.guide.channels-instance.step.2':
'Zapněte Ntfy a Webhook, abyste je nabídli; uživatelé pak zadají vlastní téma nebo URL pod Nastavení, Oznámení.',
'Zapněte Web Push, Ntfy a Webhook, abyste je nabídli; uživatelé pak pod Nastavení, Oznámení zapnou push pro každé zařízení, nebo zadají vlastní téma či URL.',
'help.guide.channels-instance.step.3':
'Připomínky výletů přepínají připomínku před začátkem cesty; In-App je vždy zapnuté a tady je jen vysvětlené.',
'help.guide.channels-instance.result': 'Karta Oznámení každého uživatele ukazuje kanály, které jste zapnuli.',
+13
View File
@@ -315,6 +315,19 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.webhook': 'Webhook',
'settings.notificationPreferences.email': 'Email',
'settings.notificationPreferences.ntfy': 'Ntfy',
'settings.notificationPreferences.push': 'Push',
'settings.webPush.title': 'Push notifikace na tomto zařízení',
'settings.webPush.hint':
'Zobrazuje oznámení TREK na tomto zařízení, i když je TREK zavřený. Které události dorazí, určuje sloupec Push.',
'settings.webPush.enable': 'Zapnout pro toto zařízení',
'settings.webPush.disable': 'Vypnout pro toto zařízení',
'settings.webPush.enabled': 'Zapnuto pro toto zařízení',
'settings.webPush.unsupported': 'Tento prohlížeč nemůže přijímat push notifikace.',
'settings.webPush.insecure': 'Push vyžaduje, aby byl TREK otevřen přes HTTPS.',
'settings.webPush.iosInstall': 'Na iPhonu a iPadu nejprve přidejte TREK na plochu a otevřete ho odtud.',
'settings.webPush.denied':
'Oznámení pro TREK jsou v tomto prohlížeči zablokovaná. Povolte je v nastavení prohlížeče a zkuste to znovu.',
'settings.webPush.failed': 'Push se pro toto zařízení nepodařilo zapnout.',
'settings.currency': 'Zobrazovaná měna',
'settings.currencyHint':
'Částky v Nákladech se do této měny přepočítávají pouze pro zobrazení – původní částky zůstávají beze změny.',
+3
View File
@@ -721,6 +721,9 @@ const admin: TranslationStrings = {
'admin.tabs.permissions': 'Berechtigungen',
'admin.notifications.emailPanel.title': 'Email (SMTP)',
'admin.notifications.webhookPanel.title': 'Webhook',
'admin.notifications.webPushPanel.title': 'Web Push',
'admin.notifications.webPushPanel.hint':
'Ermöglicht Benutzern, über den Browser Benachrichtigungen auf ihren Smartphones und Computern zu empfangen, auch wenn TREK geschlossen ist. Erfordert HTTPS; auf iPhone und iPad muss TREK zum Home-Bildschirm hinzugefügt werden.',
'admin.notifications.inappPanel.title': 'In-App',
'admin.notifications.inappPanel.hint':
'In-App-Benachrichtigungen sind immer aktiv und können nicht global deaktiviert werden.',
+5 -3
View File
@@ -1075,11 +1075,13 @@ const help: TranslationStrings = {
'Hochqualitäts-Modus für Antialiasing und die Globus-Projektion; Karte speichern schreibt die Wahl.',
'help.ctx.settings-notifications.title': 'Mitteilungen',
'help.ctx.settings-notifications.summary':
'Wo TREK dich außerhalb der App erreicht: ein ntfy-Thema, ein Webhook oder ein Kanal, den ein Plugin bereitstellt. Unter den Kanälen entscheidet eine Zeile pro Ereignis, was wohin geht.',
'Wo TREK dich außerhalb der App erreicht: Push-Benachrichtigungen auf diesem Gerät, ein ntfy-Thema, ein Webhook oder ein Kanal, den ein Plugin bereitstellt. Unter den Kanälen entscheidet eine Zeile pro Ereignis, was wohin geht.',
'help.ctx.settings-notifications.bullet.1':
'ntfy: das Thema, optional ein eigener Server und ein optionaler Zugriffstoken, mit Testen, um sofort eine Nachricht zu schicken.',
'help.ctx.settings-notifications.bullet.2': 'Webhook: eine URL, die jedes Ereignis als JSON empfängt, mit Testen.',
'help.ctx.settings-notifications.bullet.3':
'Push-Benachrichtigungen auf diesem Gerät: Für dieses Gerät einschalten gilt nur für den Browser, den du gerade nutzt, also wiederhole es auf jedem Handy oder Computer. Test senden erreicht alle.',
'help.ctx.settings-notifications.bullet.4':
'Die Zeilen mit den Präferenzen: pro Ereignis, welcher Kanal an ist. Plugin-Kanäle zeigen Einrichten, bis sie eingerichtet sind.',
'help.ctx.settings-integrations.title': 'Integrationen',
'help.ctx.settings-integrations.summary':
@@ -1407,7 +1409,7 @@ const help: TranslationStrings = {
'help.ctx.admin-notifications.summary':
'Die Kanäle, die die Instanz ihren Benutzern anbietet, und die, die dich als Admin erreichen. Benutzer wählen ihre eigenen Themen und URLs unter Einstellungen; du entscheidest, was es gibt, und richtest E-Mail ein.',
'help.ctx.admin-notifications.bullet.1':
'In-App, Email (SMTP), Ntfy und Webhook: je ein Panel, mit einem Schalter, der den Kanal den Benutzern anbietet, und der serverseitigen Konfiguration, die er braucht.',
'In-App, Email (SMTP), Ntfy, Webhook und Web Push: je ein Panel, mit einem Schalter, der den Kanal den Benutzern anbietet, und der serverseitigen Konfiguration, die er braucht.',
'help.ctx.admin-notifications.bullet.2': 'Reiseerinnerungen: ob der Server die Erinnerung vor Reisebeginn schickt.',
'help.ctx.admin-notifications.bullet.3':
'Admin-Ntfy und Admin-Webhook: wohin Admin-Ereignisse wie ein fehlgeschlagenes Backup oder ein neues Release gehen, mit Test.',
@@ -1662,7 +1664,7 @@ const help: TranslationStrings = {
'help.guide.channels-instance.step.1':
'Trag unter Email (SMTP) SMTP Host, SMTP Port, SMTP User, SMTP Password und die From Address ein; Test-E-Mail senden schickt eine Mail an dich.',
'help.guide.channels-instance.step.2':
'Schalte Ntfy und Webhook an, um sie anzubieten; Benutzer tragen dann ihr eigenes Thema oder ihre URL unter Einstellungen, Mitteilungen ein.',
'Schalte Web Push, Ntfy und Webhook an, um sie anzubieten; Benutzer schalten dann unter Einstellungen, Mitteilungen Push pro Gerät ein oder tragen ihr eigenes Thema oder ihre URL ein.',
'help.guide.channels-instance.step.3':
'Reiseerinnerungen schaltet die Erinnerung vor Reisebeginn; In-App ist immer an und wird hier nur erklärt.',
'help.guide.channels-instance.result':
+14
View File
@@ -323,6 +323,20 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.webhook': 'Webhook',
'settings.notificationPreferences.email': 'Email',
'settings.notificationPreferences.ntfy': 'Ntfy',
'settings.notificationPreferences.push': 'Push',
'settings.webPush.title': 'Push-Benachrichtigungen auf diesem Gerät',
'settings.webPush.hint':
'Zeigt TREK-Benachrichtigungen auf diesem Gerät an, auch wenn TREK geschlossen ist. Welche Ereignisse ankommen, richtet sich nach der Spalte Push.',
'settings.webPush.enable': 'Für dieses Gerät einschalten',
'settings.webPush.disable': 'Für dieses Gerät ausschalten',
'settings.webPush.enabled': 'Für dieses Gerät eingeschaltet',
'settings.webPush.unsupported': 'Dieser Browser kann keine Push-Benachrichtigungen empfangen.',
'settings.webPush.insecure': 'Für Push muss TREK über HTTPS geöffnet werden.',
'settings.webPush.iosInstall':
'Füge TREK auf iPhone und iPad zuerst zum Home-Bildschirm hinzu und öffne es von dort.',
'settings.webPush.denied':
'Benachrichtigungen für TREK sind in diesem Browser blockiert. Erlaube sie in den Browsereinstellungen und versuche es dann erneut.',
'settings.webPush.failed': 'Push konnte für dieses Gerät nicht eingeschaltet werden.',
'settings.currency': 'Anzeigewährung',
'settings.currencyHint':
'Beträge unter Kosten werden nur zur Anzeige in diese Währung umgerechnet – die ursprünglichen Beträge bleiben unverändert.',
+3
View File
@@ -19,6 +19,9 @@ const admin: TranslationStrings = {
'admin.notifications.testNtfyFailed': 'Test ntfy failed',
'admin.notifications.emailPanel.title': 'Email (SMTP)',
'admin.notifications.webhookPanel.title': 'Webhook',
'admin.notifications.webPushPanel.title': 'Web Push',
'admin.notifications.webPushPanel.hint':
'Lets users receive notifications on their phones and computers through the browser, even while TREK is closed. Needs HTTPS; on iPhone and iPad TREK has to be added to the Home Screen.',
'admin.notifications.inappPanel.title': 'In-App',
'admin.notifications.inappPanel.hint': 'In-app notifications are always active and cannot be disabled globally.',
'admin.notifications.adminWebhookPanel.title': 'Admin Webhook',
+5 -3
View File
@@ -1034,11 +1034,13 @@ const help: TranslationStrings = {
'High Quality Mode for antialiasing and the globe projection; Save Map writes the choice.',
'help.ctx.settings-notifications.title': 'Notifications',
'help.ctx.settings-notifications.summary':
'Where TREK reaches you outside the app: an ntfy topic, a webhook, or a channel a plugin provides. Below the channels, one row per event decides what goes where.',
'Where TREK reaches you outside the app: push notifications on this device, an ntfy topic, a webhook, or a channel a plugin provides. Below the channels, one row per event decides what goes where.',
'help.ctx.settings-notifications.bullet.1':
'ntfy: the topic, an optional server of your own and an optional access token, with Test to send one right away.',
'help.ctx.settings-notifications.bullet.2': 'Webhook: one URL that receives every event as JSON, with Test.',
'help.ctx.settings-notifications.bullet.3':
'Push notifications on this device: Turn on for this device covers only the browser you are using, so repeat it on each phone or computer. Send test reaches all of them.',
'help.ctx.settings-notifications.bullet.4':
'The preference rows: per event, which channel is on. Plugin channels show Configure until they are set up.',
'help.ctx.settings-integrations.title': 'Integrations',
'help.ctx.settings-integrations.summary':
@@ -1350,7 +1352,7 @@ const help: TranslationStrings = {
'help.ctx.admin-notifications.summary':
'The channels the instance offers its users, and the ones that reach you as the admin. Users pick their own topics and URLs under Settings; you decide what exists and configure email.',
'help.ctx.admin-notifications.bullet.1':
'In-App, Email (SMTP), Ntfy and Webhook: one panel each, with a switch that offers the channel to users and the server-side configuration it needs.',
'In-App, Email (SMTP), Ntfy, Webhook and Web Push: one panel each, with a switch that offers the channel to users and the server-side configuration it needs.',
'help.ctx.admin-notifications.bullet.2':
'Trip Reminders: whether the server sends the reminder before a trip starts.',
'help.ctx.admin-notifications.bullet.3':
@@ -1587,7 +1589,7 @@ const help: TranslationStrings = {
'help.guide.channels-instance.step.1':
'Under Email (SMTP), enter SMTP Host, SMTP Port, SMTP User, SMTP Password and the From Address; Send test email sends a mail to you.',
'help.guide.channels-instance.step.2':
'Switch Ntfy and Webhook on to offer them; users then enter their own topic or URL under Settings, Notifications.',
'Switch Web Push, Ntfy and Webhook on to offer them; users then turn push on per device, or enter their own topic or URL, under Settings, Notifications.',
'help.guide.channels-instance.step.3':
'Trip Reminders switches the reminder before a trip starts; In-App is always on and only explained here.',
'help.guide.channels-instance.result': 'The Notifications tab of every user shows the channels you switched on.',
+13
View File
@@ -125,6 +125,19 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.testFailed': 'Test failed.',
'settings.notificationPreferences.pluginConfigured': 'Configured. Manage credentials on the plugin’s settings page.',
'settings.notificationPreferences.ntfy': 'Ntfy',
'settings.notificationPreferences.push': 'Push',
'settings.webPush.title': 'Push notifications on this device',
'settings.webPush.hint':
'Shows TREK notifications on this device even while TREK is closed. Which events arrive follows the Push column.',
'settings.webPush.enable': 'Turn on for this device',
'settings.webPush.disable': 'Turn off for this device',
'settings.webPush.enabled': 'On for this device',
'settings.webPush.unsupported': 'This browser cannot receive push notifications.',
'settings.webPush.insecure': 'Push needs TREK to be opened over HTTPS.',
'settings.webPush.iosInstall': 'On iPhone and iPad, add TREK to the Home Screen first and open it from there.',
'settings.webPush.denied':
'Notifications are blocked for TREK in this browser. Allow them in the browser settings, then try again.',
'settings.webPush.failed': 'Push could not be turned on for this device.',
'settings.notificationPreferences.noChannels':
'No notification channels are configured. Ask an admin to set up email or webhook notifications.',
'settings.webhookUrl.label': 'Webhook URL',
+3
View File
@@ -728,6 +728,9 @@ const admin: TranslationStrings = {
'admin.tabs.permissions': 'Permisos',
'admin.notifications.emailPanel.title': 'Email (SMTP)',
'admin.notifications.webhookPanel.title': 'Webhook',
'admin.notifications.webPushPanel.title': 'Web Push',
'admin.notifications.webPushPanel.hint':
'Permite a los usuarios recibir notificaciones en sus teléfonos y ordenadores a través del navegador, incluso con TREK cerrado. Requiere HTTPS; en iPhone y iPad, TREK tiene que añadirse a la pantalla de inicio.',
'admin.notifications.inappPanel.title': 'In-App',
'admin.notifications.inappPanel.hint':
'Las notificaciones in-app siempre están activas y no se pueden desactivar globalmente.',
+5 -3
View File
@@ -1070,11 +1070,13 @@ const help: TranslationStrings = {
'Modo de alta calidad para el antialiasing y la proyección de globo; Guardar mapa escribe la elección.',
'help.ctx.settings-notifications.title': 'Notificaciones',
'help.ctx.settings-notifications.summary':
'Dónde te localiza TREK fuera de la app: un tema de ntfy, un webhook o un canal que aporta un complemento. Bajo los canales, una fila por evento decide qué va a dónde.',
'Dónde te localiza TREK fuera de la app: notificaciones push en este dispositivo, un tema de ntfy, un webhook o un canal que aporta un complemento. Bajo los canales, una fila por evento decide qué va a dónde.',
'help.ctx.settings-notifications.bullet.1':
'ntfy: el tema, un servidor propio opcional y un token de acceso opcional, con Probar para enviar uno al momento.',
'help.ctx.settings-notifications.bullet.2': 'Webhook: una URL que recibe cada evento como JSON, con Probar.',
'help.ctx.settings-notifications.bullet.3':
'Notificaciones push en este dispositivo: Activar en este dispositivo solo cubre el navegador que estás usando, así que repítelo en cada móvil u ordenador. Enviar prueba llega a todos.',
'help.ctx.settings-notifications.bullet.4':
'Las filas de preferencias: por evento, qué canal está activo. Los canales de complementos muestran Configurar hasta que estén configurados.',
'help.ctx.settings-integrations.title': 'Integraciones',
'help.ctx.settings-integrations.summary':
@@ -1402,7 +1404,7 @@ const help: TranslationStrings = {
'help.ctx.admin-notifications.summary':
'Los canales que la instancia ofrece a sus usuarios, y los que te llegan a ti como admin. Los usuarios eligen sus propios temas y URL en Ajustes; tú decides qué existe y configuras el correo.',
'help.ctx.admin-notifications.bullet.1':
'In-App, Email (SMTP), Ntfy y Webhook: un panel cada uno, con un interruptor que ofrece el canal a los usuarios y la configuración del lado del servidor que necesita.',
'In-App, Email (SMTP), Ntfy, Webhook y Web Push: un panel cada uno, con un interruptor que ofrece el canal a los usuarios y la configuración del lado del servidor que necesita.',
'help.ctx.admin-notifications.bullet.2':
'Recordatorios de viaje: si el servidor envía el recordatorio antes de que empiece un viaje.',
'help.ctx.admin-notifications.bullet.3':
@@ -1658,7 +1660,7 @@ const help: TranslationStrings = {
'help.guide.channels-instance.step.1':
'En Email (SMTP), introduce SMTP Host, SMTP Port, SMTP User, SMTP Password y la From Address; Enviar correo de prueba te manda un correo a ti.',
'help.guide.channels-instance.step.2':
'Activa Ntfy y Webhook para ofrecerlos; los usuarios introducen entonces su propio tema o URL en Ajustes, Notificaciones.',
'Activa Web Push, Ntfy y Webhook para ofrecerlos; los usuarios activan entonces push en cada dispositivo, o introducen su propio tema o URL, en Ajustes, Notificaciones.',
'help.guide.channels-instance.step.3':
'Recordatorios de viaje controla el recordatorio antes de que empiece un viaje; In-App siempre está activo y aquí solo se explica.',
'help.guide.channels-instance.result': 'La pestaña Notificaciones de cada usuario muestra los canales que activaste.',
+13
View File
@@ -323,6 +323,19 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.webhook': 'Webhook',
'settings.notificationPreferences.email': 'Email',
'settings.notificationPreferences.ntfy': 'Ntfy',
'settings.notificationPreferences.push': 'Push',
'settings.webPush.title': 'Notificaciones push en este dispositivo',
'settings.webPush.hint':
'Muestra las notificaciones de TREK en este dispositivo aunque TREK esté cerrado. Los eventos que llegan siguen la columna Push.',
'settings.webPush.enable': 'Activar en este dispositivo',
'settings.webPush.disable': 'Desactivar en este dispositivo',
'settings.webPush.enabled': 'Activado en este dispositivo',
'settings.webPush.unsupported': 'Este navegador no puede recibir notificaciones push.',
'settings.webPush.insecure': 'Push necesita que TREK se abra mediante HTTPS.',
'settings.webPush.iosInstall': 'En iPhone y iPad, añade primero TREK a la pantalla de inicio y ábrelo desde ahí.',
'settings.webPush.denied':
'Las notificaciones de TREK están bloqueadas en este navegador. Permítelas en los ajustes del navegador y vuelve a intentarlo.',
'settings.webPush.failed': 'No se pudo activar push en este dispositivo.',
'settings.currency': 'Moneda de visualización',
'settings.currencyHint':
'Los importes en Costes se muestran convertidos a esta moneda solo a efectos de visualización — los importes originales no se modifican.',
+3
View File
@@ -19,6 +19,9 @@ const admin: TranslationStrings = {
'admin.notifications.testNtfyFailed': 'Ntfy testteavituse saatmine ebaõnnestus',
'admin.notifications.emailPanel.title': 'E-post (SMTP)',
'admin.notifications.webhookPanel.title': 'Veebihaak',
'admin.notifications.webPushPanel.title': 'Veebitõuketeavitused',
'admin.notifications.webPushPanel.hint':
"Võimaldab kasutajatel saada brauseri kaudu teavitusi oma telefonides ja arvutites ka siis, kui TREK on suletud. Vajab HTTPS-i; iPhone'is ja iPadis tuleb TREK lisada avakuvale.",
'admin.notifications.inappPanel.title': 'Rakenduses',
'admin.notifications.inappPanel.hint':
'Rakendusesisesed teavitused on alati aktiivsed ja neid ei saa kõigi jaoks välja lülitada.',
+5 -3
View File
@@ -1050,11 +1050,13 @@ const help: TranslationStrings = {
'Kõrge kvaliteediga režiim servade silumiseks ja gloobuse projektsiooniks; Salvesta kaart salvestab valiku.',
'help.ctx.settings-notifications.title': 'Teavitused',
'help.ctx.settings-notifications.summary':
'Kus TREK sinuni väljaspool rakendust jõuab: ntfy teema, veebihaak või plugina pakutav kanal. Kanalite all otsustab iga sündmuse rida, mis kuhu läheb.',
'Kus TREK sinuni väljaspool rakendust jõuab: tõuketeavitused selles seadmes, ntfy teema, veebihaak või plugina pakutav kanal. Kanalite all otsustab iga sündmuse rida, mis kuhu läheb.',
'help.ctx.settings-notifications.bullet.1':
'ntfy: teema, valikuline oma server ja valikuline pääsutõend, koos nupuga Testi, mis saadab kohe ühe sõnumi.',
'help.ctx.settings-notifications.bullet.2': 'Veebihaak: üks URL, mis saab iga sündmuse JSON-ina, koos nupuga Testi.',
'help.ctx.settings-notifications.bullet.3':
'Tõuketeavitused selles seadmes: Lülita selles seadmes sisse kehtib ainult brauserile, mida praegu kasutad, seega korda seda igas telefonis või arvutis. Saada test jõuab kõigini.',
'help.ctx.settings-notifications.bullet.4':
'Eelistuste read: iga sündmuse puhul, milline kanal on sees. Plugina kanalitel on nupp Seadista, kuni need on seadistatud.',
'help.ctx.settings-integrations.title': 'Liidestused',
'help.ctx.settings-integrations.summary':
@@ -1376,7 +1378,7 @@ const help: TranslationStrings = {
'help.ctx.admin-notifications.summary':
'Kanalid, mida instants oma kasutajatele pakub, ja need, mis jõuavad sinuni administraatorina. Kasutajad valivad oma teemad ja URL-id jaotises Seaded; sina otsustad, mis on olemas, ja seadistad e-posti.',
'help.ctx.admin-notifications.bullet.1':
'Rakenduses, E-post (SMTP), Ntfy ja Veebihaak: igaühel oma paneel lülitiga, mis pakub kanalit kasutajatele, ja serveripoolse seadistusega, mida see vajab.',
'Rakenduses, E-post (SMTP), Ntfy, Veebihaak ja Veebitõuketeavitused: igaühel oma paneel lülitiga, mis pakub kanalit kasutajatele, ja serveripoolse seadistusega, mida see vajab.',
'help.ctx.admin-notifications.bullet.2': 'Reisi meeldetuletused: kas server saadab meeldetuletuse enne reisi algust.',
'help.ctx.admin-notifications.bullet.3':
'Administraatori ntfy ja Administraatori veebihaak: kuhu lähevad administraatori sündmused, nagu ebaõnnestunud varundus või uus väljalase, koos nupuga Testi.',
@@ -1638,7 +1640,7 @@ const help: TranslationStrings = {
'help.guide.channels-instance.step.1':
'Jaotises E-post (SMTP) sisesta SMTP-host, SMTP-port, SMTP-kasutaja, SMTP-parool ja Saatja aadress; Saada testkiri saadab sulle kirja.',
'help.guide.channels-instance.step.2':
'Nende pakkumiseks lülita sisse Ntfy ja Veebihaak; seejärel sisestavad kasutajad oma teema või URL-i jaotises Seaded, Teavitused.',
'Nende pakkumiseks lülita sisse Veebitõuketeavitused, Ntfy ja Veebihaak; seejärel lülitavad kasutajad jaotises Seaded, Teavitused tõuketeavitused iga seadme jaoks sisse või sisestavad oma teema või URL-i.',
'help.guide.channels-instance.step.3':
'Reisi meeldetuletused lülitab sisse või välja meeldetuletuse enne reisi algust; Rakenduses on alati sees ja seda ainult selgitatakse siin.',
'help.guide.channels-instance.result': 'Iga kasutaja vahekaardil Teavitused on näha kanalid, mille sisse lülitasid.',
+13
View File
@@ -131,6 +131,19 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.testFailed': 'Test ebaõnnestus.',
'settings.notificationPreferences.pluginConfigured': 'Seadistatud. Halda kasutajaandmeid plugina seadete lehel.',
'settings.notificationPreferences.ntfy': 'Ntfy',
'settings.notificationPreferences.push': 'Tõuketeavitus',
'settings.webPush.title': 'Tõuketeavitused selles seadmes',
'settings.webPush.hint':
'Näitab TREKi teavitusi selles seadmes ka siis, kui TREK on suletud. Milliseid sündmusi saabub, määrab veerg Tõuketeavitus.',
'settings.webPush.enable': 'Lülita selles seadmes sisse',
'settings.webPush.disable': 'Lülita selles seadmes välja',
'settings.webPush.enabled': 'Selles seadmes sisse lülitatud',
'settings.webPush.unsupported': 'See brauser ei saa tõuketeavitusi vastu võtta.',
'settings.webPush.insecure': 'Tõuketeavituste jaoks peab TREK olema avatud HTTPS-i kaudu.',
'settings.webPush.iosInstall': "iPhone'is ja iPadis lisa TREK esmalt avakuvale ja ava see sealt.",
'settings.webPush.denied':
'TREKi teavitused on selles brauseris blokeeritud. Luba need brauseri seadetes ja proovi siis uuesti.',
'settings.webPush.failed': 'Tõuketeavitusi ei õnnestunud selles seadmes sisse lülitada.',
'settings.notificationPreferences.noChannels':
'Ühtegi teavituskanalit pole seadistatud. Palu administraatoril seadistada e-posti või veebihaagi teavitused.',
'settings.webhookUrl.label': 'Veebihaagi URL',
+3
View File
@@ -728,6 +728,9 @@ const admin: TranslationStrings = {
'admin.tabs.permissions': 'Permissions',
'admin.notifications.emailPanel.title': 'Email (SMTP)',
'admin.notifications.webhookPanel.title': 'Webhook',
'admin.notifications.webPushPanel.title': 'Web Push',
'admin.notifications.webPushPanel.hint':
"Permet aux utilisateurs de recevoir des notifications sur leurs téléphones et ordinateurs via le navigateur, même quand TREK est fermé. Nécessite HTTPS ; sur iPhone et iPad, TREK doit être ajouté à l'écran d'accueil.",
'admin.notifications.inappPanel.title': 'In-App',
'admin.notifications.inappPanel.hint':
'Les notifications in-app sont toujours actives et ne peuvent pas être désactivées globalement.',
+5 -3
View File
@@ -1087,11 +1087,13 @@ const help: TranslationStrings = {
'Mode haute qualité pour l’anticrénelage et la projection en globe ; Enregistrer la carte écrit le choix.',
'help.ctx.settings-notifications.title': 'Notifications',
'help.ctx.settings-notifications.summary':
'Où TREK vous joint en dehors de l’application : un sujet ntfy, un webhook ou un canal fourni par un module. Sous les canaux, une ligne par événement décide de ce qui va où.',
'Où TREK vous joint en dehors de l’application : des notifications push sur cet appareil, un sujet ntfy, un webhook ou un canal fourni par un module. Sous les canaux, une ligne par événement décide de ce qui va où.',
'help.ctx.settings-notifications.bullet.1':
'ntfy : le sujet, un serveur à vous en option et un jeton d’accès en option, avec Tester pour en envoyer un tout de suite.',
'help.ctx.settings-notifications.bullet.2': 'Webhook : une URL qui reçoit chaque événement en JSON, avec Tester.',
'help.ctx.settings-notifications.bullet.3':
'Notifications push sur cet appareil : Activer sur cet appareil ne concerne que le navigateur que vous utilisez, alors répétez-le sur chaque téléphone ou ordinateur. Envoyer un test les atteint tous.',
'help.ctx.settings-notifications.bullet.4':
'Les lignes de préférences : par événement, quel canal est actif. Les canaux de modules affichent Configurer tant qu’ils ne sont pas configurés.',
'help.ctx.settings-integrations.title': 'Intégrations',
'help.ctx.settings-integrations.summary':
@@ -1429,7 +1431,7 @@ const help: TranslationStrings = {
'help.ctx.admin-notifications.summary':
'Les canaux que l’instance propose à ses utilisateurs, et ceux qui vous joignent en tant qu’admin. Les utilisateurs choisissent leurs propres sujets et URL sous Paramètres ; vous décidez de ce qui existe et configurez l’e-mail.',
'help.ctx.admin-notifications.bullet.1':
'In-App, Email (SMTP), Ntfy et Webhook : un panneau chacun, avec un interrupteur qui propose le canal aux utilisateurs et la configuration côté serveur dont il a besoin.',
'In-App, Email (SMTP), Ntfy, Webhook et Web Push : un panneau chacun, avec un interrupteur qui propose le canal aux utilisateurs et la configuration côté serveur dont il a besoin.',
'help.ctx.admin-notifications.bullet.2':
'Rappels de voyage : si le serveur envoie le rappel avant le début d’un voyage.',
'help.ctx.admin-notifications.bullet.3':
@@ -1693,7 +1695,7 @@ const help: TranslationStrings = {
'help.guide.channels-instance.step.1':
'Sous Email (SMTP), saisissez SMTP Host, SMTP Port, SMTP User, SMTP Password et la From Address ; Envoyer un e-mail de test vous envoie un message.',
'help.guide.channels-instance.step.2':
'Activez Ntfy et Webhook pour les proposer ; les utilisateurs saisissent ensuite leur propre sujet ou URL sous Paramètres, Notifications.',
'Activez Web Push, Ntfy et Webhook pour les proposer ; les utilisateurs activent ensuite le push appareil par appareil, ou saisissent leur propre sujet ou URL, sous Paramètres, Notifications.',
'help.guide.channels-instance.step.3':
'Rappels de voyage commande le rappel avant le début d’un voyage ; In-App est toujours actif et seulement expliqué ici.',
'help.guide.channels-instance.result':
+14
View File
@@ -327,6 +327,20 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.webhook': 'Webhook',
'settings.notificationPreferences.email': 'Email',
'settings.notificationPreferences.ntfy': 'Ntfy',
'settings.notificationPreferences.push': 'Push',
'settings.webPush.title': 'Notifications push sur cet appareil',
'settings.webPush.hint':
'Affiche les notifications de TREK sur cet appareil, même quand TREK est fermé. Les événements reçus suivent la colonne Push.',
'settings.webPush.enable': 'Activer sur cet appareil',
'settings.webPush.disable': 'Désactiver sur cet appareil',
'settings.webPush.enabled': 'Activé sur cet appareil',
'settings.webPush.unsupported': 'Ce navigateur ne peut pas recevoir de notifications push.',
'settings.webPush.insecure': 'Le push nécessite que TREK soit ouvert en HTTPS.',
'settings.webPush.iosInstall':
"Sur iPhone et iPad, ajoutez d'abord TREK à l'écran d'accueil, puis ouvrez-le depuis celui-ci.",
'settings.webPush.denied':
'Les notifications sont bloquées pour TREK dans ce navigateur. Autorisez-les dans les réglages du navigateur, puis réessayez.',
'settings.webPush.failed': "Le push n'a pas pu être activé sur cet appareil.",
'settings.currency': "Devise d'affichage",
'settings.currencyHint':
"Les montants dans Coûts sont convertis dans cette devise uniquement pour l'affichage — les montants d'origine restent inchangés.",
+3
View File
@@ -19,6 +19,9 @@ const admin: TranslationStrings = {
'admin.notifications.testNtfyFailed': 'Η δοκιμή ntfy απέτυχε',
'admin.notifications.emailPanel.title': 'Email (SMTP)',
'admin.notifications.webhookPanel.title': 'Webhook',
'admin.notifications.webPushPanel.title': 'Web Push',
'admin.notifications.webPushPanel.hint':
'Επιτρέπει στους χρήστες να λαμβάνουν ειδοποιήσεις στα τηλέφωνα και τους υπολογιστές τους μέσω του προγράμματος περιήγησης, ακόμη και όταν το TREK είναι κλειστό. Απαιτεί HTTPS· σε iPhone και iPad το TREK πρέπει να προστεθεί στην οθόνη Αφετηρίας.',
'admin.notifications.inappPanel.title': 'Εντός εφαρμογής',
'admin.notifications.inappPanel.hint':
'Οι ειδοποιήσεις εντός εφαρμογής είναι πάντα ενεργές και δεν μπορούν να απενεργοποιηθούν καθολικά.',
+5 -3
View File
@@ -1094,11 +1094,13 @@ const help: TranslationStrings = {
'Λειτουργία Υψηλής Ποιότητας για εξομάλυνση και προβολή υδρογείου· η Αποθήκευση Χάρτη γράφει την επιλογή.',
'help.ctx.settings-notifications.title': 'Ειδοποιήσεις',
'help.ctx.settings-notifications.summary':
'Πού σας βρίσκει το TREK έξω από την εφαρμογή: ένα θέμα ntfy, ένα webhook ή ένα κανάλι που παρέχει ένα πρόσθετο. Κάτω από τα κανάλια, μία γραμμή ανά συμβάν αποφασίζει τι πάει πού.',
'Πού σας βρίσκει το TREK έξω από την εφαρμογή: push ειδοποιήσεις σε αυτή τη συσκευή, ένα θέμα ntfy, ένα webhook ή ένα κανάλι που παρέχει ένα πρόσθετο. Κάτω από τα κανάλια, μία γραμμή ανά συμβάν αποφασίζει τι πάει πού.',
'help.ctx.settings-notifications.bullet.1':
'ntfy: το θέμα, ένας προαιρετικός δικός σας διακομιστής και ένα προαιρετικό access token, με Δοκιμή για να στείλετε ένα αμέσως.',
'help.ctx.settings-notifications.bullet.2': 'Webhook: ένα URL που λαμβάνει κάθε συμβάν ως JSON, με Δοκιμή.',
'help.ctx.settings-notifications.bullet.3':
'Push ειδοποιήσεις σε αυτή τη συσκευή: η Ενεργοποίηση για αυτή τη συσκευή αφορά μόνο το πρόγραμμα περιήγησης που χρησιμοποιείτε, γι’ αυτό επαναλάβετέ την σε κάθε κινητό ή υπολογιστή. Η Αποστολή δοκιμής φτάνει σε όλες τις συσκευές.',
'help.ctx.settings-notifications.bullet.4':
'Οι γραμμές προτιμήσεων: ανά συμβάν, ποιο κανάλι είναι ενεργό. Τα κανάλια προσθέτων δείχνουν Ρύθμιση μέχρι να ρυθμιστούν.',
'help.ctx.settings-integrations.title': 'Ενσωματώσεις',
'help.ctx.settings-integrations.summary':
@@ -1440,7 +1442,7 @@ const help: TranslationStrings = {
'help.ctx.admin-notifications.summary':
'Τα κανάλια που η εγκατάσταση προσφέρει στους χρήστες της, και εκείνα που φτάνουν σε εσάς ως διαχειριστή. Οι χρήστες επιλέγουν τα δικά τους θέματα και URL στις Ρυθμίσεις· εσείς αποφασίζετε τι υπάρχει και ρυθμίζετε το email.',
'help.ctx.admin-notifications.bullet.1':
'Εντός εφαρμογής, Email (SMTP), Ntfy και Webhook: ένα πάνελ για καθένα, με διακόπτη που προσφέρει το κανάλι στους χρήστες και τη διαμόρφωση διακομιστή που χρειάζεται.',
'Εντός εφαρμογής, Email (SMTP), Ntfy, Webhook και Web Push: ένα πάνελ για καθένα, με διακόπτη που προσφέρει το κανάλι στους χρήστες και τη διαμόρφωση διακομιστή που χρειάζεται.',
'help.ctx.admin-notifications.bullet.2':
'Υπενθυμίσεις Ταξιδιού: αν ο διακομιστής στέλνει την υπενθύμιση πριν ξεκινήσει ένα ταξίδι.',
'help.ctx.admin-notifications.bullet.3':
@@ -1702,7 +1704,7 @@ const help: TranslationStrings = {
'help.guide.channels-instance.step.1':
'Στο Email (SMTP), εισαγάγετε SMTP Host, SMTP Port, SMTP User, SMTP Password και From Address· η Αποστολή δοκιμαστικού email στέλνει ένα μήνυμα σε εσάς.',
'help.guide.channels-instance.step.2':
'Ενεργοποιήστε Ntfy και Webhook για να τα προσφέρετε· οι χρήστες μετά εισάγουν το δικό τους θέμα ή URL στις Ρυθμίσεις, Ειδοποιήσεις.',
'Ενεργοποιήστε Web Push, Ntfy και Webhook για να τα προσφέρετε· οι χρήστες μετά ενεργοποιούν το push ανά συσκευή ή εισάγουν το δικό τους θέμα ή URL στις Ρυθμίσεις, Ειδοποιήσεις.',
'help.guide.channels-instance.step.3':
'Οι Υπενθυμίσεις Ταξιδιού ρυθμίζουν την υπενθύμιση πριν ξεκινήσει ένα ταξίδι· το Εντός εφαρμογής είναι πάντα ενεργό και απλώς εξηγείται εδώ.',
'help.guide.channels-instance.result': 'Η καρτέλα Ειδοποιήσεις κάθε χρήστη δείχνει τα κανάλια που ενεργοποιήσατε.',
+14
View File
@@ -123,6 +123,20 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.pluginConfigured':
'Ρυθμίστηκε. Διαχειριστείτε τα διαπιστευτήρια στη σελίδα ρυθμίσεων του πρόσθετου.',
'settings.notificationPreferences.ntfy': 'Ntfy',
'settings.notificationPreferences.push': 'Push',
'settings.webPush.title': 'Push ειδοποιήσεις σε αυτή τη συσκευή',
'settings.webPush.hint':
'Εμφανίζει τις ειδοποιήσεις του TREK σε αυτή τη συσκευή ακόμη και όταν το TREK είναι κλειστό. Ποια συμβάντα φτάνουν καθορίζεται από τη στήλη Push.',
'settings.webPush.enable': 'Ενεργοποίηση για αυτή τη συσκευή',
'settings.webPush.disable': 'Απενεργοποίηση για αυτή τη συσκευή',
'settings.webPush.enabled': 'Ενεργό για αυτή τη συσκευή',
'settings.webPush.unsupported': 'Αυτό το πρόγραμμα περιήγησης δεν μπορεί να λάβει push ειδοποιήσεις.',
'settings.webPush.insecure': 'Για το push, το TREK πρέπει να ανοίγει μέσω HTTPS.',
'settings.webPush.iosInstall':
'Σε iPhone και iPad, προσθέστε πρώτα το TREK στην οθόνη Αφετηρίας και ανοίξτε το από εκεί.',
'settings.webPush.denied':
'Οι ειδοποιήσεις για το TREK είναι αποκλεισμένες σε αυτό το πρόγραμμα περιήγησης. Επιτρέψτε τις στις ρυθμίσεις του προγράμματος περιήγησης και δοκιμάστε ξανά.',
'settings.webPush.failed': 'Δεν ήταν δυνατή η ενεργοποίηση του push για αυτή τη συσκευή.',
'settings.notificationPreferences.noChannels':
'Δεν έχουν διαμορφωθεί κανάλια ειδοποιήσεων. Ζητήστε από έναν διαχειριστή να ρυθμίσει ειδοποιήσεις email ή webhook.',
'settings.webhookUrl.label': 'Webhook URL',
+3
View File
@@ -728,6 +728,9 @@ const admin: TranslationStrings = {
'admin.tabs.permissions': 'Jogosultságok',
'admin.notifications.emailPanel.title': 'Email (SMTP)',
'admin.notifications.webhookPanel.title': 'Webhook',
'admin.notifications.webPushPanel.title': 'Web Push',
'admin.notifications.webPushPanel.hint':
'Lehetővé teszi a felhasználóknak, hogy a böngészőn keresztül értesítéseket kapjanak telefonjukon és számítógépükön, akkor is, ha a TREK be van zárva. HTTPS szükséges; iPhone-on és iPaden a TREK-et hozzá kell adni a Főképernyőhöz.',
'admin.notifications.inappPanel.title': 'In-App',
'admin.notifications.inappPanel.hint':
'Az alkalmazáson belüli értesítések mindig aktívak, és globálisan nem kapcsolhatók ki.',
+5 -3
View File
@@ -1066,11 +1066,13 @@ const help: TranslationStrings = {
'Magas minőség mód az élsimításhoz és a gömbvetülethez; a Térkép mentése írja be a választást.',
'help.ctx.settings-notifications.title': 'Értesítések',
'help.ctx.settings-notifications.summary':
'Hol ér el a TREK az alkalmazáson kívül: egy ntfy-téma, egy webhook vagy egy bővítmény által adott csatorna. A csatornák alatt eseményenként egy sor dönti el, mi hová megy.',
'Hol ér el a TREK az alkalmazáson kívül: push értesítések ezen az eszközön, egy ntfy-téma, egy webhook vagy egy bővítmény által adott csatorna. A csatornák alatt eseményenként egy sor dönti el, mi hová megy.',
'help.ctx.settings-notifications.bullet.1':
'ntfy: a téma, egy opcionális saját szerver és egy opcionális hozzáférési token, a Teszt gombbal, amely azonnal küld egyet.',
'help.ctx.settings-notifications.bullet.2': 'Webhook: egy URL, amely minden eseményt JSON-ként kap, Teszt gombbal.',
'help.ctx.settings-notifications.bullet.3':
'Push értesítések ezen az eszközön: a Bekapcsolás ezen az eszközön csak az éppen használt böngészőre vonatkozik, ezért ismételd meg minden telefonon vagy számítógépen. A Teszt küldése mindegyikre eljut.',
'help.ctx.settings-notifications.bullet.4':
'A preferencia-sorok: eseményenként, melyik csatorna van bekapcsolva. A bővítménycsatornák a Beállítás feliratot mutatják, amíg nincsenek beállítva.',
'help.ctx.settings-integrations.title': 'Integrációk',
'help.ctx.settings-integrations.summary':
@@ -1399,7 +1401,7 @@ const help: TranslationStrings = {
'help.ctx.admin-notifications.summary':
'A csatornák, amelyeket a példány a felhasználóinak kínál, és azok, amelyek téged mint admint érnek el. A felhasználók a Beállítások alatt választják saját témáikat és URL-jeiket; te döntöd el, mi létezik, és te állítod be az e-mailt.',
'help.ctx.admin-notifications.bullet.1':
'In-App, Email (SMTP), Ntfy és Webhook: mindegyiknek egy panel, egy kapcsolóval, amely felkínálja a csatornát a felhasználóknak, és a szerveroldali beállítással, amelyre szüksége van.',
'In-App, Email (SMTP), Ntfy, Webhook és Web Push: mindegyiknek egy panel, egy kapcsolóval, amely felkínálja a csatornát a felhasználóknak, és a szerveroldali beállítással, amelyre szüksége van.',
'help.ctx.admin-notifications.bullet.2':
'Utazási emlékeztetők: küld-e a szerver emlékeztetőt egy utazás kezdete előtt.',
'help.ctx.admin-notifications.bullet.3':
@@ -1654,7 +1656,7 @@ const help: TranslationStrings = {
'help.guide.channels-instance.step.1':
'Az Email (SMTP) alatt add meg az SMTP Host, SMTP Port, SMTP User, SMTP Password és From Address értékeket; a Teszt e-mail küldése neked küld egy levelet.',
'help.guide.channels-instance.step.2':
'Kapcsold be az Ntfy és a Webhook kapcsolót a felkínálásukhoz; a felhasználók ezután a Beállítások, Értesítések alatt adják meg saját témájukat vagy URL-jüket.',
'Kapcsold be a Web Push, az Ntfy és a Webhook kapcsolót a felkínálásukhoz; a felhasználók ezután a Beállítások, Értesítések alatt eszközönként bekapcsolják a pusht, vagy megadják saját témájukat vagy URL-jüket.',
'help.guide.channels-instance.step.3':
'Az Utazási emlékeztetők az utazás kezdete előtti emlékeztetőt kapcsolja; az In-App mindig be van kapcsolva, és itt csak magyarázat van hozzá.',
'help.guide.channels-instance.result': 'Minden felhasználó Értesítések füle a bekapcsolt csatornákat mutatja.',
+13
View File
@@ -323,6 +323,19 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.webhook': 'Webhook',
'settings.notificationPreferences.email': 'Email',
'settings.notificationPreferences.ntfy': 'Ntfy',
'settings.notificationPreferences.push': 'Push',
'settings.webPush.title': 'Push értesítések ezen az eszközön',
'settings.webPush.hint':
'Megjeleníti a TREK értesítéseit ezen az eszközön, akkor is, ha a TREK be van zárva. Hogy mely események érkeznek meg, azt a Push oszlop dönti el.',
'settings.webPush.enable': 'Bekapcsolás ezen az eszközön',
'settings.webPush.disable': 'Kikapcsolás ezen az eszközön',
'settings.webPush.enabled': 'Bekapcsolva ezen az eszközön',
'settings.webPush.unsupported': 'Ez a böngésző nem tud push értesítéseket fogadni.',
'settings.webPush.insecure': 'A pushhoz a TREK-et HTTPS-en keresztül kell megnyitni.',
'settings.webPush.iosInstall': 'iPhone-on és iPaden először add hozzá a TREK-et a Főképernyőhöz, és onnan nyisd meg.',
'settings.webPush.denied':
'A TREK értesítései le vannak tiltva ebben a böngészőben. Engedélyezd őket a böngésző beállításaiban, majd próbáld újra.',
'settings.webPush.failed': 'A pusht nem sikerült bekapcsolni ezen az eszközön.',
'settings.currency': 'Megjelenítési pénznem',
'settings.currencyHint':
'A Költségek részben az összegek csak a megjelenítéshez lesznek erre a pénznemre átszámítva – az eredeti összegek nem változnak.',
+3
View File
@@ -13,6 +13,9 @@ const admin: TranslationStrings = {
'admin.notifications.testWebhookFailed': 'Test webhook gagal',
'admin.notifications.emailPanel.title': 'Email (SMTP)',
'admin.notifications.webhookPanel.title': 'Webhook',
'admin.notifications.webPushPanel.title': 'Web Push',
'admin.notifications.webPushPanel.hint':
'Memungkinkan pengguna menerima notifikasi di ponsel dan komputer mereka melalui browser, bahkan saat TREK ditutup. Memerlukan HTTPS; di iPhone dan iPad, TREK harus ditambahkan ke Layar Utama.',
'admin.notifications.inappPanel.title': 'In-App',
'admin.notifications.inappPanel.hint': 'Notifikasi in-app selalu aktif dan tidak bisa dinonaktifkan secara global.',
'admin.notifications.adminWebhookPanel.title': 'Admin Webhook',
+5 -3
View File
@@ -1063,12 +1063,14 @@ const help: TranslationStrings = {
'“Mode kualitas tinggi” untuk antialiasing dan proyeksi bola dunia; “Simpan Peta” menulis pilihannya.',
'help.ctx.settings-notifications.title': 'Notifikasi',
'help.ctx.settings-notifications.summary':
'Di mana TREK menjangkau Anda di luar aplikasi: topik ntfy, webhook, atau saluran yang disediakan plugin. Di bawah saluran, satu baris per peristiwa menentukan apa yang dikirim ke mana.',
'Di mana TREK menjangkau Anda di luar aplikasi: notifikasi push di perangkat ini, topik ntfy, webhook, atau saluran yang disediakan plugin. Di bawah saluran, satu baris per peristiwa menentukan apa yang dikirim ke mana.',
'help.ctx.settings-notifications.bullet.1':
'ntfy: topik, server Anda sendiri yang opsional, dan token akses yang opsional, dengan “Uji” untuk langsung mengirim satu pesan.',
'help.ctx.settings-notifications.bullet.2':
'Webhook: satu URL yang menerima setiap peristiwa sebagai JSON, dengan “Uji”.',
'help.ctx.settings-notifications.bullet.3':
'Notifikasi push di perangkat ini: “Aktifkan untuk perangkat ini” hanya berlaku untuk browser yang sedang Anda gunakan, jadi ulangi di setiap ponsel atau komputer. “Kirim tes” sampai ke semuanya.',
'help.ctx.settings-notifications.bullet.4':
'Baris preferensi: per peristiwa, saluran mana yang aktif. Saluran plugin menampilkan “Konfigurasi” sampai selesai disiapkan.',
'help.ctx.settings-integrations.title': 'Integrasi',
'help.ctx.settings-integrations.summary':
@@ -1398,7 +1400,7 @@ const help: TranslationStrings = {
'help.ctx.admin-notifications.summary':
'Saluran yang ditawarkan instans kepada penggunanya, dan saluran yang menjangkau Anda sebagai admin. Pengguna memilih topik dan URL mereka sendiri di “Pengaturan”; Anda menentukan apa yang tersedia dan mengonfigurasi email.',
'help.ctx.admin-notifications.bullet.1':
'“In-App”, “Email (SMTP)”, “Ntfy”, dan “Webhook”: satu panel masing-masing, dengan sakelar yang menawarkan saluran itu kepada pengguna dan konfigurasi sisi server yang dibutuhkannya.',
'“In-App”, “Email (SMTP)”, “Ntfy”, “Webhook”, dan “Web Push”: satu panel masing-masing, dengan sakelar yang menawarkan saluran itu kepada pengguna dan konfigurasi sisi server yang dibutuhkannya.',
'help.ctx.admin-notifications.bullet.2':
'“Pengingat Perjalanan”: apakah server mengirim pengingat sebelum perjalanan dimulai.',
'help.ctx.admin-notifications.bullet.3':
@@ -1649,7 +1651,7 @@ const help: TranslationStrings = {
'help.guide.channels-instance.step.1':
'Di bawah “Email (SMTP)”, masukkan SMTP Host, SMTP Port, SMTP User, SMTP Password, dan From Address; “Kirim email uji” mengirim surat kepada Anda.',
'help.guide.channels-instance.step.2':
'Aktifkan “Ntfy” dan “Webhook” untuk menawarkannya; pengguna lalu memasukkan topik atau URL mereka sendiri di “Pengaturan”, “Notifikasi”.',
'Aktifkan “Web Push”, “Ntfy” dan “Webhook” untuk menawarkannya; pengguna lalu mengaktifkan push per perangkat, atau memasukkan topik atau URL mereka sendiri, di “Pengaturan”, “Notifikasi”.',
'help.guide.channels-instance.step.3':
'“Pengingat Perjalanan” mengatur pengingat sebelum perjalanan dimulai; “In-App” selalu aktif dan di sini hanya dijelaskan.',
'help.guide.channels-instance.result': 'Tab “Notifikasi” setiap pengguna menampilkan saluran yang Anda aktifkan.',
+14
View File
@@ -112,6 +112,20 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.testFailed': 'Tes gagal.',
'settings.notificationPreferences.pluginConfigured': 'Sudah diatur. Kelola kredensial di halaman pengaturan plugin.',
'settings.notificationPreferences.ntfy': 'Ntfy',
'settings.notificationPreferences.push': 'Push',
'settings.webPush.title': 'Notifikasi push di perangkat ini',
'settings.webPush.hint':
'Menampilkan notifikasi TREK di perangkat ini meskipun TREK sedang ditutup. Peristiwa yang dikirim mengikuti kolom Push.',
'settings.webPush.enable': 'Aktifkan untuk perangkat ini',
'settings.webPush.disable': 'Nonaktifkan untuk perangkat ini',
'settings.webPush.enabled': 'Aktif untuk perangkat ini',
'settings.webPush.unsupported': 'Browser ini tidak dapat menerima notifikasi push.',
'settings.webPush.insecure': 'Push memerlukan TREK dibuka melalui HTTPS.',
'settings.webPush.iosInstall':
'Di iPhone dan iPad, tambahkan TREK ke Layar Utama terlebih dahulu, lalu buka dari sana.',
'settings.webPush.denied':
'Notifikasi untuk TREK diblokir di browser ini. Izinkan di pengaturan browser, lalu coba lagi.',
'settings.webPush.failed': 'Push tidak dapat diaktifkan untuk perangkat ini.',
'settings.notificationPreferences.noChannels':
'Belum ada saluran notifikasi yang dikonfigurasi. Minta admin untuk mengatur notifikasi email atau webhook.',
'settings.webhookUrl.label': 'Webhook URL',
+3
View File
@@ -723,6 +723,9 @@ const admin: TranslationStrings = {
'admin.tabs.permissions': 'Permessi',
'admin.notifications.emailPanel.title': 'Email (SMTP)',
'admin.notifications.webhookPanel.title': 'Webhook',
'admin.notifications.webPushPanel.title': 'Web Push',
'admin.notifications.webPushPanel.hint':
'Consente agli utenti di ricevere notifiche su telefoni e computer tramite il browser, anche quando TREK è chiuso. Richiede HTTPS; su iPhone e iPad TREK deve essere aggiunto alla schermata Home.',
'admin.notifications.inappPanel.title': 'In-App',
'admin.notifications.inappPanel.hint':
'Le notifiche in-app sono sempre attive e non possono essere disabilitate globalmente.',
+5 -3
View File
@@ -1063,11 +1063,13 @@ const help: TranslationStrings = {
'Modalità alta qualità per l’antialiasing e la proiezione a globo; Salva Mappa scrive la scelta.',
'help.ctx.settings-notifications.title': 'Notifiche',
'help.ctx.settings-notifications.summary':
'Dove TREK ti raggiunge fuori dall’app: un argomento ntfy, un webhook o un canale fornito da un plugin. Sotto i canali, una riga per evento decide cosa va dove.',
'Dove TREK ti raggiunge fuori dall’app: notifiche push su questo dispositivo, un argomento ntfy, un webhook o un canale fornito da un plugin. Sotto i canali, una riga per evento decide cosa va dove.',
'help.ctx.settings-notifications.bullet.1':
'ntfy: l’argomento, un server tuo opzionale e un token di accesso opzionale, con Testa per inviarne uno subito.',
'help.ctx.settings-notifications.bullet.2': 'Webhook: un URL che riceve ogni evento come JSON, con Testa.',
'help.ctx.settings-notifications.bullet.3':
'Notifiche push su questo dispositivo: Attiva su questo dispositivo vale solo per il browser che stai usando, quindi ripetilo su ogni telefono o computer. Invia test li raggiunge tutti.',
'help.ctx.settings-notifications.bullet.4':
'Le righe delle preferenze: per evento, quale canale è attivo. I canali dei plugin mostrano Configura finché non sono impostati.',
'help.ctx.settings-integrations.title': 'Integrazioni',
'help.ctx.settings-integrations.summary':
@@ -1391,7 +1393,7 @@ const help: TranslationStrings = {
'help.ctx.admin-notifications.summary':
'I canali che l’istanza offre ai suoi utenti, e quelli che raggiungono te come admin. Gli utenti scelgono i propri topic e URL sotto Impostazioni; tu decidi cosa esiste e configuri l’email.',
'help.ctx.admin-notifications.bullet.1':
'In-App, Email (SMTP), Ntfy e Webhook: un pannello ciascuno, con un interruttore che offre il canale agli utenti e la configurazione lato server di cui ha bisogno.',
'In-App, Email (SMTP), Ntfy, Webhook e Web Push: un pannello ciascuno, con un interruttore che offre il canale agli utenti e la configurazione lato server di cui ha bisogno.',
'help.ctx.admin-notifications.bullet.2':
'Promemoria viaggio: se il server invia il promemoria prima che un viaggio inizi.',
'help.ctx.admin-notifications.bullet.3':
@@ -1637,7 +1639,7 @@ const help: TranslationStrings = {
'help.guide.channels-instance.step.1':
'Sotto Email (SMTP), inserisci SMTP Host, SMTP Port, SMTP User, SMTP Password e la From Address; Invia email di prova manda una mail a te.',
'help.guide.channels-instance.step.2':
'Accendi Ntfy e Webhook per offrirli; gli utenti inseriscono poi il proprio topic o URL sotto Impostazioni, Notifiche.',
'Accendi Web Push, Ntfy e Webhook per offrirli; gli utenti poi attivano il push per ogni dispositivo, oppure inseriscono il proprio topic o URL, sotto Impostazioni, Notifiche.',
'help.guide.channels-instance.step.3':
'Promemoria viaggio comanda il promemoria prima che un viaggio inizi; In-App è sempre acceso e qui viene solo spiegato.',
'help.guide.channels-instance.result': 'La scheda Notifiche di ogni utente mostra i canali che hai acceso.',
+13
View File
@@ -322,6 +322,19 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.webhook': 'Webhook',
'settings.notificationPreferences.email': 'Email',
'settings.notificationPreferences.ntfy': 'Ntfy',
'settings.notificationPreferences.push': 'Push',
'settings.webPush.title': 'Notifiche push su questo dispositivo',
'settings.webPush.hint':
'Mostra le notifiche di TREK su questo dispositivo anche quando TREK è chiuso. Gli eventi che arrivano seguono la colonna Push.',
'settings.webPush.enable': 'Attiva su questo dispositivo',
'settings.webPush.disable': 'Disattiva su questo dispositivo',
'settings.webPush.enabled': 'Attivo su questo dispositivo',
'settings.webPush.unsupported': 'Questo browser non può ricevere notifiche push.',
'settings.webPush.insecure': 'Per il push TREK deve essere aperto tramite HTTPS.',
'settings.webPush.iosInstall': 'Su iPhone e iPad, aggiungi prima TREK alla schermata Home e aprilo da lì.',
'settings.webPush.denied':
'Le notifiche per TREK sono bloccate in questo browser. Consentile nelle impostazioni del browser, poi riprova.',
'settings.webPush.failed': 'Non è stato possibile attivare il push su questo dispositivo.',
'settings.currency': 'Valuta di visualizzazione',
'settings.currencyHint':
'Gli importi in Costi vengono mostrati convertiti in questa valuta solo per la visualizzazione — gli importi originali restano invariati.',
+3
View File
@@ -18,6 +18,9 @@ const admin: TranslationStrings = {
'admin.notifications.testNtfyFailed': 'テストntfyに失敗しました',
'admin.notifications.emailPanel.title': 'メール(SMTP)',
'admin.notifications.webhookPanel.title': 'Webhook',
'admin.notifications.webPushPanel.title': 'Webプッシュ',
'admin.notifications.webPushPanel.hint':
'TREKを閉じている間も、ユーザーがブラウザ経由でスマートフォンやパソコンに通知を受け取れるようにします。HTTPSが必要です。iPhoneとiPadでは、TREKをホーム画面に追加する必要があります。',
'admin.notifications.inappPanel.title': 'アプリ内',
'admin.notifications.inappPanel.hint': 'アプリ内通知は常に有効で、全体では無効にできません。',
'admin.notifications.adminWebhookPanel.title': '管理者Webhook',
+5 -3
View File
@@ -1002,11 +1002,13 @@ const help: TranslationStrings = {
'アンチエイリアスと地球儀投影のための「高品質モード」。「地図を保存」で選択が書き込まれます。',
'help.ctx.settings-notifications.title': '通知',
'help.ctx.settings-notifications.summary':
'アプリの外でTREKがあなたに届く先:ntfyのトピック、Webhook、またはプラグインが提供するチャンネル。チャンネルの下では、イベントごとの行が何をどこへ送るかを決めます。',
'アプリの外でTREKがあなたに届く先:このデバイスへのプッシュ通知、ntfyのトピック、Webhook、またはプラグインが提供するチャンネル。チャンネルの下では、イベントごとの行が何をどこへ送るかを決めます。',
'help.ctx.settings-notifications.bullet.1':
'ntfy:トピック、任意で自前のサーバー、任意でアクセストークン。「テスト」ですぐに1件送信できます。',
'help.ctx.settings-notifications.bullet.2': 'Webhook:すべてのイベントをJSONで受け取る1つのURL。「テスト」付きです。',
'help.ctx.settings-notifications.bullet.3':
'このデバイスのプッシュ通知:「このデバイスでオンにする」は今使っているブラウザーだけが対象なので、スマートフォンやパソコンごとに行います。「テスト送信」はそのすべてに届きます。',
'help.ctx.settings-notifications.bullet.4':
'設定の行:イベントごとに、どのチャンネルがオンか。プラグインのチャンネルは設定が済むまで「設定する」と表示されます。',
'help.ctx.settings-integrations.title': '連携',
'help.ctx.settings-integrations.summary':
@@ -1327,7 +1329,7 @@ const help: TranslationStrings = {
'help.ctx.admin-notifications.summary':
'インスタンスがユーザーに提供するチャンネルと、管理者であるあなたに届くチャンネル。ユーザーは「設定」で自分のトピックやURLを選び、あなたは何を用意するかを決めてメールを設定します。',
'help.ctx.admin-notifications.bullet.1':
'「アプリ内」「メール(SMTP)」「Ntfy」「Webhook」:それぞれ1つのパネルに、チャンネルをユーザーに提供するスイッチと、必要なサーバー側の設定があります。',
'「アプリ内」「メール(SMTP)」「Ntfy」「Webhook」「Webプッシュ」:それぞれ1つのパネルに、チャンネルをユーザーに提供するスイッチと、必要なサーバー側の設定があります。',
'help.ctx.admin-notifications.bullet.2':
'「旅行リマインダー」:旅行が始まる前にサーバーがリマインダーを送るかどうか。',
'help.ctx.admin-notifications.bullet.3':
@@ -1569,7 +1571,7 @@ const help: TranslationStrings = {
'help.guide.channels-instance.step.1':
'「メール(SMTP)」の下で、SMTP Host、SMTP Port、SMTP User、SMTP Password、From Addressを入力します。「テストメール送信」であなた宛てにメールが送られます。',
'help.guide.channels-instance.step.2':
'「Ntfy」と「Webhook」をオンにして提供します。ユーザーは「設定」の「通知」で自分のトピックやURLを入力します。',
'「Webプッシュ」「Ntfy」「Webhook」をオンにして提供します。ユーザーは「設定」の「通知」で、デバイスごとにプッシュをオンにするか、自分のトピックやURLを入力します。',
'help.guide.channels-instance.step.3':
'「旅行リマインダー」は旅行が始まる前のリマインダーを切り替えます。「アプリ内」は常にオンで、ここでは説明されるだけです。',
'help.guide.channels-instance.result':
+13
View File
@@ -113,6 +113,19 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.testFailed': 'テストに失敗しました。',
'settings.notificationPreferences.pluginConfigured': '設定済みです。認証情報はプラグインの設定ページで管理します。',
'settings.notificationPreferences.ntfy': 'Ntfy',
'settings.notificationPreferences.push': 'プッシュ',
'settings.webPush.title': 'このデバイスのプッシュ通知',
'settings.webPush.hint':
'TREKを閉じている間も、このデバイスにTREKの通知を表示します。届くイベントは「プッシュ」列の設定に従います。',
'settings.webPush.enable': 'このデバイスでオンにする',
'settings.webPush.disable': 'このデバイスでオフにする',
'settings.webPush.enabled': 'このデバイスでオン',
'settings.webPush.unsupported': 'このブラウザはプッシュ通知を受信できません。',
'settings.webPush.insecure': 'プッシュ通知を使うには、TREKをHTTPSで開く必要があります。',
'settings.webPush.iosInstall': 'iPhoneとiPadでは、まずTREKをホーム画面に追加し、そこから開いてください。',
'settings.webPush.denied':
'このブラウザでTREKの通知がブロックされています。ブラウザの設定で許可してから、もう一度お試しください。',
'settings.webPush.failed': 'このデバイスでプッシュ通知をオンにできませんでした。',
'settings.notificationPreferences.noChannels': '通知チャネルが未設定です。管理者に設定を依頼してください。',
'settings.webhookUrl.label': 'Webhook URL',
'settings.webhookUrl.placeholder': 'https://discord.com/api/webhooks/...',
+3
View File
@@ -19,6 +19,9 @@ const admin: TranslationStrings = {
'admin.notifications.testNtfyFailed': '테스트 ntfy 실패',
'admin.notifications.emailPanel.title': '이메일 (SMTP)',
'admin.notifications.webhookPanel.title': '웹훅',
'admin.notifications.webPushPanel.title': '웹 푸시',
'admin.notifications.webPushPanel.hint':
'TREK이 닫혀 있어도 사용자가 브라우저를 통해 휴대폰과 컴퓨터에서 알림을 받을 수 있습니다. HTTPS가 필요하며, iPhone과 iPad에서는 TREK을 홈 화면에 추가해야 합니다.',
'admin.notifications.inappPanel.title': '앱 내',
'admin.notifications.inappPanel.hint': '앱 내 알림은 항상 활성화되어 있으며 전역으로 비활성화할 수 없습니다.',
'admin.notifications.adminWebhookPanel.title': '관리자 웹훅',
+5 -3
View File
@@ -980,11 +980,13 @@ const help: TranslationStrings = {
'help.ctx.settings-map.bullet.3': '안티앨리어싱과 지구본 투영을 위한 “고품질 모드”. “지도 저장”이 선택을 기록합니다.',
'help.ctx.settings-notifications.title': '알림',
'help.ctx.settings-notifications.summary':
'앱 밖에서 TREK이 나에게 닿는 곳: ntfy 토픽, 웹훅, 또는 플러그인이 제공하는 채널. 채널 아래에서는 이벤트마다 한 줄씩 무엇을 어디로 보낼지 정합니다.',
'앱 밖에서 TREK이 나에게 닿는 곳: 이 기기의 푸시 알림, ntfy 토픽, 웹훅, 또는 플러그인이 제공하는 채널. 채널 아래에서는 이벤트마다 한 줄씩 무엇을 어디로 보낼지 정합니다.',
'help.ctx.settings-notifications.bullet.1':
'ntfy: 토픽, 선택 사항인 내 서버, 선택 사항인 액세스 토큰. “테스트”로 바로 하나 보낼 수 있습니다.',
'help.ctx.settings-notifications.bullet.2': '웹훅: 모든 이벤트를 JSON으로 받는 URL 하나. “테스트”가 있습니다.',
'help.ctx.settings-notifications.bullet.3':
'이 기기의 푸시 알림: “이 기기에서 켜기”는 지금 쓰는 브라우저에만 적용되므로 휴대폰이나 컴퓨터마다 따로 켜야 합니다. “테스트 전송”은 켜 둔 모든 기기로 보냅니다.',
'help.ctx.settings-notifications.bullet.4':
'환경설정 행: 이벤트마다 어느 채널이 켜져 있는지. 플러그인 채널은 설정이 끝날 때까지 “설정하기”를 표시합니다.',
'help.ctx.settings-integrations.title': '통합',
'help.ctx.settings-integrations.summary':
@@ -1283,7 +1285,7 @@ const help: TranslationStrings = {
'help.ctx.admin-notifications.summary':
'인스턴스가 사용자에게 제공하는 채널과, 관리자인 나에게 닿는 채널입니다. 사용자는 “설정”에서 자기 토픽과 URL을 고르고, 나는 무엇을 제공할지 정하고 이메일을 설정합니다.',
'help.ctx.admin-notifications.bullet.1':
'“앱 내”, “이메일 (SMTP)”, “Ntfy”, “웹훅”: 패널 하나씩이며, 채널을 사용자에게 제공하는 스위치와 필요한 서버 측 설정이 있습니다.',
'“앱 내”, “이메일 (SMTP)”, “Ntfy”, “웹훅”, “웹 푸시”: 패널 하나씩이며, 채널을 사용자에게 제공하는 스위치와 필요한 서버 측 설정이 있습니다.',
'help.ctx.admin-notifications.bullet.2': '“여행 리마인더”: 여행 시작 전에 서버가 리마인더를 보낼지 여부.',
'help.ctx.admin-notifications.bullet.3':
'“관리자 Ntfy”와 “관리자 웹훅”: 실패한 백업이나 새 릴리스 같은 관리자 이벤트가 가는 곳이며, “테스트”가 있습니다.',
@@ -1505,7 +1507,7 @@ const help: TranslationStrings = {
'help.guide.channels-instance.step.1':
'“이메일 (SMTP)” 아래에서 SMTP Host, SMTP Port, SMTP User, SMTP Password, From Address를 입력합니다. “테스트 이메일 전송”은 나에게 메일을 보냅니다.',
'help.guide.channels-instance.step.2':
'“Ntfy”와 “웹훅”을 켜서 제공합니다. 그러면 사용자는 “설정”의 “알림”에서 자기 토픽이나 URL을 입력합니다.',
'“웹 푸시”, “Ntfy”, “웹훅”을 켜서 제공합니다. 그러면 사용자는 “설정”의 “알림”에서 기기별로 푸시를 켜거나 자기 토픽이나 URL을 입력합니다.',
'help.guide.channels-instance.step.3':
'“여행 리마인더”는 여행 시작 전 리마인더를 켜고 끕니다. “앱 내”는 언제나 켜져 있고 여기서는 설명만 합니다.',
'help.guide.channels-instance.result': '모든 사용자의 “알림” 탭에 내가 켠 채널이 나타납니다.',
+13
View File
@@ -114,6 +114,19 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.testFailed': '테스트에 실패했습니다.',
'settings.notificationPreferences.pluginConfigured': '설정됨. 자격 증명은 플러그인 설정 페이지에서 관리하세요.',
'settings.notificationPreferences.ntfy': 'Ntfy',
'settings.notificationPreferences.push': '푸시',
'settings.webPush.title': '이 기기의 푸시 알림',
'settings.webPush.hint':
'TREK이 닫혀 있어도 이 기기에 TREK 알림을 표시합니다. 어떤 이벤트가 도착할지는 푸시 열을 따릅니다.',
'settings.webPush.enable': '이 기기에서 켜기',
'settings.webPush.disable': '이 기기에서 끄기',
'settings.webPush.enabled': '이 기기에서 켜짐',
'settings.webPush.unsupported': '이 브라우저는 푸시 알림을 받을 수 없습니다.',
'settings.webPush.insecure': '푸시를 사용하려면 TREK을 HTTPS로 열어야 합니다.',
'settings.webPush.iosInstall': 'iPhone과 iPad에서는 먼저 TREK을 홈 화면에 추가한 뒤 그곳에서 여세요.',
'settings.webPush.denied':
'이 브라우저에서 TREK 알림이 차단되어 있습니다. 브라우저 설정에서 허용한 뒤 다시 시도하세요.',
'settings.webPush.failed': '이 기기에서 푸시를 켤 수 없습니다.',
'settings.notificationPreferences.noChannels':
'알림 채널이 설정되지 않았습니다. 관리자에게 이메일 또는 웹훅 알림 설정을 요청하세요.',
'settings.webhookUrl.label': '웹훅 URL',
+3
View File
@@ -719,6 +719,9 @@ const admin: TranslationStrings = {
'admin.tabs.permissions': 'Rechten',
'admin.notifications.emailPanel.title': 'Email (SMTP)',
'admin.notifications.webhookPanel.title': 'Webhook',
'admin.notifications.webPushPanel.title': 'Web Push',
'admin.notifications.webPushPanel.hint':
'Laat gebruikers via de browser meldingen ontvangen op hun telefoons en computers, ook als TREK gesloten is. Vereist HTTPS; op iPhone en iPad moet TREK aan het beginscherm worden toegevoegd.',
'admin.notifications.inappPanel.title': 'In-App',
'admin.notifications.inappPanel.hint':
'In-app-meldingen zijn altijd actief en kunnen niet globaal worden uitgeschakeld.',
+5 -3
View File
@@ -1068,11 +1068,13 @@ const help: TranslationStrings = {
'Hoge kwaliteit modus voor antialiasing en de globeprojectie; Kaart opslaan legt de keuze vast.',
'help.ctx.settings-notifications.title': 'Meldingen',
'help.ctx.settings-notifications.summary':
'Waar TREK je buiten de app bereikt: een ntfy-onderwerp, een webhook of een kanaal dat een plug-in levert. Onder de kanalen bepaalt één rij per gebeurtenis wat waarheen gaat.',
'Waar TREK je buiten de app bereikt: pushmeldingen op dit apparaat, een ntfy-onderwerp, een webhook of een kanaal dat een plug-in levert. Onder de kanalen bepaalt één rij per gebeurtenis wat waarheen gaat.',
'help.ctx.settings-notifications.bullet.1':
'ntfy: het onderwerp, optioneel een eigen server en een optioneel toegangstoken, met Testen om er meteen een te sturen.',
'help.ctx.settings-notifications.bullet.2': 'Webhook: één URL die elke gebeurtenis als JSON ontvangt, met Testen.',
'help.ctx.settings-notifications.bullet.3':
'Pushmeldingen op dit apparaat: Inschakelen op dit apparaat geldt alleen voor de browser die je nu gebruikt, dus herhaal het op elke telefoon of computer. Test versturen bereikt ze allemaal.',
'help.ctx.settings-notifications.bullet.4':
'De voorkeursrijen: per gebeurtenis welk kanaal aan staat. Plug-inkanalen tonen Instellen tot ze zijn ingesteld.',
'help.ctx.settings-integrations.title': 'Integraties',
'help.ctx.settings-integrations.summary':
@@ -1399,7 +1401,7 @@ const help: TranslationStrings = {
'help.ctx.admin-notifications.summary':
'De kanalen die de instantie zijn gebruikers aanbiedt, en de kanalen die jou als beheerder bereiken. Gebruikers kiezen hun eigen topics en URL’s onder Instellingen; jij bepaalt wat er bestaat en stelt e-mail in.',
'help.ctx.admin-notifications.bullet.1':
'In-App, Email (SMTP), Ntfy en Webhook: elk een paneel, met een schakelaar die het kanaal aan gebruikers aanbiedt en de serverconfiguratie die het nodig heeft.',
'In-App, Email (SMTP), Ntfy, Webhook en Web Push: elk een paneel, met een schakelaar die het kanaal aan gebruikers aanbiedt en de serverconfiguratie die het nodig heeft.',
'help.ctx.admin-notifications.bullet.2':
'Reisherinneringen: of de server de herinnering stuurt voordat een reis begint.',
'help.ctx.admin-notifications.bullet.3':
@@ -1652,7 +1654,7 @@ const help: TranslationStrings = {
'help.guide.channels-instance.step.1':
'Vul onder Email (SMTP) SMTP Host, SMTP Port, SMTP User, SMTP Password en de From Address in; Test-e-mail verzenden stuurt een mail naar jou.',
'help.guide.channels-instance.step.2':
'Zet Ntfy en Webhook aan om ze aan te bieden; gebruikers vullen dan hun eigen topic of URL in onder Instellingen, Meldingen.',
'Zet Web Push, Ntfy en Webhook aan om ze aan te bieden; gebruikers zetten dan push per apparaat aan, of vullen hun eigen topic of URL in, onder Instellingen, Meldingen.',
'help.guide.channels-instance.step.3':
'Reisherinneringen schakelt de herinnering voordat een reis begint; In-App staat altijd aan en wordt hier alleen uitgelegd.',
'help.guide.channels-instance.result':
+13
View File
@@ -322,6 +322,19 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.webhook': 'Webhook',
'settings.notificationPreferences.email': 'Email',
'settings.notificationPreferences.ntfy': 'Ntfy',
'settings.notificationPreferences.push': 'Push',
'settings.webPush.title': 'Pushmeldingen op dit apparaat',
'settings.webPush.hint':
'Toont TREK-meldingen op dit apparaat, ook als TREK gesloten is. Welke gebeurtenissen binnenkomen, volgt de kolom Push.',
'settings.webPush.enable': 'Inschakelen op dit apparaat',
'settings.webPush.disable': 'Uitschakelen op dit apparaat',
'settings.webPush.enabled': 'Ingeschakeld op dit apparaat',
'settings.webPush.unsupported': 'Deze browser kan geen pushmeldingen ontvangen.',
'settings.webPush.insecure': 'Voor push moet TREK via HTTPS geopend zijn.',
'settings.webPush.iosInstall': 'Zet TREK op iPhone en iPad eerst op het beginscherm en open het vanaf daar.',
'settings.webPush.denied':
'Meldingen voor TREK zijn in deze browser geblokkeerd. Sta ze toe in de browserinstellingen en probeer het opnieuw.',
'settings.webPush.failed': 'Push kon niet worden ingeschakeld op dit apparaat.',
'settings.currency': 'Weergavevaluta',
'settings.currencyHint':
'Bedragen onder Onkosten worden alleen ter weergave naar deze valuta omgerekend — de oorspronkelijke bedragen blijven ongewijzigd.',
+3
View File
@@ -727,6 +727,9 @@ const admin: TranslationStrings = {
'admin.notifications.testWebhookFailed': 'Testowy webhook nie powiódł się',
'admin.notifications.emailPanel.title': 'Email (SMTP)',
'admin.notifications.webhookPanel.title': 'Webhook',
'admin.notifications.webPushPanel.title': 'Web Push',
'admin.notifications.webPushPanel.hint':
'Pozwala użytkownikom otrzymywać powiadomienia na telefonach i komputerach przez przeglądarkę, nawet gdy TREK jest zamknięty. Wymaga HTTPS; na iPhonie i iPadzie TREK musi zostać dodany do ekranu początkowego.',
'admin.notifications.inappPanel.title': 'In-App',
'admin.notifications.inappPanel.hint':
'Powiadomienia w aplikacji są zawsze aktywne i nie można ich globalnie wyłączyć.',
+5 -3
View File
@@ -1040,11 +1040,13 @@ const help: TranslationStrings = {
'Tryb wysokiej jakości dla antyaliasingu i projekcji globusa; Zapisz mapę zapisuje wybór.',
'help.ctx.settings-notifications.title': 'Powiadomienia',
'help.ctx.settings-notifications.summary':
'Gdzie TREK dociera do Ciebie poza aplikacją: temat ntfy, webhook albo kanał dostarczany przez wtyczkę. Pod kanałami jeden wiersz na zdarzenie decyduje, co idzie dokąd.',
'Gdzie TREK dociera do Ciebie poza aplikacją: powiadomienia push na tym urządzeniu, temat ntfy, webhook albo kanał dostarczany przez wtyczkę. Pod kanałami jeden wiersz na zdarzenie decyduje, co idzie dokąd.',
'help.ctx.settings-notifications.bullet.1':
'ntfy: temat, opcjonalnie własny serwer i opcjonalny token dostępu, z Testuj, by od razu wysłać wiadomość.',
'help.ctx.settings-notifications.bullet.2': 'Webhook: jeden URL, który odbiera każde zdarzenie jako JSON, z Testuj.',
'help.ctx.settings-notifications.bullet.3':
'Powiadomienia push na tym urządzeniu: Włącz na tym urządzeniu dotyczy tylko przeglądarki, której używasz, więc powtórz to na każdym telefonie lub komputerze. Wyślij test trafia do nich wszystkich.',
'help.ctx.settings-notifications.bullet.4':
'Wiersze preferencji: dla każdego zdarzenia, który kanał jest włączony. Kanały wtyczek pokazują Skonfiguruj, dopóki nie są ustawione.',
'help.ctx.settings-integrations.title': 'Integracje',
'help.ctx.settings-integrations.summary':
@@ -1369,7 +1371,7 @@ const help: TranslationStrings = {
'help.ctx.admin-notifications.summary':
'Kanały, które instancja oferuje swoim użytkownikom, i te, które docierają do Ciebie jako administratora. Użytkownicy wybierają własne tematy i URL-e w Ustawienia; Ty decydujesz, co istnieje, i konfigurujesz e-mail.',
'help.ctx.admin-notifications.bullet.1':
'In-App, Email (SMTP), Ntfy i Webhook: po jednym panelu, z przełącznikiem, który oferuje kanał użytkownikom, i konfiguracją po stronie serwera, której potrzebuje.',
'In-App, Email (SMTP), Ntfy, Webhook i Web Push: po jednym panelu, z przełącznikiem, który oferuje kanał użytkownikom, i konfiguracją po stronie serwera, której potrzebuje.',
'help.ctx.admin-notifications.bullet.2':
'Przypomnienia o podróżach: czy serwer wysyła przypomnienie przed rozpoczęciem podróży.',
'help.ctx.admin-notifications.bullet.3':
@@ -1614,7 +1616,7 @@ const help: TranslationStrings = {
'help.guide.channels-instance.step.1':
'W Email (SMTP) wpisz SMTP Host, SMTP Port, SMTP User, SMTP Password i From Address; Wyślij testowego e-maila wysyła wiadomość do Ciebie.',
'help.guide.channels-instance.step.2':
'Włącz Ntfy i Webhook, by je zaoferować; użytkownicy wpisują wtedy własny temat lub URL w Ustawienia, Powiadomienia.',
'Włącz Web Push, Ntfy i Webhook, by je zaoferować; użytkownicy włączają wtedy push na każdym urządzeniu albo wpisują własny temat lub URL w Ustawienia, Powiadomienia.',
'help.guide.channels-instance.step.3':
'Przypomnienia o podróżach przełącza przypomnienie przed rozpoczęciem podróży; In-App jest zawsze włączony i tylko tu opisany.',
'help.guide.channels-instance.result': 'Zakładka Powiadomienia każdego użytkownika pokazuje kanały, które włączyłeś.',
+13
View File
@@ -316,6 +316,19 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.webhook': 'Webhook',
'settings.notificationPreferences.email': 'Email',
'settings.notificationPreferences.ntfy': 'Ntfy',
'settings.notificationPreferences.push': 'Push',
'settings.webPush.title': 'Powiadomienia push na tym urządzeniu',
'settings.webPush.hint':
'Pokazuje powiadomienia TREK na tym urządzeniu, nawet gdy TREK jest zamknięty. O tym, które zdarzenia docierają, decyduje kolumna Push.',
'settings.webPush.enable': 'Włącz na tym urządzeniu',
'settings.webPush.disable': 'Wyłącz na tym urządzeniu',
'settings.webPush.enabled': 'Włączone na tym urządzeniu',
'settings.webPush.unsupported': 'Ta przeglądarka nie może odbierać powiadomień push.',
'settings.webPush.insecure': 'Push wymaga otwarcia TREK przez HTTPS.',
'settings.webPush.iosInstall': 'Na iPhonie i iPadzie najpierw dodaj TREK do ekranu początkowego i otwórz go stamtąd.',
'settings.webPush.denied':
'Powiadomienia dla TREK są zablokowane w tej przeglądarce. Zezwól na nie w ustawieniach przeglądarki i spróbuj ponownie.',
'settings.webPush.failed': 'Nie udało się włączyć push na tym urządzeniu.',
'settings.notificationsActive': 'Aktywny kanał',
'settings.notificationsManagedByAdmin': 'Zdarzenia konfigurowane przez administratora.',
'settings.mustChangePassword': 'Musisz zmienić hasło przed kontynuowaniem.',
+3
View File
@@ -722,6 +722,9 @@ const admin: TranslationStrings = {
'admin.tabs.permissions': 'Разрешения',
'admin.notifications.emailPanel.title': 'Email (SMTP)',
'admin.notifications.webhookPanel.title': 'Webhook',
'admin.notifications.webPushPanel.title': 'Web Push',
'admin.notifications.webPushPanel.hint':
'Позволяет пользователям получать уведомления на телефонах и компьютерах через браузер, даже когда TREK закрыт. Требуется HTTPS; на iPhone и iPad TREK нужно добавить на экран «Домой».',
'admin.notifications.inappPanel.title': 'In-App',
'admin.notifications.inappPanel.hint': 'Уведомления в приложении всегда активны и не могут быть отключены глобально.',
'admin.notifications.adminWebhookPanel.title': 'Вебхук администратора',
+5 -3
View File
@@ -1040,12 +1040,14 @@ const help: TranslationStrings = {
'Режим высокого качества для сглаживания и проекции глобуса; Сохранить карту записывает выбор.',
'help.ctx.settings-notifications.title': 'Уведомления',
'help.ctx.settings-notifications.summary':
'Где TREK находит вас вне приложения: тема ntfy, вебхук или канал, который даёт плагин. Под каналами по одной строке на событие решает, что куда уходит.',
'Где TREK находит вас вне приложения: push-уведомления на этом устройстве, тема ntfy, вебхук или канал, который даёт плагин. Под каналами по одной строке на событие решает, что куда уходит.',
'help.ctx.settings-notifications.bullet.1':
'ntfy: тема, необязательный собственный сервер и необязательный токен доступа, с кнопкой Тест, чтобы сразу отправить сообщение.',
'help.ctx.settings-notifications.bullet.2':
'Вебхук: один URL, который получает каждое событие как JSON, с кнопкой Тест.',
'help.ctx.settings-notifications.bullet.3':
'Push-уведомления на этом устройстве: кнопка Включить на этом устройстве действует только для браузера, которым вы пользуетесь, поэтому повторите это на каждом телефоне или компьютере. Отправить тест шлёт сообщение на все эти устройства.',
'help.ctx.settings-notifications.bullet.4':
'Строки предпочтений: для каждого события, какой канал включён. Каналы плагинов показывают Настроить, пока не настроены.',
'help.ctx.settings-integrations.title': 'Интеграции',
'help.ctx.settings-integrations.summary':
@@ -1375,7 +1377,7 @@ const help: TranslationStrings = {
'help.ctx.admin-notifications.summary':
'Каналы, которые инстанс предлагает своим пользователям, и те, что доходят до вас как администратора. Пользователи выбирают свои темы и URL в Настройки; вы решаете, что существует, и настраиваете эл. почту.',
'help.ctx.admin-notifications.bullet.1':
'In-App, Email (SMTP), Ntfy и Webhook: по одной панели на каждый, с переключателем, который предлагает канал пользователям, и нужной ему настройкой на стороне сервера.',
'In-App, Email (SMTP), Ntfy, Webhook и Web Push: по одной панели на каждый, с переключателем, который предлагает канал пользователям, и нужной ему настройкой на стороне сервера.',
'help.ctx.admin-notifications.bullet.2':
'Напоминания о поездках: отправляет ли сервер напоминание перед началом поездки.',
'help.ctx.admin-notifications.bullet.3':
@@ -1628,7 +1630,7 @@ const help: TranslationStrings = {
'help.guide.channels-instance.step.1':
'В Email (SMTP) введите SMTP Host, SMTP Port, SMTP User, SMTP Password и From Address; Отправить тестовое письмо отправляет письмо вам.',
'help.guide.channels-instance.step.2':
'Включите Ntfy и Webhook, чтобы предложить их; пользователи затем вводят свою тему или URL в Настройки, Уведомления.',
'Включите Web Push, Ntfy и Webhook, чтобы предложить их; пользователи затем включают push на каждом устройстве или вводят свою тему или URL в Настройки, Уведомления.',
'help.guide.channels-instance.step.3':
'Напоминания о поездках переключают напоминание перед началом поездки; In-App включён всегда и здесь только описан.',
'help.guide.channels-instance.result':
+13
View File
@@ -321,6 +321,19 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.webhook': 'Webhook',
'settings.notificationPreferences.email': 'Email',
'settings.notificationPreferences.ntfy': 'Ntfy',
'settings.notificationPreferences.push': 'Push',
'settings.webPush.title': 'Push-уведомления на этом устройстве',
'settings.webPush.hint':
'Показывает уведомления TREK на этом устройстве, даже когда TREK закрыт. Какие события приходят, определяет столбец Push.',
'settings.webPush.enable': 'Включить на этом устройстве',
'settings.webPush.disable': 'Выключить на этом устройстве',
'settings.webPush.enabled': 'Включено на этом устройстве',
'settings.webPush.unsupported': 'Этот браузер не может получать push-уведомления.',
'settings.webPush.insecure': 'Для push TREK должен быть открыт по HTTPS.',
'settings.webPush.iosInstall': 'На iPhone и iPad сначала добавьте TREK на экран «Домой» и откройте его оттуда.',
'settings.webPush.denied':
'Уведомления для TREK заблокированы в этом браузере. Разрешите их в настройках браузера и попробуйте снова.',
'settings.webPush.failed': 'Не удалось включить push на этом устройстве.',
'settings.currency': 'Валюта отображения',
'settings.currencyHint':
'Суммы в разделе «Расходы» отображаются в этой валюте только для просмотра — исходные суммы не изменяются.',
+3
View File
@@ -19,6 +19,9 @@ const admin: TranslationStrings = {
'admin.notifications.testNtfyFailed': 'Odoslanie testovacieho ntfy zlyhalo',
'admin.notifications.emailPanel.title': 'E-mail (SMTP)',
'admin.notifications.webhookPanel.title': 'Webhook',
'admin.notifications.webPushPanel.title': 'Web Push',
'admin.notifications.webPushPanel.hint':
'Umožňuje používateľom prijímať oznámenia na telefónoch a počítačoch cez prehliadač, aj keď je TREK zatvorený. Vyžaduje HTTPS; na iPhone a iPade musí byť TREK pridaný na plochu.',
'admin.notifications.inappPanel.title': 'V aplikácii',
'admin.notifications.inappPanel.hint': 'Oznámenia v aplikácii sú vždy aktívne a nedajú sa globálne vypnúť.',
'admin.notifications.adminWebhookPanel.title': 'Admin webhook',
+5 -3
View File
@@ -1059,12 +1059,14 @@ const help: TranslationStrings = {
'Režim vysokej kvality pre vyhladzovanie hrán a projekciu glóbusu; Uložiť nastavenia mapy výber uloží.',
'help.ctx.settings-notifications.title': 'Oznámenia',
'help.ctx.settings-notifications.summary':
'Kde vás TREK zastihne mimo aplikácie: téma ntfy, webhook alebo kanál, ktorý poskytuje plugin. Pod kanálmi jeden riadok pre každú udalosť určuje, čo kam ide.',
'Kde vás TREK zastihne mimo aplikácie: push oznámenia v tomto zariadení, téma ntfy, webhook alebo kanál, ktorý poskytuje plugin. Pod kanálmi jeden riadok pre každú udalosť určuje, čo kam ide.',
'help.ctx.settings-notifications.bullet.1':
'ntfy: téma, voliteľný vlastný server a voliteľný prístupový token, s tlačidlom Testovať na okamžité odoslanie skúšobnej správy.',
'help.ctx.settings-notifications.bullet.2':
'Webhook: jedna URL adresa, ktorá prijíma každú udalosť ako JSON, s tlačidlom Testovať.',
'help.ctx.settings-notifications.bullet.3':
'Push oznámenia v tomto zariadení: Zapnúť pre toto zariadenie platí len pre prehliadač, ktorý práve používate, preto to zopakujte na každom telefóne alebo počítači. Odoslať test príde na všetky.',
'help.ctx.settings-notifications.bullet.4':
'Riadky predvolieb: pre každú udalosť určujú, ktorý kanál je zapnutý. Kanály pluginov zobrazujú Nastaviť, kým nie sú nastavené.',
'help.ctx.settings-integrations.title': 'Integrácie',
'help.ctx.settings-integrations.summary':
@@ -1387,7 +1389,7 @@ const help: TranslationStrings = {
'help.ctx.admin-notifications.summary':
'Kanály, ktoré inštancia ponúka svojim používateľom, a tie, ktoré zastihnú vás ako administrátora. Používatelia si vlastné témy a URL vyberajú v Nastaveniach; vy rozhodujete, čo je k dispozícii, a nastavujete e-mail.',
'help.ctx.admin-notifications.bullet.1':
'V aplikácii, E-mail (SMTP), Ntfy a Webhook: každý s vlastným panelom, s prepínačom, ktorý kanál ponúkne používateľom, a s konfiguráciou na strane servera, ktorú potrebuje.',
'V aplikácii, E-mail (SMTP), Ntfy, Webhook a Web Push: každý s vlastným panelom, s prepínačom, ktorý kanál ponúkne používateľom, a s konfiguráciou na strane servera, ktorú potrebuje.',
'help.ctx.admin-notifications.bullet.2': 'Pripomienky ciest: či server posiela pripomienku pred začiatkom cesty.',
'help.ctx.admin-notifications.bullet.3':
'Admin Ntfy a Admin webhook: kam idú udalosti pre administrátora, napríklad neúspešná záloha alebo nová verzia, s tlačidlom Testovať.',
@@ -1646,7 +1648,7 @@ const help: TranslationStrings = {
'help.guide.channels-instance.step.1':
'V časti E-mail (SMTP) zadajte SMTP hostiteľa, SMTP port, SMTP používateľa, SMTP heslo a adresu odosielateľa; Odoslať testovací e-mail vám pošle správu.',
'help.guide.channels-instance.step.2':
'Zapnite Ntfy a Webhook, ak ich chcete ponúknuť; používatelia potom zadajú vlastnú tému alebo URL v časti Nastavenia, Oznámenia.',
'Zapnite Web Push, Ntfy a Webhook, ak ich chcete ponúknuť; používatelia potom v časti Nastavenia, Oznámenia zapnú push pre každé zariadenie alebo zadajú vlastnú tému či URL.',
'help.guide.channels-instance.step.3':
'Pripomienky ciest zapínajú pripomienku pred začiatkom cesty; V aplikácii je vždy zapnuté a je tu iba vysvetlené.',
'help.guide.channels-instance.result': 'Karta Oznámenia každého používateľa zobrazuje kanály, ktoré ste zapli.',
+13
View File
@@ -128,6 +128,19 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.pluginConfigured':
'Nastavené. Prihlasovacie údaje spravujte na stránke nastavení doplnku.',
'settings.notificationPreferences.ntfy': 'Ntfy',
'settings.notificationPreferences.push': 'Push',
'settings.webPush.title': 'Push oznámenia v tomto zariadení',
'settings.webPush.hint':
'Zobrazuje oznámenia TREK v tomto zariadení, aj keď je TREK zatvorený. Ktoré udalosti prídu, určuje stĺpec Push.',
'settings.webPush.enable': 'Zapnúť pre toto zariadenie',
'settings.webPush.disable': 'Vypnúť pre toto zariadenie',
'settings.webPush.enabled': 'Zapnuté pre toto zariadenie',
'settings.webPush.unsupported': 'Tento prehliadač nedokáže prijímať push oznámenia.',
'settings.webPush.insecure': 'Push vyžaduje, aby bol TREK otvorený cez HTTPS.',
'settings.webPush.iosInstall': 'Na iPhone a iPade najprv pridajte TREK na plochu a otvorte ho odtiaľ.',
'settings.webPush.denied':
'Oznámenia pre TREK sú v tomto prehliadači zablokované. Povoľte ich v nastaveniach prehliadača a skúste to znova.',
'settings.webPush.failed': 'Push sa pre toto zariadenie nepodarilo zapnúť.',
'settings.notificationPreferences.noChannels':
'Nie sú nakonfigurované žiadne kanály oznámení. Požiadajte správcu o nastavenie e-mailových alebo webhookových oznámení.',
'settings.webhookUrl.label': 'URL webhooku',
+3
View File
@@ -19,6 +19,9 @@ const admin: TranslationStrings = {
'admin.notifications.testNtfyFailed': 'Test ntfy misslyckades',
'admin.notifications.emailPanel.title': 'E-post (SMTP)',
'admin.notifications.webhookPanel.title': 'Webhook',
'admin.notifications.webPushPanel.title': 'Web Push',
'admin.notifications.webPushPanel.hint':
'Låter användare ta emot meddelanden på sina telefoner och datorer via webbläsaren, även när TREK är stängt. Kräver HTTPS; på iPhone och iPad måste TREK läggas till på hemskärmen.',
'admin.notifications.inappPanel.title': 'I-App',
'admin.notifications.inappPanel.hint': 'Meddelanden i appen är alltid aktiva och kan inte inaktiveras generellt.',
'admin.notifications.adminWebhookPanel.title': 'Webhook för administratörer',
+5 -3
View File
@@ -1028,11 +1028,13 @@ const help: TranslationStrings = {
'Högkvalitetsläge för kantutjämning och globprojektionen; Spara karta skriver valet.',
'help.ctx.settings-notifications.title': 'Meddelanden',
'help.ctx.settings-notifications.summary':
'Var TREK når dig utanför appen: ett ntfy-ämne, en webhook eller en kanal som ett tillägg tillhandahåller. Under kanalerna avgör en rad per händelse vad som går vart.',
'Var TREK når dig utanför appen: push-meddelanden på den här enheten, ett ntfy-ämne, en webhook eller en kanal som ett tillägg tillhandahåller. Under kanalerna avgör en rad per händelse vad som går vart.',
'help.ctx.settings-notifications.bullet.1':
'ntfy: ämnet, en valfri egen server och en valfri åtkomsttoken, med Test för att skicka ett på en gång.',
'help.ctx.settings-notifications.bullet.2': 'Webhook: en URL som tar emot varje händelse som JSON, med Test.',
'help.ctx.settings-notifications.bullet.3':
'Push-meddelanden på den här enheten: Slå på för den här enheten gäller bara webbläsaren du använder, så upprepa det på varje telefon eller dator. Skicka test når dem alla.',
'help.ctx.settings-notifications.bullet.4':
'Preferensraderna: per händelse, vilken kanal som är på. Tilläggskanaler visar Konfigurera tills de är uppsatta.',
'help.ctx.settings-integrations.title': 'Integrationer',
'help.ctx.settings-integrations.summary':
@@ -1351,7 +1353,7 @@ const help: TranslationStrings = {
'help.ctx.admin-notifications.summary':
'Kanalerna instansen erbjuder sina användare, och de som når dig som administratör. Användarna väljer sina egna ämnen och URL:er under Inställningar; du bestämmer vad som finns och konfigurerar e-post.',
'help.ctx.admin-notifications.bullet.1':
'I-App, E-post (SMTP), Ntfy och Webhook: en panel var, med ett reglage som erbjuder kanalen till användarna och den serverkonfiguration den behöver.',
'I-App, E-post (SMTP), Ntfy, Webhook och Web Push: en panel var, med ett reglage som erbjuder kanalen till användarna och den serverkonfiguration den behöver.',
'help.ctx.admin-notifications.bullet.2':
'Påminnelser inför resan: om servern skickar påminnelsen innan en resa börjar.',
'help.ctx.admin-notifications.bullet.3':
@@ -1591,7 +1593,7 @@ const help: TranslationStrings = {
'help.guide.channels-instance.step.1':
'Under E-post (SMTP), ange SMTP Host, SMTP Port, SMTP User, SMTP Password och From Address; Skicka ett testmejl skickar ett mejl till dig.',
'help.guide.channels-instance.step.2':
'Slå på Ntfy och Webhook för att erbjuda dem; användarna anger sedan sitt eget ämne eller sin URL under Inställningar, Meddelanden.',
'Slå på Web Push, Ntfy och Webhook för att erbjuda dem; användarna slår sedan på push per enhet, eller anger sitt eget ämne eller sin URL, under Inställningar, Meddelanden.',
'help.guide.channels-instance.step.3':
'Påminnelser inför resan växlar påminnelsen innan en resa börjar; I-App är alltid på och förklaras bara här.',
'help.guide.channels-instance.result': 'Fliken Meddelanden hos varje användare visar kanalerna du slog på.',
+13
View File
@@ -120,6 +120,19 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.pluginConfigured':
'Konfigurerat. Hantera dina uppgifter på pluginets inställningssida.',
'settings.notificationPreferences.ntfy': 'Ntfy',
'settings.notificationPreferences.push': 'Push',
'settings.webPush.title': 'Push-meddelanden på den här enheten',
'settings.webPush.hint':
'Visar TREK-meddelanden på den här enheten även när TREK är stängt. Vilka händelser som kommer fram styrs av kolumnen Push.',
'settings.webPush.enable': 'Slå på för den här enheten',
'settings.webPush.disable': 'Slå av för den här enheten',
'settings.webPush.enabled': 'På för den här enheten',
'settings.webPush.unsupported': 'Den här webbläsaren kan inte ta emot push-meddelanden.',
'settings.webPush.insecure': 'Push kräver att TREK öppnas via HTTPS.',
'settings.webPush.iosInstall': 'På iPhone och iPad lägger du först till TREK på hemskärmen och öppnar det därifrån.',
'settings.webPush.denied':
'Meddelanden från TREK är blockerade i den här webbläsaren. Tillåt dem i webbläsarens inställningar och försök sedan igen.',
'settings.webPush.failed': 'Push kunde inte slås på för den här enheten.',
'settings.notificationPreferences.noChannels':
'Inga meddelandekanaler har konfigurerats. Be en administratör att ställa in e-post- eller webhook-meddelanden.',
'settings.webhookUrl.label': 'Webhook URL',
+3
View File
@@ -19,6 +19,9 @@ const admin: TranslationStrings = {
'admin.notifications.testNtfyFailed': "การทดสอบ ntfy ล้มเหลว",
'admin.notifications.emailPanel.title': "อีเมล์ (SMTP)",
'admin.notifications.webhookPanel.title': "เว็บฮุค",
'admin.notifications.webPushPanel.title': 'เว็บพุช',
'admin.notifications.webPushPanel.hint':
'ให้ผู้ใช้รับการแจ้งเตือนบนโทรศัพท์และคอมพิวเตอร์ผ่านเบราว์เซอร์ได้ แม้ในขณะที่ปิด TREK อยู่ ต้องใช้ HTTPS และบน iPhone และ iPad ต้องเพิ่ม TREK ไปยังหน้าจอโฮม',
'admin.notifications.inappPanel.title': "ในแอป",
'admin.notifications.inappPanel.hint': "การแจ้งเตือนในแอปจะทำงานอยู่เสมอและไม่สามารถปิดใช้งานได้ทั่วโลก",
'admin.notifications.adminWebhookPanel.title': "แอดมินเว็บฮุค",
+5 -3
View File
@@ -894,11 +894,13 @@ const help: TranslationStrings = {
'help.ctx.settings-map.bullet.3': 'โหมดคุณภาพสูง สำหรับการลดรอยหยักและการฉายภาพแบบลูกโลก บันทึกแผนที่ จะบันทึกตัวเลือก',
'help.ctx.settings-notifications.title': 'การแจ้งเตือน',
'help.ctx.settings-notifications.summary':
'ช่องทางที่ TREK ติดต่อคุณนอกแอป: หัวข้อ ntfy, เว็บฮุค หรือช่องทางที่ปลั๊กอินให้มา ใต้ช่องทางต่างๆ จะมีหนึ่งแถวต่อหนึ่งเหตุการณ์เพื่อกำหนดว่าจะส่งอะไรไปที่ไหน',
'ช่องทางที่ TREK ติดต่อคุณนอกแอป: การแจ้งเตือนแบบพุชบนอุปกรณ์นี้, หัวข้อ ntfy, เว็บฮุค หรือช่องทางที่ปลั๊กอินให้มา ใต้ช่องทางต่างๆ จะมีหนึ่งแถวต่อหนึ่งเหตุการณ์เพื่อกำหนดว่าจะส่งอะไรไปที่ไหน',
'help.ctx.settings-notifications.bullet.1':
'ntfy: หัวข้อ เซิร์ฟเวอร์ของคุณเอง (ไม่บังคับ) และโทเค็นการเข้าถึง (ไม่บังคับ) พร้อม ทดสอบ เพื่อส่งข้อความทันที',
'help.ctx.settings-notifications.bullet.2': 'เว็บฮุค: URL เดียวที่รับทุกเหตุการณ์เป็น JSON พร้อม ทดสอบ',
'help.ctx.settings-notifications.bullet.3':
'การแจ้งเตือนแบบพุชบนอุปกรณ์นี้: เปิดสำหรับอุปกรณ์นี้ มีผลเฉพาะกับเบราว์เซอร์ที่คุณกำลังใช้ จึงต้องทำซ้ำบนโทรศัพท์หรือคอมพิวเตอร์ทุกเครื่อง ส่วน ส่งแบบทดสอบ จะส่งไปถึงทุกเครื่อง',
'help.ctx.settings-notifications.bullet.4':
'แถวการตั้งค่า: กำหนดว่าแต่ละเหตุการณ์เปิดช่องทางใดไว้ ช่องทางของปลั๊กอินจะแสดง กำหนดค่า จนกว่าจะตั้งค่าเสร็จ',
'help.ctx.settings-integrations.title': 'การเชื่อมต่อ',
'help.ctx.settings-integrations.summary':
@@ -1167,7 +1169,7 @@ const help: TranslationStrings = {
'help.ctx.admin-notifications.summary':
'ช่องทางที่อินสแตนซ์เสนอให้ผู้ใช้ และช่องทางที่ติดต่อคุณในฐานะผู้ดูแลระบบ ผู้ใช้เลือกหัวข้อและ URL ของตนเองใน การตั้งค่า ส่วนคุณกำหนดว่ามีช่องทางใดบ้างและกำหนดค่าอีเมล',
'help.ctx.admin-notifications.bullet.1':
'ในแอป, อีเมล์ (SMTP), เอ็นทีฟี่ และ เว็บฮุค: ช่องทางละหนึ่งแผง พร้อมสวิตช์ที่เปิดช่องทางให้ผู้ใช้ และการกำหนดค่าฝั่งเซิร์ฟเวอร์ที่ต้องใช้',
'ในแอป, อีเมล์ (SMTP), เอ็นทีฟี่, เว็บฮุค และ เว็บพุช: ช่องทางละหนึ่งแผง พร้อมสวิตช์ที่เปิดช่องทางให้ผู้ใช้ และการกำหนดค่าฝั่งเซิร์ฟเวอร์ที่ต้องใช้',
'help.ctx.admin-notifications.bullet.2': 'การแจ้งเตือนการเดินทาง: เซิร์ฟเวอร์จะส่งการแจ้งเตือนก่อนทริปเริ่มหรือไม่',
'help.ctx.admin-notifications.bullet.3':
'แอดมิน Ntfy และ แอดมินเว็บฮุค: ปลายทางของเหตุการณ์ผู้ดูแลระบบ เช่น การสำรองข้อมูลล้มเหลวหรือเวอร์ชันใหม่ พร้อม ทดสอบ',
@@ -1380,7 +1382,7 @@ const help: TranslationStrings = {
'help.guide.channels-instance.step.1':
'ใน อีเมล์ (SMTP) กรอกโฮสต์ SMTP พอร์ต SMTP ผู้ใช้ SMTP รหัสผ่าน SMTP และที่อยู่ผู้ส่ง ส่วน ส่งอีเมลทดสอบ จะส่งอีเมลถึงคุณ',
'help.guide.channels-instance.step.2':
'เปิด เอ็นทีฟี่ และ เว็บฮุค เพื่อให้ผู้ใช้เลือกได้ จากนั้นผู้ใช้จะกรอก topic หรือ URL ของตนเองใน การตั้งค่า ส่วน การแจ้งเตือน',
'เปิด เว็บพุช, เอ็นทีฟี่ และ เว็บฮุค เพื่อให้ผู้ใช้เลือกได้ จากนั้นผู้ใช้จะเปิดพุชทีละอุปกรณ์ หรือกรอก topic หรือ URL ของตนเองใน การตั้งค่า ส่วน การแจ้งเตือน',
'help.guide.channels-instance.step.3':
'การแจ้งเตือนการเดินทาง ใช้เปิดหรือปิดการเตือนก่อนเริ่มทริป ส่วน ในแอป เปิดอยู่เสมอและแสดงไว้ที่นี่เพื่ออธิบายเท่านั้น',
'help.guide.channels-instance.result': 'แท็บ การแจ้งเตือน ของผู้ใช้ทุกคนจะแสดงช่องทางที่คุณเปิดไว้',
+13
View File
@@ -116,6 +116,19 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.testFailed': "การทดสอบล้มเหลว",
'settings.notificationPreferences.pluginConfigured': "กำหนดค่าแล้ว จัดการข้อมูลประจำตัวในหน้าการตั้งค่าปลั๊กอิน",
'settings.notificationPreferences.ntfy': "เอ็นทีฟี่",
'settings.notificationPreferences.push': 'พุช',
'settings.webPush.title': 'การแจ้งเตือนแบบพุชบนอุปกรณ์นี้',
'settings.webPush.hint':
'แสดงการแจ้งเตือนของ TREK บนอุปกรณ์นี้แม้ในขณะที่ปิด TREK อยู่ เหตุการณ์ที่จะได้รับเป็นไปตามคอลัมน์ พุช',
'settings.webPush.enable': 'เปิดสำหรับอุปกรณ์นี้',
'settings.webPush.disable': 'ปิดสำหรับอุปกรณ์นี้',
'settings.webPush.enabled': 'เปิดอยู่สำหรับอุปกรณ์นี้',
'settings.webPush.unsupported': 'เบราว์เซอร์นี้ไม่สามารถรับการแจ้งเตือนแบบพุชได้',
'settings.webPush.insecure': 'การแจ้งเตือนแบบพุชต้องเปิด TREK ผ่าน HTTPS',
'settings.webPush.iosInstall': 'บน iPhone และ iPad ให้เพิ่ม TREK ไปยังหน้าจอโฮมก่อน แล้วเปิดจากที่นั่น',
'settings.webPush.denied':
'การแจ้งเตือนของ TREK ถูกบล็อกในเบราว์เซอร์นี้ อนุญาตในการตั้งค่าเบราว์เซอร์ แล้วลองอีกครั้ง',
'settings.webPush.failed': 'ไม่สามารถเปิดการแจ้งเตือนแบบพุชสำหรับอุปกรณ์นี้ได้',
'settings.notificationPreferences.noChannels':
"ไม่มีการกำหนดค่าช่องทางการแจ้งเตือน ขอให้ผู้ดูแลระบบตั้งค่าการแจ้งเตือนทางอีเมลหรือเว็บฮุค",
'settings.webhookUrl.label': "URL ของเว็บฮุค",
+3
View File
@@ -19,6 +19,9 @@ const admin: TranslationStrings = {
'admin.notifications.testNtfyFailed': 'Test ntfy başarısız',
'admin.notifications.emailPanel.title': 'E-posta (SMTP)',
'admin.notifications.webhookPanel.title': 'Web kancası',
'admin.notifications.webPushPanel.title': 'Web anlık bildirimleri',
'admin.notifications.webPushPanel.hint':
"Kullanıcıların, TREK kapalıyken bile tarayıcı üzerinden telefon ve bilgisayarlarında bildirim almasını sağlar. HTTPS gerekir; iPhone ve iPad'de TREK'in Ana Ekran'a eklenmesi gerekir.",
'admin.notifications.inappPanel.title': 'Uygulama içi',
'admin.notifications.inappPanel.hint': 'Uygulama içi bildirimler her zaman açıktır ve genel olarak kapatılamaz.',
'admin.notifications.adminWebhookPanel.title': 'Yönetici Webhook',
+5 -3
View File
@@ -1047,11 +1047,13 @@ const help: TranslationStrings = {
'Kenar yumuşatma ve küre projeksiyonu için Yüksek Kalite Modu; Haritayı Kaydet seçimi yazar.',
'help.ctx.settings-notifications.title': 'Bildirimler',
'help.ctx.settings-notifications.summary':
'TREK’in size uygulama dışında nereden ulaştığı: bir ntfy konusu, bir web kancası ya da bir eklentinin sağladığı kanal. Kanalların altında, olay başına bir satır neyin nereye gideceğine karar verir.',
'TREK’in size uygulama dışında nereden ulaştığı: bu cihazdaki anlık bildirimler, bir ntfy konusu, bir web kancası ya da bir eklentinin sağladığı kanal. Kanalların altında, olay başına bir satır neyin nereye gideceğine karar verir.',
'help.ctx.settings-notifications.bullet.1':
'ntfy: konu, isteğe bağlı kendi sunucunuz ve isteğe bağlı bir erişim anahtarı, hemen bir tane göndermek için Dene ile.',
'help.ctx.settings-notifications.bullet.2': 'Web kancası: her olayı JSON olarak alan tek bir URL, Dene ile.',
'help.ctx.settings-notifications.bullet.3':
'Bu cihazda anlık bildirimler: Bu cihaz için aç yalnızca kullandığınız tarayıcıyı kapsar, bu yüzden bunu her telefonda veya bilgisayarda tekrarlayın. Test gönder hepsine ulaşır.',
'help.ctx.settings-notifications.bullet.4':
'Tercih satırları: olay başına hangi kanalın açık olduğu. Eklenti kanalları kurulana kadar Yapılandır gösterir.',
'help.ctx.settings-integrations.title': 'Entegrasyonlar',
'help.ctx.settings-integrations.summary':
@@ -1372,7 +1374,7 @@ const help: TranslationStrings = {
'help.ctx.admin-notifications.summary':
'Örneğin kullanıcılarına sunduğu kanallar ve yönetici olarak size ulaşanlar. Kullanıcılar kendi konularını ve URL’lerini Ayarlar altında seçer; neyin var olduğuna siz karar verir ve e-postayı yapılandırırsınız.',
'help.ctx.admin-notifications.bullet.1':
'Uygulama içi, E-posta (SMTP), Ntfy ve Web kancası: her biri için bir panel, kanalı kullanıcılara sunan bir anahtar ve ihtiyaç duyduğu sunucu tarafı yapılandırmasıyla.',
'Uygulama içi, E-posta (SMTP), Ntfy, Web kancası ve Web anlık bildirimleri: her biri için bir panel, kanalı kullanıcılara sunan bir anahtar ve ihtiyaç duyduğu sunucu tarafı yapılandırmasıyla.',
'help.ctx.admin-notifications.bullet.2':
'Seyahat Hatırlatıcıları: sunucunun bir seyahat başlamadan önce hatırlatıcı gönderip göndermediği.',
'help.ctx.admin-notifications.bullet.3':
@@ -1618,7 +1620,7 @@ const help: TranslationStrings = {
'help.guide.channels-instance.step.1':
'E-posta (SMTP) altında SMTP Host, SMTP Port, SMTP User, SMTP Password ve From Address girin; Test e-postası gönder size bir posta gönderir.',
'help.guide.channels-instance.step.2':
'Sunmak için Ntfy ve Web kancası’nı açın; kullanıcılar sonra kendi konularını ya da URL’lerini Ayarlar, Bildirimler altında girer.',
'Sunmak için Web anlık bildirimleri, Ntfy ve Web kancası’nı açın; kullanıcılar sonra Ayarlar, Bildirimler altında anlık bildirimleri cihaz başına açar ya da kendi konularını veya URL’lerini girer.',
'help.guide.channels-instance.step.3':
'Seyahat Hatırlatıcıları bir seyahat başlamadan önceki hatırlatıcıyı açıp kapatır; Uygulama içi her zaman açıktır ve burada yalnızca açıklanır.',
'help.guide.channels-instance.result': 'Her kullanıcının Bildirimler sekmesi açtığınız kanalları gösterir.',
+13
View File
@@ -116,6 +116,19 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.pluginConfigured':
'Yapılandırıldı. Kimlik bilgilerini eklentinin ayarlar sayfasından yönetin.',
'settings.notificationPreferences.ntfy': 'Ntfy',
'settings.notificationPreferences.push': 'Anlık bildirim',
'settings.webPush.title': 'Bu cihazda anlık bildirimler',
'settings.webPush.hint':
'TREK kapalıyken bile TREK bildirimlerini bu cihazda gösterir. Hangi olayların geleceğini Anlık bildirim sütunu belirler.',
'settings.webPush.enable': 'Bu cihaz için aç',
'settings.webPush.disable': 'Bu cihaz için kapat',
'settings.webPush.enabled': 'Bu cihaz için açık',
'settings.webPush.unsupported': 'Bu tarayıcı anlık bildirim alamıyor.',
'settings.webPush.insecure': "Anlık bildirimler için TREK'in HTTPS üzerinden açılması gerekir.",
'settings.webPush.iosInstall': "iPhone ve iPad'de önce TREK'i Ana Ekran'a ekleyin ve oradan açın.",
'settings.webPush.denied':
'TREK bildirimleri bu tarayıcıda engellendi. Tarayıcı ayarlarından izin verin, ardından yeniden deneyin.',
'settings.webPush.failed': 'Anlık bildirimler bu cihaz için açılamadı.',
'settings.notificationPreferences.noChannels':
'Bildirim kanalı yapılandırılmadı. Yöneticiden e-posta veya webhook kurmasını isteyin.',
'settings.webhookUrl.label': "Web kancası URL'si",
+3
View File
@@ -718,6 +718,9 @@ const admin: TranslationStrings = {
'admin.tabs.permissions': 'Дозволи',
'admin.notifications.emailPanel.title': 'Email (SMTP)',
'admin.notifications.webhookPanel.title': 'Webhook',
'admin.notifications.webPushPanel.title': 'Web Push',
'admin.notifications.webPushPanel.hint':
'Дозволяє користувачам отримувати сповіщення на телефонах і комп’ютерах через браузер, навіть коли TREK закрито. Потрібен HTTPS; на iPhone та iPad TREK треба додати на початковий екран.',
'admin.notifications.inappPanel.title': 'In-App',
'admin.notifications.inappPanel.hint': 'Сповіщення в додатку завжди активні і не можуть бути вимкнені глобально.',
'admin.notifications.adminWebhookPanel.title': 'Webhook адміністратора',
+5 -3
View File
@@ -1031,11 +1031,13 @@ const help: TranslationStrings = {
'Режим високої якості для згладжування та проєкції глобуса; Зберегти карту записує вибір.',
'help.ctx.settings-notifications.title': 'Сповіщення',
'help.ctx.settings-notifications.summary':
'Де TREK знаходить вас поза застосунком: тема ntfy, вебхук або канал, який дає плагін. Під каналами по одному рядку на подію вирішує, що куди йде.',
'Де TREK знаходить вас поза застосунком: push-сповіщення на цьому пристрої, тема ntfy, вебхук або канал, який дає плагін. Під каналами по одному рядку на подію вирішує, що куди йде.',
'help.ctx.settings-notifications.bullet.1':
'ntfy: тема, необов’язковий власний сервер і необов’язковий токен доступу, з кнопкою Тест, щоб одразу надіслати повідомлення.',
'help.ctx.settings-notifications.bullet.2': 'Вебхук: один URL, який отримує кожну подію як JSON, з кнопкою Тест.',
'help.ctx.settings-notifications.bullet.3':
'Push-сповіщення на цьому пристрої: кнопка Увімкнути на цьому пристрої діє лише для браузера, яким ви користуєтеся, тож повторіть це на кожному телефоні чи комп’ютері. Надіслати тест надсилає повідомлення на всі ці пристрої.',
'help.ctx.settings-notifications.bullet.4':
'Рядки вподобань: для кожної події, який канал увімкнено. Канали плагінів показують Налаштувати, поки їх не налаштовано.',
'help.ctx.settings-integrations.title': 'Інтеграції',
'help.ctx.settings-integrations.summary':
@@ -1361,7 +1363,7 @@ const help: TranslationStrings = {
'help.ctx.admin-notifications.summary':
'Канали, які інстанс пропонує своїм користувачам, і ті, що доходять до вас як адміністратора. Користувачі обирають свої теми та URL у Налаштування; ви вирішуєте, що існує, і налаштовуєте ел. пошту.',
'help.ctx.admin-notifications.bullet.1':
'In-App, Email (SMTP), Ntfy і Webhook: по одній панелі на кожен, із перемикачем, який пропонує канал користувачам, і потрібним йому налаштуванням на боці сервера.',
'In-App, Email (SMTP), Ntfy, Webhook і Web Push: по одній панелі на кожен, із перемикачем, який пропонує канал користувачам, і потрібним йому налаштуванням на боці сервера.',
'help.ctx.admin-notifications.bullet.2':
'Нагадування про поїздки: чи надсилає сервер нагадування перед початком поїздки.',
'help.ctx.admin-notifications.bullet.3':
@@ -1604,7 +1606,7 @@ const help: TranslationStrings = {
'help.guide.channels-instance.step.1':
'У Email (SMTP) введіть SMTP Host, SMTP Port, SMTP User, SMTP Password і From Address; Відправити тестовий лист надсилає лист вам.',
'help.guide.channels-instance.step.2':
'Увімкніть Ntfy і Webhook, щоб запропонувати їх; користувачі потім вводять свою тему або URL у Налаштування, Сповіщення.',
'Увімкніть Web Push, Ntfy і Webhook, щоб запропонувати їх; користувачі потім вмикають push на кожному пристрої або вводять свою тему чи URL у Налаштування, Сповіщення.',
'help.guide.channels-instance.step.3':
'Нагадування про поїздки перемикає нагадування перед початком поїздки; In-App увімкнено завжди і тут лише описано.',
'help.guide.channels-instance.result': 'Вкладка Сповіщення кожного користувача показує канали, які ви ввімкнули.',
+13
View File
@@ -315,6 +315,19 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.webhook': 'Webhook',
'settings.notificationPreferences.email': 'Email',
'settings.notificationPreferences.ntfy': 'Ntfy',
'settings.notificationPreferences.push': 'Push',
'settings.webPush.title': 'Push-сповіщення на цьому пристрої',
'settings.webPush.hint':
'Показує сповіщення TREK на цьому пристрої, навіть коли TREK закрито. Які події надходять, визначає стовпець Push.',
'settings.webPush.enable': 'Увімкнути на цьому пристрої',
'settings.webPush.disable': 'Вимкнути на цьому пристрої',
'settings.webPush.enabled': 'Увімкнено на цьому пристрої',
'settings.webPush.unsupported': 'Цей браузер не може отримувати push-сповіщення.',
'settings.webPush.insecure': 'Для push TREK має бути відкрито через HTTPS.',
'settings.webPush.iosInstall': 'На iPhone та iPad спершу додайте TREK на початковий екран і відкрийте його звідти.',
'settings.webPush.denied':
'Сповіщення для TREK заблоковано в цьому браузері. Дозвольте їх у налаштуваннях браузера й спробуйте ще раз.',
'settings.webPush.failed': 'Не вдалося увімкнути push на цьому пристрої.',
'settings.oauth.modal.machineClient': 'Машинний клієнт (без входу через браузер)',
'settings.oauth.modal.machineClientHint':
'Використовуйте надання client_credentials — URI перенаправлення не потрібні. Токен видається безпосередньо через client_id + client_secret і діє від вашого імені в межах вибраних областей.',
+3
View File
@@ -19,6 +19,9 @@ const admin: TranslationStrings = {
'admin.notifications.testNtfyFailed': 'Kiểm tra ntfy không thành công',
'admin.notifications.emailPanel.title': 'Email (SMTP)',
'admin.notifications.webhookPanel.title': 'Webhook',
'admin.notifications.webPushPanel.title': 'Web Push',
'admin.notifications.webPushPanel.hint':
'Cho phép người dùng nhận thông báo trên điện thoại và máy tính qua trình duyệt, ngay cả khi TREK đang đóng. Cần HTTPS; trên iPhone và iPad, TREK phải được thêm vào Màn hình chính.',
'admin.notifications.inappPanel.title': 'Trong ứng dụng',
'admin.notifications.inappPanel.hint': 'Thông báo trong ứng dụng luôn hoạt động và không thể tắt trên toàn cầu.',
'admin.notifications.adminWebhookPanel.title': 'Webhook quản trị viên',
+5 -3
View File
@@ -1036,11 +1036,13 @@ const help: TranslationStrings = {
'“Chế độ chất lượng cao” để khử răng cưa và phép chiếu địa cầu; “Lưu bản đồ” ghi lại lựa chọn.',
'help.ctx.settings-notifications.title': 'Thông báo',
'help.ctx.settings-notifications.summary':
'TREK liên lạc với bạn ở đâu ngoài ứng dụng: một chủ đề ntfy, một webhook, hoặc một kênh do plugin cung cấp. Bên dưới các kênh, mỗi sự kiện một hàng quyết định cái gì đi đâu.',
'TREK liên lạc với bạn ở đâu ngoài ứng dụng: thông báo đẩy trên thiết bị này, một chủ đề ntfy, một webhook, hoặc một kênh do plugin cung cấp. Bên dưới các kênh, mỗi sự kiện một hàng quyết định cái gì đi đâu.',
'help.ctx.settings-notifications.bullet.1':
'ntfy: chủ đề, máy chủ riêng của bạn (tùy chọn) và mã thông báo truy cập (tùy chọn), với “Bài kiểm tra” để gửi ngay một tin.',
'help.ctx.settings-notifications.bullet.2': 'Webhook: một URL nhận mọi sự kiện dưới dạng JSON, với “Bài kiểm tra”.',
'help.ctx.settings-notifications.bullet.3':
'Thông báo đẩy trên thiết bị này: “Bật cho thiết bị này” chỉ áp dụng cho trình duyệt bạn đang dùng, nên hãy lặp lại trên từng điện thoại hoặc máy tính. “Gửi thử” sẽ đến tất cả các thiết bị đó.',
'help.ctx.settings-notifications.bullet.4':
'Các hàng tùy chọn: với mỗi sự kiện, kênh nào đang bật. Kênh của plugin hiện “Cấu hình” cho đến khi được thiết lập.',
'help.ctx.settings-integrations.title': 'Tích hợp',
'help.ctx.settings-integrations.summary':
@@ -1362,7 +1364,7 @@ const help: TranslationStrings = {
'help.ctx.admin-notifications.summary':
'Các kênh mà phiên bản cung cấp cho người dùng, và các kênh tới bạn với tư cách quản trị viên. Người dùng chọn chủ đề và URL của họ trong “Cài đặt”; bạn quyết định có những kênh nào và cấu hình email.',
'help.ctx.admin-notifications.bullet.1':
'“Trong ứng dụng”, “Email (SMTP)”, “Ntfy” và “Webhook”: mỗi kênh một bảng, với công tắc cung cấp kênh đó cho người dùng và cấu hình phía máy chủ mà nó cần.',
'“Trong ứng dụng”, “Email (SMTP)”, “Ntfy”, “Webhook” và “Web Push”: mỗi kênh một bảng, với công tắc cung cấp kênh đó cho người dùng và cấu hình phía máy chủ mà nó cần.',
'help.ctx.admin-notifications.bullet.2':
'“Lời nhắc chuyến đi”: máy chủ có gửi lời nhắc trước khi chuyến đi bắt đầu hay không.',
'help.ctx.admin-notifications.bullet.3':
@@ -1603,7 +1605,7 @@ const help: TranslationStrings = {
'help.guide.channels-instance.step.1':
'Dưới “Email (SMTP)”, nhập SMTP Host, SMTP Port, SMTP User, SMTP Password và From Address; “Gửi email kiểm tra” gửi một thư tới bạn.',
'help.guide.channels-instance.step.2':
'Bật “Ntfy” và “Webhook” để cung cấp chúng; người dùng sau đó nhập chủ đề hoặc URL của họ trong “Cài đặt”, “Thông báo”.',
'Bật “Web Push”, “Ntfy” và “Webhook” để cung cấp chúng; người dùng sau đó bật thông báo đẩy cho từng thiết bị, hoặc nhập chủ đề hoặc URL của họ, trong “Cài đặt”, “Thông báo”.',
'help.guide.channels-instance.step.3':
'“Lời nhắc chuyến đi” bật tắt lời nhắc trước khi chuyến đi bắt đầu; “Trong ứng dụng” luôn bật và ở đây chỉ được giải thích.',
'help.guide.channels-instance.result': 'Tab “Thông báo” của mọi người dùng hiện các kênh bạn đã bật.',
+13
View File
@@ -121,6 +121,19 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.pluginConfigured':
'Đã cấu hình. Quản lý thông tin đăng nhập ở trang cài đặt của plugin.',
'settings.notificationPreferences.ntfy': 'Ntfy',
'settings.notificationPreferences.push': 'Thông báo đẩy',
'settings.webPush.title': 'Thông báo đẩy trên thiết bị này',
'settings.webPush.hint':
'Hiển thị thông báo của TREK trên thiết bị này ngay cả khi TREK đang đóng. Những sự kiện nào được gửi đến tuân theo cột Thông báo đẩy.',
'settings.webPush.enable': 'Bật cho thiết bị này',
'settings.webPush.disable': 'Tắt cho thiết bị này',
'settings.webPush.enabled': 'Đã bật cho thiết bị này',
'settings.webPush.unsupported': 'Trình duyệt này không thể nhận thông báo đẩy.',
'settings.webPush.insecure': 'Thông báo đẩy cần mở TREK qua HTTPS.',
'settings.webPush.iosInstall': 'Trên iPhone và iPad, hãy thêm TREK vào Màn hình chính trước rồi mở từ đó.',
'settings.webPush.denied':
'Thông báo của TREK đang bị chặn trong trình duyệt này. Hãy cho phép trong cài đặt trình duyệt rồi thử lại.',
'settings.webPush.failed': 'Không thể bật thông báo đẩy cho thiết bị này.',
'settings.notificationPreferences.noChannels':
'Không có kênh thông báo nào được cấu hình. Yêu cầu quản trị viên thiết lập thông báo qua email hoặc webhook.',
'settings.webhookUrl.label': 'Webhook URL',
+3
View File
@@ -13,6 +13,9 @@ const admin: TranslationStrings = {
'admin.notifications.testWebhookFailed': '測試 Webhook 傳送失敗',
'admin.notifications.emailPanel.title': '電子郵件 (SMTP)',
'admin.notifications.webhookPanel.title': 'Webhook',
'admin.notifications.webPushPanel.title': 'Web 推播',
'admin.notifications.webPushPanel.hint':
'讓使用者即使在 TREK 關閉時,也能透過瀏覽器在手機和電腦上接收通知。需要 HTTPS;在 iPhone 和 iPad 上,必須將 TREK 加入主畫面。',
'admin.notifications.inappPanel.title': '應用程式內通知',
'admin.notifications.inappPanel.hint': '應用程式內通知始終啟用,無法全域性停用。',
'admin.notifications.adminWebhookPanel.title': '管理員 Webhook',
+5 -3
View File
@@ -876,11 +876,13 @@ const help: TranslationStrings = {
'help.ctx.settings-map.bullet.3': '「高畫質模式」提供反鋸齒和地球儀投影;「儲存地圖」寫入你的選擇。',
'help.ctx.settings-notifications.title': '通知',
'help.ctx.settings-notifications.summary':
'TREK 在應用程式之外聯絡你的地方:一個 ntfy 主題、一個 webhook,或者外掛提供的管道。管道下方每個事件一列,決定什麼送到哪裡。',
'TREK 在應用程式之外聯絡你的地方:此裝置上的推播通知、一個 ntfy 主題、一個 webhook,或者外掛提供的管道。管道下方每個事件一列,決定什麼送到哪裡。',
'help.ctx.settings-notifications.bullet.1':
'ntfy:主題、選填的自建伺服器和選填的存取權杖,按「測試」可以立刻送一則。',
'help.ctx.settings-notifications.bullet.2': 'Webhook:一個以 JSON 接收所有事件的 URL,附「測試」。',
'help.ctx.settings-notifications.bullet.3':
'此裝置上的推播通知:「為此裝置開啟」只對你正在使用的瀏覽器生效,所以要在每支手機或每台電腦上各開一次。「傳送測試」會送到所有這些裝置。',
'help.ctx.settings-notifications.bullet.4':
'偏好設定列:每個事件開啟了哪個管道。外掛管道在設定好之前顯示「前往設定」。',
'help.ctx.settings-integrations.title': '整合',
'help.ctx.settings-integrations.summary':
@@ -1147,7 +1149,7 @@ const help: TranslationStrings = {
'help.ctx.admin-notifications.summary':
'實例向使用者提供的管道,以及能聯絡到你這位管理員的管道。使用者在「設定」裡選自己的主題和 URL;你決定有哪些管道,並設定郵件。',
'help.ctx.admin-notifications.bullet.1':
'「應用程式內通知」「電子郵件 (SMTP)」「Ntfy」和「Webhook」:各一個面板,帶一個向使用者開放該管道的開關,以及它需要的伺服器端設定。',
'「應用程式內通知」「電子郵件 (SMTP)」「Ntfy」「Webhook」和「Web 推播」:各一個面板,帶一個向使用者開放該管道的開關,以及它需要的伺服器端設定。',
'help.ctx.admin-notifications.bullet.2': '「行程提醒」:伺服器是否在行程開始前傳送提醒。',
'help.ctx.admin-notifications.bullet.3':
'「管理員 Ntfy」和「管理員 Webhook」:備份失敗或新版本發布這類管理員事件的去向,帶「測試」。',
@@ -1345,7 +1347,7 @@ const help: TranslationStrings = {
'help.guide.channels-instance.step.1':
'在「電子郵件 (SMTP)」下輸入 SMTP Host、SMTP Port、SMTP User、SMTP Password 和 From Address;「傳送測試郵件」會給你發一封郵件。',
'help.guide.channels-instance.step.2':
'開啟「Ntfy」和「Webhook」以提供它們;使用者隨後在「設定」的「通知」裡輸入自己的主題或 URL。',
'開啟「Web 推播」「Ntfy」和「Webhook」以提供它們;使用者隨後在「設定」的「通知」裡為每台裝置開啟推播,或輸入自己的主題或 URL。',
'help.guide.channels-instance.step.3': '「行程提醒」開關行程開始前的提醒;「應用程式內通知」始終開啟,這裡只是說明。',
'help.guide.channels-instance.result': '每個使用者的「通知」分頁會顯示你開啟的管道。',
'help.guide.channels-instance.tip.1': '在這裡輸入的預設 ntfy 伺服器會為使用者預填;他們仍然可以指定自己的。',
+11
View File
@@ -109,6 +109,17 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.testFailed': '測試失敗。',
'settings.notificationPreferences.pluginConfigured': '已設定。請在外掛的設定頁面管理憑證。',
'settings.notificationPreferences.ntfy': 'Ntfy',
'settings.notificationPreferences.push': '推播',
'settings.webPush.title': '此裝置上的推播通知',
'settings.webPush.hint': '即使 TREK 已關閉,也會在此裝置上顯示 TREK 通知。收到哪些事件取決於「推播」欄。',
'settings.webPush.enable': '為此裝置開啟',
'settings.webPush.disable': '為此裝置關閉',
'settings.webPush.enabled': '已為此裝置開啟',
'settings.webPush.unsupported': '此瀏覽器無法接收推播通知。',
'settings.webPush.insecure': '推播需要透過 HTTPS 開啟 TREK。',
'settings.webPush.iosInstall': '在 iPhone 和 iPad 上,請先將 TREK 加入主畫面,再從主畫面開啟。',
'settings.webPush.denied': '此瀏覽器已封鎖 TREK 的通知。請在瀏覽器設定中允許通知,然後再試一次。',
'settings.webPush.failed': '無法為此裝置開啟推播。',
'settings.notificationPreferences.noChannels': '未配置通知渠道。請聯絡管理員設定電子郵件或 Webhook 通知。',
'settings.webhookUrl.label': 'Webhook URL',
'settings.webhookUrl.placeholder': 'https://discord.com/api/webhooks/...',
+3
View File
@@ -668,6 +668,9 @@ const admin: TranslationStrings = {
'admin.tabs.permissions': '权限',
'admin.notifications.emailPanel.title': '电子邮件(SMTP)',
'admin.notifications.webhookPanel.title': 'Webhook',
'admin.notifications.webPushPanel.title': 'Web 推送',
'admin.notifications.webPushPanel.hint':
'让用户即使在 TREK 关闭时,也能通过浏览器在手机和电脑上接收通知。需要 HTTPS;在 iPhone 和 iPad 上,必须将 TREK 添加到主屏幕。',
'admin.notifications.inappPanel.title': '应用内通知',
'admin.notifications.inappPanel.hint': '应用内通知始终处于活跃状态,无法全局禁用。',
'admin.notifications.adminWebhookPanel.title': '管理员 Webhook',
+6 -4
View File
@@ -860,10 +860,12 @@ const help: TranslationStrings = {
'help.ctx.settings-map.bullet.3': '“高画质模式”提供抗锯齿和地球仪投影;“保存地图”写入你的选择。',
'help.ctx.settings-notifications.title': '通知',
'help.ctx.settings-notifications.summary':
'TREK 在应用之外联系你的地方:一个 ntfy 主题、一个 webhook,或者插件提供的渠道。渠道下方每个事件一行,决定什么发到哪里。',
'TREK 在应用之外联系你的地方:此设备上的推送通知、一个 ntfy 主题、一个 webhook,或者插件提供的渠道。渠道下方每个事件一行,决定什么发到哪里。',
'help.ctx.settings-notifications.bullet.1': 'ntfy:主题、可选的自建服务器和可选的访问令牌,点“测试”可以立刻发一条。',
'help.ctx.settings-notifications.bullet.2': 'Webhook:一个以 JSON 接收所有事件的 URL,带“测试”。',
'help.ctx.settings-notifications.bullet.3': '偏好设置行:每个事件开启了哪个渠道。插件渠道在设置好之前显示“去配置”。',
'help.ctx.settings-notifications.bullet.3':
'此设备上的推送通知:“为此设备开启”只对你正在使用的浏览器生效,所以要在每台手机或电脑上各开一次。“发送测试”会发到所有这些设备。',
'help.ctx.settings-notifications.bullet.4': '偏好设置行:每个事件开启了哪个渠道。插件渠道在设置好之前显示“去配置”。',
'help.ctx.settings-integrations.title': '集成',
'help.ctx.settings-integrations.summary':
'从外部连接到 TREK 的一切:日记用的照片库、脚本用的 API 密钥,以及供 AI 助手使用的 MCP 端点及其令牌和 OAuth 客户端。',
@@ -1119,7 +1121,7 @@ const help: TranslationStrings = {
'help.ctx.admin-notifications.summary':
'实例向用户提供的渠道,以及能联系到你这位管理员的渠道。用户在“设置”里选自己的主题和 URL;你决定有哪些渠道,并配置邮件。',
'help.ctx.admin-notifications.bullet.1':
'“应用内通知”“电子邮件(SMTP)”“Ntfy”和“Webhook”:各一个面板,带一个向用户开放该渠道的开关,以及它需要的服务器端配置。',
'“应用内通知”“电子邮件(SMTP)”“Ntfy”“Webhook”和“Web 推送”:各一个面板,带一个向用户开放该渠道的开关,以及它需要的服务器端配置。',
'help.ctx.admin-notifications.bullet.2': '“行程提醒”:服务器是否在行程开始前发送提醒。',
'help.ctx.admin-notifications.bullet.3':
'“管理员 Ntfy”和“管理员 Webhook”:备份失败或新版本发布这类管理员事件的去向,带“测试”。',
@@ -1314,7 +1316,7 @@ const help: TranslationStrings = {
'help.guide.channels-instance.step.1':
'在“电子邮件(SMTP)”下输入 SMTP Host、SMTP Port、SMTP User、SMTP Password 和 From Address;“发送测试邮件”会给你发一封邮件。',
'help.guide.channels-instance.step.2':
'打开“Ntfy”和“Webhook”以提供它们;用户随后在“设置”的“通知”里输入自己的主题或 URL。',
'打开“Web 推送”“Ntfy”和“Webhook”以提供它们;用户随后在“设置”的“通知”里为每台设备开启推送,或输入自己的主题或 URL。',
'help.guide.channels-instance.step.3': '“行程提醒”开关行程开始前的提醒;“应用内通知”始终开启,这里只是说明。',
'help.guide.channels-instance.result': '每个用户的“通知”标签页会显示你开启的渠道。',
'help.guide.channels-instance.tip.1': '在这里输入的默认 ntfy 服务器会为用户预填;他们仍然可以指定自己的。',
+11
View File
@@ -301,6 +301,17 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.webhook': 'Webhook',
'settings.notificationPreferences.email': '电子邮件',
'settings.notificationPreferences.ntfy': 'Ntfy',
'settings.notificationPreferences.push': '推送',
'settings.webPush.title': '此设备上的推送通知',
'settings.webPush.hint': '即使 TREK 已关闭,也会在此设备上显示 TREK 通知。收到哪些事件取决于“推送”列。',
'settings.webPush.enable': '为此设备开启',
'settings.webPush.disable': '为此设备关闭',
'settings.webPush.enabled': '已为此设备开启',
'settings.webPush.unsupported': '此浏览器无法接收推送通知。',
'settings.webPush.insecure': '推送需要通过 HTTPS 打开 TREK。',
'settings.webPush.iosInstall': '在 iPhone 和 iPad 上,请先将 TREK 添加到主屏幕,然后从主屏幕打开。',
'settings.webPush.denied': '此浏览器已阻止 TREK 的通知。请在浏览器设置中允许通知,然后重试。',
'settings.webPush.failed': '无法为此设备开启推送。',
'settings.currency': '显示货币',
'settings.currencyHint': '“费用”中的金额仅在显示时换算为该货币,原始金额保持不变。',
'settings.currencyTrip': '行程货币',
@@ -4,6 +4,14 @@ import {
channelTestResultSchema,
inAppListResultSchema,
testNtfyRequestSchema,
pushSubscriptionSchema,
pushSubscribeRequestSchema,
pushUnsubscribeRequestSchema,
pushPublicKeyResultSchema,
pushSubscribeResultSchema,
pushUnsubscribeResultSchema,
pushPayloadSchema,
MAX_PUSH_ENDPOINT_LENGTH,
} from './notification.schema';
import { describe, it, expect } from 'vitest';
@@ -56,3 +64,140 @@ describe('inAppListResultSchema', () => {
).toBe(true);
});
});
// ── Web Push ────────────────────────────────────────────────────────────────
const SUBSCRIPTION = {
endpoint: 'https://fcm.googleapis.com/fcm/send/abc',
expirationTime: null,
keys: { p256dh: 'BNcRdreALRFXTkOOUHK1EtK2wtaz5Ry4YfYCA', auth: 'tBHItJI5svbpez7KI4CCXg' },
};
describe('pushSubscriptionSchema', () => {
it('accepts what PushSubscription.toJSON() hands over, with or without an expiry', () => {
expect(pushSubscriptionSchema.safeParse(SUBSCRIPTION).success).toBe(true);
expect(pushSubscriptionSchema.safeParse({ ...SUBSCRIPTION, expirationTime: 1767225600000 }).success).toBe(true);
expect(pushSubscriptionSchema.safeParse({ endpoint: SUBSCRIPTION.endpoint, keys: SUBSCRIPTION.keys }).success).toBe(
true,
);
expect(pushSubscriptionSchema.safeParse({ ...SUBSCRIPTION, expirationTime: 'tomorrow' }).success).toBe(false);
});
it('refuses a subscription without keys, or with one of them missing or empty', () => {
expect(pushSubscriptionSchema.safeParse({ endpoint: SUBSCRIPTION.endpoint, expirationTime: null }).success).toBe(
false,
);
expect(pushSubscriptionSchema.safeParse({ ...SUBSCRIPTION, keys: { p256dh: 'x' } }).success).toBe(false);
expect(pushSubscriptionSchema.safeParse({ ...SUBSCRIPTION, keys: { auth: 'x' } }).success).toBe(false);
expect(pushSubscriptionSchema.safeParse({ ...SUBSCRIPTION, keys: { p256dh: '', auth: 'x' } }).success).toBe(false);
expect(pushSubscriptionSchema.safeParse({ ...SUBSCRIPTION, endpoint: '' }).success).toBe(false);
});
it('refuses an endpoint that is not a string, and leaves checking the URL itself to the server', () => {
expect(pushSubscriptionSchema.safeParse({ ...SUBSCRIPTION, endpoint: 42 }).success).toBe(false);
expect(pushSubscriptionSchema.safeParse({ ...SUBSCRIPTION, endpoint: null }).success).toBe(false);
expect(pushSubscriptionSchema.safeParse({ keys: SUBSCRIPTION.keys }).success).toBe(false);
// Only the shape is the contract's: a string that is not an https URL on a push
// service passes here, so the server can refuse it with its own 400 body.
expect(pushSubscriptionSchema.safeParse({ ...SUBSCRIPTION, endpoint: 'not a url' }).success).toBe(true);
expect(pushSubscriptionSchema.safeParse({ ...SUBSCRIPTION, endpoint: 'http://example.com/push' }).success).toBe(
true,
);
});
it('refuses keys that are not strings', () => {
expect(pushSubscriptionSchema.safeParse({ ...SUBSCRIPTION, keys: 'p256dh,auth' }).success).toBe(false);
expect(pushSubscriptionSchema.safeParse({ ...SUBSCRIPTION, keys: { p256dh: 1, auth: 'x' } }).success).toBe(false);
expect(pushSubscriptionSchema.safeParse({ ...SUBSCRIPTION, keys: { p256dh: 'x', auth: null } }).success).toBe(
false,
);
});
it('caps the endpoint at MAX_PUSH_ENDPOINT_LENGTH characters and the keys at 200 and 100', () => {
const at = (n: number) => 'a'.repeat(n);
expect(MAX_PUSH_ENDPOINT_LENGTH).toBe(2048);
expect(pushSubscriptionSchema.safeParse({ ...SUBSCRIPTION, endpoint: at(MAX_PUSH_ENDPOINT_LENGTH) }).success).toBe(
true,
);
expect(
pushSubscriptionSchema.safeParse({ ...SUBSCRIPTION, endpoint: at(MAX_PUSH_ENDPOINT_LENGTH + 1) }).success,
).toBe(false);
const keys = SUBSCRIPTION.keys;
expect(pushSubscriptionSchema.safeParse({ ...SUBSCRIPTION, keys: { ...keys, p256dh: at(200) } }).success).toBe(
true,
);
expect(pushSubscriptionSchema.safeParse({ ...SUBSCRIPTION, keys: { ...keys, p256dh: at(201) } }).success).toBe(
false,
);
expect(pushSubscriptionSchema.safeParse({ ...SUBSCRIPTION, keys: { ...keys, auth: at(100) } }).success).toBe(true);
expect(pushSubscriptionSchema.safeParse({ ...SUBSCRIPTION, keys: { ...keys, auth: at(101) } }).success).toBe(false);
});
});
describe('pushSubscribeRequestSchema', () => {
it('wants the subscription under `subscription`', () => {
expect(pushSubscribeRequestSchema.safeParse({ subscription: SUBSCRIPTION }).success).toBe(true);
expect(pushSubscribeRequestSchema.safeParse(SUBSCRIPTION).success).toBe(false);
expect(pushSubscribeRequestSchema.safeParse({}).success).toBe(false);
});
it('checks the subscription inside it like a bare one', () => {
expect(pushSubscribeRequestSchema.safeParse({ subscription: { ...SUBSCRIPTION, keys: {} } }).success).toBe(false);
expect(
pushSubscribeRequestSchema.safeParse({
subscription: { ...SUBSCRIPTION, endpoint: 'a'.repeat(MAX_PUSH_ENDPOINT_LENGTH + 1) },
}).success,
).toBe(false);
});
});
describe('pushUnsubscribeRequestSchema', () => {
it('takes one endpoint, non-empty and at most MAX_PUSH_ENDPOINT_LENGTH characters, like a subscription', () => {
expect(pushUnsubscribeRequestSchema.safeParse({ endpoint: SUBSCRIPTION.endpoint }).success).toBe(true);
expect(pushUnsubscribeRequestSchema.safeParse({ endpoint: '' }).success).toBe(false);
expect(pushUnsubscribeRequestSchema.safeParse({ endpoint: 'a'.repeat(MAX_PUSH_ENDPOINT_LENGTH) }).success).toBe(
true,
);
expect(pushUnsubscribeRequestSchema.safeParse({ endpoint: 'a'.repeat(MAX_PUSH_ENDPOINT_LENGTH + 1) }).success).toBe(
false,
);
expect(pushUnsubscribeRequestSchema.safeParse({}).success).toBe(false);
expect(pushUnsubscribeRequestSchema.safeParse({ endpoint: 42 }).success).toBe(false);
});
});
describe('pushPublicKeyResultSchema', () => {
it('is the key as a string', () => {
expect(pushPublicKeyResultSchema.safeParse({ publicKey: 'BP4z9KsN6nGRTbVY' }).success).toBe(true);
expect(pushPublicKeyResultSchema.safeParse({ publicKey: null }).success).toBe(false);
expect(pushPublicKeyResultSchema.safeParse({}).success).toBe(false);
});
});
describe('pushSubscribeResultSchema', () => {
it('is success true with the device count', () => {
expect(pushSubscribeResultSchema.safeParse({ success: true, devices: 2 }).success).toBe(true);
expect(pushSubscribeResultSchema.safeParse({ success: false, devices: 2 }).success).toBe(false);
expect(pushSubscribeResultSchema.safeParse({ success: true }).success).toBe(false);
});
});
describe('pushUnsubscribeResultSchema', () => {
it('is success true, nothing else', () => {
expect(pushUnsubscribeResultSchema.safeParse({ success: true }).success).toBe(true);
expect(pushUnsubscribeResultSchema.safeParse({ success: false }).success).toBe(false);
expect(pushUnsubscribeResultSchema.safeParse({}).success).toBe(false);
});
});
describe('pushPayloadSchema', () => {
it('needs a title and a body; url and tag are optional', () => {
expect(pushPayloadSchema.safeParse({ title: 'T', body: 'B' }).success).toBe(true);
expect(
pushPayloadSchema.safeParse({ title: 'T', body: 'B', url: '/trips/1', tag: 'collab_message:/trips/1' }).success,
).toBe(true);
expect(pushPayloadSchema.safeParse({ title: 'T' }).success).toBe(false);
expect(pushPayloadSchema.safeParse({ body: 'B' }).success).toBe(false);
expect(pushPayloadSchema.safeParse({ title: 'T', body: 'B', tag: 5 }).success).toBe(false);
});
});
@@ -55,3 +55,75 @@ export type InAppListResult = z.infer<typeof inAppListResultSchema>;
export const unreadCountResultSchema = z.object({ count: z.number() });
export type UnreadCountResult = z.infer<typeof unreadCountResultSchema>;
// ── Web Push (#894) ──────────────────────────────────────────────────────────
/** Id of the built-in Web Push channel in the preference matrix and the admin CSV. */
export const WEB_PUSH_CHANNEL_ID = 'push';
/**
* The longest push endpoint the server takes, well above what the push
* services hand out. One value for the contract and the server's own endpoint
* check, so a device that can register can always unsubscribe and be sent to.
*/
export const MAX_PUSH_ENDPOINT_LENGTH = 2048;
/**
* The browser's PushSubscription as PushSubscription.toJSON() hands it over.
* Only the shape is checked here; the service refuses an endpoint that is not
* https on a known push service and keys that do not decode to the RFC 8291
* sizes, with messages of its own.
*/
export const pushSubscriptionSchema = z.object({
endpoint: z.string().min(1).max(MAX_PUSH_ENDPOINT_LENGTH),
expirationTime: z.number().nullable().optional(),
keys: z.object({
p256dh: z.string().min(1).max(200),
auth: z.string().min(1).max(100),
}),
});
export type PushSubscriptionInput = z.infer<typeof pushSubscriptionSchema>;
/** Register this device for push; repeating it for the same endpoint only refreshes the row. */
export const pushSubscribeRequestSchema = z.object({
subscription: pushSubscriptionSchema,
});
export type PushSubscribeRequest = z.infer<typeof pushSubscribeRequestSchema>;
/** Forget one device (logout, or the user switching push off there). */
export const pushUnsubscribeRequestSchema = z.object({
endpoint: z.string().min(1).max(MAX_PUSH_ENDPOINT_LENGTH),
});
export type PushUnsubscribeRequest = z.infer<typeof pushUnsubscribeRequestSchema>;
/** The VAPID public key a browser subscribes with (base64url, uncompressed P-256 point). */
export const pushPublicKeyResultSchema = z.object({
publicKey: z.string(),
});
export type PushPublicKeyResult = z.infer<typeof pushPublicKeyResultSchema>;
export const pushSubscribeResultSchema = z.object({
success: z.literal(true),
/** How many devices this account now receives push on. */
devices: z.number(),
});
export type PushSubscribeResult = z.infer<typeof pushSubscribeResultSchema>;
/** Forgetting a device always succeeds, also for an endpoint the server no longer knows. */
export const pushUnsubscribeResultSchema = z.object({
success: z.literal(true),
});
export type PushUnsubscribeResult = z.infer<typeof pushUnsubscribeResultSchema>;
/**
* What the service worker receives. Title and body are rendered on the server
* in the recipient's language, because the worker has no translations; `url` is
* a same-origin path the click opens.
*/
export const pushPayloadSchema = z.object({
title: z.string(),
body: z.string(),
url: z.string().optional(),
tag: z.string().optional(),
});
export type PushPayload = z.infer<typeof pushPayloadSchema>;