diff --git a/.snyk b/.snyk new file mode 100644 index 000000000..220880aec --- /dev/null +++ b/.snyk @@ -0,0 +1,59 @@ +# Snyk (https://snyk.io) policy file +version: v1.25.0 +ignore: + SNYK-JS-AUTH0JS-16438973: + - '*': + reason: >- + auth0-js@9.29.0+ uses superagent@10.x which calls new Proxy() at + runtime. IE11 does not support the Proxy global and it cannot be + polyfilled. Lock v13 maintains IE11 compatibility and must stay on + auth0-js@9.28.x (the last version using superagent@7.x). + expires: '2027-01-01T00:00:00.000Z' + SNYK-JS-DOMPURIFY-16131135: + - '*': + reason: >- + DOMPurify v3 (which fixes this) dropped IE11 support. Lock v13 + maintains IE11 compatibility and cannot upgrade to v3. + expires: '2027-01-01T00:00:00.000Z' + SNYK-JS-DOMPURIFY-8722251: + - '*': + reason: >- + DOMPurify v3 (which fixes this) dropped IE11 support. Lock v13 + maintains IE11 compatibility and cannot upgrade to v3. + expires: '2027-01-01T00:00:00.000Z' + SNYK-JS-DOMPURIFY-16078387: + - '*': + reason: >- + DOMPurify v3 (which fixes this) dropped IE11 support. Lock v13 + maintains IE11 compatibility and cannot upgrade to v3. + expires: '2027-01-01T00:00:00.000Z' + SNYK-JS-DOMPURIFY-15810938: + - '*': + reason: >- + DOMPurify v3 (which fixes this) dropped IE11 support. Lock v13 + maintains IE11 compatibility and cannot upgrade to v3. + expires: '2027-01-01T00:00:00.000Z' + SNYK-JS-DOMPURIFY-15874903: + - '*': + reason: >- + DOMPurify v3 (which fixes this) dropped IE11 support. Lock v13 + maintains IE11 compatibility and cannot upgrade to v3. + expires: '2027-01-01T00:00:00.000Z' + SNYK-JS-DOMPURIFY-15874905: + - '*': + reason: >- + DOMPurify v3 (which fixes this) dropped IE11 support. Lock v13 + maintains IE11 compatibility and cannot upgrade to v3. + expires: '2027-01-01T00:00:00.000Z' + SNYK-JS-DOMPURIFY-15371386: + - '*': + reason: >- + DOMPurify v3 (which fixes this) dropped IE11 support. Lock v13 + maintains IE11 compatibility and cannot upgrade to v3. + expires: '2027-01-01T00:00:00.000Z' + SNYK-JS-DOMPURIFY-15371376: + - '*': + reason: >- + DOMPurify v3 (which fixes this) dropped IE11 support. Lock v13 + maintains IE11 compatibility and cannot upgrade to v3. + expires: '2027-01-01T00:00:00.000Z' diff --git a/package.json b/package.json index c3f4e0e58..7a12cea75 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,6 @@ "eslint-config-prettier": "^8.8.0", "eslint-plugin-react": "^7.32.2", "esm": "^3.2.25", - "events": "^3.3.0", "expect.js": "^0.3.1", "flat": "^5.0.2", "glob": "^7.1.7", @@ -132,7 +131,7 @@ "qs": "^6.10.3", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-transition-group": "^2.2.1", + "react-transition-group": "^4.4.5", "trim": "^1.0.1", "url-join": "^1.1.0", "validator": "^13.6.0" @@ -188,4 +187,4 @@ "prettier --write" ] } -} +} \ No newline at end of file diff --git a/src/__tests__/connection/enterprise/__snapshots__/hrd_screen.test.js.snap b/src/__tests__/connection/enterprise/__snapshots__/hrd_screen.test.js.snap index 1bee2f3b4..0ca92abfb 100644 --- a/src/__tests__/connection/enterprise/__snapshots__/hrd_screen.test.js.snap +++ b/src/__tests__/connection/enterprise/__snapshots__/hrd_screen.test.js.snap @@ -1,5 +1,34 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`HRDScreen Component renders correctly when enterprise domain is undefined 1`] = ` +
+ Login with your corporate credentials. [] +

+ } + data-i18n={ + { + "str": [Function], + } + } + data-model={ + Immutable.Map { + "id": "__lock-id__", + "i18n": Immutable.Map { + "strings": Immutable.Map { + "enterpriseLoginIntructions": "Login with your corporate credentials.", + "enterpriseActiveLoginInstructions": "Please enter your corporate credentials at %s.", + }, + }, + } + } + data-passwordInputPlaceholder=" []" + data-usernameInputPlaceholder=" []" +/> +`; + exports[`HRDScreen Component renders correctly when there is an enterprise domain 1`] = `
`; + +exports[`HRDScreen Component uses fallback message when enterprise domain is empty string 1`] = ` +
+ Login with your corporate credentials. [] +

+ } + data-i18n={ + { + "str": [Function], + } + } + data-model={ + Immutable.Map { + "id": "__lock-id__", + "i18n": Immutable.Map { + "strings": Immutable.Map { + "enterpriseLoginIntructions": "Login with your corporate credentials.", + "enterpriseActiveLoginInstructions": "Please enter your corporate credentials at %s.", + }, + }, + } + } + data-passwordInputPlaceholder=" []" + data-usernameInputPlaceholder=" []" +/> +`; + +exports[`HRDScreen Component uses fallback message when enterprise domain is whitespace only 1`] = ` +
+ Login with your corporate credentials. [] +

