@redacto.io/consent-sdk-react 10.0.0-beta.1 → 10.0.0-beta.11

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 (84) hide show
  1. package/.turbo/turbo-build.log +11 -11
  2. package/CHANGELOG.md +109 -0
  3. package/README.md +78 -0
  4. package/dist/{chunk-6A665OPR.mjs → chunk-OGL6OC3A.mjs} +4 -0
  5. package/dist/index.d.mts +32 -4
  6. package/dist/index.d.ts +32 -4
  7. package/dist/index.js +340 -230
  8. package/dist/index.mjs +339 -231
  9. package/dist/privacy-center.d.mts +55 -12
  10. package/dist/privacy-center.d.ts +55 -12
  11. package/dist/privacy-center.js +848 -950
  12. package/dist/privacy-center.mjs +698 -802
  13. package/package.json +1 -1
  14. package/src/RedactoNoticeAssisted/RedactoNoticeAssisted.test.tsx +87 -0
  15. package/src/RedactoNoticeAssisted/RedactoNoticeAssisted.tsx +27 -0
  16. package/src/RedactoNoticeAssisted/api/index.ts +7 -1
  17. package/src/RedactoNoticeAssisted/api/types.ts +2 -0
  18. package/src/RedactoNoticeAssisted/i18n.ts +0 -55
  19. package/src/RedactoNoticeAssisted/types.ts +2 -0
  20. package/src/RedactoNoticeConsent/RedactoNoticeConsent.test.tsx +42 -8
  21. package/src/RedactoNoticeConsent/RedactoNoticeConsent.tsx +74 -33
  22. package/src/RedactoNoticeConsent/api/index.ts +88 -175
  23. package/src/RedactoNoticeConsent/api/sandbox.ts +150 -0
  24. package/src/RedactoNoticeConsent/api/types.ts +58 -43
  25. package/src/RedactoNoticeConsent/language-codes.ts +0 -2
  26. package/src/RedactoNoticeConsent/types.ts +28 -2
  27. package/src/RedactoNoticeConsentInline/RedactoNoticeConsentInline.tsx +85 -5
  28. package/src/RedactoNoticeConsentInline/api/index.ts +10 -1
  29. package/src/RedactoNoticeConsentInline/api/notice-read-routing.test.ts +72 -0
  30. package/src/RedactoNoticeConsentInline/api/types.ts +2 -0
  31. package/src/RedactoPrivacyCenter/RedactoPrivacyCenter.tsx +37 -2
  32. package/src/RedactoPrivacyCenter/api/actions.ts +3 -1
  33. package/src/RedactoPrivacyCenter/api/client.ts +122 -25
  34. package/src/RedactoPrivacyCenter/api/fetcher.ts +24 -9
  35. package/src/RedactoPrivacyCenter/components/AppShell/AppShell.tsx +28 -0
  36. package/src/RedactoPrivacyCenter/components/AppShell/UserMenu.tsx +47 -45
  37. package/src/RedactoPrivacyCenter/components/ConsentManager.tsx +2 -1
  38. package/src/RedactoPrivacyCenter/components/Form.tsx +55 -30
  39. package/src/RedactoPrivacyCenter/components/ModifyConsentModal.tsx +1 -1
  40. package/src/RedactoPrivacyCenter/components/SelectUser.tsx +25 -13
  41. package/src/RedactoPrivacyCenter/components/SelectUserGate.tsx +8 -6
  42. package/src/RedactoPrivacyCenter/components/constant.ts +3 -3
  43. package/src/RedactoPrivacyCenter/components/groupHelpers.ts +42 -6
  44. package/src/RedactoPrivacyCenter/context/AuthContext.tsx +131 -39
  45. package/src/RedactoPrivacyCenter/context/types.ts +38 -0
  46. package/src/RedactoPrivacyCenter/lib/api.ts +3 -0
  47. package/src/RedactoPrivacyCenter/lib/constants.ts +12 -6
  48. package/src/RedactoPrivacyCenter/lib/locales.ts +0 -3
  49. package/src/RedactoPrivacyCenter/lib/sandbox.ts +104 -0
  50. package/src/RedactoPrivacyCenter/lib/types.ts +25 -1
  51. package/src/RedactoPrivacyCenter/lib/utils.ts +15 -0
  52. package/src/RedactoPrivacyCenter/locales/as/translation.json +3 -3
  53. package/src/RedactoPrivacyCenter/locales/bn/translation.json +3 -3
  54. package/src/RedactoPrivacyCenter/locales/brx/translation.json +3 -3
  55. package/src/RedactoPrivacyCenter/locales/doi/translation.json +3 -3
  56. package/src/RedactoPrivacyCenter/locales/en/translation.json +4 -3
  57. package/src/RedactoPrivacyCenter/locales/gom/translation.json +3 -3
  58. package/src/RedactoPrivacyCenter/locales/gu/translation.json +3 -3
  59. package/src/RedactoPrivacyCenter/locales/hi/translation.json +3 -3
  60. package/src/RedactoPrivacyCenter/locales/kn/translation.json +3 -3
  61. package/src/RedactoPrivacyCenter/locales/ks/translation.json +3 -3
  62. package/src/RedactoPrivacyCenter/locales/mai/translation.json +3 -3
  63. package/src/RedactoPrivacyCenter/locales/ml/translation.json +3 -3
  64. package/src/RedactoPrivacyCenter/locales/mni-Mtei/translation.json +3 -3
  65. package/src/RedactoPrivacyCenter/locales/mr/translation.json +3 -3
  66. package/src/RedactoPrivacyCenter/locales/ne/translation.json +3 -3
  67. package/src/RedactoPrivacyCenter/locales/or/translation.json +3 -3
  68. package/src/RedactoPrivacyCenter/locales/pa/translation.json +3 -3
  69. package/src/RedactoPrivacyCenter/locales/sa/translation.json +3 -3
  70. package/src/RedactoPrivacyCenter/locales/sat/translation.json +3 -3
  71. package/src/RedactoPrivacyCenter/locales/sd/translation.json +3 -3
  72. package/src/RedactoPrivacyCenter/locales/ta/translation.json +3 -3
  73. package/src/RedactoPrivacyCenter/locales/te/translation.json +3 -3
  74. package/src/RedactoPrivacyCenter/locales/ur/translation.json +3 -3
  75. package/src/RedactoPrivacyCenter/styles/injectStyles.ts +7 -2
  76. package/src/RedactoPrivacyCenter/styles/pcStyles.ts +17 -0
  77. package/src/RedactoPrivacyCenter/ui/PCAvatar.test.tsx +83 -0
  78. package/src/RedactoPrivacyCenter/ui/PCAvatar.tsx +33 -9
  79. package/src/shared/notice-consent-status.ts +190 -0
  80. package/src/shared/sandbox.ts +6 -0
  81. package/tests/Form.test.tsx +142 -5
  82. package/tests/RevokeWarningMessage.test.tsx +151 -0
  83. package/tests/consentClient.test.ts +46 -0
  84. package/src/RedactoPrivacyCenter/locales/bho/translation.json +0 -340
