@hexar/biometric-identity-sdk-core 1.0.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 (59) hide show
  1. package/dist/BiometricIdentitySDK.d.ts +111 -0
  2. package/dist/BiometricIdentitySDK.js +395 -0
  3. package/dist/ai-models/FaceDetector.d.ts +59 -0
  4. package/dist/ai-models/FaceDetector.js +167 -0
  5. package/dist/ai-models/LivenessDetector.d.ts +61 -0
  6. package/dist/ai-models/LivenessDetector.js +218 -0
  7. package/dist/api/BackendClient.d.ts +178 -0
  8. package/dist/api/BackendClient.js +199 -0
  9. package/dist/api/index.d.ts +5 -0
  10. package/dist/api/index.js +8 -0
  11. package/dist/encryption/index.d.ts +38 -0
  12. package/dist/encryption/index.js +99 -0
  13. package/dist/i18n/index.d.ts +6 -0
  14. package/dist/i18n/index.js +47 -0
  15. package/dist/i18n/languages/en.d.ts +2 -0
  16. package/dist/i18n/languages/en.js +112 -0
  17. package/dist/i18n/languages/es-AR.d.ts +2 -0
  18. package/dist/i18n/languages/es-AR.js +112 -0
  19. package/dist/i18n/languages/es.d.ts +2 -0
  20. package/dist/i18n/languages/es.js +112 -0
  21. package/dist/i18n/languages/pt-BR.d.ts +2 -0
  22. package/dist/i18n/languages/pt-BR.js +112 -0
  23. package/dist/i18n/types.d.ts +110 -0
  24. package/dist/i18n/types.js +2 -0
  25. package/dist/index.d.ts +20 -0
  26. package/dist/index.js +64 -0
  27. package/dist/services/BackendValidationService.d.ts +84 -0
  28. package/dist/services/BackendValidationService.js +174 -0
  29. package/dist/services/IValidationService.d.ts +132 -0
  30. package/dist/services/IValidationService.js +8 -0
  31. package/dist/services/index.d.ts +8 -0
  32. package/dist/services/index.js +10 -0
  33. package/dist/types/index.d.ts +288 -0
  34. package/dist/types/index.js +34 -0
  35. package/dist/validation/DocumentValidator.d.ts +84 -0
  36. package/dist/validation/DocumentValidator.js +295 -0
  37. package/dist/validation/OCREngine.d.ts +75 -0
  38. package/dist/validation/OCREngine.js +225 -0
  39. package/package.json +24 -0
  40. package/src/BiometricIdentitySDK.ts +493 -0
  41. package/src/ai-models/FaceDetector.ts +200 -0
  42. package/src/ai-models/LivenessDetector.ts +274 -0
  43. package/src/api/BackendClient.ts +395 -0
  44. package/src/api/index.ts +15 -0
  45. package/src/encryption/index.ts +108 -0
  46. package/src/i18n/index.ts +35 -0
  47. package/src/i18n/languages/en.ts +121 -0
  48. package/src/i18n/languages/es-AR.ts +121 -0
  49. package/src/i18n/languages/es.ts +121 -0
  50. package/src/i18n/languages/pt-BR.ts +121 -0
  51. package/src/i18n/types.ts +121 -0
  52. package/src/index.ts +54 -0
  53. package/src/services/BackendValidationService.ts +228 -0
  54. package/src/services/IValidationService.ts +158 -0
  55. package/src/services/index.ts +17 -0
  56. package/src/types/index.ts +380 -0
  57. package/src/validation/DocumentValidator.ts +353 -0
  58. package/src/validation/OCREngine.ts +265 -0
  59. package/tsconfig.json +20 -0
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Encryption utilities for secure data transmission
3
+ */
4
+
5
+ import crypto from 'crypto';
6
+ import { EncryptedData } from '../types';
7
+
8
+ export class EncryptionService {
9
+ private algorithm = 'aes-256-gcm' as const;
10
+ private keyLength = 32; // 256 bits
11
+
12
+ constructor(private encryptionKey?: string) {
13
+ if (!encryptionKey) {
14
+ // Generate a random key if not provided
15
+ this.encryptionKey = crypto.randomBytes(this.keyLength).toString('hex');
16
+ }
17
+ }
18
+
19
+ /**
20
+ * Encrypt data using AES-256-GCM
21
+ */
22
+ async encrypt(data: string): Promise<EncryptedData> {
23
+ try {
24
+ const key = Buffer.from(this.encryptionKey!, 'hex').slice(0, this.keyLength);
25
+ const iv = crypto.randomBytes(16);
26
+
27
+ const cipher = crypto.createCipheriv(this.algorithm, key, iv) as crypto.CipherGCM;
28
+
29
+ let encrypted = cipher.update(data, 'utf8', 'base64');
30
+ encrypted += cipher.final('base64');
31
+
32
+ const authTag = cipher.getAuthTag();
33
+
34
+ return {
35
+ data: encrypted,
36
+ iv: iv.toString('base64'),
37
+ tag: authTag.toString('base64'),
38
+ algorithm: this.algorithm,
39
+ };
40
+ } catch (error) {
41
+ throw new Error(`Encryption failed: ${error}`);
42
+ }
43
+ }
44
+
45
+ /**
46
+ * Decrypt data using AES-256-GCM
47
+ */
48
+ async decrypt(encryptedData: EncryptedData): Promise<string> {
49
+ try {
50
+ const key = Buffer.from(this.encryptionKey!, 'hex').slice(0, this.keyLength);
51
+ const iv = Buffer.from(encryptedData.iv, 'base64');
52
+ const authTag = Buffer.from(encryptedData.tag || '', 'base64');
53
+
54
+ const decipher = crypto.createDecipheriv(this.algorithm, key, iv) as crypto.DecipherGCM;
55
+ decipher.setAuthTag(authTag);
56
+
57
+ let decrypted = decipher.update(encryptedData.data, 'base64', 'utf8');
58
+ decrypted += decipher.final('utf8');
59
+
60
+ return decrypted;
61
+ } catch (error) {
62
+ throw new Error(`Decryption failed: ${error}`);
63
+ }
64
+ }
65
+
66
+ /**
67
+ * Encrypt image data (base64)
68
+ */
69
+ async encryptImage(base64Image: string): Promise<EncryptedData> {
70
+ return this.encrypt(base64Image);
71
+ }
72
+
73
+ /**
74
+ * Hash data using SHA-256
75
+ */
76
+ hash(data: string): string {
77
+ return crypto.createHash('sha256').update(data).digest('hex');
78
+ }
79
+
80
+ /**
81
+ * Generate secure random token
82
+ */
83
+ generateToken(length: number = 32): string {
84
+ return crypto.randomBytes(length).toString('hex');
85
+ }
86
+ }
87
+
88
+ /**
89
+ * Encrypt multiple images for batch processing
90
+ */
91
+ export async function encryptImages(
92
+ images: string[],
93
+ encryptionKey?: string
94
+ ): Promise<EncryptedData[]> {
95
+ const service = new EncryptionService(encryptionKey);
96
+ return Promise.all(images.map(img => service.encryptImage(img)));
97
+ }
98
+
99
+ /**
100
+ * Create integrity signature for data
101
+ */
102
+ export function createIntegritySignature(data: any): string {
103
+ const dataString = JSON.stringify(data);
104
+ return crypto
105
+ .createHmac('sha256', 'biometric-identity-sdk')
106
+ .update(dataString)
107
+ .digest('hex');
108
+ }
@@ -0,0 +1,35 @@
1
+ import { SupportedLanguage, LanguageStrings } from './types';
2
+ import { en } from './languages/en';
3
+ import { es } from './languages/es';
4
+ import { esAR } from './languages/es-AR';
5
+ import { ptBR } from './languages/pt-BR';
6
+
7
+ const languages: Record<SupportedLanguage, LanguageStrings> = {
8
+ 'en': en,
9
+ 'es': es,
10
+ 'es-AR': esAR,
11
+ 'pt-BR': ptBR,
12
+ };
13
+
14
+ let currentLanguage: SupportedLanguage = 'en';
15
+
16
+ export const setLanguage = (lang: SupportedLanguage): void => {
17
+ if (languages[lang]) {
18
+ currentLanguage = lang;
19
+ } else {
20
+ console.warn(`Language ${lang} not supported, falling back to English`);
21
+ currentLanguage = 'en';
22
+ }
23
+ };
24
+
25
+ export const getStrings = (): LanguageStrings => {
26
+ return languages[currentLanguage];
27
+ };
28
+
29
+ export const getCurrentLanguage = (): SupportedLanguage => {
30
+ return currentLanguage;
31
+ };
32
+
33
+ export { SupportedLanguage, LanguageStrings };
34
+ export * from './types';
35
+
@@ -0,0 +1,121 @@
1
+ import { LanguageStrings } from '../types';
2
+
3
+ export const en: LanguageStrings = {
4
+ common: {
5
+ loading: 'Loading...',
6
+ error: 'Error',
7
+ retry: 'Retry',
8
+ cancel: 'Cancel',
9
+ continue: 'Continue',
10
+ close: 'Close',
11
+ done: 'Done',
12
+ },
13
+
14
+ initialization: {
15
+ initializing: 'Initializing...',
16
+ connectingToServer: 'Connecting to server...',
17
+ loadingModels: 'Loading AI models...',
18
+ },
19
+
20
+ instructions: {
21
+ title: 'Identity Verification',
22
+ subtitle: 'Follow these steps to verify your identity',
23
+ step1: 'Capture front of ID',
24
+ step2: 'Capture back of ID',
25
+ step3: 'Record face video',
26
+ startButton: 'Start Verification',
27
+ requirements: {
28
+ goodLighting: 'Good lighting',
29
+ clearDocument: 'Clear document',
30
+ stableHand: 'Stable hand',
31
+ followInstructions: 'Follow instructions',
32
+ },
33
+ },
34
+
35
+ capture: {
36
+ frontId: {
37
+ title: 'Front of ID',
38
+ instruction: 'Position the front of your ID within the frame',
39
+ button: 'Capture Front ID',
40
+ },
41
+ backId: {
42
+ title: 'Back of ID',
43
+ instruction: 'Position the back of your ID within the frame',
44
+ button: 'Capture Back ID',
45
+ },
46
+ selfie: {
47
+ title: 'Face Photo',
48
+ instruction: 'Position your face within the frame',
49
+ button: 'Take Photo',
50
+ },
51
+ },
52
+
53
+ liveness: {
54
+ title: 'Face Verification',
55
+ preparing: 'Preparing verification...',
56
+ instructions: {
57
+ lookLeft: 'Look to the left',
58
+ lookRight: 'Look to the right',
59
+ lookUp: 'Look up',
60
+ lookDown: 'Look down',
61
+ smile: 'Smile',
62
+ blink: 'Blink naturally',
63
+ turnHeadLeft: 'Turn your head to the left',
64
+ turnHeadRight: 'Turn your head to the right',
65
+ stayStill: 'Stay still',
66
+ },
67
+ recording: 'Recording...',
68
+ processing: 'Processing video...',
69
+ },
70
+
71
+ validation: {
72
+ title: 'Validating',
73
+ validating: 'Validating your identity...',
74
+ checkingDocument: 'Checking document authenticity...',
75
+ checkingLiveness: 'Verifying liveness...',
76
+ matchingFaces: 'Matching faces...',
77
+ almostDone: 'Almost done...',
78
+ },
79
+
80
+ result: {
81
+ success: {
82
+ title: 'Verification Successful',
83
+ message: 'Your identity has been verified successfully',
84
+ verificationComplete: 'Verification Complete',
85
+ },
86
+ failure: {
87
+ title: 'Verification Failed',
88
+ message: 'We could not verify your identity',
89
+ tryAgain: 'Please try again',
90
+ },
91
+ },
92
+
93
+ errors: {
94
+ cameraPermissionDenied: 'Camera permission denied. Please enable camera access in settings.',
95
+ cameraNotAvailable: 'Camera not available.',
96
+ faceNotDetected: 'Face not detected. Please position your face clearly.',
97
+ multipleFacesDetected: 'Multiple faces detected. Only one person should be in frame.',
98
+ documentNotDetected: 'Document not detected. Please position your ID clearly.',
99
+ poorImageQuality: 'Image quality too low. Please ensure good lighting.',
100
+ livenessCheckFailed: 'Liveness check failed. Please try again.',
101
+ faceMatchFailed: 'Face does not match document photo.',
102
+ documentTampered: 'Document appears to be tampered or fraudulent.',
103
+ networkError: 'Network error. Please check your connection.',
104
+ timeout: 'Request timeout. Please try again.',
105
+ unknownError: 'An unexpected error occurred.',
106
+ },
107
+
108
+ badges: {
109
+ secureVerification: 'Secure AI Verification',
110
+ aiPowered: 'AI-Powered',
111
+ verified: 'Verified',
112
+ },
113
+
114
+ steps: {
115
+ frontId: 'Front ID',
116
+ backId: 'Back ID',
117
+ faceVideo: 'Face Video',
118
+ validation: 'Validation',
119
+ },
120
+ };
121
+
@@ -0,0 +1,121 @@
1
+ import { LanguageStrings } from '../types';
2
+
3
+ export const esAR: LanguageStrings = {
4
+ common: {
5
+ loading: 'Cargando...',
6
+ error: 'Error',
7
+ retry: 'Reintentar',
8
+ cancel: 'Cancelar',
9
+ continue: 'Continuar',
10
+ close: 'Cerrar',
11
+ done: 'Listo',
12
+ },
13
+
14
+ initialization: {
15
+ initializing: 'Iniciando...',
16
+ connectingToServer: 'Conectando al servidor...',
17
+ loadingModels: 'Cargando modelos de IA...',
18
+ },
19
+
20
+ instructions: {
21
+ title: 'Verificación de Identidad',
22
+ subtitle: 'Seguí estos pasos para verificar tu identidad',
23
+ step1: 'Capturá el frente de tu documento',
24
+ step2: 'Capturá el dorso de tu documento',
25
+ step3: 'Grabá un video de tu rostro',
26
+ startButton: 'Iniciar Verificación',
27
+ requirements: {
28
+ goodLighting: 'Buena iluminación',
29
+ clearDocument: 'Documento claro',
30
+ stableHand: 'Mano firme',
31
+ followInstructions: 'Seguí las instrucciones',
32
+ },
33
+ },
34
+
35
+ capture: {
36
+ frontId: {
37
+ title: 'Frente del Documento',
38
+ instruction: 'Posicioná el frente de tu documento dentro del marco',
39
+ button: 'Capturar Frente',
40
+ },
41
+ backId: {
42
+ title: 'Dorso del Documento',
43
+ instruction: 'Posicioná el dorso de tu documento dentro del marco',
44
+ button: 'Capturar Dorso',
45
+ },
46
+ selfie: {
47
+ title: 'Foto de Rostro',
48
+ instruction: 'Posicioná tu rostro dentro del marco',
49
+ button: 'Tomar Foto',
50
+ },
51
+ },
52
+
53
+ liveness: {
54
+ title: 'Verificación Facial',
55
+ preparing: 'Preparando verificación...',
56
+ instructions: {
57
+ lookLeft: 'Mirá a la izquierda',
58
+ lookRight: 'Mirá a la derecha',
59
+ lookUp: 'Mirá hacia arriba',
60
+ lookDown: 'Mirá hacia abajo',
61
+ smile: 'Sonreí',
62
+ blink: 'Parpadeá naturalmente',
63
+ turnHeadLeft: 'Girá tu cabeza a la izquierda',
64
+ turnHeadRight: 'Girá tu cabeza a la derecha',
65
+ stayStill: 'Quedate quieto',
66
+ },
67
+ recording: 'Grabando...',
68
+ processing: 'Procesando video...',
69
+ },
70
+
71
+ validation: {
72
+ title: 'Validando',
73
+ validating: 'Validando tu identidad...',
74
+ checkingDocument: 'Verificando autenticidad del documento...',
75
+ checkingLiveness: 'Verificando prueba de vida...',
76
+ matchingFaces: 'Comparando rostros...',
77
+ almostDone: 'Ya casi terminamos...',
78
+ },
79
+
80
+ result: {
81
+ success: {
82
+ title: 'Verificación Exitosa',
83
+ message: 'Tu identidad fue verificada correctamente',
84
+ verificationComplete: 'Verificación Completa',
85
+ },
86
+ failure: {
87
+ title: 'Verificación Fallida',
88
+ message: 'No pudimos verificar tu identidad',
89
+ tryAgain: 'Por favor, intentá nuevamente',
90
+ },
91
+ },
92
+
93
+ errors: {
94
+ cameraPermissionDenied: 'Permiso de cámara denegado. Habilitá el acceso en configuración.',
95
+ cameraNotAvailable: 'Cámara no disponible.',
96
+ faceNotDetected: 'Rostro no detectado. Posicioná tu cara claramente.',
97
+ multipleFacesDetected: 'Múltiples rostros detectados. Solo debe haber una persona.',
98
+ documentNotDetected: 'Documento no detectado. Posicioná tu documento claramente.',
99
+ poorImageQuality: 'Calidad de imagen baja. Asegurate de tener buena iluminación.',
100
+ livenessCheckFailed: 'Prueba de vida fallida. Intentá nuevamente.',
101
+ faceMatchFailed: 'El rostro no coincide con la foto del documento.',
102
+ documentTampered: 'El documento parece estar alterado o ser fraudulento.',
103
+ networkError: 'Error de red. Verificá tu conexión.',
104
+ timeout: 'Tiempo de espera agotado. Intentá nuevamente.',
105
+ unknownError: 'Ocurrió un error inesperado.',
106
+ },
107
+
108
+ badges: {
109
+ secureVerification: 'Verificación Segura con IA',
110
+ aiPowered: 'Impulsado por IA',
111
+ verified: 'Verificado',
112
+ },
113
+
114
+ steps: {
115
+ frontId: 'Frente',
116
+ backId: 'Dorso',
117
+ faceVideo: 'Video',
118
+ validation: 'Validación',
119
+ },
120
+ };
121
+
@@ -0,0 +1,121 @@
1
+ import { LanguageStrings } from '../types';
2
+
3
+ export const es: LanguageStrings = {
4
+ common: {
5
+ loading: 'Cargando...',
6
+ error: 'Error',
7
+ retry: 'Reintentar',
8
+ cancel: 'Cancelar',
9
+ continue: 'Continuar',
10
+ close: 'Cerrar',
11
+ done: 'Listo',
12
+ },
13
+
14
+ initialization: {
15
+ initializing: 'Iniciando...',
16
+ connectingToServer: 'Conectando al servidor...',
17
+ loadingModels: 'Cargando modelos de IA...',
18
+ },
19
+
20
+ instructions: {
21
+ title: 'Verificación de Identidad',
22
+ subtitle: 'Sigue estos pasos para verificar tu identidad',
23
+ step1: 'Captura el frente de tu documento',
24
+ step2: 'Captura el reverso de tu documento',
25
+ step3: 'Graba un video de tu rostro',
26
+ startButton: 'Iniciar Verificación',
27
+ requirements: {
28
+ goodLighting: 'Buena iluminación',
29
+ clearDocument: 'Documento claro',
30
+ stableHand: 'Mano estable',
31
+ followInstructions: 'Sigue las instrucciones',
32
+ },
33
+ },
34
+
35
+ capture: {
36
+ frontId: {
37
+ title: 'Frente del Documento',
38
+ instruction: 'Posiciona el frente de tu documento dentro del marco',
39
+ button: 'Capturar Frente',
40
+ },
41
+ backId: {
42
+ title: 'Reverso del Documento',
43
+ instruction: 'Posiciona el reverso de tu documento dentro del marco',
44
+ button: 'Capturar Reverso',
45
+ },
46
+ selfie: {
47
+ title: 'Foto de Rostro',
48
+ instruction: 'Posiciona tu rostro dentro del marco',
49
+ button: 'Tomar Foto',
50
+ },
51
+ },
52
+
53
+ liveness: {
54
+ title: 'Verificación Facial',
55
+ preparing: 'Preparando verificación...',
56
+ instructions: {
57
+ lookLeft: 'Mira a la izquierda',
58
+ lookRight: 'Mira a la derecha',
59
+ lookUp: 'Mira hacia arriba',
60
+ lookDown: 'Mira hacia abajo',
61
+ smile: 'Sonríe',
62
+ blink: 'Parpadea naturalmente',
63
+ turnHeadLeft: 'Gira tu cabeza a la izquierda',
64
+ turnHeadRight: 'Gira tu cabeza a la derecha',
65
+ stayStill: 'Permanece quieto',
66
+ },
67
+ recording: 'Grabando...',
68
+ processing: 'Procesando video...',
69
+ },
70
+
71
+ validation: {
72
+ title: 'Validando',
73
+ validating: 'Validando tu identidad...',
74
+ checkingDocument: 'Verificando autenticidad del documento...',
75
+ checkingLiveness: 'Verificando prueba de vida...',
76
+ matchingFaces: 'Comparando rostros...',
77
+ almostDone: 'Casi terminamos...',
78
+ },
79
+
80
+ result: {
81
+ success: {
82
+ title: 'Verificación Exitosa',
83
+ message: 'Tu identidad ha sido verificada correctamente',
84
+ verificationComplete: 'Verificación Completa',
85
+ },
86
+ failure: {
87
+ title: 'Verificación Fallida',
88
+ message: 'No pudimos verificar tu identidad',
89
+ tryAgain: 'Por favor, intenta nuevamente',
90
+ },
91
+ },
92
+
93
+ errors: {
94
+ cameraPermissionDenied: 'Permiso de cámara denegado. Habilita el acceso en configuración.',
95
+ cameraNotAvailable: 'Cámara no disponible.',
96
+ faceNotDetected: 'Rostro no detectado. Posiciona tu cara claramente.',
97
+ multipleFacesDetected: 'Múltiples rostros detectados. Solo debe haber una persona.',
98
+ documentNotDetected: 'Documento no detectado. Posiciona tu documento claramente.',
99
+ poorImageQuality: 'Calidad de imagen baja. Asegura buena iluminación.',
100
+ livenessCheckFailed: 'Prueba de vida fallida. Intenta nuevamente.',
101
+ faceMatchFailed: 'El rostro no coincide con la foto del documento.',
102
+ documentTampered: 'El documento parece estar alterado o ser fraudulento.',
103
+ networkError: 'Error de red. Verifica tu conexión.',
104
+ timeout: 'Tiempo de espera agotado. Intenta nuevamente.',
105
+ unknownError: 'Ocurrió un error inesperado.',
106
+ },
107
+
108
+ badges: {
109
+ secureVerification: 'Verificación Segura con IA',
110
+ aiPowered: 'Impulsado por IA',
111
+ verified: 'Verificado',
112
+ },
113
+
114
+ steps: {
115
+ frontId: 'Frente',
116
+ backId: 'Reverso',
117
+ faceVideo: 'Video',
118
+ validation: 'Validación',
119
+ },
120
+ };
121
+
@@ -0,0 +1,121 @@
1
+ import { LanguageStrings } from '../types';
2
+
3
+ export const ptBR: LanguageStrings = {
4
+ common: {
5
+ loading: 'Carregando...',
6
+ error: 'Erro',
7
+ retry: 'Tentar Novamente',
8
+ cancel: 'Cancelar',
9
+ continue: 'Continuar',
10
+ close: 'Fechar',
11
+ done: 'Pronto',
12
+ },
13
+
14
+ initialization: {
15
+ initializing: 'Inicializando...',
16
+ connectingToServer: 'Conectando ao servidor...',
17
+ loadingModels: 'Carregando modelos de IA...',
18
+ },
19
+
20
+ instructions: {
21
+ title: 'Verificação de Identidade',
22
+ subtitle: 'Siga estes passos para verificar sua identidade',
23
+ step1: 'Capture a frente do documento',
24
+ step2: 'Capture o verso do documento',
25
+ step3: 'Grave um vídeo do seu rosto',
26
+ startButton: 'Iniciar Verificação',
27
+ requirements: {
28
+ goodLighting: 'Boa iluminação',
29
+ clearDocument: 'Documento claro',
30
+ stableHand: 'Mão estável',
31
+ followInstructions: 'Siga as instruções',
32
+ },
33
+ },
34
+
35
+ capture: {
36
+ frontId: {
37
+ title: 'Frente do Documento',
38
+ instruction: 'Posicione a frente do seu documento dentro da moldura',
39
+ button: 'Capturar Frente',
40
+ },
41
+ backId: {
42
+ title: 'Verso do Documento',
43
+ instruction: 'Posicione o verso do seu documento dentro da moldura',
44
+ button: 'Capturar Verso',
45
+ },
46
+ selfie: {
47
+ title: 'Foto do Rosto',
48
+ instruction: 'Posicione seu rosto dentro da moldura',
49
+ button: 'Tirar Foto',
50
+ },
51
+ },
52
+
53
+ liveness: {
54
+ title: 'Verificação Facial',
55
+ preparing: 'Preparando verificação...',
56
+ instructions: {
57
+ lookLeft: 'Olhe para a esquerda',
58
+ lookRight: 'Olhe para a direita',
59
+ lookUp: 'Olhe para cima',
60
+ lookDown: 'Olhe para baixo',
61
+ smile: 'Sorria',
62
+ blink: 'Pisque naturalmente',
63
+ turnHeadLeft: 'Vire sua cabeça para a esquerda',
64
+ turnHeadRight: 'Vire sua cabeça para a direita',
65
+ stayStill: 'Fique parado',
66
+ },
67
+ recording: 'Gravando...',
68
+ processing: 'Processando vídeo...',
69
+ },
70
+
71
+ validation: {
72
+ title: 'Validando',
73
+ validating: 'Validando sua identidade...',
74
+ checkingDocument: 'Verificando autenticidade do documento...',
75
+ checkingLiveness: 'Verificando prova de vida...',
76
+ matchingFaces: 'Comparando rostos...',
77
+ almostDone: 'Quase pronto...',
78
+ },
79
+
80
+ result: {
81
+ success: {
82
+ title: 'Verificação Bem-Sucedida',
83
+ message: 'Sua identidade foi verificada com sucesso',
84
+ verificationComplete: 'Verificação Completa',
85
+ },
86
+ failure: {
87
+ title: 'Verificação Falhou',
88
+ message: 'Não conseguimos verificar sua identidade',
89
+ tryAgain: 'Por favor, tente novamente',
90
+ },
91
+ },
92
+
93
+ errors: {
94
+ cameraPermissionDenied: 'Permissão de câmera negada. Habilite o acesso nas configurações.',
95
+ cameraNotAvailable: 'Câmera não disponível.',
96
+ faceNotDetected: 'Rosto não detectado. Posicione seu rosto claramente.',
97
+ multipleFacesDetected: 'Múltiplos rostos detectados. Apenas uma pessoa deve estar no quadro.',
98
+ documentNotDetected: 'Documento não detectado. Posicione seu documento claramente.',
99
+ poorImageQuality: 'Qualidade de imagem baixa. Certifique-se de ter boa iluminação.',
100
+ livenessCheckFailed: 'Prova de vida falhou. Tente novamente.',
101
+ faceMatchFailed: 'O rosto não corresponde à foto do documento.',
102
+ documentTampered: 'O documento parece estar adulterado ou fraudulento.',
103
+ networkError: 'Erro de rede. Verifique sua conexão.',
104
+ timeout: 'Tempo esgotado. Tente novamente.',
105
+ unknownError: 'Ocorreu um erro inesperado.',
106
+ },
107
+
108
+ badges: {
109
+ secureVerification: 'Verificação Segura com IA',
110
+ aiPowered: 'Impulsionado por IA',
111
+ verified: 'Verificado',
112
+ },
113
+
114
+ steps: {
115
+ frontId: 'Frente',
116
+ backId: 'Verso',
117
+ faceVideo: 'Vídeo',
118
+ validation: 'Validação',
119
+ },
120
+ };
121
+