+ } + data-i18n={ + { + "str": [Function], + } + } + data-model={ + Immutable.Map { + "id": "__lock-id__", + "i18n": Immutable.Map { + "strings": Immutable.Map { + "enterpriseLoginIntructions": "Login with your corporate credentials.", + "enterpriseActiveLoginInstructions": "Please enter your corporate credentials at %s.", + }, + }, + } + } + data-passwordInputPlaceholder=" []" + data-usernameInputPlaceholder=" []" +/> +`; diff --git a/src/__tests__/connection/enterprise/hrd_screen.test.js b/src/__tests__/connection/enterprise/hrd_screen.test.js index 00c1ea18f..592d1b295 100644 --- a/src/__tests__/connection/enterprise/hrd_screen.test.js +++ b/src/__tests__/connection/enterprise/hrd_screen.test.js @@ -49,4 +49,41 @@ describe('HRDScreen Component', () => { const Component = getComponent(); expectComponent().toMatchSnapshot(); }); + + it('renders correctly when enterprise domain is undefined', () => { + require('connection/enterprise').enterpriseDomain.mockImplementation(() => undefined); + const Component = getComponent(); + expectComponent().toMatchSnapshot(); + }); + + it('does not show "undefined" in message when enterprise domain is undefined', () => { + require('connection/enterprise').enterpriseDomain.mockImplementation(() => undefined); + const { str } = i18nProp; + + // Should use the fallback message without domain placeholder + const expectedMessage = str('enterpriseLoginIntructions'); + expect(expectedMessage).toContain('Login with your corporate credentials.'); + expect(expectedMessage).not.toContain('undefined'); + }); + + it('does not show "undefined" in message when enterprise domain is null', () => { + require('connection/enterprise').enterpriseDomain.mockImplementation(() => null); + const { str } = i18nProp; + // Should use the fallback message without domain placeholder + const expectedMessage = str('enterpriseLoginIntructions'); + expect(expectedMessage).toContain('Login with your corporate credentials.'); + expect(expectedMessage).not.toContain('undefined'); + }); + + it('uses fallback message when enterprise domain is empty string', () => { + require('connection/enterprise').enterpriseDomain.mockImplementation(() => ''); + const Component = getComponent(); + expectComponent().toMatchSnapshot(); + }); + + it('uses fallback message when enterprise domain is whitespace only', () => { + require('connection/enterprise').enterpriseDomain.mockImplementation(() => ' '); + const Component = getComponent(); + expectComponent().toMatchSnapshot(); + }); }); diff --git a/src/__tests__/connection/enterprise/matchConnection.test.js b/src/__tests__/connection/enterprise/matchConnection.test.js new file mode 100644 index 000000000..03e9927d4 --- /dev/null +++ b/src/__tests__/connection/enterprise/matchConnection.test.js @@ -0,0 +1,50 @@ +import I from 'immutable'; +import { matchConnection } from '../../../connection/enterprise'; + +jest.mock('core/index', () => ({ + connections: jest.fn() +})); + +describe('matchConnection', () => { + afterEach(() => jest.resetAllMocks()); + + it('does not throw when enterprise connection has no domains field (key absent)', () => { + const { connections } = require('core/index'); + + // Tenant omits the domains field entirely + connections.mockReturnValue( + I.fromJS([{ name: 'samlp-connection', strategy: 'samlp', type: 'enterprise' }]) + ); + + const m = I.fromJS({ id: '__lock__' }); + + expect(() => matchConnection(m, 'test@example.com')).not.toThrow(); + expect(matchConnection(m, 'test@example.com')).toBeFalsy(); + }); + + it('does not throw when enterprise connection has domains explicitly set to null', () => { + const { connections } = require('core/index'); + + // Tenant returns domains: null + connections.mockReturnValue( + I.fromJS([{ name: 'samlp-connection', strategy: 'samlp', type: 'enterprise', domains: null }]) + ); + + const m = I.fromJS({ id: '__lock__' }); + + expect(() => matchConnection(m, 'test@example.com')).not.toThrow(); + expect(matchConnection(m, 'test@example.com')).toBeFalsy(); + }); + + it('matches a connection when the email domain is in the domains list', () => { + const { connections } = require('core/index'); + + connections.mockReturnValue( + I.fromJS([{ name: 'samlp-connection', strategy: 'samlp', type: 'enterprise', domains: ['example.com'] }]) + ); + + const m = I.fromJS({ id: '__lock__' }); + + expect(matchConnection(m, 'user@example.com')).toBeTruthy(); + }); +}); diff --git a/src/__tests__/i18n.test.js b/src/__tests__/i18n.test.js index b5854f4ae..d8f1fbe19 100644 --- a/src/__tests__/i18n.test.js +++ b/src/__tests__/i18n.test.js @@ -59,8 +59,11 @@ describe('i18n', () => { }; const m = Immutable.fromJS({ i18n: { strings } }); const html = i18n.html(m, 'test'); - expect(html.props.dangerouslySetInnerHTML.__html).not.toMatch(/javascript:alert/); - expect(html.props.dangerouslySetInnerHTML.__html).toEqual(''); + const sanitized = html.props.dangerouslySetInnerHTML.__html; + expect(sanitized).not.toMatch(/javascript:alert/); + expect(sanitized).toMatch(/src="1"/); + expect(sanitized).toMatch(/href="1"/); + expect(sanitized).toMatch(/]*>/); }); it('should allow target=_blank with noopener noreferrer attributes', () => { diff --git a/src/connection/enterprise.js b/src/connection/enterprise.js index be15a3b76..d3996d6be 100644 --- a/src/connection/enterprise.js +++ b/src/connection/enterprise.js @@ -79,7 +79,7 @@ export function matchConnection(m, email, strategies = []) { const target = emailDomain(email); if (!target) return false; return l.connections(m, 'enterprise', ...strategies).find(x => { - return x.get('domains').contains(target); + return (x.get('domains') || List()).contains(target); }); } @@ -108,7 +108,7 @@ export function isADEnabled(m) { export function findADConnectionWithoutDomain(m, name = undefined) { return l.connections(m, 'enterprise', 'ad', 'auth0-adldap').find(x => { - return x.get('domains').isEmpty() && (!name || x.get('name') === name); + return (x.get('domains') || List()).isEmpty() && (!name || x.get('name') === name); }); } diff --git a/src/connection/enterprise/hrd_screen.jsx b/src/connection/enterprise/hrd_screen.jsx index 2eeb09b32..2a6df2ab2 100644 --- a/src/connection/enterprise/hrd_screen.jsx +++ b/src/connection/enterprise/hrd_screen.jsx @@ -11,7 +11,7 @@ const Component = ({ i18n, model }) => { var headerText; - if (domain !== null) { + if (domain && domain.trim()) { headerText = i18n.str('enterpriseActiveLoginInstructions', domain); } else { headerText = i18n.str('enterpriseLoginIntructions'); diff --git a/src/core/actions.js b/src/core/actions.js index abdcabb2c..c5cb85e5b 100644 --- a/src/core/actions.js +++ b/src/core/actions.js @@ -242,7 +242,8 @@ function logInError(id, fields, error, localHandler = (_id, _error, _fields, nex 'rule_error', 'lock.unauthorized', 'invalid_user_password', - 'login_required' + 'login_required', + 'too_many_attempts' ]; if (errorCodesThatEmitAuthorizationErrorEvent.indexOf(errorCode) > -1) { diff --git a/src/core/web_api/p2_api.js b/src/core/web_api/p2_api.js index 7efd5a926..31782cf43 100644 --- a/src/core/web_api/p2_api.js +++ b/src/core/web_api/p2_api.js @@ -40,7 +40,7 @@ class Auth0APIClient { responseMode: opts.responseMode, responseType: opts.responseType, leeway: opts.leeway || 60, - plugins: opts.plugins || [new CordovaAuth0Plugin()], + plugins: opts.plugins || (typeof CordovaAuth0Plugin === 'function' ? [new CordovaAuth0Plugin()] : []), overrides: webAuthOverrides(opts.overrides), _sendTelemetry: opts._sendTelemetry === false ? false : true, _telemetryInfo: telemetry, diff --git a/src/i18n/af.js b/src/i18n/af.js index 96f16ac02..a648ae8f5 100644 --- a/src/i18n/af.js +++ b/src/i18n/af.js @@ -39,7 +39,8 @@ export default { 'bad.phone_number': 'Die telefoonnommer is ongeldig', 'lock.fallback': 'Jammer, iets het verkeerd gegaan', invalid_captcha: "Los die uitdagingsvraag om te verifieer dat u nie 'n robot is nie.", - invalid_recaptcha: "Kies die merkblokkie om te verifieer dat u nie 'n robot is nie." + invalid_recaptcha: "Kies die merkblokkie om te verifieer dat u nie 'n robot is nie.", + too_many_attempts: 'Jou rekening is geblok nadat daar te veel keer probeer inteken is.' }, signUp: { invalid_password: 'Wagwoord is ongeldig.', diff --git a/src/i18n/ar.js b/src/i18n/ar.js index a394cbe45..45e107fc1 100644 --- a/src/i18n/ar.js +++ b/src/i18n/ar.js @@ -43,7 +43,8 @@ export default { 'bad.phone_number': 'رقم الهاتف غير صالح.', 'lock.fallback': 'المعذرة، حصل خطأ ما.', invalid_captcha: 'حل سؤال التحدي للتحقق من أنك لست روبوت.', - invalid_recaptcha: 'حدد مربع الاختيار للتحقق من أنك لست روبوتًا.' + invalid_recaptcha: 'حدد مربع الاختيار للتحقق من أنك لست روبوتًا.', + too_many_attempts: 'تم حظر حسابك بعد عدة محاولات متتالية للدخول.' }, signUp: { invalid_password: 'كلمة المرور غير صالحة.', diff --git a/src/i18n/az.js b/src/i18n/az.js index e6b9919c2..0adb2b24e 100644 --- a/src/i18n/az.js +++ b/src/i18n/az.js @@ -44,7 +44,8 @@ export default { 'bad.phone_number': 'Telefon nömrəsi düzgün deyil', 'lock.fallback': 'Üzr istəyirik, səhv oldu', invalid_captcha: 'Daxil etdiyiniz mətn səhv idi.
Lütfən, yenidən cəhd edin.', - invalid_recaptcha: 'Robot olmadığınızı təsdiqləmək üçün onay qutusunu seçin.' + invalid_recaptcha: 'Robot olmadığınızı təsdiqləmək üçün onay qutusunu seçin.', + too_many_attempts: 'Çox sayda giriş cəhdi nəticəsində hesabınız bloklandı.' }, signUp: { invalid_password: 'Şifrə yanlışdır.', diff --git a/src/i18n/bg.js b/src/i18n/bg.js index 39430fd4f..4b2fc7573 100644 --- a/src/i18n/bg.js +++ b/src/i18n/bg.js @@ -45,7 +45,8 @@ export default { 'bad.phone_number': 'Телефонният номер е невалиден', 'lock.fallback': 'Съжаляваме, възникна грешка', invalid_captcha: 'Решете задачата, за да се уверим, че не сте робот.', - invalid_recaptcha: 'Поставете отметка, за да се уверим, че не сте робот.' + invalid_recaptcha: 'Поставете отметка, за да се уверим, че не сте робот.', + too_many_attempts: 'Вашият акаунт е блокиран след множество последователни опити да влезете в профила си.' }, signUp: { invalid_password: 'Паролата е невалидна.', diff --git a/src/i18n/ca.js b/src/i18n/ca.js index d779f8808..d86979513 100644 --- a/src/i18n/ca.js +++ b/src/i18n/ca.js @@ -46,7 +46,8 @@ export default { 'bad.phone_number': 'El número de telèfon no és vàlid', 'lock.fallback': 'Quelcom ha fet fallida', invalid_captcha: 'Resoleu la pregunta de desafiament per verificar que no sou un robot.', - invalid_recaptcha: 'Seleccioneu la casella de verificació per verificar que no sou un robot.' + invalid_recaptcha: 'Seleccioneu la casella de verificació per verificar que no sou un robot.', + too_many_attempts: "Hi ha hagut massa intents consecutius fallits d'inici de sessió, i se us ha bloquejat l'accés." }, signUp: { invalid_password: 'La contrasenya no és vàlida.', diff --git a/src/i18n/cs.js b/src/i18n/cs.js index 163ea8284..8d3149640 100644 --- a/src/i18n/cs.js +++ b/src/i18n/cs.js @@ -44,7 +44,8 @@ export default { 'bad.phone_number': 'Telefonní číslo je neplatné', 'lock.fallback': 'Je nám líto, něco se pokazilo', invalid_captcha: 'Vyřešte úlohu, abychom ověřili, že nejste robot.', - invalid_recaptcha: 'Zaškrtněte políčko, abychom ověřili, že nejste robot.' + invalid_recaptcha: 'Zaškrtněte políčko, abychom ověřili, že nejste robot.', + too_many_attempts: 'Váš účet byl zablokován z důvodu velkého počtu pokusů o přihlášení.' }, signUp: { invalid_password: 'Heslo je neplatné.', diff --git a/src/i18n/da.js b/src/i18n/da.js index f9f88947e..bba4c6f12 100644 --- a/src/i18n/da.js +++ b/src/i18n/da.js @@ -44,7 +44,8 @@ export default { 'bad.phone_number': 'Dette telefonnummer er ugyldigt', 'lock.fallback': 'Vi beklager, men der skete en fejl', invalid_captcha: 'Løs udfordringsspørgsmålet for at kontrollere, at du ikke er en robot.', - invalid_recaptcha: 'Marker afkrydsningsfeltet for at kontrollere, at du ikke er en robot.' + invalid_recaptcha: 'Marker afkrydsningsfeltet for at kontrollere, at du ikke er en robot.', + too_many_attempts: 'Din konto er blevet blokeret efter gentagne mislykkede loginforsøg.' }, signUp: { invalid_password: 'Adgangskoden er ugyldigt', diff --git a/src/i18n/de.js b/src/i18n/de.js index 87c1c9858..4643c1382 100644 --- a/src/i18n/de.js +++ b/src/i18n/de.js @@ -48,7 +48,8 @@ export default { 'bad.phone_number': 'Diese Telefonnummer ist ungültig', 'lock.fallback': 'Es tut uns leid, etwas ist schiefgelaufen.', invalid_captcha: 'Lösen Sie die Herausforderungsfrage, um sicherzustellen, dass Sie kein Roboter sind.', - invalid_recaptcha: 'Aktivieren Sie das Kontrollkästchen, um sicherzustellen, dass Sie kein Roboter sind.' + invalid_recaptcha: 'Aktivieren Sie das Kontrollkästchen, um sicherzustellen, dass Sie kein Roboter sind.', + too_many_attempts: 'Ihr Konto wurde nach mehreren aufeinander folgenden Anmeldeversuche gesperrt.' }, signUp: { invalid_password: 'Passwort ist ungültig.', diff --git a/src/i18n/el.js b/src/i18n/el.js index 4d0a69a0c..03b29878b 100644 --- a/src/i18n/el.js +++ b/src/i18n/el.js @@ -46,7 +46,8 @@ export default { 'bad.phone_number': 'Ο αριθμός τηλεφώνου δεν είναι έγκυρος', 'lock.fallback': 'Λυπούμαστε, κάτι πήγε στραβά', invalid_captcha: 'Λύστε την ερώτηση πρόκλησης για να επιβεβαιώσετε ότι δεν είστε ρομπότ.', - invalid_recaptcha: 'Επιλέξτε το πλαίσιο ελέγχου για να επαληθεύσετε ότι δεν είστε ρομπότ.' + invalid_recaptcha: 'Επιλέξτε το πλαίσιο ελέγχου για να επαληθεύσετε ότι δεν είστε ρομπότ.', + too_many_attempts: 'Ο λογαριασμός σας έχει απενεργοποιηθεί λόγω υπέρβασης του ορίου επιτρεπόμενων προσπαθειών σύνδεσης.' }, signUp: { invalid_password: 'Ο κωδικός δεν είναι έγκυρος.', diff --git a/src/i18n/en.js b/src/i18n/en.js index c1a1c4607..429ce70b9 100644 --- a/src/i18n/en.js +++ b/src/i18n/en.js @@ -40,7 +40,8 @@ export default { 'bad.phone_number': 'The phone number is invalid', 'lock.fallback': "We're sorry, something went wrong", invalid_captcha: 'Solve the challenge question to verify you are not a robot.', - invalid_recaptcha: 'Select the checkbox to verify you are not a robot.' + invalid_recaptcha: 'Select the checkbox to verify you are not a robot.', + too_many_attempts: 'Your account has been blocked after multiple consecutive login attempts.' }, signUp: { invalid_password: 'Password is invalid.', diff --git a/src/i18n/es.js b/src/i18n/es.js index 8b2ec3f1c..8d4fff7c1 100644 --- a/src/i18n/es.js +++ b/src/i18n/es.js @@ -41,7 +41,8 @@ export default { 'bad.phone_number': 'Teléfono inválido', 'lock.fallback': 'Ocurrió un error durante el envío', invalid_captcha: 'El texto ingresado es incorrecto.
Por favor, vuelva a intentarlo.', - invalid_recaptcha: 'Seleccione la casilla de verificación para verificar que no es un robot.' + invalid_recaptcha: 'Seleccione la casilla de verificación para verificar que no es un robot.', + too_many_attempts: 'Su cuenta ha sido bloqueada luego de múltiples intentos de inicio de sesión consecutivos.' }, signUp: { invalid_password: 'La contraseña es inválida.', diff --git a/src/i18n/et.js b/src/i18n/et.js index ebd910a5c..395eb5fe2 100644 --- a/src/i18n/et.js +++ b/src/i18n/et.js @@ -43,7 +43,8 @@ export default { 'bad.phone_number': 'Vigane telefoninumber', 'lock.fallback': 'Vabandame, midagi läks valesti.', invalid_captcha: 'Lahendage väljakutseküsimus ja veenduge, et te pole robot.', - invalid_recaptcha: 'Valige märkeruut, et kontrollida, kas te pole robot.' + invalid_recaptcha: 'Valige märkeruut, et kontrollida, kas te pole robot.', + too_many_attempts: 'Sinu konto blokeeriti peale mitut ebaõnnestunud sisselogimiskatset.' }, signUp: { invalid_password: 'Parool on vigane.', diff --git a/src/i18n/fa.js b/src/i18n/fa.js index 5fde5d81a..fada3f1d9 100644 --- a/src/i18n/fa.js +++ b/src/i18n/fa.js @@ -43,7 +43,8 @@ export default { 'bad.phone_number': 'شماره تلفن نامعتبر است.', 'lock.fallback': 'متاسفیم ، خطایی رخ داده است.', invalid_captcha: 'حل مسئله چالش برای تأیید اینکه ربات نیستید.', - invalid_recaptcha: 'کادر تأیید را انتخاب کنید تا تأیید کنید که روبات نیستید.' + invalid_recaptcha: 'کادر تأیید را انتخاب کنید تا تأیید کنید که روبات نیستید.', + too_many_attempts: 'اکانت شما به دلیل تلاش های نا موفق متعدد متوالی مسدود شده است' }, signUp: { invalid_password: 'رمز نامعتبر است.', diff --git a/src/i18n/fi.js b/src/i18n/fi.js index 7f205f35a..98dc2c189 100644 --- a/src/i18n/fi.js +++ b/src/i18n/fi.js @@ -46,7 +46,8 @@ export default { 'bad.phone_number': 'Puhelinnumero ei kelpaa', 'lock.fallback': 'Olemme pahoillamme, jotain meni vikaan', invalid_captcha: 'Ratkaise haastekysymys varmistaaksesi, että et ole robotti.', - invalid_recaptcha: 'Valitse valintaruutu varmistaaksesi, että et ole robotti.' + invalid_recaptcha: 'Valitse valintaruutu varmistaaksesi, että et ole robotti.', + too_many_attempts: 'Tunnuksesi on suljettu useiden peräkkäisten kirjautumisyritysten jälkeen.' }, signUp: { invalid_password: 'Salasana ei kelpaa.', diff --git a/src/i18n/fr.js b/src/i18n/fr.js index d1b7a7b3c..e355f5846 100644 --- a/src/i18n/fr.js +++ b/src/i18n/fr.js @@ -48,7 +48,8 @@ export default { 'bad.phone_number': 'Le numéro de téléphone n’est pas valide', 'lock.fallback': 'Nous sommes désolés, un problème est survenu', invalid_captcha: "Résolvez la question du défi pour vérifier que vous n'êtes pas un robot.", - invalid_recaptcha: "Cochez la case pour vérifier que vous n'êtes pas un robot." + invalid_recaptcha: "Cochez la case pour vérifier que vous n'êtes pas un robot.", + too_many_attempts: 'Votre compte a été bloqué à la suite de trop nombreuses tentatives de connexion consécutives.' }, signUp: { invalid_password: 'Le mot de passe n’est pas valide.', diff --git a/src/i18n/he.js b/src/i18n/he.js index ce86409a9..15e0fe2b2 100644 --- a/src/i18n/he.js +++ b/src/i18n/he.js @@ -42,7 +42,8 @@ export default { 'bad.phone_number': 'מספר הטלפון לא תקין', 'lock.fallback': 'אנו מתנצלים, משהו השתבש', invalid_captcha: 'לפתור את שאלת האתגר כדי לוודא שאתה לא רובוט.', - invalid_recaptcha: 'בחר בתיבת הסימון כדי לוודא שאתה לא רובוט.' + invalid_recaptcha: 'בחר בתיבת הסימון כדי לוודא שאתה לא רובוט.', + too_many_attempts: 'חשבונך נחסם לאחר ניסיונות מרובים ורצופים לכניסה.' }, signUp: { invalid_password: 'סיסמא לא תקינה.', diff --git a/src/i18n/hr.js b/src/i18n/hr.js index 9474759d1..61ace18ee 100755 --- a/src/i18n/hr.js +++ b/src/i18n/hr.js @@ -46,7 +46,8 @@ export default { 'bad.phone_number': 'Neispravan broj telefona', 'lock.fallback': 'Ispričavamo se, ali nešto je pošlo po zlu.', invalid_captcha: 'Riješite izazovno pitanje kako biste provjerili da niste robot.', - invalid_recaptcha: 'Označite potvrdni okvir da biste potvrdili da niste robot.' + invalid_recaptcha: 'Označite potvrdni okvir da biste potvrdili da niste robot.', + too_many_attempts: 'Vaš je račun blokiran uslijed višestrukih uzastopnih pokušaja prijave.' }, signUp: { invalid_password: 'Lozinka je neispravna.', diff --git a/src/i18n/hu.js b/src/i18n/hu.js index cabd58032..73c7d70d9 100644 --- a/src/i18n/hu.js +++ b/src/i18n/hu.js @@ -45,7 +45,8 @@ export default { 'bad.phone_number': 'Érvénytelen telefonszám.', 'lock.fallback': 'Sajnáljuk, valami hiba történt.', invalid_captcha: 'Oldja meg a kihívást, és ellenőrizze, hogy nem robot.', - invalid_recaptcha: 'Jelölje be a jelölőnégyzetet annak ellenőrzéséhez, hogy nem robot vagy-e.' + invalid_recaptcha: 'Jelölje be a jelölőnégyzetet annak ellenőrzéséhez, hogy nem robot vagy-e.', + too_many_attempts: 'Túl sok sikertelen bejelentkezési kísérletet észleltünk, ezért az azonosítód letiltásra került.' }, signUp: { invalid_password: 'Érvénytelen jelszó.', diff --git a/src/i18n/id.js b/src/i18n/id.js index 5b610e5e2..d84710880 100644 --- a/src/i18n/id.js +++ b/src/i18n/id.js @@ -46,7 +46,8 @@ export default { 'bad.phone_number': 'Nomor telepon tidak valid.', 'lock.fallback': 'Maaf, terjadi kesalahan', invalid_captcha: 'Selesaikan pertanyaan tantangan untuk memverifikasi bahwa Anda bukan robot.', - invalid_recaptcha: 'Pilih kotak centang untuk memverifikasi bahwa Anda bukan robot.' + invalid_recaptcha: 'Pilih kotak centang untuk memverifikasi bahwa Anda bukan robot.', + too_many_attempts: 'Akun Anda telah diblokir setelah mencoba masuk log berulang-ulang.' }, signUp: { invalid_password: 'Kata sandi tidak valid.', diff --git a/src/i18n/it.js b/src/i18n/it.js index b12975d3a..e8c837a6d 100644 --- a/src/i18n/it.js +++ b/src/i18n/it.js @@ -44,7 +44,8 @@ export default { 'bad.phone_number': 'Il numero di telefono non è valido', 'lock.fallback': 'Ci dispiace, qualcosa è andato storto', invalid_captcha: 'Risolvi la domanda di verifica per verificare che non sei un robot.', - invalid_recaptcha: 'Seleziona la casella di controllo per verificare che non sei un robot.' + invalid_recaptcha: 'Seleziona la casella di controllo per verificare che non sei un robot.', + too_many_attempts: 'Il suo account è stato bloccato dopo vari tentativi di accesso consecutivi.' }, signUp: { invalid_password: 'La password non è valida.', diff --git a/src/i18n/ja.js b/src/i18n/ja.js index b199bc977..0a49678d2 100644 --- a/src/i18n/ja.js +++ b/src/i18n/ja.js @@ -44,7 +44,8 @@ export default { 'bad.phone_number': '電話番号が不正です', 'lock.fallback': '申し訳ございません。エラーが発生しました。', invalid_captcha: 'チャレンジ質問を解いて、ロボットではないことを確認してください。', - invalid_recaptcha: 'チェックボックスを選択して、ロボットでないことを確認します。' + invalid_recaptcha: 'チェックボックスを選択して、ロボットでないことを確認します。', + too_many_attempts: 'このアカウントは、短時間での複数回ログイン試行によりブロックされました。' }, signUp: { invalid_password: 'パスワードが不正です。', diff --git a/src/i18n/ko.js b/src/i18n/ko.js index 5047815dd..27e61b595 100644 --- a/src/i18n/ko.js +++ b/src/i18n/ko.js @@ -43,7 +43,8 @@ export default { 'bad.phone_number': '전화번호가 유효하지 않습니다', 'lock.fallback': '죄송합니다. 오류가 발생하였습니다', invalid_captcha: '로봇이 아닌 사람인지 확인하기 위해 챌린지 질문을 해결하십시오.', - invalid_recaptcha: '로봇이 아닌지 확인하려면 확인란을 선택하십시오.' + invalid_recaptcha: '로봇이 아닌지 확인하려면 확인란을 선택하십시오.', + too_many_attempts: '본 계정은 단시간에 복수의 로그인 시도가 감지되어 차단되었습니다.' }, signUp: { invalid_password: '비밀번호가 유효하지 않습니다.', diff --git a/src/i18n/lt.js b/src/i18n/lt.js index 06b529879..c4f2e6b82 100644 --- a/src/i18n/lt.js +++ b/src/i18n/lt.js @@ -43,7 +43,8 @@ export default { 'bad.phone_number': 'Neteisingas telefono numeris', 'lock.fallback': 'Atsiprašome, įvyko netikėta klaida.', invalid_captcha: 'Išspręskite iššūkio klausimą ir įsitikinkite, kad nesate robotas.', - invalid_recaptcha: 'Pažymėkite žymimąjį laukelį, kad patikrintumėte, ar nesate robotas.' + invalid_recaptcha: 'Pažymėkite žymimąjį laukelį, kad patikrintumėte, ar nesate robotas.', + too_many_attempts: 'Jūsų sąskaita buvo užblokuota, po kelių iš eilės bandymų prisijungti.' }, signUp: { invalid_password: 'Slaptažodis neteisingas.', diff --git a/src/i18n/lv.js b/src/i18n/lv.js index 51e6b1320..fb0b3e7d7 100644 --- a/src/i18n/lv.js +++ b/src/i18n/lv.js @@ -44,7 +44,8 @@ export default { 'bad.phone_number': 'Nederīgs tālruņa numurs', 'lock.fallback': 'Diemžēl radās problēma', invalid_captcha: 'Atrisiniet izaicinājuma jautājumu, lai pārliecinātos, ka neesat robots.', - invalid_recaptcha: 'Atzīmējiet izvēles rūtiņu, lai pārliecinātos, ka neesat robots.' + invalid_recaptcha: 'Atzīmējiet izvēles rūtiņu, lai pārliecinātos, ka neesat robots.', + too_many_attempts: 'Jūsu konts ir bloķēts pēc vairākiem secīgiem pieteikšanās mēģinājumiem.' }, signUp: { invalid_password: 'Nederīga parole.', diff --git a/src/i18n/ms.js b/src/i18n/ms.js index b77cfea5e..66c0764e5 100644 --- a/src/i18n/ms.js +++ b/src/i18n/ms.js @@ -45,7 +45,8 @@ export default { 'bad.phone_number': 'Nombor telefon tidak sah', 'lock.fallback': 'Harap maaf, sesuatu berlaku', invalid_captcha: 'Selesaikan soalan cabaran untuk mengesahkan bahawa anda bukan robot.', - invalid_recaptcha: 'Pilih kotak pilihan untuk mengesahkan bahawa anda bukan robot.' + invalid_recaptcha: 'Pilih kotak pilihan untuk mengesahkan bahawa anda bukan robot.', + too_many_attempts: 'Akaun anda telah disekat selepas berbilang percubaan log masuk yang berturut-turut.' }, signUp: { invalid_password: 'Kata laluan tidak sah.', diff --git a/src/i18n/nb.js b/src/i18n/nb.js index b971e7edc..30e52889d 100644 --- a/src/i18n/nb.js +++ b/src/i18n/nb.js @@ -43,7 +43,8 @@ export default { 'bad.phone_number': 'Telefonnummeret er ugyldig', 'lock.fallback': 'Beklager, noe gikk galt', invalid_captcha: 'Løs utfordringsspørsmålet for å bekrefte at du ikke er en robot.', - invalid_recaptcha: 'Merk av i avmerkingsboksen for å bekrefte at du ikke er en robot.' + invalid_recaptcha: 'Merk av i avmerkingsboksen for å bekrefte at du ikke er en robot.', + too_many_attempts: 'Din konto er blokkert på grunn av for mange påloggingsforsøk.' }, signUp: { invalid_password: 'Passordet er ugyldig.', diff --git a/src/i18n/nl.js b/src/i18n/nl.js index d20a4c583..40e8b1ff1 100644 --- a/src/i18n/nl.js +++ b/src/i18n/nl.js @@ -46,7 +46,8 @@ export default { 'bad.phone_number': 'Het telefoonnummer is ongeldig', 'lock.fallback': 'Onze excuses, er is iets fout gegaan.', invalid_captcha: 'Los de vraag op om te verifiëren dat u geen robot bent.', - invalid_recaptcha: 'Selecteer het vakje om te verifiëren dat u geen robot bent.' + invalid_recaptcha: 'Selecteer het vakje om te verifiëren dat u geen robot bent.', + too_many_attempts: 'Uw account is geblokkeerd als gevolg van te veel herhaalde inlogpogingen.' }, signUp: { invalid_password: 'Het wachtwoord is ongeldig.', diff --git a/src/i18n/nn.js b/src/i18n/nn.js index 0beda0164..7cc78906a 100644 --- a/src/i18n/nn.js +++ b/src/i18n/nn.js @@ -45,7 +45,8 @@ export default { 'bad.phone_number': 'Ugyldig telefonnummer', 'lock.fallback': 'Beklagar, men noko gjekk galt', invalid_captcha: 'Løs utfordringsspørsmålet for å bekrefte at du ikke er en robot.', - invalid_recaptcha: 'Merk av i avmerkingsboksen for å bekrefte at du ikke er en robot.' + invalid_recaptcha: 'Merk av i avmerkingsboksen for å bekrefte at du ikke er en robot.', + too_many_attempts: 'Din brukarkonto har blitt blokkert etter gjentekne ugyldige innloggingsforsøk.' }, signUp: { invalid_password: 'Ugyldig passord.', diff --git a/src/i18n/no.js b/src/i18n/no.js index c1eb0f9ca..0dad69af3 100644 --- a/src/i18n/no.js +++ b/src/i18n/no.js @@ -45,7 +45,8 @@ export default { 'bad.phone_number': 'Ugyldig telefonnummer', 'lock.fallback': 'Beklager, men noe gikk galt', invalid_captcha: 'Løs utfordringsspørsmålet for å bekrefte at du ikke er en robot.', - invalid_recaptcha: 'Merk av i avmerkingsboksen for å bekrefte at du ikke er en robot.' + invalid_recaptcha: 'Merk av i avmerkingsboksen for å bekrefte at du ikke er en robot.', + too_many_attempts: 'Din brukerkonto har blitt blokkert etter gjentatte ugyldige innloggingsforsøk.' }, signUp: { invalid_password: 'Ugyldig passord.', diff --git a/src/i18n/pl.js b/src/i18n/pl.js index f92b7580b..3753b68b2 100644 --- a/src/i18n/pl.js +++ b/src/i18n/pl.js @@ -45,7 +45,8 @@ export default { 'bad.phone_number': 'Numer telefonu nie jest poprawny', 'lock.fallback': 'Przykro nam, coś poszło nie tak', invalid_captcha: 'Rozwiąż pytanie kontrolne, aby sprawdzić, czy nie jesteś robotem.', - invalid_recaptcha: 'Zaznacz pole wyboru, aby potwierdzić, że nie jesteś robotem.' + invalid_recaptcha: 'Zaznacz pole wyboru, aby potwierdzić, że nie jesteś robotem.', + too_many_attempts: 'Twoje konto zostało zablokowane po zbyt wielu nieudanych próbach logowania.' }, signUp: { invalid_password: 'Hasło nie jest poprawne.', diff --git a/src/i18n/pt-br.js b/src/i18n/pt-br.js index 9b8e2daed..974dca111 100644 --- a/src/i18n/pt-br.js +++ b/src/i18n/pt-br.js @@ -41,7 +41,8 @@ export default { 'bad.phone_number': 'O número de telefone é inválido', 'lock.fallback': 'Sentimos muito, algo deu errado', invalid_captcha: 'Resolva a questão do desafio para verificar se você não é um robô.', - invalid_recaptcha: 'Marque a caixa de seleção para verificar se você não é um robô.' + invalid_recaptcha: 'Marque a caixa de seleção para verificar se você não é um robô.', + too_many_attempts: 'A sua conta foi bloqueada após várias tentativas de login consecutivas.' }, signUp: { invalid_password: 'A senha é inválida.', diff --git a/src/i18n/pt.js b/src/i18n/pt.js index a77745c8c..e13911716 100644 --- a/src/i18n/pt.js +++ b/src/i18n/pt.js @@ -46,7 +46,8 @@ export default { 'bad.phone_number': 'O número de telefone é inválido', 'lock.fallback': 'Lamentamos, correu um erro.', invalid_captcha: 'Resolva a questão do desafio para verificar se você não é um robô.', - invalid_recaptcha: 'Marque a caixa de seleção para verificar se você não é um robô.' + invalid_recaptcha: 'Marque a caixa de seleção para verificar se você não é um robô.', + too_many_attempts: 'A sua conta foi bloqueada após várias tentativas sucessivas de início de sessão.' }, signUp: { invalid_password: 'Palavra-passe inválida.', diff --git a/src/i18n/ro.js b/src/i18n/ro.js index 9e33c1a3a..dc2a75f7c 100644 --- a/src/i18n/ro.js +++ b/src/i18n/ro.js @@ -45,7 +45,8 @@ export default { 'bad.phone_number': 'Numărul de telefon este invalid', 'lock.fallback': 'Ne pare rău, ceva nu a funcționat', invalid_captcha: 'Rezolvați întrebarea pentru a verifica dacă nu sunteți un robot.', - invalid_recaptcha: 'Selectați caseta pentru a verifica dacă nu sunteți un robot.' + invalid_recaptcha: 'Selectați caseta pentru a verifica dacă nu sunteți un robot.', + too_many_attempts: 'Contul tău a fost blocat după mai multe încercări nereușite de conectare.' }, signUp: { invalid_password: 'Parolă invalidă.', diff --git a/src/i18n/ru.js b/src/i18n/ru.js index f5d39dd3a..00163cc79 100644 --- a/src/i18n/ru.js +++ b/src/i18n/ru.js @@ -48,7 +48,8 @@ export default { 'bad.phone_number': 'Недействительный номер телефона', 'lock.fallback': 'Произошла непредвиденная ошибка. Приносим свои извинения', invalid_captcha: 'Решите сложный вопрос, чтобы убедиться, что вы не робот.', - invalid_recaptcha: 'Установите флажок, чтобы убедиться, что вы не робот.' + invalid_recaptcha: 'Установите флажок, чтобы убедиться, что вы не робот.', + too_many_attempts: 'Ваш аккаунт был заблокирован после нескольких последовательных попыток входа в систему.' }, signUp: { invalid_password: 'Неверный пароль.', diff --git a/src/i18n/sk.js b/src/i18n/sk.js index a219b91c9..5d74b90ae 100644 --- a/src/i18n/sk.js +++ b/src/i18n/sk.js @@ -43,7 +43,8 @@ export default { 'bad.phone_number': 'Neplatné telefónne číslo', 'lock.fallback': 'Ospravedlňujeme sa, niečo nie je v poriadku', invalid_captcha: 'Vyriešte výzvu a overte, či nie ste robot.', - invalid_recaptcha: 'Začiarknutím políčka overíte, či nie ste robot.' + invalid_recaptcha: 'Začiarknutím políčka overíte, či nie ste robot.', + too_many_attempts: 'Vaše konto bolo zablokované po viacnásobných pokusoch o prihlásenie' }, signUp: { invalid_password: 'Neplatné heslo.', diff --git a/src/i18n/sl.js b/src/i18n/sl.js index d7591a7a0..97270795c 100644 --- a/src/i18n/sl.js +++ b/src/i18n/sl.js @@ -43,7 +43,8 @@ export default { 'bad.phone_number': 'Napačna telefonska številka', 'lock.fallback': 'Žal je prišlo do napake', invalid_captcha: 'Rešite izzivno vprašanje in preverite, ali niste robot.', - invalid_recaptcha: 'Izberite potrditveno polje, da preverite, da niste robot.' + invalid_recaptcha: 'Izberite potrditveno polje, da preverite, da niste robot.', + too_many_attempts: 'Po več zaporednih poskusih napačne prijave je bil vaš račun blokiran.' }, signUp: { invalid_password: 'Napačno geslo.', diff --git a/src/i18n/sr.js b/src/i18n/sr.js index 4049796c6..f241b325f 100644 --- a/src/i18n/sr.js +++ b/src/i18n/sr.js @@ -43,7 +43,8 @@ export default { 'bad.phone_number': 'Broj telefona je nevažeći', 'lock.fallback': 'Žao nam je, došlo je do greške', invalid_captcha: 'Решите изазовно питање да бисте потврдили да нисте робот.', - invalid_recaptcha: 'Потврдите избор у пољу за потврду да нисте робот.' + invalid_recaptcha: 'Потврдите избор у пољу за потврду да нисте робот.', + too_many_attempts: 'Vaš nalog je blokiran nakon više uzastopnih pokušaja prijavljivanja.' }, signUp: { invalid_password: 'Lozinka je nevažeća.', diff --git a/src/i18n/sv.js b/src/i18n/sv.js index a7082fcf6..cfb4173ff 100644 --- a/src/i18n/sv.js +++ b/src/i18n/sv.js @@ -43,7 +43,8 @@ export default { 'bad.phone_number': 'Ditt telefonnummer är ogiltigt.', 'lock.fallback': 'Något gick fel.', invalid_captcha: 'Lös utmaningsfrågan för att verifiera att du inte är en robot.', - invalid_recaptcha: 'Markera kryssrutan för att verifiera att du inte är en robot.' + invalid_recaptcha: 'Markera kryssrutan för att verifiera att du inte är en robot.', + too_many_attempts: 'Ditt konto har blivit spärrat efter flera felaktiga inloggningsförsök.' }, signUp: { invalid_password: 'Lösenordet är ogiltigt.', diff --git a/src/i18n/tr.js b/src/i18n/tr.js index f2ed23ed9..8a8d6ef90 100644 --- a/src/i18n/tr.js +++ b/src/i18n/tr.js @@ -44,7 +44,8 @@ export default { 'bad.phone_number': 'Telefon numarası geçerli değil', 'lock.fallback': 'Özür dileriz, bir hata oluştu', invalid_captcha: 'Robot olmadığınızı doğrulamak için meydan okuma sorusunu çözün.', - invalid_recaptcha: 'Robot olmadığınızı doğrulamak için onay kutusunu seçin.' + invalid_recaptcha: 'Robot olmadığınızı doğrulamak için onay kutusunu seçin.', + too_many_attempts: 'Çok fazla giriş denemesi sonucunda hesabınız bloke oldu.' }, signUp: { invalid_password: 'Şifre geçersiz.', diff --git a/src/i18n/ua.js b/src/i18n/ua.js index 9be0a5eb1..0c2dfa91f 100644 --- a/src/i18n/ua.js +++ b/src/i18n/ua.js @@ -46,7 +46,8 @@ export default { 'bad.phone_number': 'Недійсний номер телефону', 'lock.fallback': 'Йой! Виникла непередбачувана помилка при спробі авторизації. Перепрошуємо.', invalid_captcha: 'Вирішіть складне питання, щоб переконатися, що ви не робот.', - invalid_recaptcha: 'Установіть прапорець, щоб переконатися, що ви не робот.' + invalid_recaptcha: 'Установіть прапорець, щоб переконатися, що ви не робот.', + too_many_attempts: 'Ваш обліковий запис був заблокований після декількох послідовних спроб входу до системи.' }, signUp: { invalid_password: 'Невірний пароль.', diff --git a/src/i18n/uk.js b/src/i18n/uk.js index 0ae688c4b..8d58739c9 100644 --- a/src/i18n/uk.js +++ b/src/i18n/uk.js @@ -45,7 +45,8 @@ export default { 'bad.phone_number': 'Неправильний номер телефону', 'lock.fallback': 'На жаль, сталася помилка', invalid_captcha: 'Вирішіть складне питання, щоб переконатися, що ви не робот.', - invalid_recaptcha: 'Установіть прапорець, щоб переконатися, що ви не робот.' + invalid_recaptcha: 'Установіть прапорець, щоб переконатися, що ви не робот.', + too_many_attempts: 'Ваш обліковий запис заблоковано після декількох послідовних спроб входу в систему.' }, signUp: { invalid_password: 'Неправильний пароль.', diff --git a/src/i18n/vi.js b/src/i18n/vi.js index 429eb12dc..1ec4a5663 100644 --- a/src/i18n/vi.js +++ b/src/i18n/vi.js @@ -43,7 +43,8 @@ export default { 'bad.phone_number': 'Số điện thoại không hợp lệ.', 'lock.fallback': 'Đã có lỗi xãy ra, chúng tôi rất lấy làm tiếc.', invalid_captcha: 'Giải quyết câu hỏi thử thách để xác minh bạn không phải là robot.', - invalid_recaptcha: 'Chọn hộp kiểm để xác minh bạn không phải là robot.' + invalid_recaptcha: 'Chọn hộp kiểm để xác minh bạn không phải là robot.', + too_many_attempts: 'Tài khoản của bạn đã bị khóa do liên tục đăng nhập thất bại nhiều lần.' }, signUp: { invalid_password: 'Mật khẩu không hợp lệ.', diff --git a/src/i18n/zh-tw.js b/src/i18n/zh-tw.js index fd65cb966..964f065a5 100644 --- a/src/i18n/zh-tw.js +++ b/src/i18n/zh-tw.js @@ -39,7 +39,8 @@ export default { 'bad.phone_number': '手機號碼錯誤。', 'lock.fallback': '對不起,發生錯誤。', invalid_captcha: '解決挑戰問題以驗證您不是機器人。', - invalid_recaptcha: '選中復選框以確認您不是機器人。' + invalid_recaptcha: '選中復選框以確認您不是機器人。', + too_many_attempts: '由於登入異常頻繁,您的帳號已被鎖定。' }, signUp: { invalid_password: '密碼錯誤', diff --git a/src/i18n/zh.js b/src/i18n/zh.js index c219d8947..9d7b062f5 100644 --- a/src/i18n/zh.js +++ b/src/i18n/zh.js @@ -39,7 +39,8 @@ export default { 'bad.phone_number': '手机号码格式不正确。', 'lock.fallback': '对不起,出现错误。', invalid_captcha: '解决挑战问题以验证您不是机器人。', - invalid_recaptcha: '选中复选框以确认您不是机器人。' + invalid_recaptcha: '选中复选框以确认您不是机器人。', + too_many_attempts: '由于登录操作太频繁,您的帐号已被锁定。' }, signUp: { invalid_password: '密码错误', diff --git a/src/ui/box/chrome.jsx b/src/ui/box/chrome.jsx index c45fa6dc9..fea9ea703 100644 --- a/src/ui/box/chrome.jsx +++ b/src/ui/box/chrome.jsx @@ -72,6 +72,11 @@ const SubmitTextSvg = () => ( ); class SubmitButton extends React.Component { + constructor(props) { + super(props); + this.buttonRef = React.createRef(); + } + handleSubmit() { const { label, screenName, contentProps } = this.props; const { model } = contentProps; @@ -94,7 +99,9 @@ class SubmitButton extends React.Component { } focus() { - ReactDOM.findDOMNode(this).focus(); + if (this.buttonRef.current) { + this.buttonRef.current.focus(); + } } render() { @@ -112,6 +119,7 @@ class SubmitButton extends React.Component { return (