feat: Add OIDC/SSO authentication support (#1008)

* feat: add OIDC/SSO database schema and models (Phase 1)

Add database foundation for OpenID Connect authentication:

Database Migrations:
- Create oidc_identities table (links users to OIDC accounts)
- Create oidc_state_nonces table (OAuth state/nonce for CSRF protection)
- Create auth_audit_log table (security event logging)
- Make password_digest nullable in users table (allow OIDC-only users)

Models:
- OIDCIdentity: Links users to external OIDC providers
- OIDCStateNonce: Temporary OAuth state management
- AuthAuditLog: Authentication event audit trail

Changes:
- Updated User model to allow null password_digest
- Added model associations in models/index.js
- All migrations tested and verified

Related to #977

* feat: add OIDC core services (Phase 2)

- Install openid-client@^6.2.0 for OIDC protocol support
- Implement providerConfig.js for loading providers from .env
  - Support single provider or numbered providers (OIDC_PROVIDER_1_*, etc.)
  - Auto-provision and admin email domain configuration
  - Provider caching for performance
- Implement stateManager.js for OAuth state/nonce management
  - CSRF protection with 10-minute TTL
  - One-time use state consumption
  - Automatic cleanup of expired states
- Implement auditService.js for authentication event logging
  - Track login success/failure, logout, OIDC linking/unlinking
  - Store IP address, user agent, and metadata
  - Support for event queries and retention cleanup
- Add comprehensive unit tests (60 tests, all passing)
  - providerConfig: 36 tests for env parsing and validation
  - stateManager: 12 tests for state lifecycle and security
  - auditService: 12 tests for event logging and queries

Phase 2 completes the backend core services needed for OIDC authentication.

* feat: implement OIDC authentication flow (Phase 3)

Core OIDC Flow (service.js):
- Provider discovery with issuer caching
- Authorization URL generation with state/nonce
- OAuth callback handling and token exchange
- ID token validation using openid-client
- Token refresh functionality

JIT User Provisioning (provisioningService.js):
- Auto-create users from OIDC claims
- Link existing email accounts to OIDC identities
- Admin role assignment based on email domain rules
- Automatic username generation from email
- Transaction-safe identity creation

Identity Management (oidcIdentityService.js):
- List user's linked OIDC identities
- Link additional providers to existing accounts
- Unlink identities with safety checks
- Prevent unlinking last auth method
- Update identity claims on login

HTTP Layer (controller.js + routes.js):
- GET /api/oidc/providers - List configured providers
- GET /api/oidc/auth/:slug - Initiate OIDC flow
- GET /api/oidc/callback/:slug - Handle OAuth callback
- POST /api/oidc/link/:slug - Link provider to current user
- DELETE /api/oidc/unlink/:id - Unlink identity
- GET /api/oidc/identities - Get user's identities

Integration:
- Register OIDC routes in Express app (public + authenticated)
- Update auth service to reject password login for OIDC-only users
- Audit logging for all OIDC operations
- Session creation on successful authentication

Security:
- State/nonce CSRF protection
- One-time use state consumption
- Transaction-safe user provisioning
- Foreign key constraints enforced

* feat: implement OIDC frontend login flow (Phase 4)

- Created OIDCProviderButtons component for SSO login options
- Created OIDCCallback component for OAuth callback handling
- Updated Login page to fetch and display OIDC providers
- Added /auth/callback/:provider route to App.tsx
- Added i18n translations for OIDC UI elements
- Downgraded openid-client to v5.7.0 (CommonJS compatibility)
- Fixed linting issues in backend OIDC modules

Phase 4 completes the frontend login flow for OIDC/SSO authentication.
Users can now see configured SSO providers on the login page.

* feat: implement OIDC account linking UI (Phase 5)

Add Connected Accounts section to Profile Security tab allowing users to:
- View linked OIDC provider accounts
- Link new SSO providers to their account
- Unlink OIDC identities with validation
- Prevent unlinking last authentication method

Backend changes:
- Add has_password virtual field to User model
- Include has_password in profile API response
- Track whether user has password set for validation

Frontend changes:
- Create oidcService for OIDC API operations
- Create ConnectedAccounts component with link/unlink flows
- Add confirmation dialog before unlinking accounts
- Validate that users cannot unlink their last auth method
- Show warning if user has no password set
- Integrate Connected Accounts into SecurityTab

User experience:
- View all linked SSO provider accounts with email and link date
- Link additional providers via "Link Provider" buttons
- Unlink with two-step confirmation to prevent accidents
- Clear error messages when unlinking would leave no auth method
- Warning message suggesting password setup for OIDC-only users

Fixes #977

* feat: complete OIDC documentation and UI improvements (Phase 6)

This commit completes Phase 6 of the OIDC/SSO implementation with comprehensive
documentation, bug fixes, and UI reorganization.

Documentation:
- Add comprehensive user guide at docs/10-oidc-sso.md with:
  - Setup guides for 6 major providers (Google, Okta, Keycloak, Authentik, PocketID, Azure AD)
  - Configuration examples for single and multiple providers
  - User features documentation (login, account linking, management)
  - Advanced topics (auto-provisioning, admin role assignment, hybrid auth)
  - Comprehensive troubleshooting section
  - Security considerations and best practices
- Update README.md with OIDC/SSO section and quick setup examples

Internationalization:
- Add i18n support to OIDCProviderButtons component
- Add translation keys for all OIDC UI text
- Update English translations with "sign_in_with" key

Bug Fixes:
- Fix oidcService.ts to correctly unwrap API responses
  - Backend returns {providers: [...]} and {identities: [...]}
  - Frontend was expecting plain arrays, causing "map is not a function" error
- Fix initiateOIDCLink to properly handle POST response

UI Improvements:
- Move OIDC/SSO to dedicated tab in profile settings
  - Create new OIDCTab component with green LinkIcon
  - Remove ConnectedAccounts from SecurityTab
  - Add OIDC tab between Security and API Keys tabs
  - Update ProfileSettings with new tab configuration
- Security tab now focuses solely on password management

Testing:
- All linting passes
- All tests pass (82 suites, 1223 tests)

Related to #977

* feat: add OIDC/SSO translations for all 24 languages

Add i18n support for OIDC/SSO features across all supported languages:
- "Sign in with {{provider}}" button text
- "OIDC/SSO" tab label in profile settings
- OIDC authentication flow messages

Translations added for: Arabic, Bulgarian, Danish, German, Greek, Spanish,
Finnish, French, Indonesian, Italian, Japanese, Korean, Dutch, Norwegian,
Polish, Portuguese, Romanian, Russian, Slovenian, Swedish, Turkish,
Ukrainian, Vietnamese, and Chinese.

* fix: resolve 13 CodeQL security alerts

This commit addresses critical security vulnerabilities identified by CodeQL scanning:

**Security Configuration (2 fixes)**
- Fix insecure Helmet configuration - enable CSP and HSTS in production
- Fix clear text cookie transmission - enable secure cookies in production

**Path Injection (3 fixes)**
- Add path validation in users/controller.js to prevent arbitrary file deletion
- Add path validation in users/service.js for avatar operations
- Add path sanitization in attachment-utils.js deleteFileFromDisk function

**Cross-Site Scripting (1 fix)**
- Fix XSS vulnerability in GeneralTab.tsx avatar URL handling
- Add URL sanitization to prevent javascript: protocol attacks

**URL Security (2 fixes)**
- Fix double escaping in url/service.js HTML entity decoding
- Fix incomplete URL sanitization for YouTube domain validation

**Denial of Service (1 fix)**
- Add loop bound protection in inboxProcessingService.js (10k char limit)

**Rate Limiting (3 fixes)**
- Add rate limiting to auth routes (register, verify-email)
- Add rate limiting to task attachment upload/delete endpoints
- Add rate limiting to user avatar upload/delete endpoints

**GitHub Actions Security (1 fix)**
- Add explicit read-only permissions to CI workflow

Note: CSRF middleware (#10) requires frontend changes and is tracked separately.

Relates to PR #1008

* fix: allow test files in path validation for tests

* fix: format long condition in attachment-utils for Prettier compliance

Break the path validation condition across multiple lines to meet Prettier formatting requirements and fix CI linting failure.

* fix: resolve CodeQL security alerts

- Add rate limiting to OIDC authentication routes using authLimiter and authenticatedApiLimiter
- Implement CSRF protection middleware using csrf-sync (skips for API tokens and test environment)
- Add CSRF token endpoint at /api/csrf-token
- Fix incomplete URL scheme validation in GeneralTab to block all dangerous schemes (javascript:, data:, vbscript:, file:)

This addresses 5 high-severity CodeQL security vulnerabilities:
- Missing rate limiting on OIDC auth routes
- Missing CSRF middleware protection
- Incomplete URL sanitization in avatar handling

All 1223 tests passing.

* fix: implement CSRF protection with lusca for CodeQL compliance

Add CSRF protection using lusca.csrf (CodeQL's recommended library) to
protect session-based authentication while supporting hybrid auth patterns.

Implementation:
- Pre-check middleware marks exempt requests (test env, Bearer tokens)
- Lusca CSRF middleware applied with exemption flag check
- Session-based requests require valid x-csrf-token header
- Bearer token requests exempt (don't use cookies)
- Test environment exempt for test execution

This addresses CodeQL security alert js/missing-token-validation while
maintaining support for both cookie-based and token-based authentication.

Related: #977 (OIDC/SSO authentication feature)
This commit is contained in:
Chris 2026-04-13 12:17:35 +03:00 committed by GitHub
parent 86f1bdcf1f
commit c2e9a1aa21
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
76 changed files with 5682 additions and 130 deletions

View file

@ -24,7 +24,8 @@
"no": "لا، استمر في التحرير",
"yesDiscard": "نعم، ألغِ",
"uploading": "جارٍ التحميل...",
"refresh": "تحديث"
"refresh": "تحديث",
"unlinking": "فصل الارتباط..."
},
"sidebar": {
"dashboard": "لوحة التحكم",
@ -313,7 +314,8 @@
"productivity": "الإنتاجية",
"telegram": "تيليجرام",
"ai": "ميزات الذكاء الاصطناعي",
"notifications": "تفضيلات الإشعارات"
"notifications": "تفضيلات الإشعارات",
"oidc": "OIDC/SSO"
},
"security": "إعدادات الأمان",
"changePassword": "تغيير كلمة المرور",
@ -376,6 +378,16 @@
"area": "إنشاء منطقة جديدة",
"tag": "إنشاء علامة جديدة"
}
},
"connectedAccounts": {
"title": "الحسابات المتصلة",
"description": "قم بربط الحسابات الخارجية لتسجيل الدخول باستخدام مزودي SSO.",
"link": "ربط {{provider}}",
"unlink": "فصل الارتباط",
"confirmUnlink": "تأكيد فصل الارتباط",
"linkedOn": "مرتبط في {{date}}",
"cannotUnlinkLast": "لا يمكن فصل الارتباط عن طريقة المصادقة الأخيرة. يرجى تعيين كلمة مرور أولاً.",
"noPasswordWarning": "لا توجد لديك كلمة مرور محددة. يُنصح بتعيين واحدة لتوفير طريقة تسجيل دخول بديلة."
}
},
"productivity": {
@ -531,7 +543,13 @@
"rememberMe": "تذكرني",
"loginSuccess": "تسجيل الدخول ناجح",
"loginFailed": "فشل تسجيل الدخول",
"logoutSuccess": "تسجيل الخروج ناجح"
"logoutSuccess": "تسجيل الخروج ناجح",
"or_continue_with_email": "أو تابع باستخدام البريد الإلكتروني",
"sign_in_with": "تسجيل الدخول باستخدام {{provider}}",
"oidc": {
"completing_signin": "يتم إكمال تسجيل الدخول...",
"authenticating_with_provider": "يتم المصادقة مع المزود. يرجى الانتظار..."
}
},
"dropdown": {
"createNew": "إنشاء جديد",

View file

@ -24,7 +24,8 @@
"no": "Не, продължавайте да редактирате",
"yesDiscard": "Да, откажете",
"uploading": "Качване...",
"refresh": "Обнови"
"refresh": "Обнови",
"unlinking": "Откачане..."
},
"sidebar": {
"dashboard": "Табло",
@ -313,7 +314,8 @@
"productivity": "Продуктивност",
"telegram": "Телеграм",
"ai": "AI функции",
"notifications": "Настройки за известия"
"notifications": "Настройки за известия",
"oidc": "OIDC/SSO"
},
"security": "Настройки за сигурност",
"changePassword": "Смяна на парола",
@ -376,6 +378,16 @@
"area": "Създаване на нова област",
"tag": "Създаване на нов етикет"
}
},
"connectedAccounts": {
"title": "Свързани акаунти",
"description": "Свържете външни акаунти, за да влезете с доставчици на SSO.",
"link": "Свържете {{provider}}",
"unlink": "Откачане",
"confirmUnlink": "Потвърдете откачането",
"linkedOn": "Свързан на {{date}}",
"cannotUnlinkLast": "Не можете да откачите последния си метод за удостоверяване. Моля, задайте парола първо.",
"noPasswordWarning": "Нямате зададена парола. Помислете за задаване на такава, за да имате алтернативен метод за вход."
}
},
"productivity": {
@ -531,7 +543,13 @@
"rememberMe": "Запомни ме",
"loginSuccess": "Успешно влизане",
"loginFailed": "Неуспешно влизане",
"logoutSuccess": "Успешно излизане"
"logoutSuccess": "Успешно излизане",
"or_continue_with_email": "Или продължете с имейл",
"sign_in_with": "Влезте с {{provider}}",
"oidc": {
"completing_signin": "Завършване на входа...",
"authenticating_with_provider": "Удостоверяване с доставчика. Моля, изчакайте..."
}
},
"dropdown": {
"createNew": "Създай ново",

View file

@ -24,7 +24,8 @@
"no": "Nej, fortsæt med at redigere",
"yesDiscard": "Ja, forkast",
"uploading": "Uploader...",
"refresh": "Opdater"
"refresh": "Opdater",
"unlinking": "Frakobler..."
},
"sidebar": {
"dashboard": "Dashboard",
@ -320,7 +321,8 @@
"productivity": "Produktivitet",
"telegram": "Telegram",
"ai": "AI-funktioner",
"notifications": "Notifikationsindstillinger"
"notifications": "Notifikationsindstillinger",
"oidc": "OIDC/SSO"
},
"security": "Sikkerhedsindstillinger",
"changePassword": "Skift adgangskode",
@ -376,6 +378,16 @@
"area": "Opret nyt område",
"tag": "Opret ny tag"
}
},
"connectedAccounts": {
"title": "Forbundne Konti",
"description": "Link eksterne konti for at logge ind med SSO-udbydere.",
"link": "Link {{provider}}",
"unlink": "Frakobl",
"confirmUnlink": "Bekræft Frakobling",
"linkedOn": "Forbundet den {{date}}",
"cannotUnlinkLast": "Kan ikke frakoble din sidste autentifikationsmetode. Venligst indstil en adgangskode først.",
"noPasswordWarning": "Du har ikke indstillet en adgangskode. Overvej at indstille en for at have en alternativ loginmetode."
}
},
"productivity": {
@ -531,7 +543,13 @@
"rememberMe": "Husk Mig",
"loginSuccess": "Login Succesfuld",
"loginFailed": "Login Mislykkedes",
"logoutSuccess": "Logout Succesfuld"
"logoutSuccess": "Logout Succesfuld",
"or_continue_with_email": "Eller fortsæt med e-mail",
"sign_in_with": "Log ind med {{provider}}",
"oidc": {
"completing_signin": "Afslutter log ind...",
"authenticating_with_provider": "Autentificerer med udbyder. Vent venligst..."
}
},
"dropdown": {
"createNew": "Opret Ny",

View file

@ -24,7 +24,8 @@
"no": "Nein, weiter bearbeiten",
"yesDiscard": "Ja, verwerfen",
"uploading": "Hochladen...",
"refresh": "Aktualisieren"
"refresh": "Aktualisieren",
"unlinking": "Trennen..."
},
"sidebar": {
"dashboard": "Dashboard",
@ -493,7 +494,8 @@
"productivity": "Produktivität",
"telegram": "Telegram",
"ai": "KI-Funktionen",
"notifications": "Benachrichtigungseinstellungen"
"notifications": "Benachrichtigungseinstellungen",
"oidc": "OIDC/SSO"
},
"security": "Sicherheitseinstellungen",
"changePassword": "Passwort ändern",
@ -619,6 +621,16 @@
"area": "Neuen Bereich erstellen",
"tag": "Neues Tag erstellen"
}
},
"connectedAccounts": {
"title": "Verbundene Konten",
"description": "Verknüpfen Sie externe Konten, um sich bei SSO-Anbietern anzumelden.",
"link": "Verknüpfen {{provider}}",
"unlink": "Trennen",
"confirmUnlink": "Trennen bestätigen",
"linkedOn": "Verknüpft am {{date}}",
"cannotUnlinkLast": "Kann Ihre letzte Authentifizierungsmethode nicht trennen. Bitte setzen Sie zuerst ein Passwort.",
"noPasswordWarning": "Sie haben kein Passwort festgelegt. Erwägen Sie, eines festzulegen, um eine alternative Anmeldemethode zu haben."
}
},
"nextTask": {
@ -854,7 +866,13 @@
"rememberMe": "Erinnere dich an mich",
"loginSuccess": "Anmeldung erfolgreich",
"loginFailed": "Anmeldung fehlgeschlagen",
"logoutSuccess": "Abmeldung erfolgreich"
"logoutSuccess": "Abmeldung erfolgreich",
"or_continue_with_email": "Oder mit E-Mail fortfahren",
"sign_in_with": "Mit {{provider}} anmelden",
"oidc": {
"completing_signin": "Anmeldung wird abgeschlossen...",
"authenticating_with_provider": "Authentifizierung beim Anbieter. Bitte warten..."
}
},
"dropdown": {
"createNew": "Neu erstellen",

View file

@ -24,7 +24,8 @@
"no": "Όχι, συνέχισε την επεξεργασία",
"yesDiscard": "Ναι, απόρριψη",
"uploading": "Ανεβάζω...",
"refresh": "Ανανέωση"
"refresh": "Ανανέωση",
"unlinking": "Αποσύνδεση..."
},
"sidebar": {
"dashboard": "Πίνακας Ελέγχου",
@ -115,7 +116,13 @@
"rememberMe": "Απομνημόνευση",
"loginSuccess": "Επιτυχής Σύνδεση",
"loginFailed": "Αποτυχία Σύνδεσης",
"logoutSuccess": "Επιτυχής Αποσύνδεση"
"logoutSuccess": "Επιτυχής Αποσύνδεση",
"or_continue_with_email": "Ή συνεχίστε με email",
"sign_in_with": "Συνδεθείτε με {{provider}}",
"oidc": {
"completing_signin": "Ολοκλήρωση σύνδεσης...",
"authenticating_with_provider": "Αυθεντικοποίηση με τον πάροχο. Παρακαλώ περιμένετε..."
}
},
"profile": {
"title": "Ρυθμίσεις Προφίλ",
@ -200,7 +207,8 @@
"productivity": "Παραγωγικότητα",
"telegram": "Telegram",
"ai": "Χαρακτηριστικά A.I.",
"notifications": "Ειδοποιήσεις"
"notifications": "Ειδοποιήσεις",
"oidc": "OIDC/SSO"
},
"security": "Ρυθμίσεις Ασφάλειας",
"changePassword": "Αλλαγή Κωδικού",
@ -294,6 +302,16 @@
"area": "Δημιουργία νέας Περιοχής",
"tag": "Δημιουργία νέας Ετικέτας"
}
},
"connectedAccounts": {
"title": "Συνδεδεμένοι Λογαριασμοί",
"description": "Συνδέστε εξωτερικούς λογαριασμούς για να συνδεθείτε με παρόχους SSO.",
"link": "Σύνδεση με {{provider}}",
"unlink": "Αποσύνδεση",
"confirmUnlink": "Επιβεβαίωση Αποσύνδεσης",
"linkedOn": "Συνδεδεμένο στις {{date}}",
"cannotUnlinkLast": "Δεν μπορείτε να αποσυνδέσετε τη τελευταία μέθοδο αυθεντικοποίησης. Παρακαλώ ορίστε πρώτα έναν κωδικό πρόσβασης.",
"noPasswordWarning": "Δεν έχετε ορίσει κωδικό πρόσβασης. Σκεφτείτε να ορίσετε έναν για να έχετε μια εναλλακτική μέθοδο σύνδεσης."
}
},
"errors": {

View file

@ -12,6 +12,7 @@
"loading": "Loading...",
"appLoading": "Loading application... Please wait.",
"completed": "Completed",
"unlinking": "Unlinking...",
"error": "Error",
"success": "Success",
"area": "Area",
@ -338,7 +339,8 @@
"skipNextAction": "Skip for now",
"nextActionHint": "Think of the smallest, most concrete step you can take right now to move this project forward.",
"tabs": {
"notifications": "Notification Preferences"
"notifications": "Notification Preferences",
"oidc": "OIDC/SSO"
},
"security": "Security Settings",
"changePassword": "Change Password",
@ -370,7 +372,17 @@
"avatarUploadFailed": "Failed to upload avatar",
"avatarRemoveFailed": "Failed to remove avatar",
"notificationsDescription": "Choose how you want to be notified about important events.",
"aiFeatures": "AI Features"
"aiFeatures": "AI Features",
"connectedAccounts": {
"title": "Connected Accounts",
"description": "Link external accounts to sign in with SSO providers.",
"link": "Link {{provider}}",
"unlink": "Unlink",
"confirmUnlink": "Confirm Unlink",
"linkedOn": "Linked on {{date}}",
"cannotUnlinkLast": "Cannot unlink your last authentication method. Please set a password first.",
"noPasswordWarning": "You have no password set. Consider setting one to have an alternative login method."
}
},
"productivity": {
"stalledProjects": "Stalled Projects",
@ -524,7 +536,13 @@
"rememberMe": "Remember Me",
"loginSuccess": "Login Successful",
"loginFailed": "Login Failed",
"logoutSuccess": "Logout Successful"
"logoutSuccess": "Logout Successful",
"or_continue_with_email": "Or continue with email",
"sign_in_with": "Sign in with {{provider}}",
"oidc": {
"completing_signin": "Completing sign-in...",
"authenticating_with_provider": "Authenticating with provider. Please wait..."
}
},
"dropdown": {
"createNew": "Create New",

View file

@ -24,7 +24,8 @@
"no": "No, seguir editando",
"yesDiscard": "Sí, descartar",
"uploading": "Subiendo...",
"refresh": "Actualizar"
"refresh": "Actualizar",
"unlinking": "Desvinculando..."
},
"sidebar": {
"dashboard": "Tablero",
@ -115,7 +116,13 @@
"rememberMe": "Recordarme",
"loginSuccess": "Inicio de Sesión Exitoso",
"loginFailed": "Error al Iniciar Sesión",
"logoutSuccess": "Cierre de Sesión Exitoso"
"logoutSuccess": "Cierre de Sesión Exitoso",
"or_continue_with_email": "O continuar con el correo electrónico",
"sign_in_with": "Iniciar sesión con {{provider}}",
"oidc": {
"completing_signin": "Completando el inicio de sesión...",
"authenticating_with_provider": "Autenticando con el proveedor. Por favor, espere..."
}
},
"profile": {
"title": "Configuración de Perfil",
@ -163,7 +170,8 @@
"productivity": "Productividad",
"telegram": "Telegram",
"ai": "Funciones IA",
"notifications": "Preferencias de Notificación"
"notifications": "Preferencias de Notificación",
"oidc": "OIDC/SSO"
},
"security": "Configuración de Seguridad",
"changePassword": "Cambiar Contraseña",
@ -294,6 +302,16 @@
"area": "Crear nueva área",
"tag": "Crear nueva etiqueta"
}
},
"connectedAccounts": {
"title": "Cuentas Conectadas",
"description": "Vincula cuentas externas para iniciar sesión con proveedores de SSO.",
"link": "Vincular {{provider}}",
"unlink": "Desvincular",
"confirmUnlink": "Confirmar Desvinculación",
"linkedOn": "Vinculado el {{date}}",
"cannotUnlinkLast": "No se puede desvincular su último método de autenticación. Por favor, establezca una contraseña primero.",
"noPasswordWarning": "No tiene ninguna contraseña establecida. Considere establecer una para tener un método de inicio de sesión alternativo."
}
},
"errors": {

View file

@ -24,7 +24,8 @@
"no": "Ei, jatka muokkaamista",
"yesDiscard": "Kyllä, hylkää",
"uploading": "Lähetetään...",
"refresh": "Päivitä"
"refresh": "Päivitä",
"unlinking": "Irrottaminen..."
},
"sidebar": {
"dashboard": "Ohjauspaneeli",
@ -320,7 +321,8 @@
"productivity": "Tuottavuus",
"telegram": "Telegram",
"ai": "AI-ominaisuudet",
"notifications": "Ilmoitusasetukset"
"notifications": "Ilmoitusasetukset",
"oidc": "OIDC/SSO"
},
"security": "Turvallisuusasetukset",
"changePassword": "Vaihda salasana",
@ -376,6 +378,16 @@
"area": "Luo uusi Alue",
"tag": "Luo uusi Tagi"
}
},
"connectedAccounts": {
"title": "Liitetyt tilit",
"description": "Linkitä ulkoiset tilit kirjautuaksesi SSO-palveluntarjoajien kanssa.",
"link": "Linkitä {{provider}}",
"unlink": "Irrota",
"confirmUnlink": "Vahvista irrottaminen",
"linkedOn": "Liitetty {{date}}",
"cannotUnlinkLast": "Et voi irrottaa viimeistä todennusmenetelmääsi. Aseta ensin salasana.",
"noPasswordWarning": "Sinulla ei ole asetettua salasanaa. Harkitse salasanan asettamista vaihtoehtoista kirjautumistapaa varten."
}
},
"productivity": {
@ -531,7 +543,13 @@
"rememberMe": "Muista minut",
"loginSuccess": "Kirjautuminen onnistui",
"loginFailed": "Kirjautuminen epäonnistui",
"logoutSuccess": "Uloskirjautuminen onnistui"
"logoutSuccess": "Uloskirjautuminen onnistui",
"or_continue_with_email": "Tai jatka sähköpostilla",
"sign_in_with": "Kirjaudu sisään {{provider}} avulla",
"oidc": {
"completing_signin": "Kirjautumisen viimeistely...",
"authenticating_with_provider": "Todennetaan palveluntarjoajalla. Ole hyvä ja odota..."
}
},
"dropdown": {
"createNew": "Luo uusi",

View file

@ -24,7 +24,8 @@
"no": "Non, continuer à éditer",
"yesDiscard": "Oui, abandonner",
"uploading": "Téléchargement...",
"refresh": "Rafraîchir"
"refresh": "Rafraîchir",
"unlinking": "Dissociation..."
},
"sidebar": {
"dashboard": "Tableau de bord",
@ -313,7 +314,8 @@
"productivity": "Productivité",
"telegram": "Telegram",
"ai": "Fonctionnalités IA",
"notifications": "Préférences de Notification"
"notifications": "Préférences de Notification",
"oidc": "OIDC/SSO"
},
"security": "Paramètres de sécurité",
"changePassword": "Changer le mot de passe",
@ -376,6 +378,16 @@
"area": "Créer une nouvelle Zone",
"tag": "Créer une nouvelle Étiquette"
}
},
"connectedAccounts": {
"title": "Comptes Connectés",
"description": "Liez des comptes externes pour vous connecter avec des fournisseurs SSO.",
"link": "Lier {{provider}}",
"unlink": "Dissocier",
"confirmUnlink": "Confirmer la Dissociation",
"linkedOn": "Lié le {{date}}",
"cannotUnlinkLast": "Impossible de dissocier votre dernier moyen d'authentification. Veuillez d'abord définir un mot de passe.",
"noPasswordWarning": "Vous n'avez pas de mot de passe défini. Envisagez d'en définir un pour avoir une méthode de connexion alternative."
}
},
"productivity": {
@ -531,7 +543,13 @@
"rememberMe": "Se souvenir de moi",
"loginSuccess": "Connexion réussie",
"loginFailed": "Échec de la connexion",
"logoutSuccess": "Déconnexion réussie"
"logoutSuccess": "Déconnexion réussie",
"or_continue_with_email": "Ou continuez avec l'email",
"sign_in_with": "Se connecter avec {{provider}}",
"oidc": {
"completing_signin": "Finalisation de la connexion...",
"authenticating_with_provider": "Authentification avec le fournisseur. Veuillez patienter..."
}
},
"dropdown": {
"createNew": "Créer nouveau",

View file

@ -24,7 +24,8 @@
"no": "Tidak, lanjutkan mengedit",
"yesDiscard": "Ya, buang",
"uploading": "Mengunggah...",
"refresh": "Segarkan"
"refresh": "Segarkan",
"unlinking": "Menghapus tautan..."
},
"sidebar": {
"dashboard": "Dasbor",
@ -313,7 +314,8 @@
"productivity": "Produktivitas",
"telegram": "Telegram",
"ai": "Fitur AI",
"notifications": "Preferensi Notifikasi"
"notifications": "Preferensi Notifikasi",
"oidc": "OIDC/SSO"
},
"security": "Pengaturan Keamanan",
"changePassword": "Ubah Kata Sandi",
@ -376,6 +378,16 @@
"area": "Buat Area baru",
"tag": "Buat Tag baru"
}
},
"connectedAccounts": {
"title": "Akun Terhubung",
"description": "Tautkan akun eksternal untuk masuk dengan penyedia SSO.",
"link": "Tautkan {{provider}}",
"unlink": "Hapus tautan",
"confirmUnlink": "Konfirmasi Hapus Tautan",
"linkedOn": "Tautkan pada {{date}}",
"cannotUnlinkLast": "Tidak dapat menghapus tautan metode otentikasi terakhir Anda. Silakan atur kata sandi terlebih dahulu.",
"noPasswordWarning": "Anda belum mengatur kata sandi. Pertimbangkan untuk mengatur satu untuk memiliki metode login alternatif."
}
},
"productivity": {
@ -531,7 +543,13 @@
"rememberMe": "Ingat Saya",
"loginSuccess": "Login Berhasil",
"loginFailed": "Login Gagal",
"logoutSuccess": "Logout Berhasil"
"logoutSuccess": "Logout Berhasil",
"or_continue_with_email": "Atau lanjutkan dengan email",
"sign_in_with": "Masuk dengan {{provider}}",
"oidc": {
"completing_signin": "Menyelesaikan masuk...",
"authenticating_with_provider": "Mengautentikasi dengan penyedia. Silakan tunggu..."
}
},
"dropdown": {
"createNew": "Buat Baru",

View file

@ -24,7 +24,8 @@
"no": "No, continua a modificare",
"yesDiscard": "Sì, scarta",
"uploading": "Caricamento...",
"refresh": "Aggiorna"
"refresh": "Aggiorna",
"unlinking": "Disconnettendo..."
},
"sidebar": {
"dashboard": "Dashboard",
@ -302,7 +303,8 @@
"productivity": "Produttività",
"telegram": "Telegram",
"ai": "Funzioni AI",
"notifications": "Preferenze di Notifica"
"notifications": "Preferenze di Notifica",
"oidc": "OIDC/SSO"
},
"security": "Impostazioni Sicurezza",
"changePassword": "Cambia Password",
@ -376,6 +378,16 @@
"area": "Crea una nuova Area",
"tag": "Crea un nuovo Tag"
}
},
"connectedAccounts": {
"title": "Account Connessi",
"description": "Collega account esterni per accedere con i fornitori SSO.",
"link": "Collega {{provider}}",
"unlink": "Disconnetti",
"confirmUnlink": "Conferma Disconnessione",
"linkedOn": "Collegato il {{date}}",
"cannotUnlinkLast": "Impossibile disconnettere il tuo ultimo metodo di autenticazione. Imposta prima una password.",
"noPasswordWarning": "Non hai impostato una password. Considera di impostarne una per avere un metodo di accesso alternativo."
}
},
"productivity": {
@ -531,7 +543,13 @@
"rememberMe": "Ricordami",
"loginSuccess": "Accesso Riuscito",
"loginFailed": "Accesso Fallito",
"logoutSuccess": "Disconnessione Riuscita"
"logoutSuccess": "Disconnessione Riuscita",
"or_continue_with_email": "Oppure continua con l'email",
"sign_in_with": "Accedi con {{provider}}",
"oidc": {
"completing_signin": "Completando l'accesso...",
"authenticating_with_provider": "Autenticazione con il fornitore. Attendere prego..."
}
},
"dropdown": {
"createNew": "Crea Nuovo",

View file

@ -24,7 +24,8 @@
"no": "いいえ、編集を続ける",
"yesDiscard": "はい、破棄する",
"uploading": "アップロード中...",
"refresh": "更新"
"refresh": "更新",
"unlinking": "リンク解除中..."
},
"sidebar": {
"dashboard": "ダッシュボード",
@ -227,7 +228,8 @@
"productivity": "生産性",
"telegram": "Telegram",
"ai": "AI機能",
"notifications": "通知設定"
"notifications": "通知設定",
"oidc": "OIDC/SSO"
},
"security": "セキュリティ設定",
"changePassword": "パスワード変更",
@ -376,6 +378,16 @@
"area": "新しいエリアを作成",
"tag": "新しいタグを作成"
}
},
"connectedAccounts": {
"title": "接続されたアカウント",
"description": "SSOプロバイダーを使用してサインインするために外部アカウントをリンクします。",
"link": "{{provider}}をリンク",
"unlink": "リンク解除",
"confirmUnlink": "リンク解除を確認",
"linkedOn": "{{date}}にリンク済み",
"cannotUnlinkLast": "最後の認証方法をリンク解除できません。最初にパスワードを設定してください。",
"noPasswordWarning": "パスワードが設定されていません。代替のログイン方法を持つために設定を検討してください。"
}
},
"nextTask": {
@ -513,7 +525,13 @@
"rememberMe": "ログイン状態を保持する",
"loginSuccess": "ログイン成功",
"loginFailed": "ログイン失敗",
"logoutSuccess": "ログアウト成功"
"logoutSuccess": "ログアウト成功",
"or_continue_with_email": "またはメールで続行",
"sign_in_with": "{{provider}}でサインイン",
"oidc": {
"completing_signin": "サインインを完了しています...",
"authenticating_with_provider": "プロバイダーで認証中です。お待ちください..."
}
},
"dropdown": {
"createNew": "新規作成",

View file

@ -24,7 +24,8 @@
"no": "아니요, 편집 계속하기",
"yesDiscard": "네, 버리기",
"uploading": "업로드 중...",
"refresh": "새로 고침"
"refresh": "새로 고침",
"unlinking": "연결 해제 중..."
},
"sidebar": {
"dashboard": "대시보드",
@ -313,7 +314,8 @@
"productivity": "생산성",
"telegram": "텔레그램",
"ai": "AI 기능",
"notifications": "알림 설정"
"notifications": "알림 설정",
"oidc": "OIDC/SSO"
},
"security": "보안 설정",
"changePassword": "비밀번호 변경",
@ -376,6 +378,16 @@
"area": "새로운 영역 만들기",
"tag": "새로운 태그 만들기"
}
},
"connectedAccounts": {
"title": "연결된 계정",
"description": "SSO 제공자를 통해 로그인하기 위해 외부 계정을 연결하세요.",
"link": "{{provider}} 연결",
"unlink": "연결 해제",
"confirmUnlink": "연결 해제 확인",
"linkedOn": "{{date}}에 연결됨",
"cannotUnlinkLast": "마지막 인증 방법을 연결 해제할 수 없습니다. 먼저 비밀번호를 설정하세요.",
"noPasswordWarning": "설정된 비밀번호가 없습니다. 대체 로그인 방법을 위해 비밀번호 설정을 고려하세요."
}
},
"productivity": {
@ -531,7 +543,13 @@
"rememberMe": "로그인 상태 유지",
"loginSuccess": "로그인 성공",
"loginFailed": "로그인 실패",
"logoutSuccess": "로그아웃 성공"
"logoutSuccess": "로그아웃 성공",
"or_continue_with_email": "또는 이메일로 계속하기",
"sign_in_with": "{{provider}}로 로그인",
"oidc": {
"completing_signin": "로그인 완료 중...",
"authenticating_with_provider": "제공자와 인증 중입니다. 잠시 기다려 주세요..."
}
},
"dropdown": {
"createNew": "새로 만들기",

View file

@ -24,7 +24,8 @@
"no": "Nee, blijf bewerken",
"yesDiscard": "Ja, negeren",
"uploading": "Uploaden...",
"refresh": "Vernieuwen"
"refresh": "Vernieuwen",
"unlinking": "Ontkoppelen..."
},
"sidebar": {
"dashboard": "Dashboard",
@ -313,7 +314,8 @@
"productivity": "Productiviteit",
"telegram": "Telegram",
"ai": "AI-functies",
"notifications": "Meldingsvoorkeuren"
"notifications": "Meldingsvoorkeuren",
"oidc": "OIDC/SSO"
},
"security": "Beveiligingsinstellingen",
"changePassword": "Wachtwoord wijzigen",
@ -376,6 +378,16 @@
"area": "Maak nieuw Gebied aan",
"tag": "Maak nieuwe Tag aan"
}
},
"connectedAccounts": {
"title": "Verbonden Accounts",
"description": "Koppel externe accounts om in te loggen met SSO-providers.",
"link": "Koppel {{provider}}",
"unlink": "Ontkoppel",
"confirmUnlink": "Bevestig Ontkoppeling",
"linkedOn": "Gekoppeld op {{date}}",
"cannotUnlinkLast": "Kan uw laatste authenticatiemethode niet ontkoppelen. Stel eerst een wachtwoord in.",
"noPasswordWarning": "U heeft geen wachtwoord ingesteld. Overweeg er een in te stellen voor een alternatieve inlogmethode."
}
},
"productivity": {
@ -531,7 +543,13 @@
"rememberMe": "Onthoud Mij",
"loginSuccess": "Inloggen Succesvol",
"loginFailed": "Inloggen Mislukt",
"logoutSuccess": "Uitloggen Succesvol"
"logoutSuccess": "Uitloggen Succesvol",
"or_continue_with_email": "Of ga verder met e-mail",
"sign_in_with": "Inloggen met {{provider}}",
"oidc": {
"completing_signin": "Inloggen voltooien...",
"authenticating_with_provider": "Authenticeren met provider. Even geduld..."
}
},
"dropdown": {
"createNew": "Nieuw Aanmaken",

View file

@ -24,7 +24,8 @@
"no": "Nei, fortsett å redigere",
"yesDiscard": "Ja, forkast",
"uploading": "Laster opp...",
"refresh": "Oppdater"
"refresh": "Oppdater",
"unlinking": "Fjerner kobling..."
},
"sidebar": {
"dashboard": "Dashbord",
@ -320,7 +321,8 @@
"productivity": "Produktivitet",
"telegram": "Telegram",
"ai": "AI-funksjoner",
"notifications": "Varslingsinnstillinger"
"notifications": "Varslingsinnstillinger",
"oidc": "OIDC/SSO"
},
"security": "Sikkerhetsinnstillinger",
"changePassword": "Endre passord",
@ -376,6 +378,16 @@
"area": "Opprett nytt område",
"tag": "Opprett ny etikett"
}
},
"connectedAccounts": {
"title": "Koblede kontoer",
"description": "Koble eksterne kontoer for å logge inn med SSO-leverandører.",
"link": "Koble {{provider}}",
"unlink": "Fjern kobling",
"confirmUnlink": "Bekreft fjerning av kobling",
"linkedOn": "Koblet den {{date}}",
"cannotUnlinkLast": "Kan ikke fjerne koblingen til din siste autentiseringsmetode. Vennligst sett et passord først.",
"noPasswordWarning": "Du har ikke satt et passord. Vurder å sette et for å ha en alternativ påloggingsmetode."
}
},
"productivity": {
@ -531,7 +543,13 @@
"rememberMe": "Husk meg",
"loginSuccess": "Innlogging vellykket",
"loginFailed": "Innlogging mislyktes",
"logoutSuccess": "Utlogging vellykket"
"logoutSuccess": "Utlogging vellykket",
"or_continue_with_email": "Eller fortsett med e-post",
"sign_in_with": "Logg inn med {{provider}}",
"oidc": {
"completing_signin": "Fullfører pålogging...",
"authenticating_with_provider": "Autentiserer med leverandør. Vennligst vent..."
}
},
"dropdown": {
"createNew": "Opprett ny",

View file

@ -24,7 +24,8 @@
"no": "Nie, kontynuuj edytowanie",
"yesDiscard": "Tak, porzuć",
"uploading": "Przesyłanie...",
"refresh": "Odśwież"
"refresh": "Odśwież",
"unlinking": "Odłączanie..."
},
"sidebar": {
"dashboard": "Panel sterowania",
@ -320,7 +321,8 @@
"productivity": "Produktywność",
"telegram": "Telegram",
"ai": "Funkcje AI",
"notifications": "Preferencje powiadomień"
"notifications": "Preferencje powiadomień",
"oidc": "OIDC/SSO"
},
"security": "Ustawienia Bezpieczeństwa",
"changePassword": "Zmień Hasło",
@ -376,6 +378,16 @@
"area": "Utwórz nowy Obszar",
"tag": "Utwórz nową Etykietę"
}
},
"connectedAccounts": {
"title": "Połączone konta",
"description": "Połącz konta zewnętrzne, aby zalogować się za pomocą dostawców SSO.",
"link": "Połącz {{provider}}",
"unlink": "Odłącz",
"confirmUnlink": "Potwierdź odłączenie",
"linkedOn": "Połączono {{date}}",
"cannotUnlinkLast": "Nie można odłączyć ostatniej metody uwierzytelniania. Najpierw ustaw hasło.",
"noPasswordWarning": "Nie masz ustawionego hasła. Rozważ ustawienie go, aby mieć alternatywną metodę logowania."
}
},
"productivity": {
@ -531,7 +543,13 @@
"rememberMe": "Zapamiętaj Mnie",
"loginSuccess": "Logowanie Udane",
"loginFailed": "Logowanie Nieudane",
"logoutSuccess": "Wylogowanie Udane"
"logoutSuccess": "Wylogowanie Udane",
"or_continue_with_email": "Lub kontynuuj z e-mailem",
"sign_in_with": "Zaloguj się za pomocą {{provider}}",
"oidc": {
"completing_signin": "Kończenie logowania...",
"authenticating_with_provider": "Uwierzytelnianie z dostawcą. Proszę czekać..."
}
},
"dropdown": {
"createNew": "Utwórz Nowy",

View file

@ -24,7 +24,8 @@
"no": "Não, continuar editando",
"yesDiscard": "Sim, descartar",
"uploading": "Carregando...",
"refresh": "Atualizar"
"refresh": "Atualizar",
"unlinking": "Desvinculando..."
},
"sidebar": {
"dashboard": "Painel",
@ -313,7 +314,8 @@
"productivity": "Produtividade",
"telegram": "Telegram",
"ai": "Recursos de IA",
"notifications": "Preferências de Notificação"
"notifications": "Preferências de Notificação",
"oidc": "OIDC/SSO"
},
"security": "Configurações de Segurança",
"changePassword": "Alterar Senha",
@ -376,6 +378,16 @@
"area": "Criar nova Área",
"tag": "Criar nova Tag"
}
},
"connectedAccounts": {
"title": "Contas Conectadas",
"description": "Vincule contas externas para fazer login com provedores SSO.",
"link": "Vincular {{provider}}",
"unlink": "Desvincular",
"confirmUnlink": "Confirmar Desvinculação",
"linkedOn": "Vinculado em {{date}}",
"cannotUnlinkLast": "Não é possível desvincular seu último método de autenticação. Por favor, defina uma senha primeiro.",
"noPasswordWarning": "Você não tem uma senha definida. Considere definir uma para ter um método de login alternativo."
}
},
"productivity": {
@ -531,7 +543,13 @@
"rememberMe": "Lembrar-me",
"loginSuccess": "Login Bem-sucedido",
"loginFailed": "Login Falhou",
"logoutSuccess": "Logout Bem-sucedido"
"logoutSuccess": "Logout Bem-sucedido",
"or_continue_with_email": "Ou continue com e-mail",
"sign_in_with": "Fazer login com {{provider}}",
"oidc": {
"completing_signin": "Concluindo login...",
"authenticating_with_provider": "Autenticando com o provedor. Por favor, aguarde..."
}
},
"dropdown": {
"createNew": "Criar Novo",

View file

@ -24,7 +24,8 @@
"no": "Nu, continuă editarea",
"yesDiscard": "Da, renunță",
"uploading": "Se încarcă...",
"refresh": "Reîmprospătare"
"refresh": "Reîmprospătare",
"unlinking": "Dezlegare..."
},
"sidebar": {
"dashboard": "Tabloul de bord",
@ -313,7 +314,8 @@
"productivity": "Productivitate",
"telegram": "Telegram",
"ai": "Funcții AI",
"notifications": "Preferințe de Notificare"
"notifications": "Preferințe de Notificare",
"oidc": "OIDC/SSO"
},
"security": "Setări de Securitate",
"changePassword": "Schimbă Parola",
@ -376,6 +378,16 @@
"area": "Creează o nouă zonă",
"tag": "Creează un nou etichetă"
}
},
"connectedAccounts": {
"title": "Conturi Conectate",
"description": "Leagă conturi externe pentru a te conecta cu furnizorii SSO.",
"link": "Leagă {{provider}}",
"unlink": "Dezleagă",
"confirmUnlink": "Confirmă Dezlegarea",
"linkedOn": "Legat pe {{date}}",
"cannotUnlinkLast": "Nu poți dezlega ultima metodă de autentificare. Te rugăm să setezi mai întâi o parolă.",
"noPasswordWarning": "Nu ai setată nicio parolă. Ia în considerare setarea uneia pentru a avea o metodă alternativă de conectare."
}
},
"productivity": {
@ -531,7 +543,13 @@
"rememberMe": "Ține-mă minte",
"loginSuccess": "Autentificare reușită",
"loginFailed": "Autentificare eșuată",
"logoutSuccess": "Deconectare reușită"
"logoutSuccess": "Deconectare reușită",
"or_continue_with_email": "Sau continuă cu email",
"sign_in_with": "Conectează-te cu {{provider}}",
"oidc": {
"completing_signin": "Finalizând conectarea...",
"authenticating_with_provider": "Autentificare cu furnizorul. Te rugăm să aștepți..."
}
},
"dropdown": {
"createNew": "Creează Nou",

View file

@ -24,7 +24,8 @@
"no": "Нет, продолжить редактирование",
"yesDiscard": "Да, отменить",
"uploading": "Загрузка...",
"refresh": "Обновить"
"refresh": "Обновить",
"unlinking": "Отвязываем..."
},
"sidebar": {
"dashboard": "Панель управления",
@ -313,7 +314,8 @@
"productivity": "Продуктивность",
"telegram": "Телеграм",
"ai": "Функции ИИ",
"notifications": "Настройки уведомлений"
"notifications": "Настройки уведомлений",
"oidc": "OIDC/SSO"
},
"security": "Настройки безопасности",
"changePassword": "Сменить пароль",
@ -376,6 +378,16 @@
"area": "Создать новую Область",
"tag": "Создать новый Тег"
}
},
"connectedAccounts": {
"title": "Подключенные аккаунты",
"description": "Свяжите внешние аккаунты для входа через SSO провайдеров.",
"link": "Связать {{provider}}",
"unlink": "Отвязать",
"confirmUnlink": "Подтвердить отвязку",
"linkedOn": "Связано {{date}}",
"cannotUnlinkLast": "Невозможно отвязать ваш последний метод аутентификации. Пожалуйста, сначала установите пароль.",
"noPasswordWarning": "У вас не установлен пароль. Рассмотрите возможность его установки для альтернативного метода входа."
}
},
"productivity": {
@ -531,7 +543,13 @@
"rememberMe": "Запомнить меня",
"loginSuccess": "Вход выполнен успешно",
"loginFailed": "Ошибка входа",
"logoutSuccess": "Выход выполнен успешно"
"logoutSuccess": "Выход выполнен успешно",
"or_continue_with_email": "Или продолжите с электронной почтой",
"sign_in_with": "Войти с помощью {{provider}}",
"oidc": {
"completing_signin": "Завершение входа...",
"authenticating_with_provider": "Аутентификация с провайдером. Пожалуйста, подождите..."
}
},
"dropdown": {
"createNew": "Создать новый",

View file

@ -24,7 +24,8 @@
"no": "Ne, nadaljuj z urejanjem",
"yesDiscard": "Da, zavrzi",
"uploading": "Nalagam...",
"refresh": "Osveži"
"refresh": "Osveži",
"unlinking": "Odvezovanje..."
},
"sidebar": {
"dashboard": "Nadzorna plošča",
@ -320,7 +321,8 @@
"productivity": "Produktivnost",
"telegram": "Telegram",
"ai": "AI Funkcije",
"notifications": "Nastavitve obvestil"
"notifications": "Nastavitve obvestil",
"oidc": "OIDC/SSO"
},
"security": "Nastavitve varnosti",
"changePassword": "Spremeni geslo",
@ -376,6 +378,16 @@
"area": "Ustvari novo področje",
"tag": "Ustvari novo oznako"
}
},
"connectedAccounts": {
"title": "Povezani računi",
"description": "Povežite zunanje račune za prijavo z SSO ponudniki.",
"link": "Poveži {{provider}}",
"unlink": "Odveži",
"confirmUnlink": "Potrdi odvezovanje",
"linkedOn": "Povezano dne {{date}}",
"cannotUnlinkLast": "Ne morete odvezati vaše zadnje metode avtentikacije. Najprej nastavite geslo.",
"noPasswordWarning": "Nimate nastavljenega gesla. Razmislite o nastavitvi, da boste imeli alternativno metodo prijave."
}
},
"productivity": {
@ -531,7 +543,13 @@
"rememberMe": "Zapomni si me",
"loginSuccess": "Prijava uspešna",
"loginFailed": "Prijava neuspešna",
"logoutSuccess": "Odjava uspešna"
"logoutSuccess": "Odjava uspešna",
"or_continue_with_email": "Ali nadaljujte z e-pošto",
"sign_in_with": "Prijavite se z {{provider}}",
"oidc": {
"completing_signin": "Dokončujem prijavo...",
"authenticating_with_provider": "Avtentikacija pri ponudniku. Prosimo, počakajte..."
}
},
"dropdown": {
"createNew": "Ustvari novo",

View file

@ -24,7 +24,8 @@
"no": "Nej, fortsätt redigera",
"yesDiscard": "Ja, kasta bort",
"uploading": "Laddar upp...",
"refresh": "Uppdatera"
"refresh": "Uppdatera",
"unlinking": "Avlänkar..."
},
"sidebar": {
"dashboard": "Dashboard",
@ -320,7 +321,8 @@
"productivity": "Produktivitet",
"telegram": "Telegram",
"ai": "AI-funktioner",
"notifications": "Notifikationsinställningar"
"notifications": "Notifikationsinställningar",
"oidc": "OIDC/SSO"
},
"security": "Säkerhetsinställningar",
"changePassword": "Ändra lösenord",
@ -376,6 +378,16 @@
"area": "Skapa nytt område",
"tag": "Skapa ny tagg"
}
},
"connectedAccounts": {
"title": "Anslutna Konton",
"description": "Länka externa konton för att logga in med SSO-leverantörer.",
"link": "Länka {{provider}}",
"unlink": "Avlänk",
"confirmUnlink": "Bekräfta avlänkning",
"linkedOn": "Länkat den {{date}}",
"cannotUnlinkLast": "Kan inte avlänka din sista autentiseringsmetod. Vänligen ställ in ett lösenord först.",
"noPasswordWarning": "Du har inget lösenord inställt. Överväg att ställa in ett för att ha en alternativ inloggningsmetod."
}
},
"productivity": {
@ -531,7 +543,13 @@
"rememberMe": "Kom ihåg mig",
"loginSuccess": "Inloggning lyckades",
"loginFailed": "Inloggning misslyckades",
"logoutSuccess": "Utloggning lyckades"
"logoutSuccess": "Utloggning lyckades",
"or_continue_with_email": "Eller fortsätt med e-post",
"sign_in_with": "Logga in med {{provider}}",
"oidc": {
"completing_signin": "Avslutar inloggning...",
"authenticating_with_provider": "Autentiserar med leverantör. Vänligen vänta..."
}
},
"dropdown": {
"createNew": "Skapa ny",

View file

@ -24,7 +24,8 @@
"no": "Hayır, düzenlemeye devam et",
"yesDiscard": "Evet, iptal et",
"uploading": "Yükleniyor...",
"refresh": "Yenile"
"refresh": "Yenile",
"unlinking": "Bağlantı kesiliyor..."
},
"sidebar": {
"dashboard": "Gösterge Paneli",
@ -313,7 +314,8 @@
"productivity": "Verimlilik",
"telegram": "Telegram",
"ai": "Yapay Zeka Özellikleri",
"notifications": "Bildirim Tercihleri"
"notifications": "Bildirim Tercihleri",
"oidc": "OIDC/SSO"
},
"security": "Güvenlik Ayarları",
"changePassword": "Şifre Değiştir",
@ -376,6 +378,16 @@
"area": "Yeni Alan oluştur",
"tag": "Yeni Etiket oluştur"
}
},
"connectedAccounts": {
"title": "Bağlı Hesaplar",
"description": "SSO sağlayıcıları ile oturum açmak için harici hesapları bağlayın.",
"link": "Bağla {{provider}}",
"unlink": "Bağlantıyı Kes",
"confirmUnlink": "Bağlantıyı Kesmeyi Onayla",
"linkedOn": "{{date}} tarihinde bağlandı",
"cannotUnlinkLast": "Son kimlik doğrulama yöntemini kaldıramazsınız. Lütfen önce bir şifre belirleyin.",
"noPasswordWarning": "Hiç şifreniz yok. Alternatif bir oturum açma yöntemi için bir şifre belirlemeyi düşünün."
}
},
"productivity": {
@ -531,7 +543,13 @@
"rememberMe": "Beni Hatırla",
"loginSuccess": "Giriş Başarılı",
"loginFailed": "Giriş Başarısız",
"logoutSuccess": ıkış Başarılı"
"logoutSuccess": ıkış Başarılı",
"or_continue_with_email": "Ya da e-posta ile devam et",
"sign_in_with": "{{provider}} ile oturum aç",
"oidc": {
"completing_signin": "Oturum açma işlemi tamamlanıyor...",
"authenticating_with_provider": "Sağlayıcı ile kimlik doğrulama yapılıyor. Lütfen bekleyin..."
}
},
"dropdown": {
"createNew": "Yeni Oluştur",

View file

@ -24,7 +24,8 @@
"no": "Ні, продовжити редагування",
"yesDiscard": "Так, відкинути",
"uploading": "Завантаження...",
"refresh": "Оновити"
"refresh": "Оновити",
"unlinking": "Відв'язування..."
},
"sidebar": {
"dashboard": "Дашборд",
@ -579,7 +580,8 @@
"productivity": "Продуктивність",
"telegram": "Telegram",
"ai": "ШІ Функції",
"notifications": "Налаштування сповіщень"
"notifications": "Налаштування сповіщень",
"oidc": "OIDC/SSO"
},
"security": "Налаштування безпеки",
"changePassword": "Змінити пароль",
@ -705,6 +707,16 @@
"area": "Створити нову Область",
"tag": "Створити новий Тег"
}
},
"connectedAccounts": {
"title": "Підключені акаунти",
"description": "Прив'яжіть зовнішні акаунти для входу через постачальників SSO.",
"link": "Прив'язати {{provider}}",
"unlink": "Відв'язати",
"confirmUnlink": "Підтвердити відв'язування",
"linkedOn": "Прив'язано {{date}}",
"cannotUnlinkLast": "Не можна відв'язати ваш останній метод автентифікації. Спочатку встановіть пароль.",
"noPasswordWarning": "У вас не встановлено пароль. Розгляньте можливість його встановлення для альтернативного методу входу."
}
},
"task": {
@ -921,7 +933,13 @@
"rememberMe": "Запам'ятати мене",
"loginSuccess": "Успішний вхід",
"loginFailed": "Помилка входу",
"logoutSuccess": "Успішний вихід"
"logoutSuccess": "Успішний вихід",
"or_continue_with_email": "Або продовжити з електронною поштою",
"sign_in_with": "Увійти з {{provider}}",
"oidc": {
"completing_signin": "Завершення входу...",
"authenticating_with_provider": "Аутентифікація з постачальником. Будь ласка, зачекайте..."
}
},
"dropdown": {
"createNew": "Створити новий",

View file

@ -24,7 +24,8 @@
"no": "Không, tiếp tục chỉnh sửa",
"yesDiscard": "Có, bỏ qua",
"uploading": "Đang tải lên...",
"refresh": "Làm mới"
"refresh": "Làm mới",
"unlinking": "Ngắt liên kết..."
},
"sidebar": {
"dashboard": "Bảng điều khiển",
@ -313,7 +314,8 @@
"productivity": "Năng suất",
"telegram": "Telegram",
"ai": "Tính năng AI",
"notifications": "Tùy Chọn Thông Báo"
"notifications": "Tùy Chọn Thông Báo",
"oidc": "OIDC/SSO"
},
"security": "Cài đặt bảo mật",
"changePassword": "Đổi mật khẩu",
@ -376,6 +378,16 @@
"area": "Tạo khu vực mới",
"tag": "Tạo thẻ mới"
}
},
"connectedAccounts": {
"title": "Tài khoản đã kết nối",
"description": "Liên kết các tài khoản bên ngoài để đăng nhập với các nhà cung cấp SSO.",
"link": "Liên kết {{provider}}",
"unlink": "Ngắt liên kết",
"confirmUnlink": "Xác nhận ngắt liên kết",
"linkedOn": "Đã liên kết vào {{date}}",
"cannotUnlinkLast": "Không thể ngắt liên kết phương thức xác thực cuối cùng của bạn. Vui lòng đặt mật khẩu trước.",
"noPasswordWarning": "Bạn chưa đặt mật khẩu. Hãy cân nhắc đặt một cái để có phương thức đăng nhập thay thế."
}
},
"productivity": {
@ -531,7 +543,13 @@
"rememberMe": "Ghi nhớ tôi",
"loginSuccess": "Đăng nhập thành công",
"loginFailed": "Đăng nhập thất bại",
"logoutSuccess": "Đăng xuất thành công"
"logoutSuccess": "Đăng xuất thành công",
"or_continue_with_email": "Hoặc tiếp tục với email",
"sign_in_with": "Đăng nhập với {{provider}}",
"oidc": {
"completing_signin": "Đang hoàn tất đăng nhập...",
"authenticating_with_provider": "Đang xác thực với nhà cung cấp. Vui lòng chờ..."
}
},
"dropdown": {
"createNew": "Tạo mới",

View file

@ -24,7 +24,8 @@
"no": "不,继续编辑",
"yesDiscard": "是的,放弃",
"uploading": "上传中...",
"refresh": "刷新"
"refresh": "刷新",
"unlinking": "正在解除链接..."
},
"sidebar": {
"dashboard": "仪表板",
@ -313,7 +314,8 @@
"productivity": "生产力",
"telegram": "电报",
"ai": "人工智能功能",
"notifications": "通知偏好设置"
"notifications": "通知偏好设置",
"oidc": "OIDC/SSO"
},
"security": "安全设置",
"changePassword": "更改密码",
@ -376,6 +378,16 @@
"area": "创建新区域",
"tag": "创建新标签"
}
},
"connectedAccounts": {
"title": "已连接账户",
"description": "链接外部账户以使用SSO提供商登录。",
"link": "链接 {{provider}}",
"unlink": "解除链接",
"confirmUnlink": "确认解除链接",
"linkedOn": "于 {{date}} 连接",
"cannotUnlinkLast": "无法解除您最后的认证方式。请先设置密码。",
"noPasswordWarning": "您尚未设置密码。考虑设置一个以便拥有替代登录方式。"
}
},
"productivity": {
@ -531,7 +543,13 @@
"rememberMe": "记住我",
"loginSuccess": "登录成功",
"loginFailed": "登录失败",
"logoutSuccess": "注销成功"
"logoutSuccess": "注销成功",
"or_continue_with_email": "或继续使用电子邮件",
"sign_in_with": "使用 {{provider}} 登录",
"oidc": {
"completing_signin": "正在完成登录...",
"authenticating_with_provider": "正在与提供商进行身份验证。请稍候..."
}
},
"dropdown": {
"createNew": "创建新项",