@@ -0,0 +1,151 @@
1
+ import { render, screen } from '@testing-library/react';
2
+ import { describe, it, expect, vi } from 'vitest';
3
+
4
+ // react-i18next is an optional peer dep that is not installed in this
5
+ // package's node_modules. Stub it with a minimal `useTranslation` that
6
+ // resolves the keys used by the components under test, honouring the inline
7
+ // English fallback passed as the 2nd argument (mirrors the real i18next
8
+ // behaviour when a key is missing).
9
+ vi.mock('react-i18next', () => {
10
+ const en: Record<string, string> = {
11
+ modifyConsent: 'Modify Consent',
12
+ closeModal: 'Close',
13
+ cancel: 'Cancel',
14
+ revokeConsent: 'Revoke Consent',
15
+ revokeConsentWarning: 'If you revoke this consent, you may lose access.',
16
+ regrantConsent: 'Regrant Consent',
17
+ regrantConsentWarning: 'Regranting will restore this consent.',
18
+ aboutToModifyConsent: 'You are about to modify this consent.',
19
+ aboutToRegrantConsent: 'You are about to regrant this consent.',
20
+ noDataElementsAvailable: 'No data elements available',
21
+ noActionsAvailable: 'No actions available for this record.',
22
+ };
23
+ const interpolate = (template: string, vars?: Record<string, unknown>) =>
24
+ template.replace(/\{\{(\w+)\}\}/g, (_match, key: string) => {
25
+ const value = vars?.[key];
26
+ return value === undefined || value === null ? '' : String(value);
27
+ });
28
+ // Supports the `t(key, fallbackString)` and `t(key, opts)` call shapes used
29
+ // across the components. When the key is unknown, fall back to the inline
30
+ // English string if one was supplied, otherwise echo the key.
31
+ const t = (key: string, second?: unknown, opts?: Record<string, unknown>) => {
32
+ const fallback = typeof second === 'string' ? second : undefined;
33
+ const interpolationOpts =
34
+ typeof second === 'object' && second !== null
35
+ ? (second as Record<string, unknown>)
36
+ : opts;
37
+ const template = en[key] ?? fallback ?? key;
38
+ return interpolate(template, interpolationOpts);
39
+ };
40
+ return {
41
+ useTranslation: () => ({ t, i18n: { language: 'en' } }),
42
+ };
43
+ });
44
+
45
+ // Icon peer deps — stub the icons used by the modal.
46
+ vi.mock('lucide-react', () => ({
47
+ ChevronDownIcon: () => null,
48
+ X: () => null,
49
+ Smartphone: () => null,
50
+ LaptopMinimal: () => null,
51
+ }));
52
+
53
+ vi.mock('react-icons/pi', () => ({
54
+ PiWarningCircleBold: () => null,
55
+ }));
56
+
57
+ import { ModifyConsentModal } from '../src/RedactoPrivacyCenter/components/ModifyConsentModal';
58
+ import { NavigationProvider } from '../src/RedactoPrivacyCenter/context/NavigationContext';
59
+ import { ConsentStatusEnum } from '../src/RedactoPrivacyCenter/lib/types';
60
+ import type { ConsentModalRecord } from '../src/RedactoPrivacyCenter/lib/types';
61
+
62
+ const DEFAULT_WARNING = 'If you revoke this consent, you may lose access.';
63
+ const CUSTOM_WARNING =
64
+ 'Revoking marketing consent will stop all promotional emails immediately.';
65
+
66
+ const makeRecord = (
67
+ overrides: Partial<ConsentModalRecord> = {},
68
+ ): ConsentModalRecord => ({
69
+ purpose_uuid: 'purpose-1',
70
+ name: 'Marketing analytics',
71
+ description: 'Improve product recommendations',
72
+ status: ConsentStatusEnum.ACTIVE,
73
+ given_date: '2026-01-01T00:00:00Z',
74
+ valid_till: null,
75
+ method: 'WEB',
76
+ data_elements: [],
77
+ link_reason: null,
78
+ product_uuid: 'prod-1',
79
+ product_name: 'Acme Loyalty',
80
+ product_description: null,
81
+ nominator: null,
82
+ ...overrides,
83
+ });
84
+
85
+ const renderModal = (record: ConsentModalRecord) =>
86
+ render(
87
+ <NavigationProvider>
88
+ <ModifyConsentModal
89
+ isOpen
90
+ onClose={vi.fn()}
91
+ selectedRecord={record}
92
+ isLoading={false}
93
+ onManageConsent={vi.fn()}
94
+ />
95
+ </NavigationProvider>,
96
+ );
97
+
98
+ describe('per-purpose revoke warning message', () => {
99
+ it('shows the custom warning when revoke_warning_message is set on a revoke record', () => {
100
+ renderModal(makeRecord({ revoke_warning_message: CUSTOM_WARNING }));
101
+
102
+ expect(screen.getByText(CUSTOM_WARNING)).toBeInTheDocument();
103
+ // The localized default must be suppressed when a custom message exists.
104
+ expect(screen.queryByText(DEFAULT_WARNING)).not.toBeInTheDocument();
105
+ // Button label is untouched — still the default revoke copy.
106
+ expect(
107
+ screen.getByRole('button', { name: 'Revoke Consent' }),
108
+ ).toBeInTheDocument();
109
+ });
110
+
111
+ it('shows the localized default warning when revoke_warning_message is null', () => {
112
+ renderModal(makeRecord({ revoke_warning_message: null }));
113
+
114
+ expect(screen.getByText(DEFAULT_WARNING)).toBeInTheDocument();
115
+ expect(
116
+ screen.getByRole('button', { name: 'Revoke Consent' }),
117
+ ).toBeInTheDocument();
118
+ });
119
+
120
+ it('shows the localized default warning when revoke_warning_message is an empty string', () => {
121
+ renderModal(makeRecord({ revoke_warning_message: '' }));
122
+
123
+ expect(screen.getByText(DEFAULT_WARNING)).toBeInTheDocument();
124
+ });
125
+
126
+ it('shows the localized default warning when revoke_warning_message is absent (older backends)', () => {
127
+ renderModal(makeRecord()); // no `revoke_warning_message` field
128
+
129
+ expect(screen.getByText(DEFAULT_WARNING)).toBeInTheDocument();
130
+ expect(
131
+ screen.getByRole('button', { name: 'Revoke Consent' }),
132
+ ).toBeInTheDocument();
133
+ });
134
+
135
+ it('does not apply the custom revoke warning to the regrant branch', () => {
136
+ // A withdrawn record uses the regrant action; the per-purpose revoke
137
+ // message must never leak into the regrant warning.
138
+ renderModal(
139
+ makeRecord({
140
+ status: ConsentStatusEnum.WITHDRAWN,
141
+ revoke_warning_message: CUSTOM_WARNING,
142
+ }),
143
+ );
144
+
145
+ expect(screen.getByText('Regranting will restore this consent.')).toBeInTheDocument();
146
+ expect(screen.queryByText(CUSTOM_WARNING)).not.toBeInTheDocument();
147
+ expect(
148
+ screen.getByRole('button', { name: 'Regrant Consent' }),
149
+ ).toBeInTheDocument();
150
+ });
151
+ });
@@ -93,6 +93,24 @@ describe('createConsentClient — legacy mode (no ledgerBaseUrl)', () => {
93
93
  });
