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 (