@jjlmoya/utils-audiovisual 1.2.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.
- package/package.json +60 -0
- package/src/category/i18n/en.ts +198 -0
- package/src/category/i18n/es.ts +198 -0
- package/src/category/i18n/fr.ts +198 -0
- package/src/category/index.ts +17 -0
- package/src/category/seo.astro +15 -0
- package/src/components/PreviewNavSidebar.astro +116 -0
- package/src/components/PreviewToolbar.astro +143 -0
- package/src/data.ts +4 -0
- package/src/env.d.ts +5 -0
- package/src/index.ts +32 -0
- package/src/layouts/PreviewLayout.astro +117 -0
- package/src/pages/[locale]/[slug].astro +146 -0
- package/src/pages/[locale].astro +251 -0
- package/src/pages/index.astro +4 -0
- package/src/tests/faq_count.test.ts +19 -0
- package/src/tests/locale_completeness.test.ts +42 -0
- package/src/tests/mocks/astro_mock.js +2 -0
- package/src/tests/no_h1_in_components.test.ts +48 -0
- package/src/tests/seo_length.test.ts +22 -0
- package/src/tests/tool_validation.test.ts +17 -0
- package/src/tool/chromaticLens/bibliography.astro +17 -0
- package/src/tool/chromaticLens/component.astro +178 -0
- package/src/tool/chromaticLens/i18n/en.ts +246 -0
- package/src/tool/chromaticLens/i18n/es.ts +244 -0
- package/src/tool/chromaticLens/i18n/fr.ts +244 -0
- package/src/tool/chromaticLens/index.ts +43 -0
- package/src/tool/chromaticLens/logic.ts +87 -0
- package/src/tool/chromaticLens/seo.astro +15 -0
- package/src/tool/chromaticLens/style.css +308 -0
- package/src/tool/chromaticLens/ui.ts +109 -0
- package/src/tool/collageMaker/bibliography.astro +17 -0
- package/src/tool/collageMaker/component.astro +302 -0
- package/src/tool/collageMaker/i18n/en.ts +233 -0
- package/src/tool/collageMaker/i18n/es.ts +231 -0
- package/src/tool/collageMaker/i18n/fr.ts +231 -0
- package/src/tool/collageMaker/index.ts +51 -0
- package/src/tool/collageMaker/logic.ts +134 -0
- package/src/tool/collageMaker/seo.astro +15 -0
- package/src/tool/collageMaker/style.css +386 -0
- package/src/tool/exifCleaner/bibliography.astro +18 -0
- package/src/tool/exifCleaner/component.astro +162 -0
- package/src/tool/exifCleaner/i18n/en.ts +277 -0
- package/src/tool/exifCleaner/i18n/es.ts +277 -0
- package/src/tool/exifCleaner/i18n/fr.ts +277 -0
- package/src/tool/exifCleaner/index.ts +57 -0
- package/src/tool/exifCleaner/logic.ts +135 -0
- package/src/tool/exifCleaner/seo.astro +18 -0
- package/src/tool/exifCleaner/style.css +289 -0
- package/src/tool/exifCleaner/ui.ts +117 -0
- package/src/tool/imageCompressor/bibliography.astro +17 -0
- package/src/tool/imageCompressor/component.astro +262 -0
- package/src/tool/imageCompressor/i18n/en.ts +232 -0
- package/src/tool/imageCompressor/i18n/es.ts +230 -0
- package/src/tool/imageCompressor/i18n/fr.ts +230 -0
- package/src/tool/imageCompressor/index.ts +50 -0
- package/src/tool/imageCompressor/logic.ts +79 -0
- package/src/tool/imageCompressor/seo.astro +15 -0
- package/src/tool/imageCompressor/style.css +503 -0
- package/src/tool/printQualityCalculator/bibliography.astro +18 -0
- package/src/tool/printQualityCalculator/component.astro +318 -0
- package/src/tool/printQualityCalculator/i18n/en.ts +247 -0
- package/src/tool/printQualityCalculator/i18n/es.ts +245 -0
- package/src/tool/printQualityCalculator/i18n/fr.ts +245 -0
- package/src/tool/printQualityCalculator/index.ts +56 -0
- package/src/tool/printQualityCalculator/logic.ts +53 -0
- package/src/tool/printQualityCalculator/seo.astro +18 -0
- package/src/tool/printQualityCalculator/style.css +491 -0
- package/src/tool/printQualityCalculator/ui.ts +122 -0
- package/src/tool/privacyBlur/bibliography.astro +17 -0
- package/src/tool/privacyBlur/component.astro +230 -0
- package/src/tool/privacyBlur/i18n/en.ts +238 -0
- package/src/tool/privacyBlur/i18n/es.ts +236 -0
- package/src/tool/privacyBlur/i18n/fr.ts +236 -0
- package/src/tool/privacyBlur/index.ts +49 -0
- package/src/tool/privacyBlur/logic.ts +249 -0
- package/src/tool/privacyBlur/seo.astro +15 -0
- package/src/tool/privacyBlur/style.css +332 -0
- package/src/tool/privacyBlur/ui.ts +124 -0
- package/src/tool/subtitleSync/bibliography.astro +17 -0
- package/src/tool/subtitleSync/component.astro +187 -0
- package/src/tool/subtitleSync/i18n/en.ts +241 -0
- package/src/tool/subtitleSync/i18n/es.ts +241 -0
- package/src/tool/subtitleSync/i18n/fr.ts +241 -0
- package/src/tool/subtitleSync/index.ts +49 -0
- package/src/tool/subtitleSync/logic.ts +91 -0
- package/src/tool/subtitleSync/seo.astro +15 -0
- package/src/tool/subtitleSync/style.css +325 -0
- package/src/tool/subtitleSync/ui.ts +152 -0
- package/src/tool/timelapseCalculator/bibliography.astro +15 -0
- package/src/tool/timelapseCalculator/component.astro +148 -0
- package/src/tool/timelapseCalculator/i18n/en.ts +169 -0
- package/src/tool/timelapseCalculator/i18n/es.ts +169 -0
- package/src/tool/timelapseCalculator/i18n/fr.ts +169 -0
- package/src/tool/timelapseCalculator/index.ts +52 -0
- package/src/tool/timelapseCalculator/logic.ts +46 -0
- package/src/tool/timelapseCalculator/seo.astro +18 -0
- package/src/tool/timelapseCalculator/style.css +285 -0
- package/src/tool/tvDistance/bibliography.astro +17 -0
- package/src/tool/tvDistance/component.astro +178 -0
- package/src/tool/tvDistance/i18n/en.ts +223 -0
- package/src/tool/tvDistance/i18n/es.ts +223 -0
- package/src/tool/tvDistance/i18n/fr.ts +223 -0
- package/src/tool/tvDistance/index.ts +49 -0
- package/src/tool/tvDistance/logic.ts +47 -0
- package/src/tool/tvDistance/seo.astro +15 -0
- package/src/tool/tvDistance/style.css +435 -0
- package/src/tool/tvDistance/ui.ts +66 -0
- package/src/tool/videoFrameExtractor/bibliography.astro +17 -0
- package/src/tool/videoFrameExtractor/component.astro +285 -0
- package/src/tool/videoFrameExtractor/i18n/en.ts +235 -0
- package/src/tool/videoFrameExtractor/i18n/es.ts +235 -0
- package/src/tool/videoFrameExtractor/i18n/fr.ts +235 -0
- package/src/tool/videoFrameExtractor/index.ts +53 -0
- package/src/tool/videoFrameExtractor/logic.ts +49 -0
- package/src/tool/videoFrameExtractor/seo.astro +15 -0
- package/src/tool/videoFrameExtractor/style.css +426 -0
- package/src/tool/videoFrameExtractor/ui.ts +179 -0
- package/src/tools.ts +25 -0
- package/src/types.ts +72 -0
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { PrivacyBlurUI, PrivacyBlurLocaleContent } from '../index';
|
|
3
|
+
|
|
4
|
+
const slug = 'editor-privacidad';
|
|
5
|
+
const title = 'Editor de Privacidad Online - Pixela y oculta rostros en fotos';
|
|
6
|
+
const description = 'Protege tu identidad censurando áreas sensibles de tus fotos. Pixela rostros, desenfoca documentos o tapa información privada de forma 100% local.';
|
|
7
|
+
|
|
8
|
+
const ui: PrivacyBlurUI = {
|
|
9
|
+
toolPixel: "Pixelar",
|
|
10
|
+
toolBlur: "Borro",
|
|
11
|
+
toolSolid: "Tapado",
|
|
12
|
+
intensityLabel: "Intensidad",
|
|
13
|
+
undoButton: "Deshacer",
|
|
14
|
+
downloadButton: "Guardar",
|
|
15
|
+
dropTitle: "Editor de Privacidad",
|
|
16
|
+
dropSubtitle: "Arrastra tu imagen aquí o haz clic para empezar",
|
|
17
|
+
privacySecureLabel: "100% Local",
|
|
18
|
+
offlineLabel: "Offline",
|
|
19
|
+
autoDetectFaces: "Auto Detect",
|
|
20
|
+
loadingModels: "Descargando modelos...",
|
|
21
|
+
noFacesDetected: "No se detectaron rostros automáticamente."
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const faq: PrivacyBlurLocaleContent['faq'] = [
|
|
25
|
+
{
|
|
26
|
+
question: "¿Mis fotos se suben a algún servidor?",
|
|
27
|
+
answer: "No. El editor de privacidad funciona íntegramente en tu navegador. Los píxeles se modifican localmente y nada se envía fuera de tu dispositivo.",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
question: "¿Cómo funciona la detección automática de caras?",
|
|
31
|
+
answer: "Utilizamos una red neuronal ligera (TinyFaceDetector) que se ejecuta en tu navegador para identificar rasgos faciales sin necesidad de una conexión externa.",
|
|
32
|
+
},
|
|
33
|
+
];
|
|
34
|
+
|
|
35
|
+
const howTo: PrivacyBlurLocaleContent['howTo'] = [
|
|
36
|
+
{
|
|
37
|
+
name: "Sube tu foto",
|
|
38
|
+
text: "Arrastra o selecciona la imagen que contenga información sensible que deseas ocultar.",
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: "Elige la herramienta",
|
|
42
|
+
text: "Selecciona entre pixelar, desenfocar o tapado sólido según el nivel de privacidad que necesites.",
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: "Marca el área",
|
|
46
|
+
text: "Haz clic y arrastra sobre la zona que quieres proteger (caras, matrículas, nombres, etc.).",
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: "Guarda el resultado",
|
|
50
|
+
text: "Descarga la imagen procesada con la seguridad de que los datos originales son inaccesibles.",
|
|
51
|
+
},
|
|
52
|
+
];
|
|
53
|
+
|
|
54
|
+
const bibliography: PrivacyBlurLocaleContent['bibliography'] = [
|
|
55
|
+
{
|
|
56
|
+
name: "Privacidad por Diseño (PbD) - AGPD",
|
|
57
|
+
url: "https://www.aepd.es/es/guias-y-herramientas/guias/guia-de-privacidad-desde-el-diseno",
|
|
58
|
+
},
|
|
59
|
+
];
|
|
60
|
+
|
|
61
|
+
const seo: PrivacyBlurLocaleContent['seo'] = [
|
|
62
|
+
{
|
|
63
|
+
type: 'summary',
|
|
64
|
+
title: 'Editor de Privacidad: Pixela, Desenfoca y Oculta',
|
|
65
|
+
items: [
|
|
66
|
+
'Tres herramientas de edición: Pixelar, Desenfocar, Tapado Sólido',
|
|
67
|
+
'Detección automática de rostros con IA (TinyFaceDetector)',
|
|
68
|
+
'Procesamiento 100% local - tus fotos nunca salen del navegador',
|
|
69
|
+
'Sin marcas de agua, sin límites, completamente gratuito'
|
|
70
|
+
]
|
|
71
|
+
},
|
|
72
|
+
{ type: 'title', text: 'Privacidad Digital: Cómo Proteger tus Datos Visuales', level: 2 },
|
|
73
|
+
{ type: 'paragraph', html: 'En la era de las redes sociales, compartir fotos sin control puede exponer datos personales sensibles. Nuestra herramienta permite ocultar información crítica (rostros, matrículas, nombres, direcciones) antes de subirlas a Internet, asegurando que tu privacidad permanece bajo tu control total.' },
|
|
74
|
+
|
|
75
|
+
{ type: 'stats', items: [
|
|
76
|
+
{ value: '3', label: 'Métodos de Ocultación', icon: 'mdi:tools' },
|
|
77
|
+
{ value: '100%', label: 'Privacidad Local', icon: 'mdi:shield-check' },
|
|
78
|
+
{ value: 'IA', label: 'Detección de Rostros', icon: 'mdi:brain' }
|
|
79
|
+
], columns: 3 },
|
|
80
|
+
|
|
81
|
+
{ type: 'title', text: 'Tres Métodos de Ocultación Explicados', level: 3 },
|
|
82
|
+
{ type: 'comparative', items: [
|
|
83
|
+
{
|
|
84
|
+
title: 'Pixelar',
|
|
85
|
+
description: 'Divide el área en cuadrados, imposible reconocer',
|
|
86
|
+
icon: 'mdi:blur',
|
|
87
|
+
points: [
|
|
88
|
+
'Máxima obfuscación irreversible',
|
|
89
|
+
'Más seguro contra reconocimiento facial',
|
|
90
|
+
'Visible, claro que algo se ocultó',
|
|
91
|
+
'Ideal: rostros en fotos públicas'
|
|
92
|
+
]
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
title: 'Desenfocar',
|
|
96
|
+
description: 'Suavizado Gaussiano - aspecto más natural',
|
|
97
|
+
icon: 'mdi:blur-off',
|
|
98
|
+
points: [
|
|
99
|
+
'Aspecto visual más elegante',
|
|
100
|
+
'Mantiene cierta coherencia de tonos',
|
|
101
|
+
'Matemáticamente reversible (teóricamente)',
|
|
102
|
+
'Ideal: información menos sensible'
|
|
103
|
+
],
|
|
104
|
+
highlight: true
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
title: 'Tapado Sólido',
|
|
108
|
+
description: 'Bloque de color opaco - máxima privacidad',
|
|
109
|
+
icon: 'mdi:rectangle',
|
|
110
|
+
points: [
|
|
111
|
+
'Visible, evidente ocultación',
|
|
112
|
+
'Máxima seguridad legal/privacidad',
|
|
113
|
+
'Cambia composición visual',
|
|
114
|
+
'Ideal: documentos, datos sensibles'
|
|
115
|
+
]
|
|
116
|
+
}
|
|
117
|
+
], columns: 3 },
|
|
118
|
+
|
|
119
|
+
{ type: 'title', text: 'Detección Automática de Rostros con IA', level: 3 },
|
|
120
|
+
{ type: 'paragraph', html: 'Nuestra herramienta utiliza TinyFaceDetector, una red neuronal compacta que se ejecuta directamente en tu navegador para identificar rostros automáticamente:' },
|
|
121
|
+
{ type: 'list', items: [
|
|
122
|
+
'<strong>100% Local:</strong> El modelo de IA corre en tu GPU/CPU, no en servidores remotos.',
|
|
123
|
+
'<strong>Sin Internet:</strong> Después de la descarga inicial, funciona completamente offline.',
|
|
124
|
+
'<strong>Privacidad Garantizada:</strong> Nadie ve los rostros: ni Google, ni OpenAI, ni nosotros.',
|
|
125
|
+
'<strong>Un Clic Automático:</strong> Detecta rostros y te deja elegir ocultar con un clic.'
|
|
126
|
+
], icon: 'mdi:check' },
|
|
127
|
+
|
|
128
|
+
{ type: 'card', title: 'Seguridad por Diseño (Privacy by Design)', html: 'Al procesar las imágenes mediante la GPU y CPU local de tu navegador, garantizamos que las fotos originales nunca abandonan tu dispositivo. Incluso si cambias de idea, nada fue transmitido. Este es el estándar máximo de privacidad digital.' },
|
|
129
|
+
|
|
130
|
+
{ type: 'title', text: 'Casos de Uso de Privacidad', level: 3 },
|
|
131
|
+
{ type: 'table', headers: ['Información Sensible', 'Método Recomendado', 'Urgencia'], rows: [
|
|
132
|
+
['Rostros de personas', 'Pixelar o Desenfocar', 'Crítica'],
|
|
133
|
+
['Matrículas de vehículos', 'Pixelar (irreversible)', 'Crítica'],
|
|
134
|
+
['Documentos de identidad', 'Tapado Sólido o Pixelar', 'Crítica'],
|
|
135
|
+
['Nombres/Direcciones escritas', 'Tapado Sólido o Pixelar', 'Alta'],
|
|
136
|
+
['Números de teléfono', 'Pixelar o Tapar', 'Alta'],
|
|
137
|
+
['Información médica', 'Tapado Sólido', 'Crítica'],
|
|
138
|
+
['Señales de WiFi visibles', 'Pixelar', 'Media']
|
|
139
|
+
] },
|
|
140
|
+
|
|
141
|
+
{ type: 'proscons', items: [
|
|
142
|
+
{
|
|
143
|
+
pro: 'Privacidad total: procesamiento 100% local, sin servidores, sin almacenamiento',
|
|
144
|
+
con: 'Requiere navegador moderno con soporte Canvas y WebGL'
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
pro: 'Detección automática de rostros ahorra tiempo manual',
|
|
148
|
+
con: 'IA no es perfecta - rostros de perfil o parciales pueden no detectarse'
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
pro: 'Tres métodos permiten elegir seguridad vs estética',
|
|
152
|
+
con: 'Sin opciones avanzadas (deformación inteligente, relleno contextual)'
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
pro: 'Completamente gratuito, sin publicidad, sin límites',
|
|
156
|
+
con: 'No es equivalente a software profesional como Photoshop'
|
|
157
|
+
}
|
|
158
|
+
], proTitle: 'Ventajas', conTitle: 'Limitaciones' },
|
|
159
|
+
|
|
160
|
+
{ type: 'diagnostic', variant: 'warning', title: 'Advertencia: Desenfocar NO es 100% Seguro', icon: 'mdi:alert', badge: 'Seguridad', html: 'El desenfoque Gaussiano es reversible matemáticamente mediante algoritmos inversos sofisticados. Si la información es CRÍTICA (documentos legales, identidad), usa <strong>Pixelar o Tapado Sólido</strong>. El desenfoque es estéticamente mejor pero menos seguro.' },
|
|
161
|
+
|
|
162
|
+
{ type: 'glossary', items: [
|
|
163
|
+
{
|
|
164
|
+
term: 'Pixelación',
|
|
165
|
+
definition: 'Reducir resolución diviendo área en bloques de color uniforme. Irreversible. Máxima seguridad contra reconocimiento facial de IA.'
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
term: 'Desenfoque Gaussiano',
|
|
169
|
+
definition: 'Suavizado matemático basado en distribución normal. Reversible teóricamente mediante deconvolución, pero prácticamente muy difícil.'
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
term: 'Tapado Sólido',
|
|
173
|
+
definition: 'Bloque opaco de un color uniforme. Máxima seguridad, máxima privacidad legal, menos elegante visualmente.'
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
term: 'TinyFaceDetector',
|
|
177
|
+
definition: 'Red neuronal convolucional (CNN) ligera para detectar rostros. Corre localmente en navegador sin necesidad de servidor externo.'
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
term: 'Privacy by Design (PbD)',
|
|
181
|
+
definition: 'Enfoque donde la privacidad está integrada desde el diseño del sistema, no añadida después. Nuestro enfoque local es Privacy by Design.'
|
|
182
|
+
}
|
|
183
|
+
] },
|
|
184
|
+
|
|
185
|
+
{ type: 'message', title: 'Privacidad en tu Control', ariaLabel: 'Información sobre protección de privacidad', html: 'No almacenamos ni procesamos tus fotos en servidores remotos. No hay cookies de seguimiento. No hay historiales de edición. No sabemos qué ocultas porque nunca vemos tus imágenes. Control total, privacidad total, libertad total.' },
|
|
186
|
+
|
|
187
|
+
{ type: 'title', text: 'Comparte Seguro en Redes Sociales', level: 3 },
|
|
188
|
+
{ type: 'paragraph', html: 'Antes de publicar cualquier foto en Internet, pregúntate: ¿hay información que preferiría que no fuera pública? Rostros de hijos, matrículas, direcciones, números de documentos. Una sesión de 2 minutos de privacidad ahora te evita problemas de años.' }
|
|
189
|
+
];
|
|
190
|
+
|
|
191
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
192
|
+
'@context': 'https://schema.org',
|
|
193
|
+
'@type': 'FAQPage',
|
|
194
|
+
mainEntity: faq.map((item) => ({
|
|
195
|
+
'@type': 'Question',
|
|
196
|
+
name: item.question,
|
|
197
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
198
|
+
})),
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
const howToSchema: WithContext<HowTo> = {
|
|
202
|
+
'@context': 'https://schema.org',
|
|
203
|
+
'@type': 'HowTo',
|
|
204
|
+
name: title,
|
|
205
|
+
description,
|
|
206
|
+
step: howTo.map((step) => ({
|
|
207
|
+
'@type': 'HowToStep',
|
|
208
|
+
name: step.name,
|
|
209
|
+
text: step.text,
|
|
210
|
+
})),
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
214
|
+
'@context': 'https://schema.org',
|
|
215
|
+
'@type': 'SoftwareApplication',
|
|
216
|
+
name: title,
|
|
217
|
+
description,
|
|
218
|
+
applicationCategory: 'UtilitiesApplication',
|
|
219
|
+
operatingSystem: 'Web',
|
|
220
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
221
|
+
inLanguage: 'es',
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
export const content: PrivacyBlurLocaleContent = {
|
|
225
|
+
slug,
|
|
226
|
+
title,
|
|
227
|
+
description,
|
|
228
|
+
ui,
|
|
229
|
+
seo,
|
|
230
|
+
faq,
|
|
231
|
+
faqTitle: 'Preguntas frecuentes sobre desenfoque de fotos',
|
|
232
|
+
bibliography,
|
|
233
|
+
bibliographyTitle: 'Recursos técnicos sobre privacidad visual',
|
|
234
|
+
howTo,
|
|
235
|
+
schemas: [faqSchema as any, howToSchema as any, appSchema],
|
|
236
|
+
};
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { PrivacyBlurUI, PrivacyBlurLocaleContent } from '../index';
|
|
3
|
+
|
|
4
|
+
const slug = 'editeur-confidentialite-en-ligne-pixeliser-flouter-visages';
|
|
5
|
+
const title = 'Éditeur de Confidentialité en Ligne - Pixélisez et masquez les visages';
|
|
6
|
+
const description = 'Protégez votre identité en censurant les zones sensibles de vos photos. Pixélisez les visages, floutez les documents ou masquez les informations privées 100 % localement.';
|
|
7
|
+
|
|
8
|
+
const ui: PrivacyBlurUI = {
|
|
9
|
+
toolPixel: "Pixeliser",
|
|
10
|
+
toolBlur: "Flouter",
|
|
11
|
+
toolSolid: "Masquer",
|
|
12
|
+
intensityLabel: "Intensité",
|
|
13
|
+
undoButton: "Annuler",
|
|
14
|
+
downloadButton: "Enregistrer",
|
|
15
|
+
dropTitle: "Éditeur de Confidentialité",
|
|
16
|
+
dropSubtitle: "Faites glisser votre image ici ou cliquez pour commencer",
|
|
17
|
+
privacySecureLabel: "100 % Local",
|
|
18
|
+
offlineLabel: "Hors ligne",
|
|
19
|
+
autoDetectFaces: "Auto Detect",
|
|
20
|
+
loadingModels: "Chargement des modèles...",
|
|
21
|
+
noFacesDetected: "Aucun visage détecté automatiquement."
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const faq: PrivacyBlurLocaleContent['faq'] = [
|
|
25
|
+
{
|
|
26
|
+
question: "Mes photos sont-elles téléchargées sur un serveur ?",
|
|
27
|
+
answer: "Non. L'éditeur de confidentialité fonctionne entièrement dans votre navigateur. Les pixels sont modifiés localement et rien n'est envoyé à l'extérieur de votre appareil.",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
question: "Comment fonctionne la détection automatique des visages ?",
|
|
31
|
+
answer: "Nous utilisons un réseau neuronal léger (TinyFaceDetector) qui s'exécute dans votre navigateur pour identifier les traits du visage sans avoir besoin d'une connexion externe.",
|
|
32
|
+
},
|
|
33
|
+
];
|
|
34
|
+
|
|
35
|
+
const howTo: PrivacyBlurLocaleContent['howTo'] = [
|
|
36
|
+
{
|
|
37
|
+
name: "Importez votre photo",
|
|
38
|
+
text: "Faites glisser ou sélectionnez l'image contenant des informations sensibles que vous souhaitez masquer.",
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: "Choisissez l'outil",
|
|
42
|
+
text: "Sélectionnez entre pixeliser, flouter ou masquer (solide) selon le niveau de confidentialité dont vous avez besoin.",
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: "Marquez la zone",
|
|
46
|
+
text: "Cliquez et faites glisser sur la zone que vous souhaitez protéger (visages, plaques d'immatriculation, noms, etc.).",
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: "Enregistrez le résultat",
|
|
50
|
+
text: "Téléchargez l'image traitée avec la certitude que les données d'origine sont inaccessibles.",
|
|
51
|
+
},
|
|
52
|
+
];
|
|
53
|
+
|
|
54
|
+
const bibliography: PrivacyBlurLocaleContent['bibliography'] = [
|
|
55
|
+
{
|
|
56
|
+
name: "Privacy by Design (PbD) - AGPD",
|
|
57
|
+
url: "https://www.aepd.es/es/guias-y-herramientas/guias/guia-de-privacidad-desde-el-diseno",
|
|
58
|
+
},
|
|
59
|
+
];
|
|
60
|
+
|
|
61
|
+
const seo: PrivacyBlurLocaleContent['seo'] = [
|
|
62
|
+
{
|
|
63
|
+
type: 'summary',
|
|
64
|
+
title: 'Éditeur de Confidentialité : Pixéliser, Flouter et Masquer',
|
|
65
|
+
items: [
|
|
66
|
+
'Trois outils d\'édition : Pixeliser, Flouter, Masquage Solide',
|
|
67
|
+
'Détection automatique des visages par IA (TinyFaceDetector)',
|
|
68
|
+
'Traitement 100 % local - vos photos ne quittent jamais le navigateur',
|
|
69
|
+
'Sans filigrane, sans limites, complètement gratuit'
|
|
70
|
+
]
|
|
71
|
+
},
|
|
72
|
+
{ type: 'title', text: 'Confidentialité Numérique : Comment Protéger vos Données Visuelles', level: 2 },
|
|
73
|
+
{ type: 'paragraph', html: 'À l\'ère des réseaux sociaux, partager des photos sans contrôle peut exposer des données personnelles sensibles. Notre outil permet de masquer les informations critiques (visages, plaques d\'immatriculation, noms, adresses) avant de les mettre en ligne, garantissant que votre vie privée reste sous votre contrôle total.' },
|
|
74
|
+
|
|
75
|
+
{ type: 'stats', items: [
|
|
76
|
+
{ value: '3', label: 'Méthodes de Masquage', icon: 'mdi:tools' },
|
|
77
|
+
{ value: '100%', label: 'Confidentialité Locale', icon: 'mdi:shield-check' },
|
|
78
|
+
{ value: 'IA', label: 'Détection de Visages', icon: 'mdi:brain' }
|
|
79
|
+
], columns: 3 },
|
|
80
|
+
|
|
81
|
+
{ type: 'title', text: 'Trois Méthodes de Masquage Expliquées', level: 3 },
|
|
82
|
+
{ type: 'comparative', items: [
|
|
83
|
+
{
|
|
84
|
+
title: 'Pixeliser',
|
|
85
|
+
description: 'Divise la zone en carrés, impossible à reconnaître',
|
|
86
|
+
icon: 'mdi:blur',
|
|
87
|
+
points: [
|
|
88
|
+
'Obfuscation irréversible maximale',
|
|
89
|
+
'Plus sûr contre la reconnaissance faciale',
|
|
90
|
+
'Visible, il est clair que quelque chose a été masqué',
|
|
91
|
+
'Idéal : visages sur photos publiques'
|
|
92
|
+
]
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
title: 'Flouter',
|
|
96
|
+
description: 'Lissage gaussien - aspect plus naturel',
|
|
97
|
+
icon: 'mdi:blur-off',
|
|
98
|
+
points: [
|
|
99
|
+
'Aspect visuel plus élégant',
|
|
100
|
+
'Conserve une certaine cohérence des tons',
|
|
101
|
+
'Mathématiquement réversible (théoriquement)',
|
|
102
|
+
'Idéal : informations moins sensibles'
|
|
103
|
+
],
|
|
104
|
+
highlight: true
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
title: 'Masquage Solide',
|
|
108
|
+
description: 'Bloc de couleur opaque - confidentialité maximale',
|
|
109
|
+
icon: 'mdi:rectangle',
|
|
110
|
+
points: [
|
|
111
|
+
'Visible, masquage évident',
|
|
112
|
+
'Sécurité juridique/confidentialité maximale',
|
|
113
|
+
'Modifie la composition visuelle',
|
|
114
|
+
'Idéal : documents, données sensibles'
|
|
115
|
+
]
|
|
116
|
+
}
|
|
117
|
+
], columns: 3 },
|
|
118
|
+
|
|
119
|
+
{ type: 'title', text: 'Détection Automatique des Visages par IA', level: 3 },
|
|
120
|
+
{ type: 'paragraph', html: 'Notre outil utilise TinyFaceDetector, un réseau neuronal compact qui s\'exécute directement dans votre navigateur pour identifier les visages automatiquement :' },
|
|
121
|
+
{ type: 'list', items: [
|
|
122
|
+
'<strong>100 % Local :</strong> Le modèle d\'IA s\'exécute sur votre GPU/CPU, pas sur des serveurs distants.',
|
|
123
|
+
'<strong>Sans Internet :</strong> Après le téléchargement initial, il fonctionne complètement hors ligne.',
|
|
124
|
+
'<strong>Confidentialité Garantie :</strong> Personne ne voit les visages : ni Google, ni OpenAI, ni nous.',
|
|
125
|
+
'<strong>Un Clic Automatique :</strong> Détecte les visages et vous permet de choisir de les masquer en un clic.'
|
|
126
|
+
], icon: 'mdi:check' },
|
|
127
|
+
|
|
128
|
+
{ type: 'card', title: 'Sécurité dès la Conception (Privacy by Design)', html: 'En traitant les images via le processeur local de votre navigateur, nous garantissons que les photos d\'origine ne quittent jamais votre appareil. C\'est le standard maximal de confidentialité numérique.' },
|
|
129
|
+
|
|
130
|
+
{ type: 'title', text: 'Cas d\'Utilisation de la Confidentialité', level: 3 },
|
|
131
|
+
{ type: 'table', headers: ['Informations Sensibles', 'Méthode Recommandée', 'Urgence'], rows: [
|
|
132
|
+
['Visages de personnes', 'Pixeliser ou Flouter', 'Critique'],
|
|
133
|
+
['Plaques d\'immatriculation', 'Pixeliser (irréversible)', 'Critique'],
|
|
134
|
+
['Documents d\'identité', 'Masquage Solide ou Pixeliser', 'Critique'],
|
|
135
|
+
['Noms/Adresses écrits', 'Masquage Solide ou Pixeliser', 'Élevée'],
|
|
136
|
+
['Numéros de téléphone', 'Pixeliser ou Masquer', 'Élevée'],
|
|
137
|
+
['Informations médicales', 'Masquage Solide', 'Critique'],
|
|
138
|
+
['Signaux WiFi visibles', 'Pixeliser', 'Moyenne']
|
|
139
|
+
] },
|
|
140
|
+
|
|
141
|
+
{ type: 'proscons', items: [
|
|
142
|
+
{
|
|
143
|
+
pro: 'Confidentialité totale : traitement 100 % local, ni serveurs, ni stockage',
|
|
144
|
+
con: 'Nécessite un navigateur moderne supportant Canvas et WebGL'
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
pro: 'La détection automatique des visages fait gagner du temps',
|
|
148
|
+
con: 'L\'IA n\'est pas parfaite - les visages de profil peuvent être omis'
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
pro: 'Trois méthodes pour choisir entre sécurité et esthétique',
|
|
152
|
+
con: 'Pas d\'options de déformation intelligente ou de remplissage contextuel'
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
pro: 'Totalement gratuit, sans publicité, sans limites',
|
|
156
|
+
con: 'N\'est pas l\'équivalent d\'un logiciel professionnel'
|
|
157
|
+
}
|
|
158
|
+
], proTitle: 'Avantages', conTitle: 'Limitations' },
|
|
159
|
+
|
|
160
|
+
{ type: 'diagnostic', variant: 'warning', title: 'Avertissement : Flouter n\'est pas 100 % Sûr', icon: 'mdi:alert', badge: 'Sécurité', html: 'Le flou gaussien est mathématiquement réversible via des algorithmes sophistiqués. Si l\'information est CRITIQUE (documents légaux, identité), utilisez <strong>Pixeliser ou Masquage Solide</strong>. Le flou est esthétiquement meilleur mais moins sûr.' },
|
|
161
|
+
|
|
162
|
+
{ type: 'glossary', items: [
|
|
163
|
+
{
|
|
164
|
+
term: 'Pixélisation',
|
|
165
|
+
definition: 'Réduction de la résolution en divisant la zone en blocs de couleur uniforme. Irréversible. Sécurité maximale.'
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
term: 'Flou Gaussien',
|
|
169
|
+
definition: 'Lissage mathématique basé sur une distribution normale. Théoriquement réversible par déconvolution.'
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
term: 'Masquage Solide',
|
|
173
|
+
definition: 'Bloc opaque d\'une couleur uniforme. Sécurité maximale, confidentialité juridique maximale.'
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
term: 'TinyFaceDetector',
|
|
177
|
+
definition: 'Réseau neuronal pour détecter les visages. S\'exécute localement dans le navigateur.'
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
term: 'Privacy by Design (PbD)',
|
|
181
|
+
definition: 'Approche où la confidentialité est intégrée dès la conception du système. Notre approche locale suit ce principe.'
|
|
182
|
+
}
|
|
183
|
+
] },
|
|
184
|
+
|
|
185
|
+
{ type: 'message', title: 'Confidentialité sous votre Contrôle', ariaLabel: 'Informations sur la protection de la vie privée', html: 'Nous ne stockons ni ne traitons vos photos sur des serveurs distants. Pas de cookies de suivi, pas d\'historique. Nous ne savons pas ce que vous masquez car nous ne voyons jamais vos images.' },
|
|
186
|
+
|
|
187
|
+
{ type: 'title', text: 'Partagez en Toute Sécurité', level: 3 },
|
|
188
|
+
{ type: 'paragraph', html: 'Avant de publier une photo sur Internet, demandez-vous s\'il y a des informations que vous préféreriez garder privées.' }
|
|
189
|
+
];
|
|
190
|
+
|
|
191
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
192
|
+
'@context': 'https://schema.org',
|
|
193
|
+
'@type': 'FAQPage',
|
|
194
|
+
mainEntity: faq.map((item) => ({
|
|
195
|
+
'@type': 'Question',
|
|
196
|
+
name: item.question,
|
|
197
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
198
|
+
})),
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
const howToSchema: WithContext<HowTo> = {
|
|
202
|
+
'@context': 'https://schema.org',
|
|
203
|
+
'@type': 'HowTo',
|
|
204
|
+
name: title,
|
|
205
|
+
description,
|
|
206
|
+
step: howTo.map((step) => ({
|
|
207
|
+
'@type': 'HowToStep',
|
|
208
|
+
name: step.name,
|
|
209
|
+
text: step.text,
|
|
210
|
+
})),
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
214
|
+
'@context': 'https://schema.org',
|
|
215
|
+
'@type': 'SoftwareApplication',
|
|
216
|
+
name: title,
|
|
217
|
+
description,
|
|
218
|
+
applicationCategory: 'UtilitiesApplication',
|
|
219
|
+
operatingSystem: 'Web',
|
|
220
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
221
|
+
inLanguage: 'fr',
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
export const content: PrivacyBlurLocaleContent = {
|
|
225
|
+
slug,
|
|
226
|
+
title,
|
|
227
|
+
description,
|
|
228
|
+
ui,
|
|
229
|
+
seo,
|
|
230
|
+
faqTitle: "Frequently Asked Questions",
|
|
231
|
+
faq,
|
|
232
|
+
bibliography,
|
|
233
|
+
bibliographyTitle: "References",
|
|
234
|
+
howTo,
|
|
235
|
+
schemas: [faqSchema as any, howToSchema as any, appSchema],
|
|
236
|
+
};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { AudiovisualToolEntry, ToolLocaleContent, ToolDefinition } from '../../types';
|
|
2
|
+
import PrivacyBlur from './component.astro';
|
|
3
|
+
import PrivacyBlurSEO from './seo.astro';
|
|
4
|
+
import PrivacyBlurBibliography from './bibliography.astro';
|
|
5
|
+
|
|
6
|
+
export interface PrivacyBlurUI {
|
|
7
|
+
toolPixel: string;
|
|
8
|
+
toolBlur: string;
|
|
9
|
+
toolSolid: string;
|
|
10
|
+
intensityLabel: string;
|
|
11
|
+
undoButton: string;
|
|
12
|
+
downloadButton: string;
|
|
13
|
+
dropTitle: string;
|
|
14
|
+
dropSubtitle: string;
|
|
15
|
+
privacySecureLabel: string;
|
|
16
|
+
offlineLabel: string;
|
|
17
|
+
autoDetectFaces: string;
|
|
18
|
+
loadingModels: string;
|
|
19
|
+
noFacesDetected: string;
|
|
20
|
+
[key: string]: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export type PrivacyBlurLocaleContent = ToolLocaleContent<PrivacyBlurUI>;
|
|
24
|
+
|
|
25
|
+
import { content as es } from './i18n/es';
|
|
26
|
+
import { content as en } from './i18n/en';
|
|
27
|
+
import { content as fr } from './i18n/fr';
|
|
28
|
+
|
|
29
|
+
export const privacyBlur: AudiovisualToolEntry<PrivacyBlurUI> = {
|
|
30
|
+
id: 'editor-privacidad',
|
|
31
|
+
icons: {
|
|
32
|
+
bg: 'mdi:eye-off',
|
|
33
|
+
fg: 'mdi:blur',
|
|
34
|
+
},
|
|
35
|
+
i18n: {
|
|
36
|
+
es: async () => es as unknown as PrivacyBlurLocaleContent,
|
|
37
|
+
en: async () => en as unknown as PrivacyBlurLocaleContent,
|
|
38
|
+
fr: async () => fr as unknown as PrivacyBlurLocaleContent,
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export { PrivacyBlur, PrivacyBlurSEO, PrivacyBlurBibliography };
|
|
43
|
+
|
|
44
|
+
export const PRIVACY_BLUR_TOOL: ToolDefinition = {
|
|
45
|
+
entry: privacyBlur as unknown as AudiovisualToolEntry,
|
|
46
|
+
Component: PrivacyBlur,
|
|
47
|
+
SEOComponent: PrivacyBlurSEO,
|
|
48
|
+
BibliographyComponent: PrivacyBlurBibliography,
|
|
49
|
+
};
|