94
94
  });
95
95
 
96
+ it('records the selected language in the legacy manage-consent body', async () => {
97
+ await client.manageConsent(
98
+ baseRequest,
99
+ 'purp-1',
100
+ 'jane@example.com',
101
+ 'revoke',
102
+ undefined,
103
+ undefined,
104
+ undefined,
105
+ undefined,
106
+ undefined,
107
+ undefined,
108
+ undefined,
109
+ 'doi',
110
+ );
111
+ expect(fetchedBody()).toMatchObject({ language: 'doi' });
112
+ });
113
+
96
114
  it('routes getReceipts to the legacy dsar/privacy-center path', async () => {
97
115
  await client.getReceipts(baseRequest, { skip: 0, limit: 10 });
98
116
  expect(fetchedUrl()).toBe(`${LEGACY_PREFIX}/receipts?skip=0&limit=10`);
@@ -103,6 +121,16 @@ describe('createConsentClient — legacy mode (no ledgerBaseUrl)', () => {
103
121
  await client.getReceiptPdf(baseRequest, 'r-1');
104
122
  expect(fetchedUrl()).toBe(`${LEGACY_PREFIX}/receipts/r-1/pdf`);
105
123
  });
124
+
125
+ it('appends the language query param to getActivities when provided', async () => {
126
+ await client.getActivities(baseRequest, 0, 15, 'doi');
127
+ expect(fetchedUrl()).toContain('language=doi');
128
+ });
129
+
130
+ it('omits the language query param from getActivities for the default language', async () => {
131
+ await client.getActivities(baseRequest, 0, 15);
132
+ expect(fetchedUrl()).not.toContain('language=');
133
+ });
106
134
  });
107
135
 
108
136
  describe('createConsentClient — ledger mode (ledgerBaseUrl set)', () => {
@@ -151,6 +179,24 @@ describe('createConsentClient — ledger mode (ledgerBaseUrl set)', () => {
151
179
  });
152
180
  });
