@oxyhq/core 1.0.2 → 1.1.0

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.
Files changed (114) hide show
  1. package/dist/cjs/AuthManager.js +19 -9
  2. package/dist/cjs/CrossDomainAuth.js +2 -2
  3. package/dist/cjs/HttpService.js +9 -8
  4. package/dist/cjs/OxyServices.base.js +16 -3
  5. package/dist/cjs/crypto/keyManager.js +29 -24
  6. package/dist/cjs/crypto/polyfill.js +6 -1
  7. package/dist/cjs/crypto/signatureService.js +40 -31
  8. package/dist/cjs/i18n/index.js +36 -45
  9. package/dist/cjs/i18n/locales/ar-SA.json +114 -115
  10. package/dist/cjs/i18n/locales/ca-ES.json +114 -115
  11. package/dist/cjs/i18n/locales/de-DE.json +114 -115
  12. package/dist/cjs/i18n/locales/en-US.json +936 -936
  13. package/dist/cjs/i18n/locales/es-ES.json +924 -924
  14. package/dist/cjs/i18n/locales/fr-FR.json +114 -115
  15. package/dist/cjs/i18n/locales/it-IT.json +114 -115
  16. package/dist/cjs/i18n/locales/ja-JP.json +1 -1
  17. package/dist/cjs/i18n/locales/ko-KR.json +114 -115
  18. package/dist/cjs/i18n/locales/locales/ar-SA.json +120 -0
  19. package/dist/cjs/i18n/locales/locales/ca-ES.json +120 -0
  20. package/dist/cjs/i18n/locales/locales/de-DE.json +120 -0
  21. package/dist/cjs/i18n/locales/locales/en-US.json +956 -0
  22. package/dist/cjs/i18n/locales/locales/es-ES.json +944 -0
  23. package/dist/cjs/i18n/locales/locales/fr-FR.json +120 -0
  24. package/dist/cjs/i18n/locales/locales/it-IT.json +120 -0
  25. package/dist/cjs/i18n/locales/locales/ja-JP.json +119 -0
  26. package/dist/cjs/i18n/locales/locales/ko-KR.json +120 -0
  27. package/dist/cjs/i18n/locales/locales/pt-PT.json +120 -0
  28. package/dist/cjs/i18n/locales/locales/zh-CN.json +120 -0
  29. package/dist/cjs/i18n/locales/pt-PT.json +114 -115
  30. package/dist/cjs/i18n/locales/zh-CN.json +114 -115
  31. package/dist/cjs/mixins/OxyServices.fedcm.js +13 -41
  32. package/dist/cjs/mixins/OxyServices.language.js +5 -2
  33. package/dist/cjs/mixins/OxyServices.privacy.js +2 -1
  34. package/dist/cjs/mixins/OxyServices.security.js +3 -2
  35. package/dist/cjs/shared/utils/debugUtils.js +8 -1
  36. package/dist/cjs/utils/deviceManager.js +3 -1
  37. package/dist/cjs/utils/platform.js +3 -2
  38. package/dist/esm/AuthManager.js +19 -9
  39. package/dist/esm/CrossDomainAuth.js +2 -2
  40. package/dist/esm/HttpService.js +9 -8
  41. package/dist/esm/OxyServices.base.js +16 -3
  42. package/dist/esm/crypto/keyManager.js +29 -24
  43. package/dist/esm/crypto/polyfill.js +6 -1
  44. package/dist/esm/crypto/signatureService.js +40 -31
  45. package/dist/esm/i18n/index.js +11 -23
  46. package/dist/esm/i18n/locales/ar-SA.json +114 -115
  47. package/dist/esm/i18n/locales/ca-ES.json +114 -115
  48. package/dist/esm/i18n/locales/de-DE.json +114 -115
  49. package/dist/esm/i18n/locales/en-US.json +936 -936
  50. package/dist/esm/i18n/locales/es-ES.json +924 -924
  51. package/dist/esm/i18n/locales/fr-FR.json +114 -115
  52. package/dist/esm/i18n/locales/it-IT.json +114 -115
  53. package/dist/esm/i18n/locales/ja-JP.json +1 -1
  54. package/dist/esm/i18n/locales/ko-KR.json +114 -115
  55. package/dist/esm/i18n/locales/locales/ar-SA.json +120 -0
  56. package/dist/esm/i18n/locales/locales/ca-ES.json +120 -0
  57. package/dist/esm/i18n/locales/locales/de-DE.json +120 -0
  58. package/dist/esm/i18n/locales/locales/en-US.json +956 -0
  59. package/dist/esm/i18n/locales/locales/es-ES.json +944 -0
  60. package/dist/esm/i18n/locales/locales/fr-FR.json +120 -0
  61. package/dist/esm/i18n/locales/locales/it-IT.json +120 -0
  62. package/dist/esm/i18n/locales/locales/ja-JP.json +119 -0
  63. package/dist/esm/i18n/locales/locales/ko-KR.json +120 -0
  64. package/dist/esm/i18n/locales/locales/pt-PT.json +120 -0
  65. package/dist/esm/i18n/locales/locales/zh-CN.json +120 -0
  66. package/dist/esm/i18n/locales/pt-PT.json +114 -115
  67. package/dist/esm/i18n/locales/zh-CN.json +114 -115
  68. package/dist/esm/mixins/OxyServices.fedcm.js +13 -41
  69. package/dist/esm/mixins/OxyServices.language.js +5 -2
  70. package/dist/esm/mixins/OxyServices.privacy.js +2 -1
  71. package/dist/esm/mixins/OxyServices.security.js +3 -2
  72. package/dist/esm/shared/utils/debugUtils.js +8 -1
  73. package/dist/esm/utils/deviceManager.js +3 -1
  74. package/dist/esm/utils/platform.js +3 -2
  75. package/dist/types/CrossDomainAuth.d.ts +2 -2
  76. package/dist/types/OxyServices.base.d.ts +4 -1
  77. package/dist/types/OxyServices.d.ts +13 -0
  78. package/dist/types/index.d.ts +3 -0
  79. package/dist/types/mixins/OxyServices.analytics.d.ts +2 -0
  80. package/dist/types/mixins/OxyServices.assets.d.ts +2 -0
  81. package/dist/types/mixins/OxyServices.auth.d.ts +2 -0
  82. package/dist/types/mixins/OxyServices.developer.d.ts +2 -0
  83. package/dist/types/mixins/OxyServices.devices.d.ts +2 -0
  84. package/dist/types/mixins/OxyServices.features.d.ts +2 -0
  85. package/dist/types/mixins/OxyServices.fedcm.d.ts +4 -2
  86. package/dist/types/mixins/OxyServices.karma.d.ts +2 -0
  87. package/dist/types/mixins/OxyServices.language.d.ts +2 -0
  88. package/dist/types/mixins/OxyServices.location.d.ts +2 -0
  89. package/dist/types/mixins/OxyServices.payment.d.ts +2 -0
  90. package/dist/types/mixins/OxyServices.popup.d.ts +2 -0
  91. package/dist/types/mixins/OxyServices.privacy.d.ts +2 -0
  92. package/dist/types/mixins/OxyServices.redirect.d.ts +2 -0
  93. package/dist/types/mixins/OxyServices.security.d.ts +2 -0
  94. package/dist/types/mixins/OxyServices.user.d.ts +2 -0
  95. package/dist/types/mixins/OxyServices.utility.d.ts +2 -0
  96. package/package.json +1 -2
  97. package/src/AuthManager.ts +25 -15
  98. package/src/CrossDomainAuth.ts +2 -2
  99. package/src/HttpService.ts +9 -8
  100. package/src/OxyServices.base.ts +21 -4
  101. package/src/OxyServices.ts +23 -2
  102. package/src/crypto/keyManager.ts +30 -25
  103. package/src/crypto/polyfill.ts +6 -1
  104. package/src/crypto/signatureService.ts +43 -37
  105. package/src/i18n/index.ts +33 -45
  106. package/src/index.ts +3 -0
  107. package/src/mixins/OxyServices.fedcm.ts +14 -44
  108. package/src/mixins/OxyServices.language.ts +6 -3
  109. package/src/mixins/OxyServices.privacy.ts +2 -1
  110. package/src/mixins/OxyServices.security.ts +3 -2
  111. package/src/shared/utils/__tests__/debugUtils.test.ts +55 -0
  112. package/src/shared/utils/debugUtils.ts +6 -1
  113. package/src/utils/deviceManager.ts +4 -2
  114. package/src/utils/platform.ts +3 -2
