diff --git a/auth/README.md b/auth/README.md
index be8fb1fa7..613569d90 100644
--- a/auth/README.md
+++ b/auth/README.md
@@ -2223,6 +2223,33 @@ Or override individual strings in your `strings.xml`:
```
+### Error message resolution
+
+Error text is chosen when the exception is built, not when the dialog renders it, and it resolves in this order:
+
+1. **The type-level hook**, one `fui_error_*` resource per exception type. These ship **deliberately blank**, and a blank value means "skip me" rather than "show nothing".
+2. **A per-code string**, selected from the Firebase error code, so a mistyped SMS code and a wrong password no longer produce the same sentence.
+3. **The Firebase SDK's own message**, English only, reached only for codes the library does not map.
+
+Setting a type-level hook therefore overrides *every* code of that type at once. That is occasionally what you want — uniform copy resists account enumeration, since distinguishing "no such account" from "wrong password" tells an attacker which addresses are registered — but it costs you the specific per-code messages:
+
+```xml
+
+
+ Those sign-in details aren\'t correct.
+
+```
+
+Developer misconfiguration is handled separately. `AuthException.MisconfigurationException` carries generic translated copy on `message`, and keeps Firebase's diagnostic on `cause` so it reaches your logs without reaching your users:
+
+```kotlin
+is AuthException.MisconfigurationException -> {
+ Log.e(TAG, "Check the Firebase console", exception.cause)
+}
+```
+
+One limit worth knowing: `FirebaseAuthUI.signOut`, `withReauth` and `delete` take a `Context` and no configuration, so their messages resolve against that `Context` rather than a `stringProvider` or `locale` you configured. Pass a locale-aware `Context` if that matters.
+
## Error Handling
FirebaseUI provides a comprehensive exception hierarchy:
diff --git a/auth/src/main/java/com/firebase/ui/auth/AuthException.kt b/auth/src/main/java/com/firebase/ui/auth/AuthException.kt
index 2f61822d6..eefefb00b 100644
--- a/auth/src/main/java/com/firebase/ui/auth/AuthException.kt
+++ b/auth/src/main/java/com/firebase/ui/auth/AuthException.kt
@@ -19,7 +19,9 @@ import com.firebase.ui.auth.AuthException.Companion.from
import com.firebase.ui.auth.configuration.string_provider.AuthUIStringProvider
import com.firebase.ui.auth.configuration.string_provider.DefaultAuthUIStringProvider
import com.google.firebase.FirebaseException
+import com.google.firebase.FirebaseTooManyRequestsException
import com.google.firebase.auth.AuthCredential
+import com.google.firebase.auth.FirebaseAuthActionCodeException
import com.google.firebase.auth.FirebaseAuthException
import com.google.firebase.auth.FirebaseAuthInvalidCredentialsException
import com.google.firebase.auth.FirebaseAuthInvalidUserException
@@ -27,6 +29,7 @@ import com.google.firebase.auth.FirebaseAuthMultiFactorException
import com.google.firebase.auth.FirebaseAuthRecentLoginRequiredException
import com.google.firebase.auth.FirebaseAuthUserCollisionException
import com.google.firebase.auth.FirebaseAuthWeakPasswordException
+import java.util.Locale
/**
* Abstract base class representing all possible authentication exceptions in Firebase Auth UI.
@@ -93,6 +96,26 @@ abstract class AuthException(
cause: Throwable? = null
) : AuthException(message, cause)
+ /**
+ * The account exists, but the sign-in method the user just attempted is not available on it.
+ *
+ * The attempt was well-formed and the backend answered definitively that this method cannot
+ * be used for this account, so the error is not recoverable: the error dialog offers no retry
+ * and the copy points the user at a different way to sign in.
+ *
+ * The type is general, but the copy is not. `ERROR_PASSKEY_ENROLLMENT_NOT_FOUND` is the only
+ * code routed here today and the dialog's fallback for a blank message is `errorPasskeyNotFound`.
+ * Routing a second code here means giving it its own string and making that fallback a
+ * per-method choice.
+ *
+ * @property message The detailed error message
+ * @property cause The underlying [Throwable] that caused this exception
+ */
+ class SignInMethodUnavailableException(
+ message: String,
+ cause: Throwable? = null
+ ) : AuthException(message, cause)
+
/**
* The user account does not exist.
*
@@ -129,11 +152,16 @@ abstract class AuthException(
* This exception is thrown when GIdP password policy enforcement is enabled and the supplied
* password fails one or more configured constraints (e.g. minimum length, missing uppercase).
*
- * [message] is a newline-separated, human-readable description of each failing constraint
- * as returned by the server, suitable for direct display in the UI.
+ * [message] is a newline-separated, human-readable description of each failing constraint,
+ * suitable for direct display in the UI. Built by [from], each constraint is translated copy
+ * where the library recognises the server's sentence, and the server's own English where it
+ * does not.
+ *
+ * [failingRequirements] keeps the **raw** server sentences, untranslated, for hosts that
+ * render the constraints themselves rather than showing [message].
*
- * @property message Human-readable description of the failing constraints
- * @property failingRequirements The individual constraint strings from the server
+ * @property message Translated description of the failing constraints
+ * @property failingRequirements The raw, untranslated constraint strings from the server
* @property cause The underlying [Throwable] that caused this exception
*/
class PasswordPolicyViolationException(
@@ -256,6 +284,27 @@ abstract class AuthException(
cause: Throwable? = null
) : AuthException(message, cause)
+ /**
+ * The Firebase project or the app is not set up for the operation that was attempted.
+ *
+ * Examples are a sign-in provider left disabled in the Firebase console, an unauthorized
+ * continue-URL domain, a missing SHA-1 certificate hash, and the reCAPTCHA and tenant
+ * families. None of these are anything the user can act on.
+ *
+ * [message] is generic translated copy, safe to render anywhere — the error dialog, an inline
+ * error on a screen, or a host's own `onSignInFailure`. The raw Firebase SDK diagnostic is
+ * untranslated but names the actual misconfiguration, so [from] keeps it on [cause] (the
+ * original [com.google.firebase.auth.FirebaseAuthException]): it stays in the stack trace and
+ * is reachable as `exception.cause?.message`.
+ *
+ * @property message Generic translated copy, safe to display
+ * @property cause The original Firebase exception, carrying the raw diagnostic for logs
+ */
+ class MisconfigurationException(
+ message: String,
+ cause: Throwable? = null
+ ) : AuthException(message, cause)
+
/**
* An unknown or unhandled error occurred.
*
@@ -359,14 +408,24 @@ abstract class AuthException(
* This method maps known Firebase exception types to their corresponding [AuthException]
* subtypes, providing a consistent exception hierarchy for error handling.
*
- * **Mapping:**
- * - [FirebaseException] → [NetworkException] (for network-related errors)
- * - [FirebaseAuthInvalidCredentialsException] → [InvalidCredentialsException]
+ * **Mapping**, in dispatch order. Several of these types extend one another, so the order
+ * is load-bearing rather than cosmetic:
+ * - [FirebaseAuthWeakPasswordException] → [WeakPasswordException], or
+ * [PasswordPolicyViolationException] when the diagnostic carries a GIdP password-policy
+ * rejection
+ * - [FirebaseAuthInvalidCredentialsException] → [InvalidCredentialsException], with the
+ * message selected by `errorCode`; the `errorCode`s in that family that are developer
+ * setup faults rather than user error (custom token, OIDC nonce, authenticator
+ * response) → [MisconfigurationException]
* - [FirebaseAuthInvalidUserException] → [UserNotFoundException]
- * - [FirebaseAuthWeakPasswordException] → [WeakPasswordException]
+ * - [FirebaseAuthActionCodeException] → [InvalidCredentialsException]
* - [FirebaseAuthUserCollisionException] → [EmailAlreadyInUseException]
- * - [FirebaseAuthException] with ERROR_TOO_MANY_REQUESTS → [TooManyRequestsException]
* - [FirebaseAuthMultiFactorException] → [MfaRequiredException]
+ * - [FirebaseAuthRecentLoginRequiredException] → [InvalidCredentialsException]
+ * - [FirebaseAuthException] with a developer-setup `errorCode` → [MisconfigurationException]
+ * - [FirebaseTooManyRequestsException] → [TooManyRequestsException]
+ * - [FirebaseException] → [NetworkException] (for network-related errors), or
+ * [PasswordPolicyViolationException] when the message carries a policy rejection
* - Other exceptions → [UnknownException]
*
* **Example:**
@@ -399,8 +458,26 @@ abstract class AuthException(
* [stringProvider] so it honours the host's configured strings and locale.
*
* This is the preferred overload; see the [Context] one above for the exception mapping
- * table and an example. A `null` [stringProvider], or one whose resource for a given error
- * is blank, falls back to the Firebase SDK's own message.
+ * table and an example.
+ *
+ * Given a non-null [stringProvider], the `message` on an exception returned by **this
+ * method** is library-owned translated copy, so it is safe to render directly. Each branch
+ * resolves in this order: the blank-able hook scoped to the exception type, then the
+ * string for the specific Firebase `errorCode`, then the corresponding generic recovery
+ * message, and only then the Firebase SDK's own untranslated message.
+ * [MisconfigurationException] never uses the SDK message at all — the raw diagnostic lives
+ * on `cause`. A `null` [stringProvider] has nothing to resolve against and falls back to
+ * the SDK message everywhere except [MisconfigurationException].
+ * [PasswordPolicyViolationException] is partial by design: each requirement sentence the
+ * backend returns is translated when it is recognised and kept verbatim when it is not.
+ *
+ * The guarantee covers `from()` only. Subtypes constructed directly carry whatever
+ * `message` their caller passed, and the email-link subtypes
+ * ([InvalidEmailLinkException], [EmailLinkWrongDeviceException],
+ * [EmailLinkCrossDeviceLinkingException], [EmailLinkPromptForEmailException],
+ * [EmailLinkDifferentAnonymousUserException], [EmailMismatchException]) bake English into
+ * their own constructors. `getRecoveryMessage` keeps that out of the error dialog by
+ * resolving those types through [AuthUIStringProvider] instead of reading `message`.
*
* @param firebaseException The Firebase exception to convert
* @param stringProvider Supplies localized message text; pass `config.stringProvider`
@@ -419,18 +496,11 @@ abstract class AuthException(
is FirebaseAuthWeakPasswordException -> {
val sourceText = firebaseException.reason ?: firebaseException.message ?: ""
if (sourceText.contains("PASSWORD_DOES_NOT_MEET_REQUIREMENTS", ignoreCase = true)) {
- val requirements = parsePasswordPolicyRequirements(sourceText)
- PasswordPolicyViolationException(
- message = requirements.joinToString("\n").ifEmpty {
- stringProvider?.errorWeakPasswordGeneric.nonEmpty()
- ?: "Password does not meet policy requirements"
- },
- failingRequirements = requirements,
- cause = firebaseException
- )
+ passwordPolicyViolation(sourceText, firebaseException, stringProvider)
} else {
WeakPasswordException(
message = stringProvider?.errorWeakPasswordGeneric.nonEmpty()
+ ?: stringProvider?.weakPasswordRecoveryMessage.nonEmpty()
?: firebaseException.message
?: "Password is too weak",
cause = firebaseException,
@@ -440,18 +510,168 @@ abstract class AuthException(
}
is FirebaseAuthInvalidCredentialsException -> {
- InvalidCredentialsException(
- message = stringProvider?.errorInvalidCredentials.nonEmpty()
- ?: firebaseException.message
- ?: "Invalid credentials provided",
- cause = firebaseException
- )
+ // `errorInvalidCredentials` is the blank-able hook for the whole exception
+ // type, so it stays ahead of the per-code string in every branch.
+ val typeLevel = stringProvider?.errorInvalidCredentials.nonEmpty()
+ when (firebaseException.errorCode) {
+ // Under email enumeration protection the backend merges "wrong password"
+ // and "no such account" into this one code, so the copy cannot claim the
+ // password specifically.
+ "ERROR_INVALID_CREDENTIAL" -> InvalidCredentialsException(
+ message = typeLevel
+ ?: stringProvider?.errorIncorrectEmailOrPassword.nonEmpty()
+ ?: firebaseException.message
+ ?: "That email or password isn't correct",
+ cause = firebaseException
+ )
+
+ "ERROR_WRONG_PASSWORD" -> InvalidCredentialsException(
+ message = typeLevel
+ ?: stringProvider?.invalidPassword.nonEmpty()
+ ?: firebaseException.message
+ ?: "Incorrect password.",
+ cause = firebaseException
+ )
+
+ "ERROR_INVALID_EMAIL" -> InvalidCredentialsException(
+ message = typeLevel
+ ?: stringProvider?.invalidEmailAddress.nonEmpty()
+ ?: firebaseException.message
+ ?: "That email address isn't correct",
+ cause = firebaseException
+ )
+
+ "ERROR_MISSING_EMAIL" -> InvalidCredentialsException(
+ message = typeLevel
+ ?: stringProvider?.missingEmailAddress.nonEmpty()
+ ?: firebaseException.message
+ ?: "Enter your email address to continue",
+ cause = firebaseException
+ )
+
+ "ERROR_MISSING_PASSWORD",
+ "ERROR_MISSING_VERIFICATION_CODE" -> InvalidCredentialsException(
+ message = typeLevel
+ ?: stringProvider?.requiredField.nonEmpty()
+ ?: firebaseException.message
+ ?: "You can't leave this empty.",
+ cause = firebaseException
+ )
+
+ "ERROR_INVALID_PHONE_NUMBER" -> InvalidCredentialsException(
+ message = typeLevel
+ ?: stringProvider?.invalidPhoneNumber.nonEmpty()
+ ?: firebaseException.message
+ ?: "Enter a valid phone number",
+ cause = firebaseException
+ )
+
+ "ERROR_MISSING_PHONE_NUMBER" -> InvalidCredentialsException(
+ message = typeLevel
+ ?: stringProvider?.missingPhoneNumber.nonEmpty()
+ ?: firebaseException.message
+ ?: "You can't leave this empty.",
+ cause = firebaseException
+ )
+
+ "ERROR_INVALID_VERIFICATION_CODE" -> InvalidCredentialsException(
+ message = typeLevel
+ ?: stringProvider?.invalidVerificationCode.nonEmpty()
+ ?: firebaseException.message
+ ?: "Wrong code. Try again.",
+ cause = firebaseException
+ )
+
+ "ERROR_SESSION_EXPIRED" -> InvalidCredentialsException(
+ message = typeLevel
+ ?: stringProvider?.errorSessionExpired.nonEmpty()
+ ?: firebaseException.message
+ ?: "This code is no longer valid",
+ cause = firebaseException
+ )
+
+ "ERROR_INVALID_VERIFICATION_ID",
+ "ERROR_MISSING_VERIFICATION_ID" -> InvalidCredentialsException(
+ message = typeLevel
+ ?: stringProvider?.errorInvalidVerificationId.nonEmpty()
+ ?: firebaseException.message
+ ?: "That verification session is no longer valid. Request a new code.",
+ cause = firebaseException
+ )
+
+ "ERROR_RETRY_PHONE_AUTH" -> InvalidCredentialsException(
+ message = typeLevel
+ ?: stringProvider?.errorRetryPhoneAuth.nonEmpty()
+ ?: firebaseException.message
+ ?: "Phone verification didn't complete. Try again.",
+ cause = firebaseException
+ )
+
+ "ERROR_USER_MISMATCH" -> InvalidCredentialsException(
+ message = typeLevel
+ ?: stringProvider?.errorUserMismatch.nonEmpty()
+ ?: firebaseException.message
+ ?: "Those credentials belong to a different account.",
+ cause = firebaseException
+ )
+
+ "ERROR_PHONE_NUMBER_NOT_FOUND",
+ "ERROR_MULTI_FACTOR_INFO_NOT_FOUND",
+ "ERROR_MISSING_MULTI_FACTOR_INFO" -> InvalidCredentialsException(
+ message = typeLevel
+ ?: stringProvider?.errorPhoneNumberNotEnrolled.nonEmpty()
+ ?: firebaseException.message
+ ?: "That phone number isn't set up for verification on this account.",
+ cause = firebaseException
+ )
+
+ "ERROR_INVALID_MULTI_FACTOR_SESSION",
+ "ERROR_MISSING_MULTI_FACTOR_SESSION" -> InvalidCredentialsException(
+ message = typeLevel
+ ?: stringProvider?.errorMultiFactorSessionExpired.nonEmpty()
+ ?: firebaseException.message
+ ?: "Your sign-in session expired. Sign in again to continue.",
+ cause = firebaseException
+ )
+
+ // Custom tokens are minted by the developer's own backend; the SDK's
+ // diagnostic names the setup problem and means nothing to the user, so it
+ // stays on `cause` while `message` carries renderable generic copy.
+ "ERROR_INVALID_CUSTOM_TOKEN",
+ "ERROR_CUSTOM_TOKEN_MISMATCH",
+ // Same shape: the app built the federated request wrong.
+ "ERROR_MISSING_OR_INVALID_NONCE",
+ "ERROR_INVALID_AUTHENTICATOR_RESPONSE" -> MisconfigurationException(
+ message = stringProvider?.unknownErrorRecoveryMessage.nonEmpty()
+ ?: "An unknown error occurred.",
+ cause = firebaseException
+ )
+
+ // Not InvalidCredentialsException, so its `typeLevel` hook is skipped too.
+ "ERROR_PASSKEY_ENROLLMENT_NOT_FOUND" -> SignInMethodUnavailableException(
+ message = stringProvider?.errorPasskeyNotFound.nonEmpty()
+ ?: firebaseException.message
+ ?: "We couldn't find a passkey for this account. " +
+ "Sign in another way.",
+ cause = firebaseException
+ )
+
+ // Unrecognised codes stay recoverable, but the copy must stay generic.
+ else -> InvalidCredentialsException(
+ message = typeLevel
+ ?: stringProvider?.unknownErrorRecoveryMessage.nonEmpty()
+ ?: firebaseException.message
+ ?: "Invalid credentials provided",
+ cause = firebaseException
+ )
+ }
}
is FirebaseAuthInvalidUserException -> {
when (firebaseException.errorCode) {
"ERROR_USER_NOT_FOUND" -> UserNotFoundException(
message = stringProvider?.errorUserNotFound.nonEmpty()
+ ?: stringProvider?.userNotFoundRecoveryMessage.nonEmpty()
?: firebaseException.message
?: "User not found",
cause = firebaseException
@@ -464,8 +684,18 @@ abstract class AuthException(
cause = firebaseException
)
+ "ERROR_INVALID_USER_TOKEN",
+ "ERROR_USER_TOKEN_EXPIRED" -> InvalidCredentialsException(
+ message = stringProvider?.errorInvalidCredentials.nonEmpty()
+ ?: stringProvider?.errorMultiFactorSessionExpired.nonEmpty()
+ ?: firebaseException.message
+ ?: "Your sign-in session expired. Sign in again to continue.",
+ cause = firebaseException
+ )
+
else -> UserNotFoundException(
message = stringProvider?.errorUserAccountGeneric.nonEmpty()
+ ?: stringProvider?.userNotFoundRecoveryMessage.nonEmpty()
?: firebaseException.message
?: "User account error",
cause = firebaseException
@@ -473,10 +703,36 @@ abstract class AuthException(
}
}
+ // Must precede the plain FirebaseAuthException arm, which it extends.
+ is FirebaseAuthActionCodeException -> {
+ when (firebaseException.errorCode) {
+ // The type-level hook is the one scoped to the exception this produces —
+ // `errorInvalidCredentials`. Using `errorUnknownAuth` here would let a
+ // host customising the unknown-error copy silently lose this string.
+ "ERROR_EXPIRED_ACTION_CODE",
+ "ERROR_INVALID_ACTION_CODE" -> InvalidCredentialsException(
+ message = stringProvider?.errorInvalidCredentials.nonEmpty()
+ ?: stringProvider?.errorActionCodeInvalid.nonEmpty()
+ ?: firebaseException.message
+ ?: "That link is no longer valid. Request a new one.",
+ cause = firebaseException
+ )
+
+ else -> UnknownException(
+ message = stringProvider?.errorUnknownAuth.nonEmpty()
+ ?: stringProvider?.unknownErrorRecoveryMessage.nonEmpty()
+ ?: firebaseException.message
+ ?: "An unknown authentication error occurred",
+ cause = firebaseException
+ )
+ }
+ }
+
is FirebaseAuthUserCollisionException -> {
when (firebaseException.errorCode) {
"ERROR_EMAIL_ALREADY_IN_USE" -> EmailAlreadyInUseException(
message = stringProvider?.errorEmailAlreadyInUse.nonEmpty()
+ ?: stringProvider?.emailAlreadyInUseRecoveryMessage.nonEmpty()
?: firebaseException.message
?: "Email address is already in use",
cause = firebaseException,
@@ -485,6 +741,7 @@ abstract class AuthException(
"ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL" -> AccountLinkingRequiredException(
message = stringProvider?.errorAccountExistsDifferentCredential.nonEmpty()
+ ?: stringProvider?.accountLinkingRequiredRecoveryMessage.nonEmpty()
?: firebaseException.message
?: "Account already exists with different credentials",
cause = firebaseException
@@ -492,6 +749,7 @@ abstract class AuthException(
"ERROR_CREDENTIAL_ALREADY_IN_USE" -> AccountLinkingRequiredException(
message = stringProvider?.errorCredentialAlreadyInUse.nonEmpty()
+ ?: stringProvider?.accountLinkingRequiredRecoveryMessage.nonEmpty()
?: firebaseException.message
?: "Credential is already associated with a different user account",
cause = firebaseException
@@ -499,6 +757,7 @@ abstract class AuthException(
else -> AccountLinkingRequiredException(
message = stringProvider?.errorAccountCollisionGeneric.nonEmpty()
+ ?: stringProvider?.accountLinkingRequiredRecoveryMessage.nonEmpty()
?: firebaseException.message
?: "Account collision error",
cause = firebaseException
@@ -509,6 +768,7 @@ abstract class AuthException(
is FirebaseAuthMultiFactorException -> {
MfaRequiredException(
message = stringProvider?.errorMfaRequiredFallback.nonEmpty()
+ ?: stringProvider?.mfaRequiredRecoveryMessage.nonEmpty()
?: firebaseException.message
?: "Multi-factor authentication required",
cause = firebaseException
@@ -516,8 +776,10 @@ abstract class AuthException(
}
is FirebaseAuthRecentLoginRequiredException -> {
+ // `errorRecentLoginRequired` ships blank; the MFA string says the same thing.
InvalidCredentialsException(
message = stringProvider?.errorRecentLoginRequired.nonEmpty()
+ ?: stringProvider?.mfaErrorRecentLoginRequired.nonEmpty()
?: firebaseException.message
?: "Recent login required for this operation",
cause = firebaseException
@@ -526,23 +788,97 @@ abstract class AuthException(
is FirebaseAuthException -> {
when (firebaseException.errorCode) {
- "ERROR_TOO_MANY_REQUESTS" -> TooManyRequestsException(
- message = stringProvider?.errorTooManyRequests.nonEmpty()
+ // FirebaseAuthWebException code for backing out of the OAuth custom tab,
+ // and the Credential Manager / Play services equivalent.
+ "ERROR_WEB_CONTEXT_CANCELED",
+ "ERROR_USER_CANCELLED" -> AuthCancelledException(
+ message = stringProvider?.errorAuthCancelled.nonEmpty()
+ ?: stringProvider?.authCancelledRecoveryMessage.nonEmpty()
?: firebaseException.message
- ?: "Too many requests. Please try again later",
+ ?: "Authentication was cancelled",
cause = firebaseException
)
- // FirebaseAuthWebException code for backing out of the OAuth custom tab
- "ERROR_WEB_CONTEXT_CANCELED" -> AuthCancelledException(
- message = stringProvider?.errorAuthCancelled.nonEmpty()
+ // These three produce InvalidCredentialsException, so the type-level hook
+ // is `errorInvalidCredentials`. `errorUnknownAuth` would let a host that
+ // customises only the unknown-error copy lose all three specific strings.
+ "ERROR_UNVERIFIED_EMAIL" -> InvalidCredentialsException(
+ message = stringProvider?.errorInvalidCredentials.nonEmpty()
+ ?: stringProvider?.errorUnverifiedEmail.nonEmpty()
?: firebaseException.message
- ?: "Authentication was cancelled",
+ ?: "Verify your email address before you continue.",
+ cause = firebaseException
+ )
+
+ "ERROR_SECOND_FACTOR_ALREADY_ENROLLED" -> InvalidCredentialsException(
+ message = stringProvider?.errorInvalidCredentials.nonEmpty()
+ ?: stringProvider?.errorSecondFactorAlreadyEnrolled.nonEmpty()
+ ?: firebaseException.message
+ ?: "That verification method is already set up on this account.",
+ cause = firebaseException
+ )
+
+ "ERROR_MAXIMUM_SECOND_FACTOR_COUNT_EXCEEDED" -> InvalidCredentialsException(
+ message = stringProvider?.errorInvalidCredentials.nonEmpty()
+ ?: stringProvider?.errorMaximumSecondFactorCountExceeded.nonEmpty()
+ ?: firebaseException.message
+ ?: "You've reached the limit for verification methods on this account.",
+ cause = firebaseException
+ )
+
+ // Developer setup problems. The user can do nothing about any of them, so
+ // `message` carries generic translated copy and the raw Firebase
+ // diagnostic is kept on `cause` for logs. INTERNAL_ERROR and
+ // ERROR_WEB_INTERNAL_ERROR are deliberately absent — they are backend
+ // faults, not configuration.
+ "ERROR_OPERATION_NOT_ALLOWED",
+ "ERROR_APP_NOT_AUTHORIZED",
+ "ERROR_UNAUTHORIZED_DOMAIN",
+ "ERROR_MISSING_CONTINUE_URI",
+ "ERROR_INVALID_CERT_HASH",
+ "ERROR_DYNAMIC_LINK_NOT_ACTIVATED",
+ "ERROR_INVALID_DYNAMIC_LINK_DOMAIN",
+ "ERROR_INVALID_HOSTING_LINK_DOMAIN",
+ "ERROR_INVALID_PROVIDER_ID",
+ "ERROR_ADMIN_RESTRICTED_OPERATION",
+ "ERROR_UNSUPPORTED_FIRST_FACTOR",
+ "ERROR_UNSUPPORTED_PASSTHROUGH_OPERATION",
+ "ERROR_INVALID_REQ_TYPE",
+ "ERROR_WEB_CONTEXT_ALREADY_PRESENTED",
+ // Tenant family
+ "ERROR_INVALID_TENANT_ID",
+ "ERROR_TENANT_ID_MISMATCH",
+ "ERROR_UNSUPPORTED_TENANT_OPERATION",
+ // reCAPTCHA / app verification family
+ "ERROR_RECAPTCHA_NOT_ENABLED",
+ "ERROR_CAPTCHA_CHECK_FAILED",
+ "ERROR_MISSING_RECAPTCHA_TOKEN",
+ "ERROR_INVALID_RECAPTCHA_TOKEN",
+ "ERROR_INVALID_RECAPTCHA_ACTION",
+ "ERROR_MISSING_RECAPTCHA_VERSION",
+ "ERROR_INVALID_RECAPTCHA_VERSION",
+ "ERROR_MISSING_CLIENT_TYPE",
+ "ERROR_MISSING_CLIENT_IDENTIFIER",
+ "ERROR_ALTERNATE_CLIENT_IDENTIFIER_REQUIRED",
+ // Email-template settings in the Firebase console. These arrive as
+ // FirebaseAuthEmailException, which extends FirebaseAuthException
+ // directly and so lands in this arm.
+ "ERROR_INVALID_MESSAGE_PAYLOAD",
+ "ERROR_INVALID_SENDER",
+ "ERROR_INVALID_RECIPIENT_EMAIL",
+ // Host integration and project quota. ERROR_MISSING_ACTIVITY ships: it is
+ // declared on the Recaptcha-activity exception, not in the SDK code table.
+ "ERROR_MISSING_ACTIVITY",
+ "ERROR_WEB_STORAGE_UNSUPPORTED",
+ "ERROR_QUOTA_EXCEEDED" -> MisconfigurationException(
+ message = stringProvider?.unknownErrorRecoveryMessage.nonEmpty()
+ ?: "An unknown error occurred.",
cause = firebaseException
)
else -> UnknownException(
message = stringProvider?.errorUnknownAuth.nonEmpty()
+ ?: stringProvider?.unknownErrorRecoveryMessage.nonEmpty()
?: firebaseException.message
?: "An unknown authentication error occurred",
cause = firebaseException
@@ -550,21 +886,27 @@ abstract class AuthException(
}
}
+ // Rate limiting arrives as a plain FirebaseTooManyRequestsException, which is NOT a
+ // FirebaseAuthException and carries no error code. Without this arm it falls to the
+ // FirebaseException branch below and a throttled user is told they are offline.
+ is FirebaseTooManyRequestsException -> {
+ TooManyRequestsException(
+ message = stringProvider?.errorTooManyRequests.nonEmpty()
+ ?: stringProvider?.tooManyRequestsRecoveryMessage.nonEmpty()
+ ?: firebaseException.message
+ ?: "Too many requests. Please try again later",
+ cause = firebaseException
+ )
+ }
+
is FirebaseException -> {
val msg = firebaseException.message ?: ""
if (msg.contains("PASSWORD_DOES_NOT_MEET_REQUIREMENTS", ignoreCase = true)) {
- val requirements = parsePasswordPolicyRequirements(msg)
- PasswordPolicyViolationException(
- message = requirements.joinToString("\n").ifEmpty {
- stringProvider?.errorWeakPasswordGeneric.nonEmpty()
- ?: "Password does not meet policy requirements"
- },
- failingRequirements = requirements,
- cause = firebaseException
- )
+ passwordPolicyViolation(msg, firebaseException, stringProvider)
} else {
NetworkException(
message = stringProvider?.errorNetworkGeneric.nonEmpty()
+ ?: stringProvider?.networkErrorRecoveryMessage.nonEmpty()
?: msg.ifEmpty { "Network error occurred" },
cause = firebaseException
)
@@ -577,6 +919,7 @@ abstract class AuthException(
) {
AuthCancelledException(
message = stringProvider?.errorAuthCancelled.nonEmpty()
+ ?: stringProvider?.authCancelledRecoveryMessage.nonEmpty()
?: firebaseException.message
?: "Authentication was cancelled",
cause = firebaseException
@@ -584,6 +927,7 @@ abstract class AuthException(
} else {
UnknownException(
message = stringProvider?.errorUnknownAuth.nonEmpty()
+ ?: stringProvider?.unknownErrorRecoveryMessage.nonEmpty()
?: firebaseException.message
?: "An unknown error occurred",
cause = firebaseException
@@ -595,6 +939,89 @@ abstract class AuthException(
private fun String?.nonEmpty(): String? = this?.ifEmpty { null }
+ /**
+ * Builds the [PasswordPolicyViolationException] for a GIdP password-policy rejection:
+ * `message` is localized one requirement sentence at a time, while `failingRequirements`
+ * keeps the backend's raw sentences.
+ */
+ private fun passwordPolicyViolation(
+ sourceText: String,
+ cause: Exception,
+ stringProvider: AuthUIStringProvider?
+ ): PasswordPolicyViolationException {
+ val requirements = parsePasswordPolicyRequirements(sourceText)
+ return PasswordPolicyViolationException(
+ message = requirements
+ .joinToString("\n") { localizePasswordRequirement(it, stringProvider) ?: it }
+ .ifEmpty {
+ // `errorWeakPasswordGeneric` is the host's hook and ships blank.
+ stringProvider?.errorWeakPasswordGeneric.nonEmpty()
+ ?: stringProvider?.errorPasswordPolicyGeneric.nonEmpty()
+ ?: "Password does not meet policy requirements"
+ },
+ failingRequirements = requirements,
+ cause = cause
+ )
+ }
+
+ /**
+ * Translates one GIdP password-policy requirement sentence, or returns `null` when the
+ * sentence is not recognised.
+ *
+ * The sentences are the backend's own English, e.g. "Password must contain at least 10
+ * characters". On `null` the caller keeps that sentence verbatim, so a reworded or newly
+ * added requirement degrades to untranslated English rather than to a wrong message.
+ */
+ private fun localizePasswordRequirement(
+ requirement: String,
+ stringProvider: AuthUIStringProvider?
+ ): String? {
+ if (stringProvider == null) return null
+ // GIdP writes "upper case" and "lower case" as two words; one word is accepted too.
+ val text = requirement.lowercase(Locale.ROOT)
+ return when {
+ text.contains("upper case") || text.contains("uppercase") ->
+ stringProvider.passwordMissingUppercase.nonEmpty()
+
+ text.contains("lower case") || text.contains("lowercase") ->
+ stringProvider.passwordMissingLowercase.nonEmpty()
+
+ // "numeric" is a substring of "non-alphanumeric": the guard keeps the two arms
+ // disjoint regardless of the order they are tested in.
+ text.contains("numeric") && !text.contains("non-alphanumeric") ->
+ stringProvider.passwordMissingDigit.nonEmpty()
+
+ // Unverified wording: the probe project had special characters disabled.
+ text.contains("non-alphanumeric") || text.contains("special character") ->
+ stringProvider.passwordMissingSpecialCharacter.nonEmpty()
+
+ // The number is the project's own configured minimum, so it is read out of the
+ // sentence rather than assumed.
+ text.contains("at least") ->
+ firstNumberIn(requirement)?.let {
+ stringProvider.passwordTooShort(it).nonEmpty()
+ }
+
+ // "fewer than N" is exclusive, so the maximum passwordTooLong states is N - 1.
+ // Unverified wording: the probe project left the maximum at its 4096 default.
+ text.contains("fewer than") ->
+ firstNumberIn(requirement)?.let {
+ stringProvider.passwordTooLong(it - 1).nonEmpty()
+ }
+
+ // "at most N" and "no more than N" are inclusive, so N is the maximum as written.
+ text.contains("at most") || text.contains("no more than") ->
+ firstNumberIn(requirement)?.let {
+ stringProvider.passwordTooLong(it).nonEmpty()
+ }
+
+ else -> null
+ }
+ }
+
+ private fun firstNumberIn(text: String): Int? =
+ Regex("\\d+").find(text)?.value?.toIntOrNull()
+
// Finds the [...] content that immediately follows PASSWORD_DOES_NOT_MEET_REQUIREMENTS
// in both FirebaseException and FirebaseAuthWeakPasswordException messages.
// GIdP returns human-readable requirement strings inside those brackets, e.g.
diff --git a/auth/src/main/java/com/firebase/ui/auth/configuration/string_provider/AuthUIStringProvider.kt b/auth/src/main/java/com/firebase/ui/auth/configuration/string_provider/AuthUIStringProvider.kt
index 7e1c3698d..58d0e4b79 100644
--- a/auth/src/main/java/com/firebase/ui/auth/configuration/string_provider/AuthUIStringProvider.kt
+++ b/auth/src/main/java/com/firebase/ui/auth/configuration/string_provider/AuthUIStringProvider.kt
@@ -184,6 +184,9 @@ interface AuthUIStringProvider {
/** Error message when password doesn't meet minimum length requirement. Should support string formatting with minimum length parameter. */
fun passwordTooShort(minimumLength: Int): String
+ /** Error message when the password is longer than the maximum length allowed. Should support string formatting with maximum length parameter. */
+ fun passwordTooLong(maximumLength: Int): String
+
/** Error message when password is missing at least one uppercase letter (A-Z) */
val passwordMissingUppercase: String
@@ -628,4 +631,62 @@ interface AuthUIStringProvider {
/** Error when authentication is cancelled. Return empty to use the Firebase SDK message. */
val errorAuthCancelled: String
+
+ // =============================================================================================
+ // AuthException messages selected by Firebase Auth error code
+ //
+ // Every member below has a default so that adding one is not a breaking change, and each
+ // default delegates to a coarser member rather than returning a hardcoded English literal —
+ // a host that has implemented this interface itself keeps getting its own translated copy.
+ // =============================================================================================
+
+ /** Error when sign-in fails and the server will not say whether the email or the password was wrong. */
+ val errorIncorrectEmailOrPassword: String get() = errorInvalidCredentials
+
+ /** Error when the SMS verification session is gone and a new code has to be requested. */
+ val errorInvalidVerificationId: String get() = errorInvalidCredentials
+
+ /** Error when phone verification did not complete and has to be retried. */
+ val errorRetryPhoneAuth: String get() = errorInvalidCredentials
+
+ /** Error when the supplied credentials belong to a different account than the one being confirmed. */
+ val errorUserMismatch: String get() = errorUnknownAuth
+
+ /** Error when the phone number is not set up as a verification method on the account. */
+ val errorPhoneNumberNotEnrolled: String get() = errorInvalidCredentials
+
+ /** Error when a sign-in or verification session has expired. */
+ val errorSessionExpired: String get() = errorInvalidCredentials
+
+ /** Error when the sign-in session expired part-way through two-step verification. */
+ val errorMultiFactorSessionExpired: String get() = errorSessionExpired
+
+ /** Error when an emailed sign-in or password reset link has expired or is malformed. */
+ val errorActionCodeInvalid: String get() = errorInvalidCredentials
+
+ /** Error when the account email has to be verified before the operation can continue. */
+ val errorUnverifiedEmail: String get() = errorUnknownAuth
+
+ /** Error when adding a verification method that is already set up on the account. */
+ val errorSecondFactorAlreadyEnrolled: String get() = errorUnknownAuth
+
+ /** Error when the account already has the maximum number of verification methods. */
+ val errorMaximumSecondFactorCountExceeded: String get() = errorUnknownAuth
+
+ /**
+ * Error when the password fails the project's password policy and the server named no
+ * individual requirement. When the server does name them, each one is rendered through
+ * [passwordTooShort], [passwordTooLong], [passwordMissingUppercase],
+ * [passwordMissingLowercase], [passwordMissingDigit] and [passwordMissingSpecialCharacter]
+ * instead, and this string is not used.
+ */
+ val errorPasswordPolicyGeneric: String get() = errorWeakPasswordGeneric
+
+ /**
+ * Error when the account has no passkey enrolled and the user has to sign in another way.
+ *
+ * Defaults to [errorUnknownAuth], not [errorInvalidCredentials]: this message is shown for a
+ * non-recoverable error, so the dialog offers no retry and credential copy would contradict it.
+ */
+ val errorPasskeyNotFound: String get() = errorUnknownAuth
}
diff --git a/auth/src/main/java/com/firebase/ui/auth/configuration/string_provider/DefaultAuthUIStringProvider.kt b/auth/src/main/java/com/firebase/ui/auth/configuration/string_provider/DefaultAuthUIStringProvider.kt
index e25776a76..70c4f9aae 100644
--- a/auth/src/main/java/com/firebase/ui/auth/configuration/string_provider/DefaultAuthUIStringProvider.kt
+++ b/auth/src/main/java/com/firebase/ui/auth/configuration/string_provider/DefaultAuthUIStringProvider.kt
@@ -155,6 +155,9 @@ class DefaultAuthUIStringProvider(
override fun passwordTooShort(minimumLength: Int): String =
localizedContext.getString(R.string.fui_error_password_too_short, minimumLength)
+ override fun passwordTooLong(maximumLength: Int): String =
+ localizedContext.getString(R.string.fui_error_password_too_long, maximumLength)
+
override val passwordMissingUppercase: String
get() = localizedContext.getString(R.string.fui_error_password_missing_uppercase)
override val passwordMissingLowercase: String
@@ -567,4 +570,43 @@ class DefaultAuthUIStringProvider(
override val errorAuthCancelled: String
get() = localizedContext.getString(R.string.fui_error_auth_cancelled)
+
+ override val errorIncorrectEmailOrPassword: String
+ get() = localizedContext.getString(R.string.fui_error_incorrect_email_or_password)
+
+ override val errorInvalidVerificationId: String
+ get() = localizedContext.getString(R.string.fui_error_invalid_verification_id)
+
+ override val errorRetryPhoneAuth: String
+ get() = localizedContext.getString(R.string.fui_error_retry_phone_auth)
+
+ override val errorUserMismatch: String
+ get() = localizedContext.getString(R.string.fui_error_user_mismatch)
+
+ override val errorPhoneNumberNotEnrolled: String
+ get() = localizedContext.getString(R.string.fui_error_phone_number_not_enrolled)
+
+ override val errorSessionExpired: String
+ get() = localizedContext.getString(R.string.fui_error_session_expired)
+
+ override val errorMultiFactorSessionExpired: String
+ get() = localizedContext.getString(R.string.fui_error_multi_factor_session_expired)
+
+ override val errorActionCodeInvalid: String
+ get() = localizedContext.getString(R.string.fui_error_action_code_invalid)
+
+ override val errorUnverifiedEmail: String
+ get() = localizedContext.getString(R.string.fui_error_unverified_email)
+
+ override val errorSecondFactorAlreadyEnrolled: String
+ get() = localizedContext.getString(R.string.fui_error_second_factor_already_enrolled)
+
+ override val errorMaximumSecondFactorCountExceeded: String
+ get() = localizedContext.getString(R.string.fui_error_maximum_second_factor_count_exceeded)
+
+ override val errorPasswordPolicyGeneric: String
+ get() = localizedContext.getString(R.string.fui_error_password_policy_generic)
+
+ override val errorPasskeyNotFound: String
+ get() = localizedContext.getString(R.string.fui_error_passkey_not_found)
}
diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/components/ErrorRecoveryDialog.kt b/auth/src/main/java/com/firebase/ui/auth/ui/components/ErrorRecoveryDialog.kt
index ddb18c642..2b4e90a76 100644
--- a/auth/src/main/java/com/firebase/ui/auth/ui/components/ErrorRecoveryDialog.kt
+++ b/auth/src/main/java/com/firebase/ui/auth/ui/components/ErrorRecoveryDialog.kt
@@ -143,19 +143,27 @@ internal fun getRecoveryMessage(
stringProvider: AuthUIStringProvider
): String {
return when (error) {
- is AuthException.NetworkException -> stringProvider.networkErrorRecoveryMessage
+ // AuthException.from already puts generic translated copy on the message and keeps the
+ // raw diagnostic on the cause, so this arm is belt-and-braces: an instance constructed
+ // directly with a raw diagnostic still cannot leak it into the dialog.
+ is AuthException.MisconfigurationException -> stringProvider.unknownErrorRecoveryMessage
+ is AuthException.NetworkException ->
+ error.message?.takeIf { it.isNotBlank() } ?: stringProvider.networkErrorRecoveryMessage
is AuthException.InvalidCredentialsException -> {
- // Use the actual error message from Firebase if available, otherwise fallback to generic message
- error.message?.takeIf { it.isNotBlank() && it != "Invalid credentials provided" }
+ // AuthException.from now picks library-owned copy per Firebase error code, so the
+ // message is the specific one; the generic string is only the empty-message fallback.
+ error.message?.takeIf { it.isNotBlank() }
?: stringProvider.invalidCredentialsRecoveryMessage
}
- is AuthException.UserNotFoundException -> stringProvider.userNotFoundRecoveryMessage
+ is AuthException.SignInMethodUnavailableException ->
+ // Passkey-specific fallback behind a general type — see the exception's KDoc.
+ error.message?.takeIf { it.isNotBlank() } ?: stringProvider.errorPasskeyNotFound
+ is AuthException.UserNotFoundException ->
+ error.message?.takeIf { it.isNotBlank() } ?: stringProvider.userNotFoundRecoveryMessage
is AuthException.WeakPasswordException -> {
- // Include specific reason if available
- val baseMessage = stringProvider.weakPasswordRecoveryMessage
- error.reason?.let { reason ->
- "$baseMessage\n\nReason: $reason"
- } ?: baseMessage
+ // `error.reason` is untranslated SDK text, so it is deliberately not appended.
+ error.message?.takeIf { it.isNotBlank() }
+ ?: stringProvider.weakPasswordRecoveryMessage
}
is AuthException.PasswordPolicyViolationException -> {
@@ -165,24 +173,30 @@ internal fun getRecoveryMessage(
is AuthException.EmailAlreadyInUseException -> {
// Include email if available
- val baseMessage = stringProvider.emailAlreadyInUseRecoveryMessage
+ val baseMessage = error.message?.takeIf { it.isNotBlank() }
+ ?: stringProvider.emailAlreadyInUseRecoveryMessage
error.email?.let { email ->
"$baseMessage ($email)"
} ?: baseMessage
}
- is AuthException.TooManyRequestsException -> stringProvider.tooManyRequestsRecoveryMessage
+ is AuthException.TooManyRequestsException ->
+ error.message?.takeIf { it.isNotBlank() }
+ ?: stringProvider.tooManyRequestsRecoveryMessage
is AuthException.PhoneVerificationCooldownException -> {
// Use the custom message which includes remaining cooldown time
- error.message ?: stringProvider.unknownErrorRecoveryMessage
+ error.message?.takeIf { it.isNotBlank() } ?: stringProvider.unknownErrorRecoveryMessage
}
- is AuthException.MfaRequiredException -> stringProvider.mfaRequiredRecoveryMessage
+ is AuthException.MfaRequiredException ->
+ error.message?.takeIf { it.isNotBlank() } ?: stringProvider.mfaRequiredRecoveryMessage
is AuthException.AccountLinkingRequiredException -> {
// Use the custom message which includes email and provider details
- error.message ?: stringProvider.accountLinkingRequiredRecoveryMessage
+ error.message?.takeIf { it.isNotBlank() }
+ ?: stringProvider.accountLinkingRequiredRecoveryMessage
}
is AuthException.DifferentSignInMethodRequiredException -> {
- error.message ?: stringProvider.accountLinkingRequiredRecoveryMessage
+ error.message?.takeIf { it.isNotBlank() }
+ ?: stringProvider.accountLinkingRequiredRecoveryMessage
}
is AuthException.EmailMismatchException -> stringProvider.emailMismatchMessage
is AuthException.InvalidEmailLinkException -> stringProvider.emailLinkInvalidLinkMessage
@@ -194,7 +208,8 @@ internal fun getRecoveryMessage(
val providerName = error.providerName ?: stringProvider.emailProvider
stringProvider.emailLinkCrossDeviceLinkingMessage(providerName)
}
- is AuthException.AuthCancelledException -> stringProvider.authCancelledRecoveryMessage
+ is AuthException.AuthCancelledException ->
+ error.message?.takeIf { it.isNotBlank() } ?: stringProvider.authCancelledRecoveryMessage
is AuthException.UnknownException -> {
// Use custom message if available (e.g., for configuration errors)
error.message?.takeIf { it.isNotBlank() } ?: stringProvider.unknownErrorRecoveryMessage
@@ -214,6 +229,7 @@ internal fun getRecoveryActionText(
error: AuthException,
stringProvider: AuthUIStringProvider
): String {
+ if (!isRecoverable(error)) return stringProvider.dismissAction
return when (error) {
is AuthException.AuthCancelledException -> stringProvider.continueText
is AuthException.EmailAlreadyInUseException -> stringProvider.signInDefault // Use existing "Sign in" text
@@ -224,14 +240,11 @@ internal fun getRecoveryActionText(
is AuthException.EmailLinkPromptForEmailException -> stringProvider.continueText
is AuthException.EmailLinkCrossDeviceLinkingException -> stringProvider.continueText
is AuthException.EmailLinkWrongDeviceException -> stringProvider.continueText
- is AuthException.EmailLinkDifferentAnonymousUserException -> stringProvider.dismissAction
is AuthException.UserNotFoundException -> stringProvider.signupPageTitle // Navigate to sign-up when user not found
is AuthException.NetworkException,
is AuthException.InvalidCredentialsException,
is AuthException.WeakPasswordException,
- is AuthException.PasswordPolicyViolationException,
- is AuthException.TooManyRequestsException,
- is AuthException.PhoneVerificationCooldownException -> stringProvider.retryAction
+ is AuthException.PasswordPolicyViolationException -> stringProvider.retryAction
is AuthException.UnknownException -> stringProvider.retryAction
else -> stringProvider.retryAction
@@ -262,6 +275,9 @@ internal fun isRecoverable(error: AuthException): Boolean {
is AuthException.EmailLinkCrossDeviceLinkingException -> true
is AuthException.EmailLinkWrongDeviceException -> true
is AuthException.EmailLinkDifferentAnonymousUserException -> false
+ is AuthException.MisconfigurationException -> false // Retrying cannot fix project setup
+ // The method is not available on this account; repeating it cannot change that.
+ is AuthException.SignInMethodUnavailableException -> false
is AuthException.UnknownException -> true
else -> true
}
diff --git a/auth/src/main/res/values-ar/strings.xml b/auth/src/main/res/values-ar/strings.xml
index 8367da375..8176f916d 100755
--- a/auth/src/main/res/values-ar/strings.xml
+++ b/auth/src/main/res/values-ar/strings.xml
@@ -100,7 +100,7 @@
تمّ التحقّق تلقائيًا من رقم الهاتف.
إعادة إرسال الرمز
تأكيد ملكية رقم الهاتف
- Use a different phone number
+ استخدام رقم هاتف آخر
عند النقر على “%1$s”، قد يتمّ إرسال رسالة قصيرة SMS وقد يتمّ تطبيق رسوم الرسائل والبيانات.
يشير النقر على "%1$s" إلى موافقتك على %2$s و%3$s. وقد يتمّ إرسال رسالة قصيرة كما قد تنطبق رسوم الرسائل والبيانات.
خطأ في المصادقة
@@ -175,4 +175,17 @@
المصادقة متعددة العوامل معطلة حاليًا
+ البريد الإلكتروني أو كلمة المرور غير صحيحة
+ لم تعد جلسة التحقق هذه صالحة. اطلب رمزًا جديدًا.
+ لم تكتمل عملية التحقق من رقم الهاتف. أعد المحاولة.
+ بيانات الاعتماد هذه تخص حسابًا آخر.
+ رقم الهاتف هذا غير مُعدّ للتحقق في هذا الحساب.
+ انتهت صلاحية جلسة تسجيل الدخول. سجِّل الدخول مرة أخرى للمتابعة.
+ لم يعد هذا الرابط صالحًا. اطلب رابطًا جديدًا.
+ تحقَّق من عنوان بريدك الإلكتروني قبل المتابعة.
+ طريقة التحقق هذه مُعدّة بالفعل في هذا الحساب.
+ لقد وصلت إلى الحد الأقصى لطرق التحقق في هذا الحساب.
+ كلمة المرور لا تستوفي المتطلبات. جرِّب كلمة مرور أخرى.
+ كلمة المرور طويلة جدًا. الحد الأقصى للطول هو %1$d.
+ تعذّر العثور على مفتاح مرور لهذا الحساب. سجِّل الدخول بطريقة أخرى.
diff --git a/auth/src/main/res/values-b+es+419/strings.xml b/auth/src/main/res/values-b+es+419/strings.xml
index 6039dc47f..b8910f3bc 100755
--- a/auth/src/main/res/values-b+es+419/strings.xml
+++ b/auth/src/main/res/values-b+es+419/strings.xml
@@ -100,7 +100,7 @@
Se verificó automáticamente el número de teléfono
Reenviar código
Verificar número de teléfono
- Use a different phone number
+ Usar otro número de teléfono
Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos.
Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos.
Error de autenticación
@@ -110,17 +110,17 @@
La autenticación fue cancelada. Vuelva a intentarlo cuando esté listo.
- Choose Authentication Method
- Set Up SMS Verification
- Set Up Authenticator App
- Verify Your Code
+ Elige el método de autenticación
+ Configurar verificación por SMS
+ Configurar aplicación de autenticación
+ Verifica tu código
- Select a second authentication method to secure your account
- Enter your phone number to receive verification codes
- Scan the QR code with your authenticator app
- Enter the code sent to your phone
- Enter the code from your authenticator app
- Enter your verification code
+ Selecciona un segundo método de autenticación para proteger tu cuenta
+ Introduce tu número de teléfono para recibir códigos de verificación
+ Escanea el código QR con tu aplicación de autenticación
+ Introduce el código enviado a tu teléfono
+ Introduce el código de tu aplicación de autenticación
+ Introduce tu código de verificación
Confirmar contraseña
Las contraseñas no coinciden
@@ -192,5 +192,18 @@
Reautenticar
- Multi-factor authentication is currently disabled
+ La autenticación multifactor está actualmente desactivada
+ El correo electrónico o la contraseña no son correctos
+ Esta sesión de verificación ya no es válida. Solicita un código nuevo.
+ No se completó la verificación telefónica. Vuelve a intentarlo.
+ Estas credenciales pertenecen a otra cuenta.
+ Este número de teléfono no está configurado para la verificación en esta cuenta.
+ Tu sesión expiró. Vuelve a acceder para continuar.
+ Este vínculo ya no es válido. Solicita uno nuevo.
+ Verifica tu dirección de correo electrónico antes de continuar.
+ Este método de verificación ya está configurado en esta cuenta.
+ Alcanzaste el límite de métodos de verificación de esta cuenta.
+ Tu contraseña no cumple con los requisitos. Prueba con otra.
+ La contraseña es demasiado larga. La longitud máxima es %1$d.
+ No encontramos una llave de acceso para esta cuenta. Accede de otra manera.
diff --git a/auth/src/main/res/values-bg/strings.xml b/auth/src/main/res/values-bg/strings.xml
index 479a68143..2246e4bf5 100755
--- a/auth/src/main/res/values-bg/strings.xml
+++ b/auth/src/main/res/values-bg/strings.xml
@@ -100,7 +100,7 @@
Телефонният номер е потвърден автоматично
Повторно изпращане на кода
Потвърждаване на телефонния номер
- Use a different phone number
+ Използване на друг телефонен номер
Докосвайки „%1$s“, може да получите SMS съобщение. То може да се таксува по тарифите за данни и SMS.
Докосвайки „%1$s", приемате нашите %2$s и %3$s. Възможно е да получите SMS съобщение. То може да се таксува по тарифите за данни и SMS.
Грешка при удостоверяване
@@ -175,4 +175,17 @@
Многофакторната автентификация в момента е деактивирана
+ Имейл адресът или паролата не са правилни
+ Тази сесия за потвърждаване вече не е валидна. Заявете нов код.
+ Потвърждаването по телефон не завърши. Опитайте отново.
+ Тези идентификационни данни принадлежат на друг профил.
+ Този телефонен номер не е настроен за потвърждаване в този профил.
+ Сесията ви за вход изтече. Влезте отново, за да продължите.
+ Тази връзка вече не е валидна. Заявете нова.
+ Потвърдете имейл адреса си, преди да продължите.
+ Този метод за потвърждаване вече е настроен в този профил.
+ Достигнахте ограничението за методи за потвърждаване в този профил.
+ Паролата ви не отговаря на изискванията. Опитайте с друга.
+ Паролата е твърде дълга. Максималната дължина е %1$d.
+ Не намерихме код за достъп за този профил. Влезте по друг начин.
diff --git a/auth/src/main/res/values-bn/strings.xml b/auth/src/main/res/values-bn/strings.xml
index 6b0870da6..d7af9ef9b 100755
--- a/auth/src/main/res/values-bn/strings.xml
+++ b/auth/src/main/res/values-bn/strings.xml
@@ -100,15 +100,15 @@
ফোন নম্বরটি নিজে থেকে যাচাই করা হয়েছে
কোডটি আবার পাঠান
ফোন নম্বর যাচাই করুন
- Use a different phone number
+ অন্য একটি ফোন নম্বর ব্যবহার করুন
%1$s এ ট্যাপ করলে আপনি একটি এসএমএস পাঠাতে পারেন। মেসেজ ও ডেটার চার্জ প্রযোজ্য।
“%1$s” বোতামে ট্যাপ করার অর্থ, আপনি আমাদের %2$s এবং %3$s-এর সাথে সম্মত। একটি এসএমএস পাঠানো হতে পারে। মেসেজ এবং ডেটার উপরে প্রযোজ্য চার্জ লাগতে পারে।
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ প্রমাণীকরণ সংক্রান্ত সমস্যা
+ আবার চেষ্টা করুন
+ অতিরিক্ত যাচাইকরণ প্রয়োজন। অনুগ্রহ করে মাল্টি-ফ্যাক্টর প্রমাণীকরণ সম্পূর্ণ করুন।
+ অ্যাকাউন্ট লিঙ্ক করা প্রয়োজন। অনুগ্রহ করে অন্য কোনও সাইন-ইন পদ্ধতি ব্যবহার করে দেখুন।
+ প্রমাণীকরণ বাতিল করা হয়েছে। আপনি প্রস্তুত হলে আবার চেষ্টা করুন।
প্রমাণীকরণ পদ্ধতি চয়ন করুন
@@ -176,4 +176,17 @@
মাল্টি-ফ্যাক্টর প্রমাণীকরণ বর্তমানে নিষ্ক্রিয়
+ ইমেল বা পাসওয়ার্ড সঠিক নয়
+ এই যাচাইকরণ সেশনটি আর বৈধ নেই। নতুন কোডের জন্য অনুরোধ করুন।
+ ফোন যাচাইকরণ সম্পূর্ণ হয়নি। আবার চেষ্টা করুন।
+ এই ক্রেডেনশিয়াল অন্য একটি অ্যাকাউন্টের।
+ এই অ্যাকাউন্টে যাচাইকরণের জন্য এই ফোন নম্বরটি সেট আপ করা নেই।
+ আপনার সাইন-ইন সেশনের মেয়াদ শেষ হয়ে গেছে। চালিয়ে যেতে আবার সাইন-ইন করুন।
+ এই লিঙ্কটি আর বৈধ নয়। নতুন একটির জন্য অনুরোধ করুন।
+ চালিয়ে যাওয়ার আগে আপনার ইমেল অ্যাড্রেস যাচাই করুন।
+ এই যাচাইকরণ পদ্ধতিটি এই অ্যাকাউন্টে ইতিমধ্যেই সেট আপ করা আছে।
+ এই অ্যাকাউন্টে যাচাইকরণ পদ্ধতির সীমায় আপনি পৌঁছে গেছেন।
+ আপনার পাসওয়ার্ড প্রয়োজনীয় শর্ত পূরণ করে না। অন্য একটি পাসওয়ার্ড ব্যবহার করুন।
+ পাসওয়ার্ড খুব বড়। সর্বাধিক দৈর্ঘ্য হল %1$d।
+ এই অ্যাকাউন্টের জন্য পাসকী খুঁজে পাওয়া যায়নি। অন্য উপায়ে সাইন-ইন করুন।
diff --git a/auth/src/main/res/values-ca/strings.xml b/auth/src/main/res/values-ca/strings.xml
index e457554c9..5cae80a87 100755
--- a/auth/src/main/res/values-ca/strings.xml
+++ b/auth/src/main/res/values-ca/strings.xml
@@ -100,15 +100,15 @@
El número de telèfon s\'ha verificat automàticament
Torna a enviar el codi
Verifica el número de telèfon
- Use a different phone number
+ Utilitza un altre número de telèfon
En tocar %1$s, és possible que s\'enviï un SMS. Es poden aplicar tarifes de dades i missatges.
En tocar %1$s, acceptes les nostres %2$s i la nostra %3$s. És possible que s\'enviï un SMS. Es poden aplicar tarifes de dades i missatges.
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ Error d\'autenticació
+ Torna-ho a provar
+ Cal una verificació addicional. Completeu l\'autenticació multifactor.
+ Cal enllaçar el compte. Proveu un altre mètode d\'inici de sessió.
+ L\'autenticació s\'ha cancel·lat. Torneu-ho a provar quan estigueu a punt.
Trieu el mètode d\'autenticació
@@ -176,4 +176,17 @@
L\'autenticació multifactor està desactivada actualment
+ Aquest correu electrònic o aquesta contrasenya no són correctes
+ Aquesta sessió de verificació ja no és vàlida. Sol·licita un codi nou.
+ La verificació per telèfon no s\'ha completat. Torna-ho a provar.
+ Aquestes credencials pertanyen a un altre compte.
+ Aquest número de telèfon no està configurat per a la verificació en aquest compte.
+ La teva sessió ha caducat. Torna a iniciar la sessió per continuar.
+ Aquest enllaç ja no és vàlid. Sol·licita\'n un de nou.
+ Verifica la teva adreça electrònica abans de continuar.
+ Aquest mètode de verificació ja està configurat en aquest compte.
+ Has assolit el límit de mètodes de verificació d\'aquest compte.
+ La teva contrasenya no compleix els requisits. Prova\'n una altra.
+ La contrasenya és massa llarga. La longitud màxima és %1$d.
+ No hem trobat cap clau d\'accés per a aquest compte. Inicia la sessió d\'una altra manera.
diff --git a/auth/src/main/res/values-cs/strings.xml b/auth/src/main/res/values-cs/strings.xml
index 64e5b18c1..8912523b9 100755
--- a/auth/src/main/res/values-cs/strings.xml
+++ b/auth/src/main/res/values-cs/strings.xml
@@ -100,7 +100,7 @@
Telefonní číslo bylo automaticky ověřeno
Znovu poslat kód
Ověřit telefonní číslo
- Use a different phone number
+ Použít jiné telefonní číslo
Po klepnutí na možnost %1$s může být odeslána SMS. Mohou být účtovány poplatky za zprávy a data.
Klepnutím na tlačítko %1$s vyjadřujete svůj souhlas s dokumenty %2$s a %3$s. Může být odeslána SMS a mohou být účtovány poplatky za zprávy a data.
Chyba ověření
@@ -175,4 +175,17 @@
Vícefaktorové ověřování je aktuálně zakázáno
+ E-mail nebo heslo nejsou správné
+ Tato ověřovací relace už není platná. Vyžádejte si nový kód.
+ Ověření telefonu se nedokončilo. Zkuste to znovu.
+ Tyto přihlašovací údaje patří k jinému účtu.
+ Toto telefonní číslo není u tohoto účtu nastaveno pro ověřování.
+ Platnost vašeho přihlášení vypršela. Pokračujte opětovným přihlášením.
+ Tento odkaz už není platný. Vyžádejte si nový.
+ Před pokračováním ověřte svou e-mailovou adresu.
+ Tento způsob ověření je u tohoto účtu už nastavený.
+ Dosáhli jste limitu způsobů ověření pro tento účet.
+ Vaše heslo nesplňuje požadavky. Zkuste jiné.
+ Heslo je příliš dlouhé. Maximální délka je %1$d.
+ Pro tento účet jsme nenašli žádný přístupový klíč. Přihlaste se jiným způsobem.
diff --git a/auth/src/main/res/values-da/strings.xml b/auth/src/main/res/values-da/strings.xml
index 52c217d8a..72d1d31a9 100755
--- a/auth/src/main/res/values-da/strings.xml
+++ b/auth/src/main/res/values-da/strings.xml
@@ -100,7 +100,7 @@
Telefonnummeret blev bekræftet automatisk
Send koden igen
Bekræft telefonnummer
- Use a different phone number
+ Brug et andet telefonnummer
Når du trykker på “%1$s”, sendes der måske en sms. Der opkræves muligvis gebyrer for beskeder og data.
Når du trykker på "%1$s", indikerer du, at du accepterer vores %2$s og %3$s. Der sendes måske en sms. Der opkræves muligvis gebyrer for beskeder og data.
Godkendelsesfejl
@@ -175,4 +175,17 @@
Multifaktorgodkendelse er i øjeblikket deaktiveret
+ Mailadressen eller adgangskoden er ikke korrekt
+ Denne bekræftelsessession er ikke længere gyldig. Anmod om en ny kode.
+ Telefonbekræftelsen blev ikke fuldført. Prøv igen.
+ Disse loginoplysninger tilhører en anden konto.
+ Dette telefonnummer er ikke konfigureret til bekræftelse på denne konto.
+ Din loginsession er udløbet. Log ind igen for at fortsætte.
+ Dette link er ikke længere gyldigt. Anmod om et nyt.
+ Bekræft din mailadresse, før du fortsætter.
+ Denne bekræftelsesmetode er allerede konfigureret på denne konto.
+ Du har nået grænsen for bekræftelsesmetoder på denne konto.
+ Din adgangskode opfylder ikke kravene. Prøv en anden.
+ Adgangskoden er for lang. Den maksimale længde er %1$d.
+ Vi kunne ikke finde en adgangsnøgle til denne konto. Log ind på en anden måde.
diff --git a/auth/src/main/res/values-de-rAT/strings.xml b/auth/src/main/res/values-de-rAT/strings.xml
index ce10dd5d0..1df316df2 100755
--- a/auth/src/main/res/values-de-rAT/strings.xml
+++ b/auth/src/main/res/values-de-rAT/strings.xml
@@ -100,14 +100,14 @@
Telefonnummer wurde automatisch bestätigt
Code erneut senden
Telefonnummer bestätigen
- Use a different phone number
+ Eine andere Telefonnummer verwenden
Wenn Sie auf “%1$s” tippen, erhalten Sie möglicherweise eine SMS. Es können Gebühren für SMS und Datenübertragung anfallen.
Indem Sie auf “%1$s” tippen, stimmen Sie unseren %2$s und unserer %3$s zu. Sie erhalten möglicherweise eine SMS und es können Gebühren für die Nachricht und die Datenübertragung anfallen.
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ Authentifizierungsfehler
+ Erneut versuchen
+ Zusätzliche Verifizierung erforderlich. Bitte schließen Sie die Multi-Faktor-Authentifizierung ab.
+ Das Konto muss verknüpft werden. Bitte versuchen Sie eine andere Anmeldemethode.
+ Die Authentifizierung wurde abgebrochen. Bitte versuchen Sie es erneut, wenn Sie bereit sind.
Authentifizierungsmethode auswählen
@@ -193,4 +193,17 @@
Die Multi-Faktor-Authentifizierung ist derzeit deaktiviert
+ E-Mail-Adresse oder Passwort ist nicht korrekt
+ Diese Bestätigungssitzung ist nicht mehr gültig. Fordern Sie einen neuen Code an.
+ Die Telefonbestätigung wurde nicht abgeschlossen. Versuchen Sie es erneut.
+ Diese Anmeldedaten gehören zu einem anderen Konto.
+ Diese Telefonnummer ist für dieses Konto nicht zur Bestätigung eingerichtet.
+ Ihre Anmeldesitzung ist abgelaufen. Melden Sie sich erneut an, um fortzufahren.
+ Dieser Link ist nicht mehr gültig. Fordern Sie einen neuen an.
+ Bestätigen Sie Ihre E-Mail-Adresse, bevor Sie fortfahren.
+ Diese Bestätigungsmethode ist für dieses Konto bereits eingerichtet.
+ Sie haben die maximale Anzahl an Bestätigungsmethoden für dieses Konto erreicht.
+ Ihr Passwort erfüllt die Anforderungen nicht. Versuchen Sie es mit einem anderen.
+ Das Passwort ist zu lang. Die maximale Länge beträgt %1$d.
+ Für dieses Konto wurde kein Passkey gefunden. Melden Sie sich auf andere Weise an.
diff --git a/auth/src/main/res/values-de-rCH/strings.xml b/auth/src/main/res/values-de-rCH/strings.xml
index f2b070a17..3b84b2818 100755
--- a/auth/src/main/res/values-de-rCH/strings.xml
+++ b/auth/src/main/res/values-de-rCH/strings.xml
@@ -100,15 +100,15 @@
Telefonnummer wurde automatisch bestätigt
Code erneut senden
Telefonnummer bestätigen
- Use a different phone number
+ Eine andere Telefonnummer verwenden
Wenn Sie auf “%1$s” tippen, erhalten Sie möglicherweise eine SMS. Es können Gebühren für SMS und Datenübertragung anfallen.
Indem Sie auf “%1$s” tippen, stimmen Sie unseren %2$s und unserer %3$s zu. Sie erhalten möglicherweise eine SMS und es können Gebühren für die Nachricht und die Datenübertragung anfallen.
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ Authentifizierungsfehler
+ Erneut versuchen
+ Zusätzliche Verifizierung erforderlich. Bitte schließen Sie die Multi-Faktor-Authentifizierung ab.
+ Das Konto muss verknüpft werden. Bitte versuchen Sie eine andere Anmeldemethode.
+ Die Authentifizierung wurde abgebrochen. Bitte versuchen Sie es erneut, wenn Sie bereit sind.
Authentifizierungsmethode auswählen
@@ -194,4 +194,17 @@
Die Multi-Faktor-Authentifizierung ist derzeit deaktiviert
+ E-Mail-Adresse oder Passwort ist nicht korrekt
+ Diese Bestätigungssitzung ist nicht mehr gültig. Fordern Sie einen neuen Code an.
+ Die Telefonbestätigung wurde nicht abgeschlossen. Versuchen Sie es erneut.
+ Diese Anmeldedaten gehören zu einem anderen Konto.
+ Diese Telefonnummer ist für dieses Konto nicht zur Bestätigung eingerichtet.
+ Ihre Anmeldesitzung ist abgelaufen. Melden Sie sich erneut an, um fortzufahren.
+ Dieser Link ist nicht mehr gültig. Fordern Sie einen neuen an.
+ Bestätigen Sie Ihre E-Mail-Adresse, bevor Sie fortfahren.
+ Diese Bestätigungsmethode ist für dieses Konto bereits eingerichtet.
+ Sie haben die maximale Anzahl an Bestätigungsmethoden für dieses Konto erreicht.
+ Ihr Passwort erfüllt die Anforderungen nicht. Versuchen Sie es mit einem anderen.
+ Das Passwort ist zu lang. Die maximale Länge beträgt %1$d.
+ Für dieses Konto wurde kein Passkey gefunden. Melden Sie sich auf andere Weise an.
diff --git a/auth/src/main/res/values-de/strings.xml b/auth/src/main/res/values-de/strings.xml
index 9fe8f66f8..74b54f72f 100755
--- a/auth/src/main/res/values-de/strings.xml
+++ b/auth/src/main/res/values-de/strings.xml
@@ -100,7 +100,7 @@
Telefonnummer wurde automatisch bestätigt
Code erneut senden
Telefonnummer bestätigen
- Use a different phone number
+ Eine andere Telefonnummer verwenden
Wenn Sie auf “%1$s” tippen, erhalten Sie möglicherweise eine SMS. Es können Gebühren für SMS und Datenübertragung anfallen.
Indem Sie auf "%1$s" tippen, stimmen Sie unseren %2$s und unserer %3$s zu. Sie erhalten möglicherweise eine SMS und es können Gebühren für die Nachricht und die Datenübertragung anfallen.
Authentifizierungsfehler
@@ -193,4 +193,17 @@
Die Multi-Faktor-Authentifizierung ist derzeit deaktiviert
+ E-Mail-Adresse oder Passwort ist nicht korrekt
+ Diese Bestätigungssitzung ist nicht mehr gültig. Fordern Sie einen neuen Code an.
+ Die Telefonbestätigung wurde nicht abgeschlossen. Versuchen Sie es erneut.
+ Diese Anmeldedaten gehören zu einem anderen Konto.
+ Diese Telefonnummer ist für dieses Konto nicht zur Bestätigung eingerichtet.
+ Ihre Anmeldesitzung ist abgelaufen. Melden Sie sich erneut an, um fortzufahren.
+ Dieser Link ist nicht mehr gültig. Fordern Sie einen neuen an.
+ Bestätigen Sie Ihre E-Mail-Adresse, bevor Sie fortfahren.
+ Diese Bestätigungsmethode ist für dieses Konto bereits eingerichtet.
+ Sie haben die maximale Anzahl an Bestätigungsmethoden für dieses Konto erreicht.
+ Ihr Passwort erfüllt die Anforderungen nicht. Versuchen Sie es mit einem anderen.
+ Das Passwort ist zu lang. Die maximale Länge beträgt %1$d.
+ Für dieses Konto wurde kein Passkey gefunden. Melden Sie sich auf andere Weise an.
diff --git a/auth/src/main/res/values-el/strings.xml b/auth/src/main/res/values-el/strings.xml
index 0854ec409..1c2a2eb70 100755
--- a/auth/src/main/res/values-el/strings.xml
+++ b/auth/src/main/res/values-el/strings.xml
@@ -100,15 +100,15 @@
Ο αριθμός τηλεφώνου επαληθεύτηκε αυτόματα
Επανάληψη αποστολής κωδικού
Επαλήθευση αριθμού τηλεφώνου
- Use a different phone number
+ Χρήση διαφορετικού αριθμού τηλεφώνου
Αν πατήσετε “%1$s”, μπορεί να σταλεί ένα SMS. Ενδέχεται να ισχύουν χρεώσεις μηνυμάτων και δεδομένων.
Αν πατήσετε “%1$s”, δηλώνετε ότι αποδέχεστε τους %2$s και την %3$s. Μπορεί να σταλεί ένα SMS. Ενδέχεται να ισχύουν χρεώσεις μηνυμάτων και δεδομένων.
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ Σφάλμα ελέγχου ταυτότητας
+ Δοκιμάστε ξανά
+ Απαιτείται πρόσθετη επαλήθευση. Ολοκληρώστε τον έλεγχο ταυτότητας πολλαπλών παραγόντων.
+ Ο λογαριασμός πρέπει να συνδεθεί. Δοκιμάστε διαφορετική μέθοδο σύνδεσης.
+ Ο έλεγχος ταυτότητας ακυρώθηκε. Δοκιμάστε ξανά όταν είστε έτοιμοι.
Επιλέξτε μέθοδο ελέγχου ταυτότητας
@@ -176,4 +176,17 @@
Ο έλεγχος ταυτότητας πολλαπλών παραγόντων είναι απενεργοποιημένος προς το παρόν
+ Το ηλεκτρονικό ταχυδρομείο ή ο κωδικός πρόσβασης δεν είναι σωστά
+ Αυτή η περίοδος επαλήθευσης δεν είναι πλέον έγκυρη. Ζητήστε νέο κωδικό.
+ Η επαλήθευση τηλεφώνου δεν ολοκληρώθηκε. Δοκιμάστε ξανά.
+ Αυτά τα διαπιστευτήρια ανήκουν σε διαφορετικό λογαριασμό.
+ Αυτός ο αριθμός τηλεφώνου δεν έχει ρυθμιστεί για επαλήθευση σε αυτόν τον λογαριασμό.
+ Η περίοδος σύνδεσής σας έληξε. Συνδεθείτε ξανά για να συνεχίσετε.
+ Αυτός ο σύνδεσμος δεν είναι πλέον έγκυρος. Ζητήστε νέον.
+ Επαληθεύστε τη διεύθυνση ηλεκτρονικού ταχυδρομείου σας πριν συνεχίσετε.
+ Αυτή η μέθοδος επαλήθευσης έχει ήδη ρυθμιστεί σε αυτόν τον λογαριασμό.
+ Έχετε φτάσει το όριο μεθόδων επαλήθευσης για αυτόν τον λογαριασμό.
+ Ο κωδικός πρόσβασής σας δεν πληροί τις προϋποθέσεις. Δοκιμάστε έναν άλλον.
+ Ο κωδικός πρόσβασης είναι πολύ μεγάλος. Το μέγιστο μήκος είναι %1$d.
+ Δεν βρέθηκε κλειδί πρόσβασης για αυτόν τον λογαριασμό. Συνδεθείτε με άλλον τρόπο.
diff --git a/auth/src/main/res/values-en-rAU/strings.xml b/auth/src/main/res/values-en-rAU/strings.xml
index 7f8dab7e6..ae438e6b1 100755
--- a/auth/src/main/res/values-en-rAU/strings.xml
+++ b/auth/src/main/res/values-en-rAU/strings.xml
@@ -175,4 +175,17 @@
Multi-factor authentication is currently disabled
+ That email or password isn\'t correct
+ That verification session is no longer valid. Request a new code.
+ Phone verification didn\'t complete. Try again.
+ Those credentials belong to a different account.
+ That phone number isn\'t set up for verification on this account.
+ Your sign-in session expired. Sign in again to continue.
+ That link is no longer valid. Request a new one.
+ Verify your email address before you continue.
+ That verification method is already set up on this account.
+ You\'ve reached the limit for verification methods on this account.
+ Your password doesn\'t meet the requirements. Try a different one.
+ Password is too long. The maximum length is %1$d.
+ We couldn\'t find a passkey for this account. Sign in another way.
diff --git a/auth/src/main/res/values-en-rCA/strings.xml b/auth/src/main/res/values-en-rCA/strings.xml
index 2476ca4b8..cab0bf53b 100755
--- a/auth/src/main/res/values-en-rCA/strings.xml
+++ b/auth/src/main/res/values-en-rCA/strings.xml
@@ -175,4 +175,17 @@
Multi-factor authentication is currently disabled
+ That email or password isn\'t correct
+ That verification session is no longer valid. Request a new code.
+ Phone verification didn\'t complete. Try again.
+ Those credentials belong to a different account.
+ That phone number isn\'t set up for verification on this account.
+ Your sign-in session expired. Sign in again to continue.
+ That link is no longer valid. Request a new one.
+ Verify your email address before you continue.
+ That verification method is already set up on this account.
+ You\'ve reached the limit for verification methods on this account.
+ Your password doesn\'t meet the requirements. Try a different one.
+ Password is too long. The maximum length is %1$d.
+ We couldn\'t find a passkey for this account. Sign in another way.
diff --git a/auth/src/main/res/values-en-rGB/strings.xml b/auth/src/main/res/values-en-rGB/strings.xml
index 8c1909362..62d7a8a3c 100755
--- a/auth/src/main/res/values-en-rGB/strings.xml
+++ b/auth/src/main/res/values-en-rGB/strings.xml
@@ -175,4 +175,17 @@
Multi-factor authentication is currently disabled
+ That email or password isn\'t correct
+ That verification session is no longer valid. Request a new code.
+ Phone verification didn\'t complete. Try again.
+ Those credentials belong to a different account.
+ That phone number isn\'t set up for verification on this account.
+ Your sign-in session expired. Sign in again to continue.
+ That link is no longer valid. Request a new one.
+ Verify your email address before you continue.
+ That verification method is already set up on this account.
+ You\'ve reached the limit for verification methods on this account.
+ Your password doesn\'t meet the requirements. Try a different one.
+ Password is too long. The maximum length is %1$d.
+ We couldn\'t find a passkey for this account. Sign in another way.
diff --git a/auth/src/main/res/values-en-rIE/strings.xml b/auth/src/main/res/values-en-rIE/strings.xml
index ee4d48e58..894fc6a86 100755
--- a/auth/src/main/res/values-en-rIE/strings.xml
+++ b/auth/src/main/res/values-en-rIE/strings.xml
@@ -168,4 +168,17 @@
Multi-factor authentication is currently disabled
+ That email or password isn\'t correct
+ That verification session is no longer valid. Request a new code.
+ Phone verification didn\'t complete. Try again.
+ Those credentials belong to a different account.
+ That phone number isn\'t set up for verification on this account.
+ Your sign-in session expired. Sign in again to continue.
+ That link is no longer valid. Request a new one.
+ Verify your email address before you continue.
+ That verification method is already set up on this account.
+ You\'ve reached the limit for verification methods on this account.
+ Your password doesn\'t meet the requirements. Try a different one.
+ Password is too long. The maximum length is %1$d.
+ We couldn\'t find a passkey for this account. Sign in another way.
diff --git a/auth/src/main/res/values-en-rIN/strings.xml b/auth/src/main/res/values-en-rIN/strings.xml
index ee4d48e58..894fc6a86 100755
--- a/auth/src/main/res/values-en-rIN/strings.xml
+++ b/auth/src/main/res/values-en-rIN/strings.xml
@@ -168,4 +168,17 @@
Multi-factor authentication is currently disabled
+ That email or password isn\'t correct
+ That verification session is no longer valid. Request a new code.
+ Phone verification didn\'t complete. Try again.
+ Those credentials belong to a different account.
+ That phone number isn\'t set up for verification on this account.
+ Your sign-in session expired. Sign in again to continue.
+ That link is no longer valid. Request a new one.
+ Verify your email address before you continue.
+ That verification method is already set up on this account.
+ You\'ve reached the limit for verification methods on this account.
+ Your password doesn\'t meet the requirements. Try a different one.
+ Password is too long. The maximum length is %1$d.
+ We couldn\'t find a passkey for this account. Sign in another way.
diff --git a/auth/src/main/res/values-en-rSG/strings.xml b/auth/src/main/res/values-en-rSG/strings.xml
index ee4d48e58..894fc6a86 100755
--- a/auth/src/main/res/values-en-rSG/strings.xml
+++ b/auth/src/main/res/values-en-rSG/strings.xml
@@ -168,4 +168,17 @@
Multi-factor authentication is currently disabled
+ That email or password isn\'t correct
+ That verification session is no longer valid. Request a new code.
+ Phone verification didn\'t complete. Try again.
+ Those credentials belong to a different account.
+ That phone number isn\'t set up for verification on this account.
+ Your sign-in session expired. Sign in again to continue.
+ That link is no longer valid. Request a new one.
+ Verify your email address before you continue.
+ That verification method is already set up on this account.
+ You\'ve reached the limit for verification methods on this account.
+ Your password doesn\'t meet the requirements. Try a different one.
+ Password is too long. The maximum length is %1$d.
+ We couldn\'t find a passkey for this account. Sign in another way.
diff --git a/auth/src/main/res/values-en-rZA/strings.xml b/auth/src/main/res/values-en-rZA/strings.xml
index ee4d48e58..894fc6a86 100755
--- a/auth/src/main/res/values-en-rZA/strings.xml
+++ b/auth/src/main/res/values-en-rZA/strings.xml
@@ -168,4 +168,17 @@
Multi-factor authentication is currently disabled
+ That email or password isn\'t correct
+ That verification session is no longer valid. Request a new code.
+ Phone verification didn\'t complete. Try again.
+ Those credentials belong to a different account.
+ That phone number isn\'t set up for verification on this account.
+ Your sign-in session expired. Sign in again to continue.
+ That link is no longer valid. Request a new one.
+ Verify your email address before you continue.
+ That verification method is already set up on this account.
+ You\'ve reached the limit for verification methods on this account.
+ Your password doesn\'t meet the requirements. Try a different one.
+ Password is too long. The maximum length is %1$d.
+ We couldn\'t find a passkey for this account. Sign in another way.
diff --git a/auth/src/main/res/values-es-rAR/strings.xml b/auth/src/main/res/values-es-rAR/strings.xml
index 6e6ec2194..57ea7fdeb 100755
--- a/auth/src/main/res/values-es-rAR/strings.xml
+++ b/auth/src/main/res/values-es-rAR/strings.xml
@@ -100,7 +100,7 @@
Se verificó automáticamente el número de teléfono
Reenviar código
Verificar número de teléfono
- Use a different phone number
+ Usar otro número de teléfono
Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos.
Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos.
Error de autenticación
@@ -186,4 +186,17 @@
La autenticación multifactor está actualmente desactivada
+ El correo electrónico o la contraseña no son correctos
+ Esta sesión de verificación ya no es válida. Solicita un código nuevo.
+ No se completó la verificación telefónica. Vuelve a intentarlo.
+ Estas credenciales pertenecen a otra cuenta.
+ Este número de teléfono no está configurado para la verificación en esta cuenta.
+ Tu sesión expiró. Vuelve a acceder para continuar.
+ Este vínculo ya no es válido. Solicita uno nuevo.
+ Verifica tu dirección de correo electrónico antes de continuar.
+ Este método de verificación ya está configurado en esta cuenta.
+ Alcanzaste el límite de métodos de verificación de esta cuenta.
+ Tu contraseña no cumple con los requisitos. Prueba con otra.
+ La contraseña es demasiado larga. La longitud máxima es %1$d.
+ No encontramos una llave de acceso para esta cuenta. Accede de otra manera.
diff --git a/auth/src/main/res/values-es-rBO/strings.xml b/auth/src/main/res/values-es-rBO/strings.xml
index f95dda99e..ae7e28c3c 100755
--- a/auth/src/main/res/values-es-rBO/strings.xml
+++ b/auth/src/main/res/values-es-rBO/strings.xml
@@ -100,7 +100,7 @@
Se verificó automáticamente el número de teléfono
Reenviar código
Verificar número de teléfono
- Use a different phone number
+ Usar otro número de teléfono
Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos.
Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos.
Error de autenticación
@@ -186,4 +186,17 @@
La autenticación multifactor está actualmente desactivada
+ El correo electrónico o la contraseña no son correctos
+ Esta sesión de verificación ya no es válida. Solicita un código nuevo.
+ No se completó la verificación telefónica. Vuelve a intentarlo.
+ Estas credenciales pertenecen a otra cuenta.
+ Este número de teléfono no está configurado para la verificación en esta cuenta.
+ Tu sesión expiró. Vuelve a acceder para continuar.
+ Este vínculo ya no es válido. Solicita uno nuevo.
+ Verifica tu dirección de correo electrónico antes de continuar.
+ Este método de verificación ya está configurado en esta cuenta.
+ Alcanzaste el límite de métodos de verificación de esta cuenta.
+ Tu contraseña no cumple con los requisitos. Prueba con otra.
+ La contraseña es demasiado larga. La longitud máxima es %1$d.
+ No encontramos una llave de acceso para esta cuenta. Accede de otra manera.
diff --git a/auth/src/main/res/values-es-rCL/strings.xml b/auth/src/main/res/values-es-rCL/strings.xml
index f95dda99e..ae7e28c3c 100755
--- a/auth/src/main/res/values-es-rCL/strings.xml
+++ b/auth/src/main/res/values-es-rCL/strings.xml
@@ -100,7 +100,7 @@
Se verificó automáticamente el número de teléfono
Reenviar código
Verificar número de teléfono
- Use a different phone number
+ Usar otro número de teléfono
Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos.
Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos.
Error de autenticación
@@ -186,4 +186,17 @@
La autenticación multifactor está actualmente desactivada
+ El correo electrónico o la contraseña no son correctos
+ Esta sesión de verificación ya no es válida. Solicita un código nuevo.
+ No se completó la verificación telefónica. Vuelve a intentarlo.
+ Estas credenciales pertenecen a otra cuenta.
+ Este número de teléfono no está configurado para la verificación en esta cuenta.
+ Tu sesión expiró. Vuelve a acceder para continuar.
+ Este vínculo ya no es válido. Solicita uno nuevo.
+ Verifica tu dirección de correo electrónico antes de continuar.
+ Este método de verificación ya está configurado en esta cuenta.
+ Alcanzaste el límite de métodos de verificación de esta cuenta.
+ Tu contraseña no cumple con los requisitos. Prueba con otra.
+ La contraseña es demasiado larga. La longitud máxima es %1$d.
+ No encontramos una llave de acceso para esta cuenta. Accede de otra manera.
diff --git a/auth/src/main/res/values-es-rCO/strings.xml b/auth/src/main/res/values-es-rCO/strings.xml
index f95dda99e..ae7e28c3c 100755
--- a/auth/src/main/res/values-es-rCO/strings.xml
+++ b/auth/src/main/res/values-es-rCO/strings.xml
@@ -100,7 +100,7 @@
Se verificó automáticamente el número de teléfono
Reenviar código
Verificar número de teléfono
- Use a different phone number
+ Usar otro número de teléfono
Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos.
Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos.
Error de autenticación
@@ -186,4 +186,17 @@
La autenticación multifactor está actualmente desactivada
+ El correo electrónico o la contraseña no son correctos
+ Esta sesión de verificación ya no es válida. Solicita un código nuevo.
+ No se completó la verificación telefónica. Vuelve a intentarlo.
+ Estas credenciales pertenecen a otra cuenta.
+ Este número de teléfono no está configurado para la verificación en esta cuenta.
+ Tu sesión expiró. Vuelve a acceder para continuar.
+ Este vínculo ya no es válido. Solicita uno nuevo.
+ Verifica tu dirección de correo electrónico antes de continuar.
+ Este método de verificación ya está configurado en esta cuenta.
+ Alcanzaste el límite de métodos de verificación de esta cuenta.
+ Tu contraseña no cumple con los requisitos. Prueba con otra.
+ La contraseña es demasiado larga. La longitud máxima es %1$d.
+ No encontramos una llave de acceso para esta cuenta. Accede de otra manera.
diff --git a/auth/src/main/res/values-es-rCR/strings.xml b/auth/src/main/res/values-es-rCR/strings.xml
index f95dda99e..ae7e28c3c 100755
--- a/auth/src/main/res/values-es-rCR/strings.xml
+++ b/auth/src/main/res/values-es-rCR/strings.xml
@@ -100,7 +100,7 @@
Se verificó automáticamente el número de teléfono
Reenviar código
Verificar número de teléfono
- Use a different phone number
+ Usar otro número de teléfono
Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos.
Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos.
Error de autenticación
@@ -186,4 +186,17 @@
La autenticación multifactor está actualmente desactivada
+ El correo electrónico o la contraseña no son correctos
+ Esta sesión de verificación ya no es válida. Solicita un código nuevo.
+ No se completó la verificación telefónica. Vuelve a intentarlo.
+ Estas credenciales pertenecen a otra cuenta.
+ Este número de teléfono no está configurado para la verificación en esta cuenta.
+ Tu sesión expiró. Vuelve a acceder para continuar.
+ Este vínculo ya no es válido. Solicita uno nuevo.
+ Verifica tu dirección de correo electrónico antes de continuar.
+ Este método de verificación ya está configurado en esta cuenta.
+ Alcanzaste el límite de métodos de verificación de esta cuenta.
+ Tu contraseña no cumple con los requisitos. Prueba con otra.
+ La contraseña es demasiado larga. La longitud máxima es %1$d.
+ No encontramos una llave de acceso para esta cuenta. Accede de otra manera.
diff --git a/auth/src/main/res/values-es-rDO/strings.xml b/auth/src/main/res/values-es-rDO/strings.xml
index f95dda99e..ae7e28c3c 100755
--- a/auth/src/main/res/values-es-rDO/strings.xml
+++ b/auth/src/main/res/values-es-rDO/strings.xml
@@ -100,7 +100,7 @@
Se verificó automáticamente el número de teléfono
Reenviar código
Verificar número de teléfono
- Use a different phone number
+ Usar otro número de teléfono
Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos.
Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos.
Error de autenticación
@@ -186,4 +186,17 @@
La autenticación multifactor está actualmente desactivada
+ El correo electrónico o la contraseña no son correctos
+ Esta sesión de verificación ya no es válida. Solicita un código nuevo.
+ No se completó la verificación telefónica. Vuelve a intentarlo.
+ Estas credenciales pertenecen a otra cuenta.
+ Este número de teléfono no está configurado para la verificación en esta cuenta.
+ Tu sesión expiró. Vuelve a acceder para continuar.
+ Este vínculo ya no es válido. Solicita uno nuevo.
+ Verifica tu dirección de correo electrónico antes de continuar.
+ Este método de verificación ya está configurado en esta cuenta.
+ Alcanzaste el límite de métodos de verificación de esta cuenta.
+ Tu contraseña no cumple con los requisitos. Prueba con otra.
+ La contraseña es demasiado larga. La longitud máxima es %1$d.
+ No encontramos una llave de acceso para esta cuenta. Accede de otra manera.
diff --git a/auth/src/main/res/values-es-rEC/strings.xml b/auth/src/main/res/values-es-rEC/strings.xml
index f95dda99e..ae7e28c3c 100755
--- a/auth/src/main/res/values-es-rEC/strings.xml
+++ b/auth/src/main/res/values-es-rEC/strings.xml
@@ -100,7 +100,7 @@
Se verificó automáticamente el número de teléfono
Reenviar código
Verificar número de teléfono
- Use a different phone number
+ Usar otro número de teléfono
Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos.
Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos.
Error de autenticación
@@ -186,4 +186,17 @@
La autenticación multifactor está actualmente desactivada
+ El correo electrónico o la contraseña no son correctos
+ Esta sesión de verificación ya no es válida. Solicita un código nuevo.
+ No se completó la verificación telefónica. Vuelve a intentarlo.
+ Estas credenciales pertenecen a otra cuenta.
+ Este número de teléfono no está configurado para la verificación en esta cuenta.
+ Tu sesión expiró. Vuelve a acceder para continuar.
+ Este vínculo ya no es válido. Solicita uno nuevo.
+ Verifica tu dirección de correo electrónico antes de continuar.
+ Este método de verificación ya está configurado en esta cuenta.
+ Alcanzaste el límite de métodos de verificación de esta cuenta.
+ Tu contraseña no cumple con los requisitos. Prueba con otra.
+ La contraseña es demasiado larga. La longitud máxima es %1$d.
+ No encontramos una llave de acceso para esta cuenta. Accede de otra manera.
diff --git a/auth/src/main/res/values-es-rGT/strings.xml b/auth/src/main/res/values-es-rGT/strings.xml
index f95dda99e..ae7e28c3c 100755
--- a/auth/src/main/res/values-es-rGT/strings.xml
+++ b/auth/src/main/res/values-es-rGT/strings.xml
@@ -100,7 +100,7 @@
Se verificó automáticamente el número de teléfono
Reenviar código
Verificar número de teléfono
- Use a different phone number
+ Usar otro número de teléfono
Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos.
Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos.
Error de autenticación
@@ -186,4 +186,17 @@
La autenticación multifactor está actualmente desactivada
+ El correo electrónico o la contraseña no son correctos
+ Esta sesión de verificación ya no es válida. Solicita un código nuevo.
+ No se completó la verificación telefónica. Vuelve a intentarlo.
+ Estas credenciales pertenecen a otra cuenta.
+ Este número de teléfono no está configurado para la verificación en esta cuenta.
+ Tu sesión expiró. Vuelve a acceder para continuar.
+ Este vínculo ya no es válido. Solicita uno nuevo.
+ Verifica tu dirección de correo electrónico antes de continuar.
+ Este método de verificación ya está configurado en esta cuenta.
+ Alcanzaste el límite de métodos de verificación de esta cuenta.
+ Tu contraseña no cumple con los requisitos. Prueba con otra.
+ La contraseña es demasiado larga. La longitud máxima es %1$d.
+ No encontramos una llave de acceso para esta cuenta. Accede de otra manera.
diff --git a/auth/src/main/res/values-es-rHN/strings.xml b/auth/src/main/res/values-es-rHN/strings.xml
index f95dda99e..ae7e28c3c 100755
--- a/auth/src/main/res/values-es-rHN/strings.xml
+++ b/auth/src/main/res/values-es-rHN/strings.xml
@@ -100,7 +100,7 @@
Se verificó automáticamente el número de teléfono
Reenviar código
Verificar número de teléfono
- Use a different phone number
+ Usar otro número de teléfono
Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos.
Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos.
Error de autenticación
@@ -186,4 +186,17 @@
La autenticación multifactor está actualmente desactivada
+ El correo electrónico o la contraseña no son correctos
+ Esta sesión de verificación ya no es válida. Solicita un código nuevo.
+ No se completó la verificación telefónica. Vuelve a intentarlo.
+ Estas credenciales pertenecen a otra cuenta.
+ Este número de teléfono no está configurado para la verificación en esta cuenta.
+ Tu sesión expiró. Vuelve a acceder para continuar.
+ Este vínculo ya no es válido. Solicita uno nuevo.
+ Verifica tu dirección de correo electrónico antes de continuar.
+ Este método de verificación ya está configurado en esta cuenta.
+ Alcanzaste el límite de métodos de verificación de esta cuenta.
+ Tu contraseña no cumple con los requisitos. Prueba con otra.
+ La contraseña es demasiado larga. La longitud máxima es %1$d.
+ No encontramos una llave de acceso para esta cuenta. Accede de otra manera.
diff --git a/auth/src/main/res/values-es-rMX/strings.xml b/auth/src/main/res/values-es-rMX/strings.xml
index f95dda99e..ae7e28c3c 100755
--- a/auth/src/main/res/values-es-rMX/strings.xml
+++ b/auth/src/main/res/values-es-rMX/strings.xml
@@ -100,7 +100,7 @@
Se verificó automáticamente el número de teléfono
Reenviar código
Verificar número de teléfono
- Use a different phone number
+ Usar otro número de teléfono
Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos.
Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos.
Error de autenticación
@@ -186,4 +186,17 @@
La autenticación multifactor está actualmente desactivada
+ El correo electrónico o la contraseña no son correctos
+ Esta sesión de verificación ya no es válida. Solicita un código nuevo.
+ No se completó la verificación telefónica. Vuelve a intentarlo.
+ Estas credenciales pertenecen a otra cuenta.
+ Este número de teléfono no está configurado para la verificación en esta cuenta.
+ Tu sesión expiró. Vuelve a acceder para continuar.
+ Este vínculo ya no es válido. Solicita uno nuevo.
+ Verifica tu dirección de correo electrónico antes de continuar.
+ Este método de verificación ya está configurado en esta cuenta.
+ Alcanzaste el límite de métodos de verificación de esta cuenta.
+ Tu contraseña no cumple con los requisitos. Prueba con otra.
+ La contraseña es demasiado larga. La longitud máxima es %1$d.
+ No encontramos una llave de acceso para esta cuenta. Accede de otra manera.
diff --git a/auth/src/main/res/values-es-rNI/strings.xml b/auth/src/main/res/values-es-rNI/strings.xml
index f95dda99e..ae7e28c3c 100755
--- a/auth/src/main/res/values-es-rNI/strings.xml
+++ b/auth/src/main/res/values-es-rNI/strings.xml
@@ -100,7 +100,7 @@
Se verificó automáticamente el número de teléfono
Reenviar código
Verificar número de teléfono
- Use a different phone number
+ Usar otro número de teléfono
Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos.
Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos.
Error de autenticación
@@ -186,4 +186,17 @@
La autenticación multifactor está actualmente desactivada
+ El correo electrónico o la contraseña no son correctos
+ Esta sesión de verificación ya no es válida. Solicita un código nuevo.
+ No se completó la verificación telefónica. Vuelve a intentarlo.
+ Estas credenciales pertenecen a otra cuenta.
+ Este número de teléfono no está configurado para la verificación en esta cuenta.
+ Tu sesión expiró. Vuelve a acceder para continuar.
+ Este vínculo ya no es válido. Solicita uno nuevo.
+ Verifica tu dirección de correo electrónico antes de continuar.
+ Este método de verificación ya está configurado en esta cuenta.
+ Alcanzaste el límite de métodos de verificación de esta cuenta.
+ Tu contraseña no cumple con los requisitos. Prueba con otra.
+ La contraseña es demasiado larga. La longitud máxima es %1$d.
+ No encontramos una llave de acceso para esta cuenta. Accede de otra manera.
diff --git a/auth/src/main/res/values-es-rPA/strings.xml b/auth/src/main/res/values-es-rPA/strings.xml
index f95dda99e..ae7e28c3c 100755
--- a/auth/src/main/res/values-es-rPA/strings.xml
+++ b/auth/src/main/res/values-es-rPA/strings.xml
@@ -100,7 +100,7 @@
Se verificó automáticamente el número de teléfono
Reenviar código
Verificar número de teléfono
- Use a different phone number
+ Usar otro número de teléfono
Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos.
Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos.
Error de autenticación
@@ -186,4 +186,17 @@
La autenticación multifactor está actualmente desactivada
+ El correo electrónico o la contraseña no son correctos
+ Esta sesión de verificación ya no es válida. Solicita un código nuevo.
+ No se completó la verificación telefónica. Vuelve a intentarlo.
+ Estas credenciales pertenecen a otra cuenta.
+ Este número de teléfono no está configurado para la verificación en esta cuenta.
+ Tu sesión expiró. Vuelve a acceder para continuar.
+ Este vínculo ya no es válido. Solicita uno nuevo.
+ Verifica tu dirección de correo electrónico antes de continuar.
+ Este método de verificación ya está configurado en esta cuenta.
+ Alcanzaste el límite de métodos de verificación de esta cuenta.
+ Tu contraseña no cumple con los requisitos. Prueba con otra.
+ La contraseña es demasiado larga. La longitud máxima es %1$d.
+ No encontramos una llave de acceso para esta cuenta. Accede de otra manera.
diff --git a/auth/src/main/res/values-es-rPE/strings.xml b/auth/src/main/res/values-es-rPE/strings.xml
index f95dda99e..ae7e28c3c 100755
--- a/auth/src/main/res/values-es-rPE/strings.xml
+++ b/auth/src/main/res/values-es-rPE/strings.xml
@@ -100,7 +100,7 @@
Se verificó automáticamente el número de teléfono
Reenviar código
Verificar número de teléfono
- Use a different phone number
+ Usar otro número de teléfono
Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos.
Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos.
Error de autenticación
@@ -186,4 +186,17 @@
La autenticación multifactor está actualmente desactivada
+ El correo electrónico o la contraseña no son correctos
+ Esta sesión de verificación ya no es válida. Solicita un código nuevo.
+ No se completó la verificación telefónica. Vuelve a intentarlo.
+ Estas credenciales pertenecen a otra cuenta.
+ Este número de teléfono no está configurado para la verificación en esta cuenta.
+ Tu sesión expiró. Vuelve a acceder para continuar.
+ Este vínculo ya no es válido. Solicita uno nuevo.
+ Verifica tu dirección de correo electrónico antes de continuar.
+ Este método de verificación ya está configurado en esta cuenta.
+ Alcanzaste el límite de métodos de verificación de esta cuenta.
+ Tu contraseña no cumple con los requisitos. Prueba con otra.
+ La contraseña es demasiado larga. La longitud máxima es %1$d.
+ No encontramos una llave de acceso para esta cuenta. Accede de otra manera.
diff --git a/auth/src/main/res/values-es-rPR/strings.xml b/auth/src/main/res/values-es-rPR/strings.xml
index f95dda99e..ae7e28c3c 100755
--- a/auth/src/main/res/values-es-rPR/strings.xml
+++ b/auth/src/main/res/values-es-rPR/strings.xml
@@ -100,7 +100,7 @@
Se verificó automáticamente el número de teléfono
Reenviar código
Verificar número de teléfono
- Use a different phone number
+ Usar otro número de teléfono
Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos.
Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos.
Error de autenticación
@@ -186,4 +186,17 @@
La autenticación multifactor está actualmente desactivada
+ El correo electrónico o la contraseña no son correctos
+ Esta sesión de verificación ya no es válida. Solicita un código nuevo.
+ No se completó la verificación telefónica. Vuelve a intentarlo.
+ Estas credenciales pertenecen a otra cuenta.
+ Este número de teléfono no está configurado para la verificación en esta cuenta.
+ Tu sesión expiró. Vuelve a acceder para continuar.
+ Este vínculo ya no es válido. Solicita uno nuevo.
+ Verifica tu dirección de correo electrónico antes de continuar.
+ Este método de verificación ya está configurado en esta cuenta.
+ Alcanzaste el límite de métodos de verificación de esta cuenta.
+ Tu contraseña no cumple con los requisitos. Prueba con otra.
+ La contraseña es demasiado larga. La longitud máxima es %1$d.
+ No encontramos una llave de acceso para esta cuenta. Accede de otra manera.
diff --git a/auth/src/main/res/values-es-rPY/strings.xml b/auth/src/main/res/values-es-rPY/strings.xml
index f95dda99e..ae7e28c3c 100755
--- a/auth/src/main/res/values-es-rPY/strings.xml
+++ b/auth/src/main/res/values-es-rPY/strings.xml
@@ -100,7 +100,7 @@
Se verificó automáticamente el número de teléfono
Reenviar código
Verificar número de teléfono
- Use a different phone number
+ Usar otro número de teléfono
Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos.
Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos.
Error de autenticación
@@ -186,4 +186,17 @@
La autenticación multifactor está actualmente desactivada
+ El correo electrónico o la contraseña no son correctos
+ Esta sesión de verificación ya no es válida. Solicita un código nuevo.
+ No se completó la verificación telefónica. Vuelve a intentarlo.
+ Estas credenciales pertenecen a otra cuenta.
+ Este número de teléfono no está configurado para la verificación en esta cuenta.
+ Tu sesión expiró. Vuelve a acceder para continuar.
+ Este vínculo ya no es válido. Solicita uno nuevo.
+ Verifica tu dirección de correo electrónico antes de continuar.
+ Este método de verificación ya está configurado en esta cuenta.
+ Alcanzaste el límite de métodos de verificación de esta cuenta.
+ Tu contraseña no cumple con los requisitos. Prueba con otra.
+ La contraseña es demasiado larga. La longitud máxima es %1$d.
+ No encontramos una llave de acceso para esta cuenta. Accede de otra manera.
diff --git a/auth/src/main/res/values-es-rSV/strings.xml b/auth/src/main/res/values-es-rSV/strings.xml
index f95dda99e..ae7e28c3c 100755
--- a/auth/src/main/res/values-es-rSV/strings.xml
+++ b/auth/src/main/res/values-es-rSV/strings.xml
@@ -100,7 +100,7 @@
Se verificó automáticamente el número de teléfono
Reenviar código
Verificar número de teléfono
- Use a different phone number
+ Usar otro número de teléfono
Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos.
Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos.
Error de autenticación
@@ -186,4 +186,17 @@
La autenticación multifactor está actualmente desactivada
+ El correo electrónico o la contraseña no son correctos
+ Esta sesión de verificación ya no es válida. Solicita un código nuevo.
+ No se completó la verificación telefónica. Vuelve a intentarlo.
+ Estas credenciales pertenecen a otra cuenta.
+ Este número de teléfono no está configurado para la verificación en esta cuenta.
+ Tu sesión expiró. Vuelve a acceder para continuar.
+ Este vínculo ya no es válido. Solicita uno nuevo.
+ Verifica tu dirección de correo electrónico antes de continuar.
+ Este método de verificación ya está configurado en esta cuenta.
+ Alcanzaste el límite de métodos de verificación de esta cuenta.
+ Tu contraseña no cumple con los requisitos. Prueba con otra.
+ La contraseña es demasiado larga. La longitud máxima es %1$d.
+ No encontramos una llave de acceso para esta cuenta. Accede de otra manera.
diff --git a/auth/src/main/res/values-es-rUS/strings.xml b/auth/src/main/res/values-es-rUS/strings.xml
index f95dda99e..ae7e28c3c 100755
--- a/auth/src/main/res/values-es-rUS/strings.xml
+++ b/auth/src/main/res/values-es-rUS/strings.xml
@@ -100,7 +100,7 @@
Se verificó automáticamente el número de teléfono
Reenviar código
Verificar número de teléfono
- Use a different phone number
+ Usar otro número de teléfono
Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos.
Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos.
Error de autenticación
@@ -186,4 +186,17 @@
La autenticación multifactor está actualmente desactivada
+ El correo electrónico o la contraseña no son correctos
+ Esta sesión de verificación ya no es válida. Solicita un código nuevo.
+ No se completó la verificación telefónica. Vuelve a intentarlo.
+ Estas credenciales pertenecen a otra cuenta.
+ Este número de teléfono no está configurado para la verificación en esta cuenta.
+ Tu sesión expiró. Vuelve a acceder para continuar.
+ Este vínculo ya no es válido. Solicita uno nuevo.
+ Verifica tu dirección de correo electrónico antes de continuar.
+ Este método de verificación ya está configurado en esta cuenta.
+ Alcanzaste el límite de métodos de verificación de esta cuenta.
+ Tu contraseña no cumple con los requisitos. Prueba con otra.
+ La contraseña es demasiado larga. La longitud máxima es %1$d.
+ No encontramos una llave de acceso para esta cuenta. Accede de otra manera.
diff --git a/auth/src/main/res/values-es-rUY/strings.xml b/auth/src/main/res/values-es-rUY/strings.xml
index f95dda99e..ae7e28c3c 100755
--- a/auth/src/main/res/values-es-rUY/strings.xml
+++ b/auth/src/main/res/values-es-rUY/strings.xml
@@ -100,7 +100,7 @@
Se verificó automáticamente el número de teléfono
Reenviar código
Verificar número de teléfono
- Use a different phone number
+ Usar otro número de teléfono
Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos.
Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos.
Error de autenticación
@@ -186,4 +186,17 @@
La autenticación multifactor está actualmente desactivada
+ El correo electrónico o la contraseña no son correctos
+ Esta sesión de verificación ya no es válida. Solicita un código nuevo.
+ No se completó la verificación telefónica. Vuelve a intentarlo.
+ Estas credenciales pertenecen a otra cuenta.
+ Este número de teléfono no está configurado para la verificación en esta cuenta.
+ Tu sesión expiró. Vuelve a acceder para continuar.
+ Este vínculo ya no es válido. Solicita uno nuevo.
+ Verifica tu dirección de correo electrónico antes de continuar.
+ Este método de verificación ya está configurado en esta cuenta.
+ Alcanzaste el límite de métodos de verificación de esta cuenta.
+ Tu contraseña no cumple con los requisitos. Prueba con otra.
+ La contraseña es demasiado larga. La longitud máxima es %1$d.
+ No encontramos una llave de acceso para esta cuenta. Accede de otra manera.
diff --git a/auth/src/main/res/values-es-rVE/strings.xml b/auth/src/main/res/values-es-rVE/strings.xml
index f95dda99e..ae7e28c3c 100755
--- a/auth/src/main/res/values-es-rVE/strings.xml
+++ b/auth/src/main/res/values-es-rVE/strings.xml
@@ -100,7 +100,7 @@
Se verificó automáticamente el número de teléfono
Reenviar código
Verificar número de teléfono
- Use a different phone number
+ Usar otro número de teléfono
Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos.
Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos.
Error de autenticación
@@ -186,4 +186,17 @@
La autenticación multifactor está actualmente desactivada
+ El correo electrónico o la contraseña no son correctos
+ Esta sesión de verificación ya no es válida. Solicita un código nuevo.
+ No se completó la verificación telefónica. Vuelve a intentarlo.
+ Estas credenciales pertenecen a otra cuenta.
+ Este número de teléfono no está configurado para la verificación en esta cuenta.
+ Tu sesión expiró. Vuelve a acceder para continuar.
+ Este vínculo ya no es válido. Solicita uno nuevo.
+ Verifica tu dirección de correo electrónico antes de continuar.
+ Este método de verificación ya está configurado en esta cuenta.
+ Alcanzaste el límite de métodos de verificación de esta cuenta.
+ Tu contraseña no cumple con los requisitos. Prueba con otra.
+ La contraseña es demasiado larga. La longitud máxima es %1$d.
+ No encontramos una llave de acceso para esta cuenta. Accede de otra manera.
diff --git a/auth/src/main/res/values-es/strings.xml b/auth/src/main/res/values-es/strings.xml
index ac5767d33..7d61227a4 100755
--- a/auth/src/main/res/values-es/strings.xml
+++ b/auth/src/main/res/values-es/strings.xml
@@ -100,7 +100,7 @@
Se ha verificado automáticamente el número de teléfono
Volver a enviar código
Verificar número de teléfono
- Use a different phone number
+ Usar otro número de teléfono
Al tocar %1$s, podría enviarse un SMS. Es posible que se apliquen cargos de mensajería y de uso de datos.
Si tocas %1$s, confirmas que aceptas nuestras %2$s y nuestra %3$s. Podría enviarse un SMS, por lo que es posible que se apliquen cargos de mensajería y de uso de datos.
Error de autenticación
@@ -193,4 +193,17 @@
La autenticación multifactor está actualmente desactivada
+ El correo electrónico o la contraseña no son correctos
+ Esta sesión de verificación ya no es válida. Solicita un código nuevo.
+ La verificación telefónica no se ha completado. Vuelve a intentarlo.
+ Estas credenciales pertenecen a otra cuenta.
+ Este número de teléfono no está configurado para la verificación en esta cuenta.
+ Tu sesión ha caducado. Vuelve a iniciar sesión para continuar.
+ Este enlace ya no es válido. Solicita uno nuevo.
+ Verifica tu dirección de correo electrónico antes de continuar.
+ Este método de verificación ya está configurado en esta cuenta.
+ Has alcanzado el límite de métodos de verificación de esta cuenta.
+ Tu contraseña no cumple los requisitos. Prueba con otra.
+ La contraseña es demasiado larga. La longitud máxima es %1$d.
+ No hemos encontrado ninguna clave de acceso para esta cuenta. Inicia sesión de otra forma.
diff --git a/auth/src/main/res/values-fa/strings.xml b/auth/src/main/res/values-fa/strings.xml
index a7f6c7470..fd24dc792 100755
--- a/auth/src/main/res/values-fa/strings.xml
+++ b/auth/src/main/res/values-fa/strings.xml
@@ -100,15 +100,15 @@
شماره تلفن بهطور خودکار بهتأیید رسید
ارسال مجدد کد
تأیید شماره تلفن
- Use a different phone number
+ استفاده از شماره تلفن دیگر
با ضربه زدن روی «%1$s»، پیامکی برایتان ارسال میشود. هزینه پیام و داده اعمال میشود.
درصورت ضربهزدن روی «%1$s»، موافقتتان را با %2$s و %3$s اعلام میکنید. پیامکی ارسال میشود. ممکن است هزینه داده و «پیام» محاسبه شود.
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ خطای احراز هویت
+ دوباره امتحان کنید
+ تأیید بیشتری لازم است. لطفاً احراز هویت چندعاملی را کامل کنید.
+ حساب باید پیوند داده شود. لطفاً روش ورود دیگری را امتحان کنید.
+ احراز هویت لغو شد. هروقت آماده بودید، دوباره امتحان کنید.
روش احراز هویت را انتخاب کنید
@@ -176,4 +176,17 @@
احراز هویت چند مرحلهای در حال حاضر غیرفعال است
+ آن ایمیل یا گذرواژه درست نیست
+ این جلسه تأیید دیگر معتبر نیست. کد جدیدی درخواست کنید.
+ تأیید شماره تلفن کامل نشد. دوباره امتحان کنید.
+ این اطلاعات ورود به حساب دیگری تعلق دارد.
+ این شماره تلفن برای تأیید در این حساب تنظیم نشده است.
+ جلسه ورود به سیستم شما منقضی شد. برای ادامه، دوباره وارد سیستم شوید.
+ این پیوند دیگر معتبر نیست. پیوند جدیدی درخواست کنید.
+ پیش از ادامه، نشانی ایمیلتان را تأیید کنید.
+ این روش تأیید قبلاً در این حساب تنظیم شده است.
+ به حداکثر تعداد روشهای تأیید در این حساب رسیدهاید.
+ گذرواژه شما الزامات را برآورده نمیکند. گذرواژه دیگری را امتحان کنید.
+ گذرواژه خیلی طولانی است. حداکثر طول %1$d است.
+ کلید عبوری برای این حساب پیدا نشد. به روش دیگری وارد سیستم شوید.
diff --git a/auth/src/main/res/values-fi/strings.xml b/auth/src/main/res/values-fi/strings.xml
index 1dbdcef0d..68076deea 100755
--- a/auth/src/main/res/values-fi/strings.xml
+++ b/auth/src/main/res/values-fi/strings.xml
@@ -100,7 +100,7 @@
Puhelinnumero vahvistettu automaattisesti
Lähetä koodi uudelleen
Vahvista puhelinnumero
- Use a different phone number
+ Käytä toista puhelinnumeroa
Kun napautat %1$s, tekstiviesti voidaan lähettää. Datan ja viestien käyttö voi olla maksullista.
Napauttamalla %1$s vahvistat hyväksyväsi seuraavat: %2$s ja %3$s. Tekstiviesti voidaan lähettää, ja datan ja viestien käyttö voi olla maksullista.
Todennusvirhe
@@ -175,4 +175,17 @@
Monivaiheinen todennus on tällä hetkellä poistettu käytöstä
+ Sähköposti tai salasana on virheellinen
+ Tämä vahvistusistunto ei ole enää voimassa. Pyydä uusi koodi.
+ Puhelinvahvistus ei valmistunut. Yritä uudelleen.
+ Nämä tunnistetiedot kuuluvat toiselle tilille.
+ Tätä puhelinnumeroa ei ole määritetty vahvistukseen tällä tilillä.
+ Kirjautumisistuntosi vanheni. Kirjaudu sisään uudelleen jatkaaksesi.
+ Tämä linkki ei ole enää voimassa. Pyydä uusi.
+ Vahvista sähköpostiosoitteesi ennen kuin jatkat.
+ Tämä vahvistustapa on jo määritetty tällä tilillä.
+ Olet saavuttanut tämän tilin vahvistustapojen enimmäismäärän.
+ Salasanasi ei täytä vaatimuksia. Kokeile toista.
+ Salasana on liian pitkä. Enimmäispituus on %1$d.
+ Tälle tilille ei löytynyt avainkoodia. Kirjaudu sisään toisella tavalla.
diff --git a/auth/src/main/res/values-fil/strings.xml b/auth/src/main/res/values-fil/strings.xml
index 39b866524..b33ac04ca 100755
--- a/auth/src/main/res/values-fil/strings.xml
+++ b/auth/src/main/res/values-fil/strings.xml
@@ -100,7 +100,7 @@
Awtomatikong na-verify ang numero ng telepono
Ipadala Muli ang Code
I-verify ang Numero ng Telepono
- Use a different phone number
+ Gumamit ng ibang numero ng telepono
Sa pag-tap sa “%1$s,“ maaaring magpadala ng SMS. Maaaring ipatupad ang mga rate ng pagmemensahe at data.
Sa pag-tap sa “%1$s”, ipinababatid mo na tinatanggap mo ang aming %2$s at %3$s. Maaaring magpadala ng SMS. Maaaring ipatupad ang mga rate ng pagmemensahe at data.
Error sa Pagpapatotoo
@@ -146,7 +146,7 @@
Pumili ng paraan ng pag-verify
Magdagdag ng karagdagang layer ng seguridad
SMS
- Authenticator app
+ App ng authenticator
Ang numerong ito ay nauugnay sa ibang account
Kinakailangan ang pag-verify
I-scan ang QR code gamit ang iyong authenticator app
@@ -163,16 +163,29 @@
Mag-authenticate muli
Alisin
Ipadala muli ang verification email
- Secret key
+ Sikretong key
Mag-sign out
Naka-sign in bilang
Laktawan
Gumamit ng ibang paraan
- Verification code
+ Code sa pag-verify
Na-verify ang email
I-verify
Nagpadala kami ng verification email sa %1$s
Kasalukuyang naka-disable ang multi-factor authentication
+ Mali ang email o password na iyon
+ Wala nang bisa ang verification session na iyon. Humiling ng bagong code.
+ Hindi nakumpleto ang pag-verify ng telepono. Subukang muli.
+ Kabilang ang mga kredensyal na iyon sa ibang account.
+ Hindi naka-set up ang numero ng teleponong iyon para sa pag-verify sa account na ito.
+ Nag-expire na ang iyong sign-in session. Mag-sign in muli para magpatuloy.
+ Wala nang bisa ang link na iyon. Humiling ng bago.
+ I-verify ang iyong email address bago ka magpatuloy.
+ Naka-set up na ang paraan ng pag-verify na iyon sa account na ito.
+ Naabot mo na ang limitasyon para sa mga paraan ng pag-verify sa account na ito.
+ Hindi natutugunan ng iyong password ang mga kinakailangan. Sumubok ng iba.
+ Masyadong mahaba ang password. Ang maximum na haba ay %1$d.
+ Wala kaming nakitang passkey para sa account na ito. Mag-sign in sa ibang paraan.
diff --git a/auth/src/main/res/values-fr-rCH/strings.xml b/auth/src/main/res/values-fr-rCH/strings.xml
index 447df0746..e21e8e4fe 100755
--- a/auth/src/main/res/values-fr-rCH/strings.xml
+++ b/auth/src/main/res/values-fr-rCH/strings.xml
@@ -100,15 +100,15 @@
Numéro de téléphone validé automatiquement
Renvoyer le code
Valider le numéro de téléphone
- Use a different phone number
+ Utiliser un autre numéro de téléphone
En appuyant sur “%1$s”, vous déclencherez peut-être l\'envoi d\'un SMS. Des frais de messages et de données peuvent être facturés.
En appuyant sur “%1$s”, vous acceptez les %2$s et les %3$s. Vous déclencherez peut-être l\'envoi d\'un SMS. Des frais de messages et de données peuvent être facturés.
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ Erreur d\'authentification
+ Réessayer
+ Vérification supplémentaire requise. Veuillez compléter l\'authentification à plusieurs facteurs.
+ Le compte doit être lié. Veuillez essayer une méthode de connexion différente.
+ L\'authentification a été annulée. Veuillez réessayer quand vous serez prêt.
Choisir la méthode d\'authentification
@@ -187,4 +187,17 @@
L\'authentification multifacteur est actuellement désactivée
+ Cet e-mail ou ce mot de passe est incorrect
+ Cette session de vérification n\'est plus valide. Demandez un nouveau code.
+ La vérification du numéro de téléphone n\'a pas abouti. Veuillez réessayer.
+ Ces identifiants appartiennent à un autre compte.
+ Ce numéro de téléphone n\'est pas configuré comme méthode de vérification sur ce compte.
+ Votre session de connexion a expiré. Reconnectez-vous pour continuer.
+ Ce lien n\'est plus valide. Demandez-en un nouveau.
+ Veuillez vérifier votre adresse e-mail avant de continuer.
+ Cette méthode de vérification est déjà configurée sur ce compte.
+ Vous avez atteint la limite de méthodes de vérification pour ce compte.
+ Votre mot de passe ne respecte pas les exigences. Essayez-en un autre.
+ Le mot de passe est trop long. La longueur maximale est de %1$d.
+ Aucune clé d\'accès n\'a été trouvée pour ce compte. Connectez-vous d\'une autre manière.
diff --git a/auth/src/main/res/values-fr/strings.xml b/auth/src/main/res/values-fr/strings.xml
index e6e2d773c..5211fc921 100755
--- a/auth/src/main/res/values-fr/strings.xml
+++ b/auth/src/main/res/values-fr/strings.xml
@@ -100,7 +100,7 @@
Numéro de téléphone validé automatiquement
Renvoyer le code
Valider le numéro de téléphone
- Use a different phone number
+ Utiliser un autre numéro de téléphone
En appuyant sur “%1$s”, vous déclencherez peut-être l\'envoi d\'un SMS. Des frais de messages et de données peuvent être facturés.
En appuyant sur "%1$s", vous acceptez les %2$s et les %3$s. Vous déclencherez peut-être l\'envoi d\'un SMS. Des frais de messages et de données peuvent être facturés.
Erreur d\'authentification
@@ -193,4 +193,17 @@
L\'authentification multifacteur est actuellement désactivée
+ L\'adresse e-mail ou le mot de passe est incorrect
+ Cette session de vérification n\'est plus valide. Demandez un nouveau code.
+ La vérification du numéro de téléphone n\'a pas abouti. Réessayez.
+ Ces identifiants appartiennent à un autre compte.
+ Ce numéro de téléphone n\'est pas configuré pour la vérification sur ce compte.
+ Votre session de connexion a expiré. Reconnectez-vous pour continuer.
+ Ce lien n\'est plus valide. Demandez-en un nouveau.
+ Vérifiez votre adresse e-mail avant de continuer.
+ Cette méthode de vérification est déjà configurée sur ce compte.
+ Vous avez atteint la limite de méthodes de vérification pour ce compte.
+ Votre mot de passe ne respecte pas les exigences. Essayez-en un autre.
+ Le mot de passe est trop long. La longueur maximale est de %1$d.
+ Aucune clé d\'accès n\'a été trouvée pour ce compte. Connectez-vous d\'une autre manière.
diff --git a/auth/src/main/res/values-gsw/strings.xml b/auth/src/main/res/values-gsw/strings.xml
index ca2068e97..12ae38c1d 100755
--- a/auth/src/main/res/values-gsw/strings.xml
+++ b/auth/src/main/res/values-gsw/strings.xml
@@ -100,7 +100,7 @@
Telefonnummer wurde automatisch bestätigt
Code erneut senden
Telefonnummer bestätigen
- Use a different phone number
+ E anderi Telefonnummere verwände
Wenn Sie auf “%1$s” tippen, erhalten Sie möglicherweise eine SMS. Es können Gebühren für SMS und Datenübertragung anfallen.
Indem Sie auf “%1$s” tippen, stimmen Sie unseren %2$s und unserer %3$s zu. Sie erhalten möglicherweise eine SMS und es können Gebühren für die Nachricht und die Datenübertragung anfallen.
Authentifizierungsfehler
@@ -175,4 +175,17 @@
D\'Multi-Faktor-Authentifizierig isch zurziit deaktiviert
+ Die E-Mail-Adrässe oder s Passwort isch nöd richtig
+ Die Bestätigungssitzig isch nüme gültig. Fordere Sie e neue Code aa.
+ D\'Telefonbestätigung isch nöd abgschlosse worde. Versuche Sie es erneut.
+ Die Aamäldedate ghöre zunemene andere Konto.
+ Die Telefonnummere isch uf däm Konto nöd als Bestätigungsmethode iigrichtet.
+ Ihri Aamäldig isch abglaufe. Mälde Sie sich erneut aa, zum wiiterzmache.
+ De Link isch nüme gültig. Fordere Sie e neue aa.
+ Bestätige Sie Ihri E-Mail-Adrässe, bevor Sie wiitermache.
+ Die Bestätigungsmethode isch scho uf däm Konto iigrichtet.
+ Sie händ d\'Grenze für Bestätigungsmethode uf däm Konto erreicht.
+ Ihres Passwort erfüllt d Aaforderige nöd. Probiere Sie es mit eme andere.
+ S Passwort isch z lang. D maximali Läng isch %1$d.
+ Für das Konto isch kein Passkey gfunde worde. Mälde Sie sich uf en anderi Art aa.
diff --git a/auth/src/main/res/values-gu/strings.xml b/auth/src/main/res/values-gu/strings.xml
index 38258f327..893c8d073 100755
--- a/auth/src/main/res/values-gu/strings.xml
+++ b/auth/src/main/res/values-gu/strings.xml
@@ -100,15 +100,15 @@
ફોન નંબર આપમેળે ચકાસવામાં આવ્યો
કોડ ફરીથી મોકલો
ફોન નંબર ચકાસો
- Use a different phone number
+ અલગ ફોન નંબરનો ઉપયોગ કરો
“%1$s”ને ટૅપ કરવાથી, કદાચ એક SMS મોકલવામાં આવી શકે છે. સંદેશ અને ડેટા શુલ્ક લાગુ થઈ શકે છે.
“%1$s” ટૅપ કરીને, તમે સૂચવી રહ્યાં છો કે તમે અમારી %2$s અને %3$sને સ્વીકારો છો. SMS મોકલવામાં આવી શકે છે. સંદેશ અને ડેટા શુલ્ક લાગુ થઈ શકે છે.
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ પ્રમાણીકરણ ભૂલ
+ ફરી પ્રયાસ કરો
+ વધારાની ચકાસણી જરૂરી છે. કૃપા કરીને મલ્ટિ-ફૅક્ટર પ્રમાણીકરણ પૂર્ણ કરો.
+ એકાઉન્ટ લિંક કરવાની જરૂર છે. કૃપા કરીને કોઈ અલગ સાઇન ઇન પદ્ધતિ અજમાવો.
+ પ્રમાણીકરણ રદ કરવામાં આવ્યું. તમે તૈયાર હો ત્યારે ફરી પ્રયાસ કરો.
પ્રમાણીકરણ પદ્ધતિ પસંદ કરો
@@ -176,4 +176,17 @@
મલ્ટિ-ફેક્ટર પ્રમાણીકરણ હાલમાં અક્ષમ છે
+ તે ઇમેઇલ અથવા પાસવર્ડ સાચો નથી
+ તે ચકાસણી સત્ર હવે માન્ય નથી. નવા કોડની વિનંતી કરો.
+ ફોનની ચકાસણી પૂર્ણ થઈ નથી. ફરી પ્રયાસ કરો.
+ તે ઓળખપત્રો કોઈ અલગ એકાઉન્ટનાં છે.
+ તે ફોન નંબર આ એકાઉન્ટ પર ચકાસણી માટે સેટ કરેલો નથી.
+ તમારું સાઇન ઇન સત્ર સમાપ્ત થઈ ગયું છે. ચાલુ રાખવા માટે ફરી સાઇન ઇન કરો.
+ તે લિંક હવે માન્ય નથી. નવી લિંકની વિનંતી કરો.
+ તમે આગળ વધો તે પહેલાં તમારું ઇમેઇલ ઍડ્રેસ ચકાસો.
+ તે ચકાસણી પદ્ધતિ આ એકાઉન્ટ પર પહેલેથી જ સેટ કરેલી છે.
+ તમે આ એકાઉન્ટ પર ચકાસણી પદ્ધતિઓની મર્યાદા પર પહોંચી ગયા છો.
+ તમારો પાસવર્ડ જરૂરિયાતો પૂરી કરતો નથી. બીજો પાસવર્ડ અજમાવો.
+ પાસવર્ડ ઘણો લાંબો છે. મહત્તમ લંબાઈ %1$d છે.
+ આ એકાઉન્ટ માટે કોઈ પાસકી મળી નથી. બીજી રીતે સાઇન ઇન કરો.
diff --git a/auth/src/main/res/values-hi/strings.xml b/auth/src/main/res/values-hi/strings.xml
index 45173de19..686c17f63 100755
--- a/auth/src/main/res/values-hi/strings.xml
+++ b/auth/src/main/res/values-hi/strings.xml
@@ -100,15 +100,15 @@
फ़ोन नंबर की अपने आप पुष्टि की गई
कोड फिर से भेजें
फ़ोन नंबर की पुष्टि करें
- Use a different phone number
+ दूसरे फ़ोन नंबर का इस्तेमाल करें
“%1$s” पर टैप करने पर, एक मैसेज (एसएमएस) भेजा जा सकता है. मैसेज और डेटा दरें लागू हो सकती हैं.
“%1$s” पर टैप करके, आप यह बताते हैं कि आप हमारी %2$s और %3$s को मंज़ूर करते हैं. एक मैसेज (एसएमएस) भेजा जा सकता है. मैसेज और डेटा दरें लागू हो सकती हैं.
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ प्रमाणीकरण में गड़बड़ी
+ फिर से कोशिश करें
+ अतिरिक्त सत्यापन ज़रूरी है. कृपया मल्टी-फ़ैक्टर प्रमाणीकरण पूरा करें.
+ खाते को लिंक करना ज़रूरी है. कृपया प्रवेश करने का कोई दूसरा तरीका आज़माएँ.
+ प्रमाणीकरण रद्द कर दिया गया. तैयार होने पर फिर से कोशिश करें.
प्रमाणीकरण विधि चुनें
@@ -176,4 +176,17 @@
मल्टी-फैक्टर प्रमाणीकरण वर्तमान में अक्षम है
+ वह ईमेल या पासवर्ड सही नहीं है
+ वह पुष्टि करने वाला सेशन अब मान्य नहीं है. नया कोड पाने का अनुरोध करें.
+ फ़ोन की पुष्टि पूरी नहीं हुई. कृपया फिर से कोशिश करें.
+ वे क्रेडेंशियल किसी दूसरे खाते के हैं.
+ वह फ़ोन नंबर इस खाते पर पुष्टि के लिए सेट अप नहीं है.
+ आपका साइन इन सेशन खत्म हो गया है. जारी रखने के लिए फिर से साइन इन करें.
+ वह लिंक अब मान्य नहीं है. नया लिंक पाने का अनुरोध करें.
+ आगे बढ़ने से पहले अपने ईमेल पते की पुष्टि करें.
+ पुष्टि करने का वह तरीका इस खाते पर पहले से सेट अप है.
+ आपने इस खाते पर पुष्टि करने के तरीकों की सीमा पूरी कर ली है.
+ आपका पासवर्ड ज़रूरी शर्तें पूरी नहीं करता. कोई दूसरा पासवर्ड आज़माएं.
+ पासवर्ड बहुत लंबा है. ज़्यादा से ज़्यादा लंबाई %1$d है.
+ इस खाते के लिए कोई पासकी नहीं मिली. किसी दूसरे तरीके से साइन इन करें.
diff --git a/auth/src/main/res/values-hr/strings.xml b/auth/src/main/res/values-hr/strings.xml
index b6fef2393..1a93051c9 100755
--- a/auth/src/main/res/values-hr/strings.xml
+++ b/auth/src/main/res/values-hr/strings.xml
@@ -100,7 +100,7 @@
Telefonski je broj automatski potvrđen
Ponovo pošalji kôd
Potvrda telefonskog broja
- Use a different phone number
+ Upotrijebi drugi telefonski broj
Dodirivanje gumba “%1$s” može dovesti do slanja SMS poruke. Mogu se primijeniti naknade za slanje poruka i podatkovni promet.
Ako dodirnete "%1$s", potvrđujete da prihvaćate odredbe koje sadrže %2$s i %3$s. Možda ćemo vam poslati SMS. Moguća je naplata poruke i podatkovnog prometa.
Greška provjere identiteta
@@ -175,4 +175,17 @@
Višefaktorska autentifikacija trenutno je onemogućena
+ Ta e-adresa ili zaporka nije točna
+ Ta sesija potvrde više nije važeća. Zatražite novi kôd.
+ Potvrda telefonskog broja nije dovršena. Pokušajte ponovno.
+ Te vjerodajnice pripadaju drugom računu.
+ Taj telefonski broj nije postavljen za potvrdu na ovom računu.
+ Vaša je sesija prijave istekla. Prijavite se ponovno da biste nastavili.
+ Ta veza više nije važeća. Zatražite novu.
+ Potvrdite svoju e-adresu prije nego što nastavite.
+ Taj je način potvrde već postavljen na ovom računu.
+ Dosegnuli ste ograničenje broja načina potvrde na ovom računu.
+ Vaša zaporka ne ispunjava uvjete. Pokušajte s drugom.
+ Zaporka je predugačka. Najveća duljina je %1$d.
+ Nismo pronašli pristupni ključ za ovaj račun. Prijavite se na drugi način.
diff --git a/auth/src/main/res/values-hu/strings.xml b/auth/src/main/res/values-hu/strings.xml
index 90e888d74..8356d8145 100755
--- a/auth/src/main/res/values-hu/strings.xml
+++ b/auth/src/main/res/values-hu/strings.xml
@@ -100,7 +100,7 @@
A telefonszám automatikusan ellenőrizve
Kód újraküldése
Telefonszám igazolása
- Use a different phone number
+ Másik telefonszám használata
Ha a(z) „%1$s” gombra koppint, a rendszer SMS-t küldhet Önnek. A szolgáltató ezért üzenet- és adatforgalmi díjat számíthat fel.
A(z) „%1$s” gombra való koppintással elfogadja a következő dokumentumokat: %2$s és %3$s. A rendszer SMS-t küldhet Önnek. A szolgáltató ezért üzenet- és adatforgalmi díjat számíthat fel.
Hitelesítési hiba
@@ -175,4 +175,17 @@
A többfaktoros hitelesítés jelenleg le van tiltva
+ Az e-mail-cím vagy a jelszó nem helyes
+ Ez az ellenőrzési munkamenet már nem érvényes. Kérjen új kódot.
+ A telefonszám ellenőrzése nem fejeződött be. Kérjük, próbálja újra.
+ Ezek a hitelesítő adatok egy másik fiókhoz tartoznak.
+ Ez a telefonszám nincs beállítva ellenőrzésre ebben a fiókban.
+ A bejelentkezési munkamenet lejárt. A folytatáshoz jelentkezzen be újra.
+ Ez a link már nem érvényes. Kérjen újat.
+ A folytatás előtt erősítse meg az e-mail-címét.
+ Ez az ellenőrzési módszer már be van állítva ebben a fiókban.
+ Elérte az ebben a fiókban beállítható ellenőrzési módszerek felső határát.
+ A jelszava nem felel meg a követelményeknek. Próbáljon meg egy másikat.
+ A jelszó túl hosszú. A maximális hossz %1$d.
+ Nem találtunk azonosítókulcsot ehhez a fiókhoz. Jelentkezzen be másik módon.
diff --git a/auth/src/main/res/values-in/strings.xml b/auth/src/main/res/values-in/strings.xml
index ef5093027..8d4b49d89 100755
--- a/auth/src/main/res/values-in/strings.xml
+++ b/auth/src/main/res/values-in/strings.xml
@@ -10,7 +10,7 @@
Twitter
GitHub
Ponsel
- Email
+ Alamat email
Login dengan Google
Login dengan Google
Login dengan Facebook
@@ -31,7 +31,7 @@
Login dengan Yahoo
Login dengan Yahoo
Berikutnya
- Email
+ Alamat email
Nomor Telepon
Negara
Pilih negara
@@ -100,15 +100,15 @@
Nomor telepon terverifikasi secara otomatis
Kirim Ulang Kode
Verifikasi Nomor Telepon
- Use a different phone number
+ Gunakan nomor telepon lain
Dengan mengetuk “%1$s\", SMS mungkin akan dikirim. Mungkin dikenakan biaya pesan & data.
Dengan mengetuk “%1$s”, Anda menyatakan bahwa Anda menyetujui %2$s dan %3$s kami. SMS mungkin akan dikirim. Mungkin dikenakan biaya pesan & data.
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ Error Autentikasi
+ Coba lagi
+ Verifikasi tambahan diperlukan. Harap selesaikan autentikasi multi-faktor.
+ Akun perlu ditautkan. Harap coba metode login yang lain.
+ Autentikasi dibatalkan. Harap coba lagi saat Anda siap.
Pilih Metode Autentikasi
@@ -176,4 +176,17 @@
Autentikasi multifaktor saat ini dinonaktifkan
+ Email atau sandi tersebut salah
+ Sesi verifikasi tersebut sudah tidak valid. Minta kode baru.
+ Verifikasi telepon tidak selesai. Harap coba lagi.
+ Kredensial tersebut milik akun lain.
+ Nomor telepon tersebut tidak disiapkan untuk verifikasi di akun ini.
+ Sesi login Anda sudah berakhir. Login lagi untuk melanjutkan.
+ Link tersebut sudah tidak valid. Minta link baru.
+ Verifikasi alamat email Anda sebelum melanjutkan.
+ Metode verifikasi tersebut sudah disiapkan di akun ini.
+ Anda telah mencapai batas metode verifikasi di akun ini.
+ Sandi Anda tidak memenuhi persyaratan. Coba sandi lain.
+ Sandi terlalu panjang. Panjang maksimumnya adalah %1$d.
+ Kami tidak menemukan kunci sandi untuk akun ini. Login dengan cara lain.
diff --git a/auth/src/main/res/values-it/strings.xml b/auth/src/main/res/values-it/strings.xml
index da7f3a1a6..96ec746e4 100755
--- a/auth/src/main/res/values-it/strings.xml
+++ b/auth/src/main/res/values-it/strings.xml
@@ -100,7 +100,7 @@
Numero di telefono verificato automaticamente
Invia di nuovo il codice
Verifica numero di telefono
- Use a different phone number
+ Usa un altro numero di telefono
Se tocchi “%1$s”, è possibile che venga inviato un SMS. Potrebbero essere applicate le tariffe per l\'invio dei messaggi e per il traffico dati.
Se tocchi "%1$s", accetti i nostri %2$s e le nostre %3$s. È possibile che venga inviato un SMS. Potrebbero essere applicate le tariffe per l\'invio dei messaggi e per il traffico dati.
Errore di autenticazione
@@ -175,4 +175,17 @@
L\'autenticazione a più fattori è attualmente disabilitata
+ L\'email o la password non sono corretti
+ Questa sessione di verifica non è più valida. Richiedi un nuovo codice.
+ La verifica del telefono non è stata completata. Riprova.
+ Queste credenziali appartengono a un altro account.
+ Questo numero di telefono non è configurato per la verifica su questo account.
+ La tua sessione di accesso è scaduta. Accedi di nuovo per continuare.
+ Questo link non è più valido. Richiedine uno nuovo.
+ Verifica il tuo indirizzo email prima di continuare.
+ Questo metodo di verifica è già configurato su questo account.
+ Hai raggiunto il limite di metodi di verifica per questo account.
+ La tua password non soddisfa i requisiti. Provane un\'altra.
+ La password è troppo lunga. La lunghezza massima è %1$d.
+ Non abbiamo trovato una passkey per questo account. Accedi in un altro modo.
diff --git a/auth/src/main/res/values-iw/strings.xml b/auth/src/main/res/values-iw/strings.xml
index af4bc1c8c..229eb36ac 100755
--- a/auth/src/main/res/values-iw/strings.xml
+++ b/auth/src/main/res/values-iw/strings.xml
@@ -100,15 +100,15 @@
מספר הטלפון אומת באופן אוטומטי
שלח קוד חדש
אמת את מספר הטלפון
- Use a different phone number
+ שימוש במספר טלפון אחר
הקשה על “%1$s” עשויה לגרום לשליחה של הודעת SMS. ייתכן שיחולו תעריפי הודעות והעברת נתונים.
הקשה על “%1$s”, תפורש כהסכמתך ל%2$s ול%3$s. ייתכן שתישלח הודעת SMS. ייתכנו חיובים בגין שליחת הודעות ושימוש בנתונים.
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ שגיאת אימות
+ נסה שוב
+ נדרש אימות נוסף. יש להשלים אימות רב-שלבי.
+ יש לקשר את החשבון. יש לנסות שיטת כניסה אחרת.
+ האימות בוטל. יש לנסות שוב כשתהיו מוכנים.
בחר שיטת אימות
@@ -176,4 +176,17 @@
אימות רב-גורמי מושבת כעת
+ האימייל או הסיסמה שגויים
+ הפעלת האימות הזו כבר לא בתוקף. יש לבקש קוד חדש.
+ אימות הטלפון לא הושלם. יש לנסות שוב.
+ פרטי הכניסה האלה שייכים לחשבון אחר.
+ מספר הטלפון הזה לא מוגדר לאימות בחשבון הזה.
+ הפעלת הכניסה שלך פגה. יש להיכנס שוב כדי להמשיך.
+ הקישור הזה כבר לא בתוקף. יש לבקש קישור חדש.
+ יש לאמת את כתובת האימייל שלך לפני שממשיכים.
+ שיטת האימות הזו כבר מוגדרת בחשבון הזה.
+ הגעת למגבלה של שיטות אימות בחשבון הזה.
+ הסיסמה שלך לא עומדת בדרישות. אפשר לנסות סיסמה אחרת.
+ הסיסמה ארוכה מדי. האורך המקסימלי הוא %1$d.
+ לא נמצא מפתח גישה לחשבון הזה. אפשר להיכנס בדרך אחרת.
diff --git a/auth/src/main/res/values-ja/strings.xml b/auth/src/main/res/values-ja/strings.xml
index d540d4eda..edf85cf63 100755
--- a/auth/src/main/res/values-ja/strings.xml
+++ b/auth/src/main/res/values-ja/strings.xml
@@ -100,7 +100,7 @@
電話番号は自動的に確認されました
コードを再送信
電話番号を確認
- Use a different phone number
+ 別の電話番号を使用
[%1$s] をタップすると、SMS が送信されます。データ通信料がかかることがあります。
[%1$s] をタップすると、%2$s と %3$s に同意したことになり、SMS が送信されます。データ通信料がかかることがあります。
認証エラー
@@ -175,4 +175,17 @@
多要素認証は現在無効になっています
+ メールアドレスまたはパスワードが正しくありません
+ この確認セッションは無効になりました。新しいコードをリクエストしてください。
+ 電話番号の確認が完了しませんでした。もう一度お試しください。
+ この認証情報は別のアカウントのものです。
+ この電話番号は、このアカウントの確認方法として設定されていません。
+ ログインセッションの有効期限が切れました。続行するには、もう一度ログインしてください。
+ このリンクは無効になりました。新しいリンクをリクエストしてください。
+ 続行する前にメールアドレスを確認してください。
+ この確認方法はこのアカウントですでに設定されています。
+ このアカウントで設定できる確認方法の上限に達しました。
+ パスワードが要件を満たしていません。別のパスワードをお試しください。
+ パスワードが長すぎます。最大文字数は %1$d です。
+ このアカウントのパスキーが見つかりませんでした。別の方法でログインしてください。
diff --git a/auth/src/main/res/values-kn/strings.xml b/auth/src/main/res/values-kn/strings.xml
index 2be1d35d1..219eab569 100755
--- a/auth/src/main/res/values-kn/strings.xml
+++ b/auth/src/main/res/values-kn/strings.xml
@@ -100,15 +100,15 @@
ಫೋನ್ ಸಂಖ್ಯೆಯನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಪರಿಶೀಲಿಸಲಾಗಿದೆ
ಕೋಡ್ ಪುನಃ ಕಳುಹಿಸಿ
ಫೋನ್ ಸಂಖ್ಯೆಯನ್ನು ಪರಿಶೀಲಿಸಿ
- Use a different phone number
+ ಬೇರೆ ಫೋನ್ ಸಂಖ್ಯೆಯನ್ನು ಬಳಸಿ
“%1$s” ಅನ್ನು ಟ್ಯಾಪ್ ಮಾಡುವ ಮೂಲಕ, ಎಸ್ಎಂಎಸ್ ಅನ್ನು ಕಳುಹಿಸಬಹುದಾಗಿದೆ. ಸಂದೇಶ ಮತ್ತು ಡೇಟಾ ದರಗಳು ಅನ್ವಯಿಸಬಹುದು.
“%1$s” ಅನ್ನು ಟ್ಯಾಪ್ ಮಾಡುವ ಮೂಲಕ, ನೀವು ನಮ್ಮ %2$s ಮತ್ತು %3$s ಸ್ವೀಕರಿಸುತ್ತೀರಿ ಎಂದು ನೀವು ಸೂಚಿಸುತ್ತಿರುವಿರಿ. ಎಸ್ಎಂಎಸ್ ಅನ್ನು ಕಳುಹಿಸಬಹುದಾಗಿದೆ. ಸಂದೇಶ ಮತ್ತು ಡೇಟಾ ದರಗಳು ಅನ್ವಯಿಸಬಹುದು.
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ ಪ್ರಮಾಣೀಕರಣ ದೋಷ
+ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ
+ ಹೆಚ್ಚುವರಿ ಪರಿಶೀಲನೆ ಅಗತ್ಯವಿದೆ. ದಯವಿಟ್ಟು ಬಹು-ಅಂಶ ಪ್ರಮಾಣೀಕರಣವನ್ನು ಪೂರ್ಣಗೊಳಿಸಿ.
+ ಖಾತೆಯನ್ನು ಲಿಂಕ್ ಮಾಡಬೇಕಾಗಿದೆ. ದಯವಿಟ್ಟು ಬೇರೆ ಸೈನ್ ಇನ್ ವಿಧಾನವನ್ನು ಪ್ರಯತ್ನಿಸಿ.
+ ಪ್ರಮಾಣೀಕರಣವನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗಿದೆ. ನೀವು ಸಿದ್ಧರಾದಾಗ ದಯವಿಟ್ಟು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.
ದೃಢೀಕರಣ ವಿಧಾನವನ್ನು ಆಯ್ಕೆಮಾಡಿ
@@ -176,4 +176,17 @@
ಮಲ್ಟಿ-ಫ್ಯಾಕ್ಟರ್ ದೃಢೀಕರಣವು ಪ್ರಸ್ತುತ ನಿಷ್ಕ್ರಿಯಗೊಂಡಿದೆ
+ ಆ ಇಮೇಲ್ ಅಥವಾ ಪಾಸ್ವರ್ಡ್ ಸರಿಯಾಗಿಲ್ಲ
+ ಆ ಪರಿಶೀಲನಾ ಸೆಶನ್ ಇನ್ನು ಮುಂದೆ ಮಾನ್ಯವಾಗಿಲ್ಲ. ಹೊಸ ಕೋಡ್ಗೆ ವಿನಂತಿಸಿ.
+ ಫೋನ್ ಪರಿಶೀಲನೆ ಪೂರ್ಣಗೊಂಡಿಲ್ಲ. ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.
+ ಆ ರುಜುವಾತುಗಳು ಬೇರೆ ಖಾತೆಗೆ ಸೇರಿವೆ.
+ ಆ ಫೋನ್ ಸಂಖ್ಯೆಯನ್ನು ಈ ಖಾತೆಯಲ್ಲಿ ಪರಿಶೀಲನೆಗಾಗಿ ಹೊಂದಿಸಲಾಗಿಲ್ಲ.
+ ನಿಮ್ಮ ಸೈನ್ ಇನ್ ಸೆಶನ್ನ ಅವಧಿ ಮುಗಿದಿದೆ. ಮುಂದುವರಿಸಲು ಮತ್ತೆ ಸೈನ್ ಇನ್ ಮಾಡಿ.
+ ಆ ಲಿಂಕ್ ಇನ್ನು ಮುಂದೆ ಮಾನ್ಯವಾಗಿಲ್ಲ. ಹೊಸ ಲಿಂಕ್ಗೆ ವಿನಂತಿಸಿ.
+ ಮುಂದುವರಿಯುವ ಮೊದಲು ನಿಮ್ಮ ಇಮೇಲ್ ವಿಳಾಸವನ್ನು ಪರಿಶೀಲಿಸಿ.
+ ಆ ಪರಿಶೀಲನಾ ವಿಧಾನವನ್ನು ಈ ಖಾತೆಯಲ್ಲಿ ಈಗಾಗಲೇ ಹೊಂದಿಸಲಾಗಿದೆ.
+ ಈ ಖಾತೆಯಲ್ಲಿನ ಪರಿಶೀಲನಾ ವಿಧಾನಗಳ ಮಿತಿಯನ್ನು ನೀವು ತಲುಪಿದ್ದೀರಿ.
+ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅಗತ್ಯತೆಗಳನ್ನು ಪೂರೈಸುತ್ತಿಲ್ಲ. ಬೇರೊಂದನ್ನು ಪ್ರಯತ್ನಿಸಿ.
+ ಪಾಸ್ವರ್ಡ್ ತುಂಬಾ ಉದ್ದವಾಗಿದೆ. ಗರಿಷ್ಠ ಉದ್ದ %1$d ಆಗಿದೆ.
+ ಈ ಖಾತೆಗೆ ಪಾಸ್ಕೀ ಕಂಡುಬಂದಿಲ್ಲ. ಬೇರೆ ವಿಧಾನದಲ್ಲಿ ಸೈನ್ ಇನ್ ಮಾಡಿ.
diff --git a/auth/src/main/res/values-ko/strings.xml b/auth/src/main/res/values-ko/strings.xml
index abcbfc82e..68af356fc 100755
--- a/auth/src/main/res/values-ko/strings.xml
+++ b/auth/src/main/res/values-ko/strings.xml
@@ -100,7 +100,7 @@
전화번호가 자동으로 확인되었습니다.
코드 재전송
전화번호 인증
- Use a different phone number
+ 다른 전화번호 사용
“%1$s” 버튼을 탭하면 SMS가 발송될 수 있으며, 메시지 및 데이터 요금이 부과될 수 있습니다.
인증 오류
다시 시도
@@ -174,4 +174,17 @@
다단계 인증이 현재 비활성화되어 있습니다
+ 이메일 또는 비밀번호가 올바르지 않습니다.
+ 이 인증 세션은 더 이상 유효하지 않습니다. 새 코드를 요청하세요.
+ 전화번호 인증이 완료되지 않았습니다. 다시 시도하세요.
+ 이 사용자 인증 정보는 다른 계정에 속해 있습니다.
+ 이 전화번호는 이 계정의 인증 수단으로 설정되어 있지 않습니다.
+ 로그인 세션이 만료되었습니다. 계속하려면 다시 로그인하세요.
+ 이 링크는 더 이상 유효하지 않습니다. 새 링크를 요청하세요.
+ 계속하기 전에 이메일 주소를 인증하세요.
+ 이 인증 수단은 이 계정에 이미 설정되어 있습니다.
+ 이 계정에서 설정할 수 있는 인증 수단 한도에 도달했습니다.
+ 비밀번호가 요건을 충족하지 않습니다. 다른 비밀번호를 사용해 보세요.
+ 비밀번호가 너무 깁니다. 최대 길이는 %1$d입니다.
+ 이 계정의 패스키를 찾을 수 없습니다. 다른 방법으로 로그인하세요.
diff --git a/auth/src/main/res/values-ln/strings.xml b/auth/src/main/res/values-ln/strings.xml
index 1931ef376..56158ed0f 100755
--- a/auth/src/main/res/values-ln/strings.xml
+++ b/auth/src/main/res/values-ln/strings.xml
@@ -100,15 +100,15 @@
Numéro de téléphone validé automatiquement
Renvoyer le code
Valider le numéro de téléphone
- Use a different phone number
+ Salelá nimero mosusu ya telefone
En appuyant sur “%1$s”, vous déclencherez peut-être l\'envoi d\'un SMS. Des frais de messages et de données peuvent être facturés.
En appuyant sur “%1$s”, vous acceptez les %2$s et les %3$s. Vous déclencherez peut-être l\'envoi d\'un SMS. Des frais de messages et de données peuvent être facturés.
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ Libunga ya bondimi
+ Meka lisusu
+ Bondimi mosusu esengeli. Tosɛngi osilisa bondimisami ya makambo mingi.
+ Konte esengeli kokangisama. Tosɛngi omeka lolenge mosusu ya kokɔta.
+ Bondimi e-annulé. Tosɛngi omeka lisusu ntango okozala pene.
Pona lolenge ya bondimi
@@ -176,4 +176,17 @@
Bondimisami ya makambo mingi ezali sikoyo te
+ Email to password wana ezali sembo te
+ Session wana ya bondimi ezali lisusu na ntina te. Sɛnga kode ya sika.
+ Bondimi ya telefone esili te. Meka lisusu.
+ Ba code wana ya kokɔta ezali ya konte mosusu.
+ Nimero wana ya telefone ebongisami te mpo na bondimi na konte oyo.
+ Session na yo ya kokɔta esili. Kɔta lisusu mpo na kokoba.
+ Lien wana ezali lisusu malamu te. Sɛnga lien ya sika.
+ Ndimisa adrɛsɛ na yo ya email liboso ya kokoba.
+ Lolenge wana ya bondimi ebongisami déjà na konte oyo.
+ Okómi na ndelo ya balolenge ya bondimi na konte oyo.
+ Mot de passe na yo ekokisi te makambo esengeli. Meka mosusu.
+ Mot de passe ezali molayi mingi. Molayi ya likolo ezali %1$d.
+ Tomonaki te clé ya kokɔta mpo na compte oyo. Kɔta na ndenge mosusu.
diff --git a/auth/src/main/res/values-lt/strings.xml b/auth/src/main/res/values-lt/strings.xml
index b68b5aabb..fea42f95f 100755
--- a/auth/src/main/res/values-lt/strings.xml
+++ b/auth/src/main/res/values-lt/strings.xml
@@ -100,15 +100,15 @@
Telefono numeris patvirtintas automatiškai
Siųsti kodą iš naujo
Patvirtinti telefono numerį
- Use a different phone number
+ Naudoti kitą telefono numerį
Palietus „%1$s“ gali būti išsiųstas SMS pranešimas. Gali būti taikomi pranešimų ir duomenų įkainiai.
Paliesdami „%1$s“ nurodote, kad sutinkate su %2$s ir %3$s. Gali būti išsiųstas SMS pranešimas, taip pat – taikomi pranešimų ir duomenų įkainiai.
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ Autentifikavimo klaida
+ Bandykite dar kartą
+ Reikalingas papildomas patvirtinimas. Užbaikite kelių veiksnių autentifikavimą.
+ Paskyrą reikia susieti. Išbandykite kitą prisijungimo būdą.
+ Autentifikavimas buvo atšauktas. Kai būsite pasirengę, bandykite dar kartą.
Pasirinkite autentifikavimo metodą
@@ -176,4 +176,17 @@
Daugiafaktoris tapatybės nustatymas šiuo metu išjungtas
+ Šis el. pašto adresas arba slaptažodis neteisingas
+ Šis patvirtinimo seansas nebegalioja. Paprašykite naujo kodo.
+ Telefono numerio patvirtinimas nebuvo baigtas. Bandykite dar kartą.
+ Šie prisijungimo duomenys priklauso kitai paskyrai.
+ Šis telefono numeris nenustatytas kaip patvirtinimo būdas šioje paskyroje.
+ Jūsų prisijungimo seansas baigėsi. Norėdami tęsti, prisijunkite dar kartą.
+ Ši nuoroda nebegalioja. Paprašykite naujos.
+ Prieš tęsdami patvirtinkite savo el. pašto adresą.
+ Šis patvirtinimo būdas šioje paskyroje jau nustatytas.
+ Pasiekėte šios paskyros patvirtinimo būdų ribą.
+ Jūsų slaptažodis neatitinka reikalavimų. Išbandykite kitą.
+ Slaptažodis per ilgas. Didžiausias ilgis yra %1$d.
+ Nepavyko rasti šios paskyros prieigos rakto. Prisijunkite kitu būdu.
diff --git a/auth/src/main/res/values-lv/strings.xml b/auth/src/main/res/values-lv/strings.xml
index fb0f2ca26..a64f51836 100755
--- a/auth/src/main/res/values-lv/strings.xml
+++ b/auth/src/main/res/values-lv/strings.xml
@@ -100,15 +100,15 @@
Tālruņa numurs tika automātiski verificēts
Vēlreiz nosūtīt kodu
Verificēt tālruņa numuru
- Use a different phone number
+ Izmantot citu tālruņa numuru
Pieskaroties pogai %1$s, var tikt nosūtīta īsziņa. Var tikt piemērota maksa par ziņojumiem un datu pārsūtīšanu.
Pieskaroties pogai “%1$s”, jūs norādāt, ka piekrītat šādiem dokumentiem: %2$s un %3$s. Var tikt nosūtīta īsziņa. Var tikt piemērota maksa par ziņojumiem un datu pārsūtīšanu.
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ Autentifikācijas kļūda
+ Mēģiniet vēlreiz
+ Nepieciešama papildu verifikācija. Lūdzu, pabeidziet vairāku faktoru autentifikāciju.
+ Konts ir jāsaista. Lūdzu, izmēģiniet citu pierakstīšanās metodi.
+ Autentifikācija tika atcelta. Lūdzu, mēģiniet vēlreiz, kad būsiet gatavs.
Izvēlieties autentifikācijas metodi
@@ -176,4 +176,17 @@
Daudzfaktoru autentifikācija pašlaik ir atspējota
+ E-pasta adrese vai parole nav pareiza
+ Šī verifikācijas sesija vairs nav derīga. Pieprasiet jaunu kodu.
+ Tālruņa numura verifikācija netika pabeigta. Lūdzu, mēģiniet vēlreiz.
+ Šie akreditācijas dati pieder citam kontam.
+ Šis tālruņa numurs šajā kontā nav iestatīts verifikācijai.
+ Jūsu pierakstīšanās sesijai ir beidzies derīguma termiņš. Lai turpinātu, piesakieties vēlreiz.
+ Šī saite vairs nav derīga. Pieprasiet jaunu.
+ Pirms turpināt, verificējiet savu e-pasta adresi.
+ Šī verifikācijas metode šajā kontā jau ir iestatīta.
+ Jūs esat sasniedzis šī konta verifikācijas metožu ierobežojumu.
+ Jūsu parole neatbilst prasībām. Mēģiniet citu.
+ Parole ir pārāk gara. Maksimālais garums ir %1$d.
+ Neatradām šī konta piekļuves atslēgu. Piesakieties citā veidā.
diff --git a/auth/src/main/res/values-mo/strings.xml b/auth/src/main/res/values-mo/strings.xml
index f96444e77..ca1ffcb4f 100755
--- a/auth/src/main/res/values-mo/strings.xml
+++ b/auth/src/main/res/values-mo/strings.xml
@@ -100,15 +100,15 @@
Numărul de telefon este verificat automat
Retrimiteți codul
Confirmați numărul de telefon
- Use a different phone number
+ Folosiți alt număr de telefon
Dacă atingeți „%1$s”, poate fi trimis un SMS. Se pot aplica tarife pentru mesaje și date.
Dacă atingeți „%1$s”, sunteți de acord cu %2$s și cu %3$s. Poate fi trimis un SMS. Se pot aplica tarife pentru mesaje și date.
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ Eroare de autentificare
+ Încercați din nou
+ Este necesară o verificare suplimentară. Finalizați autentificarea cu mai mulți factori.
+ Contul trebuie asociat. Încercați altă metodă de conectare.
+ Autentificarea a fost anulată. Încercați din nou când sunteți gata.
Alegeți metoda de autentificare
@@ -176,4 +176,17 @@
Autentificarea cu mai mulți factori este dezactivată în prezent
+ Adresa de e-mail sau parola nu este corectă
+ Sesiunea de verificare nu mai este validă. Solicitați un cod nou.
+ Verificarea numărului de telefon nu s-a finalizat. Încercați din nou.
+ Aceste date de conectare aparțin altui cont.
+ Acest număr de telefon nu este configurat pentru verificare în acest cont.
+ Sesiunea de conectare a expirat. Conectați-vă din nou pentru a continua.
+ Acest link nu mai este valid. Solicitați unul nou.
+ Confirmați adresa de e-mail înainte de a continua.
+ Această metodă de verificare este deja configurată în acest cont.
+ Ați atins limita de metode de verificare pentru acest cont.
+ Parola nu îndeplinește cerințele. Încercați alta.
+ Parola este prea lungă. Lungimea maximă este %1$d.
+ Nu am găsit o cheie de acces pentru acest cont. Conectați-vă în alt mod.
diff --git a/auth/src/main/res/values-mr/strings.xml b/auth/src/main/res/values-mr/strings.xml
index 38d2a9c8d..771bcceaf 100755
--- a/auth/src/main/res/values-mr/strings.xml
+++ b/auth/src/main/res/values-mr/strings.xml
@@ -100,15 +100,15 @@
फोन नंबरची अपोआप पडताळणी केली आहे
कोड पुन्हा पाठवा
फोन नंबरची पडताळणी करा
- Use a different phone number
+ वेगळा फोन नंबर वापरा
“%1$s“ वर टॅप केल्याने, एक एसएमएस पाठवला जाऊ शकतो. मेसेज आणि डेटा शुल्क लागू होऊ शकते.
“%1$s” वर टॅप करून, तुम्ही सूचित करता की तुम्ही आमचे %2$s आणि %3$s स्वीकारता. एसएमएस पाठवला जाऊ शकतो. मेसेज आणि डेटा दर लागू केले जाऊ शकते.
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ प्रमाणीकरण एरर
+ पुन्हा प्रयत्न करा
+ अतिरिक्त पडताळणी आवश्यक आहे. कृपया मल्टी-फॅक्टर प्रमाणीकरण पूर्ण करा.
+ खाते लिंक करणे आवश्यक आहे. कृपया वेगळी साइन इन पद्धत वापरून पहा.
+ प्रमाणीकरण रद्द केले गेले. तुम्ही तयार असाल तेव्हा कृपया पुन्हा प्रयत्न करा.
प्रमाणीकरण पद्धत निवडा
@@ -176,4 +176,17 @@
मल्टी-फॅक्टर ऑथेंटिकेशन सध्या अक्षम आहे
+ ते ईमेल किंवा पासवर्ड बरोबर नाही
+ ते पडताळणी सत्र यापुढे वैध नाही. नवीन कोडची विनंती करा.
+ फोनची पडताळणी पूर्ण झाली नाही. कृपया पुन्हा प्रयत्न करा.
+ ती क्रेडेन्शियल वेगळ्या खात्याची आहेत.
+ तो फोन नंबर या खात्यावर पडताळणीसाठी सेट केलेला नाही.
+ तुमचे साइन इन सत्र एक्स्पायर झाले आहे. सुरू ठेवण्यासाठी पुन्हा साइन इन करा.
+ ती लिंक यापुढे वैध नाही. नवीन लिंकची विनंती करा.
+ तुम्ही पुढे सुरू ठेवण्यापूर्वी तुमच्या ईमेल ॲड्रेसची पडताळणी करा.
+ ती पडताळणी पद्धत या खात्यावर आधीपासून सेट केलेली आहे.
+ तुम्ही या खात्यावरील पडताळणी पद्धतींची मर्यादा गाठली आहे.
+ तुमचा पासवर्ड आवश्यकता पूर्ण करत नाही. दुसरा पासवर्ड वापरून पहा.
+ पासवर्ड खूप लांब आहे. कमाल लांबी %1$d आहे.
+ या खात्यासाठी पासकी सापडली नाही. दुसऱ्या पद्धतीने साइन इन करा.
diff --git a/auth/src/main/res/values-ms/strings.xml b/auth/src/main/res/values-ms/strings.xml
index f06075d77..fe4783061 100755
--- a/auth/src/main/res/values-ms/strings.xml
+++ b/auth/src/main/res/values-ms/strings.xml
@@ -100,15 +100,15 @@
Nombor telefon disahkan secara automatik
Hantar Semula Kod
Sahkan Nombor Telefon
- Use a different phone number
+ Gunakan nombor telefon lain
Dengan mengetik “%1$s”, SMS akan dihantar. Tertakluk pada kadar mesej & data.
Dengan mengetik “%1$s”, anda menyatakan bahawa anda menerima %2$s dan %3$s kami. SMS akan dihantar. Tertakluk pada kadar mesej & data.
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ Ralat Pengesahan
+ Cuba lagi
+ Pengesahan tambahan diperlukan. Sila lengkapkan pengesahan berbilang faktor.
+ Akaun perlu dipautkan. Sila cuba kaedah log masuk yang lain.
+ Pengesahan dibatalkan. Sila cuba lagi apabila anda bersedia.
Pilih Kaedah Pengesahan
@@ -176,4 +176,17 @@
Pengesahan berbilang faktor dilumpuhkan buat masa ini
+ E-mel atau kata laluan tersebut tidak betul
+ Sesi pengesahan tersebut tidak sah lagi. Minta kod baharu.
+ Pengesahan telefon tidak selesai. Sila cuba lagi.
+ Kelayakan tersebut milik akaun lain.
+ Nombor telefon tersebut tidak disediakan untuk pengesahan pada akaun ini.
+ Sesi log masuk anda telah tamat tempoh. Log masuk semula untuk meneruskan.
+ Pautan tersebut tidak sah lagi. Minta pautan baharu.
+ Sahkan alamat e-mel anda sebelum anda meneruskan.
+ Kaedah pengesahan tersebut telah pun disediakan pada akaun ini.
+ Anda telah mencapai had kaedah pengesahan pada akaun ini.
+ Kata laluan anda tidak memenuhi keperluan. Cuba kata laluan lain.
+ Kata laluan terlalu panjang. Panjang maksimum ialah %1$d.
+ Kami tidak menemui kunci laluan untuk akaun ini. Log masuk dengan cara lain.
diff --git a/auth/src/main/res/values-nb/strings.xml b/auth/src/main/res/values-nb/strings.xml
index ac494d9cd..46abccbc3 100755
--- a/auth/src/main/res/values-nb/strings.xml
+++ b/auth/src/main/res/values-nb/strings.xml
@@ -100,7 +100,7 @@
Telefonnummeret ble bekreftet automatisk
Send koden på nytt
Bekreft telefonnummeret
- Use a different phone number
+ Bruk et annet telefonnummer
Når du trykker på «%1$s», kan det bli sendt en SMS. Kostnader for meldinger og datatrafikk kan påløpe.
Ved å trykke på «%1$s» godtar du %2$s og %3$s våre. Du kan bli tilsendt en SMS. Kostnader for meldinger og datatrafikk kan påløpe.
Godkjenningsfeil
@@ -175,4 +175,17 @@
Flerfaktorautentisering er for øyeblikket deaktivert
+ E-postadressen eller passordet er feil
+ Denne bekreftelsesøkten er ikke lenger gyldig. Be om en ny kode.
+ Telefonbekreftelsen ble ikke fullført. Prøv igjen.
+ Denne påloggingsinformasjonen tilhører en annen konto.
+ Dette telefonnummeret er ikke satt opp for bekreftelse på denne kontoen.
+ Påloggingsøkten din er utløpt. Logg på igjen for å fortsette.
+ Denne lenken er ikke lenger gyldig. Be om en ny.
+ Bekreft e-postadressen din før du fortsetter.
+ Denne bekreftelsesmetoden er allerede satt opp på denne kontoen.
+ Du har nådd grensen for bekreftelsesmetoder på denne kontoen.
+ Passordet ditt oppfyller ikke kravene. Prøv et annet.
+ Passordet er for langt. Maksimal lengde er %1$d.
+ Vi fant ingen passnøkkel for denne kontoen. Logg på en annen måte.
diff --git a/auth/src/main/res/values-nl/strings.xml b/auth/src/main/res/values-nl/strings.xml
index 064497191..238601ec1 100755
--- a/auth/src/main/res/values-nl/strings.xml
+++ b/auth/src/main/res/values-nl/strings.xml
@@ -100,7 +100,7 @@
Telefoonnummer is automatisch geverifieerd
Code opnieuw verzenden
Telefoonnummer verifiëren
- Use a different phone number
+ Gebruik een ander telefoonnummer
Als u op “%1$s” tikt, ontvangt u mogelijk een sms. Er kunnen sms- en datakosten in rekening worden gebracht.
Als u op "%1$s" tikt, geeft u aan dat u onze %2$s en ons %3$s accepteert. Mogelijk ontvangt u een sms. Er kunnen sms- en datakosten in rekening worden gebracht.
Authenticatiefout
@@ -175,4 +175,17 @@
Multi-factorauthenticatie is momenteel uitgeschakeld
+ Dat e-mailadres of wachtwoord is onjuist
+ Deze verificatiesessie is niet meer geldig. Vraag een nieuwe code aan.
+ De telefoonverificatie is niet voltooid. Probeer het opnieuw.
+ Deze inloggegevens horen bij een ander account.
+ Dat telefoonnummer is niet ingesteld voor verificatie op dit account.
+ Uw inlogsessie is vervallen. Log opnieuw in om door te gaan.
+ Deze link is niet meer geldig. Vraag een nieuwe aan.
+ Bevestig uw e-mailadres voordat u doorgaat.
+ Deze verificatiemethode is al ingesteld op dit account.
+ U heeft de limiet voor verificatiemethoden op dit account bereikt.
+ Uw wachtwoord voldoet niet aan de vereisten. Probeer een ander wachtwoord.
+ Het wachtwoord is te lang. De maximale lengte is %1$d.
+ We hebben geen toegangssleutel voor dit account gevonden. Log op een andere manier in.
diff --git a/auth/src/main/res/values-no/strings.xml b/auth/src/main/res/values-no/strings.xml
index 7df53a222..df19bd5b6 100755
--- a/auth/src/main/res/values-no/strings.xml
+++ b/auth/src/main/res/values-no/strings.xml
@@ -100,15 +100,15 @@
Telefonnummeret ble bekreftet automatisk
Send koden på nytt
Bekreft telefonnummeret
- Use a different phone number
+ Bruk et annet telefonnummer
Når du trykker på «%1$s», kan det bli sendt en SMS. Kostnader for meldinger og datatrafikk kan påløpe.
Ved å trykke på «%1$s» godtar du %2$s og %3$s våre. Du kan bli tilsendt en SMS. Kostnader for meldinger og datatrafikk kan påløpe.
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ Godkjenningsfeil
+ Prøv igjen
+ Ytterligere verifisering kreves. Vennligst fullfør multifaktorgodkjenning.
+ Kontoen må kobles. Prøv en annen påloggingsmetode.
+ Godkjenning ble avbrutt. Prøv igjen når du er klar.
Velg autentiseringsmetode
@@ -176,4 +176,17 @@
Flerfaktorautentisering er for øyeblikket deaktivert
+ E-postadressen eller passordet er feil
+ Denne bekreftelsesøkten er ikke lenger gyldig. Be om en ny kode.
+ Telefonbekreftelsen ble ikke fullført. Prøv igjen.
+ Denne påloggingsinformasjonen tilhører en annen konto.
+ Dette telefonnummeret er ikke satt opp for bekreftelse på denne kontoen.
+ Påloggingsøkten din er utløpt. Logg på igjen for å fortsette.
+ Denne lenken er ikke lenger gyldig. Be om en ny.
+ Bekreft e-postadressen din før du fortsetter.
+ Denne bekreftelsesmetoden er allerede satt opp på denne kontoen.
+ Du har nådd grensen for bekreftelsesmetoder på denne kontoen.
+ Passordet ditt oppfyller ikke kravene. Prøv et annet.
+ Passordet er for langt. Maksimal lengde er %1$d.
+ Vi fant ingen passnøkkel for denne kontoen. Logg på en annen måte.
diff --git a/auth/src/main/res/values-pl/strings.xml b/auth/src/main/res/values-pl/strings.xml
index f651ddb89..76715ce81 100755
--- a/auth/src/main/res/values-pl/strings.xml
+++ b/auth/src/main/res/values-pl/strings.xml
@@ -100,7 +100,7 @@
Numer telefonu został automatycznie zweryfikowany
Wyślij kod ponownie
Zweryfikuj numer telefonu
- Use a different phone number
+ Użyj innego numeru telefonu
Gdy klikniesz „%1$s”, może zostać wysłany SMS. Może to skutkować pobraniem opłaty za przesłanie wiadomości i danych.
Klikając „%1$s", potwierdzasz, że akceptujesz te dokumenty: %2$s i %3$s. Może zostać wysłany SMS. Może to skutkować pobraniem opłat za przesłanie wiadomości i danych.
Błąd uwierzytelniania
@@ -175,4 +175,17 @@
Uwierzytelnianie wieloskładnikowe jest obecnie wyłączone
+ Ten adres e-mail lub hasło są nieprawidłowe
+ Ta sesja weryfikacji nie jest już ważna. Poproś o nowy kod.
+ Weryfikacja numeru telefonu nie została ukończona. Spróbuj ponownie.
+ Te dane logowania należą do innego konta.
+ Ten numer telefonu nie jest skonfigurowany do weryfikacji na tym koncie.
+ Sesja logowania wygasła. Zaloguj się ponownie, aby kontynuować.
+ Ten link nie jest już ważny. Poproś o nowy.
+ Zweryfikuj swój adres e-mail, zanim przejdziesz dalej.
+ Ta metoda weryfikacji jest już skonfigurowana na tym koncie.
+ Osiągnięto limit metod weryfikacji na tym koncie.
+ Twoje hasło nie spełnia wymagań. Spróbuj innego.
+ Hasło jest za długie. Maksymalna długość to %1$d.
+ Nie znaleziono klucza dostępu do tego konta. Zaloguj się w inny sposób.
diff --git a/auth/src/main/res/values-pt-rBR/strings.xml b/auth/src/main/res/values-pt-rBR/strings.xml
index 76704c93f..e2f997db5 100755
--- a/auth/src/main/res/values-pt-rBR/strings.xml
+++ b/auth/src/main/res/values-pt-rBR/strings.xml
@@ -100,15 +100,15 @@
O número de telefone foi verificado automaticamente
Reenviar código
Confirmar número de telefone
- Use a different phone number
+ Usar outro número de telefone
Se você tocar em “%1$s”, um SMS poderá ser enviado e tarifas de mensagens e de dados serão cobradas.
Ao tocar em “%1$s”, você concorda com nossos %2$s e a %3$s. Um SMS poderá ser enviado e tarifas de mensagens e de dados poderão ser cobradas.
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ Erro de autenticação
+ Tentar novamente
+ Verificação adicional necessária. Conclua a autenticação de vários fatores.
+ A conta precisa ser vinculada. Tente um método de login diferente.
+ A autenticação foi cancelada. Tente novamente quando estiver pronto.
Escolher método de autenticação
@@ -194,4 +194,17 @@
A autenticação multifator está atualmente desativada
+ O e-mail ou a senha está incorreto
+ Esta sessão de verificação não é mais válida. Solicite um novo código.
+ A verificação por telefone não foi concluída. Tente novamente.
+ Essas credenciais pertencem a outra conta.
+ Esse número de telefone não está configurado para verificação nesta conta.
+ Sua sessão de login expirou. Faça login novamente para continuar.
+ Esse link não é mais válido. Solicite um novo.
+ Verifique seu endereço de e-mail antes de continuar.
+ Esse método de verificação já está configurado nesta conta.
+ Você atingiu o limite de métodos de verificação nesta conta.
+ Sua senha não atende aos requisitos. Tente outra.
+ A senha é muito longa. O tamanho máximo é %1$d.
+ Não encontramos uma chave de acesso para esta conta. Faça login de outra forma.
diff --git a/auth/src/main/res/values-pt-rPT/strings.xml b/auth/src/main/res/values-pt-rPT/strings.xml
index 8c7a2a173..cdf0180a4 100755
--- a/auth/src/main/res/values-pt-rPT/strings.xml
+++ b/auth/src/main/res/values-pt-rPT/strings.xml
@@ -100,15 +100,15 @@
Número de telefone verificado automaticamente
Reenviar código
Validar número de telefone
- Use a different phone number
+ Usar outro número de telefone
Ao tocar em “%1$s”, pode gerar o envio de uma SMS. Podem aplicar-se tarifas de mensagens e dados.
Ao tocar em “%1$s”, indica que aceita os %2$s e a %3$s. Pode gerar o envio de uma SMS. Podem aplicar-se tarifas de dados e de mensagens.
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ Erro de autenticação
+ Tentar novamente
+ Verificação adicional necessária. Conclua a autenticação multifator.
+ A conta tem de ser associada. Experimente um método de início de sessão diferente.
+ A autenticação foi cancelada. Tente novamente quando estiver pronto.
Escolher método de autenticação
@@ -194,4 +194,17 @@
A autenticação multifator está atualmente desativada
+ O email ou a palavra-passe estão incorretos
+ Esta sessão de validação já não é válida. Solicite um novo código.
+ A validação do número de telefone não foi concluída. Tente novamente.
+ Estas credenciais pertencem a outra conta.
+ Este número de telefone não está configurado para validação nesta conta.
+ A sua sessão terminou. Inicie sessão novamente para continuar.
+ Este link já não é válido. Solicite um novo.
+ Valide o seu endereço de email antes de continuar.
+ Este método de validação já está configurado nesta conta.
+ Atingiu o limite de métodos de validação nesta conta.
+ A sua palavra-passe não cumpre os requisitos. Experimente outra.
+ A palavra-passe é demasiado longa. O comprimento máximo é %1$d.
+ Não encontrámos uma chave de acesso para esta conta. Inicie sessão de outra forma.
diff --git a/auth/src/main/res/values-pt/strings.xml b/auth/src/main/res/values-pt/strings.xml
index 5ee4a9aa8..4b6198343 100755
--- a/auth/src/main/res/values-pt/strings.xml
+++ b/auth/src/main/res/values-pt/strings.xml
@@ -100,7 +100,7 @@
O número de telefone foi verificado automaticamente
Reenviar código
Confirmar número de telefone
- Use a different phone number
+ Usar outro número de telefone
Se você tocar em “%1$s”, um SMS poderá ser enviado e tarifas de mensagens e de dados serão cobradas.
Ao tocar em "%1$s", você concorda com nossos %2$s e a %3$s. Um SMS poderá ser enviado e tarifas de mensagens e de dados poderão ser cobradas.
Erro de autenticação
@@ -193,4 +193,17 @@
A autenticação multifator está atualmente desativada
+ O e-mail ou a senha está incorreto
+ Esta sessão de verificação não é mais válida. Solicite um novo código.
+ A verificação por telefone não foi concluída. Tente novamente.
+ Essas credenciais pertencem a outra conta.
+ Esse número de telefone não está configurado para verificação nesta conta.
+ Sua sessão de login expirou. Faça login novamente para continuar.
+ Esse link não é mais válido. Solicite um novo.
+ Verifique seu endereço de e-mail antes de continuar.
+ Esse método de verificação já está configurado nesta conta.
+ Você atingiu o limite de métodos de verificação nesta conta.
+ Sua senha não atende aos requisitos. Tente outra.
+ A senha é muito longa. O tamanho máximo é %1$d.
+ Não encontramos uma chave de acesso para esta conta. Faça login de outra forma.
diff --git a/auth/src/main/res/values-ro/strings.xml b/auth/src/main/res/values-ro/strings.xml
index 6b0d3a048..e94512f75 100755
--- a/auth/src/main/res/values-ro/strings.xml
+++ b/auth/src/main/res/values-ro/strings.xml
@@ -100,7 +100,7 @@
Numărul de telefon este verificat automat
Retrimiteți codul
Confirmați numărul de telefon
- Use a different phone number
+ Folosiți alt număr de telefon
Dacă atingeți „%1$s”, poate fi trimis un SMS. Se pot aplica tarife pentru mesaje și date.
Dacă atingeți „%1$s", sunteți de acord cu %2$s și cu %3$s. Poate fi trimis un SMS. Se pot aplica tarife pentru mesaje și date.
Eroare de autentificare
@@ -175,4 +175,17 @@
Autentificarea cu mai mulți factori este dezactivată în prezent
+ Adresa de e-mail sau parola nu este corectă
+ Această sesiune de verificare nu mai este validă. Solicitați un cod nou.
+ Verificarea numărului de telefon nu a fost finalizată. Încercați din nou.
+ Aceste date de conectare aparțin altui cont.
+ Acest număr de telefon nu este configurat pentru verificare în acest cont.
+ Sesiunea de conectare a expirat. Conectați-vă din nou pentru a continua.
+ Acest link nu mai este valid. Solicitați unul nou.
+ Confirmați adresa de e-mail înainte de a continua.
+ Această metodă de verificare este deja configurată în acest cont.
+ Ați atins limita de metode de verificare pentru acest cont.
+ Parola nu îndeplinește cerințele. Încercați alta.
+ Parola este prea lungă. Lungimea maximă este %1$d.
+ Nu am găsit o cheie de acces pentru acest cont. Conectați-vă în alt mod.
diff --git a/auth/src/main/res/values-ru/strings.xml b/auth/src/main/res/values-ru/strings.xml
index ebf567549..de2d5622f 100755
--- a/auth/src/main/res/values-ru/strings.xml
+++ b/auth/src/main/res/values-ru/strings.xml
@@ -100,7 +100,7 @@
Номер телефона был подтвержден автоматически
Отправить код ещё раз
Подтвердить номер телефона
- Use a different phone number
+ Использовать другой номер телефона
Нажимая кнопку “%1$s”, вы соглашаетесь получить SMS. За его отправку и обмен данными может взиматься плата.
Нажимая кнопку "%1$s", вы принимаете %2$s и %3$s, а также соглашаетесь получить SMS. За его отправку и обмен данными может взиматься плата.
Ошибка аутентификации
@@ -175,4 +175,17 @@
Многофакторная аутентификация в настоящее время отключена
+ Неправильный адрес электронной почты или пароль
+ Этот сеанс проверки больше не действителен. Запросите новый код.
+ Не удалось подтвердить номер телефона. Повторите попытку.
+ Эти учётные данные принадлежат другому аккаунту.
+ Этот номер телефона не настроен для подтверждения в этом аккаунте.
+ Сеанс входа истёк. Войдите ещё раз, чтобы продолжить.
+ Эта ссылка больше не действительна. Запросите новую.
+ Подтвердите адрес электронной почты, прежде чем продолжить.
+ Этот способ подтверждения уже настроен в этом аккаунте.
+ Достигнут лимит способов подтверждения для этого аккаунта.
+ Пароль не соответствует требованиям. Попробуйте другой.
+ Пароль слишком длинный. Максимальная длина – %1$d.
+ Не удалось найти ключ доступа для этого аккаунта. Войдите другим способом.
diff --git a/auth/src/main/res/values-sk/strings.xml b/auth/src/main/res/values-sk/strings.xml
index 0786594fd..84fe70ddd 100755
--- a/auth/src/main/res/values-sk/strings.xml
+++ b/auth/src/main/res/values-sk/strings.xml
@@ -100,7 +100,7 @@
Telefónne číslo bolo automaticky overené
Znova odoslať kód
Overiť telefónne číslo
- Use a different phone number
+ Použiť iné telefónne číslo
Klepnutím na tlačidlo %1$s možno odoslať SMS. Môžu sa účtovať poplatky za správy a dáta.
Klepnutím na tlačidlo %1$s vyjadrujete súhlas s dokumentmi %2$s a %3$s. Môže byť odoslaná SMS a môžu sa účtovať poplatky za správy a dáta.
Chyba overenia
@@ -175,4 +175,17 @@
Viacfaktorové overovanie je momentálne zakázané
+ Tento e-mail alebo heslo nie je správne
+ Táto overovacia relácia už nie je platná. Vyžiadajte si nový kód.
+ Overenie telefónneho čísla sa nedokončilo. Skúste to znova.
+ Tieto prihlasovacie údaje patria inému účtu.
+ Toto telefónne číslo nie je v tomto účte nastavené na overovanie.
+ Vaša prihlasovacia relácia vypršala. Ak chcete pokračovať, prihláste sa znova.
+ Tento odkaz už nie je platný. Vyžiadajte si nový.
+ Skôr než budete pokračovať, overte svoju e-mailovú adresu.
+ Táto metóda overenia je v tomto účte už nastavená.
+ Dosiahli ste limit metód overenia pre tento účet.
+ Vaše heslo nespĺňa požiadavky. Skúste iné.
+ Heslo je príliš dlhé. Maximálna dĺžka je %1$d.
+ Pre tento účet sa nenašiel prístupový kľúč. Prihláste sa iným spôsobom.
diff --git a/auth/src/main/res/values-sl/strings.xml b/auth/src/main/res/values-sl/strings.xml
index 3375bd8c0..45d754965 100755
--- a/auth/src/main/res/values-sl/strings.xml
+++ b/auth/src/main/res/values-sl/strings.xml
@@ -100,15 +100,15 @@
Telefonska številka je bila samodejno preverjena
Ponovno pošlji kodo
Preverjanje telefonske številke
- Use a different phone number
+ Uporabi drugo telefonsko številko
Če se dotaknete možnosti »%1$s«, bo morda poslano sporočilo SMS. Pošiljanje sporočila in prenos podatkov boste morda morali plačati.
Če se dotaknete možnosti »%1$s«, potrjujete, da se strinjate z dokumentoma %2$s in %3$s. Morda bo poslano sporočilo SMS. Pošiljanje sporočila in prenos podatkov boste morda morali plačati.
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ Napaka pri preverjanju pristnosti
+ Poskusite znova
+ Potrebno je dodatno preverjanje. Dokončajte večstopenjsko preverjanje pristnosti.
+ Račun je treba povezati. Poskusite z drugim načinom prijave.
+ Preverjanje pristnosti je bilo preklicano. Ko boste pripravljeni, poskusite znova.
Izberite način preverjanja pristnosti
@@ -176,4 +176,17 @@
Večfaktorska avtentikacija je trenutno onemogočena
+ E-poštni naslov ali geslo ni pravilno
+ Ta seja preverjanja ni več veljavna. Zahtevajte novo kodo.
+ Preverjanje telefonske številke ni bilo dokončano. Poskusite znova.
+ Ti poverilnici pripadata drugemu računu.
+ Ta telefonska številka v tem računu ni nastavljena za preverjanje.
+ Vaša prijavna seja je potekla. Za nadaljevanje se znova prijavite.
+ Ta povezava ni več veljavna. Zahtevajte novo.
+ Preden nadaljujete, preverite svoj e-poštni naslov.
+ Ta način preverjanja je v tem računu že nastavljen.
+ Dosegli ste omejitev števila načinov preverjanja v tem računu.
+ Vaše geslo ne izpolnjuje zahtev. Poskusite z drugim.
+ Geslo je predolgo. Največja dolžina je %1$d.
+ Za ta račun nismo našli ključa za dostop. Prijavite se na drug način.
diff --git a/auth/src/main/res/values-sr/strings.xml b/auth/src/main/res/values-sr/strings.xml
index 7266b80e4..bbc34a4c3 100755
--- a/auth/src/main/res/values-sr/strings.xml
+++ b/auth/src/main/res/values-sr/strings.xml
@@ -100,15 +100,15 @@
Број телефона је аутоматски верификован
Поново пошаљи кôд
Верификуј број телефона
- Use a different phone number
+ Користи други број телефона
Ако додирнете „%1$s“, можда ћете послати SMS. Могу да вам буду наплаћени трошкови слања поруке и преноса података.
Ако додирнете „%1$s“, потврђујете да прихватате документе %2$s и %3$s. Можда ћете послати SMS. Могу да вам буду наплаћени трошкови слања поруке и преноса података.
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ Грешка при аутентификацији
+ Пробајте поново
+ Потребна је додатна верификација. Довршите аутентификацију са више фактора.
+ Налог треба да се повеже. Пробајте други метод пријављивања.
+ Аутентификација је отказана. Пробајте поново када будете спремни.
Изаберите метод аутентификације
@@ -176,4 +176,17 @@
Вишефакторска аутентификација је тренутно онемогућена
+ Та имејл адреса или лозинка није тачна
+ Та сесија верификације више не важи. Затражите нови кôд.
+ Верификација броја телефона није довршена. Пробајте поново.
+ Ти акредитиви припадају другом налогу.
+ Тај број телефона није подешен за верификацију на овом налогу.
+ Сесија пријављивања је истекла. Пријавите се поново да бисте наставили.
+ Та веза више не важи. Затражите нову.
+ Верификујте имејл адресу пре него што наставите.
+ Тај метод верификације је већ подешен на овом налогу.
+ Достигли сте ограничење броја метода верификације на овом налогу.
+ Лозинка не испуњава услове. Пробајте другу.
+ Лозинка је предугачка. Максимална дужина је %1$d.
+ Нисмо пронашли приступни кључ за овај налог. Пријавите се на други начин.
diff --git a/auth/src/main/res/values-sv/strings.xml b/auth/src/main/res/values-sv/strings.xml
index 2964dbcc7..18e0ce93c 100755
--- a/auth/src/main/res/values-sv/strings.xml
+++ b/auth/src/main/res/values-sv/strings.xml
@@ -100,7 +100,7 @@
Telefonnumret verifierades automatiskt
Skicka koden igen
Verifiera telefonnummer
- Use a different phone number
+ Använd ett annat telefonnummer
Genom att trycka på %1$s skickas ett sms. Meddelande- och dataavgifter kan tillkomma.
Genom att trycka på %1$s godkänner du våra %2$s och vår %3$s. Ett sms kan skickas. Meddelande- och dataavgifter kan tillkomma.
Autentiseringsfel
@@ -175,4 +175,17 @@
Multifaktorautentisering är för närvarande inaktiverad
+ E-postadressen eller lösenordet är felaktigt
+ Verifieringssessionen är inte längre giltig. Begär en ny kod.
+ Telefonverifieringen slutfördes inte. Försök igen.
+ De här inloggningsuppgifterna tillhör ett annat konto.
+ Det telefonnumret är inte konfigurerat för verifiering på det här kontot.
+ Din inloggningssession har upphört att gälla. Logga in igen för att fortsätta.
+ Länken är inte längre giltig. Begär en ny.
+ Verifiera din e-postadress innan du fortsätter.
+ Den verifieringsmetoden är redan konfigurerad på det här kontot.
+ Du har nått gränsen för antalet verifieringsmetoder på det här kontot.
+ Ditt lösenord uppfyller inte kraven. Prova ett annat.
+ Lösenordet är för långt. Den maximala längden är %1$d.
+ Vi hittade ingen nyckel för det här kontot. Logga in på ett annat sätt.
diff --git a/auth/src/main/res/values-ta/strings.xml b/auth/src/main/res/values-ta/strings.xml
index f268d402b..acc42e7d6 100755
--- a/auth/src/main/res/values-ta/strings.xml
+++ b/auth/src/main/res/values-ta/strings.xml
@@ -100,15 +100,15 @@
ஃபோன் எண் தானாகவே சரிபார்க்கப்பட்டது
குறியீட்டை மீண்டும் அனுப்பு
ஃபோன் எண்ணைச் சரிபார்
- Use a different phone number
+ வேறு ஃபோன் எண்ணைப் பயன்படுத்து
“%1$s” என்பதைத் தட்டுவதன் மூலம், SMS அனுப்பப்படலாம். செய்தி மற்றும் தரவுக் கட்டணங்கள் விதிக்கப்படலாம்.
“%1$s” என்பதைத் தட்டுவதன் மூலம், எங்கள் %2$s மற்றும் %3$sஐ ஏற்பதாகக் குறிப்பிடுகிறீர்கள். SMS அனுப்பப்படலாம். செய்தி மற்றும் தரவுக் கட்டணங்கள் விதிக்கப்படலாம்.
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ அங்கீகாரப் பிழை
+ மீண்டும் முயலவும்
+ கூடுதல் சரிபார்ப்பு தேவை. பல்காரணி அங்கீகாரத்தை நிறைவுசெய்யவும்.
+ கணக்கை இணைக்க வேண்டும். வேறு உள்நுழைவு முறையை முயலவும்.
+ அங்கீகாரம் ரத்துசெய்யப்பட்டது. தயாரானதும் மீண்டும் முயலவும்.
அங்கீகார முறையைத் தேர்ந்தெடுக்கவும்
@@ -176,4 +176,17 @@
பல-காரணி அங்கீகாரம் தற்போது முடக்கப்பட்டுள்ளது
+ அந்த மின்னஞ்சல் முகவரியோ கடவுச்சொல்லோ சரியில்லை
+ அந்தச் சரிபார்ப்பு அமர்வு இனி செல்லுபடியாகாது. புதிய குறியீட்டைக் கோரவும்.
+ ஃபோன் சரிபார்ப்பு நிறைவடையவில்லை. மீண்டும் முயலவும்.
+ அந்த அனுமதிச் சான்றுகள் வேறொரு கணக்கிற்கு உரியவை.
+ அந்த ஃபோன் எண் இந்தக் கணக்கில் சரிபார்ப்பிற்காக அமைக்கப்படவில்லை.
+ உங்கள் உள்நுழைவு அமர்வு காலாவதியானது. தொடர, மீண்டும் உள்நுழையவும்.
+ அந்த இணைப்பு இனி செல்லுபடியாகாது. புதியதொன்றைக் கோரவும்.
+ தொடர்வதற்கு முன் உங்கள் மின்னஞ்சல் முகவரியைச் சரிபார்க்கவும்.
+ அந்தச் சரிபார்ப்பு முறை இந்தக் கணக்கில் ஏற்கெனவே அமைக்கப்பட்டுள்ளது.
+ இந்தக் கணக்கிற்கான சரிபார்ப்பு முறைகளின் வரம்பை எட்டிவிட்டீர்கள்.
+ உங்கள் கடவுச்சொல் தேவைகளைப் பூர்த்தி செய்யவில்லை. வேறொன்றை முயலவும்.
+ கடவுச்சொல் மிக நீளமாக உள்ளது. அதிகபட்ச நீளம் %1$d ஆகும்.
+ இந்தக் கணக்கிற்கான கடவுச்சாவி கிடைக்கவில்லை. வேறு முறையில் உள்நுழையவும்.
diff --git a/auth/src/main/res/values-th/strings.xml b/auth/src/main/res/values-th/strings.xml
index ad9f71a6b..86e6f603b 100755
--- a/auth/src/main/res/values-th/strings.xml
+++ b/auth/src/main/res/values-th/strings.xml
@@ -100,15 +100,15 @@
ยืนยันหมายเลขโทรศัพท์โดยอัตโนมัติแล้ว
ส่งรหัสอีกครั้ง
ยืนยันหมายเลขโทรศัพท์
- Use a different phone number
+ ใช้หมายเลขโทรศัพท์อื่น
เมื่อคุณแตะ “%1$s” ระบบจะส่ง SMS ให้คุณ อาจมีค่าบริการรับส่งข้อความและค่าบริการอินเทอร์เน็ต
การแตะ “%1$s” แสดงว่าคุณยอมรับ %2$s และ %3$s ระบบจะส่ง SMS ให้คุณ อาจมีค่าบริการรับส่งข้อความและค่าบริการอินเทอร์เน็ต
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ ข้อผิดพลาดในการตรวจสอบสิทธิ์
+ ลองอีกครั้ง
+ ต้องมีการยืนยันเพิ่มเติม โปรดดำเนินการยืนยันตัวตนแบบหลายปัจจัยให้เสร็จสมบูรณ์
+ ต้องลิงก์บัญชี โปรดลองใช้วิธีลงชื่อเข้าใช้วิธีอื่น
+ การตรวจสอบสิทธิ์ถูกยกเลิก โปรดลองอีกครั้งเมื่อคุณพร้อม
เลือกวิธีการตรวจสอบสิทธิ์
@@ -176,4 +176,17 @@
การรับรองความถูกต้องแบบหลายปัจจัยถูกปิดใช้งานในขณะนี้
+ อีเมลหรือรหัสผ่านไม่ถูกต้อง
+ เซสชันการยืนยันนี้ใช้ไม่ได้อีกต่อไป โปรดขอรหัสใหม่
+ การยืนยันหมายเลขโทรศัพท์ไม่เสร็จสมบูรณ์ โปรดลองอีกครั้ง
+ ข้อมูลเข้าสู่ระบบนี้เป็นของบัญชีอื่น
+ หมายเลขโทรศัพท์นี้ไม่ได้ตั้งค่าไว้สำหรับการยืนยันในบัญชีนี้
+ เซสชันการลงชื่อเข้าใช้หมดอายุแล้ว โปรดลงชื่อเข้าใช้อีกครั้งเพื่อดำเนินการต่อ
+ ลิงก์นี้ใช้ไม่ได้อีกต่อไป โปรดขอลิงก์ใหม่
+ โปรดยืนยันที่อยู่อีเมลก่อนดำเนินการต่อ
+ วิธีการยืนยันนี้ตั้งค่าไว้ในบัญชีนี้แล้ว
+ คุณใช้วิธีการยืนยันถึงขีดจำกัดของบัญชีนี้แล้ว
+ รหัสผ่านของคุณไม่เป็นไปตามข้อกำหนด โปรดลองใช้รหัสผ่านอื่น
+ รหัสผ่านยาวเกินไป ความยาวสูงสุดคือ %1$d
+ ไม่พบพาสคีย์สำหรับบัญชีนี้ โปรดลงชื่อเข้าใช้ด้วยวิธีอื่น
diff --git a/auth/src/main/res/values-tl/strings.xml b/auth/src/main/res/values-tl/strings.xml
index 90e55a470..4e5a45a88 100755
--- a/auth/src/main/res/values-tl/strings.xml
+++ b/auth/src/main/res/values-tl/strings.xml
@@ -100,7 +100,7 @@
Awtomatikong na-verify ang numero ng telepono
Ipadala Muli ang Code
I-verify ang Numero ng Telepono
- Use a different phone number
+ Gumamit ng ibang numero ng telepono
Sa pag-tap sa “%1$s,“ maaaring magpadala ng SMS. Maaaring ipatupad ang mga rate ng pagmemensahe at data.
Sa pag-tap sa “%1$s”, ipinababatid mo na tinatanggap mo ang aming %2$s at %3$s. Maaaring magpadala ng SMS. Maaaring ipatupad ang mga rate ng pagmemensahe at data.
Error sa Pagpapatotoo
@@ -146,7 +146,7 @@
Pumili ng paraan ng pag-verify
Magdagdag ng karagdagang layer ng seguridad
SMS
- Authenticator app
+ App ng authenticator
Ang numerong ito ay nauugnay sa ibang account
Kinakailangan ang pag-verify
I-scan ang QR code gamit ang iyong authenticator app
@@ -163,16 +163,29 @@
Mag-authenticate muli
Alisin
Ipadala muli ang verification email
- Secret key
+ Sikretong key
Mag-sign out
Naka-sign in bilang
Laktawan
Gumamit ng ibang paraan
- Verification code
+ Code sa pag-verify
Na-verify ang email
I-verify
Nagpadala kami ng verification email sa %1$s
Kasalukuyang naka-disable ang multi-factor authentication
+ Mali ang email address o password na iyon
+ Wala nang bisa ang verification session na iyon. Humiling ng bagong code.
+ Hindi nakumpleto ang pag-verify ng telepono. Subukan muli.
+ Kabilang ang mga kredensyal na iyon sa ibang account.
+ Hindi naka-set up ang numero ng teleponong iyon para sa pag-verify sa account na ito.
+ Nag-expire na ang iyong sign-in session. Mag-sign in muli para magpatuloy.
+ Wala nang bisa ang link na iyon. Humiling ng bago.
+ I-verify ang iyong email address bago ka magpatuloy.
+ Naka-set up na ang paraan ng pag-verify na iyon sa account na ito.
+ Naabot mo na ang limitasyon ng mga paraan ng pag-verify sa account na ito.
+ Hindi natutugunan ng iyong password ang mga kinakailangan. Sumubok ng iba.
+ Masyadong mahaba ang password. Ang maximum na haba ay %1$d.
+ Wala kaming nakitang passkey para sa account na ito. Mag-sign in sa ibang paraan.
diff --git a/auth/src/main/res/values-tr/strings.xml b/auth/src/main/res/values-tr/strings.xml
index 15a7d80b9..61db57e95 100755
--- a/auth/src/main/res/values-tr/strings.xml
+++ b/auth/src/main/res/values-tr/strings.xml
@@ -100,15 +100,15 @@
Telefon numarası otomatik olarak doğrulandı
Kodu Yeniden Gönder
Telefon Numarasını Doğrula
- Use a different phone number
+ Farklı bir telefon numarası kullan
“%1$s” öğesine dokunarak SMS gönderilebilir. Mesaj ve veri ücretleri uygulanabilir.
“%1$s” öğesine dokunarak %2$s ve %3$s hükümlerimizi kabul ettiğinizi bildirirsiniz. SMS gönderilebilir. Mesaj ve veri ücretleri uygulanabilir.
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ Kimlik Doğrulama Hatası
+ Tekrar dene
+ Ek doğrulama gerekiyor. Lütfen çok faktörlü kimlik doğrulamayı tamamlayın.
+ Hesabın bağlanması gerekiyor. Lütfen farklı bir oturum açma yöntemi deneyin.
+ Kimlik doğrulama iptal edildi. Hazır olduğunuzda tekrar deneyin.
Kimlik Doğrulama Yöntemini Seçin
@@ -176,4 +176,17 @@
Çok faktörlü kimlik doğrulama şu anda devre dışı
+ E-posta adresi veya şifre yanlış
+ Bu doğrulama oturumu artık geçerli değil. Yeni bir kod isteyin.
+ Telefon doğrulaması tamamlanmadı. Tekrar deneyin.
+ Bu kimlik bilgileri başka bir hesaba ait.
+ Bu telefon numarası, bu hesapta doğrulama için ayarlanmamış.
+ Oturumunuzun süresi doldu. Devam etmek için tekrar oturum açın.
+ Bu bağlantı artık geçerli değil. Yeni bir tane isteyin.
+ Devam etmeden önce e-posta adresinizi doğrulayın.
+ Bu doğrulama yöntemi bu hesapta zaten ayarlanmış.
+ Bu hesap için doğrulama yöntemi sınırına ulaştınız.
+ Şifreniz gereksinimleri karşılamıyor. Başka bir şifre deneyin.
+ Şifre çok uzun. İzin verilen en fazla uzunluk %1$d.
+ Bu hesap için parola anahtarı bulunamadı. Başka bir yöntemle oturum açın.
diff --git a/auth/src/main/res/values-uk/strings.xml b/auth/src/main/res/values-uk/strings.xml
index 338339d6c..51b326668 100755
--- a/auth/src/main/res/values-uk/strings.xml
+++ b/auth/src/main/res/values-uk/strings.xml
@@ -100,15 +100,15 @@
Номер телефону підтверджено автоматично
Повторно надіслати код
Підтвердити номер телефону
- Use a different phone number
+ Використати інший номер телефону
Коли ви торкнетесь опції “%1$s”, вам може надійти SMS-повідомлення. За SMS і використання трафіку може стягуватися плата.
Торкаючись кнопки “%1$s”, ви приймаєте такі документи: %2$s і %3$s. Вам може надійти SMS-повідомлення. За SMS і використання трафіку може стягуватися плата.
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ Помилка автентифікації
+ Повторити спробу
+ Потрібне додаткове підтвердження. Виконайте багатофакторну автентифікацію.
+ Обліковий запис потрібно зв\'язати. Спробуйте інший спосіб входу.
+ Автентифікацію скасовано. Повторіть спробу, коли будете готові.
Виберіть спосіб автентифікації
@@ -176,4 +176,17 @@
Багатофакторна автентифікація наразі вимкнена
+ Неправильна електронна адреса або пароль
+ Цей сеанс підтвердження більше не дійсний. Запросіть новий код.
+ Не вдалося завершити підтвердження номера телефону. Повторіть спробу.
+ Ці облікові дані належать іншому обліковому запису.
+ Цей номер телефону не налаштовано для підтвердження в цьому обліковому записі.
+ Сеанс входу закінчився. Увійдіть знову, щоб продовжити.
+ Це посилання більше не дійсне. Запросіть нове.
+ Підтвердьте свою електронну адресу, перш ніж продовжити.
+ Цей спосіб підтвердження вже налаштовано в цьому обліковому записі.
+ Ви досягли ліміту способів підтвердження для цього облікового запису.
+ Пароль не відповідає вимогам. Спробуйте інший.
+ Пароль задовгий. Максимальна довжина – %1$d.
+ Не вдалося знайти ключ доступу для цього облікового запису. Увійдіть іншим способом.
diff --git a/auth/src/main/res/values-ur/strings.xml b/auth/src/main/res/values-ur/strings.xml
index aa780c0fb..5dd3fccb0 100755
--- a/auth/src/main/res/values-ur/strings.xml
+++ b/auth/src/main/res/values-ur/strings.xml
@@ -100,15 +100,15 @@
فون نمبر کی خودکار طور پر توثیق ہو گئی
کوڈ دوبارہ بھیجیں
فون نمبر کی توثیق کریں
- Use a different phone number
+ مختلف فون نمبر استعمال کریں
%1$s پر تھپتھپانے سے، ایک SMS بھیجا جا سکتا ہے۔ پیغام اور ڈیٹا کی شرحوں کا اطلاق ہو سکتا ہے۔
“%1$s” کو تھپتھپا کر، آپ نشاندہی کر رہے ہیں کہ آپ ہماری %2$s اور %3$s کو قبول کرتے ہیں۔ ایک SMS بھیجا جا سکتا ہے۔ پیغام اور ڈیٹا نرخ لاگو ہو سکتے ہیں۔
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ تصدیق کی خرابی
+ دوبارہ کوشش کریں
+ اضافی تصدیق درکار ہے۔ براہ کرم کثیر عنصری تصدیق مکمل کریں۔
+ اکاؤنٹ کو لنک کرنے کی ضرورت ہے۔ براہ کرم مختلف سائن ان طریقہ آزمائیں۔
+ تصدیق منسوخ کر دی گئی۔ تیار ہونے پر دوبارہ کوشش کریں۔
تصدیقی طریقہ منتخب کریں
@@ -176,4 +176,17 @@
ملٹی فیکٹر تصدیق فی الحال غیر فعال ہے
+ وہ ای میل یا پاس ورڈ درست نہیں ہے
+ یہ توثیقی سیشن اب کارآمد نہیں رہا۔ نیا کوڈ طلب کریں۔
+ فون کی توثیق مکمل نہیں ہوئی۔ دوبارہ کوشش کریں۔
+ یہ اسناد کسی دوسرے اکاؤنٹ سے تعلق رکھتی ہیں۔
+ یہ فون نمبر اس اکاؤنٹ پر توثیق کے لیے سیٹ اپ نہیں ہے۔
+ آپ کا سائن ان سیشن ختم ہو گیا۔ جاری رکھنے کے لیے دوبارہ سائن ان کریں۔
+ یہ لنک اب کارآمد نہیں رہا۔ نیا لنک طلب کریں۔
+ جاری رکھنے سے پہلے اپنے ای میل پتے کی توثیق کریں۔
+ یہ توثیقی طریقہ اس اکاؤنٹ پر پہلے سے سیٹ اپ ہے۔
+ آپ اس اکاؤنٹ پر توثیقی طریقوں کی حد تک پہنچ گئے ہیں۔
+ آپ کا پاس ورڈ تقاضے پورے نہیں کرتا۔ کوئی دوسرا آزمائیں۔
+ پاس ورڈ بہت طویل ہے۔ زیادہ سے زیادہ طوالت %1$d ہے۔
+ اس اکاؤنٹ کے لیے پاس کی نہیں ملی۔ کسی اور طریقے سے سائن ان کریں۔
diff --git a/auth/src/main/res/values-vi/strings.xml b/auth/src/main/res/values-vi/strings.xml
index c2a0b9993..c7213688a 100755
--- a/auth/src/main/res/values-vi/strings.xml
+++ b/auth/src/main/res/values-vi/strings.xml
@@ -10,7 +10,7 @@
Twitter
GitHub
Điện thoại
- Email
+ Địa chỉ email
Đăng nhập bằng Google
Đăng nhập bằng Google
Đăng nhập bằng Facebook
@@ -31,7 +31,7 @@
Đăng nhập bằng Yahoo
Đăng nhập bằng Yahoo
Tiếp
- Email
+ Địa chỉ email
Số điện thoại
Quốc gia
Chọn quốc gia
@@ -100,15 +100,15 @@
Đã tự động xác minh số điện thoại
Gửi lại mã
Xác minh số điện thoại
- Use a different phone number
+ Dùng số điện thoại khác
Bằng cách nhấn vào “%1$s”, bạn có thể nhận được một tin nhắn SMS. Cước tin nhắn và dữ liệu có thể áp dụng.
Bằng cách nhấn vào “%1$s”, bạn cho biết rằng bạn chấp nhận %2$s và %3$s của chúng tôi. Bạn có thể nhận được một tin nhắn SMS. Cước tin nhắn và dữ liệu có thể áp dụng.
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ Lỗi xác thực
+ Thử lại
+ Bạn cần xác minh thêm. Vui lòng hoàn tất quy trình xác thực nhiều yếu tố.
+ Bạn cần liên kết tài khoản. Vui lòng thử một phương thức đăng nhập khác.
+ Quá trình xác thực đã bị hủy. Vui lòng thử lại khi bạn sẵn sàng.
Chọn phương thức xác thực
@@ -176,4 +176,17 @@
Xác thực đa yếu tố hiện đang bị vô hiệu hóa
+ Email hoặc mật khẩu không chính xác
+ Phiên xác minh này không còn hợp lệ. Hãy yêu cầu mã mới.
+ Quá trình xác minh số điện thoại chưa hoàn tất. Hãy thử lại.
+ Thông tin đăng nhập này thuộc về một tài khoản khác.
+ Số điện thoại này chưa được thiết lập để xác minh trên tài khoản này.
+ Phiên đăng nhập của bạn đã hết hạn. Hãy đăng nhập lại để tiếp tục.
+ Đường liên kết này không còn hợp lệ. Hãy yêu cầu một đường liên kết mới.
+ Hãy xác minh địa chỉ email của bạn trước khi tiếp tục.
+ Phương thức xác minh này đã được thiết lập trên tài khoản này.
+ Bạn đã đạt đến giới hạn số phương thức xác minh trên tài khoản này.
+ Mật khẩu của bạn không đáp ứng các yêu cầu. Hãy thử mật khẩu khác.
+ Mật khẩu quá dài. Độ dài tối đa là %1$d.
+ Không tìm thấy mã xác thực cho tài khoản này. Hãy đăng nhập bằng cách khác.
diff --git a/auth/src/main/res/values-zh-rCN/strings.xml b/auth/src/main/res/values-zh-rCN/strings.xml
index 12fb4c3dd..ff28f4462 100755
--- a/auth/src/main/res/values-zh-rCN/strings.xml
+++ b/auth/src/main/res/values-zh-rCN/strings.xml
@@ -100,15 +100,15 @@
电话号码已自动验证
重新发送验证码
验证电话号码
- Use a different phone number
+ 使用其他电话号码
您点按“%1$s”后,系统会向您发送一条短信。这可能会产生短信费用和上网流量费。
点按“%1$s”即表示您接受我们的%2$s和%3$s。系统会向您发送一条短信。这可能会产生短信费用和上网流量费。
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ 身份验证错误
+ 重试
+ 需要额外的验证。请完成多重身份验证。
+ 需要关联账户。请尝试其他登录方式。
+ 身份验证已取消。准备好后请重试。
选择身份验证方法
@@ -176,4 +176,17 @@
多重身份验证当前已禁用
+ 电子邮件地址或密码不正确
+ 该验证会话已失效,请重新获取验证码。
+ 电话号码验证未完成,请重试。
+ 这些凭据属于其他帐号。
+ 该电话号码未在此帐号中设置为验证方式。
+ 您的登录会话已过期,请重新登录以继续。
+ 该链接已失效,请重新获取。
+ 请先验证您的电子邮件地址,然后再继续。
+ 该验证方式已在此帐号中设置。
+ 您已达到此帐号的验证方式数量上限。
+ 您的密码不符合要求,请尝试其他密码。
+ 密码过长。最大长度为 %1$d。
+ 未找到此账号的通行密钥,请通过其他方式登录。
diff --git a/auth/src/main/res/values-zh-rHK/strings.xml b/auth/src/main/res/values-zh-rHK/strings.xml
index fb7a627ae..c2c655056 100755
--- a/auth/src/main/res/values-zh-rHK/strings.xml
+++ b/auth/src/main/res/values-zh-rHK/strings.xml
@@ -100,15 +100,15 @@
已自動驗證電話號碼
重新傳送驗證碼
驗證電話號碼
- Use a different phone number
+ 使用其他電話號碼
輕觸 [%1$s] 後,系統將會傳送一封簡訊。您可能需支付簡訊和數據傳輸費用。
輕觸 [%1$s] 即表示您同意接受我們的《%2$s》和《%3$s》。系統將會傳送簡訊給您,不過您可能需要支付簡訊和數據傳輸費用。
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ 驗證錯誤
+ 重試
+ 需要額外驗證。請完成雙重驗證。
+ 需要連結帳戶。請嘗試其他登入方式。
+ 驗證已取消。準備好後請再試一次。
選擇驗證方法
@@ -176,4 +176,17 @@
多重身份验证当前已禁用
+ 電郵地址或密碼不正確
+ 此驗證程序已失效,請重新要求驗證碼。
+ 電話驗證尚未完成,請再試一次。
+ 這些憑證屬於其他帳戶。
+ 此電話號碼並未在此帳戶中設定為驗證方法。
+ 您的登入程序已逾時,請重新登入以繼續。
+ 此連結已失效,請要求新的連結。
+ 請先驗證您的電郵地址,然後再繼續。
+ 此驗證方法已在此帳戶中設定。
+ 您已達到此帳戶的驗證方法數量上限。
+ 您的密碼不符合要求,請嘗試其他密碼。
+ 密碼太長。長度上限為 %1$d。
+ 找不到此帳戶的密碼金鑰,請使用其他方式登入。
diff --git a/auth/src/main/res/values-zh-rTW/strings.xml b/auth/src/main/res/values-zh-rTW/strings.xml
index 63b993c5b..8b9af3100 100755
--- a/auth/src/main/res/values-zh-rTW/strings.xml
+++ b/auth/src/main/res/values-zh-rTW/strings.xml
@@ -100,15 +100,15 @@
已自動驗證電話號碼
重新傳送驗證碼
驗證電話號碼
- Use a different phone number
+ 使用其他電話號碼
輕觸 [%1$s] 後,系統將會傳送一封簡訊。您可能需支付簡訊和數據傳輸費用。
輕觸 [%1$s] 即表示您同意接受我們的《%2$s》和《%3$s》。系統將會傳送簡訊給您,不過您可能需要支付簡訊和數據傳輸費用。
- Authentication Error
- Try again
- Additional verification required. Please complete multi-factor authentication.
- Account needs to be linked. Please try a different sign-in method.
- Authentication was cancelled. Please try again when ready.
+ 驗證錯誤
+ 重試
+ 需要額外驗證。請完成雙重驗證。
+ 需要連結帳戶。請嘗試其他登入方式。
+ 驗證已取消。準備好後請再試一次。
選擇驗證方法
@@ -176,4 +176,17 @@
多重身份验证当前已禁用
+ 電子郵件地址或密碼不正確
+ 此驗證工作階段已失效,請重新要求驗證碼。
+ 電話驗證尚未完成,請再試一次。
+ 這些憑證屬於其他帳號。
+ 此電話號碼並未在這個帳號中設定為驗證方法。
+ 您的登入工作階段已過期,請重新登入以繼續。
+ 此連結已失效,請要求新的連結。
+ 請先驗證您的電子郵件地址,然後再繼續。
+ 此驗證方法已在這個帳號中設定。
+ 您已達到這個帳號的驗證方法數量上限。
+ 您的密碼不符合要求,請嘗試其他密碼。
+ 密碼太長。長度上限為 %1$d。
+ 找不到此帳戶的密碼金鑰,請使用其他方式登入。
diff --git a/auth/src/main/res/values-zh/strings.xml b/auth/src/main/res/values-zh/strings.xml
index ada6243e7..0bedfcc09 100755
--- a/auth/src/main/res/values-zh/strings.xml
+++ b/auth/src/main/res/values-zh/strings.xml
@@ -100,7 +100,7 @@
电话号码已自动验证
重新发送验证码
验证电话号码
- Use a different phone number
+ 使用其他电话号码
您点按“%1$s”后,系统会向您发送一条短信。这可能会产生短信费用和上网流量费。
点按"%1$s"即表示您接受我们的%2$s和%3$s。系统会向您发送一条短信。这可能会产生短信费用和上网流量费。
身份验证错误
@@ -175,4 +175,17 @@
多重身份验证当前已禁用
+ 电子邮件地址或密码不正确
+ 该验证会话已失效,请重新获取验证码。
+ 电话号码验证未完成,请重试。
+ 这些凭据属于其他帐号。
+ 该电话号码未在此帐号中设置为验证方式。
+ 您的登录会话已过期,请重新登录以继续。
+ 该链接已失效,请重新获取。
+ 请先验证您的电子邮件地址,然后再继续。
+ 该验证方式已在此帐号中设置。
+ 您已达到此帐号的验证方式数量上限。
+ 您的密码不符合要求,请尝试其他密码。
+ 密码过长。最大长度为 %1$d。
+ 未找到此账号的通行密钥,请通过其他方式登录。
diff --git a/auth/src/main/res/values/strings.xml b/auth/src/main/res/values/strings.xml
index ca6738c10..e61933a85 100644
--- a/auth/src/main/res/values/strings.xml
+++ b/auth/src/main/res/values/strings.xml
@@ -195,6 +195,9 @@
Passwords do not match
Password must be at least %1$d characters long
+
+ Password is too long. The maximum length is %1$d.
Password must contain at least one uppercase letter
Password must contain at least one lowercase letter
Password must contain at least one number
@@ -267,6 +270,21 @@
+
+ That email or password isn\'t correct
+ That verification session is no longer valid. Request a new code.
+ Phone verification didn\'t complete. Try again.
+ Those credentials belong to a different account.
+ That phone number isn\'t set up for verification on this account.
+ Your sign-in session expired. Sign in again to continue.
+ That link is no longer valid. Request a new one.
+ Verify your email address before you continue.
+ That verification method is already set up on this account.
+ You\'ve reached the limit for verification methods on this account.
+ Your password doesn\'t meet the requirements. Try a different one.
+ We couldn\'t find a passkey for this account. Sign in another way.
+
Choose Authentication Method
Set Up SMS Verification
diff --git a/auth/src/test/java/com/firebase/ui/auth/AuthExceptionRecoveryResolutionTest.kt b/auth/src/test/java/com/firebase/ui/auth/AuthExceptionRecoveryResolutionTest.kt
new file mode 100644
index 000000000..d3c283567
--- /dev/null
+++ b/auth/src/test/java/com/firebase/ui/auth/AuthExceptionRecoveryResolutionTest.kt
@@ -0,0 +1,516 @@
+/*
+ * Copyright 2025 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.firebase.ui.auth
+
+import android.content.Context
+import androidx.test.core.app.ApplicationProvider
+import com.firebase.ui.auth.configuration.string_provider.AuthUIStringProvider
+import com.firebase.ui.auth.configuration.string_provider.DefaultAuthUIStringProvider
+import com.firebase.ui.auth.ui.components.getRecoveryActionText
+import com.firebase.ui.auth.ui.components.getRecoveryMessage
+import com.firebase.ui.auth.ui.components.isRecoverable
+import com.google.common.truth.Truth.assertThat
+import com.google.common.truth.Truth.assertWithMessage
+import com.google.firebase.FirebaseException
+import com.google.firebase.FirebaseTooManyRequestsException
+import com.google.firebase.auth.FirebaseAuthException
+import com.google.firebase.auth.FirebaseAuthInvalidUserException
+import com.google.firebase.auth.FirebaseAuthMissingActivityForRecaptchaException
+import com.google.firebase.auth.FirebaseAuthMultiFactorException
+import com.google.firebase.auth.FirebaseAuthRecentLoginRequiredException
+import com.google.firebase.auth.FirebaseAuthUserCollisionException
+import com.google.firebase.auth.FirebaseAuthWeakPasswordException
+import java.util.Locale
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mockito.mock
+import org.mockito.kotlin.doCallRealMethod
+import org.mockito.kotlin.whenever
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.annotation.Config
+
+/**
+ * End-to-end resolution tests: a real Firebase exception goes through [AuthException.from] with a
+ * real [DefaultAuthUIStringProvider], and the result is rendered through
+ * [getRecoveryMessage] exactly as the error dialog would render it.
+ *
+ * Why the real provider and not a mock: the `fui_error_*` type-level hooks are deliberately blank
+ * so hosts can override them, so a mocked provider that stubs one proves nothing about what ships.
+ * Every assertion here fails if a branch of `from()` falls through a blank hook to the raw,
+ * untranslated Firebase SDK diagnostic.
+ *
+ * @suppress Internal test class
+ */
+@RunWith(RobolectricTestRunner::class)
+@Config(manifest = Config.NONE)
+class AuthExceptionRecoveryResolutionTest {
+
+ private val context: Context = ApplicationProvider.getApplicationContext()
+ private val strings: AuthUIStringProvider = DefaultAuthUIStringProvider(context)
+
+ /** Renders [firebaseException] the way the error dialog does, end to end. */
+ private fun resolve(
+ firebaseException: Exception,
+ provider: AuthUIStringProvider = strings
+ ): String = getRecoveryMessage(AuthException.from(firebaseException, provider), provider)
+
+ // Verbatim firebase-auth 24.2.0 diagnostics. All are English regardless of device locale.
+ private val networkDiagnostic = "A network error (such as timeout, interrupted connection or " +
+ "unreachable host) has occurred."
+ private val userNotFoundDiagnostic = "There is no user record corresponding to this " +
+ "identifier. The user may have been deleted."
+ private val weakPasswordDiagnostic = "The given password is invalid. [ Password should be at " +
+ "least 6 characters ]"
+ private val emailInUseDiagnostic = "The email address is already in use by another account."
+ private val mfaDiagnostic = "Please complete a second factor challenge."
+ private val recentLoginDiagnostic = "This operation is sensitive and requires recent " +
+ "authentication. Log in again before retrying this request."
+ private val cancelledDiagnostic = "User cancelled the sign-in flow."
+ private val operationNotAllowedDiagnostic = "This operation is not allowed. This may be " +
+ "because the given sign-in provider is disabled for this Firebase project. Enable it " +
+ "in the Firebase console, under the sign-in method tab of the Auth section. " +
+ "[ OPERATION_NOT_ALLOWED ]"
+
+ private fun userCollision(code: String, email: String? = null): FirebaseAuthUserCollisionException {
+ val exception = mock(FirebaseAuthUserCollisionException::class.java)
+ whenever(exception.errorCode).thenReturn(code)
+ whenever(exception.message).thenReturn(emailInUseDiagnostic)
+ whenever(exception.email).thenReturn(email)
+ return exception
+ }
+
+ private fun multiFactor(): FirebaseAuthMultiFactorException {
+ val exception = mock(FirebaseAuthMultiFactorException::class.java)
+ whenever(exception.message).thenReturn(mfaDiagnostic)
+ return exception
+ }
+
+ // =============================================================================================
+ // The six types whose type-level hook is deliberately blank
+ // =============================================================================================
+
+ @Test
+ fun `network failure resolves to the library's own copy, not the SDK diagnostic`() {
+ val firebaseException = object : FirebaseException(networkDiagnostic) {}
+
+ val resolved = resolve(firebaseException)
+
+ assertThat(resolved).isEqualTo(strings.networkErrorRecoveryMessage)
+ assertThat(resolved).isNotEqualTo(networkDiagnostic)
+ }
+
+ @Test
+ fun `user not found resolves to the library's own copy, not the SDK diagnostic`() {
+ val firebaseException =
+ FirebaseAuthInvalidUserException("ERROR_USER_NOT_FOUND", userNotFoundDiagnostic)
+
+ val resolved = resolve(firebaseException)
+
+ assertThat(resolved).isEqualTo(strings.userNotFoundRecoveryMessage)
+ assertThat(resolved).isNotEqualTo(userNotFoundDiagnostic)
+ }
+
+ @Test
+ fun `an unmapped user code resolves to the library's own copy, not the SDK diagnostic`() {
+ val firebaseException =
+ FirebaseAuthInvalidUserException("ERROR_SOMETHING_NEW", userNotFoundDiagnostic)
+
+ val resolved = resolve(firebaseException)
+
+ assertThat(resolved).isEqualTo(strings.userNotFoundRecoveryMessage)
+ assertThat(resolved).isNotEqualTo(userNotFoundDiagnostic)
+ }
+
+ @Test
+ fun `weak password resolves to the library's own copy, not the SDK diagnostic`() {
+ val firebaseException = FirebaseAuthWeakPasswordException(
+ "ERROR_WEAK_PASSWORD",
+ weakPasswordDiagnostic,
+ "Password should be at least 6 characters"
+ )
+
+ val authException = AuthException.from(firebaseException, strings)
+
+ assertThat(authException.message).isEqualTo(strings.weakPasswordRecoveryMessage)
+ assertThat(authException.message).isNotEqualTo(weakPasswordDiagnostic)
+ assertThat(resolve(firebaseException)).startsWith(strings.weakPasswordRecoveryMessage)
+ }
+
+ @Test
+ fun `email already in use resolves to the library's own copy, not the SDK diagnostic`() {
+ val firebaseException = userCollision("ERROR_EMAIL_ALREADY_IN_USE")
+
+ val resolved = resolve(firebaseException)
+
+ assertThat(resolved).isEqualTo(strings.emailAlreadyInUseRecoveryMessage)
+ assertThat(resolved).isNotEqualTo(emailInUseDiagnostic)
+ }
+
+ @Test
+ fun `mfa required resolves to the library's own copy, not the SDK diagnostic`() {
+ val firebaseException = multiFactor()
+
+ val resolved = resolve(firebaseException)
+
+ assertThat(resolved).isEqualTo(strings.mfaRequiredRecoveryMessage)
+ assertThat(resolved).isNotEqualTo(mfaDiagnostic)
+ }
+
+ @Test
+ fun `auth cancelled resolves to the library's own copy, not the SDK diagnostic`() {
+ for (code in listOf("ERROR_USER_CANCELLED", "ERROR_WEB_CONTEXT_CANCELED")) {
+ val firebaseException = object : FirebaseAuthException(code, cancelledDiagnostic) {}
+
+ val resolved = resolve(firebaseException)
+
+ assertWithMessage(code).that(resolved).isEqualTo(strings.authCancelledRecoveryMessage)
+ assertWithMessage(code).that(resolved).isNotEqualTo(cancelledDiagnostic)
+ }
+ }
+
+ @Test
+ fun `too many requests resolves to the library's own copy, not the SDK diagnostic`() {
+ val diagnostic = "We have blocked all requests from this device due to unusual activity."
+ val firebaseException = FirebaseTooManyRequestsException(diagnostic)
+
+ val resolved = resolve(firebaseException)
+
+ assertThat(resolved).isEqualTo(strings.tooManyRequestsRecoveryMessage)
+ assertThat(resolved).isNotEqualTo(diagnostic)
+ }
+
+ @Test
+ fun `account collision resolves to the library's own copy, not the SDK diagnostic`() {
+ val codes = listOf(
+ "ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL",
+ "ERROR_CREDENTIAL_ALREADY_IN_USE",
+ "ERROR_SOME_FUTURE_COLLISION_CODE",
+ )
+
+ for (code in codes) {
+ val resolved = resolve(userCollision(code))
+
+ assertWithMessage(code).that(resolved)
+ .isEqualTo(strings.accountLinkingRequiredRecoveryMessage)
+ assertWithMessage(code).that(resolved).isNotEqualTo(emailInUseDiagnostic)
+ }
+ }
+
+ // =============================================================================================
+ // Misconfiguration — the diagnostic must not be on the message at all
+ // =============================================================================================
+
+ @Test
+ fun `a disabled sign-in provider never puts the console diagnostic on the message`() {
+ val firebaseException =
+ object : FirebaseAuthException("ERROR_OPERATION_NOT_ALLOWED", operationNotAllowedDiagnostic) {}
+
+ val authException = AuthException.from(firebaseException, strings)
+
+ assertThat(authException).isInstanceOf(AuthException.MisconfigurationException::class.java)
+ // EmailAuthScreen and PhoneAuthScreen render this inline, bypassing getRecoveryMessage.
+ assertThat(authException.message).isEqualTo(strings.unknownErrorRecoveryMessage)
+ assertThat(authException.message).doesNotContain("Firebase")
+ assertThat(authException.message).doesNotContain("OPERATION_NOT_ALLOWED")
+ // The diagnostic is still there for logs and for hosts.
+ assertThat(authException.cause).isEqualTo(firebaseException)
+ assertThat(authException.cause?.message).isEqualTo(operationNotAllowedDiagnostic)
+ assertThat(resolve(firebaseException)).isEqualTo(strings.unknownErrorRecoveryMessage)
+ }
+
+ @Test
+ fun `the email-template and quota codes are misconfiguration, not unknown errors`() {
+ val codes = listOf(
+ "ERROR_INVALID_MESSAGE_PAYLOAD",
+ "ERROR_INVALID_SENDER",
+ "ERROR_INVALID_RECIPIENT_EMAIL",
+ // Declared on FirebaseAuthMissingActivityForRecaptchaException's own constructor.
+ "ERROR_MISSING_ACTIVITY",
+ "ERROR_WEB_STORAGE_UNSUPPORTED",
+ "ERROR_QUOTA_EXCEEDED",
+ )
+
+ for (code in codes) {
+ val diagnostic = "Raw SDK English naming $code."
+ val firebaseException = object : FirebaseAuthException(code, diagnostic) {}
+ val authException = AuthException.from(firebaseException, strings)
+
+ assertWithMessage(code).that(authException)
+ .isInstanceOf(AuthException.MisconfigurationException::class.java)
+ assertWithMessage(code).that(authException.message).isNotEqualTo(diagnostic)
+ assertWithMessage(code).that(authException.cause?.message).isEqualTo(diagnostic)
+ }
+ }
+
+ @Test
+ fun `the SDK's own missing-activity exception type reaches the misconfiguration arm`() {
+ // The synthetic assertions elsewhere pin the `when` arm; this pins that the SDK's own
+ // type still reaches it, which an SDK release reparenting it would break silently.
+ val firebaseException = FirebaseAuthMissingActivityForRecaptchaException()
+
+ val authException = AuthException.from(firebaseException, strings)
+
+ assertThat(firebaseException.errorCode).isEqualTo("ERROR_MISSING_ACTIVITY")
+ assertThat(authException)
+ .isInstanceOf(AuthException.MisconfigurationException::class.java)
+ // Retrying cannot conjure the Activity the host never supplied.
+ assertThat(isRecoverable(authException)).isFalse()
+ assertThat(authException.message).isEqualTo(strings.unknownErrorRecoveryMessage)
+ assertThat(authException.message).doesNotContain("Recaptcha")
+ // The SDK's own English stays on the cause, where logs still reach it.
+ assertThat(authException.cause).isEqualTo(firebaseException)
+ assertThat(authException.cause?.message).contains("valid Activity is required")
+ }
+
+ // =============================================================================================
+ // Blanket invariant
+ // =============================================================================================
+
+ @Test
+ fun `no Firebase error code resolves to the raw SDK diagnostic`() {
+ // One representative code per named arm of the FirebaseAuthInvalidCredentialsException
+ // branch of from(), then, below the blank line, the codes that fall through to its `else`.
+ val codes = listOf(
+ "ERROR_INVALID_CREDENTIAL",
+ "ERROR_WRONG_PASSWORD",
+ "ERROR_INVALID_EMAIL",
+ "ERROR_MISSING_EMAIL",
+ "ERROR_MISSING_PASSWORD",
+ "ERROR_INVALID_PHONE_NUMBER",
+ "ERROR_MISSING_PHONE_NUMBER",
+ "ERROR_INVALID_VERIFICATION_CODE",
+ "ERROR_SESSION_EXPIRED",
+ "ERROR_INVALID_VERIFICATION_ID",
+ "ERROR_RETRY_PHONE_AUTH",
+ "ERROR_USER_MISMATCH",
+ "ERROR_PHONE_NUMBER_NOT_FOUND",
+ "ERROR_MULTI_FACTOR_INFO_NOT_FOUND",
+ "ERROR_MISSING_MULTI_FACTOR_INFO",
+ "ERROR_INVALID_MULTI_FACTOR_SESSION",
+ "ERROR_INVALID_CUSTOM_TOKEN",
+ "ERROR_MISSING_OR_INVALID_NONCE",
+ "ERROR_INVALID_AUTHENTICATOR_RESPONSE",
+ "ERROR_PASSKEY_ENROLLMENT_NOT_FOUND",
+
+ // The first ships in firebase-auth 24.2.0; the second stands in for a future code.
+ "ERROR_REJECTED_CREDENTIAL",
+ "ERROR_SOME_FUTURE_CREDENTIAL_CODE",
+ )
+ val diagnostic = "The Firebase SDK's own untranslated English."
+
+ for (code in codes) {
+ val firebaseException =
+ com.google.firebase.auth.FirebaseAuthInvalidCredentialsException(code, diagnostic)
+ assertWithMessage(code).that(resolve(firebaseException)).isNotEqualTo(diagnostic)
+ assertWithMessage(code).that(AuthException.from(firebaseException, strings).message)
+ .isNotEqualTo(diagnostic)
+ }
+ }
+
+ @Test
+ fun `no plain auth error code resolves to the raw SDK diagnostic`() {
+ val codes = listOf(
+ "ERROR_UNVERIFIED_EMAIL",
+ "ERROR_SECOND_FACTOR_ALREADY_ENROLLED",
+ "ERROR_MAXIMUM_SECOND_FACTOR_COUNT_EXCEEDED",
+ "ERROR_OPERATION_NOT_ALLOWED",
+ "ERROR_UNAUTHORIZED_DOMAIN",
+ "ERROR_INVALID_CERT_HASH",
+ "ERROR_RECAPTCHA_NOT_ENABLED",
+ "ERROR_QUOTA_EXCEEDED",
+ // The else branch: neither user-facing nor a known setup problem.
+ "INTERNAL_ERROR",
+ "ERROR_WEB_INTERNAL_ERROR",
+ "ERROR_SOME_FUTURE_AUTH_CODE",
+ )
+ val diagnostic = "The Firebase SDK's own untranslated English."
+
+ for (code in codes) {
+ val firebaseException = object : FirebaseAuthException(code, diagnostic) {}
+ assertWithMessage(code).that(resolve(firebaseException)).isNotEqualTo(diagnostic)
+ assertWithMessage(code).that(AuthException.from(firebaseException, strings).message)
+ .isNotEqualTo(diagnostic)
+ }
+ }
+
+ // =============================================================================================
+ // The copy is actually translated, not just library-owned
+ // =============================================================================================
+
+
+
+ @Test
+ fun `a French device changing its email sees French, not the English reauth diagnostic`() {
+ val french = DefaultAuthUIStringProvider(context, Locale.FRENCH)
+ val firebaseException = FirebaseAuthRecentLoginRequiredException(
+ "ERROR_REQUIRES_RECENT_LOGIN",
+ recentLoginDiagnostic
+ )
+
+ val resolved = resolve(firebaseException, french)
+
+ // `errorRecentLoginRequired` ships blank, so the arm falls to the MFA string.
+ assertThat(resolved).isEqualTo(french.mfaErrorRecentLoginRequired)
+ assertThat(resolved).isNotEqualTo(recentLoginDiagnostic)
+ assertThat(resolved).isNotEqualTo(strings.mfaErrorRecentLoginRequired)
+ }
+
+ @Test
+ fun `reauthentication required resolves to library copy, not the SDK diagnostic`() {
+ val firebaseException = FirebaseAuthRecentLoginRequiredException(
+ "ERROR_REQUIRES_RECENT_LOGIN",
+ recentLoginDiagnostic
+ )
+
+ val result = AuthException.from(firebaseException, strings)
+
+ assertThat(result).isInstanceOf(AuthException.InvalidCredentialsException::class.java)
+ assertThat(result.message).isEqualTo(strings.mfaErrorRecentLoginRequired)
+ assertThat(result.cause?.message).isEqualTo(recentLoginDiagnostic)
+ assertThat(resolve(firebaseException)).isEqualTo(strings.mfaErrorRecentLoginRequired)
+ }
+
+ // =============================================================================================
+ // Developer-setup faults in the invalid-credential family
+ // =============================================================================================
+
+ @Test
+ fun `a bad Sign in with Apple nonce is reported as a misconfiguration, not a bad password`() {
+ val diagnostic = "The supplied auth credential is malformed, has expired or is " +
+ "currently unsupported. [ MISSING_OR_INVALID_NONCE ]"
+
+ for (code in listOf("ERROR_MISSING_OR_INVALID_NONCE", "ERROR_INVALID_AUTHENTICATOR_RESPONSE")) {
+ val firebaseException =
+ com.google.firebase.auth.FirebaseAuthInvalidCredentialsException(code, diagnostic)
+ val result = AuthException.from(firebaseException, strings)
+
+ // The host built the federated request wrong, so this must not be recoverable.
+ assertWithMessage(code).that(result)
+ .isInstanceOf(AuthException.MisconfigurationException::class.java)
+ assertWithMessage(code).that(result.message)
+ .isEqualTo(strings.unknownErrorRecoveryMessage)
+ assertWithMessage(code).that(result.cause?.message).isEqualTo(diagnostic)
+ }
+ }
+
+ @Test
+ fun `unnamed invalid-credential codes stay recoverable but never show the SDK diagnostic`() {
+ val diagnostic = "The Firebase SDK's own untranslated English."
+
+ for (code in listOf("ERROR_REJECTED_CREDENTIAL", "ERROR_SOME_FUTURE_CREDENTIAL_CODE")) {
+ val firebaseException =
+ com.google.firebase.auth.FirebaseAuthInvalidCredentialsException(code, diagnostic)
+ val result = AuthException.from(firebaseException, strings)
+
+ // "Mismatching credentials" also covers the wrong account, which signing in fixes.
+ assertWithMessage(code).that(result)
+ .isInstanceOf(AuthException.InvalidCredentialsException::class.java)
+ // But the copy has to be generic — we do not know what the code means.
+ assertWithMessage(code).that(result.message)
+ .isEqualTo(strings.unknownErrorRecoveryMessage)
+ assertWithMessage(code).that(result.message).isNotEqualTo(diagnostic)
+ assertWithMessage(code).that(result.cause?.message).isEqualTo(diagnostic)
+ }
+ }
+
+ @Test
+ fun `a missing passkey enrolment points at another sign-in method, not a futile retry`() {
+ val diagnostic = "Cannot find the passkey linked to the current account."
+ val firebaseException = com.google.firebase.auth.FirebaseAuthInvalidCredentialsException(
+ "ERROR_PASSKEY_ENROLLMENT_NOT_FOUND", diagnostic
+ )
+
+ val result = AuthException.from(firebaseException, strings)
+
+ // Not InvalidCredentialsException: that is recoverable, so the dialog would offer a retry.
+ assertThat(result).isInstanceOf(AuthException.SignInMethodUnavailableException::class.java)
+ assertThat(result).isNotInstanceOf(AuthException.InvalidCredentialsException::class.java)
+ // Specific copy, not the generic unknown-error string.
+ assertThat(result.message).isEqualTo(strings.errorPasskeyNotFound)
+ assertThat(result.message).isNotEqualTo(strings.unknownErrorRecoveryMessage)
+ assertThat(result.message).isNotEqualTo(diagnostic)
+ assertThat(result.cause?.message).isEqualTo(diagnostic)
+ }
+
+ @Test
+ fun `the dialog offers no retry action for a missing passkey enrolment`() {
+ val firebaseException = com.google.firebase.auth.FirebaseAuthInvalidCredentialsException(
+ "ERROR_PASSKEY_ENROLLMENT_NOT_FOUND",
+ "Cannot find the passkey linked to the current account."
+ )
+
+ val result = AuthException.from(firebaseException, strings)
+
+ // The dialog renders the action button only when isRecoverable is true.
+ assertThat(isRecoverable(result)).isFalse()
+ // And the text itself is not a retry invitation, for any caller reading it directly.
+ assertThat(getRecoveryActionText(result, strings)).isNotEqualTo(strings.retryAction)
+ assertThat(getRecoveryActionText(result, strings)).isEqualTo(strings.dismissAction)
+ // The body still says the useful thing.
+ assertThat(getRecoveryMessage(result, strings)).isEqualTo(strings.errorPasskeyNotFound)
+ }
+
+ // =============================================================================================
+ // A host's own hook still wins
+ // =============================================================================================
+
+ @Test
+ fun `a host that fills the type-level hook still overrides the generic recovery copy`() {
+ val hostStrings = mock(AuthUIStringProvider::class.java)
+ whenever(hostStrings.errorNetworkGeneric).thenReturn("Host network copy")
+ whenever(hostStrings.networkErrorRecoveryMessage).thenReturn("Generic network copy")
+
+ val result = AuthException.from(object : FirebaseException(networkDiagnostic) {}, hostStrings)
+
+ assertThat(result.message).isEqualTo("Host network copy")
+ }
+
+ @Test
+ fun `a host's credential copy does not hijack the missing-passkey message`() {
+ // `errorInvalidCredentials` is the hook for a type this arm deliberately does not return,
+ // so a host overriding both must see its passkey copy, not its password copy.
+ val hostStrings = mock(AuthUIStringProvider::class.java)
+ whenever(hostStrings.errorInvalidCredentials)
+ .thenReturn("Check your password and try again.")
+ whenever(hostStrings.errorPasskeyNotFound).thenReturn("Use another way to sign in.")
+
+ val result = AuthException.from(
+ com.google.firebase.auth.FirebaseAuthInvalidCredentialsException(
+ "ERROR_PASSKEY_ENROLLMENT_NOT_FOUND",
+ "Cannot find the passkey linked to the current account."
+ ),
+ hostStrings
+ )
+
+ assertThat(result).isInstanceOf(AuthException.SignInMethodUnavailableException::class.java)
+ assertThat(result.message).isEqualTo("Use another way to sign in.")
+ assertThat(result.message).isNotEqualTo("Check your password and try again.")
+ }
+
+ @Test
+ fun `a host that leaves the passkey hook unset gets the generic string, not credential copy`() {
+ // The interface default is what a host implementing AuthUIStringProvider directly sees;
+ // credential copy there would sit in a dialog with no retry button.
+ val hostStrings = mock(AuthUIStringProvider::class.java)
+ doCallRealMethod().whenever(hostStrings).errorPasskeyNotFound
+ whenever(hostStrings.errorInvalidCredentials).thenReturn("Check your password and try again.")
+ whenever(hostStrings.errorUnknownAuth).thenReturn("Something went wrong. Please try later.")
+
+ assertThat(hostStrings.errorPasskeyNotFound)
+ .isEqualTo("Something went wrong. Please try later.")
+ assertThat(hostStrings.errorPasskeyNotFound)
+ .isNotEqualTo("Check your password and try again.")
+ }
+}
diff --git a/auth/src/test/java/com/firebase/ui/auth/AuthExceptionTest.kt b/auth/src/test/java/com/firebase/ui/auth/AuthExceptionTest.kt
index ea8ec7ecd..47d4f07a1 100644
--- a/auth/src/test/java/com/firebase/ui/auth/AuthExceptionTest.kt
+++ b/auth/src/test/java/com/firebase/ui/auth/AuthExceptionTest.kt
@@ -16,8 +16,12 @@ package com.firebase.ui.auth
import com.firebase.ui.auth.configuration.string_provider.AuthUIStringProvider
import com.google.common.truth.Truth.assertThat
+import com.google.common.truth.Truth.assertWithMessage
import com.google.firebase.FirebaseException
+import com.google.firebase.FirebaseTooManyRequestsException
+import com.google.firebase.auth.FirebaseAuthActionCodeException
import com.google.firebase.auth.FirebaseAuthException
+import com.google.firebase.auth.FirebaseAuthInvalidCredentialsException
import com.google.firebase.auth.FirebaseAuthInvalidUserException
import com.google.firebase.auth.FirebaseAuthWeakPasswordException
import org.junit.Test
@@ -52,19 +56,35 @@ class AuthExceptionTest {
}
@Test
- fun `from() maps FirebaseAuthException with ERROR_TOO_MANY_REQUESTS to TooManyRequestsException`() {
- // Arrange
- val firebaseException = object : FirebaseAuthException("ERROR_TOO_MANY_REQUESTS", "Too many requests") {}
+ fun `from() maps FirebaseTooManyRequestsException to TooManyRequestsException`() {
+ // Arrange — rate limiting arrives as this type, not as a FirebaseAuthException. It carries
+ // no error code, so the only thing that can select the arm is the exception class itself.
+ val firebaseException = FirebaseTooManyRequestsException(
+ "We have blocked all requests from this device due to unusual activity. Try again later."
+ )
// Act
val authException = AuthException.from(firebaseException)
- // Assert
+ // Assert — without a dedicated arm this falls through to `is FirebaseException` and a
+ // throttled user is told they have no internet connection.
assertThat(authException).isInstanceOf(AuthException.TooManyRequestsException::class.java)
- assertThat(authException.message).isEqualTo("Too many requests")
assertThat(authException.cause).isEqualTo(firebaseException)
}
+ @Test
+ fun `from() takes the too-many-requests message from the string provider`() {
+ val firebaseException = FirebaseTooManyRequestsException("Blocked due to unusual activity.")
+ val stringProvider = mock(AuthUIStringProvider::class.java)
+ whenever(stringProvider.errorTooManyRequests).thenReturn("Zu viele Versuche")
+
+ val result = AuthException.from(firebaseException, stringProvider)
+
+ assertThat(result).isInstanceOf(AuthException.TooManyRequestsException::class.java)
+ assertThat(result.message).isEqualTo("Zu viele Versuche")
+ }
+
+
@Test
fun `from() maps FirebaseAuthException with unknown error code to UnknownException`() {
// Arrange
@@ -289,4 +309,288 @@ class AuthExceptionTest {
assertThat(exception.failingRequirements).isEqualTo(requirements)
}
+
+ // =============================================================================================
+ // Per-error-code message selection
+ //
+ // Every code below is one the resolved firebase-auth 24.2.0 maps onto the exception type the
+ // arm matches, so each branch is reachable. The provider member is stubbed to a sentinel that
+ // exists nowhere else: collapsing two codes onto one branch, or dropping a branch back to the
+ // arm's generic `else`, changes the message and fails the test.
+ // =============================================================================================
+
+ /** The raw text the SDK would put on the exception, which must lose to the provider string. */
+ private val sdkText = "The Firebase SDK's own untranslated English."
+
+ private fun invalidCredentials(errorCode: String) =
+ FirebaseAuthInvalidCredentialsException(errorCode, sdkText)
+
+ @Test
+ fun `from() routes each invalid-credentials error code to its own string`() {
+ val stringProvider = mock(AuthUIStringProvider::class.java)
+ whenever(stringProvider.errorIncorrectEmailOrPassword).thenReturn("s:incorrectEmailOrPassword")
+ whenever(stringProvider.invalidPassword).thenReturn("s:invalidPassword")
+ whenever(stringProvider.invalidEmailAddress).thenReturn("s:invalidEmailAddress")
+ whenever(stringProvider.missingEmailAddress).thenReturn("s:missingEmailAddress")
+ whenever(stringProvider.requiredField).thenReturn("s:requiredField")
+ whenever(stringProvider.invalidPhoneNumber).thenReturn("s:invalidPhoneNumber")
+ whenever(stringProvider.missingPhoneNumber).thenReturn("s:missingPhoneNumber")
+ whenever(stringProvider.invalidVerificationCode).thenReturn("s:invalidVerificationCode")
+ whenever(stringProvider.errorSessionExpired).thenReturn("s:sessionExpired")
+ whenever(stringProvider.errorInvalidVerificationId).thenReturn("s:invalidVerificationId")
+ whenever(stringProvider.errorRetryPhoneAuth).thenReturn("s:retryPhoneAuth")
+ whenever(stringProvider.errorUserMismatch).thenReturn("s:userMismatch")
+ whenever(stringProvider.errorPhoneNumberNotEnrolled).thenReturn("s:phoneNumberNotEnrolled")
+ whenever(stringProvider.errorMultiFactorSessionExpired).thenReturn("s:multiFactorSessionExpired")
+
+ val expected = mapOf(
+ "ERROR_INVALID_CREDENTIAL" to "s:incorrectEmailOrPassword",
+ "ERROR_WRONG_PASSWORD" to "s:invalidPassword",
+ "ERROR_INVALID_EMAIL" to "s:invalidEmailAddress",
+ "ERROR_MISSING_EMAIL" to "s:missingEmailAddress",
+ "ERROR_MISSING_PASSWORD" to "s:requiredField",
+ "ERROR_MISSING_VERIFICATION_CODE" to "s:requiredField",
+ "ERROR_INVALID_PHONE_NUMBER" to "s:invalidPhoneNumber",
+ "ERROR_MISSING_PHONE_NUMBER" to "s:missingPhoneNumber",
+ "ERROR_INVALID_VERIFICATION_CODE" to "s:invalidVerificationCode",
+ "ERROR_SESSION_EXPIRED" to "s:sessionExpired",
+ "ERROR_INVALID_VERIFICATION_ID" to "s:invalidVerificationId",
+ "ERROR_MISSING_VERIFICATION_ID" to "s:invalidVerificationId",
+ "ERROR_RETRY_PHONE_AUTH" to "s:retryPhoneAuth",
+ "ERROR_USER_MISMATCH" to "s:userMismatch",
+ "ERROR_PHONE_NUMBER_NOT_FOUND" to "s:phoneNumberNotEnrolled",
+ "ERROR_MULTI_FACTOR_INFO_NOT_FOUND" to "s:phoneNumberNotEnrolled",
+ "ERROR_INVALID_MULTI_FACTOR_SESSION" to "s:multiFactorSessionExpired",
+ "ERROR_MISSING_MULTI_FACTOR_SESSION" to "s:multiFactorSessionExpired",
+ )
+
+ val actual = expected.keys.associateWith { code ->
+ val result = AuthException.from(invalidCredentials(code), stringProvider)
+ assertThat(result).isInstanceOf(AuthException.InvalidCredentialsException::class.java)
+ result.message
+ }
+
+ assertThat(actual).containsExactlyEntriesIn(expected)
+ }
+
+ @Test
+ fun `from() uses ERROR_INVALID_CREDENTIAL copy that does not blame the password`() {
+ // Under email enumeration protection this single code covers wrong password AND no such
+ // account, so reusing the wrong-password string would state something false.
+ val stringProvider = mock(AuthUIStringProvider::class.java)
+ whenever(stringProvider.errorIncorrectEmailOrPassword).thenReturn("Email or password wrong")
+ whenever(stringProvider.invalidPassword).thenReturn("Incorrect password.")
+
+ val result = AuthException.from(invalidCredentials("ERROR_INVALID_CREDENTIAL"), stringProvider)
+
+ assertThat(result.message).isEqualTo("Email or password wrong")
+ }
+
+ @Test
+ fun `from() prefers the blank-able type-level hook over the per-code string`() {
+ val stringProvider = mock(AuthUIStringProvider::class.java)
+ whenever(stringProvider.errorInvalidCredentials).thenReturn("Host-wide override")
+ whenever(stringProvider.invalidPassword).thenReturn("Incorrect password.")
+
+ val result = AuthException.from(invalidCredentials("ERROR_WRONG_PASSWORD"), stringProvider)
+
+ assertThat(result.message).isEqualTo("Host-wide override")
+ }
+
+ @Test
+ fun `from() falls back to the Firebase message when the per-code string is blank`() {
+ val stringProvider = mock(AuthUIStringProvider::class.java)
+ whenever(stringProvider.errorInvalidCredentials).thenReturn("")
+ whenever(stringProvider.invalidPassword).thenReturn("")
+
+ val result = AuthException.from(invalidCredentials("ERROR_WRONG_PASSWORD"), stringProvider)
+
+ assertThat(result.message).isEqualTo(sdkText)
+ }
+
+ @Test
+ fun `from() routes custom token codes to MisconfigurationException`() {
+ val stringProvider = mock(AuthUIStringProvider::class.java)
+ whenever(stringProvider.unknownErrorRecoveryMessage).thenReturn("Une erreur est survenue")
+
+ for (code in listOf("ERROR_INVALID_CUSTOM_TOKEN", "ERROR_CUSTOM_TOKEN_MISMATCH")) {
+ val firebaseException = invalidCredentials(code)
+ val result = AuthException.from(firebaseException, stringProvider)
+ assertThat(result).isInstanceOf(AuthException.MisconfigurationException::class.java)
+ // The diagnostic names the developer's own token backend; it is renderable nowhere.
+ assertWithMessage(code).that(result.message).isEqualTo("Une erreur est survenue")
+ assertWithMessage(code).that(result.cause).isEqualTo(firebaseException)
+ assertWithMessage(code).that(result.cause?.message).isEqualTo(sdkText)
+ }
+ }
+
+ @Test
+ fun `from() routes expired user tokens to the session-expired copy`() {
+ val stringProvider = mock(AuthUIStringProvider::class.java)
+ whenever(stringProvider.errorMultiFactorSessionExpired).thenReturn("Session gone")
+
+ for (code in listOf("ERROR_INVALID_USER_TOKEN", "ERROR_USER_TOKEN_EXPIRED")) {
+ val firebaseException = FirebaseAuthInvalidUserException(code, sdkText)
+ val result = AuthException.from(firebaseException, stringProvider)
+ assertThat(result).isInstanceOf(AuthException.InvalidCredentialsException::class.java)
+ assertThat(result.message).isEqualTo("Session gone")
+ }
+ }
+
+ @Test
+ fun `from() routes action code failures to the action-code copy`() {
+ val stringProvider = mock(AuthUIStringProvider::class.java)
+ whenever(stringProvider.errorActionCodeInvalid).thenReturn("Link no longer valid")
+
+ for (code in listOf("ERROR_EXPIRED_ACTION_CODE", "ERROR_INVALID_ACTION_CODE")) {
+ val firebaseException = FirebaseAuthActionCodeException(code, sdkText)
+ val result = AuthException.from(firebaseException, stringProvider)
+ assertThat(result).isInstanceOf(AuthException.InvalidCredentialsException::class.java)
+ assertThat(result.message).isEqualTo("Link no longer valid")
+ }
+ }
+
+ @Test
+ fun `from() routes the user-facing plain auth codes to their own strings`() {
+ val stringProvider = mock(AuthUIStringProvider::class.java)
+ whenever(stringProvider.errorUnverifiedEmail).thenReturn("s:unverifiedEmail")
+ whenever(stringProvider.errorSecondFactorAlreadyEnrolled).thenReturn("s:alreadyEnrolled")
+ whenever(stringProvider.errorMaximumSecondFactorCountExceeded).thenReturn("s:maxFactors")
+
+ val expected = mapOf(
+ "ERROR_UNVERIFIED_EMAIL" to "s:unverifiedEmail",
+ "ERROR_SECOND_FACTOR_ALREADY_ENROLLED" to "s:alreadyEnrolled",
+ "ERROR_MAXIMUM_SECOND_FACTOR_COUNT_EXCEEDED" to "s:maxFactors",
+ )
+
+ val actual = expected.keys.associateWith { code ->
+ val result = AuthException.from(object : FirebaseAuthException(code, sdkText) {}, stringProvider)
+ assertThat(result).isInstanceOf(AuthException.InvalidCredentialsException::class.java)
+ result.message
+ }
+
+ assertThat(actual).containsExactlyEntriesIn(expected)
+ }
+
+ @Test
+ fun `from() routes developer setup codes to MisconfigurationException, diagnostic on the cause`() {
+ val configurationCodes = listOf(
+ "ERROR_OPERATION_NOT_ALLOWED",
+ "ERROR_APP_NOT_AUTHORIZED",
+ "ERROR_UNAUTHORIZED_DOMAIN",
+ "ERROR_MISSING_CONTINUE_URI",
+ "ERROR_INVALID_CERT_HASH",
+ "ERROR_DYNAMIC_LINK_NOT_ACTIVATED",
+ "ERROR_INVALID_DYNAMIC_LINK_DOMAIN",
+ "ERROR_INVALID_HOSTING_LINK_DOMAIN",
+ "ERROR_INVALID_PROVIDER_ID",
+ "ERROR_ADMIN_RESTRICTED_OPERATION",
+ "ERROR_UNSUPPORTED_FIRST_FACTOR",
+ "ERROR_UNSUPPORTED_PASSTHROUGH_OPERATION",
+ "ERROR_INVALID_REQ_TYPE",
+ "ERROR_WEB_CONTEXT_ALREADY_PRESENTED",
+ "ERROR_INVALID_TENANT_ID",
+ "ERROR_TENANT_ID_MISMATCH",
+ "ERROR_UNSUPPORTED_TENANT_OPERATION",
+ "ERROR_RECAPTCHA_NOT_ENABLED",
+ "ERROR_CAPTCHA_CHECK_FAILED",
+ "ERROR_MISSING_RECAPTCHA_TOKEN",
+ "ERROR_INVALID_RECAPTCHA_TOKEN",
+ "ERROR_INVALID_RECAPTCHA_ACTION",
+ "ERROR_MISSING_RECAPTCHA_VERSION",
+ "ERROR_INVALID_RECAPTCHA_VERSION",
+ "ERROR_MISSING_CLIENT_TYPE",
+ "ERROR_MISSING_CLIENT_IDENTIFIER",
+ "ERROR_ALTERNATE_CLIENT_IDENTIFIER_REQUIRED",
+ // Email-template settings in the Firebase console.
+ "ERROR_INVALID_MESSAGE_PAYLOAD",
+ "ERROR_INVALID_SENDER",
+ "ERROR_INVALID_RECIPIENT_EMAIL",
+ // Host integration and project quota. The synthetic exception below pins the `when`
+ // arm; AuthExceptionRecoveryResolutionTest drives the SDK's own missing-activity type.
+ "ERROR_MISSING_ACTIVITY",
+ "ERROR_WEB_STORAGE_UNSUPPORTED",
+ "ERROR_QUOTA_EXCEEDED",
+ )
+ // EmailAuthScreen and PhoneAuthScreen render `exception.message` inline without going
+ // through getRecoveryMessage, so the diagnostic must not be on the message at all. It
+ // stays on the cause, where logs and `exception.cause?.message` still reach it.
+ val stringProvider = mock(AuthUIStringProvider::class.java)
+ whenever(stringProvider.errorUnknownAuth).thenReturn("Generic unknown error")
+ whenever(stringProvider.unknownErrorRecoveryMessage).thenReturn("Une erreur est survenue")
+
+ for (code in configurationCodes) {
+ val firebaseException = object : FirebaseAuthException(code, sdkText) {}
+ val result = AuthException.from(firebaseException, stringProvider)
+ assertWithMessage(code).that(result)
+ .isInstanceOf(AuthException.MisconfigurationException::class.java)
+ assertWithMessage(code).that(result.message).isEqualTo("Une erreur est survenue")
+ assertWithMessage(code).that(result.cause).isEqualTo(firebaseException)
+ assertWithMessage(code).that(result.cause?.message).isEqualTo(sdkText)
+ }
+ }
+
+ @Test
+ fun `from() keeps internal errors out of MisconfigurationException`() {
+ // INTERNAL_ERROR is what the SDK falls back to for a status it does not recognise, and
+ // ERROR_WEB_INTERNAL_ERROR is a backend fault. Neither is a setup problem.
+ for (code in listOf("INTERNAL_ERROR", "ERROR_WEB_INTERNAL_ERROR")) {
+ val result = AuthException.from(object : FirebaseAuthException(code, sdkText) {})
+ assertWithMessage(code).that(result)
+ .isInstanceOf(AuthException.UnknownException::class.java)
+ }
+ }
+
+ @Test
+ fun `from() maps ERROR_USER_CANCELLED to AuthCancelledException`() {
+ val stringProvider = mock(AuthUIStringProvider::class.java)
+ whenever(stringProvider.errorAuthCancelled).thenReturn("You cancelled")
+
+ for (code in listOf("ERROR_USER_CANCELLED", "ERROR_WEB_CONTEXT_CANCELED")) {
+ val result = AuthException.from(object : FirebaseAuthException(code, sdkText) {}, stringProvider)
+ assertWithMessage(code).that(result)
+ .isInstanceOf(AuthException.AuthCancelledException::class.java)
+ assertWithMessage(code).that(result.message).isEqualTo("You cancelled")
+ }
+ }
+
+ @Test
+ fun `new AuthUIStringProvider members compile to real JVM default methods`() {
+ // Decision: every new member must be source- AND binary-compatible, so a host that
+ // implemented the interface before this change still compiles and still links. An
+ // abstract JVM method here would break every existing implementor at runtime.
+ val newMembers = listOf(
+ "getErrorIncorrectEmailOrPassword",
+ "getErrorInvalidVerificationId",
+ "getErrorRetryPhoneAuth",
+ "getErrorUserMismatch",
+ "getErrorPhoneNumberNotEnrolled",
+ "getErrorSessionExpired",
+ "getErrorMultiFactorSessionExpired",
+ "getErrorActionCodeInvalid",
+ "getErrorUnverifiedEmail",
+ "getErrorSecondFactorAlreadyEnrolled",
+ "getErrorMaximumSecondFactorCountExceeded",
+ )
+
+ for (name in newMembers) {
+ val method = AuthUIStringProvider::class.java.getMethod(name)
+ assertWithMessage(name).that(method.isDefault).isTrue()
+ }
+ }
+ @Test
+ fun `an expired user token honours the credentials hook, not the account-generic one`() {
+ // It produces an InvalidCredentialsException, so errorUserAccountGeneric — the hook the
+ // UserNotFoundException arm below it uses — must not win.
+ val stringProvider = mock(AuthUIStringProvider::class.java)
+ whenever(stringProvider.errorInvalidCredentials).thenReturn("Custom: credentials")
+ whenever(stringProvider.errorUserAccountGeneric).thenReturn("Custom: account generic")
+ val firebaseException = FirebaseAuthInvalidUserException("ERROR_USER_TOKEN_EXPIRED", "x")
+
+ val result = AuthException.from(firebaseException, stringProvider)
+
+ assertThat(result).isInstanceOf(AuthException.InvalidCredentialsException::class.java)
+ assertThat(result.message).isEqualTo("Custom: credentials")
+ }
+
}
\ No newline at end of file
diff --git a/auth/src/test/java/com/firebase/ui/auth/PasswordPolicyMessageLocalizationTest.kt b/auth/src/test/java/com/firebase/ui/auth/PasswordPolicyMessageLocalizationTest.kt
new file mode 100644
index 000000000..7247fc6fa
--- /dev/null
+++ b/auth/src/test/java/com/firebase/ui/auth/PasswordPolicyMessageLocalizationTest.kt
@@ -0,0 +1,311 @@
+/*
+ * Copyright 2025 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.firebase.ui.auth
+
+import android.content.Context
+import androidx.test.core.app.ApplicationProvider
+import com.firebase.ui.auth.configuration.string_provider.AuthUIStringProvider
+import com.firebase.ui.auth.configuration.string_provider.DefaultAuthUIStringProvider
+import com.firebase.ui.auth.ui.components.getRecoveryMessage
+import com.google.common.truth.Truth.assertThat
+import com.google.common.truth.Truth.assertWithMessage
+import com.google.firebase.FirebaseException
+import com.google.firebase.auth.FirebaseAuthWeakPasswordException
+import java.util.Locale
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.annotation.Config
+
+/**
+ * Covers the Google Identity Platform password-policy path.
+ *
+ * The fixtures are the real backend strings, captured from a project with `Require` enforcement
+ * and a minimum length of 10.
+ *
+ * @suppress Internal test class
+ */
+@RunWith(RobolectricTestRunner::class)
+@Config(manifest = Config.NONE)
+class PasswordPolicyMessageLocalizationTest {
+
+ private val context: Context = ApplicationProvider.getApplicationContext()
+ private val strings: AuthUIStringProvider = DefaultAuthUIStringProvider(context)
+ private val french: AuthUIStringProvider = DefaultAuthUIStringProvider(context, Locale.FRENCH)
+
+ // =============================================================================================
+ // The real backend strings
+ // =============================================================================================
+
+ private companion object {
+ /** Verbatim single-constraint probe responses. */
+ const val MIN_LENGTH = "Password must contain at least 10 characters"
+ const val UPPER_CASE = "Password must contain an upper case character"
+ const val LOWER_CASE = "Password must contain a lower case character"
+ const val NUMERIC = "Password must contain a numeric character"
+
+ /**
+ * Unverified: the probe project has special characters disabled. GIdP's wording is
+ * "non-alphanumeric", which is where the substring collision with [NUMERIC] comes from.
+ */
+ const val NON_ALPHANUMERIC = "Password must contain a non-alphanumeric character"
+
+ /** All failing requirements come back together, comma-separated, inside one bracket. */
+ const val ALL_THREE =
+ "PASSWORD_DOES_NOT_MEET_REQUIREMENTS : Missing password requirements: " +
+ "[$MIN_LENGTH, $UPPER_CASE, $NUMERIC]"
+
+ /**
+ * The marker with nothing parseable after it. `parsePasswordPolicyRequirements` returns an
+ * empty list, and the whole message is then the generic string.
+ */
+ const val UNPARSEABLE = "PASSWORD_DOES_NOT_MEET_REQUIREMENTS"
+
+ val ENGLISH_REQUIREMENT_SENTENCES =
+ listOf(MIN_LENGTH, UPPER_CASE, LOWER_CASE, NUMERIC)
+ }
+
+ /** The two exception shapes that carry a policy rejection into `from()`. */
+ private fun shapesFor(sourceText: String): List> = listOf(
+ // `from()` reads `reason` first for this type.
+ "FirebaseAuthWeakPasswordException" to
+ FirebaseAuthWeakPasswordException("ERROR_WEAK_PASSWORD", sourceText, sourceText),
+ "FirebaseException" to FirebaseException(sourceText),
+ )
+
+ // =============================================================================================
+ // Untranslated English reaching the dialog
+ // =============================================================================================
+
+ @Test
+ fun `a parsed policy rejection never renders the backend's English sentences`() {
+ for ((shape, exception) in shapesFor(ALL_THREE)) {
+ val rendered = getRecoveryMessage(AuthException.from(exception, strings), strings)
+
+ for (sentence in ENGLISH_REQUIREMENT_SENTENCES) {
+ assertWithMessage("%s -> dialog body still contains %s", shape, sentence)
+ .that(rendered).doesNotContain(sentence)
+ }
+ assertWithMessage("%s -> dialog body is blank", shape)
+ .that(rendered.isBlank()).isFalse()
+ }
+ }
+
+ @Test
+ fun `an unparseable policy rejection never renders the old hardcoded literal`() {
+ for ((shape, exception) in shapesFor(UNPARSEABLE)) {
+ val rendered = getRecoveryMessage(AuthException.from(exception, strings), strings)
+
+ // `errorWeakPasswordGeneric` is the host's hook and ships blank.
+ assertWithMessage("%s -> dialog body fell back to the hardcoded literal", shape)
+ .that(rendered).doesNotContain("Password does not meet policy requirements")
+ assertWithMessage("%s -> dialog body", shape)
+ .that(rendered).isEqualTo(strings.errorPasswordPolicyGeneric)
+ }
+ }
+
+ @Test
+ fun `both policy paths resolve to French on a French device`() {
+ for (sourceText in listOf(ALL_THREE, UNPARSEABLE)) {
+ for ((shape, exception) in shapesFor(sourceText)) {
+ val rendered = getRecoveryMessage(AuthException.from(exception, french), french)
+
+ for (sentence in ENGLISH_REQUIREMENT_SENTENCES) {
+ assertWithMessage("%s -> French dialog body contains %s", shape, sentence)
+ .that(rendered).doesNotContain(sentence)
+ }
+ assertWithMessage("%s -> French dialog body is not French", shape)
+ .that(rendered).contains("mot de passe")
+ }
+ }
+ }
+
+ // =============================================================================================
+ // What the mapping actually produces
+ // =============================================================================================
+
+ @Test
+ fun `each requirement maps to the library's own translated copy`() {
+ val rendered = getRecoveryMessage(
+ AuthException.from(FirebaseException(ALL_THREE), strings), strings
+ )
+
+ // The project's own minimum, read back out of the sentence — not the 6 that
+ // `weakPasswordRecoveryMessage` hardcodes.
+ assertThat(rendered).contains(strings.passwordTooShort(10))
+ assertThat(rendered).contains(strings.passwordMissingUppercase)
+ assertThat(rendered).contains(strings.passwordMissingDigit)
+ // Only the three that failed.
+ assertThat(rendered).doesNotContain(strings.passwordMissingLowercase)
+ assertThat(rendered.lines()).hasSize(3)
+ }
+
+ @Test
+ fun `the lower case requirement maps too`() {
+ // Not in ALL_THREE, so it needs its own fixture to be covered at all.
+ val rendered = getRecoveryMessage(
+ AuthException.from(
+ FirebaseException("PASSWORD_DOES_NOT_MEET_REQUIREMENTS: [$LOWER_CASE]"), strings
+ ),
+ strings
+ )
+
+ assertThat(rendered).isEqualTo(strings.passwordMissingLowercase)
+ }
+
+ @Test
+ fun `the non-alphanumeric requirement maps to the special-character copy, not the digit one`() {
+ // "numeric" is a substring of "non-alphanumeric", so the digit arm can swallow this.
+ val rendered = getRecoveryMessage(
+ AuthException.from(
+ FirebaseException("PASSWORD_DOES_NOT_MEET_REQUIREMENTS: [$NON_ALPHANUMERIC]"),
+ strings
+ ),
+ strings
+ )
+
+ assertThat(rendered).isEqualTo(strings.passwordMissingSpecialCharacter)
+ assertThat(rendered).isNotEqualTo(strings.passwordMissingDigit)
+ }
+
+ @Test
+ fun `the digit and special-character requirements stay distinct when both fail`() {
+ // The pair must resolve to two different strings whichever arm is tested first.
+ val rendered = getRecoveryMessage(
+ AuthException.from(
+ FirebaseException(
+ "PASSWORD_DOES_NOT_MEET_REQUIREMENTS: [$NUMERIC, $NON_ALPHANUMERIC]"
+ ),
+ strings
+ ),
+ strings
+ )
+
+ assertThat(rendered.lines()).containsExactly(
+ strings.passwordMissingDigit,
+ strings.passwordMissingSpecialCharacter,
+ ).inOrder()
+ }
+
+ @Test
+ fun `the spelled-out special character wording maps too`() {
+ val rendered = getRecoveryMessage(
+ AuthException.from(
+ FirebaseException(
+ "PASSWORD_DOES_NOT_MEET_REQUIREMENTS: " +
+ "[Password must contain a special character]"
+ ),
+ strings
+ ),
+ strings
+ )
+
+ assertThat(rendered).isEqualTo(strings.passwordMissingSpecialCharacter)
+ }
+
+ @Test
+ fun `an exclusive maximum-length requirement states the maximum, not the bound`() {
+ // "fewer than 4096" permits 4095, and passwordTooLong renders the maximum, not the bound.
+ val rendered = getRecoveryMessage(
+ AuthException.from(
+ FirebaseException(
+ "PASSWORD_DOES_NOT_MEET_REQUIREMENTS: " +
+ "[Password must contain fewer than 4096 characters]"
+ ),
+ strings
+ ),
+ strings
+ )
+
+ assertThat(rendered).isEqualTo(strings.passwordTooLong(4095))
+ assertThat(rendered).isNotEqualTo(strings.passwordTooLong(4096))
+ }
+
+ @Test
+ fun `an inclusive maximum-length requirement takes the number as written`() {
+ // "at most N" and "no more than N" are inclusive, so no adjustment applies.
+ for (wording in listOf("at most 64", "no more than 64")) {
+ val rendered = getRecoveryMessage(
+ AuthException.from(
+ FirebaseException(
+ "PASSWORD_DOES_NOT_MEET_REQUIREMENTS: " +
+ "[Password must contain $wording characters]"
+ ),
+ strings
+ ),
+ strings
+ )
+
+ assertWithMessage(wording).that(rendered).isEqualTo(strings.passwordTooLong(64))
+ }
+ }
+
+ @Test
+ fun `an unrecognised requirement is kept verbatim rather than dropped`() {
+ val reworded = "Password must not be one of your last 5 passwords"
+ val rendered = getRecoveryMessage(
+ AuthException.from(
+ FirebaseException(
+ "PASSWORD_DOES_NOT_MEET_REQUIREMENTS: [$UPPER_CASE, $reworded]"
+ ),
+ strings
+ ),
+ strings
+ )
+
+ // The known one is still translated...
+ assertThat(rendered).contains(strings.passwordMissingUppercase)
+ // ...and the unknown one is kept verbatim instead of vanishing or blanking the message.
+ assertThat(rendered).contains(reworded)
+ }
+
+ @Test
+ fun `failingRequirements keeps the raw untranslated sentences`() {
+ val exception = AuthException.from(FirebaseException(ALL_THREE), french)
+
+ assertThat(exception).isInstanceOf(AuthException.PasswordPolicyViolationException::class.java)
+ val policy = exception as AuthException.PasswordPolicyViolationException
+
+ // This list stays raw even when `message` is French.
+ assertThat(policy.failingRequirements)
+ .containsExactly(MIN_LENGTH, UPPER_CASE, NUMERIC).inOrder()
+ assertThat(policy.message).doesNotContain(MIN_LENGTH)
+ }
+
+ @Test
+ fun `a policy rejection stays a PasswordPolicyViolationException, not a WeakPasswordException`() {
+ for ((shape, exception) in shapesFor(ALL_THREE)) {
+ assertWithMessage("%s", shape).that(AuthException.from(exception, strings))
+ .isInstanceOf(AuthException.PasswordPolicyViolationException::class.java)
+ }
+
+ // A plain weak-password rejection must not be pulled into the policy type.
+ val plain = FirebaseAuthWeakPasswordException(
+ "ERROR_WEAK_PASSWORD", "Password should be at least 6 characters",
+ "Password should be at least 6 characters"
+ )
+ assertThat(AuthException.from(plain, strings))
+ .isInstanceOf(AuthException.WeakPasswordException::class.java)
+ }
+
+ @Test
+ fun `a null string provider still leaves the backend sentences readable`() {
+ // Nothing to resolve against, so the raw sentences are the only output.
+ val resolved = AuthException.from(FirebaseException(ALL_THREE), null as AuthUIStringProvider?)
+
+ assertThat(resolved.message).contains(MIN_LENGTH)
+ assertThat(resolved.message).contains(UPPER_CASE)
+ }
+}
diff --git a/auth/src/test/java/com/firebase/ui/auth/configuration/auth_provider/EmailAuthProviderFirebaseAuthUITest.kt b/auth/src/test/java/com/firebase/ui/auth/configuration/auth_provider/EmailAuthProviderFirebaseAuthUITest.kt
index 7ee51ee12..31058c248 100644
--- a/auth/src/test/java/com/firebase/ui/auth/configuration/auth_provider/EmailAuthProviderFirebaseAuthUITest.kt
+++ b/auth/src/test/java/com/firebase/ui/auth/configuration/auth_provider/EmailAuthProviderFirebaseAuthUITest.kt
@@ -26,6 +26,7 @@ import com.firebase.ui.auth.configuration.PasswordRule
import com.firebase.ui.auth.configuration.authUIConfiguration
import com.firebase.ui.auth.configuration.string_provider.AuthUIStringProvider
import com.firebase.ui.auth.configuration.string_provider.DefaultAuthUIStringProvider
+import com.firebase.ui.auth.ui.components.getRecoveryMessage
import com.firebase.ui.auth.util.EmailLinkPersistenceManager
import com.firebase.ui.auth.util.MockPersistenceManager
import com.google.android.gms.tasks.TaskCompletionSource
@@ -33,6 +34,7 @@ import com.google.common.truth.Truth.assertThat
import com.google.common.truth.Truth.assertWithMessage
import com.google.firebase.FirebaseApp
import com.google.firebase.FirebaseOptions
+import com.google.firebase.FirebaseTooManyRequestsException
import com.google.firebase.auth.ActionCodeSettings
import com.google.firebase.auth.AuthCredential
import com.google.firebase.auth.AuthResult
@@ -2264,8 +2266,11 @@ class EmailAuthProviderFirebaseAuthUITest {
// "Too many attempts. Please try again later", in Japanese.
val localizedMessage = "試行回数が多すぎます。しばらくしてからもう一度お試しください"
`when`(mockFirebaseAuth.currentUser).thenReturn(null)
- val tooManyRequests =
- object : FirebaseAuthException("ERROR_TOO_MANY_REQUESTS", "Too many requests") {}
+ // Rate limiting is a FirebaseTooManyRequestsException, not a FirebaseAuthException:
+ // it is not an auth exception at all and carries no error code.
+ val tooManyRequests = FirebaseTooManyRequestsException(
+ "We have blocked all requests from this device due to unusual activity."
+ )
val taskCompletionSource = TaskCompletionSource()
taskCompletionSource.setException(tooManyRequests)
`when`(mockFirebaseAuth.sendSignInLinkToEmail(anyString(), any()))
@@ -2361,4 +2366,168 @@ class EmailAuthProviderFirebaseAuthUITest {
assertThat((state as AuthState.Error).exception).hasMessageThat()
.isEqualTo(localizedMessage)
}
+
+ @Test
+ fun `signInWithEmailAndPassword - wrong password uses the per-code string, not the invalid-credentials one`() =
+ runTest {
+ // "The password is incorrect", in Japanese. ERROR_WRONG_PASSWORD used to share one flat
+ // arm with every other invalid-credential code, so this string was unreachable.
+ val localizedMessage = "パスワードが正しくありません"
+ val wrongPassword = FirebaseAuthInvalidCredentialsException(
+ "ERROR_WRONG_PASSWORD",
+ "The password is invalid or the user does not have a password. [ INVALID_PASSWORD ]"
+ )
+ val taskCompletionSource = TaskCompletionSource()
+ taskCompletionSource.setException(wrongPassword)
+ `when`(mockFirebaseAuth.signInWithEmailAndPassword("test@example.com", "Pass@123"))
+ .thenReturn(taskCompletionSource.task)
+
+ val config = authUIConfiguration {
+ context = applicationContext
+ providers {
+ provider(
+ AuthProvider.Email(
+ emailLinkActionCodeSettings = null,
+ passwordValidationRules = emptyList()
+ )
+ )
+ }
+ stringProvider = object :
+ AuthUIStringProvider by DefaultAuthUIStringProvider(applicationContext) {
+ override val invalidPassword: String = localizedMessage
+ }
+ }
+
+ val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth)
+ var thrown: Throwable? = null
+ try {
+ instance.flowScope(config).signInWithEmailAndPassword(
+ context = applicationContext,
+ email = "test@example.com",
+ password = "Pass@123"
+ )
+ } catch (t: Throwable) {
+ thrown = t
+ }
+
+ assertThat(thrown).isInstanceOf(AuthException.InvalidCredentialsException::class.java)
+ assertThat(thrown).hasMessageThat().isEqualTo(localizedMessage)
+
+ val state = instance.authStateFlow().first()
+ assertThat(state).isInstanceOf(AuthState.Error::class.java)
+ assertThat((state as AuthState.Error).exception).hasMessageThat()
+ .isEqualTo(localizedMessage)
+ }
+
+ @Test
+ fun `signInWithEmailAndPassword - merged invalid-credential code does not blame the password`() =
+ runTest {
+ // With email enumeration protection on, a wrong password and a nonexistent account both
+ // arrive as ERROR_INVALID_CREDENTIAL, so "Incorrect password" would be a false claim.
+ val incorrectEmailOrPassword = "That email or password isn't correct"
+ val invalidCredential = FirebaseAuthInvalidCredentialsException(
+ "ERROR_INVALID_CREDENTIAL",
+ "The supplied auth credential is incorrect, malformed or has expired."
+ )
+ val taskCompletionSource = TaskCompletionSource()
+ taskCompletionSource.setException(invalidCredential)
+ `when`(mockFirebaseAuth.signInWithEmailAndPassword("test@example.com", "Pass@123"))
+ .thenReturn(taskCompletionSource.task)
+
+ val config = authUIConfiguration {
+ context = applicationContext
+ providers {
+ provider(
+ AuthProvider.Email(
+ emailLinkActionCodeSettings = null,
+ passwordValidationRules = emptyList()
+ )
+ )
+ }
+ }
+
+ val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth)
+ var thrown: Throwable? = null
+ try {
+ instance.flowScope(config).signInWithEmailAndPassword(
+ context = applicationContext,
+ email = "test@example.com",
+ password = "Pass@123"
+ )
+ } catch (t: Throwable) {
+ thrown = t
+ }
+
+ assertThat(thrown).isInstanceOf(AuthException.InvalidCredentialsException::class.java)
+ assertThat(thrown).hasMessageThat().isEqualTo(incorrectEmailOrPassword)
+ assertThat(thrown).hasMessageThat()
+ .isNotEqualTo(applicationContext.getString(R.string.fui_error_invalid_password))
+
+ val state = instance.authStateFlow().first()
+ assertThat(state).isInstanceOf(AuthState.Error::class.java)
+ assertThat((state as AuthState.Error).exception).hasMessageThat()
+ .isEqualTo(incorrectEmailOrPassword)
+ }
+
+ @Test
+ fun `sendSignInLinkToEmail - a disabled provider surfaces as MisconfigurationException`() =
+ runTest {
+ // The user can do nothing about a provider left disabled in the Firebase console, so
+ // the raw diagnostic stays on the cause for logs and never reaches the message.
+ val rawDiagnostic = "This operation is not allowed. This may be because the given " +
+ "sign-in provider is disabled for this Firebase project. [ OPERATION_NOT_ALLOWED ]"
+ `when`(mockFirebaseAuth.currentUser).thenReturn(null)
+ val notAllowed =
+ object : FirebaseAuthException("ERROR_OPERATION_NOT_ALLOWED", rawDiagnostic) {}
+ val taskCompletionSource = TaskCompletionSource()
+ taskCompletionSource.setException(notAllowed)
+ `when`(mockFirebaseAuth.sendSignInLinkToEmail(anyString(), any()))
+ .thenReturn(taskCompletionSource.task)
+
+ val provider = AuthProvider.Email(
+ isEmailLinkSignInEnabled = true,
+ emailLinkActionCodeSettings = ActionCodeSettings.newBuilder()
+ .setUrl("https://example.com")
+ .setHandleCodeInApp(true)
+ .setAndroidPackageName("com.test", true, null)
+ .build(),
+ passwordValidationRules = emptyList()
+ )
+ val config = authUIConfiguration {
+ context = applicationContext
+ providers { provider(provider) }
+ }
+
+ val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth)
+ var thrown: Throwable? = null
+ try {
+ instance.flowScope(config).sendSignInLinkToEmail(
+ context = applicationContext,
+ provider = provider,
+ email = "test@example.com",
+ credentialForLinking = null
+ )
+ } catch (t: Throwable) {
+ thrown = t
+ }
+
+ assertThat(thrown).isInstanceOf(AuthException.MisconfigurationException::class.java)
+ // EmailAuthScreen renders `exception.message` inline, so the message itself has to be
+ // clean; the diagnostic is still reachable as `exception.cause?.message`.
+ assertThat(thrown).hasMessageThat().doesNotContain("Firebase")
+ assertThat(thrown).hasMessageThat().doesNotContain("OPERATION_NOT_ALLOWED")
+ assertThat(thrown?.cause).isEqualTo(notAllowed)
+ assertThat(thrown?.cause).hasMessageThat().isEqualTo(rawDiagnostic)
+
+ val state = instance.authStateFlow().first()
+ assertThat(state).isInstanceOf(AuthState.Error::class.java)
+ val emitted = (state as AuthState.Error).exception
+ assertThat(emitted).isInstanceOf(AuthException.MisconfigurationException::class.java)
+ assertThat(
+ getRecoveryMessage(
+ emitted as AuthException,
+ DefaultAuthUIStringProvider(applicationContext)
+ )
+ ).doesNotContain("Firebase")
+ }
}
diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/components/ErrorRecoveryDialogLogicTest.kt b/auth/src/test/java/com/firebase/ui/auth/ui/components/ErrorRecoveryDialogLogicTest.kt
index c095131a1..f4c373d07 100644
--- a/auth/src/test/java/com/firebase/ui/auth/ui/components/ErrorRecoveryDialogLogicTest.kt
+++ b/auth/src/test/java/com/firebase/ui/auth/ui/components/ErrorRecoveryDialogLogicTest.kt
@@ -4,6 +4,7 @@ import com.firebase.ui.auth.AuthException
import com.firebase.ui.auth.configuration.string_provider.AuthUIStringProvider
import com.google.common.truth.Truth
import com.google.firebase.auth.EmailAuthProvider
+import com.google.firebase.auth.FirebaseAuthException
import com.google.firebase.auth.GoogleAuthProvider
import org.junit.Test
import org.junit.runner.RunWith
@@ -41,9 +42,22 @@ class ErrorRecoveryDialogLogicTest {
// =============================================================================================
@Test
- fun `getRecoveryMessage returns network error message for NetworkException`() {
+ fun `getRecoveryMessage prefers the library-owned message for NetworkException`() {
+ // Arrange - AuthException.from now puts the configured provider's string on the exception,
+ // so discarding it here would throw away the host's own translated copy.
+ val error = AuthException.NetworkException("Pas de connexion Internet")
+
+ // Act
+ val message = getRecoveryMessage(error, mockStringProvider)
+
+ // Assert
+ Truth.assertThat(message).isEqualTo("Pas de connexion Internet")
+ }
+
+ @Test
+ fun `getRecoveryMessage returns network error message for NetworkException with blank message`() {
// Arrange
- val error = AuthException.NetworkException("Network error")
+ val error = AuthException.NetworkException("")
// Act
val message = getRecoveryMessage(error, mockStringProvider)
@@ -77,15 +91,16 @@ class ErrorRecoveryDialogLogicTest {
}
@Test
- fun `getRecoveryMessage returns generic message for InvalidCredentialsException with generic error text`() {
- // Arrange - When error message is the generic fallback
+ fun `getRecoveryMessage shows the hardcoded fallback text for InvalidCredentialsException`() {
+ // Arrange - The old sentinel dropped this exact string on the floor. It could never match
+ // real traffic anyway: the SDK formats every message as " [ ]".
val error = AuthException.InvalidCredentialsException("Invalid credentials provided")
// Act
val message = getRecoveryMessage(error, mockStringProvider)
- // Assert - Should show the localized generic message
- Truth.assertThat(message).isEqualTo("Incorrect password.")
+ // Assert
+ Truth.assertThat(message).isEqualTo("Invalid credentials provided")
}
@Test
@@ -101,22 +116,34 @@ class ErrorRecoveryDialogLogicTest {
}
@Test
- fun `getRecoveryMessage returns user not found message for UserNotFoundException`() {
+ fun `getRecoveryMessage prefers the library-owned message for UserNotFoundException`() {
// Arrange
- val error = AuthException.UserNotFoundException("User not found")
+ val error = AuthException.UserNotFoundException("Aucun compte pour cette adresse")
// Act
val message = getRecoveryMessage(error, mockStringProvider)
// Assert
- Truth.assertThat(message).isEqualTo("That email address doesn't match an existing account")
+ Truth.assertThat(message).isEqualTo("Aucun compte pour cette adresse")
}
@Test
- fun `getRecoveryMessage returns weak password message with reason for WeakPasswordException`() {
+ fun `getRecoveryMessage returns user not found message for UserNotFoundException with blank message`() {
// Arrange
+ val error = AuthException.UserNotFoundException("")
+
+ // Act
+ val message = getRecoveryMessage(error, mockStringProvider)
+
+ // Assert
+ Truth.assertThat(message).isEqualTo("That email address doesn't match an existing account")
+ }
+
+ @Test
+ fun `getRecoveryMessage drops the untranslated reason for WeakPasswordException`() {
+ // Arrange - the reason is the raw SDK string, English in every locale.
val error = AuthException.WeakPasswordException(
- "Password is too weak",
+ "",
null,
"Password should be at least 8 characters"
)
@@ -124,14 +151,17 @@ class ErrorRecoveryDialogLogicTest {
// Act
val message = getRecoveryMessage(error, mockStringProvider)
- // Assert
- Truth.assertThat(message).isEqualTo("Password not strong enough. Use at least 6 characters and a mix of letters and numbers\n\nReason: Password should be at least 8 characters")
+ // Assert - blank message, so the provider string supplies the whole body. The reason is
+ // not appended: it is untranslated, and the provider string already states the minimum.
+ Truth.assertThat(message).isEqualTo("Password not strong enough. Use at least 6 characters and a mix of letters and numbers")
+ Truth.assertThat(message).doesNotContain("Reason:")
+ Truth.assertThat(message).doesNotContain("Password should be at least 8 characters")
}
@Test
fun `getRecoveryMessage returns weak password message without reason for WeakPasswordException`() {
// Arrange
- val error = AuthException.WeakPasswordException("Password is too weak", null, null)
+ val error = AuthException.WeakPasswordException("", null, null)
// Act
val message = getRecoveryMessage(error, mockStringProvider)
@@ -144,7 +174,7 @@ class ErrorRecoveryDialogLogicTest {
fun `getRecoveryMessage returns email already in use message with email for EmailAlreadyInUseException`() {
// Arrange
val error = AuthException.EmailAlreadyInUseException(
- "Email already in use",
+ "",
null,
"test@example.com"
)
@@ -152,14 +182,14 @@ class ErrorRecoveryDialogLogicTest {
// Act
val message = getRecoveryMessage(error, mockStringProvider)
- // Assert
+ // Assert - blank message, so the provider string supplies the base and the email is kept
Truth.assertThat(message).isEqualTo("Email account registration unsuccessful (test@example.com)")
}
@Test
fun `getRecoveryMessage returns email already in use message without email for EmailAlreadyInUseException`() {
// Arrange
- val error = AuthException.EmailAlreadyInUseException("Email already in use", null, null)
+ val error = AuthException.EmailAlreadyInUseException("", null, null)
// Act
val message = getRecoveryMessage(error, mockStringProvider)
@@ -168,6 +198,103 @@ class ErrorRecoveryDialogLogicTest {
Truth.assertThat(message).isEqualTo("Email account registration unsuccessful")
}
+ // =============================================================================================
+ // Misconfiguration — the one message that is never rendered
+ // =============================================================================================
+
+ @Test
+ fun `getRecoveryMessage never shows the raw message for MisconfigurationException`() {
+ // Arrange - exactly what firebase-auth 24.2.0 puts on a disabled sign-in provider. It is
+ // untranslated, it names the Firebase console, and the user can do nothing with it.
+ val rawDiagnostic = "This operation is not allowed. This may be because the given sign-in " +
+ "provider is disabled for this Firebase project. Enable it in the Firebase " +
+ "console, under the sign-in method tab of the Auth section. [ OPERATION_NOT_ALLOWED ]"
+ val error = AuthException.MisconfigurationException(rawDiagnostic)
+
+ // Act
+ val message = getRecoveryMessage(error, mockStringProvider)
+
+ // Assert
+ Truth.assertThat(message).isEqualTo("An unknown error occurred.")
+ Truth.assertThat(message).doesNotContain("Firebase")
+ Truth.assertThat(message).doesNotContain("OPERATION_NOT_ALLOWED")
+ }
+
+ @Test
+ fun `MisconfigurationException from() keeps the raw diagnostic on the cause, not the message`() {
+ // EmailAuthScreen and PhoneAuthScreen render `exception.message` inline without going
+ // through getRecoveryMessage, so the diagnostic has to be off the message entirely.
+ val rawDiagnostic = "The supplied auth credential is malformed. [ INVALID_CERT_HASH ]"
+ val firebaseException =
+ object : FirebaseAuthException("ERROR_INVALID_CERT_HASH", rawDiagnostic) {}
+
+ val error = AuthException.from(firebaseException, mockStringProvider)
+
+ Truth.assertThat(error).isInstanceOf(AuthException.MisconfigurationException::class.java)
+ Truth.assertThat(error.message).isEqualTo("An unknown error occurred.")
+ Truth.assertThat(error.cause).isEqualTo(firebaseException)
+ Truth.assertThat(error.cause?.message).isEqualTo(rawDiagnostic)
+ }
+
+ @Test
+ fun `isRecoverable returns false for MisconfigurationException`() {
+ val error = AuthException.MisconfigurationException("Unauthorized domain")
+
+ Truth.assertThat(isRecoverable(error)).isFalse()
+ }
+
+ // =============================================================================================
+ // Subtypes whose arms used to discard error.message outright
+ // =============================================================================================
+
+ @Test
+ fun `getRecoveryMessage prefers the library-owned message for TooManyRequestsException`() {
+ val error = AuthException.TooManyRequestsException("Trop de tentatives")
+
+ Truth.assertThat(getRecoveryMessage(error, mockStringProvider))
+ .isEqualTo("Trop de tentatives")
+ }
+
+ @Test
+ fun `getRecoveryMessage returns the recovery string for TooManyRequestsException with blank message`() {
+ val error = AuthException.TooManyRequestsException("")
+
+ Truth.assertThat(getRecoveryMessage(error, mockStringProvider))
+ .isEqualTo("This phone number has been used too many times")
+ }
+
+ @Test
+ fun `getRecoveryMessage prefers the library-owned message for MfaRequiredException`() {
+ val error = AuthException.MfaRequiredException("Vérification supplémentaire requise")
+
+ Truth.assertThat(getRecoveryMessage(error, mockStringProvider))
+ .isEqualTo("Vérification supplémentaire requise")
+ }
+
+ @Test
+ fun `getRecoveryMessage returns the recovery string for MfaRequiredException with blank message`() {
+ val error = AuthException.MfaRequiredException("")
+
+ Truth.assertThat(getRecoveryMessage(error, mockStringProvider))
+ .isEqualTo("Additional verification required. Please complete multi-factor authentication.")
+ }
+
+ @Test
+ fun `getRecoveryMessage prefers the library-owned message for AuthCancelledException`() {
+ val error = AuthException.AuthCancelledException("Connexion annulée")
+
+ Truth.assertThat(getRecoveryMessage(error, mockStringProvider))
+ .isEqualTo("Connexion annulée")
+ }
+
+ @Test
+ fun `getRecoveryMessage returns the recovery string for AuthCancelledException with blank message`() {
+ val error = AuthException.AuthCancelledException("")
+
+ Truth.assertThat(getRecoveryMessage(error, mockStringProvider))
+ .isEqualTo("Authentication was cancelled. Please try again when ready.")
+ }
+
// =============================================================================================
// Recovery Action Text Tests
// =============================================================================================
diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/screens/phone/PhoneAuthScreenVerificationLifecycleTest.kt b/auth/src/test/java/com/firebase/ui/auth/ui/screens/phone/PhoneAuthScreenVerificationLifecycleTest.kt
index f27c81110..6a67f016b 100644
--- a/auth/src/test/java/com/firebase/ui/auth/ui/screens/phone/PhoneAuthScreenVerificationLifecycleTest.kt
+++ b/auth/src/test/java/com/firebase/ui/auth/ui/screens/phone/PhoneAuthScreenVerificationLifecycleTest.kt
@@ -573,8 +573,9 @@ class PhoneAuthScreenVerificationLifecycleTest {
settle()
// The failure also tears down the verification, which must not append a second,
- // spurious cancellation error behind the real one.
- assertThat(reportedErrors.map { it.message }).containsExactly("sign-in blew up")
+ // spurious cancellation error behind the real one. AuthException.from replaces the
+ // message with renderable copy, so the original text is identified on the cause.
+ assertThat(reportedErrors.map { it.cause?.message }).containsExactly("sign-in blew up")
}
}