153
181
 
182
+ it('records the selected language in the ledger partial submit body', async () => {
183
+ await client.manageConsent(
184
+ baseRequest,
185
+ 'purp-1',
186
+ 'jane@example.com',
187
+ 'revoke',
188
+ undefined,
189
+ undefined,
190
+ undefined,
191
+ undefined,
192
+ undefined,
193
+ 'notice-1',
194
+ [{ uuid: 'de-1', selected: true }],
195
+ 'doi',
196
+ );
197
+ expect(fetchedBody()).toMatchObject({ language: 'doi' });
198
+ });
199
+
154
200
  it('throws from manageConsent when noticeUuid is missing', async () => {
155
201
  await expect(
156
202
  client.manageConsent(baseRequest, 'purp-1', 'jane@example.com', 'revoke'),
@@ -1,340 +0,0 @@
1
- {
2
- "consented": "सहमति दिहल गइल",
3
- "declined": "अस्वीकार कइल गइल",
4
- "withdrawn": "वापस लिहल गइल",
5
- "dateRange": "तारीख सीमा",
6
- "allTime": "सब समय",
7
- "customRange": "कस्टम सीमा",
8
- "from": "से",
9
- "to": "तक",
10
- "clearFilters": "फिल्टर साफ करीं",
11
- "myReceipt": "हमार रसीद",
12
- "myReceiptSubtitle": "आपन सहमति के रसीद देखीं",
13
- "event": "घटना",
14
- "date": "तारीख",
15
- "time": "समय",
16
- "download": "डाउनलोड करीं",
17
- "consentGranted": "सहमति दिहल गइल",
18
- "consentRevoked": "सहमति वापस लिहल गइल",
19
- "consentDeclined": "सहमति अस्वीकार कइल गइल",
20
- "consentExpired": "सहमति के अवधि खतम",
21
- "failedToFetchReceipts": "रसीद पावे में विफल",
22
- "failedToDownloadReceipt": "रसीद डाउनलोड करे में विफल",
23
- "yourPrivacyCenter": "रउरा गोपनीयता केंद्र",
24
- "yourRightsOverDataSimplified": "रउरा डेटा पर अधिकार, सरल रूप में",
25
- "description": "एप्लिकेशन गोपनीयता कानून रउरा के कुछ अधिकार देला जवन हमनी के द्वारा रउरा जानकारी के संग्रह, उपयोग, साझा करे आ संग्रह करे से जुड़ल बा, आ हम रउरा के ई अधिकार के प्रयोग करे के स्वागत करिला। कृपया नीचे दिहल फॉर्म भर दीं ताकि हम रउरा अनुरोध के सत्यापित आ पूरा कर सकीं। अधिक जानकारी खातिर, कृपया हमार आंतरिक गोपनीयता नीति पढ़ीं।",
26
- "privacyPolicy": "गोपनीयता नीति",
27
- "raiseDataRequest": "डेटा अनुरोध उठाईं",
28
- "exerciseYourRights": "रउरा अधिकार के प्रयोग करीं",
29
- "fullName": "पूरा नाम",
30
- "contact": "संपर्क",
31
- "requestType": "अनुरोध के प्रकार",
32
- "requestDetails": "अनुरोध के विवरण",
33
- "supportingDocumentation": "समर्थन दस्तावेज",
34
- "timePeriod": "समय अवधि",
35
- "additionalNote": "अतिरिक्त टिप्पणी",
36
- "captchaVerification": "कैप्चा सत्यापन",
37
- "selectRequestType": "कृपया रउरा जे अनुरोध करे चाहत बानी, ओकरा प्रकार के चयन करीं",
38
- "uploadFile": "फाइल अपलोड करे खातिर इहाँ क्लिक करीं",
39
- "uploading": "अपलोड होइत बा...",
40
- "uploadFileButton": "फाइल अपलोड",
41
- "saveDraft": "ड्राफ्ट सहेजें",
42
- "submit": "जमा करीं",
43
- "confirmCheckBox": "हम पुष्टि करीला कि हम डेटा प्रिंसिपल के ओर से ई अनुरोध दर्ज करे खातिर अधिकृत बानी",
44
- "revokeConsentModalTitle": "मिटावे के साथ सहमति भी वापस लीं?",
45
- "revokeConsentModalQuestion": "एह मिटावे के अनुरोध के उद्देश्य(न) खातिर रउआ के सक्रिय सहमति बा। का रउआ अनुरोध पूरा होखला पर ई सहमति भी वापस लिहल चाहब?",
46
- "revokeConsentModalPurposesLabel": "रउआ के मिटावे के अनुरोध में उद्देश्य",
47
- "revokeConsentModalConsentActive": "सहमति सक्रिय",
48
- "revokeConsentModalIfYesLabel": "अगर रउआ हाँ चुनब:",
49
- "revokeConsentModalIfYesBody": "जब संगठन रउआ के मिटावे के अनुरोध पूरा कर दी, त ऊपर के उद्देश्य(न) खातिर रउआ के सहमति स्वतः वापस ले लिहल जाई आ रउआ के ईमेल से सूचित कइल जाई।",
50
- "revokeConsentModalYourPurposes": "रउआ के चुनल उद्देश्य",
51
- "revokeConsentModalAndMore": "आ {{count}} गो अउरी",
52
- "revokeConsentYes": "हाँ, सहमति भी वापस लीं",
53
- "revokeConsentNo": "नाहीं, खाली मिटाईं",
54
- "erasureConsentRevokeNotice": "{{purposes}} खातिर रउआ के सहमति रउआ के अनुरोध पूरा होते स्वतः वापस ले लिहल जाई।",
55
- "requestSubmittedSuccessfully": "अनुरोध सफलतापूर्वक जमा भइल",
56
- "thankYouForSubmittingYourRequest": "रउरा अनुरोध जमा करे खातिर धन्यवाद",
57
- "caseID": "मामला आईडी",
58
- "saveThisID": "कृपया भविष्य में संदर्भ खातिर ई आईडी सहेज लीं",
59
- "confirmationSentTo": "पुष्टि भेजल गइल बा",
60
- "processRequest": "हम रउरा अनुरोध के कानून के अनुसार प्रक्रिया करब",
61
- "yourDataIsSafeWithUs": "रउरा डेटा हमनी के पास सुरक्षित बा। हम सुरक्षित प्रक्रिया के सुनिश्चित करिला",
62
- "enterYourEmail": "रउरा ईमेल दर्ज करीं",
63
- "letsConfirm": "चलीं, रउरा पहचान के पुष्टि करीं",
64
- "getOtp": "ओटीपी प्राप्त करीं",
65
- "otpVerify": "ओटीपी सत्यापन",
66
- "enterOtp": "भेजल गइल 6-अंकीय ओटीपी दर्ज करीं",
67
- "didntReceiveCode": "कोड ना मिलल?",
68
- "cancel": "रद्द करीं",
69
- "verifyOtp": "ओटीपी सत्यापित करीं",
70
- "resendOtp": "ओटीपी फेर से भेजीं",
71
- "access": "पहुंच",
72
- "deletion": "हटाव",
73
- "objection": "आपत्ति",
74
- "modify": "संशोधन",
75
- "correction": "सुधार",
76
- "selectAll": "सब चुनल जाव",
77
- "dataCollected": "संग्रहित डेटा",
78
- "selectFieldsToUpdate": "अपडेट करे खातिर फील्ड चुनल जाव",
79
- "enterCorrectValue": "प्रत्येक चुनल फील्ड खातिर सही मान दर्ज करीं",
80
- "whatDataToAccess": "कवन डेटा रउरा एक्सेस करे चाहत बानी?",
81
- "whatDataToDelete": "कवन डेटा हमनी के हटावे के चाहीं?",
82
- "objectingProcessingActivities": "कवन प्रोसेसिंग गतिविधि पर रउरा आपत्ति बा?",
83
- "whatDataToModify": "कवन डेटा हमनी के संशोधित करे के चाहीं?",
84
- "enterSixDigitOtp": "कृपया 6-अंकीय ओटीपी दर्ज करीं।",
85
- "invalidOtp": "अमान्य ओटीपी। कृपया फेर से प्रयास करीं।",
86
- "enterEmailAddress": "कृपया रउरा ईमेल पता दर्ज करीं",
87
- "enterValidEmail": "कृपया एक वैध ईमेल पता दर्ज करीं",
88
- "mustBeRegisteredUserWithOrg": "रउरा के साथे पंजीकृत उपयोगकर्ता होखे के चाहीं",
89
- "errorSendingOtp": "ओटीपी भेजे में त्रुटि",
90
- "otpSentEmail": "ओटीपी रउरा ईमेल पर भेजल गइल बा",
91
- "signedInSuccess": "सफलतापूर्वक साइन इन भइल!",
92
- "reasonOptional": "कारण (वैकल्पिक)",
93
- "backToHome": "मुख्य पृष्ठ पर वापस जाईं",
94
- "today": "आज",
95
- "last7Days": "पिछला 7 दिन",
96
- "last30Days": "पिछला 30 दिन",
97
- "last3Months": "पिछला 3 महीना",
98
- "erasure": "मिटावा",
99
- "grievance": "शिकायत",
100
- "selectGrievance": "रउआ कवन शिकायत चुने चाहत बानी?",
101
- "consentViolation": "सहमति उल्लंघन",
102
- "unlawfulProcessing": "अवैध प्रसंस्करण",
103
- "dataBreach": "डेटा उल्लंघन",
104
- "manageConsent": "सहमति प्रबंधन करीं",
105
- "manageConsentSubtitle": "एक जगह अपना सब सहमति देखीं आओर प्रबंधन करीं",
106
- "export": "निर्यात",
107
- "search": "खोजीं",
108
- "status": "स्थिति",
109
- "product": "उत्पाद",
110
- "exportConsentData": "सहमति डेटा निर्यात करीं",
111
- "exportConsentDataSubtitle": "ई अभी दिखाई देखेवला पंक्ति के CSV फाइल के रूप में डाउनलोड करेई।",
112
- "exportingIncludesFilters": "निर्यात मे ई टेबल व्यू मे लागू फिल्टर आओर खोज सम्मिलित बा।",
113
- "failedToFetchConsentData": "सहमति डेटा लाओने मे असफल",
114
- "missingInfoToRevoke": "सहमति वापस लेबे खाती जरूरी जानकारी नइखे",
115
- "consentRevokedSuccess": "सहमति कामयाबी से वापस लेल गइल।",
116
- "unableToRevokeConsent": "सहमति वापस ले सकेलम नाही",
117
- "errorRevokingConsent": "सहमति वापस लेत समय त्रुटि भइल",
118
- "consentRegrantedSuccess": "सहमति कामयाबी से फिर से देल गइल।",
119
- "unableToRegrantConsent": "सहमति फिर से दे सकेलम नाही",
120
- "consentRenewedSuccess": "सहमति कामयाबी से नवीकरण भइल।",
121
- "unableToRenewConsent": "सहमति नवीकरण कर सकेलम नाही",
122
- "nominatorNotFound": "बतावल नामांककर्ता रउआ नामांकनन में ना मिलल।",
123
- "nomineeMustSpecifyNominator": "कृपया चुनीं कि रउआ कवन नामांककर्ता के उद्देश्यन के प्रबंधन करे चाहत बानी।",
124
- "missingInfoToManage": "सहमति प्रबंधित करे खाती जरूरी जानकारी नइखे",
125
- "purpose": "उद्देश्य",
126
- "givenDate": "देल तारीख",
127
- "validTill": "मान्य तक",
128
- "untilWithdrawalNoExpiry": "वापसी तक (कोनो समाप्ति नइखे)",
129
- "method": "विधि",
130
- "action": "कार्रवाई",
131
- "modifyButton": "बदलीं",
132
- "statusActive": "सक्रिय",
133
- "statusWithdrawn": "वापस लेल गइल",
134
- "statusExpired": "समाप्त",
135
- "statusDeclined": "अस्वीकृत",
136
- "modifyConsent": "सहमति बदलीं",
137
- "aboutToModifyConsent": "रउआ अपनी सहमति बदलत बानी:",
138
- "aboutToModifyConsentOnBehalf": "रउआ {{nominator}} के ओर से सहमति में बदलाव करे वाला बानी:",
139
- "noDataElementsAvailable": "कोनो डेटा तत्व उपलब्ध नइखे",
140
- "revokeConsentWarning": "अगर रउआ ई सहमति वापस लेबें, तs ई डेटा पर निर्भर कुछ फीचर के पहुंच खो सकत बानी।",
141
- "revokeConsent": "सहमति वापस लेबें",
142
- "regrantConsent": "सहमति फिर से देबें",
143
- "regrantConsentWarning": "ई सहमति फिर से देबे पर, रउआ संगठन के ई उद्देश्य खातिर फिर से रउआ डेटा प्रोसेस करे के इजाजत देत बानी।",
144
- "aboutToRegrantConsent": "रउआ अपनी सहमति फिर से देत बानी:",
145
- "aboutToRegrantConsentOnBehalf": "रउआ {{nominator}} के ओर से सहमति फिर से देवे वाला बानी:",
146
- "renewConsent": "सहमति नवीकरण करीं",
147
- "renewConsentWarning": "ई सहमति नवीकरण करे पर, रउआ ई उद्देश्य के वैधता अवधि बढ़ा देत बानी।",
148
- "aboutToRenewConsent": "रउआ अपनी सहमति के नवीकरण करत बानी:",
149
- "aboutToRenewConsentOnBehalf": "रउआ {{nominator}} के ओर से सहमति के नवीनीकरण करे वाला बानी:",
150
- "activities": "गतिविधि",
151
- "activitiesSubtitle": "अपन गोपनीयता केंद्र गतिविधि इतिहास देखीं",
152
- "activity": "गतिविधि",
153
- "activityType": "गतिविधि प्रकार",
154
- "activityDescription": "विवरण",
155
- "timestamp": "समय",
156
- "grievanceRequests": "गोपनीयता आग्रह",
157
- "grievanceSubtitle": "अपन डेटा गोपनीयता आग्रह जमा करीं आ ट्रैक करीं",
158
- "newRequest": "नव आग्रह",
159
- "searchCasesByID": "आईडी सँ केस खोजीं",
160
- "allRequests": "सभ आग्रह",
161
- "processing": "प्रसंस्करण",
162
- "completed": "पूर्ण",
163
- "rejected": "अस्वीकृत",
164
- "filterByType": "प्रकार सँ फिल्टर करीं",
165
- "filter": "फिल्टर",
166
- "errorLoadingCaseHistory": "केस इतिहास लोड करत मे त्रुटि",
167
- "unknownError": "अज्ञात त्रुटि",
168
- "pleaseSignInToViewGrievance": "अपन शिकायत आग्रह देखै लेल साइन इन करीं",
169
- "emailNotFoundInSession": "सत्र मे ईमेल नै मिलल",
170
- "submittedOn": "जमा तिथि",
171
- "viewDetails": "विवरण देखीं",
172
- "downloadResponse": "जवाब डाउनलोड करीं",
173
- "caseDetails": "केस विवरण",
174
- "createdAt": "बनाएल तिथि",
175
- "completedAt": "पूर्ण तिथि",
176
- "requestSpecifics": "आग्रह विवरण",
177
- "purposesInvolved": "संबंधित उद्देश्य",
178
- "dataToCorrect": "सही करै लेल डेटा",
179
- "field": "क्षेत्र",
180
- "currentValue": "वर्तमान मान",
181
- "newValue": "नव मान",
182
- "grievanceTypes": "शिकायत प्रकार",
183
- "close": "बन्द करीं",
184
- "noData": "कोनो डेटा नै",
185
- "noDataTitle": "अबहीं देखावे खातिर कुछ नइखे",
186
- "noDataDescription": "रउरा खाता से जुड़ल कवनो सहमति, अनुरोध, या गतिविधि अबहीं तक ना मिलल। रउरा गोपनीयता रिकॉर्ड उपलब्ध होते ई इहाँ देखाई दिही।",
187
- "sessionExpiredTitle": "रउआ के सत्र खतम हो गइल बा",
188
- "sessionExpiredDescription": "जारी रखे खातिर कृपया फेर से साइन इन करीं।",
189
- "rowsPerPage": "पृष्ठ प्रति पंक्ति:",
190
- "pageOf": "पृष्ठ {{current}} / {{total}}",
191
- "rowsSelected": "{{total}} में से {{count}} पंक्ति चुनल गइल",
192
- "consentManager": "सहमति प्रबंधक",
193
- "badgeNew": "नया",
194
- "back": "पाछे",
195
- "signOut": "साइन आउट",
196
- "translationNotAvailable": "अनुवाद उपलब्ध नइखे।",
197
- "failedToFetchFormData": "फॉर्म डेटा लावे में नाकाम।",
198
- "requestSubmittedSuccess": "अनुरोध कामयाबी से जमा भ गेल",
199
- "requestSubmissionFailed": "अनुरोध जमा करे में नाकाम",
200
- "submissionFailed": "जमा करे में नाकाम",
201
- "failedToUploadFile": "{{fileName}} अपलोड करे में नाकाम",
202
- "fileUploadedSuccess": "फाइल कामयाबी से अपलोड भ गइल",
203
- "uploadError": "अपलोड त्रुटि: {{error}}",
204
- "pleaseEnterContactToVerify": "जांच खातिर संपर्क दर्ज करीं",
205
- "missingOrgOrWorkspace": "संगठन या वर्कस्पेस जानकारी गायब बा",
206
- "contactVerifiedSuccess": "संपर्क कामयाबी से जांच भ गइल",
207
- "unableToVerifyContact": "संपर्क जांच ना पावत। जांच करीं आ फेर प्रयास करीं।",
208
- "noUserFoundForContact": "संगठन में {{contact}} खातिर कोई प्रयोगकर्ता ना मिलल, या {{contact}} संगठन के हिस्सा नइखे",
209
- "failedToVerifyContact": "संपर्क जांच करे में नाकाम। फेर प्रयास करीं।",
210
- "verify": "सत्यापित करीं",
211
- "verifying": "सत्यापित होइत बा...",
212
- "contactPlaceholder": "abc@gmail.com",
213
- "myConsents": "हमार सहमतियन",
214
- "managing": "प्रबंधन",
215
- "consentVisibility": "सहमति दृश्यता",
216
- "managingConsentsFor": "इनकर सहमतियन के प्रबंधन:",
217
- "statusTransferred": "स्थानांतरित",
218
- "nomination": "नामांकन",
219
- "enterNomineeDetails": "नामांकित व्यक्ति के विवरण दर्ज करीं",
220
- "nomineeEmail": "नामांकित व्यक्ति के ईमेल",
221
- "nomineeEmailPlaceholder": "nominee@example.com",
222
- "nomineeMobile": "नामांकित व्यक्ति के मोबाइल",
223
- "nomineeMobilePlaceholder": "+919876543210",
224
- "descriptionLabel": "विवरण",
225
- "messages": "संदेश",
226
- "myDocuments": "हमार दस्तावेज",
227
- "submitted": "जमा भइल",
228
- "responseDue": "जवाब बाकी बा",
229
- "secureMessagesNotice": "रउआ संदेश बस गोपनीयता टीम के सुरक्षित तरीका से भेजल जाला।",
230
- "caseFinalizedMessagesTooltip": "ई केस अंतिम हो गइल बा — अब संदेस ना भेजल जा सके।",
231
- "noMessagesYet": "अबहीं तक कवनो संदेश नइखे",
232
- "writeMessagePlaceholder": "गोपनीयता टीम के संदेश लिखीं...",
233
- "attachFile": "फाइल जोड़ीं",
234
- "send": "भेजीं",
235
- "messagesSecureFooter": "संदेश बस गोपनीयता टीम के सुरक्षित तरीका से भेजल जाला",
236
- "noDocumentsYet": "अबहीं तक कवनो दस्तावेज नइखे",
237
- "errorLoadingMessages": "संदेश लोड करे में असफल। कृपया फिर से कोसिस करीं।",
238
- "refreshMessages": "संदेश ताजा करीं",
239
- "senderYou": "रउआ",
240
- "senderPrivacyTeam": "गोपनीयता टीम",
241
- "documentAccepted": "रउआ दस्तावेज स्वीकार भइल",
242
- "documentRejected": "रउआ दस्तावेज रद्द भइल",
243
- "replacementRequested": "बदली दस्तावेज के अनुरोध भइल बा",
244
- "documentRequestedLabel": "दस्तावेज अनुरोध: {{title}}",
245
- "acceptedLabel": "स्वीकार: {{accepted}}",
246
- "uploadAndSubmit": "अपलोड आ जमा करीं",
247
- "rejectionReasonLabel": "कारण: {{reason}}",
248
- "docStatusPending": "लंबित",
249
- "docStatusUnderReview": "समीक्षा में",
250
- "docStatusApproved": "मंजूर",
251
- "docStatusRejected": "रद्द",
252
- "docStatusReplacementRequested": "बदली अनुरोध",
253
- "notificationHub": "सूचना केंद्र",
254
- "notificationHubSubtitle": "रउआ सब गोपनीयता-संबंधित सूचना एक जगह",
255
- "backToManageConsent": "सहमति प्रबंधन पर वापस जाईं",
256
- "notifications": "सूचना",
257
- "total": "कुल",
258
- "unread": "अनपढ़ल",
259
- "actionNeeded": "कार्रवाई जरूरी बा",
260
- "acknowledged": "मानल गइल",
261
- "markAllAsRead": "सब के पढ़ल चिन्हित करीं",
262
- "refreshNotifications": "सूचना ताजा करीं",
263
- "all": "सब",
264
- "consent": "सहमति",
265
- "requests": "अनुरोध",
266
- "system": "सिस्टम",
267
- "loadingNotifications": "सूचना लोड हो रहल बा...",
268
- "noNotificationsInCategory": "एह श्रेणी में कवनो सूचना नइखे।",
269
- "noNotificationsYet": "अबहीं तक कवनो सूचना नइखे।",
270
- "previous": "पिछला",
271
- "next": "अगिला",
272
- "viewAllNotifications": "सब सूचना देखीं",
273
- "justNow": "अबहीं",
274
- "minutesAgo": "{{count}}मि पहिले",
275
- "hoursAgo": "{{count}}घं पहिले",
276
- "daysAgo": "{{count}}दि पहिले",
277
- "weeksAgo": "{{count}}ह पहिले",
278
- "paginationRange": "{{start}}–{{end}} / {{total}}",
279
- "poweredBy": "के द्वारा संचालित",
280
- "redactoLogoAlt": "रेडैक्टो लोगो",
281
- "switchToDarkMode": "डार्क मोड पर जाईं",
282
- "switchToLightMode": "लाइट मोड पर जाईं",
283
- "loadingEllipsis": "लोड हो रहल बा...",
284
- "loading": "लोड हो रहल बा",
285
- "clearInput": "इनपुट साफ करीं",
286
- "selectPlaceholder": "चुनीं...",
287
- "searchPlaceholder": "खोजीं...",
288
- "noOptionsFound": "कवनो विकल्प ना मिलल",
289
- "clearSelection": "चयन साफ करीं",
290
- "closeModal": "मोडल बंद करीं",
291
- "totalRecords": "कुल: {{count}} रिकॉर्ड",
292
- "goToFirstPage": "पहिला पन्ना पर जाईं",
293
- "goToPreviousPage": "पिछला पन्ना पर जाईं",
294
- "goToNextPage": "अगिला पन्ना पर जाईं",
295
- "goToLastPage": "आखिरी पन्ना पर जाईं",
296
- "openSidebarMenu": "साइडबार मेनू खोलीं",
297
- "closeSidebarMenu": "साइडबार मेनू बंद करीं",
298
- "expandSidebar": "साइडबार बड़ा करीं",
299
- "collapseSidebar": "साइडबार छोट करीं",
300
- "currentValuePlaceholder": "अबहीं के मान",
301
- "updatedValuePlaceholder": "अपडेट भइल मान",
302
- "removeAttachment": "संलग्नक हटाईं",
303
- "document": "दस्तावेज",
304
- "downloadAttachment": "{{fileName}} डाउनलोड करीं",
305
- "sortByColumn": "कॉलम अनुसार क्रमबद्ध करीं",
306
- "manage": "Manage",
307
- "consents": "Consents",
308
- "consentCount_one": "{{count}} consent",
309
- "consentCount_other": "{{count}} consents",
310
- "purposes": "Purposes",
311
- "latestActivity": "Latest activity",
312
- "activeWithCount": "{{count}} active",
313
- "withdrawnWithCount": "{{count}} withdrawn",
314
- "expiredWithCount": "{{count}} expired",
315
- "declinedWithCount": "{{count}} declined",
316
- "productsAndConsentsSummary": "{{products}} products, {{consents}} consents",
317
- "selectProductsForRequest": "Select one or more products for your {{requestType}} request",
318
- "selectProductsForRequestGeneric": "Select one or more products to continue",
319
- "yourData": "Your data",
320
- "actingOnBehalfOf": "Acting on behalf of {{nominator}}",
321
- "activePurposes_one": "{{count}} उद्देश्य",
322
- "activePurposes_other": "{{count}} उद्देश्य",
323
- "autoSelected": "Auto-selected",
324
- "noProductsAvailable": "No products available",
325
- "noProductsAvailableDescription": "You have no consents to manage yet.",
326
- "forProduct": "For {{productName}}",
327
- "actingOnBehalfOfShort": "acting on behalf of {{nominator}}",
328
- "selectPurposesForThisProduct": "Select purposes within this product.",
329
- "casesCreatedCount_one": "{{count}} case created",
330
- "casesCreatedCount_other": "{{count}} cases created",
331
- "someRequestsFailed": "Some requests failed",
332
- "retry": "Retry",
333
- "retrying": "Retrying...",
334
- "switchProfile": "प्रोफाइल बदलीं",
335
- "chooseYourProfile": "आपन प्रोफाइल चुनीं",
336
- "emailLinkedToMultipleProfiles": "{{email}} एक से ढेर प्रोफाइल से जुड़ल बा। जवन रउआ देखल चाहत बानी ओकरा के चुनीं।",
337
- "contactLinkedToMultipleProfiles": "ई संपर्क एक से ढेर प्रोफाइल से जुड़ल बा। जवन रउआ देखल चाहत बानी ओकरा के चुनीं।",
338
- "signingInEllipsis": "साइन इन हो रहल बा…",
339
- "couldNotSwitchProfile": "ओह प्रोफाइल पर स्विच ना हो सकल। कृपया फेर से कोसिस करीं।"
340
- }