@@ -26,7 +26,9 @@ function isNodeJS() {
26
26
  */
27
27
  async function initExpoCrypto() {
28
28
  if (!ExpoCrypto) {
29
- ExpoCrypto = await import('expo-crypto');
29
+ // Variable indirection prevents bundlers (Vite, webpack) from statically resolving this
30
+ const moduleName = 'expo-crypto';
31
+ ExpoCrypto = await import(moduleName);
30
32
  }
31
33
  return ExpoCrypto;
32
34
  }
@@ -34,25 +36,29 @@ async function initExpoCrypto() {
34
36
  * Compute SHA-256 hash of a string
35
37
  */
36
38
  async function sha256(message) {
37
- // In React Native, always use expo-crypto
38
- if (isReactNative() || !isNodeJS()) {
39
+ // In React Native, use expo-crypto
40
+ if (isReactNative()) {
39
41
  const Crypto = await initExpoCrypto();
40
42
  return Crypto.digestStringAsync(Crypto.CryptoDigestAlgorithm.SHA256, message);
41
43
  }
42
44
  // In Node.js, use Node's crypto module
43
- // Use Function constructor to prevent Metro bundler from statically analyzing this require
44
- // This ensures the require is only evaluated in Node.js runtime, not during Metro bundling
45
- try {
46
- // eslint-disable-next-line @typescript-eslint/no-implied-eval
47
- const getCrypto = new Function('return require("crypto")');
48
- const crypto = getCrypto();
49
- return crypto.createHash('sha256').update(message).digest('hex');
50
- }
51
- catch (error) {
52
- // Fallback to expo-crypto if Node crypto fails
53
- const Crypto = await initExpoCrypto();
54
- return Crypto.digestStringAsync(Crypto.CryptoDigestAlgorithm.SHA256, message);
45
+ if (isNodeJS()) {
46
+ try {
47
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval
48
+ const getCrypto = new Function('return require("crypto")');
49
+ const nodeCrypto = getCrypto();
50
+ return nodeCrypto.createHash('sha256').update(message).digest('hex');
51
+ }
52
+ catch {
53
+ // Fall through to Web Crypto API
54
+ }
55
55
  }
56
+ // Browser: use Web Crypto API
57
+ const encoder = new TextEncoder();
58
+ const data = encoder.encode(message);
59
+ const hashBuffer = await globalThis.crypto.subtle.digest('SHA-256', data);
60
+ const hashArray = Array.from(new Uint8Array(hashBuffer));
61
+ return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
56
62
  }
57
63
  export class SignatureService {
58
64
  /**
@@ -60,29 +66,32 @@ export class SignatureService {
60
66
  * Uses expo-crypto in React Native, crypto.randomBytes in Node.js
61
67
  */
62
68
  static async generateChallenge() {
63
- if (isReactNative() || !isNodeJS()) {
64
- // Use expo-crypto for React Native (expo-random is deprecated)
69
+ // In React Native, use expo-crypto
70
+ if (isReactNative()) {
65
71
  const Crypto = await initExpoCrypto();
66
72
  const randomBytes = await Crypto.getRandomBytesAsync(32);
67
73
  return Array.from(randomBytes)
68
74
  .map((b) => b.toString(16).padStart(2, '0'))
69
75
  .join('');
70
76
  }
71
- // Node.js fallback
72
- try {
73
- // eslint-disable-next-line @typescript-eslint/no-implied-eval
74
- const getCrypto = new Function('return require("crypto")');
75
- const crypto = getCrypto();
76
- return crypto.randomBytes(32).toString('hex');
77
- }
78
- catch (error) {
79
- // Fallback to expo-crypto if Node crypto fails
80
- const Crypto = await initExpoCrypto();
81
- const randomBytes = await Crypto.getRandomBytesAsync(32);
82
- return Array.from(randomBytes)
83
- .map((b) => b.toString(16).padStart(2, '0'))
84
- .join('');
77
+ // In Node.js, use Node's crypto module
78
+ if (isNodeJS()) {
79
+ try {
80
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval
81
+ const getCrypto = new Function('return require("crypto")');
82
+ const nodeCrypto = getCrypto();
83
+ return nodeCrypto.randomBytes(32).toString('hex');
84
+ }
85
+ catch {
86
+ // Fall through to Web Crypto API
87
+ }
85
88
  }
89
+ // Browser: use Web Crypto API
90
+ const bytes = new Uint8Array(32);
91
+ globalThis.crypto.getRandomValues(bytes);
92
+ return Array.from(bytes)
93
+ .map(b => b.toString(16).padStart(2, '0'))
94
+ .join('');
86
95
  }
87
96
  /**
88
97
  * Hash a message using SHA-256
@@ -1,26 +1,14 @@
1
- // Use JSON locale files (RN Metro supports static requires reliably)
2
- // eslint-disable-next-line @typescript-eslint/no-var-requires
3
- const enUS = require('./locales/en-US.json');
4
- // eslint-disable-next-line @typescript-eslint/no-var-requires
5
- const esES = require('./locales/es-ES.json');
6
- // eslint-disable-next-line @typescript-eslint/no-var-requires
7
- const caES = require('./locales/ca-ES.json');
8
- // eslint-disable-next-line @typescript-eslint/no-var-requires
9
- const frFR = require('./locales/fr-FR.json');
10
- // eslint-disable-next-line @typescript-eslint/no-var-requires
11
- const deDE = require('./locales/de-DE.json');
12
- // eslint-disable-next-line @typescript-eslint/no-var-requires
13
- const itIT = require('./locales/it-IT.json');
14
- // eslint-disable-next-line @typescript-eslint/no-var-requires
15
- const ptPT = require('./locales/pt-PT.json');
16
- // eslint-disable-next-line @typescript-eslint/no-var-requires
17
- const jaJP = require('./locales/ja-JP.json');
18
- // eslint-disable-next-line @typescript-eslint/no-var-requires
19
- const koKR = require('./locales/ko-KR.json');
20
- // eslint-disable-next-line @typescript-eslint/no-var-requires
21
- const zhCN = require('./locales/zh-CN.json');
22
- // eslint-disable-next-line @typescript-eslint/no-var-requires
23
- const arSA = require('./locales/ar-SA.json');
1
+ import enUS from './locales/en-US.json';
2
+ import esES from './locales/es-ES.json';
3
+ import caES from './locales/ca-ES.json';
4
+ import frFR from './locales/fr-FR.json';
5
+ import deDE from './locales/de-DE.json';
6
+ import itIT from './locales/it-IT.json';
7
+ import ptPT from './locales/pt-PT.json';
8
+ import jaJP from './locales/ja-JP.json';
9
+ import koKR from './locales/ko-KR.json';
10
+ import zhCN from './locales/zh-CN.json';
11
+ import arSA from './locales/ar-SA.json';
24
12
  const DICTS = {
25
13
  'en': enUS,
26
14
  'en-US': enUS,
@@ -1,120 +1,119 @@
1
1
  {
2
- "signin": {
3
- "title": "تسجيل الدخول",
4
- "subtitle": "سجل الدخول للمتابعة",
5
- "addAccountTitle": "إضافة حساب آخر",
6
- "addAccountSubtitle": "تسجيل الدخول بحساب آخر",
7
- "username": {
8
- "label": "اسم المستخدم",
9
- "placeholder": "أدخل اسم المستخدم",
10
- "helper": "3-30 حرفًا، أحرف وأرقام فقط",
11
- "required": "يرجى إدخال اسم المستخدم.",
12
- "minLength": "يجب أن يكون اسم المستخدم 3 أحرف على الأقل."
2
+ "signin": {
3
+ "title": "تسجيل الدخول",
4
+ "subtitle": "سجل الدخول للمتابعة",
5
+ "addAccountTitle": "إضافة حساب آخر",
6
+ "addAccountSubtitle": "تسجيل الدخول بحساب آخر",
7
+ "username": {
8
+ "label": "اسم المستخدم",
9
+ "placeholder": "أدخل اسم المستخدم",
10
+ "helper": "3-30 حرفًا، أحرف وأرقام فقط",
11
+ "required": "يرجى إدخال اسم المستخدم.",
12
+ "minLength": "يجب أن يكون اسم المستخدم 3 أحرف على الأقل."
13
+ },
14
+ "password": {
15
+ "label": "كلمة المرور",
16
+ "placeholder": "أدخل كلمة المرور",
17
+ "required": "يرجى إدخال كلمة المرور.",
18
+ "hint": "أدخل كلمة المرور لتسجيل الدخول"
19
+ },
20
+ "actions": {
21
+ "continue": "متابعة",
22
+ "back": "رجوع",
23
+ "signIn": "تسجيل الدخول",
24
+ "verify": "التحقق",
25
+ "openAccountSwitcher": "التبديل إلى حساب آخر",
26
+ "openAccountSwitcherSubtitle": "{{count}} حسابات أخرى متاحة",
27
+ "openAccountSwitcherSubtitle_singular": "حساب آخر واحد متاح",
28
+ "openAccountSwitcherSubtitle_zero": "راجع حساباتك المحفوظة",
29
+ "manageAccounts": "إدارة الحسابات المحفوظة",
30
+ "manageAccountsSubtitle": "مراجعة الجلسات أو إزالتها أو تسجيل الخروج",
31
+ "loadingOtherAccounts": "جاري تحميل الحسابات الأخرى…",
32
+ "switchAccountFailed": "لم نتمكن من التبديل بين الحسابات. يرجى المحاولة مرة أخرى."
33
+ },
34
+ "forgotPrompt": "نسيت كلمة المرور؟",
35
+ "security": {
36
+ "dataSecure": "بياناتك مشفرة وآمنة"
37
+ },
38
+ "currentlySignedInAs": "مسجل الدخول حاليًا كـ",
39
+ "alreadySignedInWith": "مسجل الدخول بالفعل بـ",
40
+ "alreadySignedIn": "مسجل الدخول بالفعل",
41
+ "alreadySignedInMessage": "هذا الحساب مسجل الدخول بالفعل. المتابعة بهذا الحساب؟",
42
+ "continueWithAccount": "متابعة",
43
+ "currentAccount": "الحالي",
44
+ "or": "أو",
45
+ "viewAllAccounts": "عرض {{count}} المزيد",
46
+ "status": {
47
+ "accountSwitched": "استخدام {{name}} الآن"
48
+ }
13
49
  },
14
- "password": {
15
- "label": "كلمة المرور",
16
- "placeholder": "أدخل كلمة المرور",
17
- "required": "يرجى إدخال كلمة المرور.",
18
- "hint": "أدخل كلمة المرور لتسجيل الدخول"
50
+ "signup": {
51
+ "welcome": {
52
+ "title": "مرحبًا بك في Oxy!",
53
+ "subtitle": "أنشئ حسابك في خطوات قليلة",
54
+ "haveAccount": "لديك حساب بالفعل؟",
55
+ "signInCta": "تسجيل الدخول"
56
+ },
57
+ "identity": {
58
+ "title": "من أنت؟",
59
+ "subtitle": "اختر اسم المستخدم وأدخل بريدك الإلكتروني"
60
+ },
61
+ "username": {
62
+ "helper": "3-30 حرفًا، أحرف وأرقام فقط",
63
+ "required": "يرجى إدخال اسم مستخدم",
64
+ "minLength": "يجب أن يكون اسم المستخدم 3 أحرف على الأقل"
65
+ },
66
+ "email": {
67
+ "required": "يرجى إدخال عنوان بريد إلكتروني",
68
+ "invalid": "يرجى إدخال عنوان بريد إلكتروني صالح",
69
+ "helper": "لن نشارك بريدك الإلكتروني أبدًا"
70
+ },
71
+ "security": {
72
+ "title": "أمّن حسابك",
73
+ "subtitle": "أنشئ كلمة مرور قوية لحماية حسابك"
74
+ },
75
+ "password": {
76
+ "helper": "8 أحرف على الأقل",
77
+ "required": "يرجى إدخال كلمة مرور",
78
+ "minLength": "يجب أن تكون كلمة المرور 8 أحرف على الأقل",
79
+ "confirmRequired": "يرجى تأكيد كلمة المرور",
80
+ "mismatch": "كلمات المرور غير متطابقة",
81
+ "confirmHint": "أعد إدخال كلمة المرور للتأكيد"
82
+ },
83
+ "summary": {
84
+ "title": "أوشكت على الانتهاء!",
85
+ "subtitle": "راجع معلوماتك وأنشئ حسابك",
86
+ "sectionTitle": "معلومات الحساب",
87
+ "fields": {
88
+ "username": "اسم المستخدم",
89
+ "email": "البريد الإلكتروني",
90
+ "password": "كلمة المرور"
91
+ },
92
+ "notSet": "غير محدد",
93
+ "securityTip": "لمزيد من الأمان، قم بتمكين المصادقة الحيوية من إعدادات الحساب بعد إنشاء حسابك.",
94
+ "legalReminder": "بإنشاء حساب، فإنك توافق على شروط الخدمة وسياسة الخصوصية الخاصة بنا."
95
+ }
19
96
  },
20
- "actions": {
21
- "continue": "متابعة",
22
- "back": "رجوع",
23
- "signIn": "تسجيل الدخول",
24
- "verify": "التحقق",
25
- "openAccountSwitcher": "التبديل إلى حساب آخر",
26
- "openAccountSwitcherSubtitle": "{{count}} حسابات أخرى متاحة",
27
- "openAccountSwitcherSubtitle_singular": "حساب آخر واحد متاح",
28
- "openAccountSwitcherSubtitle_zero": "راجع حساباتك المحفوظة",
29
- "manageAccounts": "إدارة الحسابات المحفوظة",
30
- "manageAccountsSubtitle": "مراجعة الجلسات أو إزالتها أو تسجيل الخروج",
31
- "loadingOtherAccounts": "جاري تحميل الحسابات الأخرى…",
32
- "switchAccountFailed": "لم نتمكن من التبديل بين الحسابات. يرجى المحاولة مرة أخرى."
33
- },
34
- "forgotPrompt": "نسيت كلمة المرور؟",
35
- "security": {
36
- "dataSecure": "بياناتك مشفرة وآمنة"
37
- },
38
- "currentlySignedInAs": "مسجل الدخول حاليًا كـ",
39
- "alreadySignedInWith": "مسجل الدخول بالفعل بـ",
40
- "alreadySignedIn": "مسجل الدخول بالفعل",
41
- "alreadySignedInMessage": "هذا الحساب مسجل الدخول بالفعل. المتابعة بهذا الحساب؟",
42
- "continueWithAccount": "متابعة",
43
- "currentAccount": "الحالي",
44
- "or": "أو",
45
- "viewAllAccounts": "عرض {{count}} المزيد",
46
- "status": {
47
- "accountSwitched": "استخدام {{name}} الآن"
48
- }
49
- },
50
- "signup": {
51
- "welcome": {
52
- "title": "مرحبًا بك في Oxy!",
53
- "subtitle": "أنشئ حسابك في خطوات قليلة",
54
- "haveAccount": "لديك حساب بالفعل؟",
55
- "signInCta": "تسجيل الدخول"
56
- },
57
- "identity": {
58
- "title": "من أنت؟",
59
- "subtitle": "اختر اسم المستخدم وأدخل بريدك الإلكتروني"
60
- },
61
- "username": {
62
- "helper": "3-30 حرفًا، أحرف وأرقام فقط",
63
- "required": "يرجى إدخال اسم مستخدم",
64
- "minLength": "يجب أن يكون اسم المستخدم 3 أحرف على الأقل"
65
- },
66
- "email": {
67
- "required": "يرجى إدخال عنوان بريد إلكتروني",
68
- "invalid": "يرجى إدخال عنوان بريد إلكتروني صالح",
69
- "helper": "لن نشارك بريدك الإلكتروني أبدًا"
70
- },
71
- "security": {
72
- "title": "أمّن حسابك",
73
- "subtitle": "أنشئ كلمة مرور قوية لحماية حسابك"
74
- },
75
- "password": {
76
- "helper": "8 أحرف على الأقل",
77
- "required": "يرجى إدخال كلمة مرور",
78
- "minLength": "يجب أن تكون كلمة المرور 8 أحرف على الأقل",
79
- "confirmRequired": "يرجى تأكيد كلمة المرور",
80
- "mismatch": "كلمات المرور غير متطابقة",
81
- "confirmHint": "أعد إدخال كلمة المرور للتأكيد"
82
- },
83
- "summary": {
84
- "title": "أوشكت على الانتهاء!",
85
- "subtitle": "راجع معلوماتك وأنشئ حسابك",
86
- "sectionTitle": "معلومات الحساب",
87
- "fields": {
88
- "username": "اسم المستخدم",
89
- "email": "البريد الإلكتروني",
90
- "password": "كلمة المرور"
91
- },
92
- "notSet": "غير محدد",
93
- "securityTip": "لمزيد من الأمان، قم بتمكين المصادقة الحيوية من إعدادات الحساب بعد إنشاء حسابك.",
94
- "legalReminder": "بإنشاء حساب، فإنك توافق على شروط الخدمة وسياسة الخصوصية الخاصة بنا."
95
- }
96
- },
97
- "common": {
98
- "actions": {
99
- "back": "رجوع",
100
- "continue": "متابعة",
101
- "next": "التالي",
102
- "getStarted": "ابدأ",
103
- "createAccount": "إنشاء حساب",
104
- "signIn": "تسجيل الدخول",
105
- "verify": "التحقق",
106
- "resetPassword": "إعادة تعيين كلمة المرور"
107
- },
108
- "links": {
109
- "recoverAccount": "استعادة حسابك",
110
- "signUp": "التسجيل"
111
- },
112
- "labels": {
113
- "username": "اسم المستخدم",
114
- "email": "البريد الإلكتروني",
115
- "password": "كلمة المرور",
116
- "confirmPassword": "تأكيد كلمة المرور"
97
+ "common": {
98
+ "actions": {
99
+ "back": "رجوع",
100
+ "continue": "متابعة",
101
+ "next": "التالي",
102
+ "getStarted": "ابدأ",
103
+ "createAccount": "إنشاء حساب",
104
+ "signIn": "تسجيل الدخول",
105
+ "verify": "التحقق",
106
+ "resetPassword": "إعادة تعيين كلمة المرور"
107
+ },
108
+ "links": {
109
+ "recoverAccount": "استعادة حسابك",
110
+ "signUp": "التسجيل"
111
+ },
112
+ "labels": {
113
+ "username": "اسم المستخدم",
114
+ "email": "البريد الإلكتروني",
115
+ "password": "كلمة المرور",
116
+ "confirmPassword": "تأكيد كلمة المرور"
117
+ }
117
118
  }
118
- }
119
119
  }
120
-
@@ -1,120 +1,119 @@
1
1
  {
2
- "signin": {
3
- "title": "Iniciar sessió",
4
- "subtitle": "Inicia sessió per continuar",
5
- "addAccountTitle": "Afegir un altre compte",
6
- "addAccountSubtitle": "Inicia sessió amb un altre compte",
7
- "username": {
8
- "label": "Nom d'usuari",
9
- "placeholder": "Introdueix el teu nom d'usuari",
10
- "helper": "3-30 caràcters, només lletres i números",
11
- "required": "Si us plau, introdueix el teu nom d'usuari.",
12
- "minLength": "El nom d'usuari ha de tenir almenys 3 caràcters."
2
+ "signin": {
3
+ "title": "Iniciar sessió",
4
+ "subtitle": "Inicia sessió per continuar",
5
+ "addAccountTitle": "Afegir un altre compte",
6
+ "addAccountSubtitle": "Inicia sessió amb un altre compte",
7
+ "username": {
8
+ "label": "Nom d'usuari",
9
+ "placeholder": "Introdueix el teu nom d'usuari",
10
+ "helper": "3-30 caràcters, només lletres i números",
11
+ "required": "Si us plau, introdueix el teu nom d'usuari.",
12
+ "minLength": "El nom d'usuari ha de tenir almenys 3 caràcters."
13
+ },
14
+ "password": {
15
+ "label": "Contrasenya",
16
+ "placeholder": "Introdueix la teva contrasenya",
17
+ "required": "Si us plau, introdueix la teva contrasenya.",
18
+ "hint": "Introdueix la teva contrasenya per iniciar sessió"
19
+ },
20
+ "actions": {
21
+ "continue": "Continuar",
22
+ "back": "Enrere",
23
+ "signIn": "Iniciar sessió",
24
+ "verify": "Verificar",
25
+ "openAccountSwitcher": "Canviar a un altre compte",
26
+ "openAccountSwitcherSubtitle": "{{count}} altres comptes disponibles",
27
+ "openAccountSwitcherSubtitle_singular": "1 altre compte disponible",
28
+ "openAccountSwitcherSubtitle_zero": "Revisa els teus comptes guardats",
29
+ "manageAccounts": "Gestionar comptes guardats",
30
+ "manageAccountsSubtitle": "Revisar sessions, eliminar o tancar sessió",
31
+ "loadingOtherAccounts": "Carregant altres comptes…",
32
+ "switchAccountFailed": "No hem pogut canviar de compte. Torna-ho a intentar."
33
+ },
34
+ "forgotPrompt": "Has oblidat la teva contrasenya?",
35
+ "security": {
36
+ "dataSecure": "Les teves dades estan xifrades i segures"
37
+ },
38
+ "currentlySignedInAs": "Actualment has iniciat sessió com",
39
+ "alreadySignedInWith": "Ja has iniciat sessió amb",
40
+ "alreadySignedIn": "Ja has iniciat sessió",
41
+ "alreadySignedInMessage": "Aquest compte ja ha iniciat sessió. Continuar amb aquest compte?",
42
+ "continueWithAccount": "Continuar",
43
+ "currentAccount": "Actual",
44
+ "or": "o",
45
+ "viewAllAccounts": "Veure {{count}} més",
46
+ "status": {
47
+ "accountSwitched": "Ara utilitzant {{name}}"
48
+ }
13
49
  },
14
- "password": {
15
- "label": "Contrasenya",
16
- "placeholder": "Introdueix la teva contrasenya",
17
- "required": "Si us plau, introdueix la teva contrasenya.",
18
- "hint": "Introdueix la teva contrasenya per iniciar sessió"
50
+ "signup": {
51
+ "welcome": {
52
+ "title": "Benvingut a Oxy!",
53
+ "subtitle": "Crea el teu compte en pocs passos",
54
+ "haveAccount": "Ja tens un compte?",
55
+ "signInCta": "Inicia sessió"
56
+ },
57
+ "identity": {
58
+ "title": "Qui ets?",
59
+ "subtitle": "Tria el teu nom d'usuari i introdueix el teu correu"
60
+ },
61
+ "username": {
62
+ "helper": "3-30 caràcters, només lletres i números",
63
+ "required": "Si us plau, introdueix un nom d'usuari",
64
+ "minLength": "El nom d'usuari ha de tenir almenys 3 caràcters"
65
+ },
66
+ "email": {
67
+ "required": "Si us plau, introdueix una adreça de correu electrònic",
68
+ "invalid": "Si us plau, introdueix una adreça de correu electrònic vàlida",
69
+ "helper": "Mai compartirem el teu correu"
70
+ },
71
+ "security": {
72
+ "title": "Protegeix el teu compte",
73
+ "subtitle": "Crea una contrasenya forta per protegir el teu compte"
74
+ },
75
+ "password": {
76
+ "helper": "Almenys 8 caràcters",
77
+ "required": "Si us plau, introdueix una contrasenya",
78
+ "minLength": "La contrasenya ha de tenir almenys 8 caràcters",
79
+ "confirmRequired": "Si us plau, confirma la teva contrasenya",
80
+ "mismatch": "Les contrasenyes no coincideixen",
81
+ "confirmHint": "Torna a introduir la teva contrasenya per confirmar"
82
+ },
83
+ "summary": {
84
+ "title": "Gairebé allà!",
85
+ "subtitle": "Revisa la teva informació i crea el teu compte",
86
+ "sectionTitle": "Informació del compte",
87
+ "fields": {
88
+ "username": "Nom d'usuari",
89
+ "email": "Correu electrònic",
90
+ "password": "Contrasenya"
91
+ },
92
+ "notSet": "No definit",
93
+ "securityTip": "Per a una major seguretat, habilita l'autenticació biomètrica des de Configuració del compte després de crear el teu compte.",
94
+ "legalReminder": "En crear un compte, acceptes els nostres Termes de servei i Política de privacitat."
95
+ }
19
96
  },
20
- "actions": {
21
- "continue": "Continuar",
22
- "back": "Enrere",
23
- "signIn": "Iniciar sessió",
24
- "verify": "Verificar",
25
- "openAccountSwitcher": "Canviar a un altre compte",
26
- "openAccountSwitcherSubtitle": "{{count}} altres comptes disponibles",
27
- "openAccountSwitcherSubtitle_singular": "1 altre compte disponible",
28
- "openAccountSwitcherSubtitle_zero": "Revisa els teus comptes guardats",
29
- "manageAccounts": "Gestionar comptes guardats",
30
- "manageAccountsSubtitle": "Revisar sessions, eliminar o tancar sessió",
31
- "loadingOtherAccounts": "Carregant altres comptes…",
32
- "switchAccountFailed": "No hem pogut canviar de compte. Torna-ho a intentar."
33
- },
34
- "forgotPrompt": "Has oblidat la teva contrasenya?",
35
- "security": {
36
- "dataSecure": "Les teves dades estan xifrades i segures"
37
- },
38
- "currentlySignedInAs": "Actualment has iniciat sessió com",
39
- "alreadySignedInWith": "Ja has iniciat sessió amb",
40
- "alreadySignedIn": "Ja has iniciat sessió",
41
- "alreadySignedInMessage": "Aquest compte ja ha iniciat sessió. Continuar amb aquest compte?",
42
- "continueWithAccount": "Continuar",
43
- "currentAccount": "Actual",
44
- "or": "o",
45
- "viewAllAccounts": "Veure {{count}} més",
46
- "status": {
47
- "accountSwitched": "Ara utilitzant {{name}}"
48
- }
49
- },
50
- "signup": {
51
- "welcome": {
52
- "title": "Benvingut a Oxy!",
53
- "subtitle": "Crea el teu compte en pocs passos",
54
- "haveAccount": "Ja tens un compte?",
55
- "signInCta": "Inicia sessió"
56
- },
57
- "identity": {
58
- "title": "Qui ets?",
59
- "subtitle": "Tria el teu nom d'usuari i introdueix el teu correu"
60
- },
61
- "username": {
62
- "helper": "3-30 caràcters, només lletres i números",
63
- "required": "Si us plau, introdueix un nom d'usuari",
64
- "minLength": "El nom d'usuari ha de tenir almenys 3 caràcters"
65
- },
66
- "email": {
67
- "required": "Si us plau, introdueix una adreça de correu electrònic",
68
- "invalid": "Si us plau, introdueix una adreça de correu electrònic vàlida",
69
- "helper": "Mai compartirem el teu correu"
70
- },
71
- "security": {
72
- "title": "Protegeix el teu compte",
73
- "subtitle": "Crea una contrasenya forta per protegir el teu compte"
74
- },
75
- "password": {
76
- "helper": "Almenys 8 caràcters",
77
- "required": "Si us plau, introdueix una contrasenya",
78
- "minLength": "La contrasenya ha de tenir almenys 8 caràcters",
79
- "confirmRequired": "Si us plau, confirma la teva contrasenya",
80
- "mismatch": "Les contrasenyes no coincideixen",
81
- "confirmHint": "Torna a introduir la teva contrasenya per confirmar"
82
- },
83
- "summary": {
84
- "title": "Gairebé allà!",
85
- "subtitle": "Revisa la teva informació i crea el teu compte",
86
- "sectionTitle": "Informació del compte",
87
- "fields": {
88
- "username": "Nom d'usuari",
89
- "email": "Correu electrònic",
90
- "password": "Contrasenya"
91
- },
92
- "notSet": "No definit",
93
- "securityTip": "Per a una major seguretat, habilita l'autenticació biomètrica des de Configuració del compte després de crear el teu compte.",
94
- "legalReminder": "En crear un compte, acceptes els nostres Termes de servei i Política de privacitat."
95
- }
96
- },
97
- "common": {
98
- "actions": {
99
- "back": "Enrere",
100
- "continue": "Continuar",
101
- "next": "Següent",
102
- "getStarted": "Començar",
103
- "createAccount": "Crear compte",
104
- "signIn": "Iniciar sessió",
105
- "verify": "Verificar",
106
- "resetPassword": "Restablir contrasenya"
107
- },
108
- "links": {
109
- "recoverAccount": "Recuperar el teu compte",
110
- "signUp": "Registrar-se"
111
- },
112
- "labels": {
113
- "username": "Nom d'usuari",
114
- "email": "Correu electrònic",
115
- "password": "Contrasenya",
116
- "confirmPassword": "Confirmar contrasenya"
97
+ "common": {
98
+ "actions": {
99
+ "back": "Enrere",
100
+ "continue": "Continuar",
101
+ "next": "Següent",
102
+ "getStarted": "Començar",
103
+ "createAccount": "Crear compte",
104
+ "signIn": "Iniciar sessió",
105
+ "verify": "Verificar",
106
+ "resetPassword": "Restablir contrasenya"
107
+ },
108
+ "links": {
109
+ "recoverAccount": "Recuperar el teu compte",
110
+ "signUp": "Registrar-se"
111
+ },
112
+ "labels": {
113
+ "username": "Nom d'usuari",
114
+ "email": "Correu electrònic",
115
+ "password": "Contrasenya",
116
+ "confirmPassword": "Confirmar contrasenya"
117
+ }
117
118
  }
118
- }
119
119
  }
120
-