diff --git a/ENVIRONMENT.md b/ENVIRONMENT.md index ea2374efbee..47348c2e38b 100644 --- a/ENVIRONMENT.md +++ b/ENVIRONMENT.md @@ -278,8 +278,11 @@ The connection-role migration preserves a sole eligible connection, prefers an u - Signup calls `/api/v1/signup-decide` only for new users, after account resolution and before Stripe customer creation. Existing sign-in and provider linking never consume signup quotas. The call uses `INTERNAL_API_SECRET` and a 3,000 ms budget. - Development skips admission. In other environments, signup requires a usable IP and a validated Bouncer verdict. Missing configuration, timeouts, transport errors, HTTP errors, invalid JSON, and unknown response shapes fail closed with `SIGNUP-UNAVAILABLE`. - An unavailable verdict creates no Stripe customer, user, or auth provider. Web signup shows a retry message. Native token exchange returns HTTP 503 and releases the email-code reservation so the same code can be retried. - - Only a validated enforced `signup_rate_limited` response returns `SIGNUP-RATE-LIMITED`. Cloud accepts at most five merged IP/JA4 flags, including `signup:ja4`, and never exposes internal flags to the user. - - Signup sends `{ operationId, ip, ja4? }`. JA4 comes only from the original request's `x-vercel-ja4-digest` header, not the Cloud-to-Bouncer TLS fingerprint. It is trimmed, lowercased, and bounded to `^[a-z0-9_]{1,128}$`; missing or invalid values are omitted whole, never truncated, and IP admission still runs. `signupOperationId` hashes the existing normalized email with SHA-256 and prefixes the digest with `signup:`. + - A validated enforced `signup_rate_limited` response returns `SIGNUP-RATE-LIMITED`. Cloud accepts at most eight merged IP, domain, and JA4 flags, including `signup:busy`, `signup:domain`, and `signup:ja4`, and never exposes internal flags to the user. + - A validated enforced `signup_step_up` response returns `SIGNUP-STEP-UP` with its `methods` (1 to 8 values of `^[a-z0-9-]{1,32}$`). It creates no Stripe customer, user, or auth provider. Cloud shows only `google` and `apple`, in that order, and ignores other values. Web signup redirects to sign-in with `error=SIGNUP-STEP-UP&methods=` and asks the user to continue with those methods; the copy never names a signal. Native token exchange returns HTTP 403 `{ error: "SIGNUP-STEP-UP", methods }`; the mobile app names the allowed Apple or Google button when that button is on its screen, and otherwise points to its browser sign-in options. + - Signup sends `{ operationId, ip, ja4?, method?, emailDomain? }`. JA4 comes only from the original request's `x-vercel-ja4-digest` header, not the Cloud-to-Bouncer TLS fingerprint. It is trimmed, lowercased, and bounded to `^[a-z0-9_]{1,128}$`; missing or invalid values are omitted whole, never truncated, and IP admission still runs. `signupOperationId` hashes the existing normalized email with SHA-256 and prefixes the digest with `signup:`. + - `method` is the signup's auth provider ID. `emailDomain` is the registrable domain (`tldts` `getDomain`, private suffixes included) of the normalized email's host, or the full host when it has none, so subdomains of one domain share a counter. It is sent for every method; Bouncer counts it only for email signups. Each field is omitted whole when invalid. Without `method`, Bouncer applies its method-less policy, as for an old Cloud build. + - With `enforcement.signupStepUp` on, Bouncer steps up a risky signup instead of rejecting it: it asks for Google or Apple, and admits Apple and WorkOS on a shared IP. Deploy Bouncer with `enforcement.signupStepUp=false` before this Cloud change, measure the shadow `stepUp` audit field, and only then let Igor turn it on. - The identity helper lives in `packages/web-shared/src/lib/bouncer/signup.ts`. Live admission and historical import must use the same helper. - Cloud validates the forwarded first-hop IP. Bouncer canonicalizes addresses and groups IPv6 by /64. - Bouncer defaults to 3 admissions per canonical IP per rolling 30 days. The shorter 24-hour limit is also 3. diff --git a/apps/mobile/src/i18n/locales/af.json b/apps/mobile/src/i18n/locales/af.json index 924f746c488..c680e577d68 100644 --- a/apps/mobile/src/i18n/locales/af.json +++ b/apps/mobile/src/i18n/locales/af.json @@ -3107,6 +3107,9 @@ "ssoError": "Jou organisasie vereis SSO. Gebruik '$t(login.moreSignInOptions)'.", "blocked": "Hierdie rekening is geblokkeer. Kontak asseblief ondersteuning.", "signupRateLimited": "Te veel pogings. Probeer asseblief later weer.", + "signupStepUp": "Gebruik '$t(login.moreSignInOptions)' om jou rekening klaar te skep.", + "signupStepUpApple": "Gebruik '$t(login.signInWithApple)' om jou rekening klaar te skep.", + "signupStepUpGoogle": "Gebruik '$t(login.signInWithGoogle)' om jou rekening klaar te skep.", "invalidCode": "Daardie kode is verkeerd. Probeer asseblief weer.", "codeInProgress": "Jou kode word verwerk. Wag 'n oomblik en probeer weer.", "tooManyAttempts": "Te veel pogings. Vra asseblief 'n nuwe kode aan.", diff --git a/apps/mobile/src/i18n/locales/am.json b/apps/mobile/src/i18n/locales/am.json index c0278a5fcd9..51144b75545 100644 --- a/apps/mobile/src/i18n/locales/am.json +++ b/apps/mobile/src/i18n/locales/am.json @@ -3107,6 +3107,9 @@ "ssoError": "ድርጅትህ SSOን መጠቀም ይጠይቃል። '$t(login.moreSignInOptions)'ን ተጠቀም።", "blocked": "ይህ መለያ ታግዷል። የድጋፍ ቡድኑን አነጋግር።", "signupRateLimited": "በጣም ብዙ ሙከራዎች ተደርገዋል። በኋላ እንደገና ሞክር።", + "signupStepUp": "መለያህን መፍጠር ለመጨረስ '$t(login.moreSignInOptions)'ን ተጠቀም።", + "signupStepUpApple": "መለያህን መፍጠር ለመጨረስ '$t(login.signInWithApple)'ን ተጠቀም።", + "signupStepUpGoogle": "መለያህን መፍጠር ለመጨረስ '$t(login.signInWithGoogle)'ን ተጠቀም።", "invalidCode": "ያ ኮድ ትክክል አይደለም። እንደገና ሞክር።", "codeInProgress": "ኮድህ እየተሠራበት ነው። ትንሽ ጠብቅና እንደገና ሞክር።", "tooManyAttempts": "በጣም ብዙ ሙከራዎች ተደርገዋል። አዲስ ኮድ ጠይቅ።", diff --git a/apps/mobile/src/i18n/locales/ar.json b/apps/mobile/src/i18n/locales/ar.json index ae84161966c..b00aa49d08b 100644 --- a/apps/mobile/src/i18n/locales/ar.json +++ b/apps/mobile/src/i18n/locales/ar.json @@ -3271,6 +3271,9 @@ "ssoError": "تتطلب مؤسستك تسجيل الدخول الموحّد (SSO). استخدم «$t(login.moreSignInOptions)».", "blocked": "تم حظر هذا الحساب. تواصل مع الدعم.", "signupRateLimited": "تجاوزت الحد المسموح للمحاولات. حاول مرة أخرى لاحقًا.", + "signupStepUp": "لإكمال إنشاء حسابك، استخدم \"$t(login.moreSignInOptions)\".", + "signupStepUpApple": "لإكمال إنشاء حسابك، استخدم \"$t(login.signInWithApple)\".", + "signupStepUpGoogle": "لإكمال إنشاء حسابك، استخدم \"$t(login.signInWithGoogle)\".", "invalidCode": "هذا الرمز غير صحيح. حاول مرة أخرى.", "codeInProgress": "جارٍ معالجة رمزك. انتظر قليلًا وحاول مرة أخرى.", "tooManyAttempts": "تجاوزت الحد المسموح للمحاولات. اطلب رمزًا جديدًا.", diff --git a/apps/mobile/src/i18n/locales/az.json b/apps/mobile/src/i18n/locales/az.json index bf3c7ab3970..1acfdf10675 100644 --- a/apps/mobile/src/i18n/locales/az.json +++ b/apps/mobile/src/i18n/locales/az.json @@ -3107,6 +3107,9 @@ "ssoError": "Təşkilatın SSO tələb edir. “$t(login.moreSignInOptions)” seçimini aç.", "blocked": "Bu hesab bloklanıb. Dəstək xidməti ilə əlaqə saxla.", "signupRateLimited": "Həddindən çox cəhd edilib. Bir az sonra yenidən cəhd et.", + "signupStepUp": "Hesabının yaradılmasını tamamlamaq üçün “$t(login.moreSignInOptions)” seçimini aç.", + "signupStepUpApple": "Hesabının yaradılmasını tamamlamaq üçün “$t(login.signInWithApple)” seçimini aç.", + "signupStepUpGoogle": "Hesabının yaradılmasını tamamlamaq üçün “$t(login.signInWithGoogle)” seçimini aç.", "invalidCode": "Bu kod yanlışdır. Yenidən cəhd et.", "codeInProgress": "Kodun emal edilir. Bir az gözlə və yenidən cəhd et.", "tooManyAttempts": "Həddindən çox cəhd edilib. Yeni kod istə.", diff --git a/apps/mobile/src/i18n/locales/be.json b/apps/mobile/src/i18n/locales/be.json index fdb0a719546..e490836a811 100644 --- a/apps/mobile/src/i18n/locales/be.json +++ b/apps/mobile/src/i18n/locales/be.json @@ -3189,6 +3189,9 @@ "ssoError": "Твая арганізацыя патрабуе ўваходу праз SSO. Выберы «$t(login.moreSignInOptions)».", "blocked": "Гэты ўліковы запіс заблакаваны. Звярніся ў службу падтрымкі.", "signupRateLimited": "Занадта шмат спроб. Паспрабуй яшчэ раз пазней.", + "signupStepUp": "Каб завяршыць стварэнне ўліковага запісу, выберы «$t(login.moreSignInOptions)».", + "signupStepUpApple": "Каб завяршыць стварэнне ўліковага запісу, выберы «$t(login.signInWithApple)».", + "signupStepUpGoogle": "Каб завяршыць стварэнне ўліковага запісу, выберы «$t(login.signInWithGoogle)».", "invalidCode": "Гэты код няправільны. Паспрабуй яшчэ раз.", "codeInProgress": "Твой код апрацоўваецца. Крыху пачакай і паспрабуй яшчэ раз.", "tooManyAttempts": "Занадта шмат спроб. Запытай новы код.", diff --git a/apps/mobile/src/i18n/locales/bg.json b/apps/mobile/src/i18n/locales/bg.json index 6f94dcdd87c..8d55fe241a8 100644 --- a/apps/mobile/src/i18n/locales/bg.json +++ b/apps/mobile/src/i18n/locales/bg.json @@ -3107,6 +3107,9 @@ "ssoError": "Организацията ти изисква еднократно вписване (SSO). Използвай „$t(login.moreSignInOptions)“.", "blocked": "Този акаунт е блокиран. Свържи се с поддръжката.", "signupRateLimited": "Твърде много опити. Опитай отново по-късно.", + "signupStepUp": "За да завършиш създаването на акаунта си, използвай „$t(login.moreSignInOptions)“.", + "signupStepUpApple": "За да завършиш създаването на акаунта си, използвай „$t(login.signInWithApple)“.", + "signupStepUpGoogle": "За да завършиш създаването на акаунта си, използвай „$t(login.signInWithGoogle)“.", "invalidCode": "Кодът е неправилен. Опитай отново.", "codeInProgress": "Кодът ти се обработва. Изчакай малко и опитай отново.", "tooManyAttempts": "Твърде много опити. Поискай нов код.", diff --git a/apps/mobile/src/i18n/locales/bn.json b/apps/mobile/src/i18n/locales/bn.json index 77586dfb6c0..fa4603dcfc1 100644 --- a/apps/mobile/src/i18n/locales/bn.json +++ b/apps/mobile/src/i18n/locales/bn.json @@ -3107,6 +3107,9 @@ "ssoError": "আপনার সংস্থায় SSO দিয়ে সাইন-ইন করা বাধ্যতামূলক। '$t(login.moreSignInOptions)' ব্যবহার করুন।", "blocked": "এই অ্যাকাউন্টটি ব্লক করা হয়েছে। সহায়তা দলের সঙ্গে যোগাযোগ করুন।", "signupRateLimited": "অতিরিক্তবার চেষ্টা করা হয়েছে। পরে আবার চেষ্টা করুন।", + "signupStepUp": "আপনার অ্যাকাউন্ট তৈরি সম্পূর্ণ করতে '$t(login.moreSignInOptions)' ব্যবহার করুন।", + "signupStepUpApple": "আপনার অ্যাকাউন্ট তৈরি সম্পূর্ণ করতে '$t(login.signInWithApple)' ব্যবহার করুন।", + "signupStepUpGoogle": "আপনার অ্যাকাউন্ট তৈরি সম্পূর্ণ করতে '$t(login.signInWithGoogle)' ব্যবহার করুন।", "invalidCode": "কোডটি সঠিক নয়। অনুগ্রহ করে আবার চেষ্টা করুন।", "codeInProgress": "আপনার কোডটি যাচাই করা হচ্ছে। একটু অপেক্ষা করে আবার চেষ্টা করুন।", "tooManyAttempts": "অতিরিক্তবার চেষ্টা করা হয়েছে। নতুন কোডের অনুরোধ করুন।", diff --git a/apps/mobile/src/i18n/locales/bs.json b/apps/mobile/src/i18n/locales/bs.json index 29d121c1b25..5b7373bb9ba 100644 --- a/apps/mobile/src/i18n/locales/bs.json +++ b/apps/mobile/src/i18n/locales/bs.json @@ -3148,6 +3148,9 @@ "ssoError": "Tvoja organizacija zahtijeva SSO. Odaberi „$t(login.moreSignInOptions)“.", "blocked": "Ovaj račun je blokiran. Obrati se podršci.", "signupRateLimited": "Previše pokušaja. Pokušaj ponovo kasnije.", + "signupStepUp": "Za dovršetak kreiranja računa odaberi „$t(login.moreSignInOptions)“.", + "signupStepUpApple": "Za dovršetak kreiranja računa odaberi „$t(login.signInWithApple)“.", + "signupStepUpGoogle": "Za dovršetak kreiranja računa odaberi „$t(login.signInWithGoogle)“.", "invalidCode": "Kod nije ispravan. Pokušaj ponovo.", "codeInProgress": "Tvoj kod se obrađuje. Sačekaj trenutak i pokušaj ponovo.", "tooManyAttempts": "Previše pokušaja. Zatraži novi kod.", diff --git a/apps/mobile/src/i18n/locales/ca.json b/apps/mobile/src/i18n/locales/ca.json index 136a11c4b2d..929637aa430 100644 --- a/apps/mobile/src/i18n/locales/ca.json +++ b/apps/mobile/src/i18n/locales/ca.json @@ -3148,6 +3148,9 @@ "ssoError": "La teva organització requereix SSO. Utilitza «$t(login.moreSignInOptions)».", "blocked": "Aquest compte s'ha bloquejat. Contacta amb el servei d'assistència.", "signupRateLimited": "Has fet massa intents. Torna-ho a provar més tard.", + "signupStepUp": "Per acabar de crear el teu compte, utilitza «$t(login.moreSignInOptions)».", + "signupStepUpApple": "Per acabar de crear el teu compte, utilitza «$t(login.signInWithApple)».", + "signupStepUpGoogle": "Per acabar de crear el teu compte, utilitza «$t(login.signInWithGoogle)».", "invalidCode": "Aquest codi és incorrecte. Torna-ho a provar.", "codeInProgress": "S'està processant el teu codi. Espera un moment i torna-ho a provar.", "tooManyAttempts": "Has fet massa intents. Sol·licita un codi nou.", diff --git a/apps/mobile/src/i18n/locales/ckb.json b/apps/mobile/src/i18n/locales/ckb.json index 2e448ad4db0..f83e156ef85 100644 --- a/apps/mobile/src/i18n/locales/ckb.json +++ b/apps/mobile/src/i18n/locales/ckb.json @@ -3107,6 +3107,9 @@ "ssoError": "ڕێکخراوەکەت بەکارهێنانی SSO بە پێویست دەزانێت. «$t(login.moreSignInOptions)» بەکار بهێنە.", "blocked": "ئەم هەژمارە بلۆک کراوە. تکایە پەیوەندی بە پشتیوانی بکە.", "signupRateLimited": "زۆر جار هەوڵت داوە. تکایە دواتر هەوڵ بدەوە.", + "signupStepUp": "بۆ تەواوکردنی دروستکردنی هەژمارەکەت، «$t(login.moreSignInOptions)» بەکار بهێنە.", + "signupStepUpApple": "بۆ تەواوکردنی دروستکردنی هەژمارەکەت، «$t(login.signInWithApple)» بەکار بهێنە.", + "signupStepUpGoogle": "بۆ تەواوکردنی دروستکردنی هەژمارەکەت، «$t(login.signInWithGoogle)» بەکار بهێنە.", "invalidCode": "ئەو کۆدە هەڵەیە. تکایە دووبارە هەوڵ بدەوە.", "codeInProgress": "کۆدەکەت پرۆسێس دەکرێت. کەمێک چاوەڕێ بکە و دووبارە هەوڵ بدەوە.", "tooManyAttempts": "زۆر جار هەوڵت داوە. تکایە داوای کۆدێکی نوێ بکە.", diff --git a/apps/mobile/src/i18n/locales/cs.json b/apps/mobile/src/i18n/locales/cs.json index c63f9fc6cf2..a85460218ad 100644 --- a/apps/mobile/src/i18n/locales/cs.json +++ b/apps/mobile/src/i18n/locales/cs.json @@ -3189,6 +3189,9 @@ "ssoError": "Tvá organizace vyžaduje SSO. Vyber „$t(login.moreSignInOptions)“.", "blocked": "Tento účet je zablokovaný. Obrať se na podporu.", "signupRateLimited": "Proběhlo příliš mnoho pokusů. Zkus to později.", + "signupStepUp": "Pro dokončení vytvoření účtu vyber „$t(login.moreSignInOptions)“.", + "signupStepUpApple": "Pro dokončení vytvoření účtu vyber „$t(login.signInWithApple)“.", + "signupStepUpGoogle": "Pro dokončení vytvoření účtu vyber „$t(login.signInWithGoogle)“.", "invalidCode": "Tento kód není správný. Zkus to znovu.", "codeInProgress": "Tvůj kód se zpracovává. Chvíli počkej a zkus to znovu.", "tooManyAttempts": "Proběhlo příliš mnoho pokusů. Vyžádej si nový kód.", diff --git a/apps/mobile/src/i18n/locales/cy.json b/apps/mobile/src/i18n/locales/cy.json index 4abf3f68ce5..37eb78f2703 100644 --- a/apps/mobile/src/i18n/locales/cy.json +++ b/apps/mobile/src/i18n/locales/cy.json @@ -3271,6 +3271,9 @@ "ssoError": "Mae'ch sefydliad yn mynnu SSO. Defnyddiwch '$t(login.moreSignInOptions)'.", "blocked": "Mae'r cyfrif hwn wedi'i flocio. Cysylltwch â'r tîm cymorth.", "signupRateLimited": "Rydych wedi rhoi cynnig gormod o weithiau. Rhowch gynnig eto yn nes ymlaen.", + "signupStepUp": "I orffen creu'ch cyfrif, defnyddiwch '$t(login.moreSignInOptions)'.", + "signupStepUpApple": "I orffen creu'ch cyfrif, defnyddiwch '$t(login.signInWithApple)'.", + "signupStepUpGoogle": "I orffen creu'ch cyfrif, defnyddiwch '$t(login.signInWithGoogle)'.", "invalidCode": "Mae'r cod hwnnw'n anghywir. Rhowch gynnig eto.", "codeInProgress": "Mae'ch cod yn cael ei brosesu. Arhoswch ychydig a rhowch gynnig eto.", "tooManyAttempts": "Rydych wedi rhoi cynnig gormod o weithiau. Gofynnwch am god newydd.", diff --git a/apps/mobile/src/i18n/locales/da.json b/apps/mobile/src/i18n/locales/da.json index e9076604dbc..353ea1e3558 100644 --- a/apps/mobile/src/i18n/locales/da.json +++ b/apps/mobile/src/i18n/locales/da.json @@ -3107,6 +3107,9 @@ "ssoError": "Din organisation kræver SSO. Brug '$t(login.moreSignInOptions)'.", "blocked": "Denne konto er blokeret. Kontakt support.", "signupRateLimited": "For mange forsøg. Prøv igen senere.", + "signupStepUp": "Brug '$t(login.moreSignInOptions)' for at færdiggøre oprettelsen af din konto.", + "signupStepUpApple": "Brug '$t(login.signInWithApple)' for at færdiggøre oprettelsen af din konto.", + "signupStepUpGoogle": "Brug '$t(login.signInWithGoogle)' for at færdiggøre oprettelsen af din konto.", "invalidCode": "Koden er forkert. Prøv igen.", "codeInProgress": "Din kode behandles. Vent et øjeblik, og prøv igen.", "tooManyAttempts": "For mange forsøg. Bed om en ny kode.", diff --git a/apps/mobile/src/i18n/locales/de.json b/apps/mobile/src/i18n/locales/de.json index b0a4c8b237a..9bbfca9a8c7 100644 --- a/apps/mobile/src/i18n/locales/de.json +++ b/apps/mobile/src/i18n/locales/de.json @@ -3107,6 +3107,9 @@ "ssoError": "Deine Organisation verlangt SSO. Wähle „$t(login.moreSignInOptions)“.", "blocked": "Dieses Konto wurde gesperrt. Bitte wende dich an den Support.", "signupRateLimited": "Du hast zu viele Versuche unternommen. Bitte versuche es später erneut.", + "signupStepUp": "Wähle „$t(login.moreSignInOptions)“, um die Erstellung deines Kontos abzuschließen.", + "signupStepUpApple": "Wähle „$t(login.signInWithApple)“, um die Erstellung deines Kontos abzuschließen.", + "signupStepUpGoogle": "Wähle „$t(login.signInWithGoogle)“, um die Erstellung deines Kontos abzuschließen.", "invalidCode": "Dieser Code ist falsch. Bitte versuche es erneut.", "codeInProgress": "Dein Code wird verarbeitet. Warte einen Moment und versuche es erneut.", "tooManyAttempts": "Du hast zu viele Versuche unternommen. Bitte fordere einen neuen Code an.", diff --git a/apps/mobile/src/i18n/locales/el.json b/apps/mobile/src/i18n/locales/el.json index 28d86d4e549..8a1c643fc39 100644 --- a/apps/mobile/src/i18n/locales/el.json +++ b/apps/mobile/src/i18n/locales/el.json @@ -3107,6 +3107,9 @@ "ssoError": "Ο οργανισμός σου απαιτεί ενιαία σύνδεση (SSO). Επίλεξε «$t(login.moreSignInOptions)».", "blocked": "Αυτός ο λογαριασμός έχει αποκλειστεί. Επικοινώνησε με την υποστήριξη.", "signupRateLimited": "Έγιναν πάρα πολλές προσπάθειες. Δοκίμασε ξανά αργότερα.", + "signupStepUp": "Για να ολοκληρώσεις τη δημιουργία του λογαριασμού σου, επίλεξε «$t(login.moreSignInOptions)».", + "signupStepUpApple": "Για να ολοκληρώσεις τη δημιουργία του λογαριασμού σου, επίλεξε «$t(login.signInWithApple)».", + "signupStepUpGoogle": "Για να ολοκληρώσεις τη δημιουργία του λογαριασμού σου, επίλεξε «$t(login.signInWithGoogle)».", "invalidCode": "Ο κωδικός είναι λανθασμένος. Δοκίμασε ξανά.", "codeInProgress": "Γίνεται επεξεργασία του κωδικού σου. Περίμενε λίγο και δοκίμασε ξανά.", "tooManyAttempts": "Έγιναν πάρα πολλές προσπάθειες. Ζήτησε νέο κωδικό.", diff --git a/apps/mobile/src/i18n/locales/en.json b/apps/mobile/src/i18n/locales/en.json index d0a9ed2c193..d487bf64d84 100644 --- a/apps/mobile/src/i18n/locales/en.json +++ b/apps/mobile/src/i18n/locales/en.json @@ -3120,6 +3120,9 @@ "ssoError": "Your organization requires SSO. Use '$t(login.moreSignInOptions)'.", "blocked": "This account has been blocked. Please contact support.", "signupRateLimited": "Too many attempts. Please try again later.", + "signupStepUp": "To finish creating your account, use '$t(login.moreSignInOptions)'.", + "signupStepUpApple": "To finish creating your account, use '$t(login.signInWithApple)'.", + "signupStepUpGoogle": "To finish creating your account, use '$t(login.signInWithGoogle)'.", "invalidCode": "That code is incorrect. Please try again.", "codeInProgress": "Your code is being processed. Wait a moment and try again.", "tooManyAttempts": "Too many attempts. Please request a new code.", diff --git a/apps/mobile/src/i18n/locales/es.json b/apps/mobile/src/i18n/locales/es.json index 415e6fd4bbb..6b24dd08788 100644 --- a/apps/mobile/src/i18n/locales/es.json +++ b/apps/mobile/src/i18n/locales/es.json @@ -3148,6 +3148,9 @@ "ssoError": "Tu organización exige el inicio de sesión único (SSO). Usa «$t(login.moreSignInOptions)».", "blocked": "Esta cuenta está bloqueada. Contacta con el equipo de asistencia.", "signupRateLimited": "Demasiados intentos. Inténtalo de nuevo más tarde.", + "signupStepUp": "Para terminar de crear tu cuenta, usa «$t(login.moreSignInOptions)».", + "signupStepUpApple": "Para terminar de crear tu cuenta, usa «$t(login.signInWithApple)».", + "signupStepUpGoogle": "Para terminar de crear tu cuenta, usa «$t(login.signInWithGoogle)».", "invalidCode": "Ese código es incorrecto. Inténtalo de nuevo.", "codeInProgress": "Tu código se está procesando. Espera un momento e inténtalo de nuevo.", "tooManyAttempts": "Demasiados intentos. Solicita un código nuevo.", diff --git a/apps/mobile/src/i18n/locales/et.json b/apps/mobile/src/i18n/locales/et.json index 7c7138bf48c..199a8dfdca8 100644 --- a/apps/mobile/src/i18n/locales/et.json +++ b/apps/mobile/src/i18n/locales/et.json @@ -3107,6 +3107,9 @@ "ssoError": "Sinu organisatsioon nõuab SSO-d. Kasuta valikut „$t(login.moreSignInOptions)“.", "blocked": "See konto on blokeeritud. Võta ühendust toega.", "signupRateLimited": "Liiga palju katseid. Proovi hiljem uuesti.", + "signupStepUp": "Konto loomise lõpetamiseks kasuta valikut „$t(login.moreSignInOptions)“.", + "signupStepUpApple": "Konto loomise lõpetamiseks kasuta valikut „$t(login.signInWithApple)“.", + "signupStepUpGoogle": "Konto loomise lõpetamiseks kasuta valikut „$t(login.signInWithGoogle)“.", "invalidCode": "See kood on vale. Proovi uuesti.", "codeInProgress": "Sinu koodi töödeldakse. Oota hetk ja proovi uuesti.", "tooManyAttempts": "Liiga palju katseid. Küsi uus kood.", diff --git a/apps/mobile/src/i18n/locales/eu.json b/apps/mobile/src/i18n/locales/eu.json index aeecb3a0e88..603b58a88e9 100644 --- a/apps/mobile/src/i18n/locales/eu.json +++ b/apps/mobile/src/i18n/locales/eu.json @@ -3107,6 +3107,9 @@ "ssoError": "Zure erakundeak SSO eskatzen du. Erabili '$t(login.moreSignInOptions)'.", "blocked": "Kontu hau blokeatu da. Jarri harremanetan laguntza-taldearekin.", "signupRateLimited": "Saiakera gehiegi. Saiatu berriro geroago.", + "signupStepUp": "Kontua sortzen amaitzeko, erabili '$t(login.moreSignInOptions)'.", + "signupStepUpApple": "Kontua sortzen amaitzeko, erabili '$t(login.signInWithApple)'.", + "signupStepUpGoogle": "Kontua sortzen amaitzeko, erabili '$t(login.signInWithGoogle)'.", "invalidCode": "Kode hori okerra da. Saiatu berriro.", "codeInProgress": "Zure kodea prozesatzen ari da. Itxaron une bat eta saiatu berriro.", "tooManyAttempts": "Saiakera gehiegi. Eskatu kode berri bat.", diff --git a/apps/mobile/src/i18n/locales/fa.json b/apps/mobile/src/i18n/locales/fa.json index 885ec3d110f..4a28473e380 100644 --- a/apps/mobile/src/i18n/locales/fa.json +++ b/apps/mobile/src/i18n/locales/fa.json @@ -3107,6 +3107,9 @@ "ssoError": "سازمان شما استفاده از ورود یکپارچه (SSO) را الزامی کرده است. از «$t(login.moreSignInOptions)» استفاده کنید.", "blocked": "این حساب مسدود شده است. لطفاً با پشتیبانی تماس بگیرید.", "signupRateLimited": "تعداد تلاش‌ها بیش از حد مجاز است. لطفاً بعداً دوباره تلاش کنید.", + "signupStepUp": "برای تکمیل ساخت حساب خود، از «$t(login.moreSignInOptions)» استفاده کنید.", + "signupStepUpApple": "برای تکمیل ساخت حساب خود، از «$t(login.signInWithApple)» استفاده کنید.", + "signupStepUpGoogle": "برای تکمیل ساخت حساب خود، از «$t(login.signInWithGoogle)» استفاده کنید.", "invalidCode": "کد واردشده نادرست است. لطفاً دوباره تلاش کنید.", "codeInProgress": "کد شما در حال پردازش است. کمی صبر کنید و دوباره تلاش کنید.", "tooManyAttempts": "تعداد تلاش‌ها بیش از حد مجاز است. لطفاً کد جدیدی درخواست کنید.", diff --git a/apps/mobile/src/i18n/locales/fi.json b/apps/mobile/src/i18n/locales/fi.json index 5c498945167..17823ae033d 100644 --- a/apps/mobile/src/i18n/locales/fi.json +++ b/apps/mobile/src/i18n/locales/fi.json @@ -3107,6 +3107,9 @@ "ssoError": "Organisaatiosi edellyttää kertakirjautumista (SSO). Valitse ”$t(login.moreSignInOptions)”.", "blocked": "Tämä tili on estetty. Ota yhteyttä tukeen.", "signupRateLimited": "Liian monta yritystä. Yritä myöhemmin uudelleen.", + "signupStepUp": "Viimeistele tilin luominen valitsemalla ”$t(login.moreSignInOptions)”.", + "signupStepUpApple": "Viimeistele tilin luominen valitsemalla ”$t(login.signInWithApple)”.", + "signupStepUpGoogle": "Viimeistele tilin luominen valitsemalla ”$t(login.signInWithGoogle)”.", "invalidCode": "Koodi on virheellinen. Yritä uudelleen.", "codeInProgress": "Koodiasi käsitellään. Odota hetki ja yritä uudelleen.", "tooManyAttempts": "Liian monta yritystä. Pyydä uusi koodi.", diff --git a/apps/mobile/src/i18n/locales/fil.json b/apps/mobile/src/i18n/locales/fil.json index 6387a655c13..55c2de36279 100644 --- a/apps/mobile/src/i18n/locales/fil.json +++ b/apps/mobile/src/i18n/locales/fil.json @@ -3107,6 +3107,9 @@ "ssoError": "Nangangailangan ng SSO ang iyong organisasyon. Gamitin ang '$t(login.moreSignInOptions)'.", "blocked": "Na-block ang account na ito. Makipag-ugnayan sa support team.", "signupRateLimited": "Masyado nang maraming pagsubok. Pakisubukan muli mamaya.", + "signupStepUp": "Para matapos ang paggawa ng iyong account, gamitin ang '$t(login.moreSignInOptions)'.", + "signupStepUpApple": "Para matapos ang paggawa ng iyong account, gamitin ang '$t(login.signInWithApple)'.", + "signupStepUpGoogle": "Para matapos ang paggawa ng iyong account, gamitin ang '$t(login.signInWithGoogle)'.", "invalidCode": "Mali ang code na iyon. Pakisubukan muli.", "codeInProgress": "Pinoproseso ang iyong code. Maghintay ng sandali at subukan muli.", "tooManyAttempts": "Masyado nang maraming pagsubok. Humiling ng bagong code.", diff --git a/apps/mobile/src/i18n/locales/fr.json b/apps/mobile/src/i18n/locales/fr.json index 6c64823d2c6..fd358074f67 100644 --- a/apps/mobile/src/i18n/locales/fr.json +++ b/apps/mobile/src/i18n/locales/fr.json @@ -3148,6 +3148,9 @@ "ssoError": "Votre organisation exige une connexion SSO. Utilisez « $t(login.moreSignInOptions) ».", "blocked": "Ce compte a été bloqué. Veuillez contacter l'assistance.", "signupRateLimited": "Trop de tentatives. Veuillez réessayer plus tard.", + "signupStepUp": "Pour finaliser la création de votre compte, utilisez « $t(login.moreSignInOptions) ».", + "signupStepUpApple": "Pour finaliser la création de votre compte, utilisez « $t(login.signInWithApple) ».", + "signupStepUpGoogle": "Pour finaliser la création de votre compte, utilisez « $t(login.signInWithGoogle) ».", "invalidCode": "Ce code est incorrect. Veuillez réessayer.", "codeInProgress": "Votre code est en cours de traitement. Attendez un instant et réessayez.", "tooManyAttempts": "Trop de tentatives. Veuillez demander un nouveau code.", diff --git a/apps/mobile/src/i18n/locales/ga.json b/apps/mobile/src/i18n/locales/ga.json index 0c38111e2b7..a665cba4e55 100644 --- a/apps/mobile/src/i18n/locales/ga.json +++ b/apps/mobile/src/i18n/locales/ga.json @@ -3230,6 +3230,9 @@ "ssoError": "Éilíonn d'eagraíocht SSO. Úsáid '$t(login.moreSignInOptions)'.", "blocked": "Cuireadh bac ar an gcuntas seo. Déan teagmháil leis an bhfoireann tacaíochta.", "signupRateLimited": "An iomarca iarrachtaí. Bain triail as arís níos déanaí le do thoil.", + "signupStepUp": "Chun cruthú do chuntais a chríochnú, úsáid '$t(login.moreSignInOptions)'.", + "signupStepUpApple": "Chun cruthú do chuntais a chríochnú, úsáid '$t(login.signInWithApple)'.", + "signupStepUpGoogle": "Chun cruthú do chuntais a chríochnú, úsáid '$t(login.signInWithGoogle)'.", "invalidCode": "Tá an cód sin mícheart. Bain triail as arís le do thoil.", "codeInProgress": "Tá do chód á phróiseáil. Fan nóiméad agus bain triail as arís.", "tooManyAttempts": "An iomarca iarrachtaí. Iarr cód nua le do thoil.", diff --git a/apps/mobile/src/i18n/locales/gl.json b/apps/mobile/src/i18n/locales/gl.json index 5420f8c313b..eed92199d7c 100644 --- a/apps/mobile/src/i18n/locales/gl.json +++ b/apps/mobile/src/i18n/locales/gl.json @@ -3107,6 +3107,9 @@ "ssoError": "A túa organización require SSO. Usa \"$t(login.moreSignInOptions)\".", "blocked": "Esta conta bloqueouse. Contacta co servizo de asistencia.", "signupRateLimited": "Demasiados intentos. Téntao de novo máis tarde.", + "signupStepUp": "Para rematar de crear a túa conta, usa \"$t(login.moreSignInOptions)\".", + "signupStepUpApple": "Para rematar de crear a túa conta, usa \"$t(login.signInWithApple)\".", + "signupStepUpGoogle": "Para rematar de crear a túa conta, usa \"$t(login.signInWithGoogle)\".", "invalidCode": "Ese código é incorrecto. Téntao de novo.", "codeInProgress": "O teu código está a procesarse. Agarda un momento e téntao de novo.", "tooManyAttempts": "Demasiados intentos. Solicita un código novo.", diff --git a/apps/mobile/src/i18n/locales/gu.json b/apps/mobile/src/i18n/locales/gu.json index e5953dffb03..68537a6095a 100644 --- a/apps/mobile/src/i18n/locales/gu.json +++ b/apps/mobile/src/i18n/locales/gu.json @@ -3107,6 +3107,9 @@ "ssoError": "તમારી સંસ્થામાં SSO ફરજિયાત છે. '$t(login.moreSignInOptions)' વાપરો.", "blocked": "આ એકાઉન્ટ બ્લોક કરવામાં આવ્યું છે. કૃપા કરીને સપોર્ટનો સંપર્ક કરો.", "signupRateLimited": "ઘણા બધા પ્રયત્નો થયા છે. કૃપા કરીને પછીથી ફરી પ્રયત્ન કરો.", + "signupStepUp": "તમારું એકાઉન્ટ બનાવવાનું પૂર્ણ કરવા માટે '$t(login.moreSignInOptions)' વાપરો.", + "signupStepUpApple": "તમારું એકાઉન્ટ બનાવવાનું પૂર્ણ કરવા માટે '$t(login.signInWithApple)' વાપરો.", + "signupStepUpGoogle": "તમારું એકાઉન્ટ બનાવવાનું પૂર્ણ કરવા માટે '$t(login.signInWithGoogle)' વાપરો.", "invalidCode": "આ કોડ ખોટો છે. કૃપા કરીને ફરી પ્રયત્ન કરો.", "codeInProgress": "તમારા કોડ પર પ્રક્રિયા ચાલી રહી છે. થોડી રાહ જુઓ અને ફરી પ્રયત્ન કરો.", "tooManyAttempts": "ઘણા બધા પ્રયત્નો થયા છે. કૃપા કરીને નવો કોડ માંગો.", diff --git a/apps/mobile/src/i18n/locales/ha.json b/apps/mobile/src/i18n/locales/ha.json index ea6659ac39e..22dcc1ee1d6 100644 --- a/apps/mobile/src/i18n/locales/ha.json +++ b/apps/mobile/src/i18n/locales/ha.json @@ -3107,6 +3107,9 @@ "ssoError": "Ƙungiyarka tana buƙatar SSO. Yi amfani da '$t(login.moreSignInOptions)'.", "blocked": "An toshe wannan asusun. Tuntuɓi masu taimako.", "signupRateLimited": "An yi ƙoƙari da yawa. Sake gwadawa daga baya.", + "signupStepUp": "Don kammala ƙirƙirar asusunka, yi amfani da '$t(login.moreSignInOptions)'.", + "signupStepUpApple": "Don kammala ƙirƙirar asusunka, yi amfani da '$t(login.signInWithApple)'.", + "signupStepUpGoogle": "Don kammala ƙirƙirar asusunka, yi amfani da '$t(login.signInWithGoogle)'.", "invalidCode": "Wannan lambar ba daidai ba ce. Sake gwadawa.", "codeInProgress": "Ana sarrafa lambarka. Jira ɗan lokaci ka sake gwadawa.", "tooManyAttempts": "An yi ƙoƙari da yawa. Nemi sabuwar lamba.", diff --git a/apps/mobile/src/i18n/locales/he.json b/apps/mobile/src/i18n/locales/he.json index 7823917be10..67cc0378945 100644 --- a/apps/mobile/src/i18n/locales/he.json +++ b/apps/mobile/src/i18n/locales/he.json @@ -3148,6 +3148,9 @@ "ssoError": "הארגון שלך דורש התחברות באמצעות SSO. בחר ב-'$t(login.moreSignInOptions)'.", "blocked": "החשבון הזה נחסם. פנה לתמיכה.", "signupRateLimited": "יותר מדי ניסיונות. נסה שוב מאוחר יותר.", + "signupStepUp": "כדי להשלים את יצירת החשבון שלך, בחר ב-'$t(login.moreSignInOptions)'.", + "signupStepUpApple": "כדי להשלים את יצירת החשבון שלך, בחר ב-'$t(login.signInWithApple)'.", + "signupStepUpGoogle": "כדי להשלים את יצירת החשבון שלך, בחר ב-'$t(login.signInWithGoogle)'.", "invalidCode": "הקוד שגוי. נסה שוב.", "codeInProgress": "הקוד שלך נבדק. המתן רגע ונסה שוב.", "tooManyAttempts": "יותר מדי ניסיונות. בקש קוד חדש.", diff --git a/apps/mobile/src/i18n/locales/hi.json b/apps/mobile/src/i18n/locales/hi.json index aeda7c717f0..227e2a4b386 100644 --- a/apps/mobile/src/i18n/locales/hi.json +++ b/apps/mobile/src/i18n/locales/hi.json @@ -3107,6 +3107,9 @@ "ssoError": "आपके संगठन में SSO से साइन इन करना ज़रूरी है। '$t(login.moreSignInOptions)' का उपयोग करें।", "blocked": "यह खाता ब्लॉक कर दिया गया है। कृपया सहायता टीम से संपर्क करें।", "signupRateLimited": "आपने बहुत बार कोशिश की है। कृपया बाद में फिर से कोशिश करें।", + "signupStepUp": "अपना खाता बनाना पूरा करने के लिए '$t(login.moreSignInOptions)' का उपयोग करें।", + "signupStepUpApple": "अपना खाता बनाना पूरा करने के लिए '$t(login.signInWithApple)' का उपयोग करें।", + "signupStepUpGoogle": "अपना खाता बनाना पूरा करने के लिए '$t(login.signInWithGoogle)' का उपयोग करें।", "invalidCode": "यह कोड गलत है। कृपया फिर से कोशिश करें।", "codeInProgress": "आपके कोड पर कार्रवाई जारी है। थोड़ा इंतज़ार करें और फिर से कोशिश करें।", "tooManyAttempts": "आपने बहुत बार कोशिश की है। कृपया नया कोड माँगें।", diff --git a/apps/mobile/src/i18n/locales/hr.json b/apps/mobile/src/i18n/locales/hr.json index 7571fbf9304..badee01882e 100644 --- a/apps/mobile/src/i18n/locales/hr.json +++ b/apps/mobile/src/i18n/locales/hr.json @@ -3148,6 +3148,9 @@ "ssoError": "Tvoja organizacija zahtijeva SSO. Odaberi „$t(login.moreSignInOptions)”.", "blocked": "Ovaj je račun blokiran. Obrati se podršci.", "signupRateLimited": "Previše pokušaja. Pokušaj ponovno kasnije.", + "signupStepUp": "Za dovršetak izrade računa odaberi „$t(login.moreSignInOptions)”.", + "signupStepUpApple": "Za dovršetak izrade računa odaberi „$t(login.signInWithApple)”.", + "signupStepUpGoogle": "Za dovršetak izrade računa odaberi „$t(login.signInWithGoogle)”.", "invalidCode": "Kôd nije točan. Pokušaj ponovno.", "codeInProgress": "Tvoj se kôd obrađuje. Pričekaj trenutak i pokušaj ponovno.", "tooManyAttempts": "Previše pokušaja. Zatraži novi kôd.", diff --git a/apps/mobile/src/i18n/locales/ht.json b/apps/mobile/src/i18n/locales/ht.json index d1ea79028cf..b7bce5ae5ee 100644 --- a/apps/mobile/src/i18n/locales/ht.json +++ b/apps/mobile/src/i18n/locales/ht.json @@ -3107,6 +3107,9 @@ "ssoError": "Òganizasyon ou mande SSO. Itilize '$t(login.moreSignInOptions)'.", "blocked": "Kont sa a bloke. Tanpri kontakte sèvis asistans lan.", "signupRateLimited": "Twòp tantativ. Tanpri eseye ankò pita.", + "signupStepUp": "Pou fini kreye kont ou a, itilize '$t(login.moreSignInOptions)'.", + "signupStepUpApple": "Pou fini kreye kont ou a, itilize '$t(login.signInWithApple)'.", + "signupStepUpGoogle": "Pou fini kreye kont ou a, itilize '$t(login.signInWithGoogle)'.", "invalidCode": "Kòd sa a pa kòrèk. Tanpri eseye ankò.", "codeInProgress": "Kòd ou a ap trete. Tann yon ti moman epi eseye ankò.", "tooManyAttempts": "Twòp tantativ. Tanpri mande yon nouvo kòd.", diff --git a/apps/mobile/src/i18n/locales/hu.json b/apps/mobile/src/i18n/locales/hu.json index 8836782e086..37f4bdc9eaa 100644 --- a/apps/mobile/src/i18n/locales/hu.json +++ b/apps/mobile/src/i18n/locales/hu.json @@ -3107,6 +3107,9 @@ "ssoError": "A szervezeted egyszeri bejelentkezést (SSO) követel meg. Válaszd ezt: „$t(login.moreSignInOptions)”.", "blocked": "Ezt a fiókot letiltották. Vedd fel a kapcsolatot az ügyfélszolgálattal.", "signupRateLimited": "Túl sok próbálkozás történt. Próbáld újra később.", + "signupStepUp": "A fiókod létrehozásának befejezéséhez válaszd ezt: „$t(login.moreSignInOptions)”.", + "signupStepUpApple": "A fiókod létrehozásának befejezéséhez válaszd ezt: „$t(login.signInWithApple)”.", + "signupStepUpGoogle": "A fiókod létrehozásának befejezéséhez válaszd ezt: „$t(login.signInWithGoogle)”.", "invalidCode": "A kód helytelen. Próbáld újra.", "codeInProgress": "A kód feldolgozása folyamatban van. Várj egy pillanatot, majd próbáld újra.", "tooManyAttempts": "Túl sok próbálkozás történt. Kérj új kódot.", diff --git a/apps/mobile/src/i18n/locales/hy.json b/apps/mobile/src/i18n/locales/hy.json index e6bcae1ac0c..5c97ad949f1 100644 --- a/apps/mobile/src/i18n/locales/hy.json +++ b/apps/mobile/src/i18n/locales/hy.json @@ -3107,6 +3107,9 @@ "ssoError": "Քո կազմակերպությունը պահանջում է SSO։ Ընտրիր «$t(login.moreSignInOptions)»։", "blocked": "Այս հաշիվն արգելափակված է։ Դիմիր աջակցության ծառայությանը։", "signupRateLimited": "Չափազանց շատ փորձեր են կատարվել։ Կրկին փորձիր ավելի ուշ։", + "signupStepUp": "Հաշվի ստեղծումն ավարտելու համար ընտրիր «$t(login.moreSignInOptions)»։", + "signupStepUpApple": "Հաշվի ստեղծումն ավարտելու համար ընտրիր «$t(login.signInWithApple)»։", + "signupStepUpGoogle": "Հաշվի ստեղծումն ավարտելու համար ընտրիր «$t(login.signInWithGoogle)»։", "invalidCode": "Կոդը սխալ է։ Կրկին փորձիր։", "codeInProgress": "Կոդդ մշակվում է։ Մի քիչ սպասիր և կրկին փորձիր։", "tooManyAttempts": "Չափազանց շատ փորձեր են կատարվել։ Նոր կոդ խնդրիր։", diff --git a/apps/mobile/src/i18n/locales/id.json b/apps/mobile/src/i18n/locales/id.json index dab05009d51..6c9b22fef4c 100644 --- a/apps/mobile/src/i18n/locales/id.json +++ b/apps/mobile/src/i18n/locales/id.json @@ -3107,6 +3107,9 @@ "ssoError": "Organisasimu mewajibkan SSO. Gunakan '$t(login.moreSignInOptions)'.", "blocked": "Akun ini telah diblokir. Hubungi tim bantuan.", "signupRateLimited": "Terlalu banyak percobaan. Silakan coba lagi nanti.", + "signupStepUp": "Untuk menyelesaikan pembuatan akunmu, gunakan '$t(login.moreSignInOptions)'.", + "signupStepUpApple": "Untuk menyelesaikan pembuatan akunmu, gunakan '$t(login.signInWithApple)'.", + "signupStepUpGoogle": "Untuk menyelesaikan pembuatan akunmu, gunakan '$t(login.signInWithGoogle)'.", "invalidCode": "Kode tersebut salah. Coba lagi.", "codeInProgress": "Kodemu sedang diproses. Tunggu sebentar dan coba lagi.", "tooManyAttempts": "Terlalu banyak percobaan. Silakan minta kode baru.", diff --git a/apps/mobile/src/i18n/locales/ig.json b/apps/mobile/src/i18n/locales/ig.json index 128ea6a228d..5ed69915402 100644 --- a/apps/mobile/src/i18n/locales/ig.json +++ b/apps/mobile/src/i18n/locales/ig.json @@ -3107,6 +3107,9 @@ "ssoError": "Òtù gị chọrọ SSO. Jiri '$t(login.moreSignInOptions)'.", "blocked": "Egbochiela akaụntụ a. Biko kpọtụrụ ndị enyemaka.", "signupRateLimited": "Mgbalị karịrị akarị. Biko nwaa ọzọ ma emechaa.", + "signupStepUp": "Iji mechaa imepụta akaụntụ gị, jiri '$t(login.moreSignInOptions)'.", + "signupStepUpApple": "Iji mechaa imepụta akaụntụ gị, jiri '$t(login.signInWithApple)'.", + "signupStepUpGoogle": "Iji mechaa imepụta akaụntụ gị, jiri '$t(login.signInWithGoogle)'.", "invalidCode": "Koodu ahụ ezighi ezi. Biko nwaa ọzọ.", "codeInProgress": "A na-ahazi koodu gị. Chere nwa oge wee nwaa ọzọ.", "tooManyAttempts": "Mgbalị karịrị akarị. Biko rịọ koodu ọhụrụ.", diff --git a/apps/mobile/src/i18n/locales/is.json b/apps/mobile/src/i18n/locales/is.json index c25542b6b75..000a92a3d53 100644 --- a/apps/mobile/src/i18n/locales/is.json +++ b/apps/mobile/src/i18n/locales/is.json @@ -3107,6 +3107,9 @@ "ssoError": "Fyrirtækið þitt krefst samræmdrar innskráningar (SSO). Veldu „$t(login.moreSignInOptions)“.", "blocked": "Lokað hefur verið á þennan reikning. Hafðu samband við þjónustuver.", "signupRateLimited": "Of margar tilraunir. Reyndu aftur síðar.", + "signupStepUp": "Veldu „$t(login.moreSignInOptions)“ til að ljúka við að stofna reikninginn þinn.", + "signupStepUpApple": "Veldu „$t(login.signInWithApple)“ til að ljúka við að stofna reikninginn þinn.", + "signupStepUpGoogle": "Veldu „$t(login.signInWithGoogle)“ til að ljúka við að stofna reikninginn þinn.", "invalidCode": "Þessi kóði er rangur. Reyndu aftur.", "codeInProgress": "Kóðinn þinn er í vinnslu. Bíddu í smá stund og reyndu aftur.", "tooManyAttempts": "Of margar tilraunir. Biddu um nýjan kóða.", diff --git a/apps/mobile/src/i18n/locales/it.json b/apps/mobile/src/i18n/locales/it.json index 8826a8d4976..c4684c4e839 100644 --- a/apps/mobile/src/i18n/locales/it.json +++ b/apps/mobile/src/i18n/locales/it.json @@ -3148,6 +3148,9 @@ "ssoError": "La tua organizzazione richiede l'accesso tramite SSO. Usa «$t(login.moreSignInOptions)».", "blocked": "Questo account è stato bloccato. Contatta l'assistenza.", "signupRateLimited": "Troppi tentativi. Riprova più tardi.", + "signupStepUp": "Per completare la creazione del tuo account, usa \"$t(login.moreSignInOptions)\".", + "signupStepUpApple": "Per completare la creazione del tuo account, usa \"$t(login.signInWithApple)\".", + "signupStepUpGoogle": "Per completare la creazione del tuo account, usa \"$t(login.signInWithGoogle)\".", "invalidCode": "Il codice non è corretto. Riprova.", "codeInProgress": "Il tuo codice è in fase di elaborazione. Attendi un momento e riprova.", "tooManyAttempts": "Troppi tentativi. Richiedi un nuovo codice.", diff --git a/apps/mobile/src/i18n/locales/ja.json b/apps/mobile/src/i18n/locales/ja.json index 5dcb4d21948..35d55bf2c45 100644 --- a/apps/mobile/src/i18n/locales/ja.json +++ b/apps/mobile/src/i18n/locales/ja.json @@ -3107,6 +3107,9 @@ "ssoError": "所属する組織ではSSOでのサインインが必要です。「$t(login.moreSignInOptions)」を選択してください。", "blocked": "このアカウントはブロックされています。サポートにお問い合わせください。", "signupRateLimited": "試行回数が多すぎます。しばらくしてからもう一度お試しください。", + "signupStepUp": "アカウントの作成を完了するには、「$t(login.moreSignInOptions)」を選択してください。", + "signupStepUpApple": "アカウントの作成を完了するには、「$t(login.signInWithApple)」を選択してください。", + "signupStepUpGoogle": "アカウントの作成を完了するには、「$t(login.signInWithGoogle)」を選択してください。", "invalidCode": "そのコードは正しくありません。もう一度お試しください。", "codeInProgress": "コードを処理中です。しばらく待ってからもう一度お試しください。", "tooManyAttempts": "試行回数が多すぎます。新しいコードをリクエストしてください。", diff --git a/apps/mobile/src/i18n/locales/ka.json b/apps/mobile/src/i18n/locales/ka.json index a7f475975c6..82a970f6881 100644 --- a/apps/mobile/src/i18n/locales/ka.json +++ b/apps/mobile/src/i18n/locales/ka.json @@ -3107,6 +3107,9 @@ "ssoError": "შენი ორგანიზაცია SSO-ს მოითხოვს. გამოიყენე „$t(login.moreSignInOptions)“.", "blocked": "ეს ანგარიში დაბლოკილია. დაუკავშირდი მხარდაჭერის გუნდს.", "signupRateLimited": "მცდელობების რაოდენობა გადაჭარბებულია. მოგვიანებით სცადე.", + "signupStepUp": "ანგარიშის შექმნის დასასრულებლად გამოიყენე „$t(login.moreSignInOptions)“.", + "signupStepUpApple": "ანგარიშის შექმნის დასასრულებლად გამოიყენე „$t(login.signInWithApple)“.", + "signupStepUpGoogle": "ანგარიშის შექმნის დასასრულებლად გამოიყენე „$t(login.signInWithGoogle)“.", "invalidCode": "ეს კოდი არასწორია. ხელახლა სცადე.", "codeInProgress": "შენი კოდი მუშავდება. ცოტა მოიცადე და ხელახლა სცადე.", "tooManyAttempts": "მცდელობების რაოდენობა გადაჭარბებულია. მოითხოვე ახალი კოდი.", diff --git a/apps/mobile/src/i18n/locales/kk.json b/apps/mobile/src/i18n/locales/kk.json index 6077e88f056..43085cc6f6d 100644 --- a/apps/mobile/src/i18n/locales/kk.json +++ b/apps/mobile/src/i18n/locales/kk.json @@ -3107,6 +3107,9 @@ "ssoError": "Ұйымыңыз SSO арқылы кіруді талап етеді. «$t(login.moreSignInOptions)» тармағын таңдаңыз.", "blocked": "Бұл тіркелгі бұғатталған. Қолдау қызметіне хабарласыңыз.", "signupRateLimited": "Тым көп әрекет жасалды. Кейінірек қайталап көріңіз.", + "signupStepUp": "Тіркелгіні жасауды аяқтау үшін «$t(login.moreSignInOptions)» тармағын таңдаңыз.", + "signupStepUpApple": "Тіркелгіні жасауды аяқтау үшін «$t(login.signInWithApple)» тармағын таңдаңыз.", + "signupStepUpGoogle": "Тіркелгіні жасауды аяқтау үшін «$t(login.signInWithGoogle)» тармағын таңдаңыз.", "invalidCode": "Бұл код дұрыс емес. Қайталап көріңіз.", "codeInProgress": "Кодыңыз өңделуде. Сәл күтіп, қайталап көріңіз.", "tooManyAttempts": "Тым көп әрекет жасалды. Жаңа код сұраңыз.", diff --git a/apps/mobile/src/i18n/locales/km.json b/apps/mobile/src/i18n/locales/km.json index d27eda1abf5..f9d8886cc20 100644 --- a/apps/mobile/src/i18n/locales/km.json +++ b/apps/mobile/src/i18n/locales/km.json @@ -3107,6 +3107,9 @@ "ssoError": "អង្គការរបស់អ្នកតម្រូវឱ្យប្រើ SSO។ ប្រើ '$t(login.moreSignInOptions)'។", "blocked": "គណនីនេះត្រូវបានរារាំង។ សូមទាក់ទងផ្នែកគាំទ្រ។", "signupRateLimited": "ការព្យាយាមច្រើនពេកហើយ។ សូមព្យាយាមម្ដងទៀតនៅពេលក្រោយ។", + "signupStepUp": "ដើម្បីបញ្ចប់ការបង្កើតគណនីរបស់អ្នក ប្រើ '$t(login.moreSignInOptions)'។", + "signupStepUpApple": "ដើម្បីបញ្ចប់ការបង្កើតគណនីរបស់អ្នក ប្រើ '$t(login.signInWithApple)'។", + "signupStepUpGoogle": "ដើម្បីបញ្ចប់ការបង្កើតគណនីរបស់អ្នក ប្រើ '$t(login.signInWithGoogle)'។", "invalidCode": "លេខកូដនោះមិនត្រឹមត្រូវទេ។ សូមព្យាយាមម្ដងទៀត។", "codeInProgress": "លេខកូដរបស់អ្នកកំពុងត្រូវបានដំណើរការ។ រង់ចាំមួយភ្លែត ហើយព្យាយាមម្ដងទៀត។", "tooManyAttempts": "ការព្យាយាមច្រើនពេកហើយ។ សូមស្នើសុំលេខកូដថ្មី។", diff --git a/apps/mobile/src/i18n/locales/kn.json b/apps/mobile/src/i18n/locales/kn.json index 371281b887f..2486b9e21e9 100644 --- a/apps/mobile/src/i18n/locales/kn.json +++ b/apps/mobile/src/i18n/locales/kn.json @@ -3107,6 +3107,9 @@ "ssoError": "ನಿಮ್ಮ ಸಂಸ್ಥೆಯಲ್ಲಿ SSO ಬಳಸುವುದು ಕಡ್ಡಾಯ. '$t(login.moreSignInOptions)' ಬಳಸಿ.", "blocked": "ಈ ಖಾತೆಯನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ. ಸಹಾಯ ತಂಡವನ್ನು ಸಂಪರ್ಕಿಸಿ.", "signupRateLimited": "ಅತಿಯಾಗಿ ಪ್ರಯತ್ನಿಸಿದ್ದೀರಿ. ಸ್ವಲ್ಪ ಸಮಯದ ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.", + "signupStepUp": "ನಿಮ್ಮ ಖಾತೆ ರಚನೆಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಲು '$t(login.moreSignInOptions)' ಬಳಸಿ.", + "signupStepUpApple": "ನಿಮ್ಮ ಖಾತೆ ರಚನೆಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಲು '$t(login.signInWithApple)' ಬಳಸಿ.", + "signupStepUpGoogle": "ನಿಮ್ಮ ಖಾತೆ ರಚನೆಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಲು '$t(login.signInWithGoogle)' ಬಳಸಿ.", "invalidCode": "ಆ ಕೋಡ್ ತಪ್ಪಾಗಿದೆ. ದಯವಿಟ್ಟು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.", "codeInProgress": "ನಿಮ್ಮ ಕೋಡ್ ಅನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲಾಗುತ್ತಿದೆ. ಸ್ವಲ್ಪ ಕಾದು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.", "tooManyAttempts": "ಅತಿಯಾಗಿ ಪ್ರಯತ್ನಿಸಿದ್ದೀರಿ. ಹೊಸ ಕೋಡ್‌ಗಾಗಿ ವಿನಂತಿಸಿ.", diff --git a/apps/mobile/src/i18n/locales/ko.json b/apps/mobile/src/i18n/locales/ko.json index d834f1d075e..1fc3cc7d20d 100644 --- a/apps/mobile/src/i18n/locales/ko.json +++ b/apps/mobile/src/i18n/locales/ko.json @@ -3107,6 +3107,9 @@ "ssoError": "소속 조직에서는 SSO 로그인을 사용해야 합니다. '$t(login.moreSignInOptions)' 항목을 선택하세요.", "blocked": "이 계정은 차단되었습니다. 지원팀에 문의하세요.", "signupRateLimited": "시도 횟수가 너무 많습니다. 잠시 후 다시 시도하세요.", + "signupStepUp": "계정 생성을 완료하려면 '$t(login.moreSignInOptions)' 항목을 선택하세요.", + "signupStepUpApple": "계정 생성을 완료하려면 '$t(login.signInWithApple)' 항목을 선택하세요.", + "signupStepUpGoogle": "계정 생성을 완료하려면 '$t(login.signInWithGoogle)' 항목을 선택하세요.", "invalidCode": "코드가 올바르지 않습니다. 다시 시도하세요.", "codeInProgress": "코드를 처리 중입니다. 잠시 기다린 후 다시 시도하세요.", "tooManyAttempts": "시도 횟수가 너무 많습니다. 새 코드를 요청하세요.", diff --git a/apps/mobile/src/i18n/locales/lo.json b/apps/mobile/src/i18n/locales/lo.json index 64fac38d85b..230cce3efc7 100644 --- a/apps/mobile/src/i18n/locales/lo.json +++ b/apps/mobile/src/i18n/locales/lo.json @@ -3107,6 +3107,9 @@ "ssoError": "ອົງກອນຂອງທ່ານກຳນົດໃຫ້ໃຊ້ SSO. ໃຊ້ '$t(login.moreSignInOptions)'.", "blocked": "ບັນຊີນີ້ຖືກລະງັບແລ້ວ. ກະລຸນາຕິດຕໍ່ຝ່າຍຊ່ວຍເຫຼືອ.", "signupRateLimited": "ທ່ານລອງຫຼາຍຄັ້ງເກີນໄປແລ້ວ. ກະລຸນາລອງອີກຄັ້ງພາຍຫຼັງ.", + "signupStepUp": "ໃຊ້ '$t(login.moreSignInOptions)' ເພື່ອສ້າງບັນຊີຂອງທ່ານໃຫ້ສຳເລັດ.", + "signupStepUpApple": "ໃຊ້ '$t(login.signInWithApple)' ເພື່ອສ້າງບັນຊີຂອງທ່ານໃຫ້ສຳເລັດ.", + "signupStepUpGoogle": "ໃຊ້ '$t(login.signInWithGoogle)' ເພື່ອສ້າງບັນຊີຂອງທ່ານໃຫ້ສຳເລັດ.", "invalidCode": "ລະຫັດນັ້ນບໍ່ຖືກຕ້ອງ. ກະລຸນາລອງອີກຄັ້ງ.", "codeInProgress": "ກຳລັງປະມວນຜົນລະຫັດຂອງທ່ານ. ລໍຖ້າຈັກໜ້ອຍແລ້ວລອງອີກຄັ້ງ.", "tooManyAttempts": "ທ່ານລອງຫຼາຍຄັ້ງເກີນໄປແລ້ວ. ກະລຸນາຂໍລະຫັດໃໝ່.", diff --git a/apps/mobile/src/i18n/locales/lt.json b/apps/mobile/src/i18n/locales/lt.json index 617cabfe03b..89415dd669d 100644 --- a/apps/mobile/src/i18n/locales/lt.json +++ b/apps/mobile/src/i18n/locales/lt.json @@ -3189,6 +3189,9 @@ "ssoError": "Tavo organizacija reikalauja prisijungti per SSO. Pasirink „$t(login.moreSignInOptions)“.", "blocked": "Ši paskyra užblokuota. Susisiek su pagalbos komanda.", "signupRateLimited": "Per daug bandymų. Bandyk dar kartą vėliau.", + "signupStepUp": "Kad užbaigtum paskyros kūrimą, pasirink „$t(login.moreSignInOptions)“.", + "signupStepUpApple": "Kad užbaigtum paskyros kūrimą, pasirink „$t(login.signInWithApple)“.", + "signupStepUpGoogle": "Kad užbaigtum paskyros kūrimą, pasirink „$t(login.signInWithGoogle)“.", "invalidCode": "Kodas neteisingas. Bandyk dar kartą.", "codeInProgress": "Tavo kodas apdorojamas. Palauk akimirką ir bandyk dar kartą.", "tooManyAttempts": "Per daug bandymų. Paprašyk naujo kodo.", diff --git a/apps/mobile/src/i18n/locales/lv.json b/apps/mobile/src/i18n/locales/lv.json index 5ca76befe27..678b0c40bad 100644 --- a/apps/mobile/src/i18n/locales/lv.json +++ b/apps/mobile/src/i18n/locales/lv.json @@ -3148,6 +3148,9 @@ "ssoError": "Tava organizācija pieprasa SSO. Izvēlies “$t(login.moreSignInOptions)”.", "blocked": "Šis konts ir bloķēts. Sazinies ar atbalsta dienestu.", "signupRateLimited": "Pārāk daudz mēģinājumu. Mēģini vēlreiz vēlāk.", + "signupStepUp": "Lai pabeigtu konta izveidi, izvēlies “$t(login.moreSignInOptions)”.", + "signupStepUpApple": "Lai pabeigtu konta izveidi, izvēlies “$t(login.signInWithApple)”.", + "signupStepUpGoogle": "Lai pabeigtu konta izveidi, izvēlies “$t(login.signInWithGoogle)”.", "invalidCode": "Kods nav pareizs. Mēģini vēlreiz.", "codeInProgress": "Tavs kods tiek apstrādāts. Uzgaidi mirkli un mēģini vēlreiz.", "tooManyAttempts": "Pārāk daudz mēģinājumu. Pieprasi jaunu kodu.", diff --git a/apps/mobile/src/i18n/locales/mg.json b/apps/mobile/src/i18n/locales/mg.json index 8d22b19ce3a..185ec22aaeb 100644 --- a/apps/mobile/src/i18n/locales/mg.json +++ b/apps/mobile/src/i18n/locales/mg.json @@ -3107,6 +3107,9 @@ "ssoError": "Mitaky SSO ny fikambananao. Ampiasao ny '$t(login.moreSignInOptions)'.", "blocked": "Voasakana ity kaonty ity. Mifandraisa amin'ny ekipa mpanampy azafady.", "signupRateLimited": "Betsaka loatra ny andrana. Andramo indray rehefa afaka kelikely azafady.", + "signupStepUp": "Ampiasao ny '$t(login.moreSignInOptions)' hamitana ny famoronana ny kaontinao.", + "signupStepUpApple": "Ampiasao ny '$t(login.signInWithApple)' hamitana ny famoronana ny kaontinao.", + "signupStepUpGoogle": "Ampiasao ny '$t(login.signInWithGoogle)' hamitana ny famoronana ny kaontinao.", "invalidCode": "Diso io kaody io. Andramo indray azafady.", "codeInProgress": "Mbola karakaraina ny kaodinao. Miandrasa kely ary andramo indray.", "tooManyAttempts": "Betsaka loatra ny andrana. Mangataha kaody vaovao azafady.", diff --git a/apps/mobile/src/i18n/locales/mi.json b/apps/mobile/src/i18n/locales/mi.json index 27cc0ab69a5..4bae1f8553a 100644 --- a/apps/mobile/src/i18n/locales/mi.json +++ b/apps/mobile/src/i18n/locales/mi.json @@ -3107,6 +3107,9 @@ "ssoError": "Me whakamahi i te SSO mō tō whakahaere. Whakamahia '$t(login.moreSignInOptions)'.", "blocked": "Kua āraia tēnei pūkete. Whakapā atu ki te rōpū tautoko.", "signupRateLimited": "He nui rawa ngā whakamātau. Whakamātau anō ā muri ake.", + "signupStepUp": "Hei whakaoti i te hanga o tō pūkete, whakamahia '$t(login.moreSignInOptions)'.", + "signupStepUpApple": "Hei whakaoti i te hanga o tō pūkete, whakamahia '$t(login.signInWithApple)'.", + "signupStepUpGoogle": "Hei whakaoti i te hanga o tō pūkete, whakamahia '$t(login.signInWithGoogle)'.", "invalidCode": "He hē taua waehere. Whakamātau anō.", "codeInProgress": "Kei te tukatukahia tō waehere. Tatari mō tētahi wā poto, ka whakamātau anō.", "tooManyAttempts": "He nui rawa ngā whakamātau. Tonoa he waehere hou.", diff --git a/apps/mobile/src/i18n/locales/mk.json b/apps/mobile/src/i18n/locales/mk.json index 2e9dc4b7c4c..d0d1ac56f01 100644 --- a/apps/mobile/src/i18n/locales/mk.json +++ b/apps/mobile/src/i18n/locales/mk.json @@ -3107,6 +3107,9 @@ "ssoError": "Твојата организација бара SSO. Избери „$t(login.moreSignInOptions)“.", "blocked": "Оваа сметка е блокирана. Контактирај ја поддршката.", "signupRateLimited": "Премногу обиди. Обиди се повторно подоцна.", + "signupStepUp": "За да го завршиш создавањето на сметката, избери „$t(login.moreSignInOptions)“.", + "signupStepUpApple": "За да го завршиш создавањето на сметката, избери „$t(login.signInWithApple)“.", + "signupStepUpGoogle": "За да го завршиш создавањето на сметката, избери „$t(login.signInWithGoogle)“.", "invalidCode": "Кодот е неточен. Обиди се повторно.", "codeInProgress": "Твојот код се обработува. Почекај малку и обиди се повторно.", "tooManyAttempts": "Премногу обиди. Побарај нов код.", diff --git a/apps/mobile/src/i18n/locales/ml.json b/apps/mobile/src/i18n/locales/ml.json index 12a7a67b4f8..76b3b337fd0 100644 --- a/apps/mobile/src/i18n/locales/ml.json +++ b/apps/mobile/src/i18n/locales/ml.json @@ -3107,6 +3107,9 @@ "ssoError": "നിങ്ങളുടെ ഓർഗനൈസേഷന് SSO ആവശ്യമാണ്. '$t(login.moreSignInOptions)' ഉപയോഗിക്കുക.", "blocked": "ഈ അക്കൗണ്ട് ബ്ലോക്ക് ചെയ്തിട്ടുണ്ട്. സഹായസംഘവുമായി ബന്ധപ്പെടുക.", "signupRateLimited": "വളരെയധികം തവണ ശ്രമിച്ചു. പിന്നീട് വീണ്ടും ശ്രമിക്കുക.", + "signupStepUp": "നിങ്ങളുടെ അക്കൗണ്ട് സൃഷ്ടിക്കൽ പൂർത്തിയാക്കാൻ '$t(login.moreSignInOptions)' ഉപയോഗിക്കുക.", + "signupStepUpApple": "നിങ്ങളുടെ അക്കൗണ്ട് സൃഷ്ടിക്കൽ പൂർത്തിയാക്കാൻ '$t(login.signInWithApple)' ഉപയോഗിക്കുക.", + "signupStepUpGoogle": "നിങ്ങളുടെ അക്കൗണ്ട് സൃഷ്ടിക്കൽ പൂർത്തിയാക്കാൻ '$t(login.signInWithGoogle)' ഉപയോഗിക്കുക.", "invalidCode": "കോഡ് തെറ്റാണ്. വീണ്ടും ശ്രമിക്കുക.", "codeInProgress": "നിങ്ങളുടെ കോഡ് പരിശോധിക്കുന്നു. അൽപ്പം കാത്തിരുന്ന് വീണ്ടും ശ്രമിക്കുക.", "tooManyAttempts": "വളരെയധികം തവണ ശ്രമിച്ചു. പുതിയ കോഡ് അഭ്യർത്ഥിക്കുക.", diff --git a/apps/mobile/src/i18n/locales/mn.json b/apps/mobile/src/i18n/locales/mn.json index c2868485385..a34761a09f7 100644 --- a/apps/mobile/src/i18n/locales/mn.json +++ b/apps/mobile/src/i18n/locales/mn.json @@ -3107,6 +3107,9 @@ "ssoError": "Танай байгууллага SSO-оор нэвтрэхийг шаарддаг. '$t(login.moreSignInOptions)' сонголтыг ашиглана уу.", "blocked": "Энэ бүртгэлийг хориглосон. Тусламжийн багтай холбогдоно уу.", "signupRateLimited": "Хэт олон удаа оролдсон байна. Дараа дахин оролдоно уу.", + "signupStepUp": "Бүртгэл үүсгэж дуусгахын тулд '$t(login.moreSignInOptions)' сонголтыг ашиглана уу.", + "signupStepUpApple": "Бүртгэл үүсгэж дуусгахын тулд '$t(login.signInWithApple)' сонголтыг ашиглана уу.", + "signupStepUpGoogle": "Бүртгэл үүсгэж дуусгахын тулд '$t(login.signInWithGoogle)' сонголтыг ашиглана уу.", "invalidCode": "Энэ код буруу байна. Дахин оролдоно уу.", "codeInProgress": "Таны кодыг боловсруулж байна. Хэсэг хүлээгээд дахин оролдоно уу.", "tooManyAttempts": "Хэт олон удаа оролдсон байна. Шинэ код хүснэ үү.", diff --git a/apps/mobile/src/i18n/locales/mr.json b/apps/mobile/src/i18n/locales/mr.json index c86e92872eb..88eed0d6f7b 100644 --- a/apps/mobile/src/i18n/locales/mr.json +++ b/apps/mobile/src/i18n/locales/mr.json @@ -3107,6 +3107,9 @@ "ssoError": "तुमच्या संस्थेत साइन इन करण्यासाठी SSO आवश्यक आहे. '$t(login.moreSignInOptions)' वापरा.", "blocked": "हे खाते ब्लॉक केले आहे. कृपया सहाय्य टीमशी संपर्क साधा.", "signupRateLimited": "खूप वेळा प्रयत्न झाले आहेत. कृपया नंतर पुन्हा प्रयत्न करा.", + "signupStepUp": "तुमचे खाते तयार करणे पूर्ण करण्यासाठी '$t(login.moreSignInOptions)' वापरा.", + "signupStepUpApple": "तुमचे खाते तयार करणे पूर्ण करण्यासाठी '$t(login.signInWithApple)' वापरा.", + "signupStepUpGoogle": "तुमचे खाते तयार करणे पूर्ण करण्यासाठी '$t(login.signInWithGoogle)' वापरा.", "invalidCode": "तो कोड चुकीचा आहे. कृपया पुन्हा प्रयत्न करा.", "codeInProgress": "तुमच्या कोडवर प्रक्रिया सुरू आहे. थोडा वेळ थांबा आणि पुन्हा प्रयत्न करा.", "tooManyAttempts": "खूप वेळा प्रयत्न झाले आहेत. कृपया नवीन कोड मागवा.", diff --git a/apps/mobile/src/i18n/locales/ms.json b/apps/mobile/src/i18n/locales/ms.json index 7f79c04c570..258aef4d0c6 100644 --- a/apps/mobile/src/i18n/locales/ms.json +++ b/apps/mobile/src/i18n/locales/ms.json @@ -3107,6 +3107,9 @@ "ssoError": "Organisasi anda memerlukan SSO. Gunakan '$t(login.moreSignInOptions)'.", "blocked": "Akaun ini telah disekat. Sila hubungi sokongan.", "signupRateLimited": "Terlalu banyak percubaan. Sila cuba lagi kemudian.", + "signupStepUp": "Untuk melengkapkan penciptaan akaun anda, gunakan '$t(login.moreSignInOptions)'.", + "signupStepUpApple": "Untuk melengkapkan penciptaan akaun anda, gunakan '$t(login.signInWithApple)'.", + "signupStepUpGoogle": "Untuk melengkapkan penciptaan akaun anda, gunakan '$t(login.signInWithGoogle)'.", "invalidCode": "Kod itu tidak betul. Sila cuba lagi.", "codeInProgress": "Kod anda sedang diproses. Tunggu seketika dan cuba lagi.", "tooManyAttempts": "Terlalu banyak percubaan. Sila minta kod baharu.", diff --git a/apps/mobile/src/i18n/locales/mt.json b/apps/mobile/src/i18n/locales/mt.json index 77bb84ec95c..ca24fa6b7ce 100644 --- a/apps/mobile/src/i18n/locales/mt.json +++ b/apps/mobile/src/i18n/locales/mt.json @@ -3230,6 +3230,9 @@ "ssoError": "L-organizzazzjoni tiegħek teħtieġ SSO. Uża '$t(login.moreSignInOptions)'.", "blocked": "Dan il-kont ġie bblokkat. Ikkuntattja t-tim tal-appoġġ.", "signupRateLimited": "Wisq tentattivi. Jekk jogħġbok erġa' pprova aktar tard.", + "signupStepUp": "Biex tlesti l-ħolqien tal-kont tiegħek, uża '$t(login.moreSignInOptions)'.", + "signupStepUpApple": "Biex tlesti l-ħolqien tal-kont tiegħek, uża '$t(login.signInWithApple)'.", + "signupStepUpGoogle": "Biex tlesti l-ħolqien tal-kont tiegħek, uża '$t(login.signInWithGoogle)'.", "invalidCode": "Dak il-kodiċi huwa żbaljat. Jekk jogħġbok erġa' pprova.", "codeInProgress": "Il-kodiċi tiegħek qed jiġi pproċessat. Stenna mument u erġa' pprova.", "tooManyAttempts": "Wisq tentattivi. Jekk jogħġbok itlob kodiċi ġdid.", diff --git a/apps/mobile/src/i18n/locales/my.json b/apps/mobile/src/i18n/locales/my.json index 167ccd76508..118712499cb 100644 --- a/apps/mobile/src/i18n/locales/my.json +++ b/apps/mobile/src/i18n/locales/my.json @@ -3107,6 +3107,9 @@ "ssoError": "သင့်အဖွဲ့အစည်းတွင် SSO ဖြင့် အကောင့်ဝင်ရပါမည်။ '$t(login.moreSignInOptions)' ကို သုံးပါ။", "blocked": "ဒီအကောင့်ကို ပိတ်ပင်ထားပါသည်။ အကူအညီပေးရေးအဖွဲ့ကို ဆက်သွယ်ပါ။", "signupRateLimited": "ကြိုးစားသည့်အကြိမ်ရေ များလွန်းပါသည်။ နောက်မှ ထပ်စမ်းကြည့်ပါ။", + "signupStepUp": "သင့်အကောင့်ဖန်တီးခြင်းကို အပြီးသတ်ရန် '$t(login.moreSignInOptions)' ကို သုံးပါ။", + "signupStepUpApple": "သင့်အကောင့်ဖန်တီးခြင်းကို အပြီးသတ်ရန် '$t(login.signInWithApple)' ကို သုံးပါ။", + "signupStepUpGoogle": "သင့်အကောင့်ဖန်တီးခြင်းကို အပြီးသတ်ရန် '$t(login.signInWithGoogle)' ကို သုံးပါ။", "invalidCode": "ဒီကုဒ် မမှန်ပါ။ ထပ်စမ်းကြည့်ပါ။", "codeInProgress": "သင့်ကုဒ်ကို စစ်ဆေးနေပါသည်။ ခဏစောင့်ပြီး ထပ်စမ်းကြည့်ပါ။", "tooManyAttempts": "ကြိုးစားသည့်အကြိမ်ရေ များလွန်းပါသည်။ ကုဒ်အသစ်တစ်ခု တောင်းပါ။", diff --git a/apps/mobile/src/i18n/locales/nb.json b/apps/mobile/src/i18n/locales/nb.json index 540f10dbcbe..532ed731f20 100644 --- a/apps/mobile/src/i18n/locales/nb.json +++ b/apps/mobile/src/i18n/locales/nb.json @@ -3107,6 +3107,9 @@ "ssoError": "Organisasjonen din krever SSO. Bruk «$t(login.moreSignInOptions)».", "blocked": "Denne kontoen er blokkert. Kontakt brukerstøtte.", "signupRateLimited": "For mange forsøk. Prøv igjen senere.", + "signupStepUp": "Bruk «$t(login.moreSignInOptions)» for å fullføre opprettelsen av kontoen din.", + "signupStepUpApple": "Bruk «$t(login.signInWithApple)» for å fullføre opprettelsen av kontoen din.", + "signupStepUpGoogle": "Bruk «$t(login.signInWithGoogle)» for å fullføre opprettelsen av kontoen din.", "invalidCode": "Koden er feil. Prøv igjen.", "codeInProgress": "Koden din behandles. Vent et øyeblikk og prøv igjen.", "tooManyAttempts": "For mange forsøk. Be om en ny kode.", diff --git a/apps/mobile/src/i18n/locales/ne.json b/apps/mobile/src/i18n/locales/ne.json index abe9b8f239d..76425e93918 100644 --- a/apps/mobile/src/i18n/locales/ne.json +++ b/apps/mobile/src/i18n/locales/ne.json @@ -3107,6 +3107,9 @@ "ssoError": "तपाईंको संस्थामा साइन इन गर्न SSO अनिवार्य छ। '$t(login.moreSignInOptions)' प्रयोग गर्नुहोस्।", "blocked": "यो खाता ब्लक गरिएको छ। कृपया सहायता टोलीलाई सम्पर्क गर्नुहोस्।", "signupRateLimited": "धेरै पटक प्रयास गरियो। कृपया पछि फेरि प्रयास गर्नुहोस्।", + "signupStepUp": "आफ्नो खाता सिर्जना पूरा गर्न '$t(login.moreSignInOptions)' प्रयोग गर्नुहोस्।", + "signupStepUpApple": "आफ्नो खाता सिर्जना पूरा गर्न '$t(login.signInWithApple)' प्रयोग गर्नुहोस्।", + "signupStepUpGoogle": "आफ्नो खाता सिर्जना पूरा गर्न '$t(login.signInWithGoogle)' प्रयोग गर्नुहोस्।", "invalidCode": "त्यो कोड गलत छ। कृपया फेरि प्रयास गर्नुहोस्।", "codeInProgress": "तपाईंको कोड जाँचिँदै छ। केही क्षण पर्खेर फेरि प्रयास गर्नुहोस्।", "tooManyAttempts": "धेरै पटक प्रयास गरियो। कृपया नयाँ कोडको अनुरोध गर्नुहोस्।", diff --git a/apps/mobile/src/i18n/locales/nl.json b/apps/mobile/src/i18n/locales/nl.json index 53a9a8279df..39cff55b2c6 100644 --- a/apps/mobile/src/i18n/locales/nl.json +++ b/apps/mobile/src/i18n/locales/nl.json @@ -3107,6 +3107,9 @@ "ssoError": "Je organisatie vereist SSO. Gebruik '$t(login.moreSignInOptions)'.", "blocked": "Dit account is geblokkeerd. Neem contact op met de klantenservice.", "signupRateLimited": "Te veel pogingen. Probeer het later opnieuw.", + "signupStepUp": "Gebruik '$t(login.moreSignInOptions)' om het aanmaken van je account te voltooien.", + "signupStepUpApple": "Gebruik '$t(login.signInWithApple)' om het aanmaken van je account te voltooien.", + "signupStepUpGoogle": "Gebruik '$t(login.signInWithGoogle)' om het aanmaken van je account te voltooien.", "invalidCode": "Die code is onjuist. Probeer het opnieuw.", "codeInProgress": "Je code wordt verwerkt. Wacht even en probeer het opnieuw.", "tooManyAttempts": "Te veel pogingen. Vraag een nieuwe code aan.", diff --git a/apps/mobile/src/i18n/locales/om.json b/apps/mobile/src/i18n/locales/om.json index 112f2b33542..24d320c9d3d 100644 --- a/apps/mobile/src/i18n/locales/om.json +++ b/apps/mobile/src/i18n/locales/om.json @@ -3107,6 +3107,9 @@ "ssoError": "Dhaabbanni kee SSO barbaada. '$t(login.moreSignInOptions)' fayyadami.", "blocked": "Herregni kun dhorkameera. Garee gargaarsaa qunnami.", "signupRateLimited": "Yaallii baay'ee godhame. Booda irra deebi'ii yaali.", + "signupStepUp": "Herrega kee uumuu xumuruuf '$t(login.moreSignInOptions)' fayyadami.", + "signupStepUpApple": "Herrega kee uumuu xumuruuf '$t(login.signInWithApple)' fayyadami.", + "signupStepUpGoogle": "Herrega kee uumuu xumuruuf '$t(login.signInWithGoogle)' fayyadami.", "invalidCode": "Koodiin sun sirrii miti. Irra deebi'ii yaali.", "codeInProgress": "Koodiin kee adeemsifamaa jira. Yeroo xiqqoo eegiitii irra deebi'ii yaali.", "tooManyAttempts": "Yaallii baay'ee godhame. Koodii haaraa gaafadhu.", diff --git a/apps/mobile/src/i18n/locales/or.json b/apps/mobile/src/i18n/locales/or.json index e39f36a611b..59c09263066 100644 --- a/apps/mobile/src/i18n/locales/or.json +++ b/apps/mobile/src/i18n/locales/or.json @@ -3107,6 +3107,9 @@ "ssoError": "ଆପଣଙ୍କ ସଂଗଠନରେ SSO ବ୍ୟବହାର କରିବା ଆବଶ୍ୟକ। '$t(login.moreSignInOptions)' ବ୍ୟବହାର କରନ୍ତୁ।", "blocked": "ଏହି ଆକାଉଣ୍ଟକୁ ବ୍ଲକ୍ କରାଯାଇଛି। ସହାୟତା ଦଳ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।", "signupRateLimited": "ଅତ୍ୟଧିକ ଥର ଚେଷ୍ଟା କରିଛନ୍ତି। ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।", + "signupStepUp": "ଆପଣଙ୍କ ଆକାଉଣ୍ଟ ତିଆରି ସମ୍ପୂର୍ଣ୍ଣ କରିବାକୁ '$t(login.moreSignInOptions)' ବ୍ୟବହାର କରନ୍ତୁ।", + "signupStepUpApple": "ଆପଣଙ୍କ ଆକାଉଣ୍ଟ ତିଆରି ସମ୍ପୂର୍ଣ୍ଣ କରିବାକୁ '$t(login.signInWithApple)' ବ୍ୟବହାର କରନ୍ତୁ।", + "signupStepUpGoogle": "ଆପଣଙ୍କ ଆକାଉଣ୍ଟ ତିଆରି ସମ୍ପୂର୍ଣ୍ଣ କରିବାକୁ '$t(login.signInWithGoogle)' ବ୍ୟବହାର କରନ୍ତୁ।", "invalidCode": "କୋଡ୍‌ଟି ଭୁଲ୍ ଅଛି। ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।", "codeInProgress": "ଆପଣଙ୍କ କୋଡ୍‌ର ପ୍ରକ୍ରିୟାକରଣ ଚାଲିଛି। କିଛି ସମୟ ଅପେକ୍ଷା କରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।", "tooManyAttempts": "ଅତ୍ୟଧିକ ଥର ଚେଷ୍ଟା କରିଛନ୍ତି। ଏକ ନୂଆ କୋଡ୍ ପାଇଁ ଅନୁରୋଧ କରନ୍ତୁ।", diff --git a/apps/mobile/src/i18n/locales/pa.json b/apps/mobile/src/i18n/locales/pa.json index 5e646fd5b8f..0594b4f4dcf 100644 --- a/apps/mobile/src/i18n/locales/pa.json +++ b/apps/mobile/src/i18n/locales/pa.json @@ -3107,6 +3107,9 @@ "ssoError": "ਤੁਹਾਡੀ ਸੰਸਥਾ ਵਿੱਚ SSO ਵਰਤਣਾ ਲਾਜ਼ਮੀ ਹੈ। '$t(login.moreSignInOptions)' ਵਰਤੋ।", "blocked": "ਇਹ ਖਾਤਾ ਬਲੌਕ ਕੀਤਾ ਗਿਆ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਸਹਾਇਤਾ ਟੀਮ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।", "signupRateLimited": "ਬਹੁਤ ਜ਼ਿਆਦਾ ਕੋਸ਼ਿਸ਼ਾਂ ਹੋ ਚੁੱਕੀਆਂ ਹਨ। ਕਿਰਪਾ ਕਰਕੇ ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।", + "signupStepUp": "ਆਪਣਾ ਖਾਤਾ ਬਣਾਉਣਾ ਪੂਰਾ ਕਰਨ ਲਈ '$t(login.moreSignInOptions)' ਵਰਤੋ।", + "signupStepUpApple": "ਆਪਣਾ ਖਾਤਾ ਬਣਾਉਣਾ ਪੂਰਾ ਕਰਨ ਲਈ '$t(login.signInWithApple)' ਵਰਤੋ।", + "signupStepUpGoogle": "ਆਪਣਾ ਖਾਤਾ ਬਣਾਉਣਾ ਪੂਰਾ ਕਰਨ ਲਈ '$t(login.signInWithGoogle)' ਵਰਤੋ।", "invalidCode": "ਇਹ ਕੋਡ ਗਲਤ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।", "codeInProgress": "ਤੁਹਾਡੇ ਕੋਡ 'ਤੇ ਕਾਰਵਾਈ ਹੋ ਰਹੀ ਹੈ। ਥੋੜ੍ਹੀ ਦੇਰ ਉਡੀਕ ਕਰੋ ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।", "tooManyAttempts": "ਬਹੁਤ ਜ਼ਿਆਦਾ ਕੋਸ਼ਿਸ਼ਾਂ ਹੋ ਚੁੱਕੀਆਂ ਹਨ। ਕਿਰਪਾ ਕਰਕੇ ਨਵਾਂ ਕੋਡ ਮੰਗੋ।", diff --git a/apps/mobile/src/i18n/locales/pl.json b/apps/mobile/src/i18n/locales/pl.json index e4193be572d..f35b7fc0a22 100644 --- a/apps/mobile/src/i18n/locales/pl.json +++ b/apps/mobile/src/i18n/locales/pl.json @@ -3189,6 +3189,9 @@ "ssoError": "Twoja organizacja wymaga logowania SSO. Użyj opcji „$t(login.moreSignInOptions)”.", "blocked": "To konto zostało zablokowane. Skontaktuj się z pomocą techniczną.", "signupRateLimited": "Zbyt wiele prób. Spróbuj ponownie później.", + "signupStepUp": "Aby dokończyć tworzenie konta, użyj opcji „$t(login.moreSignInOptions)”.", + "signupStepUpApple": "Aby dokończyć tworzenie konta, użyj opcji „$t(login.signInWithApple)”.", + "signupStepUpGoogle": "Aby dokończyć tworzenie konta, użyj opcji „$t(login.signInWithGoogle)”.", "invalidCode": "Ten kod jest nieprawidłowy. Spróbuj ponownie.", "codeInProgress": "Trwa sprawdzanie twojego kodu. Poczekaj chwilę i spróbuj ponownie.", "tooManyAttempts": "Zbyt wiele prób. Poproś o nowy kod.", diff --git a/apps/mobile/src/i18n/locales/ps.json b/apps/mobile/src/i18n/locales/ps.json index 85f514e36b7..dc95965fc16 100644 --- a/apps/mobile/src/i18n/locales/ps.json +++ b/apps/mobile/src/i18n/locales/ps.json @@ -3107,6 +3107,9 @@ "ssoError": "ستاسو سازمان د ننوتلو لپاره SSO غواړي. '$t(login.moreSignInOptions)' وکاروئ.", "blocked": "دا حساب بند شوی دی. مهرباني وکړئ له ملاتړ سره اړیکه ونیسئ.", "signupRateLimited": "ډېرې هڅې وشوې. مهرباني وکړئ وروسته بیا هڅه وکړئ.", + "signupStepUp": "د خپل حساب د جوړولو بشپړولو لپاره '$t(login.moreSignInOptions)' وکاروئ.", + "signupStepUpApple": "د خپل حساب د جوړولو بشپړولو لپاره '$t(login.signInWithApple)' وکاروئ.", + "signupStepUpGoogle": "د خپل حساب د جوړولو بشپړولو لپاره '$t(login.signInWithGoogle)' وکاروئ.", "invalidCode": "دا کوډ سم نه دی. مهرباني وکړئ بیا هڅه وکړئ.", "codeInProgress": "ستاسو کوډ پروسس کېږي. لږ تم شئ او بیا هڅه وکړئ.", "tooManyAttempts": "ډېرې هڅې وشوې. مهرباني وکړئ د نوي کوډ غوښتنه وکړئ.", diff --git a/apps/mobile/src/i18n/locales/pt-BR.json b/apps/mobile/src/i18n/locales/pt-BR.json index fd43605d8da..eb809a01c4f 100644 --- a/apps/mobile/src/i18n/locales/pt-BR.json +++ b/apps/mobile/src/i18n/locales/pt-BR.json @@ -3148,6 +3148,9 @@ "ssoError": "Sua organização exige SSO. Use '$t(login.moreSignInOptions)'.", "blocked": "Esta conta foi bloqueada. Entre em contato com o suporte.", "signupRateLimited": "Muitas tentativas. Tente novamente mais tarde.", + "signupStepUp": "Para concluir a criação da sua conta, use '$t(login.moreSignInOptions)'.", + "signupStepUpApple": "Para concluir a criação da sua conta, use '$t(login.signInWithApple)'.", + "signupStepUpGoogle": "Para concluir a criação da sua conta, use '$t(login.signInWithGoogle)'.", "invalidCode": "Esse código está incorreto. Tente novamente.", "codeInProgress": "Seu código está sendo processado. Aguarde um momento e tente novamente.", "tooManyAttempts": "Muitas tentativas. Solicite um novo código.", diff --git a/apps/mobile/src/i18n/locales/pt.json b/apps/mobile/src/i18n/locales/pt.json index 76661078786..411d6ec9294 100644 --- a/apps/mobile/src/i18n/locales/pt.json +++ b/apps/mobile/src/i18n/locales/pt.json @@ -3148,6 +3148,9 @@ "ssoError": "A tua organização exige SSO. Usa '$t(login.moreSignInOptions)'.", "blocked": "Esta conta foi bloqueada. Contacta a equipa de apoio.", "signupRateLimited": "Demasiadas tentativas. Tenta novamente mais tarde.", + "signupStepUp": "Para concluir a criação da tua conta, usa '$t(login.moreSignInOptions)'.", + "signupStepUpApple": "Para concluir a criação da tua conta, usa '$t(login.signInWithApple)'.", + "signupStepUpGoogle": "Para concluir a criação da tua conta, usa '$t(login.signInWithGoogle)'.", "invalidCode": "Esse código está incorreto. Tenta novamente.", "codeInProgress": "O teu código está a ser processado. Aguarda um momento e tenta novamente.", "tooManyAttempts": "Demasiadas tentativas. Pede um novo código.", diff --git a/apps/mobile/src/i18n/locales/ro.json b/apps/mobile/src/i18n/locales/ro.json index dc1d408589c..2c63080da0e 100644 --- a/apps/mobile/src/i18n/locales/ro.json +++ b/apps/mobile/src/i18n/locales/ro.json @@ -3148,6 +3148,9 @@ "ssoError": "Organizația ta impune autentificarea unică (SSO). Folosește „$t(login.moreSignInOptions)”.", "blocked": "Acest cont a fost blocat. Contactează echipa de asistență.", "signupRateLimited": "Prea multe încercări. Încearcă din nou mai târziu.", + "signupStepUp": "Pentru a finaliza crearea contului, folosește „$t(login.moreSignInOptions)”.", + "signupStepUpApple": "Pentru a finaliza crearea contului, folosește „$t(login.signInWithApple)”.", + "signupStepUpGoogle": "Pentru a finaliza crearea contului, folosește „$t(login.signInWithGoogle)”.", "invalidCode": "Codul este incorect. Încearcă din nou.", "codeInProgress": "Codul tău este procesat. Așteaptă puțin și încearcă din nou.", "tooManyAttempts": "Prea multe încercări. Solicită un cod nou.", diff --git a/apps/mobile/src/i18n/locales/ru.json b/apps/mobile/src/i18n/locales/ru.json index 70a3c682c71..c620ba9ee86 100644 --- a/apps/mobile/src/i18n/locales/ru.json +++ b/apps/mobile/src/i18n/locales/ru.json @@ -3189,6 +3189,9 @@ "ssoError": "Ваша организация требует входа через SSO. Выберите «$t(login.moreSignInOptions)».", "blocked": "Этот аккаунт заблокирован. Обратитесь в службу поддержки.", "signupRateLimited": "Слишком много попыток. Повторите попытку позже.", + "signupStepUp": "Чтобы завершить создание аккаунта, выберите «$t(login.moreSignInOptions)».", + "signupStepUpApple": "Чтобы завершить создание аккаунта, выберите «$t(login.signInWithApple)».", + "signupStepUpGoogle": "Чтобы завершить создание аккаунта, выберите «$t(login.signInWithGoogle)».", "invalidCode": "Код неверный. Попробуйте ещё раз.", "codeInProgress": "Код проверяется. Подождите немного и попробуйте снова.", "tooManyAttempts": "Слишком много попыток. Запросите новый код.", diff --git a/apps/mobile/src/i18n/locales/si.json b/apps/mobile/src/i18n/locales/si.json index 69fe5022848..ae032542fb9 100644 --- a/apps/mobile/src/i18n/locales/si.json +++ b/apps/mobile/src/i18n/locales/si.json @@ -3107,6 +3107,9 @@ "ssoError": "ඔබේ සංවිධානයට පිවිසීමට SSO භාවිත කළ යුතුය. '$t(login.moreSignInOptions)' භාවිත කරන්න.", "blocked": "මෙම ගිණුම අවහිර කර ඇත. කරුණාකර සහාය කණ්ඩායම අමතන්න.", "signupRateLimited": "උත්සාහ කළ වාර ගණන වැඩියි. කරුණාකර පසුව නැවත උත්සාහ කරන්න.", + "signupStepUp": "ඔබේ ගිණුම සෑදීම සම්පූර්ණ කිරීමට '$t(login.moreSignInOptions)' භාවිත කරන්න.", + "signupStepUpApple": "ඔබේ ගිණුම සෑදීම සම්පූර්ණ කිරීමට '$t(login.signInWithApple)' භාවිත කරන්න.", + "signupStepUpGoogle": "ඔබේ ගිණුම සෑදීම සම්පූර්ණ කිරීමට '$t(login.signInWithGoogle)' භාවිත කරන්න.", "invalidCode": "එම කේතය වැරදියි. කරුණාකර නැවත උත්සාහ කරන්න.", "codeInProgress": "ඔබේ කේතය සකසනු ලැබේ. මොහොතක් රැඳී සිට නැවත උත්සාහ කරන්න.", "tooManyAttempts": "උත්සාහ කළ වාර ගණන වැඩියි. කරුණාකර නව කේතයක් ඉල්ලන්න.", diff --git a/apps/mobile/src/i18n/locales/sk.json b/apps/mobile/src/i18n/locales/sk.json index dc4f22bc6d5..ec17c300182 100644 --- a/apps/mobile/src/i18n/locales/sk.json +++ b/apps/mobile/src/i18n/locales/sk.json @@ -3189,6 +3189,9 @@ "ssoError": "Tvoja organizácia vyžaduje SSO. Použi „$t(login.moreSignInOptions)“.", "blocked": "Tento účet bol zablokovaný. Kontaktuj podporu.", "signupRateLimited": "Príliš veľa pokusov. Skús to neskôr.", + "signupStepUp": "Na dokončenie vytvorenia účtu použi „$t(login.moreSignInOptions)“.", + "signupStepUpApple": "Na dokončenie vytvorenia účtu použi „$t(login.signInWithApple)“.", + "signupStepUpGoogle": "Na dokončenie vytvorenia účtu použi „$t(login.signInWithGoogle)“.", "invalidCode": "Tento kód je nesprávny. Skús to znova.", "codeInProgress": "Tvoj kód sa spracúva. Chvíľu počkaj a skús to znova.", "tooManyAttempts": "Príliš veľa pokusov. Vyžiadaj si nový kód.", diff --git a/apps/mobile/src/i18n/locales/sl.json b/apps/mobile/src/i18n/locales/sl.json index 36a5724b404..7d5dd697481 100644 --- a/apps/mobile/src/i18n/locales/sl.json +++ b/apps/mobile/src/i18n/locales/sl.json @@ -3189,6 +3189,9 @@ "ssoError": "Tvoja organizacija zahteva SSO. Izberi »$t(login.moreSignInOptions)«.", "blocked": "Ta račun je blokiran. Obrni se na podporo.", "signupRateLimited": "Preveč poskusov. Poskusi znova pozneje.", + "signupStepUp": "Za dokončanje ustvarjanja računa izberi »$t(login.moreSignInOptions)«.", + "signupStepUpApple": "Za dokončanje ustvarjanja računa izberi »$t(login.signInWithApple)«.", + "signupStepUpGoogle": "Za dokončanje ustvarjanja računa izberi »$t(login.signInWithGoogle)«.", "invalidCode": "Ta koda ni pravilna. Poskusi znova.", "codeInProgress": "Tvoja koda se obdeluje. Počakaj trenutek in poskusi znova.", "tooManyAttempts": "Preveč poskusov. Zahtevaj novo kodo.", diff --git a/apps/mobile/src/i18n/locales/so.json b/apps/mobile/src/i18n/locales/so.json index 5615bb7c5f9..b70f0ba4464 100644 --- a/apps/mobile/src/i18n/locales/so.json +++ b/apps/mobile/src/i18n/locales/so.json @@ -3107,6 +3107,9 @@ "ssoError": "Ururkaaga waxa uu u baahan yahay SSO. Isticmaal '$t(login.moreSignInOptions)'.", "blocked": "Akoonkan waa la xannibay. Fadlan la xiriir taageerada.", "signupRateLimited": "Isku dayo aad u badan. Fadlan mar kale isku day waqti dambe.", + "signupStepUp": "Si aad u dhammaystirto abuurista akoonkaaga, isticmaal '$t(login.moreSignInOptions)'.", + "signupStepUpApple": "Si aad u dhammaystirto abuurista akoonkaaga, isticmaal '$t(login.signInWithApple)'.", + "signupStepUpGoogle": "Si aad u dhammaystirto abuurista akoonkaaga, isticmaal '$t(login.signInWithGoogle)'.", "invalidCode": "Koodhku waa qalad. Fadlan mar kale isku day.", "codeInProgress": "Koodhkaaga waa la habaynayaa. Wax yar sug oo mar kale isku day.", "tooManyAttempts": "Isku dayo aad u badan. Fadlan codso koodh cusub.", diff --git a/apps/mobile/src/i18n/locales/sq.json b/apps/mobile/src/i18n/locales/sq.json index ea095122621..c02d1ca0480 100644 --- a/apps/mobile/src/i18n/locales/sq.json +++ b/apps/mobile/src/i18n/locales/sq.json @@ -3107,6 +3107,9 @@ "ssoError": "Organizata jote kërkon SSO. Përdor '$t(login.moreSignInOptions)'.", "blocked": "Kjo llogari është bllokuar. Kontakto ekipin e mbështetjes.", "signupRateLimited": "Ke bërë shumë përpjekje. Provo përsëri më vonë.", + "signupStepUp": "Për të përfunduar krijimin e llogarisë, përdor '$t(login.moreSignInOptions)'.", + "signupStepUpApple": "Për të përfunduar krijimin e llogarisë, përdor '$t(login.signInWithApple)'.", + "signupStepUpGoogle": "Për të përfunduar krijimin e llogarisë, përdor '$t(login.signInWithGoogle)'.", "invalidCode": "Kodi është i pasaktë. Provo përsëri.", "codeInProgress": "Kodi yt po përpunohet. Prit pak dhe provo përsëri.", "tooManyAttempts": "Ke bërë shumë përpjekje. Kërko një kod të ri.", diff --git a/apps/mobile/src/i18n/locales/sr.json b/apps/mobile/src/i18n/locales/sr.json index 241f20aaa01..b6941f31add 100644 --- a/apps/mobile/src/i18n/locales/sr.json +++ b/apps/mobile/src/i18n/locales/sr.json @@ -3148,6 +3148,9 @@ "ssoError": "Tvoja organizacija zahteva SSO. Izaberi „$t(login.moreSignInOptions)“.", "blocked": "Ovaj nalog je blokiran. Obrati se podršci.", "signupRateLimited": "Previše pokušaja. Pokušaj ponovo kasnije.", + "signupStepUp": "Za dovršavanje kreiranja naloga izaberi „$t(login.moreSignInOptions)“.", + "signupStepUpApple": "Za dovršavanje kreiranja naloga izaberi „$t(login.signInWithApple)“.", + "signupStepUpGoogle": "Za dovršavanje kreiranja naloga izaberi „$t(login.signInWithGoogle)“.", "invalidCode": "Kod nije tačan. Pokušaj ponovo.", "codeInProgress": "Tvoj kod se obrađuje. Sačekaj trenutak i pokušaj ponovo.", "tooManyAttempts": "Previše pokušaja. Zatraži novi kod.", diff --git a/apps/mobile/src/i18n/locales/sv.json b/apps/mobile/src/i18n/locales/sv.json index 04a90c6a74e..a1526fe0676 100644 --- a/apps/mobile/src/i18n/locales/sv.json +++ b/apps/mobile/src/i18n/locales/sv.json @@ -3107,6 +3107,9 @@ "ssoError": "Din organisation kräver SSO. Välj ”$t(login.moreSignInOptions)”.", "blocked": "Det här kontot har blockerats. Kontakta supporten.", "signupRateLimited": "För många försök. Försök igen senare.", + "signupStepUp": "Välj ”$t(login.moreSignInOptions)” för att slutföra skapandet av ditt konto.", + "signupStepUpApple": "Välj ”$t(login.signInWithApple)” för att slutföra skapandet av ditt konto.", + "signupStepUpGoogle": "Välj ”$t(login.signInWithGoogle)” för att slutföra skapandet av ditt konto.", "invalidCode": "Koden är felaktig. Försök igen.", "codeInProgress": "Din kod behandlas. Vänta en stund och försök igen.", "tooManyAttempts": "För många försök. Begär en ny kod.", diff --git a/apps/mobile/src/i18n/locales/sw.json b/apps/mobile/src/i18n/locales/sw.json index 5f4edced209..50e564984de 100644 --- a/apps/mobile/src/i18n/locales/sw.json +++ b/apps/mobile/src/i18n/locales/sw.json @@ -3107,6 +3107,9 @@ "ssoError": "Shirika lako linahitaji SSO. Tumia '$t(login.moreSignInOptions)'.", "blocked": "Akaunti hii imezuiwa. Tafadhali wasiliana na huduma kwa wateja.", "signupRateLimited": "Majaribio mengi mno. Tafadhali jaribu tena baadaye.", + "signupStepUp": "Ili kukamilisha kuunda akaunti yako, tumia '$t(login.moreSignInOptions)'.", + "signupStepUpApple": "Ili kukamilisha kuunda akaunti yako, tumia '$t(login.signInWithApple)'.", + "signupStepUpGoogle": "Ili kukamilisha kuunda akaunti yako, tumia '$t(login.signInWithGoogle)'.", "invalidCode": "Msimbo huo si sahihi. Tafadhali jaribu tena.", "codeInProgress": "Msimbo wako unachakatwa. Subiri kidogo kisha ujaribu tena.", "tooManyAttempts": "Majaribio mengi mno. Tafadhali omba msimbo mpya.", diff --git a/apps/mobile/src/i18n/locales/ta.json b/apps/mobile/src/i18n/locales/ta.json index ffc9e7cbbcf..997473dfb56 100644 --- a/apps/mobile/src/i18n/locales/ta.json +++ b/apps/mobile/src/i18n/locales/ta.json @@ -3107,6 +3107,9 @@ "ssoError": "உங்கள் நிறுவனத்தில் SSO கட்டாயம். '$t(login.moreSignInOptions)' என்பதைப் பயன்படுத்தவும்.", "blocked": "இந்தக் கணக்கு தடுக்கப்பட்டுள்ளது. உதவிக் குழுவைத் தொடர்புகொள்ளவும்.", "signupRateLimited": "முயற்சிகளின் வரம்பை மீறிவிட்டீர்கள். பிறகு மீண்டும் முயற்சிக்கவும்.", + "signupStepUp": "உங்கள் கணக்கை உருவாக்குவதை முடிக்க '$t(login.moreSignInOptions)' என்பதைப் பயன்படுத்தவும்.", + "signupStepUpApple": "உங்கள் கணக்கை உருவாக்குவதை முடிக்க '$t(login.signInWithApple)' என்பதைப் பயன்படுத்தவும்.", + "signupStepUpGoogle": "உங்கள் கணக்கை உருவாக்குவதை முடிக்க '$t(login.signInWithGoogle)' என்பதைப் பயன்படுத்தவும்.", "invalidCode": "அந்தக் குறியீடு தவறானது. மீண்டும் முயற்சிக்கவும்.", "codeInProgress": "உங்கள் குறியீடு செயலாக்கப்படுகிறது. சிறிது நேரம் காத்திருந்து மீண்டும் முயற்சிக்கவும்.", "tooManyAttempts": "முயற்சிகளின் வரம்பை மீறிவிட்டீர்கள். புதிய குறியீட்டைக் கோரவும்.", diff --git a/apps/mobile/src/i18n/locales/te.json b/apps/mobile/src/i18n/locales/te.json index 8d76ac0cc14..f3c41751593 100644 --- a/apps/mobile/src/i18n/locales/te.json +++ b/apps/mobile/src/i18n/locales/te.json @@ -3107,6 +3107,9 @@ "ssoError": "మీ సంస్థలో SSO ద్వారా సైన్ ఇన్ చేయడం తప్పనిసరి. '$t(login.moreSignInOptions)' ఉపయోగించండి.", "blocked": "ఈ ఖాతాను బ్లాక్ చేశారు. సహాయ బృందాన్ని సంప్రదించండి.", "signupRateLimited": "చాలా సార్లు ప్రయత్నించారు. కాసేపటి తర్వాత మళ్లీ ప్రయత్నించండి.", + "signupStepUp": "మీ ఖాతా సృష్టిని పూర్తి చేయడానికి '$t(login.moreSignInOptions)' ఉపయోగించండి.", + "signupStepUpApple": "మీ ఖాతా సృష్టిని పూర్తి చేయడానికి '$t(login.signInWithApple)' ఉపయోగించండి.", + "signupStepUpGoogle": "మీ ఖాతా సృష్టిని పూర్తి చేయడానికి '$t(login.signInWithGoogle)' ఉపయోగించండి.", "invalidCode": "ఆ కోడ్ సరైనది కాదు. దయచేసి మళ్లీ ప్రయత్నించండి.", "codeInProgress": "మీ కోడ్ ప్రాసెస్ చేయబడుతోంది. కొంచెం ఆగి మళ్లీ ప్రయత్నించండి.", "tooManyAttempts": "చాలా సార్లు ప్రయత్నించారు. కొత్త కోడ్‌ను అభ్యర్థించండి.", diff --git a/apps/mobile/src/i18n/locales/th.json b/apps/mobile/src/i18n/locales/th.json index 6af7c333939..c39f6753c99 100644 --- a/apps/mobile/src/i18n/locales/th.json +++ b/apps/mobile/src/i18n/locales/th.json @@ -3107,6 +3107,9 @@ "ssoError": "องค์กรของคุณกำหนดให้เข้าสู่ระบบด้วย SSO ให้เลือก '$t(login.moreSignInOptions)'", "blocked": "บัญชีนี้ถูกบล็อกแล้ว โปรดติดต่อฝ่ายสนับสนุน", "signupRateLimited": "ลองหลายครั้งเกินไป โปรดลองอีกครั้งภายหลัง", + "signupStepUp": "หากต้องการสร้างบัญชีให้เสร็จสมบูรณ์ ให้ใช้ '$t(login.moreSignInOptions)'", + "signupStepUpApple": "หากต้องการสร้างบัญชีให้เสร็จสมบูรณ์ ให้ใช้ '$t(login.signInWithApple)'", + "signupStepUpGoogle": "หากต้องการสร้างบัญชีให้เสร็จสมบูรณ์ ให้ใช้ '$t(login.signInWithGoogle)'", "invalidCode": "รหัสนั้นไม่ถูกต้อง โปรดลองอีกครั้ง", "codeInProgress": "กำลังประมวลผลรหัสของคุณ รอสักครู่แล้วลองอีกครั้ง", "tooManyAttempts": "ลองหลายครั้งเกินไป โปรดขอรหัสใหม่", diff --git a/apps/mobile/src/i18n/locales/tr.json b/apps/mobile/src/i18n/locales/tr.json index ae17ad9b9a7..b5f5a891fa1 100644 --- a/apps/mobile/src/i18n/locales/tr.json +++ b/apps/mobile/src/i18n/locales/tr.json @@ -3107,6 +3107,9 @@ "ssoError": "Kuruluşun SSO gerektiriyor. '$t(login.moreSignInOptions)' seçeneğini kullan.", "blocked": "Bu hesap engellendi. Lütfen destek ekibiyle iletişime geç.", "signupRateLimited": "Çok fazla deneme yapıldı. Lütfen daha sonra tekrar dene.", + "signupStepUp": "Hesabını oluşturmayı tamamlamak için '$t(login.moreSignInOptions)' seçeneğini kullan.", + "signupStepUpApple": "Hesabını oluşturmayı tamamlamak için '$t(login.signInWithApple)' seçeneğini kullan.", + "signupStepUpGoogle": "Hesabını oluşturmayı tamamlamak için '$t(login.signInWithGoogle)' seçeneğini kullan.", "invalidCode": "Bu kod yanlış. Lütfen tekrar dene.", "codeInProgress": "Kodun işleniyor. Biraz bekle ve tekrar dene.", "tooManyAttempts": "Çok fazla deneme yapıldı. Lütfen yeni bir kod iste.", diff --git a/apps/mobile/src/i18n/locales/uk.json b/apps/mobile/src/i18n/locales/uk.json index 0e2253639a6..77dc3f2e68f 100644 --- a/apps/mobile/src/i18n/locales/uk.json +++ b/apps/mobile/src/i18n/locales/uk.json @@ -3189,6 +3189,9 @@ "ssoError": "Ваша організація вимагає SSO. Скористайтеся пунктом «$t(login.moreSignInOptions)».", "blocked": "Цей обліковий запис заблоковано. Зверніться до служби підтримки.", "signupRateLimited": "Забагато спроб. Повторіть спробу пізніше.", + "signupStepUp": "Щоб завершити створення облікового запису, виберіть «$t(login.moreSignInOptions)».", + "signupStepUpApple": "Щоб завершити створення облікового запису, виберіть «$t(login.signInWithApple)».", + "signupStepUpGoogle": "Щоб завершити створення облікового запису, виберіть «$t(login.signInWithGoogle)».", "invalidCode": "Код неправильний. Спробуйте ще раз.", "codeInProgress": "Ваш код опрацьовується. Зачекайте трохи та спробуйте ще раз.", "tooManyAttempts": "Забагато спроб. Надішліть запит на новий код.", diff --git a/apps/mobile/src/i18n/locales/ur.json b/apps/mobile/src/i18n/locales/ur.json index ea81535ac87..383944b3f30 100644 --- a/apps/mobile/src/i18n/locales/ur.json +++ b/apps/mobile/src/i18n/locales/ur.json @@ -3107,6 +3107,9 @@ "ssoError": "آپ کی تنظیم میں SSO کے ذریعے سائن ان کرنا ضروری ہے۔ '$t(login.moreSignInOptions)' استعمال کریں۔", "blocked": "یہ اکاؤنٹ بلاک کر دیا گیا ہے۔ براہ کرم سپورٹ سے رابطہ کریں۔", "signupRateLimited": "بہت زیادہ کوششیں ہو چکی ہیں۔ براہ کرم کچھ دیر بعد دوبارہ کوشش کریں۔", + "signupStepUp": "اپنا اکاؤنٹ بنانا مکمل کرنے کے لیے '$t(login.moreSignInOptions)' استعمال کریں۔", + "signupStepUpApple": "اپنا اکاؤنٹ بنانا مکمل کرنے کے لیے '$t(login.signInWithApple)' استعمال کریں۔", + "signupStepUpGoogle": "اپنا اکاؤنٹ بنانا مکمل کرنے کے لیے '$t(login.signInWithGoogle)' استعمال کریں۔", "invalidCode": "یہ کوڈ غلط ہے۔ براہ کرم دوبارہ کوشش کریں۔", "codeInProgress": "آپ کے کوڈ پر کارروائی ہو رہی ہے۔ ذرا انتظار کریں اور دوبارہ کوشش کریں۔", "tooManyAttempts": "بہت زیادہ کوششیں ہو چکی ہیں۔ براہ کرم نئے کوڈ کی درخواست کریں۔", diff --git a/apps/mobile/src/i18n/locales/uz.json b/apps/mobile/src/i18n/locales/uz.json index e044f2c2bbb..035af08632e 100644 --- a/apps/mobile/src/i18n/locales/uz.json +++ b/apps/mobile/src/i18n/locales/uz.json @@ -3107,6 +3107,9 @@ "ssoError": "Tashkilotingiz SSO orqali kirishni talab qiladi. '$t(login.moreSignInOptions)' orqali davom eting.", "blocked": "Bu hisob bloklangan. Iltimos, qo‘llab-quvvatlash xizmatiga murojaat qiling.", "signupRateLimited": "Juda ko'p urinish bo'ldi. Keyinroq qayta urinib ko'ring.", + "signupStepUp": "Hisob yaratishni yakunlash uchun '$t(login.moreSignInOptions)' dan foydalaning.", + "signupStepUpApple": "Hisob yaratishni yakunlash uchun '$t(login.signInWithApple)' dan foydalaning.", + "signupStepUpGoogle": "Hisob yaratishni yakunlash uchun '$t(login.signInWithGoogle)' dan foydalaning.", "invalidCode": "Bu kod noto‘g‘ri. Iltimos, qayta urinib ko‘ring.", "codeInProgress": "Kodingiz tekshirilmoqda. Biroz kuting va qayta urinib ko'ring.", "tooManyAttempts": "Juda ko'p urinish bo'ldi. Yangi kod so'rang.", diff --git a/apps/mobile/src/i18n/locales/vi.json b/apps/mobile/src/i18n/locales/vi.json index 82bd9e97c00..8b9bb43491e 100644 --- a/apps/mobile/src/i18n/locales/vi.json +++ b/apps/mobile/src/i18n/locales/vi.json @@ -3107,6 +3107,9 @@ "ssoError": "Tổ chức của bạn yêu cầu SSO. Dùng '$t(login.moreSignInOptions)'.", "blocked": "Tài khoản này đã bị chặn. Vui lòng liên hệ bộ phận hỗ trợ.", "signupRateLimited": "Quá nhiều lần thử. Vui lòng thử lại sau.", + "signupStepUp": "Để hoàn tất việc tạo tài khoản, hãy dùng '$t(login.moreSignInOptions)'.", + "signupStepUpApple": "Để hoàn tất việc tạo tài khoản, hãy dùng '$t(login.signInWithApple)'.", + "signupStepUpGoogle": "Để hoàn tất việc tạo tài khoản, hãy dùng '$t(login.signInWithGoogle)'.", "invalidCode": "Mã đó không đúng. Vui lòng thử lại.", "codeInProgress": "Mã của bạn đang được xử lý. Chờ một chút rồi thử lại.", "tooManyAttempts": "Quá nhiều lần thử. Vui lòng yêu cầu mã mới.", diff --git a/apps/mobile/src/i18n/locales/yo.json b/apps/mobile/src/i18n/locales/yo.json index 162d36968ed..e4cbbabca51 100644 --- a/apps/mobile/src/i18n/locales/yo.json +++ b/apps/mobile/src/i18n/locales/yo.json @@ -3107,6 +3107,9 @@ "ssoError": "Àjọ rẹ gbọ́dọ̀ lo SSO. Lo '$t(login.moreSignInOptions)'.", "blocked": "A ti dènà àkọọ́lẹ̀ yìí. Jọ̀wọ́ kàn sí ẹgbẹ́ ìrànlọ́wọ́.", "signupRateLimited": "Àwọn ìgbìyànjú pọ̀ jù. Jọ̀wọ́ tún gbìyànjú nígbà mìíràn.", + "signupStepUp": "Láti parí ṣíṣẹ̀dá àkọọ́lẹ̀ rẹ, lo '$t(login.moreSignInOptions)'.", + "signupStepUpApple": "Láti parí ṣíṣẹ̀dá àkọọ́lẹ̀ rẹ, lo '$t(login.signInWithApple)'.", + "signupStepUpGoogle": "Láti parí ṣíṣẹ̀dá àkọọ́lẹ̀ rẹ, lo '$t(login.signInWithGoogle)'.", "invalidCode": "Kóòdù yẹn kò tọ́. Jọ̀wọ́ tún gbìyànjú.", "codeInProgress": "À ń ṣe àyẹ̀wò kóòdù rẹ. Dúró díẹ̀ kí o tún gbìyànjú.", "tooManyAttempts": "Àwọn ìgbìyànjú pọ̀ jù. Jọ̀wọ́ béèrè fún kóòdù tuntun.", diff --git a/apps/mobile/src/i18n/locales/zh-Hans.json b/apps/mobile/src/i18n/locales/zh-Hans.json index 0e61a24ecf8..b83e6cd5911 100644 --- a/apps/mobile/src/i18n/locales/zh-Hans.json +++ b/apps/mobile/src/i18n/locales/zh-Hans.json @@ -3107,6 +3107,9 @@ "ssoError": "你所在的组织要求使用单点登录(SSO)。请选择“$t(login.moreSignInOptions)”。", "blocked": "此账号已被封禁。请联系支持团队。", "signupRateLimited": "尝试次数过多。请稍后再试。", + "signupStepUp": "如需完成账户创建,请选择“$t(login.moreSignInOptions)”。", + "signupStepUpApple": "如需完成账户创建,请选择“$t(login.signInWithApple)”。", + "signupStepUpGoogle": "如需完成账户创建,请选择“$t(login.signInWithGoogle)”。", "invalidCode": "验证码不正确。请重试。", "codeInProgress": "正在处理你的验证码。请稍后重试。", "tooManyAttempts": "尝试次数过多。请重新获取验证码。", diff --git a/apps/mobile/src/i18n/locales/zh-Hant.json b/apps/mobile/src/i18n/locales/zh-Hant.json index f33010cfa09..37f502ecf70 100644 --- a/apps/mobile/src/i18n/locales/zh-Hant.json +++ b/apps/mobile/src/i18n/locales/zh-Hant.json @@ -3107,6 +3107,9 @@ "ssoError": "你的組織規定必須使用單一登入(SSO)。請選擇「$t(login.moreSignInOptions)」。", "blocked": "此帳戶已封鎖。請聯絡客服。", "signupRateLimited": "嘗試次數過多。請稍後再試。", + "signupStepUp": "如要完成帳戶建立,請選擇「$t(login.moreSignInOptions)」。", + "signupStepUpApple": "如要完成帳戶建立,請選擇「$t(login.signInWithApple)」。", + "signupStepUpGoogle": "如要完成帳戶建立,請選擇「$t(login.signInWithGoogle)」。", "invalidCode": "該驗證碼不正確。請再試一次。", "codeInProgress": "正在處理你的驗證碼。請稍候再試一次。", "tooManyAttempts": "嘗試次數過多。請重新索取驗證碼。", diff --git a/apps/mobile/src/i18n/locales/zu.json b/apps/mobile/src/i18n/locales/zu.json index 166af96ba6a..014f19bb138 100644 --- a/apps/mobile/src/i18n/locales/zu.json +++ b/apps/mobile/src/i18n/locales/zu.json @@ -3107,6 +3107,9 @@ "ssoError": "Inhlangano yakho idinga i-SSO. Sebenzisa '$t(login.moreSignInOptions)'.", "blocked": "Le akhawunti ivinjiwe. Sicela uxhumane nethimba losizo.", "signupRateLimited": "Imizamo eminingi kakhulu. Sicela uzame futhi kamuva.", + "signupStepUp": "Ukuze uqedele ukudala i-akhawunti yakho, sebenzisa '$t(login.moreSignInOptions)'.", + "signupStepUpApple": "Ukuze uqedele ukudala i-akhawunti yakho, sebenzisa '$t(login.signInWithApple)'.", + "signupStepUpGoogle": "Ukuze uqedele ukudala i-akhawunti yakho, sebenzisa '$t(login.signInWithGoogle)'.", "invalidCode": "Leyo khodi ayilungile. Sicela uzame futhi.", "codeInProgress": "Ikhodi yakho iyacubungulwa. Linda isikhashana bese uzama futhi.", "tooManyAttempts": "Imizamo eminingi kakhulu. Sicela ucele ikhodi entsha.", diff --git a/apps/mobile/src/lib/auth/auth-error-messages.ts b/apps/mobile/src/lib/auth/auth-error-messages.ts index 0ff94be2643..176a9a78737 100644 --- a/apps/mobile/src/lib/auth/auth-error-messages.ts +++ b/apps/mobile/src/lib/auth/auth-error-messages.ts @@ -12,6 +12,8 @@ const AUTH_ERROR_KEYS = { // Only surfaced by Apple/Google paths; the email-OTP request returns opaque 200 for blocked domains BLOCKED: 'authErrors.blocked', 'SIGNUP-RATE-LIMITED': 'authErrors.signupRateLimited', + // Without the methods or a matching button, the browser sign-in offers Google and Apple. + 'SIGNUP-STEP-UP': 'authErrors.signupStepUp', INVALID_CODE: 'authErrors.invalidCode', CODE_IN_PROGRESS: 'authErrors.codeInProgress', TOO_MANY_ATTEMPTS: 'authErrors.tooManyAttempts', @@ -39,3 +41,20 @@ export function mapError(errorCode: string | undefined): string { const key = errorCode && AUTH_ERROR_KEYS[errorCode as keyof typeof AUTH_ERROR_KEYS]; return key ? i18n.t(key) : defaultErrorMessage(); } + +/** + * The `SIGNUP-STEP-UP` message. It names an allowed Apple or Google button only when that button + * is on this sign-in screen; otherwise it points to the browser sign-in options. + */ +export function signupStepUpMessage( + methods: readonly string[] | undefined, + shown: { apple: boolean; google: boolean } +): string { + if (shown.apple && methods?.includes('apple')) { + return i18n.t('authErrors.signupStepUpApple'); + } + if (shown.google && methods?.includes('google')) { + return i18n.t('authErrors.signupStepUpGoogle'); + } + return i18n.t('authErrors.signupStepUp'); +} diff --git a/apps/mobile/src/lib/auth/auth-fetch.ts b/apps/mobile/src/lib/auth/auth-fetch.ts index 56b3666caeb..2288b8bc7c7 100644 --- a/apps/mobile/src/lib/auth/auth-fetch.ts +++ b/apps/mobile/src/lib/auth/auth-fetch.ts @@ -23,6 +23,8 @@ export type PostAuthFailure = { ok: false; errorCode: string | undefined; ssoOrganizationId: string | undefined; + /** The sign-in methods a `SIGNUP-STEP-UP` refusal admits, unfiltered. */ + signupMethods?: string[]; /** The HTTP status the route answered with; absent when it never answered. */ httpStatus?: number; /** True for a refusal retrying cannot change (a 401, or a 4xx with no retry guidance). */ @@ -96,6 +98,7 @@ export async function postAuth( ok: false, errorCode: parsed?.code, ssoOrganizationId: parsed?.ssoOrganizationId, + signupMethods: parsed?.signupMethods, httpStatus: response.status, terminal: classified.kind === 'terminal', retryAfterMs: classified.kind === 'retry' ? classified.retryAfterMs : undefined, diff --git a/apps/mobile/src/lib/auth/native-auth-contract.test.ts b/apps/mobile/src/lib/auth/native-auth-contract.test.ts index 5aa32fe9b6e..03015aa42c5 100644 --- a/apps/mobile/src/lib/auth/native-auth-contract.test.ts +++ b/apps/mobile/src/lib/auth/native-auth-contract.test.ts @@ -240,6 +240,16 @@ describe('parseAuthError', () => { expect(parseAuthError({ error: 'BLOCKED' })).toEqual({ code: 'BLOCKED' }); }); + it('returns the step-up methods and keeps the code when they are malformed', () => { + expect(parseAuthError({ error: 'SIGNUP-STEP-UP', methods: ['google', 'apple'] })).toEqual({ + code: 'SIGNUP-STEP-UP', + signupMethods: ['google', 'apple'], + }); + expect(parseAuthError({ error: 'SIGNUP-STEP-UP', methods: 'apple' })).toEqual({ + code: 'SIGNUP-STEP-UP', + }); + }); + it('returns undefined for null, undefined, and non-error objects', () => { expect(parseAuthError(null)).toBeUndefined(); expect(parseAuthError(undefined)).toBeUndefined(); diff --git a/apps/mobile/src/lib/auth/native-auth-contract.ts b/apps/mobile/src/lib/auth/native-auth-contract.ts index 270631e84bb..6407989e025 100644 --- a/apps/mobile/src/lib/auth/native-auth-contract.ts +++ b/apps/mobile/src/lib/auth/native-auth-contract.ts @@ -14,7 +14,10 @@ const emailCodeResponseSchema = z.object({ const errorResponseSchema = z.object({ error: z.string(), ssoOrganizationId: z.string().min(1).optional(), + // Parsed on its own below: a malformed method list must not hide the error code. + methods: z.unknown().optional(), }); +const signupMethodsSchema = z.array(z.string()); export type TokenPair = | { token: string; refreshToken: string; expiresIn: number; created?: boolean } @@ -118,12 +121,17 @@ export function parseEmailCodeResponse(value: unknown) { export function parseAuthError( value: unknown -): { code: string; ssoOrganizationId?: string } | undefined { +): { code: string; ssoOrganizationId?: string; signupMethods?: string[] } | undefined { const result = errorResponseSchema.safeParse(value); if (!result.success) { return undefined; } - return { code: result.data.error, ssoOrganizationId: result.data.ssoOrganizationId }; + const methods = signupMethodsSchema.safeParse(result.data.methods); + return { + code: result.data.error, + ssoOrganizationId: result.data.ssoOrganizationId, + signupMethods: methods.success ? methods.data : undefined, + }; } export type ChallengeEntry = { email: string; challengeId: string }; diff --git a/apps/mobile/src/lib/auth/use-native-auth.test.ts b/apps/mobile/src/lib/auth/use-native-auth.test.ts index 59b68bbd63e..caa18c6a829 100644 --- a/apps/mobile/src/lib/auth/use-native-auth.test.ts +++ b/apps/mobile/src/lib/auth/use-native-auth.test.ts @@ -55,10 +55,12 @@ vi.mock('expo-secure-store', () => ({ })); // Mock dependencies of use-native-auth.ts so we can import production helpers. +const appleMock = vi.hoisted(() => ({ isAvailableAsync: vi.fn() })); vi.mock('expo-apple-authentication', () => ({ AppleAuthenticationScope: { FULL_NAME: 0, EMAIL: 1 }, formatFullName: vi.fn(), signInAsync: vi.fn(), + isAvailableAsync: appleMock.isAvailableAsync, })); vi.mock('@react-native-google-signin/google-signin', () => ({ @@ -126,6 +128,7 @@ const { resolveAdmission } = await import('@/lib/auth/resolve-admission'); const { GOOGLE_WEB_CLIENT_ID } = await import('@/lib/config'); const { toast } = await import('sonner-native'); const { announcingToast } = await import('@/lib/a11y/announcing-toast'); +const { i18n } = await import('@/i18n'); const mockGetAdmission = vi.mocked(getAdmission); @@ -611,6 +614,47 @@ describe('useNativeAuth created-account announcement', () => { }); }); +// ── Signup step-up ────────────────────────────────────────────────────── + +describe('useNativeAuth signup step-up', () => { + beforeEach(() => { + mockGetAdmission.mockResolvedValue(undefined); + }); + + afterEach(() => { + vi.clearAllMocks(); + }); + + // This harness runs as iOS with Google configured; Apple shows when Apple says it is available. + it.each([ + [['google', 'apple'], true, 'authErrors.signupStepUpApple'], + [['google', 'apple'], false, 'authErrors.signupStepUpGoogle'], + [['apple'], false, 'authErrors.signupStepUp'], + [['apple', 'passkey'], true, 'authErrors.signupStepUpApple'], + [undefined, true, 'authErrors.signupStepUp'], + ] as const)( + 'names only an allowed button on this screen: methods %j, Apple shown %s', + async (signupMethods, appleShown, key) => { + appleMock.isAvailableAsync.mockResolvedValue(appleShown); + mockPostAuth.mockResolvedValue({ + ok: false, + errorCode: 'SIGNUP-STEP-UP', + ssoOrganizationId: undefined, + signupMethods: signupMethods && [...signupMethods], + httpStatus: 403, + }); + const resultRef = await mountNativeAuth(); + + await act(async () => { + expect(await resultRef.current?.verifyEmailCode('user@example.com', '123456')).toBe(false); + }); + + expect(toast.error).toHaveBeenCalledWith(i18n.t(key)); + expect(authMock.signIn).not.toHaveBeenCalled(); + } + ); +}); + // ── Passkey sign-in (hook wiring) ─────────────────────────────────────── describe('useNativeAuth passkey sign-in', () => { diff --git a/apps/mobile/src/lib/auth/use-native-auth.ts b/apps/mobile/src/lib/auth/use-native-auth.ts index aa0a94aa900..6e0f01b8eb1 100644 --- a/apps/mobile/src/lib/auth/use-native-auth.ts +++ b/apps/mobile/src/lib/auth/use-native-auth.ts @@ -12,8 +12,8 @@ import { i18n } from '@/i18n'; import { GOOGLE_IOS_CLIENT_ID, GOOGLE_WEB_CLIENT_ID } from '@/lib/config'; import { announcingToast } from '@/lib/a11y/announcing-toast'; import { useAuth } from '@/lib/auth/auth-context'; -import { defaultErrorMessage, mapError } from '@/lib/auth/auth-error-messages'; -import { hasStringCode, postAuth } from '@/lib/auth/auth-fetch'; +import { defaultErrorMessage, mapError, signupStepUpMessage } from '@/lib/auth/auth-error-messages'; +import { hasStringCode, postAuth, type PostAuthFailure } from '@/lib/auth/auth-fetch'; import { buildChallengeEntry, parseEmailCodeResponse, @@ -49,6 +49,22 @@ function ensureGoogleConfigured() { googleSignInConfigured = true; } +/** + * A token-route refusal in the active language. A signup step-up names an allowed Apple or + * Google button only when this screen shows it; the Apple check is the one the screen makes. + */ +async function tokenRefusalMessage( + result: PostAuthFailure, + googleConfigured: boolean +): Promise { + if (result.errorCode !== 'SIGNUP-STEP-UP') { + return mapError(result.errorCode); + } + const apple = + Platform.OS === 'ios' && (await AppleAuthentication.isAvailableAsync().catch(() => false)); + return signupStepUpMessage(result.signupMethods, { apple, google: googleConfigured }); +} + type BusyAction = 'apple' | 'google' | 'passkey' | 'otp-send' | 'otp-verify' | undefined; type NativeAuthResult = { @@ -233,14 +249,14 @@ export function useNativeAuth(): NativeAuthResult { } else if (result.errorCode === 'SSO_ERROR') { handleSsoError(response.data.user.email, result.ssoOrganizationId); } else { - toast.error(mapError(result.errorCode)); + toast.error(await tokenRefusalMessage(result, googleConfigured)); } } catch { toast.error(defaultErrorMessage()); } finally { finishAction('google'); } - }, [finishAction, handleSsoError, signIn, startAction]); + }, [finishAction, googleConfigured, handleSsoError, signIn, startAction]); const signInWithPasskey = useCallback(async () => { if (!startAction('passkey')) { @@ -362,7 +378,7 @@ export function useNativeAuth(): NativeAuthResult { if (result.errorCode === 'SSO_ERROR') { handleSsoError(email, result.ssoOrganizationId); } else { - toast.error(mapError(result.errorCode)); + toast.error(await tokenRefusalMessage(result, googleConfigured)); } return false; } @@ -389,7 +405,7 @@ export function useNativeAuth(): NativeAuthResult { finishAction('otp-verify'); } }, - [finishAction, handleSsoError, signIn, startAction] + [finishAction, googleConfigured, handleSsoError, signIn, startAction] ); return { diff --git a/apps/web/src/app/api/auth/native/token/route.test.ts b/apps/web/src/app/api/auth/native/token/route.test.ts index a4fe6371d6a..408e9af4b5a 100644 --- a/apps/web/src/app/api/auth/native/token/route.test.ts +++ b/apps/web/src/app/api/auth/native/token/route.test.ts @@ -712,6 +712,27 @@ describe('POST /api/auth/native/token', () => { expect(mockReleaseSignInCode).toHaveBeenCalled(); }); + it('returns 403 SIGNUP-STEP-UP with the methods and releases the reservation', async () => { + mockCreateOrUpdateUser.mockResolvedValue({ + success: false, + error: 'SIGNUP-STEP-UP', + methods: ['google', 'apple'], + }); + + const response = await POST( + createRequest({ provider: 'email', email: 'emailuser@example.com', code: '123456' }) + ); + + expect(response.status).toBe(403); + expect(await response.json()).toEqual({ + error: 'SIGNUP-STEP-UP', + methods: ['google', 'apple'], + }); + expect(mockReleaseSignInCode).toHaveBeenCalled(); + expect(mockCommitSignInCode).not.toHaveBeenCalled(); + expect(mockGenerateApiToken).not.toHaveBeenCalled(); + }); + it('releases the code on DIFFERENT-OAUTH settlement failure so retry succeeds', async () => { mockCreateOrUpdateUser.mockResolvedValue({ success: false, @@ -893,6 +914,25 @@ describe('POST /api/auth/native/token', () => { expect(mockGenerateApiToken).not.toHaveBeenCalled(); }); + it('returns 403 SIGNUP-STEP-UP with the methods for a Google signup without credentials', async () => { + mockVerifyNativeGoogleIdToken.mockResolvedValue({ + sub: 'google-sub-1', + email: 'googleuser@example.com', + }); + mockCreateOrUpdateUser.mockResolvedValue({ + success: false, + error: 'SIGNUP-STEP-UP', + methods: ['apple'], + }); + + const response = await POST(createRequest({ provider: 'google', idToken: 'google-id-token' })); + + expect(response.status).toBe(403); + expect(await response.json()).toEqual({ error: 'SIGNUP-STEP-UP', methods: ['apple'] }); + expect(mockGenerateApiToken).not.toHaveBeenCalled(); + expect(mockCreateDeviceSession).not.toHaveBeenCalled(); + }); + it('does not mint a token for an individually blocked user', async () => { mockVerifyNativeGoogleIdToken.mockResolvedValue({ sub: 'google-sub-1', diff --git a/apps/web/src/app/api/auth/native/token/route.ts b/apps/web/src/app/api/auth/native/token/route.ts index 7d096f0dca8..96d34d5a212 100644 --- a/apps/web/src/app/api/auth/native/token/route.ts +++ b/apps/web/src/app/api/auth/native/token/route.ts @@ -21,6 +21,7 @@ import { findUserByNormalizedEmail, findUserIdByAuthProvider, type CreateOrUpdateUserArgs, + type CreateOrUpdateUserResult, } from '@/lib/user'; import { generateApiToken } from '@kilocode/web-shared/lib/tokens'; import { checkDomainSignInEligibility } from '@/lib/auth/email-signin-eligibility'; @@ -65,6 +66,20 @@ function eligibilityResponse( ); } +/** + * A refused user settlement. An unavailable signup is retryable (503); a step-up names the + * sign-in methods that can finish the signup. + */ +function settlementFailureResponse(failure: Extract) { + if (failure.error === 'SIGNUP-STEP-UP') { + return NextResponse.json({ error: failure.error, methods: failure.methods }, { status: 403 }); + } + return NextResponse.json( + { error: failure.error }, + { status: failure.error === 'SIGNUP-UNAVAILABLE' ? 503 : 403 } + ); +} + async function checkExistingProviderAccount( provider: 'apple' | 'google', providerAccountId: string @@ -367,10 +382,7 @@ export const POST = withRestTiming('/api/auth/native/token', async (request: Req ); if (!result.success) { phase = 'release'; - return NextResponse.json( - { error: result.error }, - { status: result.error === 'SIGNUP-UNAVAILABLE' ? 503 : 403 } - ); + return settlementFailureResponse(result); } if (result.user.blocked_reason) { @@ -550,10 +562,7 @@ export const POST = withRestTiming('/api/auth/native/token', async (request: Req true ); if (!result.success) { - return NextResponse.json( - { error: result.error }, - { status: result.error === 'SIGNUP-UNAVAILABLE' ? 503 : 403 } - ); + return settlementFailureResponse(result); } if (result.user.blocked_reason) { diff --git a/apps/web/src/components/auth/AuthErrorNotification.test.ts b/apps/web/src/components/auth/AuthErrorNotification.test.ts index 764a878e746..94bc7703814 100644 --- a/apps/web/src/components/auth/AuthErrorNotification.test.ts +++ b/apps/web/src/components/auth/AuthErrorNotification.test.ts @@ -53,4 +53,20 @@ describe('AuthErrorNotification', () => { expect(html).toContain('Oops! Something went wrong trying to log in.'); expect(html).not.toContain('untrusted-query-error'); }); + + it.each([ + ['google,apple', ['Google', 'Apple'], []], + ['apple', ['Apple'], ['Google']], + ['apple,github,passkey,Apple,x', ['Apple'], ['Google', 'GitHub', 'Passkey', 'x']], + [undefined, [], ['Google', 'Apple']], + ['github', [], ['Google', 'Apple', 'GitHub']], + ])('names only known step-up methods from the query %s', (methods, named, absent) => { + const html = renderToStaticMarkup( + createElement(AuthErrorNotification, { error: 'SIGNUP-STEP-UP', stepUpMethods: methods }) + ); + + expect(html).toContain('role="alert"'); + for (const name of named) expect(html).toContain(name); + for (const name of absent) expect(html).not.toContain(name); + }); }); diff --git a/apps/web/src/components/auth/AuthErrorNotification.tsx b/apps/web/src/components/auth/AuthErrorNotification.tsx index a5509e7bdda..9f23779ae40 100644 --- a/apps/web/src/components/auth/AuthErrorNotification.tsx +++ b/apps/web/src/components/auth/AuthErrorNotification.tsx @@ -3,8 +3,17 @@ import React from 'react'; import { BlockedNotification } from '@/components/auth/BlockedNotification'; import { INLINE_LINK_TOUCH_TARGET } from '@/components/auth/touch-targets'; - -export function AuthErrorNotification({ error }: { error: string }) { +import { getProviderById } from '@/lib/auth/provider-metadata'; +import { parseSignupStepUpMethodsParam } from '@/lib/auth/redirect-urls'; + +export function AuthErrorNotification({ + error, + stepUpMethods, +}: { + error: string; + /** The untrusted `methods` query value that accompanies `SIGNUP-STEP-UP`. */ + stepUpMethods?: string; +}) { if (error === 'BLOCKED') return ; if (error === 'DIFFERENT-OAUTH') @@ -96,6 +105,21 @@ export function AuthErrorNotification({ error }: { error: string }) { ); + if (error === 'SIGNUP-STEP-UP') { + const methodNames = parseSignupStepUpMethodsParam(stepUpMethods).map( + method => getProviderById(method).name + ); + return ( +
+ + {methodNames.length > 0 + ? `To create your account, continue with ${new Intl.ListFormat('en', { type: 'disjunction' }).format(methodNames)}.` + : 'To create your account, continue with a different sign-in method.'} + +
+ ); + } + if (error === 'SIGNUP-UNAVAILABLE') return (
diff --git a/apps/web/src/components/auth/SignInForm.tsx b/apps/web/src/components/auth/SignInForm.tsx index 5a3ddd6a43c..741d13c846a 100644 --- a/apps/web/src/components/auth/SignInForm.tsx +++ b/apps/web/src/components/auth/SignInForm.tsx @@ -20,6 +20,7 @@ import React from 'react'; import type { SignInFormInitialState } from '@/hooks/useSignInFlow'; import { OAuthProviderIds } from '@/lib/auth/provider-metadata'; import { buildEnterpriseSsoHref, buildNormalSignInHref } from '@/lib/auth/sign-in-navigation'; +import { SIGNUP_STEP_UP_METHODS_PARAM } from '@/lib/auth/redirect-urls'; import type { SsoAccountMismatch } from '@/lib/auth/sso-account-mismatch'; import getSignInCallbackUrl from '@/lib/getSignInCallbackUrl'; @@ -78,7 +79,12 @@ export function SignInForm({ ); } - const errorNotification = flow.error ? : null; + const errorNotification = flow.error ? ( + + ) : null; // Turnstile overlay if (flow.showTurnstile) { diff --git a/apps/web/src/components/auth/auth-touch-targets.test.ts b/apps/web/src/components/auth/auth-touch-targets.test.ts index 49f241c372a..d6a630bb31d 100644 --- a/apps/web/src/components/auth/auth-touch-targets.test.ts +++ b/apps/web/src/components/auth/auth-touch-targets.test.ts @@ -319,6 +319,7 @@ describe('sign-in touch targets', () => { 'PROVIDER-ALREADY-LINKED', 'LINKING-FAILED', 'SIGNUP-RATE-LIMITED', + 'SIGNUP-STEP-UP', 'EMAIL-ALREADY-USED', 'EMAIL-MUST-BE-LOWERCASE', 'EMAIL-CANNOT-CONTAIN-PLUS', diff --git a/apps/web/src/hooks/useSignInFlow.ts b/apps/web/src/hooks/useSignInFlow.ts index f6bd259e3d2..5cee37302be 100644 --- a/apps/web/src/hooks/useSignInFlow.ts +++ b/apps/web/src/hooks/useSignInFlow.ts @@ -21,6 +21,7 @@ const callbackAuthErrors = new Set([ 'PROVIDER-ALREADY-LINKED', 'LINKING-FAILED', 'SIGNUP-RATE-LIMITED', + 'SIGNUP-STEP-UP', 'SIGNUP-UNAVAILABLE', 'EMAIL-ALREADY-USED', 'EMAIL-MUST-BE-LOWERCASE', diff --git a/apps/web/src/lib/auth/redirect-urls.test.ts b/apps/web/src/lib/auth/redirect-urls.test.ts index 02872cc35e0..1526596650b 100644 --- a/apps/web/src/lib/auth/redirect-urls.test.ts +++ b/apps/web/src/lib/auth/redirect-urls.test.ts @@ -1,4 +1,9 @@ -import { authFailureRedirectUrl, ssoSignInRedirectUrl } from '@/lib/auth/redirect-urls'; +import { + authFailureRedirectUrl, + parseSignupStepUpMethodsParam, + SIGNUP_STEP_UP_METHODS_PARAM, + ssoSignInRedirectUrl, +} from '@/lib/auth/redirect-urls'; describe('auth redirect URLs', () => { it('does not include email addresses on auth failure redirects', () => { @@ -21,4 +26,26 @@ describe('auth redirect URLs', () => { expect(url).toBe('/users/sign_in?domain=example.com'); expect(new URL(url, 'https://app.kilo.ai').searchParams.has('email')).toBe(false); }); + + it('carries the step-up methods to the sign-in page and back', () => { + const url = authFailureRedirectUrl('SIGNUP-STEP-UP', false, ['google', 'apple']); + const params = new URL(url, 'https://app.kilo.ai').searchParams; + + expect(params.get('error')).toBe('SIGNUP-STEP-UP'); + expect( + parseSignupStepUpMethodsParam(params.get(SIGNUP_STEP_UP_METHODS_PARAM) ?? undefined) + ).toEqual(['google', 'apple']); + expect(authFailureRedirectUrl('SIGNUP-STEP-UP', false)).toBe( + '/users/sign_in?error=SIGNUP-STEP-UP' + ); + }); + + it('keeps only known step-up methods from an untrusted query, in display order', () => { + expect(parseSignupStepUpMethodsParam('apple,github,google,apple,passkey')).toEqual([ + 'google', + 'apple', + ]); + expect(parseSignupStepUpMethodsParam('')).toEqual([]); + expect(parseSignupStepUpMethodsParam(undefined)).toEqual([]); + }); }); diff --git a/apps/web/src/lib/auth/redirect-urls.ts b/apps/web/src/lib/auth/redirect-urls.ts index 4052c1edcee..60c5af3bba3 100644 --- a/apps/web/src/lib/auth/redirect-urls.ts +++ b/apps/web/src/lib/auth/redirect-urls.ts @@ -1,8 +1,29 @@ -import { SSO_SIGNIN_PATH, type AuthErrorType } from '@kilocode/web-shared/lib/auth/constants'; +import { + knownSignupStepUpMethods, + SSO_SIGNIN_PATH, + type AuthErrorType, + type SignupStepUpMethod, +} from '@kilocode/web-shared/lib/auth/constants'; -export function authFailureRedirectUrl(error: AuthErrorType, isAccountLinking: boolean): string { +/** The sign-in query parameter that carries a signup step-up's methods, comma-separated. */ +export const SIGNUP_STEP_UP_METHODS_PARAM = 'methods'; + +export function authFailureRedirectUrl( + error: AuthErrorType, + isAccountLinking: boolean, + stepUpMethods: readonly SignupStepUpMethod[] = [] +): string { const baseUrl = isAccountLinking ? '/connected-accounts' : '/users/sign_in'; - return `${baseUrl}?${new URLSearchParams({ error }).toString()}`; + const params = new URLSearchParams({ error }); + if (stepUpMethods.length > 0) { + params.set(SIGNUP_STEP_UP_METHODS_PARAM, stepUpMethods.join(',')); + } + return `${baseUrl}?${params.toString()}`; +} + +/** The known step-up methods in an untrusted `methods` query value, in display order. */ +export function parseSignupStepUpMethodsParam(value: string | undefined): SignupStepUpMethod[] { + return value ? knownSignupStepUpMethods(value.split(',')) : []; } export function ssoSignInRedirectUrl(domain: string): string { diff --git a/apps/web/src/lib/user/index.test.ts b/apps/web/src/lib/user/index.test.ts index 5477953cc86..e48648c7f05 100644 --- a/apps/web/src/lib/user/index.test.ts +++ b/apps/web/src/lib/user/index.test.ts @@ -978,7 +978,7 @@ describe('User', () => { }); it.each([ 'unknown response', - 'invalid six-flag rejection', + 'invalid nine-flag rejection', 'transport failure', 'HTTP failure', 'invalid JSON', @@ -992,13 +992,13 @@ describe('User', () => { case 'unknown response': fetchMock.mockResolvedValue(Response.json(null)); break; - case 'invalid six-flag rejection': + case 'invalid nine-flag rejection': fetchMock.mockResolvedValue( Response.json({ enforced: true, code: 'signup_rate_limited', retryAfterMs: 1_000, - flags: Array.from({ length: 6 }, () => ({ + flags: Array.from({ length: 9 }, () => ({ name: 'signup:ja4', source: 'ja4', decision: 'throttle', @@ -1111,6 +1111,92 @@ describe('User', () => { } ); + it.each(['email', 'github', 'google'] as const)( + 'returns SIGNUP-STEP-UP for a %s signup without Stripe or user rows', + async provider => { + const email = `bouncer-step-up-${provider}@example.test`; + const providerAccountId = `${provider}-bouncer-step-up`; + mockSignupDecide.mockImplementation(actualSignupDecide); + const fetchMock = jest.spyOn(global, 'fetch').mockResolvedValue( + Response.json({ + enforced: true, + code: 'signup_step_up', + methods: ['apple', 'passkey', 'google'], + flags: [ + { + name: 'signup:domain', + source: 'domain', + decision: 'throttle', + enforced: true, + until: null, + }, + ], + }) + ); + const result = await createOrUpdateUser( + { + google_user_email: email, + google_user_name: 'Step Up', + google_user_image_url: '', + hosted_domain: null, + provider, + provider_account_id: providerAccountId, + }, + undefined, + false, + new Headers({ 'x-forwarded-for': '203.0.113.64' }) + ); + + expect(result).toEqual({ + success: false, + error: 'SIGNUP-STEP-UP', + methods: ['google', 'apple'], + }); + expect(JSON.parse(String(fetchMock.mock.calls[0]?.[1]?.body))).toEqual({ + operationId: expect.stringMatching(/^signup:[a-f0-9]{64}$/), + ip: '203.0.113.64', + method: provider, + emailDomain: 'example.test', + }); + expect(createStripeCustomer).not.toHaveBeenCalled(); + expect(deleteStripeCustomer).not.toHaveBeenCalled(); + expect( + await db.query.kilocode_users.findFirst({ + where: eq(kilocode_users.google_user_email, email), + }) + ).toBeUndefined(); + expect( + await db.query.user_auth_provider.findFirst({ + where: eq(user_auth_provider.provider_account_id, providerAccountId), + }) + ).toBeUndefined(); + } + ); + + it.each([ + ['mail.team.example.test', 'example.test'], + ['x.my.id', 'x.my.id'], + ])('sends the registrable domain of %s as %s', async (host, emailDomain) => { + const result = await createOrUpdateUser( + { + google_user_email: `bouncer-domain@${host}`, + google_user_name: 'Bouncer Domain', + google_user_image_url: '', + hosted_domain: null, + provider: 'email', + provider_account_id: `bouncer-domain@${host}`, + }, + undefined, + false, + new Headers({ 'x-forwarded-for': '203.0.113.65' }) + ); + + expect(result.success).toBe(true); + expect(mockSignupDecide).toHaveBeenCalledWith( + expect.objectContaining({ method: 'email', emailDomain }) + ); + }); + it('propagates a Stripe failure without creating a user', async () => { const email = 'bouncer-stripe-failure@example.com'; const stripeError = new Error('Stripe unavailable'); diff --git a/apps/web/src/lib/user/index.ts b/apps/web/src/lib/user/index.ts index 883566f3769..586af763253 100644 --- a/apps/web/src/lib/user/index.ts +++ b/apps/web/src/lib/user/index.ts @@ -134,7 +134,12 @@ import { } from '@kilocode/db/schema'; import { eq, and, inArray, isNotNull, isNull, sql, or, ne, notExists } from 'drizzle-orm'; import { allow_fake_login, IS_DEVELOPMENT } from '@kilocode/web-shared/lib/constants'; -import type { AuthErrorType } from '@kilocode/web-shared/lib/auth/constants'; +import { + hosted_domain_specials, + knownSignupStepUpMethods, + type AuthErrorType, + type SignupStepUpMethod, +} from '@kilocode/web-shared/lib/auth/constants'; import { shouldAutoProvisionPlatformAdmin } from '@/lib/admin/platform-admin'; import { strict as assert } from 'node:assert'; import type { OptionalError, Result } from '@kilocode/web-shared/lib/maybe-result'; @@ -143,7 +148,6 @@ import type { TRPCError } from '@trpc/server'; import type { UUID } from 'node:crypto'; import { checkDiscordGuildMembership } from '@/lib/integrations/discord-guild-membership'; import type { AuthProviderId } from '@kilocode/db/schema-types'; -import { hosted_domain_specials } from '@kilocode/web-shared/lib/auth/constants'; import * as z from 'zod'; import { generateOpenRouterDownstreamSafetyIdentifier, @@ -154,6 +158,7 @@ import { normalizeEmail } from '@kilocode/web-shared/lib/email-address'; import { normalizeJa4, signupDecide } from '@kilocode/web-shared/lib/bouncer/client'; import { signupOperationId } from '@kilocode/web-shared/lib/bouncer/signup'; import { bareIpLiteral } from '@kilocode/web-shared/lib/bouncer/inference'; +import { getDomain } from 'tldts'; import { authPassesDeletionFence } from '@/lib/user/deletion-queue/deletion-identity-fence'; import { deleteAllOwnedByUserIdPages, @@ -213,7 +218,7 @@ function getSignupIp(requestHeaders?: Headers): string | null { async function checkNormalizedEmailUnique( normalizedEmail: string, tx: DrizzleTransaction -): Promise> { +): Promise> { const [existing] = await tx .select({ id: kilocode_users.id }) .from(kilocode_users) @@ -240,6 +245,24 @@ export type CreateOrUpdateUserArgs = { display_name?: string | null; }; +/** A user settlement error other than a signup step-up, which carries its methods. */ +type UserSettlementError = Exclude; + +/** Bouncer admits this signup only with a stronger sign-in method; nothing was created. */ +export type SignupStepUpFailure = { + success: false; + error: 'SIGNUP-STEP-UP'; + /** The known methods Bouncer admits now, in display order. Empty when it named none we know. */ + methods: SignupStepUpMethod[]; +}; + +export type CreateOrUpdateUserResult = + | Result< + { user: User; isNew: boolean; deferredSignInEvent?: DeferredSignInEvent }, + UserSettlementError + > + | SignupStepUpFailure; + export type CreateOrUpdateUserTrackingContext = { affiliateTouch?: ParsedImpactAffiliateTouch | null; referralTouch?: ParsedImpactReferralTouch | null; @@ -434,9 +457,7 @@ export async function createOrUpdateUser( affiliateTrackingId?: string | null, trackingContext?: CreateOrUpdateUserTrackingContext, deferSignInAnalytics?: boolean -): Promise< - Result<{ user: User; isNew: boolean; deferredSignInEvent?: DeferredSignInEvent }, AuthErrorType> -> { +): Promise { const existingUser = await findAndSyncExistingUser(args); if (existingUser) { if (deferSignInAnalytics) { @@ -591,11 +612,15 @@ export async function createOrUpdateUser( const operationId = signupOperationId(normalizedEmail); const bouncerIp = bareIpLiteral(signupIp ?? undefined); if (!IS_DEVELOPMENT) { + // Subdomains of one registrable domain share Bouncer's domain counter. + const emailHost = normalizedEmail.slice(normalizedEmail.lastIndexOf('@') + 1); const verdict = bouncerIp ? await signupDecide({ operationId, ip: bouncerIp, ja4: normalizeJa4(requestHeaders?.get('x-vercel-ja4-digest')), + method: args.provider, + emailDomain: getDomain(emailHost, { allowPrivateDomains: true }) ?? emailHost, }) : null; console.info('[auth] Bouncer signup admission', { @@ -617,8 +642,14 @@ export async function createOrUpdateUser( operationId, outcome: 'rejected', reason: 'bouncer', + code: verdict.code, }); - return failureResult('SIGNUP-RATE-LIMITED'); + if (verdict.code === 'signup_rate_limited') return failureResult('SIGNUP-RATE-LIMITED'); + return { + success: false, + error: 'SIGNUP-STEP-UP', + methods: knownSignupStepUpMethods(verdict.methods), + } satisfies SignupStepUpFailure; } } const newUserId = turnstile_guid ?? randomUUID(); @@ -661,7 +692,7 @@ export async function createOrUpdateUser( email_domain: extractEmailDomain(args.google_user_email), } satisfies typeof kilocode_users.$inferInsert; - type TxResult = Result<{ user: User }, AuthErrorType>; + type TxResult = Result<{ user: User }, UserSettlementError>; let txResult: TxResult; let caughtError: unknown; try { @@ -765,7 +796,7 @@ export async function createOrUpdateUser( export async function linkAccountToExistingUser( existingKiloUserId: string, authProviderData: CreateOrUpdateUserArgs -): Promise> { +): Promise> { // Verify the existing user exists const existingUser = await findUserById(existingKiloUserId); if (!existingUser) return failureResult('USER-NOT-FOUND'); diff --git a/apps/web/src/lib/user/next-auth-options.ts b/apps/web/src/lib/user/next-auth-options.ts index 6e7d6058393..44e17d81c79 100644 --- a/apps/web/src/lib/user/next-auth-options.ts +++ b/apps/web/src/lib/user/next-auth-options.ts @@ -45,7 +45,7 @@ import type { AccountLinkingSession } from '@/lib/account-linking-session'; import { getAccountLinkingSession } from '@/lib/account-linking-session'; import { linkAccountToExistingUser } from '@/lib/user'; import { whenOk } from '@kilocode/web-shared/lib/maybe-result'; -import type { AuthErrorType } from '@kilocode/web-shared/lib/auth/constants'; +import type { AuthErrorType, SignupStepUpMethod } from '@kilocode/web-shared/lib/auth/constants'; import { hosted_domain_specials } from '@kilocode/web-shared/lib/auth/constants'; import { authFailureRedirectUrl, ssoSignInRedirectUrl } from '@/lib/auth/redirect-urls'; import { isValidCallbackPath } from '@/lib/getSignInCallbackUrl'; @@ -970,9 +970,12 @@ export const authOptions: NextAuthOptions = { let isAccountLinking: boolean | null = null; let linkingSession: AccountLinkingSession | null = null; const redirectContext = await getSignInRedirectContext(); - const redirectUrlForCode = (error: AuthErrorType): string => { + const redirectUrlForCode = ( + error: AuthErrorType, + stepUpMethods?: readonly SignupStepUpMethod[] + ): string => { const redirectUrl = new URL( - authFailureRedirectUrl(error, Boolean(isAccountLinking)), + authFailureRedirectUrl(error, Boolean(isAccountLinking), stepUpMethods), 'http://localhost' ); if (!isAccountLinking) { @@ -1199,6 +1202,7 @@ export const authOptions: NextAuthOptions = { 'PROVIDER-ALREADY-LINKED', 'DIFFERENT-OAUTH', 'SIGNUP-RATE-LIMITED', + 'SIGNUP-STEP-UP', 'EMAIL-ALREADY-USED', ]; @@ -1213,7 +1217,10 @@ export const authOptions: NextAuthOptions = { } ); } - return redirectUrlForCode(result.error); + return redirectUrlForCode( + result.error, + result.error === 'SIGNUP-STEP-UP' ? result.methods : undefined + ); } if (result.user.blocked_reason) { diff --git a/apps/web/src/lib/user/sso.ts b/apps/web/src/lib/user/sso.ts index 79e7812ae80..ad868a71163 100644 --- a/apps/web/src/lib/user/sso.ts +++ b/apps/web/src/lib/user/sso.ts @@ -13,6 +13,7 @@ import { import { createAuditLog } from '@kilocode/web-shared/lib/organizations/organization-audit-logs'; import { sendOrgSSOUserJoinedEmail } from '@kilocode/web-shared/lib/email'; import { SSO_SIGNIN_PATH } from '@kilocode/web-shared/lib/auth/constants'; +import { authFailureRedirectUrl } from '@/lib/auth/redirect-urls'; import { resolveSsoAuthorityForDomain } from '@kilocode/web-shared/lib/organizations/organization-sso-policy'; const workos = new WorkOS(WORKOS_API_KEY); @@ -71,6 +72,9 @@ async function processSSOInternal( trackingContext ); if (!res.success) { + if (res.error === 'SIGNUP-STEP-UP') { + return authFailureRedirectUrl(res.error, false, res.methods); + } if ( res.error === 'SIGNUP-RATE-LIMITED' || res.error === 'SIGNUP-UNAVAILABLE' || diff --git a/packages/web-shared/src/lib/auth/constants.ts b/packages/web-shared/src/lib/auth/constants.ts index d5e5cb1bbe0..ae09408a926 100644 --- a/packages/web-shared/src/lib/auth/constants.ts +++ b/packages/web-shared/src/lib/auth/constants.ts @@ -11,10 +11,24 @@ export type AuthErrorType = | 'INVALID_VERIFICATION' | 'IP_MISMATCH' | 'SIGNUP-RATE-LIMITED' + | 'SIGNUP-STEP-UP' | 'SIGNUP-UNAVAILABLE' | 'EMAIL-ALREADY-USED' | 'SSO_ERROR'; +/** + * The sign-in methods a signup step-up can ask for, in display order. Bouncer may list other + * methods; Cloud shows only these. + */ +export const SIGNUP_STEP_UP_METHODS = ['google', 'apple'] as const; +export type SignupStepUpMethod = (typeof SIGNUP_STEP_UP_METHODS)[number]; + +/** The known step-up methods among `values`, in display order and without duplicates. */ +export function knownSignupStepUpMethods(values: Iterable): SignupStepUpMethod[] { + const present = new Set(values); + return SIGNUP_STEP_UP_METHODS.filter(method => present.has(method)); +} + export const hosted_domain_specials = { non_workspace_google_account: '@@personal@@', anaconda: '@@anaconda@@', diff --git a/packages/web-shared/src/lib/bouncer/client.test.ts b/packages/web-shared/src/lib/bouncer/client.test.ts index 57d9085cca1..3b4f0b7333c 100644 --- a/packages/web-shared/src/lib/bouncer/client.test.ts +++ b/packages/web-shared/src/lib/bouncer/client.test.ts @@ -331,6 +331,74 @@ describe('signupDecide', () => { expect((await signupDecide({ ...request, operationId: 'a'.repeat(128) }))?.enforced).toBe(true); }); + describe('step-up', () => { + const stepUp = { + enforced: true, + code: 'signup_step_up', + methods: ['apple'], + flags: [ + { ...flag, name: 'signup:busy' }, + { ...flag, name: 'signup:domain', source: 'domain' }, + ], + }; + + it('accepts a step-up verdict with the busy and domain flags', async () => { + mockFetch.mockResolvedValue(Response.json(stepUp)); + await expect(signupDecide(request)).resolves.toEqual(stepUp); + }); + + it('accepts eight flags and rejects nine', async () => { + jest.spyOn(console, 'error').mockImplementation(() => undefined); + const flags = (count: number) => Array.from({ length: count }, () => flag); + mockFetch.mockResolvedValueOnce(Response.json({ ...stepUp, flags: flags(8) })); + expect((await signupDecide(request))?.enforced).toBe(true); + mockFetch.mockResolvedValueOnce(Response.json({ ...stepUp, flags: flags(9) })); + await expect(signupDecide(request)).resolves.toBeNull(); + mockFetch.mockResolvedValueOnce( + Response.json({ enforced: false, flags: flags(9).map(f => ({ ...f, enforced: false })) }) + ); + await expect(signupDecide(request)).resolves.toBeNull(); + }); + + it.each([ + ['missing methods', { ...stepUp, methods: undefined }], + ['empty methods', { ...stepUp, methods: [] }], + ['too many methods', { ...stepUp, methods: Array.from({ length: 9 }, () => 'apple') }], + ['uppercase method', { ...stepUp, methods: ['Apple'] }], + ['method with a space', { ...stepUp, methods: ['app le'] }], + ['over-long method', { ...stepUp, methods: ['a'.repeat(33)] }], + ['non-string method', { ...stepUp, methods: [1] }], + ['step-up deadline', { ...stepUp, retryAfterMs: 1 }], + ['rate-limit methods', { ...stepUp, code: 'signup_rate_limited', retryAfterMs: 1 }], + ['shadow step-up', { ...stepUp, enforced: false }], + ])('returns unavailable on %s', async (_name, verdict) => { + jest.spyOn(console, 'error').mockImplementation(() => undefined); + mockFetch.mockResolvedValue(Response.json(verdict)); + await expect(signupDecide(request)).resolves.toBeNull(); + }); + + it('sends the method and normalized email domain', async () => { + mockFetch.mockResolvedValue(Response.json({ enforced: false, flags: [] })); + await signupDecide({ ...request, method: 'email', emailDomain: ' Example.TEST ' }); + expect(lastRequestBody()).toEqual({ + ...request, + method: 'email', + emailDomain: 'example.test', + }); + }); + + it.each([ + { method: 'Email' }, + { method: 'a'.repeat(33) }, + { emailDomain: 'bücher.example.test' }, + { emailDomain: '' }, + ])('omits an invalid step-up field but still asks for admission: %j', async fields => { + mockFetch.mockResolvedValue(Response.json({ enforced: false, flags: [] })); + expect((await signupDecide({ ...request, ...fields }))?.enforced).toBe(false); + expect(lastRequestBody()).toEqual(request); + }); + }); + it('returns unavailable on transport failure', async () => { jest.spyOn(console, 'error').mockImplementation(() => undefined); mockFetch.mockRejectedValue(new TypeError('fetch failed')); diff --git a/packages/web-shared/src/lib/bouncer/client.ts b/packages/web-shared/src/lib/bouncer/client.ts index 6a4ce9b6ae9..decba880f4f 100644 --- a/packages/web-shared/src/lib/bouncer/client.ts +++ b/packages/web-shared/src/lib/bouncer/client.ts @@ -236,10 +236,34 @@ const decideResponseSchema = z.object({ export type DecideResponse = z.infer; export type DecideFlag = DecideResponse['flags'][number]; +/** Bouncer's shape for a signup method (a Cloud `AuthProviderId`) and a step-up method. */ +const SIGNUP_METHOD = /^[a-z0-9-]{1,32}$/; +/** Bouncer's shape for the lowercase domain part of a normalized email. */ +const SIGNUP_EMAIL_DOMAIN = /^[a-z0-9.-]{1,253}$/; +/** Bouncer emits at most 8 signup flags: IP ≤4, domain ≤2, JA4 ≤2, or one ban flag. */ +const MAX_SIGNUP_FLAGS = 8; + +/** + * The optional step-up facts are dropped whole when invalid, like JA4. Without `method`, Bouncer + * applies its method-less policy, which an old Cloud build also gets. + */ const signupRequestSchema = z.strictObject({ operationId: z.string().min(1).max(MAX_ID_LENGTH), ip: z.union([z.ipv4(), z.ipv6()]), ja4: z.string().nullable().optional().transform(normalizeJa4), + method: z + .string() + .nullable() + .optional() + .transform(value => (value && SIGNUP_METHOD.test(value) ? value : undefined)), + emailDomain: z + .string() + .nullable() + .optional() + .transform(value => { + const domain = value?.trim().toLowerCase(); + return domain && SIGNUP_EMAIL_DOMAIN.test(domain) ? domain : undefined; + }), }); export type SignupDecideRequest = z.input; @@ -248,6 +272,8 @@ const signupFlagSchema = z.strictObject({ name: z.enum([ 'signup:burst', 'signup:sustained', + 'signup:busy', + 'signup:domain', 'signup:ja4', 'signup:saturated', 'signup:banned', @@ -258,11 +284,17 @@ const signupFlagSchema = z.strictObject({ source: z.string().max(MAX_ID_LENGTH).optional(), }); -/** Signup requires a validated verdict; an unavailable verdict prevents account creation. */ -const signupResponseSchema = z.discriminatedUnion('enforced', [ +const signupFlagsSchema = z.array(signupFlagSchema).max(MAX_SIGNUP_FLAGS); + +/** + * Signup requires a validated verdict; an unavailable verdict prevents account creation. A + * `signup_step_up` verdict lists the sign-in methods that would be admitted now; callers render + * only the ones they know. + */ +const signupResponseSchema = z.union([ z.strictObject({ enforced: z.literal(false), - flags: z.array(signupFlagSchema).max(5), + flags: signupFlagsSchema, }), z.strictObject({ enforced: z.literal(true), @@ -273,7 +305,13 @@ const signupResponseSchema = z.discriminatedUnion('enforced', [ .nonnegative() // Allow clock and request-order skew beyond the longest supported window. .max(31 * 24 * 60 * 60 * 1000), - flags: z.array(signupFlagSchema).max(5), + flags: signupFlagsSchema, + }), + z.strictObject({ + enforced: z.literal(true), + code: z.literal('signup_step_up'), + methods: z.array(z.string().regex(SIGNUP_METHOD)).min(1).max(8), + flags: signupFlagsSchema, }), ]);