@oxy.so/core 1.16.0 → 1.18.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/.tsbuildinfo +1 -1
- package/dist/cjs/HttpService.js +30 -1
- package/dist/cjs/crypto/identityLink.js +18 -0
- package/dist/cjs/i18n/locales/ar-SA.json +78 -3
- package/dist/cjs/i18n/locales/ca-ES.json +78 -3
- package/dist/cjs/i18n/locales/de-DE.json +78 -3
- package/dist/cjs/i18n/locales/en-US.json +75 -28
- package/dist/cjs/i18n/locales/es-ES.json +75 -28
- package/dist/cjs/i18n/locales/fr-FR.json +78 -3
- package/dist/cjs/i18n/locales/it-IT.json +78 -3
- package/dist/cjs/i18n/locales/ja-JP.json +78 -3
- package/dist/cjs/i18n/locales/ko-KR.json +78 -3
- package/dist/cjs/i18n/locales/locales/ar-SA.json +78 -3
- package/dist/cjs/i18n/locales/locales/ca-ES.json +78 -3
- package/dist/cjs/i18n/locales/locales/de-DE.json +78 -3
- package/dist/cjs/i18n/locales/locales/en-US.json +75 -28
- package/dist/cjs/i18n/locales/locales/es-ES.json +75 -28
- package/dist/cjs/i18n/locales/locales/fr-FR.json +78 -3
- package/dist/cjs/i18n/locales/locales/it-IT.json +78 -3
- package/dist/cjs/i18n/locales/locales/ja-JP.json +78 -3
- package/dist/cjs/i18n/locales/locales/ko-KR.json +78 -3
- package/dist/cjs/i18n/locales/locales/pt-PT.json +78 -3
- package/dist/cjs/i18n/locales/locales/zh-CN.json +78 -3
- package/dist/cjs/i18n/locales/pt-PT.json +78 -3
- package/dist/cjs/i18n/locales/zh-CN.json +78 -3
- package/dist/cjs/index.js +9 -42
- package/dist/cjs/mixins/OxyServices.auth.js +110 -17
- package/dist/cjs/mixins/OxyServices.identity.js +128 -8
- package/dist/cjs/mixins/OxyServices.user.js +42 -7
- package/dist/cjs/utils/authWebUrl.js +4 -5
- package/dist/esm/.tsbuildinfo +1 -1
- package/dist/esm/HttpService.js +30 -1
- package/dist/esm/crypto/identityLink.js +15 -0
- package/dist/esm/i18n/locales/ar-SA.json +78 -3
- package/dist/esm/i18n/locales/ca-ES.json +78 -3
- package/dist/esm/i18n/locales/de-DE.json +78 -3
- package/dist/esm/i18n/locales/en-US.json +75 -28
- package/dist/esm/i18n/locales/es-ES.json +75 -28
- package/dist/esm/i18n/locales/fr-FR.json +78 -3
- package/dist/esm/i18n/locales/it-IT.json +78 -3
- package/dist/esm/i18n/locales/ja-JP.json +78 -3
- package/dist/esm/i18n/locales/ko-KR.json +78 -3
- package/dist/esm/i18n/locales/locales/ar-SA.json +78 -3
- package/dist/esm/i18n/locales/locales/ca-ES.json +78 -3
- package/dist/esm/i18n/locales/locales/de-DE.json +78 -3
- package/dist/esm/i18n/locales/locales/en-US.json +75 -28
- package/dist/esm/i18n/locales/locales/es-ES.json +75 -28
- package/dist/esm/i18n/locales/locales/fr-FR.json +78 -3
- package/dist/esm/i18n/locales/locales/it-IT.json +78 -3
- package/dist/esm/i18n/locales/locales/ja-JP.json +78 -3
- package/dist/esm/i18n/locales/locales/ko-KR.json +78 -3
- package/dist/esm/i18n/locales/locales/pt-PT.json +78 -3
- package/dist/esm/i18n/locales/locales/zh-CN.json +78 -3
- package/dist/esm/i18n/locales/pt-PT.json +78 -3
- package/dist/esm/i18n/locales/zh-CN.json +78 -3
- package/dist/esm/index.js +4 -4
- package/dist/esm/mixins/OxyServices.auth.js +110 -17
- package/dist/esm/mixins/OxyServices.identity.js +128 -8
- package/dist/esm/mixins/OxyServices.user.js +42 -7
- package/dist/esm/utils/authWebUrl.js +4 -5
- package/dist/types/.tsbuildinfo +1 -1
- package/dist/types/HttpService.d.ts +21 -0
- package/dist/types/crypto/identityLink.d.ts +8 -0
- package/dist/types/index.d.ts +2 -5
- package/dist/types/mixins/OxyServices.auth.d.ts +68 -25
- package/dist/types/mixins/OxyServices.identity.d.ts +34 -34
- package/dist/types/mixins/OxyServices.user.d.ts +29 -6
- package/dist/types/models/interfaces.d.ts +67 -13
- package/dist/types/server/securityHeaders.d.ts +3 -3
- package/dist/types/utils/authWebUrl.d.ts +4 -5
- package/package.json +3 -3
- package/src/HttpService.ts +35 -1
- package/src/__tests__/serviceIdentityWhenAnonymous.test.ts +159 -0
- package/src/crypto/__tests__/identityLink.test.ts +18 -0
- package/src/crypto/__tests__/identityProof.test.ts +6 -6
- package/src/crypto/identityLink.ts +18 -0
- package/src/i18n/locales/ar-SA.json +78 -3
- package/src/i18n/locales/ca-ES.json +78 -3
- package/src/i18n/locales/de-DE.json +78 -3
- package/src/i18n/locales/en-US.json +75 -28
- package/src/i18n/locales/es-ES.json +75 -28
- package/src/i18n/locales/fr-FR.json +78 -3
- package/src/i18n/locales/it-IT.json +78 -3
- package/src/i18n/locales/ja-JP.json +78 -3
- package/src/i18n/locales/ko-KR.json +78 -3
- package/src/i18n/locales/pt-PT.json +78 -3
- package/src/i18n/locales/zh-CN.json +78 -3
- package/src/index.ts +6 -48
- package/src/mixins/OxyServices.auth.ts +127 -24
- package/src/mixins/OxyServices.identity.ts +126 -8
- package/src/mixins/OxyServices.user.ts +51 -10
- package/src/mixins/__tests__/identityLink.test.ts +89 -0
- package/src/mixins/__tests__/notifications.read.test.ts +82 -0
- package/src/mixins/__tests__/preSessionSkipAuth.test.ts +1 -1
- package/src/mixins/__tests__/webauthnAuth.test.ts +75 -1
- package/src/models/interfaces.ts +67 -12
- package/src/server/securityHeaders.ts +3 -3
- package/src/utils/authWebUrl.ts +4 -5
- package/dist/cjs/crypto/identityMove.js +0 -142
- package/dist/cjs/crypto/webIdentityCarrier.js +0 -325
- package/dist/esm/crypto/identityMove.js +0 -128
- package/dist/esm/crypto/webIdentityCarrier.js +0 -303
- package/dist/types/crypto/identityMove.d.ts +0 -75
- package/dist/types/crypto/webIdentityCarrier.d.ts +0 -150
- package/src/crypto/__tests__/identityMove.test.ts +0 -146
- package/src/crypto/__tests__/webIdentityCarrier.test.ts +0 -169
- package/src/crypto/__tests__/webIdentityRecoveryMaterial.test.ts +0 -117
- package/src/crypto/identityMove.ts +0 -167
- package/src/crypto/webIdentityCarrier.ts +0 -394
package/dist/cjs/HttpService.js
CHANGED
|
@@ -236,6 +236,7 @@ class HttpService {
|
|
|
236
236
|
this.noFresherTokenThan = null;
|
|
237
237
|
this.authRefreshHandler = null;
|
|
238
238
|
this.accessTokenProvider = null;
|
|
239
|
+
this.anonymousAuthProvider = null;
|
|
239
240
|
this.deviceSecretMintInFlight = null;
|
|
240
241
|
/**
|
|
241
242
|
* Bumped by every {@link endSession}. A re-mint captures it before its first
|
|
@@ -921,7 +922,7 @@ class HttpService {
|
|
|
921
922
|
async getAuthHeader() {
|
|
922
923
|
const accessToken = this.syncAccessTokenFromProvider();
|
|
923
924
|
if (!accessToken) {
|
|
924
|
-
return
|
|
925
|
+
return this.getAnonymousAuthHeader();
|
|
925
926
|
}
|
|
926
927
|
try {
|
|
927
928
|
const decoded = (0, jwt_decode_1.jwtDecode)(accessToken);
|
|
@@ -950,6 +951,24 @@ class HttpService {
|
|
|
950
951
|
return null;
|
|
951
952
|
}
|
|
952
953
|
}
|
|
954
|
+
/**
|
|
955
|
+
* The bearer for a request that has no user session behind it, from the
|
|
956
|
+
* {@link AnonymousAuthProvider} if one is installed. Never throws: a provider
|
|
957
|
+
* that fails sends the request anonymous, exactly as it went before any
|
|
958
|
+
* provider existed.
|
|
959
|
+
*/
|
|
960
|
+
async getAnonymousAuthHeader() {
|
|
961
|
+
if (!this.anonymousAuthProvider)
|
|
962
|
+
return null;
|
|
963
|
+
try {
|
|
964
|
+
const token = await this.anonymousAuthProvider();
|
|
965
|
+
return token ? `Bearer ${token}` : null;
|
|
966
|
+
}
|
|
967
|
+
catch (error) {
|
|
968
|
+
this.logger.debug('Anonymous auth provider failed; sending the request anonymous:', error);
|
|
969
|
+
return null;
|
|
970
|
+
}
|
|
971
|
+
}
|
|
953
972
|
async refreshAccessToken(reason) {
|
|
954
973
|
if (!this.authRefreshHandler) {
|
|
955
974
|
return null;
|
|
@@ -1258,6 +1277,16 @@ class HttpService {
|
|
|
1258
1277
|
setAccessTokenProvider(provider) {
|
|
1259
1278
|
this.accessTokenProvider = provider;
|
|
1260
1279
|
}
|
|
1280
|
+
/**
|
|
1281
|
+
* Authenticate requests that carry no user session with the bearer this
|
|
1282
|
+
* provider returns — in practice a backend's own service token (see
|
|
1283
|
+
* `OxyConfig.serviceIdentity`). A user session always wins: the provider is
|
|
1284
|
+
* consulted only when there is no access token, and never for `skipAuth`
|
|
1285
|
+
* requests. `null` removes it.
|
|
1286
|
+
*/
|
|
1287
|
+
setAnonymousAuthProvider(provider) {
|
|
1288
|
+
this.anonymousAuthProvider = provider;
|
|
1289
|
+
}
|
|
1261
1290
|
clearTokens() {
|
|
1262
1291
|
this.tokenStore.clearTokens();
|
|
1263
1292
|
// Drop the response cache on logout. The cache is identity-scoped, so a
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The code both screens show while Commons is being linked to a passkey
|
|
4
|
+
* account (ADR 0029 D3): 6 digits derived from the link request and the key
|
|
5
|
+
* Commons signed with. auth.oxy.so derives it from the key the API relayed,
|
|
6
|
+
* Commons from its own; the person checks they match before the passkey is
|
|
7
|
+
* asserted, so a photographed QR cannot slip another key in.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.deriveIdentityLinkCode = deriveIdentityLinkCode;
|
|
11
|
+
const sha256_1 = require("@noble/hashes/sha256");
|
|
12
|
+
const utils_1 = require("@noble/hashes/utils");
|
|
13
|
+
const DOMAIN = 'oxy-identity-link-code/v1';
|
|
14
|
+
function deriveIdentityLinkCode(linkId, publicKey) {
|
|
15
|
+
const digest = (0, sha256_1.sha256)((0, utils_1.utf8ToBytes)(`${DOMAIN}|${linkId}|${publicKey.trim().toLowerCase()}`));
|
|
16
|
+
const value = ((digest[0] << 24) | (digest[1] << 16) | (digest[2] << 8) | digest[3]) >>> 0;
|
|
17
|
+
return String(value % 1000000).padStart(6, '0');
|
|
18
|
+
}
|
|
@@ -50,7 +50,26 @@
|
|
|
50
50
|
"createInCommons": "أنشئ هويتك في Commons",
|
|
51
51
|
"createAccount": "إنشاء حساب",
|
|
52
52
|
"backToSignInLink": "لديك حساب بالفعل؟ سجّل الدخول",
|
|
53
|
-
"webSubtitle": "بلا كلمة
|
|
53
|
+
"webSubtitle": "بلا كلمة مرور: ينشئ جهازك مفتاح مرور، ويعيدك بريد الاسترداد إذا فقدته.",
|
|
54
|
+
"username": {
|
|
55
|
+
"label": "اسم المستخدم",
|
|
56
|
+
"placeholder": "yourname",
|
|
57
|
+
"required": "اختر اسم مستخدم.",
|
|
58
|
+
"taken": "اسم المستخدم هذا مستخدم بالفعل."
|
|
59
|
+
},
|
|
60
|
+
"email": {
|
|
61
|
+
"title": "بريد الاسترداد",
|
|
62
|
+
"subtitle": "إذا فقدت مفتاح المرور، نرسل إلى هنا رمزًا لتعود. لا يُستخدم لأي شيء آخر.",
|
|
63
|
+
"label": "البريد الإلكتروني",
|
|
64
|
+
"placeholder": "you@example.com",
|
|
65
|
+
"invalid": "أدخل بريدًا إلكترونيًا صالحًا."
|
|
66
|
+
},
|
|
67
|
+
"passkey": {
|
|
68
|
+
"title": "أنشئ مفتاح المرور",
|
|
69
|
+
"subtitle": "تسجّل الدخول به: ببصمتك أو وجهك أو قفل الشاشة. لا شيء تتذكره.",
|
|
70
|
+
"action": "إنشاء مفتاح مرور"
|
|
71
|
+
},
|
|
72
|
+
"commonsInstead": "تريد الاحتفاظ بمفتاحك بنفسك؟ استخدم Commons"
|
|
54
73
|
},
|
|
55
74
|
"accountSwitcher": {
|
|
56
75
|
"loading": "جارٍ تحميل الحسابات...",
|
|
@@ -225,7 +244,63 @@
|
|
|
225
244
|
"help": "المساعدة والملاحظات",
|
|
226
245
|
"signOut": "تسجيل الخروج",
|
|
227
246
|
"privacy": "سياسة الخصوصية",
|
|
228
|
-
"terms": "شروط الخدمة"
|
|
229
|
-
|
|
247
|
+
"terms": "شروط الخدمة"
|
|
248
|
+
},
|
|
249
|
+
"recover": {
|
|
250
|
+
"title": "استرد حسابك",
|
|
251
|
+
"subtitle": "أدخل اسم المستخدم أو بريد الاسترداد. سنرسل رمزًا إلى بريد الاسترداد الخاص بالحساب.",
|
|
252
|
+
"identifier": {
|
|
253
|
+
"label": "اسم المستخدم أو البريد",
|
|
254
|
+
"placeholder": "yourname",
|
|
255
|
+
"required": "أدخل اسم المستخدم أو البريد."
|
|
256
|
+
},
|
|
257
|
+
"commonsNote": "هل يستخدم حسابك Commons؟ استرده في Commons بعبارة الاسترداد.",
|
|
258
|
+
"passkey": {
|
|
259
|
+
"title": "أضف مفتاح مرور جديدًا",
|
|
260
|
+
"subtitle": "لـ @{{username}}. أزل مفاتيح المرور المفقودة لاحقًا من إعدادات أمان حسابك.",
|
|
261
|
+
"action": "إنشاء مفتاح مرور"
|
|
262
|
+
},
|
|
263
|
+
"backToSignIn": "العودة إلى تسجيل الدخول"
|
|
264
|
+
},
|
|
265
|
+
"emailCode": {
|
|
266
|
+
"title": "تحقق من بريدك",
|
|
267
|
+
"sentTo": "أرسلنا رمزًا من 6 أرقام إلى {{email}}.",
|
|
268
|
+
"sentIfAccount": "إذا كان لهذا الحساب بريد استرداد، فقد أرسلنا إليه رمزًا من 6 أرقام.",
|
|
269
|
+
"label": "الرمز",
|
|
270
|
+
"resend": "أرسل رمزًا جديدًا",
|
|
271
|
+
"resent": "أرسلنا رمزًا جديدًا.",
|
|
272
|
+
"changeEmail": "استخدم بريدًا آخر",
|
|
273
|
+
"errors": {
|
|
274
|
+
"codeInvalid": "الرمز غير صحيح أو انتهت صلاحيته.",
|
|
275
|
+
"tooManyAttempts": "رموز خاطئة كثيرة. اطلب رمزًا جديدًا.",
|
|
276
|
+
"expired": "استغرق الأمر وقتًا طويلًا. ابدأ من جديد.",
|
|
277
|
+
"unavailable": "لا يستطيع Oxy إرسال البريد الآن. حاول لاحقًا.",
|
|
278
|
+
"rateLimited": "رموز كثيرة. حاول لاحقًا."
|
|
279
|
+
}
|
|
280
|
+
},
|
|
281
|
+
"deleteAccount": {
|
|
282
|
+
"passkey": {
|
|
283
|
+
"subtitle": "أكّد بمفتاح المرور. سيُحذف @{{username}} وكل ما فيه نهائيًا.",
|
|
284
|
+
"action": "الحذف بمفتاح المرور",
|
|
285
|
+
"done": "حُذف حسابك.",
|
|
286
|
+
"closeWindow": "يمكنك إغلاق هذه النافذة.",
|
|
287
|
+
"commons": "يستخدم هذا الحساب Commons: احذفه في Oxy Commons من الإعدادات > حذف الحساب، بمفتاحه."
|
|
288
|
+
}
|
|
289
|
+
},
|
|
290
|
+
"linkCommons": {
|
|
291
|
+
"title": "اربط Commons",
|
|
292
|
+
"subtitle": "احتفظ بمفتاحك: اربط Commons ليصبح هذا الحساب لك وحدك. يُحذف بريد الاسترداد الخاص به، وتصبح عبارة الاسترداد في Commons طريقك للعودة.",
|
|
293
|
+
"scan": "على هاتفك، افتح Commons واختر «لدي حساب Oxy على الويب» ثم امسح هذا الرمز.",
|
|
294
|
+
"waiting": "بانتظار Commons…",
|
|
295
|
+
"compareTitle": "تحقق من الرمز",
|
|
296
|
+
"compare": "يعرض Commons الرمز نفسه. إن لم يكن كذلك، ألغِ العملية.",
|
|
297
|
+
"confirm": "نعم، اربط Commons",
|
|
298
|
+
"cancel": "إلغاء",
|
|
299
|
+
"doneTitle": "تم ربط Commons",
|
|
300
|
+
"done": "أصبح هذا الحساب ذاتي الحفظ. حُذف بريد الاسترداد الخاص به: عبارة الاسترداد في Commons هي طريقك للعودة.",
|
|
301
|
+
"already": "يستخدم هذا الحساب Commons بالفعل.",
|
|
302
|
+
"expired": "انتهت صلاحية هذا الرمز.",
|
|
303
|
+
"renew": "اعرض رمزًا جديدًا",
|
|
304
|
+
"failed": "تعذّر ربط Commons. حاول مجددًا."
|
|
230
305
|
}
|
|
231
306
|
}
|
|
@@ -50,7 +50,26 @@
|
|
|
50
50
|
"createInCommons": "Crea la teva identitat a Commons",
|
|
51
51
|
"createAccount": "Crear compte",
|
|
52
52
|
"backToSignInLink": "Ja tens compte? Inicia sessió",
|
|
53
|
-
"webSubtitle": "Sense contrasenya
|
|
53
|
+
"webSubtitle": "Sense contrasenya: el teu dispositiu crea una passkey i un correu de recuperació et torna l'accés si la perds.",
|
|
54
|
+
"username": {
|
|
55
|
+
"label": "Nom d'usuari",
|
|
56
|
+
"placeholder": "elteunom",
|
|
57
|
+
"required": "Tria un nom d'usuari.",
|
|
58
|
+
"taken": "Aquest nom d'usuari ja està agafat."
|
|
59
|
+
},
|
|
60
|
+
"email": {
|
|
61
|
+
"title": "El teu correu de recuperació",
|
|
62
|
+
"subtitle": "Si perds la passkey, t'hi enviem un codi per tornar a entrar. No s'utilitza per a res més.",
|
|
63
|
+
"label": "Correu",
|
|
64
|
+
"placeholder": "tu@exemple.com",
|
|
65
|
+
"invalid": "Escriu un correu vàlid."
|
|
66
|
+
},
|
|
67
|
+
"passkey": {
|
|
68
|
+
"title": "Crea la teva passkey",
|
|
69
|
+
"subtitle": "Hi inicies la sessió: l'empremta, la cara o el bloqueig de pantalla. No cal recordar res.",
|
|
70
|
+
"action": "Crea la passkey"
|
|
71
|
+
},
|
|
72
|
+
"commonsInstead": "Vols guardar la teva pròpia clau? Fes servir Commons"
|
|
54
73
|
},
|
|
55
74
|
"accountSwitcher": {
|
|
56
75
|
"loading": "S'estan carregant els comptes...",
|
|
@@ -225,7 +244,63 @@
|
|
|
225
244
|
"help": "Ajuda i comentaris",
|
|
226
245
|
"signOut": "Tancar sessió",
|
|
227
246
|
"privacy": "Política de privacitat",
|
|
228
|
-
"terms": "Condicions del servei"
|
|
229
|
-
|
|
247
|
+
"terms": "Condicions del servei"
|
|
248
|
+
},
|
|
249
|
+
"recover": {
|
|
250
|
+
"title": "Recupera el compte",
|
|
251
|
+
"subtitle": "Escriu el nom d'usuari o el correu de recuperació. Enviarem un codi al correu de recuperació del compte.",
|
|
252
|
+
"identifier": {
|
|
253
|
+
"label": "Usuari o correu",
|
|
254
|
+
"placeholder": "elteunom",
|
|
255
|
+
"required": "Escriu l'usuari o el correu."
|
|
256
|
+
},
|
|
257
|
+
"commonsNote": "El teu compte fa servir Commons? Recupera-lo a Commons amb la frase de recuperació.",
|
|
258
|
+
"passkey": {
|
|
259
|
+
"title": "Afegeix una passkey nova",
|
|
260
|
+
"subtitle": "Per a @{{username}}. Treu les passkeys perdudes més tard a la configuració de seguretat del compte.",
|
|
261
|
+
"action": "Crea la passkey"
|
|
262
|
+
},
|
|
263
|
+
"backToSignIn": "Torna a iniciar la sessió"
|
|
264
|
+
},
|
|
265
|
+
"emailCode": {
|
|
266
|
+
"title": "Mira el correu",
|
|
267
|
+
"sentTo": "Hem enviat un codi de 6 xifres a {{email}}.",
|
|
268
|
+
"sentIfAccount": "Si aquest compte té un correu de recuperació, li hem enviat un codi de 6 xifres.",
|
|
269
|
+
"label": "Codi",
|
|
270
|
+
"resend": "Envia un codi nou",
|
|
271
|
+
"resent": "T'hem enviat un codi nou.",
|
|
272
|
+
"changeEmail": "Fes servir un altre correu",
|
|
273
|
+
"errors": {
|
|
274
|
+
"codeInvalid": "Aquest codi no és correcte o ha caducat.",
|
|
275
|
+
"tooManyAttempts": "Massa codis incorrectes. Demana-ne un de nou.",
|
|
276
|
+
"expired": "Ha passat massa temps. Torna a començar.",
|
|
277
|
+
"unavailable": "Oxy no pot enviar correus ara. Torna-ho a provar més tard.",
|
|
278
|
+
"rateLimited": "Massa codis. Torna-ho a provar més tard."
|
|
279
|
+
}
|
|
280
|
+
},
|
|
281
|
+
"deleteAccount": {
|
|
282
|
+
"passkey": {
|
|
283
|
+
"subtitle": "Confirma amb la passkey. @{{username}} i tot el que conté s'eliminen per sempre.",
|
|
284
|
+
"action": "Elimina amb passkey",
|
|
285
|
+
"done": "El teu compte s'ha eliminat.",
|
|
286
|
+
"closeWindow": "Pots tancar aquesta finestra.",
|
|
287
|
+
"commons": "Aquest compte fa servir Commons: elimina'l a Oxy Commons, Configuració > Elimina el compte, amb la seva clau."
|
|
288
|
+
}
|
|
289
|
+
},
|
|
290
|
+
"linkCommons": {
|
|
291
|
+
"title": "Vincula Commons",
|
|
292
|
+
"subtitle": "Guarda la teva pròpia clau: vincula Commons i aquest compte serà només teu. El seu correu de recuperació s'elimina, i la frase de recuperació de Commons és com hi tornes a entrar.",
|
|
293
|
+
"scan": "Al mòbil, obre Commons, tria «Tinc un compte d'Oxy al web» i escaneja aquest codi.",
|
|
294
|
+
"waiting": "Esperant Commons…",
|
|
295
|
+
"compareTitle": "Comprova el codi",
|
|
296
|
+
"compare": "Commons mostra el mateix codi. Si no és així, cancel·la.",
|
|
297
|
+
"confirm": "Sí, vincula Commons",
|
|
298
|
+
"cancel": "Cancel·la",
|
|
299
|
+
"doneTitle": "Commons està vinculat",
|
|
300
|
+
"done": "Aquest compte ara és d'autocustòdia. El seu correu de recuperació s'ha eliminat: la frase de recuperació de Commons és com hi tornes a entrar.",
|
|
301
|
+
"already": "Aquest compte ja fa servir Commons.",
|
|
302
|
+
"expired": "Aquest codi ha caducat.",
|
|
303
|
+
"renew": "Mostra un codi nou",
|
|
304
|
+
"failed": "No s'ha pogut vincular Commons. Torna-ho a provar."
|
|
230
305
|
}
|
|
231
306
|
}
|
|
@@ -50,7 +50,26 @@
|
|
|
50
50
|
"createInCommons": "Erstellen Sie Ihre Identität in Commons",
|
|
51
51
|
"createAccount": "Konto erstellen",
|
|
52
52
|
"backToSignInLink": "Sie haben bereits ein Konto? Anmelden",
|
|
53
|
-
"webSubtitle": "Kein Passwort
|
|
53
|
+
"webSubtitle": "Kein Passwort: Dein Gerät erstellt einen Passkey, und eine Wiederherstellungs-E-Mail bringt dich zurück, wenn du ihn verlierst.",
|
|
54
|
+
"username": {
|
|
55
|
+
"label": "Benutzername",
|
|
56
|
+
"placeholder": "deinname",
|
|
57
|
+
"required": "Wähle einen Benutzernamen.",
|
|
58
|
+
"taken": "Dieser Benutzername ist vergeben."
|
|
59
|
+
},
|
|
60
|
+
"email": {
|
|
61
|
+
"title": "Deine Wiederherstellungs-E-Mail",
|
|
62
|
+
"subtitle": "Wenn du deinen Passkey verlierst, schicken wir dir hierhin einen Code, um wieder hineinzukommen. Sonst wird sie für nichts verwendet.",
|
|
63
|
+
"label": "E-Mail",
|
|
64
|
+
"placeholder": "du@beispiel.de",
|
|
65
|
+
"invalid": "Gib eine gültige E-Mail-Adresse ein."
|
|
66
|
+
},
|
|
67
|
+
"passkey": {
|
|
68
|
+
"title": "Erstelle deinen Passkey",
|
|
69
|
+
"subtitle": "Damit meldest du dich an: Fingerabdruck, Gesicht oder Bildschirmsperre. Nichts zu merken.",
|
|
70
|
+
"action": "Passkey erstellen"
|
|
71
|
+
},
|
|
72
|
+
"commonsInstead": "Willst du deinen eigenen Schlüssel behalten? Nutze stattdessen Commons"
|
|
54
73
|
},
|
|
55
74
|
"accountSwitcher": {
|
|
56
75
|
"loading": "Konten werden geladen...",
|
|
@@ -225,7 +244,63 @@
|
|
|
225
244
|
"help": "Hilfe & Feedback",
|
|
226
245
|
"signOut": "Abmelden",
|
|
227
246
|
"privacy": "Datenschutzerklärung",
|
|
228
|
-
"terms": "Nutzungsbedingungen"
|
|
229
|
-
|
|
247
|
+
"terms": "Nutzungsbedingungen"
|
|
248
|
+
},
|
|
249
|
+
"recover": {
|
|
250
|
+
"title": "Konto wiederherstellen",
|
|
251
|
+
"subtitle": "Gib deinen Benutzernamen oder deine Wiederherstellungs-E-Mail ein. Wir schicken einen Code an die Wiederherstellungs-E-Mail des Kontos.",
|
|
252
|
+
"identifier": {
|
|
253
|
+
"label": "Benutzername oder E-Mail",
|
|
254
|
+
"placeholder": "deinname",
|
|
255
|
+
"required": "Gib deinen Benutzernamen oder deine E-Mail ein."
|
|
256
|
+
},
|
|
257
|
+
"commonsNote": "Nutzt dein Konto Commons? Stelle es in Commons mit deiner Wiederherstellungsphrase wieder her.",
|
|
258
|
+
"passkey": {
|
|
259
|
+
"title": "Neuen Passkey hinzufügen",
|
|
260
|
+
"subtitle": "Für @{{username}}. Entferne verlorene Passkeys später in den Sicherheitseinstellungen deines Kontos.",
|
|
261
|
+
"action": "Passkey erstellen"
|
|
262
|
+
},
|
|
263
|
+
"backToSignIn": "Zurück zur Anmeldung"
|
|
264
|
+
},
|
|
265
|
+
"emailCode": {
|
|
266
|
+
"title": "Sieh in deine E-Mails",
|
|
267
|
+
"sentTo": "Wir haben einen 6-stelligen Code an {{email}} geschickt.",
|
|
268
|
+
"sentIfAccount": "Wenn dieses Konto eine Wiederherstellungs-E-Mail hat, haben wir ihr einen 6-stelligen Code geschickt.",
|
|
269
|
+
"label": "Code",
|
|
270
|
+
"resend": "Neuen Code senden",
|
|
271
|
+
"resent": "Wir haben einen neuen Code geschickt.",
|
|
272
|
+
"changeEmail": "Andere E-Mail verwenden",
|
|
273
|
+
"errors": {
|
|
274
|
+
"codeInvalid": "Dieser Code stimmt nicht oder ist abgelaufen.",
|
|
275
|
+
"tooManyAttempts": "Zu viele falsche Codes. Fordere einen neuen an.",
|
|
276
|
+
"expired": "Das hat zu lange gedauert. Fang noch einmal an.",
|
|
277
|
+
"unavailable": "Oxy kann gerade keine E-Mails senden. Versuch es später noch einmal.",
|
|
278
|
+
"rateLimited": "Zu viele Codes. Versuch es später noch einmal."
|
|
279
|
+
}
|
|
280
|
+
},
|
|
281
|
+
"deleteAccount": {
|
|
282
|
+
"passkey": {
|
|
283
|
+
"subtitle": "Bestätige mit deinem Passkey. @{{username}} und alles darin werden endgültig gelöscht.",
|
|
284
|
+
"action": "Mit Passkey löschen",
|
|
285
|
+
"done": "Dein Konto ist gelöscht.",
|
|
286
|
+
"closeWindow": "Du kannst dieses Fenster schließen.",
|
|
287
|
+
"commons": "Dieses Konto nutzt Commons: Lösche es in Oxy Commons unter Einstellungen > Konto löschen, mit seinem Schlüssel."
|
|
288
|
+
}
|
|
289
|
+
},
|
|
290
|
+
"linkCommons": {
|
|
291
|
+
"title": "Commons verknüpfen",
|
|
292
|
+
"subtitle": "Behalte deinen eigenen Schlüssel: Verknüpfe Commons, und dieses Konto gehört nur dir. Seine Wiederherstellungs-E-Mail wird gelöscht, und deine Wiederherstellungsphrase in Commons bringt dich zurück.",
|
|
293
|
+
"scan": "Öffne Commons auf deinem Handy, wähle „Ich habe ein Oxy-Konto im Web“ und scanne diesen Code.",
|
|
294
|
+
"waiting": "Warte auf Commons…",
|
|
295
|
+
"compareTitle": "Prüfe den Code",
|
|
296
|
+
"compare": "Commons zeigt denselben Code. Wenn nicht, brich ab.",
|
|
297
|
+
"confirm": "Ja, Commons verknüpfen",
|
|
298
|
+
"cancel": "Abbrechen",
|
|
299
|
+
"doneTitle": "Commons ist verknüpft",
|
|
300
|
+
"done": "Dieses Konto ist jetzt selbstverwahrt. Seine Wiederherstellungs-E-Mail wurde gelöscht: Deine Wiederherstellungsphrase in Commons bringt dich zurück.",
|
|
301
|
+
"already": "Dieses Konto nutzt bereits Commons.",
|
|
302
|
+
"expired": "Dieser Code ist abgelaufen.",
|
|
303
|
+
"renew": "Neuen Code anzeigen",
|
|
304
|
+
"failed": "Commons konnte nicht verknüpft werden. Versuch es noch einmal."
|
|
230
305
|
}
|
|
231
306
|
}
|
|
@@ -58,7 +58,26 @@
|
|
|
58
58
|
"createInCommons": "Create your identity in Commons",
|
|
59
59
|
"createAccount": "Create account",
|
|
60
60
|
"backToSignInLink": "Already have an account? Sign in",
|
|
61
|
-
"webSubtitle": "No password
|
|
61
|
+
"webSubtitle": "No password: your device makes a passkey, and a recovery email gets you back in if you lose it.",
|
|
62
|
+
"username": {
|
|
63
|
+
"label": "Username",
|
|
64
|
+
"placeholder": "yourname",
|
|
65
|
+
"required": "Choose a username.",
|
|
66
|
+
"taken": "That username is taken."
|
|
67
|
+
},
|
|
68
|
+
"email": {
|
|
69
|
+
"title": "Your recovery email",
|
|
70
|
+
"subtitle": "If you lose your passkey, we send a code here to get you back in. It's used for nothing else.",
|
|
71
|
+
"label": "Email",
|
|
72
|
+
"placeholder": "you@example.com",
|
|
73
|
+
"invalid": "Enter a valid email address."
|
|
74
|
+
},
|
|
75
|
+
"passkey": {
|
|
76
|
+
"title": "Create your passkey",
|
|
77
|
+
"subtitle": "You sign in with it: your fingerprint, face or screen lock. There's nothing to remember.",
|
|
78
|
+
"action": "Create passkey"
|
|
79
|
+
},
|
|
80
|
+
"commonsInstead": "Want to hold your own key? Use Commons instead"
|
|
62
81
|
},
|
|
63
82
|
"welcomeNew": {
|
|
64
83
|
"navTitle": "Welcome",
|
|
@@ -206,30 +225,20 @@
|
|
|
206
225
|
"subtitle": "Tell us what you think"
|
|
207
226
|
},
|
|
208
227
|
"recover": {
|
|
209
|
-
"title": "Recover
|
|
210
|
-
"
|
|
211
|
-
|
|
212
|
-
"
|
|
213
|
-
"
|
|
214
|
-
"
|
|
215
|
-
},
|
|
216
|
-
"
|
|
217
|
-
|
|
218
|
-
"
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
"
|
|
223
|
-
"noEmail": "We no longer send recovery emails. Please use your recovery phrase to restore your identity. Contact support if you need assistance.",
|
|
224
|
-
"password": {
|
|
225
|
-
"minLength": "Password must be at least 8 characters long",
|
|
226
|
-
"mismatch": "Passwords do not match",
|
|
227
|
-
"resetFailed": "Failed to reset password"
|
|
228
|
-
},
|
|
229
|
-
"missingCode": "Missing code",
|
|
230
|
-
"whatsNextTitle": "What's next?",
|
|
231
|
-
"whatsNextBody": "You can now reset your password or return to sign in with your existing credentials.",
|
|
232
|
-
"completeSecure": "Your account recovery is complete and secure."
|
|
228
|
+
"title": "Recover your account",
|
|
229
|
+
"subtitle": "Enter your username or recovery email. We'll send a code to the account's recovery email.",
|
|
230
|
+
"identifier": {
|
|
231
|
+
"label": "Username or email",
|
|
232
|
+
"placeholder": "yourname",
|
|
233
|
+
"required": "Enter your username or email."
|
|
234
|
+
},
|
|
235
|
+
"commonsNote": "Does your account use Commons? Recover it in Commons with your recovery phrase.",
|
|
236
|
+
"passkey": {
|
|
237
|
+
"title": "Add a new passkey",
|
|
238
|
+
"subtitle": "For @{{username}}. Remove lost passkeys later in your account's security settings.",
|
|
239
|
+
"action": "Create passkey"
|
|
240
|
+
},
|
|
241
|
+
"backToSignIn": "Back to sign in"
|
|
233
242
|
},
|
|
234
243
|
"accountCenter": {
|
|
235
244
|
"sections": {
|
|
@@ -1617,8 +1626,7 @@
|
|
|
1617
1626
|
"help": "Help & feedback",
|
|
1618
1627
|
"signOut": "Sign out",
|
|
1619
1628
|
"privacy": "Privacy Policy",
|
|
1620
|
-
"terms": "Terms of Service"
|
|
1621
|
-
"identity": "Your identity"
|
|
1629
|
+
"terms": "Terms of Service"
|
|
1622
1630
|
},
|
|
1623
1631
|
"accounts": {
|
|
1624
1632
|
"activeAccount": {
|
|
@@ -1835,9 +1843,16 @@
|
|
|
1835
1843
|
"openCommons": "Open Oxy Commons",
|
|
1836
1844
|
"commonsOpenFailed": "Couldn't open Oxy Commons. Open it yourself and go to Settings > Delete account.",
|
|
1837
1845
|
"elsewhereTitle": "Delete your account where your identity is",
|
|
1838
|
-
"elsewhereMessage": "Deleting your account needs your identity key, and it isn't on this device. Open Oxy Commons on the device that holds
|
|
1846
|
+
"elsewhereMessage": "Deleting your account needs your identity key, and it isn't on this device. Open Oxy Commons on the device that holds it and go to Settings > Delete account. An account that uses a passkey is deleted at {{site}}.",
|
|
1839
1847
|
"gotIt": "Got it",
|
|
1840
1848
|
"identityUnreadable": "Couldn't read this device's identity storage. Unlock your device and try again."
|
|
1849
|
+
},
|
|
1850
|
+
"passkey": {
|
|
1851
|
+
"subtitle": "Confirm with your passkey. @{{username}} and everything in it are deleted for good.",
|
|
1852
|
+
"action": "Delete with passkey",
|
|
1853
|
+
"done": "Your account is deleted.",
|
|
1854
|
+
"closeWindow": "You can close this window.",
|
|
1855
|
+
"commons": "This account uses Commons: delete it in Oxy Commons, Settings > Delete account, with its key."
|
|
1841
1856
|
}
|
|
1842
1857
|
},
|
|
1843
1858
|
"manageAccount": {
|
|
@@ -2076,5 +2091,37 @@
|
|
|
2076
2091
|
"allow": "Continue to {{app}}",
|
|
2077
2092
|
"deny": "Cancel",
|
|
2078
2093
|
"disclaimer": "By continuing, {{app}} will be able to sign in with your Oxy account. You can manage connected apps anytime in your Oxy account settings."
|
|
2094
|
+
},
|
|
2095
|
+
"emailCode": {
|
|
2096
|
+
"title": "Check your email",
|
|
2097
|
+
"sentTo": "We sent a 6-digit code to {{email}}.",
|
|
2098
|
+
"sentIfAccount": "If this account has a recovery email, we sent a 6-digit code to it.",
|
|
2099
|
+
"label": "Code",
|
|
2100
|
+
"resend": "Send a new code",
|
|
2101
|
+
"resent": "We sent a new code.",
|
|
2102
|
+
"changeEmail": "Use another email",
|
|
2103
|
+
"errors": {
|
|
2104
|
+
"codeInvalid": "That code isn't right, or it has expired.",
|
|
2105
|
+
"tooManyAttempts": "Too many wrong codes. Ask for a new one.",
|
|
2106
|
+
"expired": "This took too long. Start again.",
|
|
2107
|
+
"unavailable": "Oxy can't send email right now. Try again later.",
|
|
2108
|
+
"rateLimited": "Too many codes. Try again later."
|
|
2109
|
+
}
|
|
2110
|
+
},
|
|
2111
|
+
"linkCommons": {
|
|
2112
|
+
"title": "Link Commons",
|
|
2113
|
+
"subtitle": "Keep your own key: link Commons and this account becomes yours alone. Its recovery email is deleted, and your recovery phrase in Commons is how you get back in.",
|
|
2114
|
+
"scan": "On your phone, open Commons, choose “I have an Oxy account on the web” and scan this code.",
|
|
2115
|
+
"waiting": "Waiting for Commons…",
|
|
2116
|
+
"compareTitle": "Check the code",
|
|
2117
|
+
"compare": "Commons shows the same code. If it doesn’t, cancel.",
|
|
2118
|
+
"confirm": "Yes, link Commons",
|
|
2119
|
+
"cancel": "Cancel",
|
|
2120
|
+
"doneTitle": "Commons is linked",
|
|
2121
|
+
"done": "This account is self-custodied now. Its recovery email was deleted: your recovery phrase in Commons is how you get back in.",
|
|
2122
|
+
"already": "This account already uses Commons.",
|
|
2123
|
+
"expired": "This code expired.",
|
|
2124
|
+
"renew": "Show a new code",
|
|
2125
|
+
"failed": "Commons couldn’t be linked. Try again."
|
|
2079
2126
|
}
|
|
2080
2127
|
}
|
|
@@ -58,7 +58,26 @@
|
|
|
58
58
|
"createInCommons": "Crea tu identidad en Commons",
|
|
59
59
|
"createAccount": "Crear cuenta",
|
|
60
60
|
"backToSignInLink": "¿Ya tienes cuenta? Inicia sesión",
|
|
61
|
-
"webSubtitle": "Sin contraseña
|
|
61
|
+
"webSubtitle": "Sin contraseña: tu dispositivo crea una passkey y un email de recuperación te devuelve el acceso si la pierdes.",
|
|
62
|
+
"username": {
|
|
63
|
+
"label": "Nombre de usuario",
|
|
64
|
+
"placeholder": "tunombre",
|
|
65
|
+
"required": "Elige un nombre de usuario.",
|
|
66
|
+
"taken": "Ese nombre de usuario ya está en uso."
|
|
67
|
+
},
|
|
68
|
+
"email": {
|
|
69
|
+
"title": "Tu email de recuperación",
|
|
70
|
+
"subtitle": "Si pierdes tu passkey, te enviamos aquí un código para volver a entrar. No se usa para nada más.",
|
|
71
|
+
"label": "Email",
|
|
72
|
+
"placeholder": "tu@ejemplo.com",
|
|
73
|
+
"invalid": "Escribe un email válido."
|
|
74
|
+
},
|
|
75
|
+
"passkey": {
|
|
76
|
+
"title": "Crea tu passkey",
|
|
77
|
+
"subtitle": "Con ella inicias sesión: tu huella, tu cara o el bloqueo de pantalla. No hay nada que recordar.",
|
|
78
|
+
"action": "Crear passkey"
|
|
79
|
+
},
|
|
80
|
+
"commonsInstead": "¿Quieres guardar tu propia clave? Usa Commons"
|
|
62
81
|
},
|
|
63
82
|
"profile": {
|
|
64
83
|
"title": "Perfil",
|
|
@@ -86,30 +105,20 @@
|
|
|
86
105
|
"search": "Buscar idiomas"
|
|
87
106
|
},
|
|
88
107
|
"recover": {
|
|
89
|
-
"title": "
|
|
90
|
-
"
|
|
91
|
-
|
|
92
|
-
"
|
|
93
|
-
"
|
|
94
|
-
"
|
|
95
|
-
},
|
|
96
|
-
"
|
|
97
|
-
|
|
98
|
-
"
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
"
|
|
103
|
-
"noEmail": "Ya no enviamos correos de recuperación. Por favor, usa tu frase de recuperación para restaurar tu identidad. Contacta con soporte si necesitas ayuda.",
|
|
104
|
-
"password": {
|
|
105
|
-
"minLength": "La contraseña debe tener al menos 8 caracteres",
|
|
106
|
-
"mismatch": "Las contraseñas no coinciden",
|
|
107
|
-
"resetFailed": "Error al restablecer la contraseña"
|
|
108
|
-
},
|
|
109
|
-
"missingCode": "Falta el código",
|
|
110
|
-
"whatsNextTitle": "¿Qué sigue?",
|
|
111
|
-
"whatsNextBody": "Ahora puedes restablecer tu contraseña o volver para iniciar sesión con tus credenciales.",
|
|
112
|
-
"completeSecure": "La recuperación de tu cuenta se ha completado de forma segura."
|
|
108
|
+
"title": "Recupera tu cuenta",
|
|
109
|
+
"subtitle": "Escribe tu nombre de usuario o tu email de recuperación. Enviaremos un código al email de recuperación de la cuenta.",
|
|
110
|
+
"identifier": {
|
|
111
|
+
"label": "Usuario o email",
|
|
112
|
+
"placeholder": "tunombre",
|
|
113
|
+
"required": "Escribe tu usuario o tu email."
|
|
114
|
+
},
|
|
115
|
+
"commonsNote": "¿Tu cuenta usa Commons? Recupérala en Commons con tu frase de recuperación.",
|
|
116
|
+
"passkey": {
|
|
117
|
+
"title": "Añade una passkey nueva",
|
|
118
|
+
"subtitle": "Para @{{username}}. Quita las passkeys perdidas después en los ajustes de seguridad de tu cuenta.",
|
|
119
|
+
"action": "Crear passkey"
|
|
120
|
+
},
|
|
121
|
+
"backToSignIn": "Volver a iniciar sesión"
|
|
113
122
|
},
|
|
114
123
|
"editProfile": {
|
|
115
124
|
"title": "Editar perfil",
|
|
@@ -1617,8 +1626,7 @@
|
|
|
1617
1626
|
"help": "Ayuda y comentarios",
|
|
1618
1627
|
"signOut": "Cerrar sesión",
|
|
1619
1628
|
"privacy": "Política de privacidad",
|
|
1620
|
-
"terms": "Términos del servicio"
|
|
1621
|
-
"identity": "Tu identidad"
|
|
1629
|
+
"terms": "Términos del servicio"
|
|
1622
1630
|
},
|
|
1623
1631
|
"accounts": {
|
|
1624
1632
|
"activeAccount": {
|
|
@@ -1835,9 +1843,16 @@
|
|
|
1835
1843
|
"openCommons": "Abrir Oxy Commons",
|
|
1836
1844
|
"commonsOpenFailed": "No se pudo abrir Oxy Commons. Ábrelo tú y ve a Ajustes > Eliminar cuenta.",
|
|
1837
1845
|
"elsewhereTitle": "Elimina tu cuenta donde está tu identidad",
|
|
1838
|
-
"elsewhereMessage": "Eliminar tu cuenta necesita tu clave de identidad, y no está en este dispositivo. Abre Oxy Commons en el dispositivo que guarda
|
|
1846
|
+
"elsewhereMessage": "Eliminar tu cuenta necesita tu clave de identidad, y no está en este dispositivo. Abre Oxy Commons en el dispositivo que la guarda y ve a Ajustes > Eliminar cuenta. Una cuenta con passkey se elimina en {{site}}.",
|
|
1839
1847
|
"gotIt": "Entendido",
|
|
1840
1848
|
"identityUnreadable": "No se pudo leer el almacén de identidad de este dispositivo. Desbloquea el dispositivo e inténtalo de nuevo."
|
|
1849
|
+
},
|
|
1850
|
+
"passkey": {
|
|
1851
|
+
"subtitle": "Confirma con tu passkey. @{{username}} y todo lo que contiene se eliminan para siempre.",
|
|
1852
|
+
"action": "Eliminar con passkey",
|
|
1853
|
+
"done": "Tu cuenta se ha eliminado.",
|
|
1854
|
+
"closeWindow": "Puedes cerrar esta ventana.",
|
|
1855
|
+
"commons": "Esta cuenta usa Commons: elimínala en Oxy Commons, Ajustes > Eliminar cuenta, con su clave."
|
|
1841
1856
|
}
|
|
1842
1857
|
},
|
|
1843
1858
|
"manageAccount": {
|
|
@@ -2076,5 +2091,37 @@
|
|
|
2076
2091
|
"allow": "Continuar a {{app}}",
|
|
2077
2092
|
"deny": "Cancelar",
|
|
2078
2093
|
"disclaimer": "Al continuar, {{app}} podrá iniciar sesión con tu cuenta de Oxy. Puedes gestionar las apps conectadas cuando quieras en los ajustes de tu cuenta de Oxy."
|
|
2094
|
+
},
|
|
2095
|
+
"emailCode": {
|
|
2096
|
+
"title": "Revisa tu email",
|
|
2097
|
+
"sentTo": "Hemos enviado un código de 6 dígitos a {{email}}.",
|
|
2098
|
+
"sentIfAccount": "Si esta cuenta tiene un email de recuperación, le hemos enviado un código de 6 dígitos.",
|
|
2099
|
+
"label": "Código",
|
|
2100
|
+
"resend": "Enviar un código nuevo",
|
|
2101
|
+
"resent": "Te hemos enviado un código nuevo.",
|
|
2102
|
+
"changeEmail": "Usar otro email",
|
|
2103
|
+
"errors": {
|
|
2104
|
+
"codeInvalid": "Ese código no es correcto o ha caducado.",
|
|
2105
|
+
"tooManyAttempts": "Demasiados códigos incorrectos. Pide uno nuevo.",
|
|
2106
|
+
"expired": "Ha pasado demasiado tiempo. Empieza de nuevo.",
|
|
2107
|
+
"unavailable": "Oxy no puede enviar emails ahora. Inténtalo más tarde.",
|
|
2108
|
+
"rateLimited": "Demasiados códigos. Inténtalo más tarde."
|
|
2109
|
+
}
|
|
2110
|
+
},
|
|
2111
|
+
"linkCommons": {
|
|
2112
|
+
"title": "Vincula Commons",
|
|
2113
|
+
"subtitle": "Guarda tu propia clave: vincula Commons y esta cuenta será solo tuya. Su email de recuperación se elimina y tu frase de recuperación en Commons es cómo vuelves a entrar.",
|
|
2114
|
+
"scan": "En tu móvil, abre Commons, elige «Tengo una cuenta de Oxy en la web» y escanea este código.",
|
|
2115
|
+
"waiting": "Esperando a Commons…",
|
|
2116
|
+
"compareTitle": "Comprueba el código",
|
|
2117
|
+
"compare": "Commons muestra el mismo código. Si no es así, cancela.",
|
|
2118
|
+
"confirm": "Sí, vincular Commons",
|
|
2119
|
+
"cancel": "Cancelar",
|
|
2120
|
+
"doneTitle": "Commons está vinculado",
|
|
2121
|
+
"done": "Esta cuenta ahora es de autocustodia. Su email de recuperación se ha eliminado: tu frase de recuperación en Commons es cómo vuelves a entrar.",
|
|
2122
|
+
"already": "Esta cuenta ya usa Commons.",
|
|
2123
|
+
"expired": "Este código ha caducado.",
|
|
2124
|
+
"renew": "Mostrar un código nuevo",
|
|
2125
|
+
"failed": "No se ha podido vincular Commons. Inténtalo de nuevo."
|
|
2079
2126
|
}
|
|
2080
2127
|
}
|