@jjlmoya/utils-audiovisual 1.19.0 → 1.21.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 (80) hide show
  1. package/package.json +4 -2
  2. package/src/category/i18n/de.ts +1 -1
  3. package/src/category/i18n/fr.ts +1 -1
  4. package/src/category/i18n/ru.ts +1 -1
  5. package/src/layouts/PreviewLayout.astro +7 -2
  6. package/src/tests/diacritics_density.test.ts +118 -0
  7. package/src/tests/inverted_punctuation.test.ts +84 -0
  8. package/src/tests/no_en_dash.test.ts +70 -0
  9. package/src/tests/pagespeed_best_practices.test.ts +198 -0
  10. package/src/tests/script_density.test.ts +94 -0
  11. package/src/tool/chromaticLens/component.astro +2 -2
  12. package/src/tool/chromaticLens/i18n/de.ts +6 -6
  13. package/src/tool/chromaticLens/i18n/fr.ts +3 -3
  14. package/src/tool/chromaticLens/i18n/pl.ts +1 -1
  15. package/src/tool/chromaticLens/i18n/ru.ts +10 -10
  16. package/src/tool/chromaticLens/i18n/zh.ts +2 -2
  17. package/src/tool/collageMaker/component.astro +3 -3
  18. package/src/tool/collageMaker/i18n/de.ts +6 -6
  19. package/src/tool/collageMaker/i18n/fr.ts +4 -4
  20. package/src/tool/collageMaker/i18n/pl.ts +5 -5
  21. package/src/tool/collageMaker/i18n/ru.ts +12 -12
  22. package/src/tool/collageMaker/i18n/sv.ts +3 -3
  23. package/src/tool/collageMaker/i18n/zh.ts +1 -1
  24. package/src/tool/depthOfFieldCalculator/component.astro +1 -1
  25. package/src/tool/depthOfFieldCalculator/i18n/de.ts +3 -3
  26. package/src/tool/depthOfFieldCalculator/i18n/en.ts +7 -7
  27. package/src/tool/depthOfFieldCalculator/i18n/es.ts +2 -2
  28. package/src/tool/depthOfFieldCalculator/i18n/fr.ts +6 -6
  29. package/src/tool/depthOfFieldCalculator/i18n/id.ts +2 -2
  30. package/src/tool/depthOfFieldCalculator/i18n/it.ts +2 -2
  31. package/src/tool/depthOfFieldCalculator/i18n/ja.ts +1 -1
  32. package/src/tool/depthOfFieldCalculator/i18n/ko.ts +1 -1
  33. package/src/tool/depthOfFieldCalculator/i18n/nl.ts +2 -2
  34. package/src/tool/depthOfFieldCalculator/i18n/pl.ts +2 -2
  35. package/src/tool/depthOfFieldCalculator/i18n/pt.ts +2 -2
  36. package/src/tool/depthOfFieldCalculator/i18n/ru.ts +6 -6
  37. package/src/tool/depthOfFieldCalculator/i18n/sv.ts +2 -2
  38. package/src/tool/depthOfFieldCalculator/i18n/tr.ts +1 -1
  39. package/src/tool/depthOfFieldCalculator/i18n/zh.ts +3 -3
  40. package/src/tool/exifCleaner/component.astro +1 -1
  41. package/src/tool/exifCleaner/i18n/de.ts +8 -8
  42. package/src/tool/exifCleaner/i18n/fr.ts +11 -11
  43. package/src/tool/exifCleaner/i18n/pl.ts +6 -6
  44. package/src/tool/exifCleaner/i18n/ru.ts +14 -14
  45. package/src/tool/exifCleaner/i18n/zh.ts +3 -3
  46. package/src/tool/imageCompressor/component.astro +6 -4
  47. package/src/tool/imageCompressor/i18n/de.ts +16 -16
  48. package/src/tool/imageCompressor/i18n/fr.ts +8 -8
  49. package/src/tool/imageCompressor/i18n/pl.ts +1 -1
  50. package/src/tool/imageCompressor/i18n/ru.ts +9 -9
  51. package/src/tool/imageCompressor/i18n/zh.ts +1 -1
  52. package/src/tool/printQualityCalculator/component.astro +118 -110
  53. package/src/tool/printQualityCalculator/i18n/de.ts +5 -5
  54. package/src/tool/printQualityCalculator/i18n/fr.ts +11 -11
  55. package/src/tool/printQualityCalculator/i18n/pl.ts +4 -4
  56. package/src/tool/printQualityCalculator/i18n/ru.ts +11 -11
  57. package/src/tool/printQualityCalculator/i18n/zh.ts +4 -4
  58. package/src/tool/printQualityCalculator/print-quality-calculator-pixels-to-cm-dpi.css +193 -40
  59. package/src/tool/privacyBlur/component.astro +2 -2
  60. package/src/tool/privacyBlur/i18n/de.ts +5 -5
  61. package/src/tool/privacyBlur/i18n/fr.ts +9 -9
  62. package/src/tool/privacyBlur/i18n/ru.ts +6 -6
  63. package/src/tool/subtitleSync/component.astro +2 -2
  64. package/src/tool/subtitleSync/i18n/de.ts +1 -1
  65. package/src/tool/subtitleSync/i18n/fr.ts +9 -9
  66. package/src/tool/subtitleSync/i18n/ru.ts +6 -6
  67. package/src/tool/subtitleSync/i18n/sv.ts +4 -4
  68. package/src/tool/timelapseCalculator/i18n/fr.ts +6 -6
  69. package/src/tool/timelapseCalculator/i18n/ru.ts +3 -3
  70. package/src/tool/timelapseCalculator/i18n/zh.ts +4 -4
  71. package/src/tool/tvDistance/component.astro +1 -1
  72. package/src/tool/tvDistance/i18n/fr.ts +2 -2
  73. package/src/tool/tvDistance/i18n/ru.ts +9 -9
  74. package/src/tool/tvDistance/i18n/zh.ts +4 -4
  75. package/src/tool/videoFrameExtractor/component.astro +3 -3
  76. package/src/tool/videoFrameExtractor/i18n/fr.ts +8 -8
  77. package/src/tool/videoFrameExtractor/i18n/ru.ts +2 -2
  78. package/src/tool/videoMerger/component.astro +3 -3
  79. package/src/tool/videoMerger/i18n/de.ts +1 -1
  80. package/src/tool/videoMerger/i18n/fr.ts +6 -6
@@ -3,14 +3,14 @@ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dt
3
3
  import type { DepthOfFieldUI, DepthOfFieldLocaleContent } from '../index';
4
4
 
5
5
  const slug = 'calculateur-profondeur-de-champ';
6
- const title = 'Calculateur de Profondeur de Champ : DoF en Temps Réel';
6
+ const title = 'Calculateur de Profondeur de Champ: DoF en Temps Réel';
7
7
  const description = 'Calculez la profondeur de champ, la distance hyperfocale et les limites de mise au point en temps réel. Compatible avec tous les capteurs.';
8
8
 
9
9
  const ui: DepthOfFieldUI = {
10
10
  title: 'Profondeur de Champ',
11
11
  paramsTitle: 'Paramètres',
12
12
  sensorLabel: 'Capteur de l\'Appareil',
13
- moreLabel: 'Plus de capteurs',
13
+ moreLabel: 'Plus de capteurs...',
14
14
  apertureLabel: 'Ouverture',
15
15
  focalLabel: 'Distance Focale',
16
16
  distanceLabel: 'Distance du Sujet',
@@ -78,9 +78,9 @@ const seo: DepthOfFieldLocaleContent['seo'] = [
78
78
  ['Distance du Sujet', '1m → 10m', 'Sujet plus loin = DoF plus grande'],
79
79
  ]},
80
80
 
81
- { type: 'title', text: 'La Distance Hyperfocale : Netteté Maximale', level: 3 },
81
+ { type: 'title', text: 'La Distance Hyperfocale: Netteté Maximale', level: 3 },
82
82
  { type: 'paragraph', html: 'En réglant la mise au point sur la <strong>distance hyperfocale</strong>, tout ce qui se trouve entre la moitié de cette distance et l\'infini sera net. Idéal pour les paysages.' },
83
- { type: 'tip', title: 'Conseil pratique', html: 'Pour la photo de rue, réglez votre mise au point sur l\'hyperfocale. Avec un 35mm sur APS-C à f/8, l\'hyperfocale est à environ <strong>4 mètres</strong> : tout sera net de 2m à l\'infini.' },
83
+ { type: 'tip', title: 'Conseil pratique', html: 'Pour la photo de rue, réglez votre mise au point sur l\'hyperfocale. Avec un 35mm sur APS-C à f/8, l\'hyperfocale est à environ <strong>4 mètres</strong>: tout sera net de 2m à l\'infini.' },
84
84
 
85
85
  { type: 'title', text: 'Taille du Capteur et Cercle de Confusion', level: 3 },
86
86
  { type: 'paragraph', html: 'Le <strong>cercle de confusion (CoC)</strong> définit la netteté acceptable. Un capteur Plein Format a un CoC de 0,030 mm, contre ~0,006 mm pour un smartphone. Un CoC plus petit signifie des critères de netteté plus stricts.' },
@@ -90,9 +90,9 @@ const seo: DepthOfFieldLocaleContent['seo'] = [
90
90
  { label: 'Smartphone', value: '0,006 mm', icon: 'mdi:cellphone' },
91
91
  ]},
92
92
 
93
- { type: 'title', text: 'DoF au Cinéma : Focale vs Capteur', level: 3 },
93
+ { type: 'title', text: 'DoF au Cinéma: Focale vs Capteur', level: 3 },
94
94
  { type: 'paragraph', html: 'Le tournage en Super 35 utilise souvent des focales plus longues pour compresser la perspective, créant ainsi le "look cinéma". Un objectif lumineux à 85mm est le choix classique pour le portrait.' },
95
- { type: 'diagnostic', variant: 'success', title: 'La Règle de Distribution de la Netteté', icon: 'mdi:lightbulb-outline', badge: 'Technique Pro', html: 'Pour un sujet à 3m avec un 50mm à f/2.8 : la zone nette s\'étend vers l\'arrière environ <strong>deux fois plus</strong> que vers l\'avant (ratio 2:1).' },
95
+ { type: 'diagnostic', variant: 'success', title: 'La Règle de Distribution de la Netteté', icon: 'mdi:lightbulb-outline', badge: 'Technique Pro', html: 'Pour un sujet à 3m avec un 50mm à f/2.8: la zone nette s\'étend vers l\'arrière environ <strong>deux fois plus</strong> que vers l\'avant (ratio 2:1).' },
96
96
  ];
97
97
 
98
98
  const faqSchema: WithContext<FAQPage> = {
@@ -10,7 +10,7 @@ const ui: DepthOfFieldUI = {
10
10
  title: 'Kalkulator Kedalaman Bidang',
11
11
  paramsTitle: 'Parameter',
12
12
  sensorLabel: 'Sensor Kamera',
13
- moreLabel: 'Sensor lainnya',
13
+ moreLabel: 'Sensor lainnya...',
14
14
  apertureLabel: 'Apertur',
15
15
  focalLabel: 'Panjang Fokus',
16
16
  distanceLabel: 'Jarak Objek',
@@ -92,7 +92,7 @@ const seo: DepthOfFieldLocaleContent['seo'] = [
92
92
 
93
93
  { type: 'title', text: 'DoF dalam Sinema: Panjang Fokus vs Sensor', level: 3 },
94
94
  { type: 'paragraph', html: 'Sinematografer yang menggunakan Super 35 sering menggunakan panjang fokus yang lebih panjang untuk mengompresi perspektif, yang juga mempersempit DoF dan menciptakan "tampilan sinematik".' },
95
- { type: 'diagnostic', variant: 'success', title: 'Aturan Distribusi Fokus', icon: 'mdi:lightbulb-outline', badge: 'Teknik Pro', html: 'Untuk subjek pada 3 meter dengan lensa 50mm di f/2.8 : zona tajam di belakang subjek selalu lebih besar daripada di depan kira-kira dengan <strong>rasio 2:1</strong>.' },
95
+ { type: 'diagnostic', variant: 'success', title: 'Aturan Distribusi Fokus', icon: 'mdi:lightbulb-outline', badge: 'Teknik Pro', html: 'Untuk subjek pada 3 meter dengan lensa 50mm di f/2.8: zona tajam di belakang subjek selalu lebih besar daripada di depan - kira-kira dengan <strong>rasio 2:1</strong>.' },
96
96
  ];
97
97
 
98
98
  const faqSchema: WithContext<FAQPage> = {
@@ -10,7 +10,7 @@ const ui: DepthOfFieldUI = {
10
10
  title: 'Profondità di Campo',
11
11
  paramsTitle: 'Parametri',
12
12
  sensorLabel: 'Sensore Fotocamera',
13
- moreLabel: 'Altri sensori',
13
+ moreLabel: 'Altri sensori...',
14
14
  apertureLabel: 'Apertura',
15
15
  focalLabel: 'Lunghezza Focale',
16
16
  distanceLabel: 'Distanza Soggetto',
@@ -92,7 +92,7 @@ const seo: DepthOfFieldLocaleContent['seo'] = [
92
92
 
93
93
  { type: 'title', text: 'DoF nel cinema: Focale vs Sensore', level: 3 },
94
94
  { type: 'paragraph', html: 'Riprendere in Super 35 (simile ad APS-C) spesso richiede focali più lunghe per comprimere la prospettiva, creando il classico "look cinematografico". Un 85mm luminoso è ideale per i ritratti.' },
95
- { type: 'diagnostic', variant: 'success', title: 'La regola di distribuzione del fuoco', icon: 'mdi:lightbulb-outline', badge: 'Tecnica Pro', html: 'Per un soggetto a 3m con un 50mm a f/2.8 : la zona nitida dietro il soggetto è sempre maggiore di quella davanti, con un <strong>rapporto di circa 2:1</strong>.' },
95
+ { type: 'diagnostic', variant: 'success', title: 'La regola di distribuzione del fuoco', icon: 'mdi:lightbulb-outline', badge: 'Tecnica Pro', html: 'Per un soggetto a 3m con un 50mm a f/2.8: la zona nitida dietro il soggetto è sempre maggiore di quella davanti, con un <strong>rapporto di circa 2:1</strong>.' },
96
96
  ];
97
97
 
98
98
  const faqSchema: WithContext<FAQPage> = {
@@ -10,7 +10,7 @@ const ui: DepthOfFieldUI = {
10
10
  title: '被写界深度計算機',
11
11
  paramsTitle: '設定パラメータ',
12
12
  sensorLabel: 'カメラセンサー',
13
- moreLabel: 'その他のセンサー…',
13
+ moreLabel: 'その他のセンサー...',
14
14
  apertureLabel: '絞り値 (Aperture)',
15
15
  focalLabel: '焦点距離 (Focal Length)',
16
16
  distanceLabel: '被写体距離',
@@ -10,7 +10,7 @@ const ui: DepthOfFieldUI = {
10
10
  title: '피사체 깊이 계산기',
11
11
  paramsTitle: '설정 파라미터',
12
12
  sensorLabel: '카메라 센서',
13
- moreLabel: '기타 센서…',
13
+ moreLabel: '기타 센서...',
14
14
  apertureLabel: '조리개값 (Aperture)',
15
15
  focalLabel: '초점 거리 (Focal Length)',
16
16
  distanceLabel: '피사체 거리',
@@ -10,7 +10,7 @@ const ui: DepthOfFieldUI = {
10
10
  title: 'Scherptediepte Calculator',
11
11
  paramsTitle: 'Parameters',
12
12
  sensorLabel: 'Camerasensor',
13
- moreLabel: 'Meer sensoren',
13
+ moreLabel: 'Meer sensoren...',
14
14
  apertureLabel: 'Diafragma',
15
15
  focalLabel: 'Brandpuntsafstand',
16
16
  distanceLabel: 'Afstand tot onderwerp',
@@ -92,7 +92,7 @@ const seo: DepthOfFieldLocaleContent['seo'] = [
92
92
 
93
93
  { type: 'title', text: 'DoF in film: Brandpuntsafstand vs. Sensor', level: 3 },
94
94
  { type: 'paragraph', html: 'Filmen op Super 35 gebruikt vaak langere brandpuntsafstanden voor de "cinematic look". Een lichtsterke 85mm lens bij portretopnames is een klassieke keuze.' },
95
- { type: 'diagnostic', variant: 'success', title: 'De focusverdelingsregel', icon: 'mdi:lightbulb-outline', badge: 'Pro-techniek', html: 'Voor een onderwerp op 3m met 50mm bij f/2.8: het scherptegebied achter het onderwerp is altijd groter dan ervoor ongeveer in een <strong>verhouding van 2:1</strong>.' },
95
+ { type: 'diagnostic', variant: 'success', title: 'De focusverdelingsregel', icon: 'mdi:lightbulb-outline', badge: 'Pro-techniek', html: 'Voor een onderwerp op 3m met 50mm bij f/2.8: het scherptegebied achter het onderwerp is altijd groter dan ervoor - ongeveer in een <strong>verhouding van 2:1</strong>.' },
96
96
  ];
97
97
 
98
98
  const faqSchema: WithContext<FAQPage> = {
@@ -10,7 +10,7 @@ const ui: DepthOfFieldUI = {
10
10
  title: 'Głębia Ostrości',
11
11
  paramsTitle: 'Parametry',
12
12
  sensorLabel: 'Matryca Aparatu',
13
- moreLabel: 'Więcej matryc',
13
+ moreLabel: 'Więcej matryc...',
14
14
  apertureLabel: 'Przysłona',
15
15
  focalLabel: 'Ogniskowa',
16
16
  distanceLabel: 'Odległość od Obiektu',
@@ -92,7 +92,7 @@ const seo: DepthOfFieldLocaleContent['seo'] = [
92
92
 
93
93
  { type: 'title', text: 'DoF w kinie: Ogniskowa vs Matryca', level: 3 },
94
94
  { type: 'paragraph', html: 'Filmowanie w formacie Super 35 często wykorzystuje dłuższe ogniskowe dla uzyskania "filmowego wyglądu". Jasny obiektyw 85mm to klasyk w portrecie.' },
95
- { type: 'diagnostic', variant: 'success', title: 'Zasada dystrybucji ostrości', icon: 'mdi:lightbulb-outline', badge: 'Technika Pro', html: 'Dla obiektu w odległości 3m przy 50mm i f/2.8: strefa ostrości za obiektem jest zawsze większa niż przed nim około w <strong>stosunku 2:1</strong>.' },
95
+ { type: 'diagnostic', variant: 'success', title: 'Zasada dystrybucji ostrości', icon: 'mdi:lightbulb-outline', badge: 'Technika Pro', html: 'Dla obiektu w odległości 3m przy 50mm i f/2.8: strefa ostrości za obiektem jest zawsze większa niż przed nim - około w <strong>stosunku 2:1</strong>.' },
96
96
  ];
97
97
 
98
98
  const faqSchema: WithContext<FAQPage> = {
@@ -10,7 +10,7 @@ const ui: DepthOfFieldUI = {
10
10
  title: 'Profundidade de Campo',
11
11
  paramsTitle: 'Parâmetros',
12
12
  sensorLabel: 'Sensor da Câmara',
13
- moreLabel: 'Mais sensores',
13
+ moreLabel: 'Mais sensores...',
14
14
  apertureLabel: 'Abertura',
15
15
  focalLabel: 'Distância Focal',
16
16
  distanceLabel: 'Distância do Sujeito',
@@ -92,7 +92,7 @@ const seo: DepthOfFieldLocaleContent['seo'] = [
92
92
 
93
93
  { type: 'title', text: 'DoF no Cinema: Focal vs. Sensor', level: 3 },
94
94
  { type: 'paragraph', html: 'Filmar em Super 35 exige frequentemente focais mais longas para comprimir a perspetiva, criando o "look cinematográfico". Um 85mm luminoso é a escolha clássica para retrato.' },
95
- { type: 'diagnostic', variant: 'success', title: 'A Regra de Distribuição do Foco', icon: 'mdi:lightbulb-outline', badge: 'Técnica Pro', html: 'Para um sujeito a 3m com uma 50mm a f/2.8 : a zona nítida atrás do sujeito é sempre maior do que à frente aprox. na <strong>proporção 2:1</strong>.' },
95
+ { type: 'diagnostic', variant: 'success', title: 'A Regra de Distribuição do Foco', icon: 'mdi:lightbulb-outline', badge: 'Técnica Pro', html: 'Para um sujeito a 3m com uma 50mm a f/2.8: a zona nítida atrás do sujeito é sempre maior do que à frente - aprox. na <strong>proporção 2:1</strong>.' },
96
96
  ];
97
97
 
98
98
  const faqSchema: WithContext<FAQPage> = {
@@ -10,7 +10,7 @@ const ui: DepthOfFieldUI = {
10
10
  title: 'Глубина резкости',
11
11
  paramsTitle: 'Параметры',
12
12
  sensorLabel: 'Матрица камеры',
13
- moreLabel: 'Больше матриц…',
13
+ moreLabel: 'Больше матриц...',
14
14
  apertureLabel: 'Диафрагма',
15
15
  focalLabel: 'Фокусное расстояние',
16
16
  distanceLabel: 'Расстояние до объекта',
@@ -32,7 +32,7 @@ const ui: DepthOfFieldUI = {
32
32
  const faq: DepthOfFieldLocaleContent['faq'] = [
33
33
  {
34
34
  question: 'Что такое глубина резкости?',
35
- answer: 'Глубина резко изображаемого пространства (ГРИП) это диапазон расстояний в сцене, которые выглядят резкими. Зависит от диафрагмы, фокусного расстояния, дистанции и матрицы.',
35
+ answer: 'Глубина резко изображаемого пространства (ГРИП) - это диапазон расстояний в сцене, которые выглядят резкими. Зависит от диафрагмы, фокусного расстояния, дистанции и матрицы.',
36
36
  },
37
37
  {
38
38
  question: 'Что такое гиперфокальное расстояние?',
@@ -69,7 +69,7 @@ const howTo: DepthOfFieldLocaleContent['howTo'] = [
69
69
 
70
70
  const seo: DepthOfFieldLocaleContent['seo'] = [
71
71
  { type: 'title', text: 'Понимание глубины резкости в фотографии и кино', level: 2 },
72
- { type: 'paragraph', html: 'Глубина резкости один из мощнейших творческих инструментов. <strong>Малая глубина резкости</strong> выделяет объект, а <strong>большая</strong> делает резким весь пейзаж. Этот калькулятор дает вам полный контроль.' },
72
+ { type: 'paragraph', html: 'Глубина резкости - один из мощнейших творческих инструментов. <strong>Малая глубина резкости</strong> выделяет объект, а <strong>большая</strong> - делает резким весь пейзаж. Этот калькулятор дает вам полный контроль.' },
73
73
 
74
74
  { type: 'title', text: 'Три фактора управления ГРИП', level: 3 },
75
75
  { type: 'table', headers: ['Фактор', 'Увеличение →', 'Влияние на ГРИП'], rows: [
@@ -83,7 +83,7 @@ const seo: DepthOfFieldLocaleContent['seo'] = [
83
83
  { type: 'tip', title: 'Практический совет', html: 'Для стрит-фото установите фокус на гиперфокал. С 35мм на APS-C при f/8 это около <strong>4 метров</strong>: всё от 2м до бесконечности будет в фокусе.' },
84
84
 
85
85
  { type: 'title', text: 'Размер матрицы и кружок рассеяния', level: 3 },
86
- { type: 'paragraph', html: '<strong>Кружок рассеяния (CoC)</strong> определяет границу резкости. Для Full Frame это 0.030 мм, для смартфона около 0.006 мм. Меньший CoC требует большей точности.', label: 'Примеры CoC' },
86
+ { type: 'paragraph', html: '<strong>Кружок рассеяния (CoC)</strong> определяет границу резкости. Для Full Frame это 0.030 мм, для смартфона - около 0.006 мм. Меньший CoC требует большей точности.', label: 'Примеры CoC' },
87
87
  { type: 'stats', columns: 3, items: [
88
88
  { label: 'Full Frame', value: '0.030 мм', icon: 'mdi:camera' },
89
89
  { label: 'APS-C', value: '0.019 мм', icon: 'mdi:camera-outline' },
@@ -91,8 +91,8 @@ const seo: DepthOfFieldLocaleContent['seo'] = [
91
91
  ]},
92
92
 
93
93
  { type: 'title', text: 'ГРИП в кино: Фокус vs Матрица', level: 3 },
94
- { type: 'paragraph', html: 'В кино на Super 35 часто используют длинный фокус для сжатия перспективы и создания "киношного вида". Светосильный 85мм классика для портретов.' },
95
- { type: 'diagnostic', variant: 'success', title: 'Правило распределения фокуса', icon: 'mdi:lightbulb-outline', badge: 'Профи-прием', html: 'Для объекта на 3м с 50мм на f/2.8: зона резкости сзади всегда больше, чем спереди примерно в <strong>пропорции 2:1</strong>.' },
94
+ { type: 'paragraph', html: 'В кино на Super 35 часто используют длинный фокус для сжатия перспективы и создания "киношного вида". Светосильный 85мм - классика для портретов.' },
95
+ { type: 'diagnostic', variant: 'success', title: 'Правило распределения фокуса', icon: 'mdi:lightbulb-outline', badge: 'Профи-прием', html: 'Для объекта на 3м с 50мм на f/2.8: зона резкости сзади всегда больше, чем спереди - примерно в <strong>пропорции 2:1</strong>.' },
96
96
  ];
97
97
 
98
98
  const faqSchema: WithContext<FAQPage> = {
@@ -10,7 +10,7 @@ const ui: DepthOfFieldUI = {
10
10
  title: 'Skärpedjupskalkylator',
11
11
  paramsTitle: 'Parametrar',
12
12
  sensorLabel: 'Kamerasensor',
13
- moreLabel: 'Fler sensorer',
13
+ moreLabel: 'Fler sensorer...',
14
14
  apertureLabel: 'Bländare',
15
15
  focalLabel: 'Brännvidd',
16
16
  distanceLabel: 'Motivavstånd',
@@ -92,7 +92,7 @@ const seo: DepthOfFieldLocaleContent['seo'] = [
92
92
 
93
93
  { type: 'title', text: 'DoF i film: Brännvidd vs Sensor', level: 3 },
94
94
  { type: 'paragraph', html: 'Filmning i Super 35 använder ofta längre brännvidd för att komprimera perspektivet och skapa en "filmisk look". Ett ljusstarkt 85mm-objektiv är klassiskt för porträtt.' },
95
- { type: 'diagnostic', variant: 'success', title: 'Regeln för fokusfördelning', icon: 'mdi:lightbulb-outline', badge: 'Pro-teknik', html: 'För ett motiv på 3m med 50mm vid f/2.8: det skarpa området bakom motivet är alltid större än framför ungefär i <strong>förhållandet 2:1</strong>.' },
95
+ { type: 'diagnostic', variant: 'success', title: 'Regeln för fokusfördelning', icon: 'mdi:lightbulb-outline', badge: 'Pro-teknik', html: 'För ett motiv på 3m med 50mm vid f/2.8: det skarpa området bakom motivet är alltid större än framför - ungefär i <strong>förhållandet 2:1</strong>.' },
96
96
  ];
97
97
 
98
98
  const faqSchema: WithContext<FAQPage> = {
@@ -10,7 +10,7 @@ const ui: DepthOfFieldUI = {
10
10
  title: 'Alan Derinliği Hesaplama',
11
11
  paramsTitle: 'Parametreler',
12
12
  sensorLabel: 'Kamera Sensörü',
13
- moreLabel: 'Daha fazla sensör',
13
+ moreLabel: 'Daha fazla sensör...',
14
14
  apertureLabel: 'Diyafram',
15
15
  focalLabel: 'Odak Uzaklığı',
16
16
  distanceLabel: 'Obje Mesafesi',
@@ -10,7 +10,7 @@ const ui: DepthOfFieldUI = {
10
10
  title: '景深计算器',
11
11
  paramsTitle: '设定参数',
12
12
  sensorLabel: '相机传感器',
13
- moreLabel: '更多传感器…',
13
+ moreLabel: '更多传感器...',
14
14
  apertureLabel: '光圈值',
15
15
  focalLabel: '焦距',
16
16
  distanceLabel: '拍摄距离',
@@ -83,7 +83,7 @@ const seo: DepthOfFieldLocaleContent['seo'] = [
83
83
  { type: 'tip', title: '实践建议', html: '对于街头摄影,将焦点设为超焦距。在 APS-C 上使用 35mm 镜头并设置 f/8 时,超焦距约为 <strong>4 米</strong>:从 2 米到无穷远的一切都将保持清晰。' },
84
84
 
85
85
  { type: 'title', text: '传感器尺寸与弥散圆', level: 3 },
86
- { type: 'paragraph', html: '<strong>弥散圆 (CoC)</strong> 是定义“清晰度”的阈值。全画幅传感器的 CoC 为 0.030mm,而智能手机约为 0.006mm。CoC 值越小意味着清晰度要求越严格。' },
86
+ { type: 'paragraph', html: '<strong>弥散圆 (CoC)</strong> 是定义\"清晰度\"的阈值。全画幅传感器的 CoC 为 0.030mm,而智能手机约为 0.006mm。CoC 值越小意味着清晰度要求越严格。' },
87
87
  { type: 'stats', columns: 3, items: [
88
88
  { label: '全画幅', value: '0.030 mm', icon: 'mdi:camera' },
89
89
  { label: 'APS-C', value: '0.019 mm', icon: 'mdi:camera-outline' },
@@ -91,7 +91,7 @@ const seo: DepthOfFieldLocaleContent['seo'] = [
91
91
  ]},
92
92
 
93
93
  { type: 'title', text: '电影中的景深:焦距 vs. 传感器', level: 3 },
94
- { type: 'paragraph', html: '在 Super 35(接近 APS-C)上拍摄的电影人经常使用较长焦距来压缩透视,这也会收窄景深,营造出“电影感”。大光圈 85mm 是经典人像选择。' },
94
+ { type: 'paragraph', html: '在 Super 35(接近 APS-C)上拍摄的电影人经常使用较长焦距来压缩透视,这也会收窄景深,营造出\"电影感\"。大光圈 85mm 是经典人像选择。' },
95
95
  { type: 'diagnostic', variant: 'success', title: '焦点分布规律', icon: 'mdi:lightbulb-outline', badge: '专家技法', html: '对于 3 米处的主体,使用 50mm f/2.8 全画幅拍摄:主体后的清晰区域总是比主体前大,比例约为 <strong>2:1</strong>。' },
96
96
  ];
97
97
 
@@ -12,7 +12,7 @@ const { ui } = Astro.props;
12
12
  <div class="ec-card">
13
13
 
14
14
  <div id="ec-initial" class="ec-drop">
15
- <input type="file" id="ec-file" accept="image/jpeg,image/png,image/webp" class="ec-hidden" />
15
+ <input type="file" id="ec-file" accept="image/jpeg,image/png,image/webp" class="ec-hidden" aria-label={ui.dropTitle} />
16
16
  <div class="ec-drop-icon">
17
17
  <svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
18
18
  <path d="M19.35 10.04A7.49 7.49 0 0 0 12 4C9.11 4 6.6 5.64 5.35 8.04A5.994 5.994 0 0 0 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zm-4.35 3.96h-3v3H9v-3H6v-2h3V8h2v3h3v2z"/>
@@ -73,15 +73,15 @@ const seo: ExifCleanerLocaleContent['seo'] = [
73
73
  items: [
74
74
  'GPS-Koordinaten und Standort sofort aus Ihren Fotos entfernen',
75
75
  'Kameramodell, Seriennummer und technische Informationen löschen',
76
- '%100 % browserbasierte Verarbeitung Ihre Bilder verlassen niemals Ihr Gerät',
77
- 'Behält die visuelle Qualität bei nur versteckte Daten werden entfernt'
76
+ '%100 % browserbasierte Verarbeitung - Ihre Bilder verlassen niemals Ihr Gerät',
77
+ 'Behält die visuelle Qualität bei - nur versteckte Daten werden entfernt'
78
78
  ]
79
79
  },
80
80
  { type: 'title', text: 'Vollständiger Leitfaden zum Datenschutz und zu EXIF Metadaten in der digitalen Fotografie', level: 2 },
81
81
  { type: 'paragraph', html: 'Haben Sie sich jemals gefragt, wie viele persönliche Informationen Sie teilen, wenn Sie ein Foto in soziale Medien hochladen? EXIF-Metadaten sind wie ein <strong>unsichtbarer Fingerabdruck</strong>, der alles verraten kann, von Ihrem genauen Wohnort bis hin zum Preis Ihrer Fotoausrüstung. Dieser Leitfaden erklärt, wie Sie Ihre Privatsphäre effektiv schützen.' },
82
82
 
83
83
  { type: 'stats', items: [
84
- { value: '100 %', label: 'Privatsphäre Lokale Verarbeitung', icon: 'mdi:shield-check' },
84
+ { value: '100 %', label: 'Privatsphäre - Lokale Verarbeitung', icon: 'mdi:shield-check' },
85
85
  { value: '0 %', label: 'Auf Servern gespeicherte Daten', icon: 'mdi:database' },
86
86
  { value: 'Sofort', label: 'Metadaten-Entfernung', icon: 'mdi:lightning-bolt' }
87
87
  ], columns: 3 },
@@ -163,26 +163,26 @@ const seo: ExifCleanerLocaleContent['seo'] = [
163
163
 
164
164
  { type: 'proscons', items: [
165
165
  {
166
- pro: 'Absoluter Datenschutz 100 % browserbasierte Verarbeitung',
166
+ pro: 'Absoluter Datenschutz - 100 % browserbasierte Verarbeitung',
167
167
  con: 'Erfordert einen modernen Browser mit JavaScript-Unterstützung'
168
168
  },
169
169
  {
170
- pro: 'Sofort Reinigung eines Fotos dauert weniger als 1 Sekunde',
170
+ pro: 'Sofort - Reinigung eines Fotos dauert weniger als 1 Sekunde',
171
171
  con: 'Verarbeitung großer Fotos kann auf älteren Geräten langsam sein'
172
172
  },
173
173
  {
174
- pro: 'Null Qualitätsverlust entfernt nur technische Daten, keine Pixel',
174
+ pro: 'Null Qualitätsverlust - entfernt nur technische Daten, keine Pixel',
175
175
  con: 'Bearbeitet das Bild nicht (Zuschnitte, Rotationen usw.)'
176
176
  },
177
177
  {
178
- pro: 'Völlig kostenlos ohne Limits unbegrenzt Fotos verarbeiten',
178
+ pro: 'Völlig kostenlos ohne Limits - unbegrenzt Fotos verarbeiten',
179
179
  con: 'Kein Premium-Support oder Cloud-Speicher'
180
180
  }
181
181
  ], proTitle: 'Hauptvorteile', conTitle: 'Einschränkungen' },
182
182
 
183
183
  { type: 'tip', title: 'Tipp zur digitalen Sicherheit', html: '<strong>Reinigen Sie Ihre Fotos BEVOR sie</strong> in sozialen Netzwerken gepostet werden. Selbst wenn Sie einen Post löschen, könnten Metadaten bereits von Suchmaschinen oder Archiven indexiert worden sein. Vorsorge ist besser als Nachsorge. Machen Sie es sich zur Gewohnheit: <br><br><em>Foto → EXIF reinigen → Posten</em>' },
184
184
 
185
- { type: 'diagnostic', variant: 'warning', title: 'Reale Risiken bei fehlender Reinigung', icon: 'mdi:alert-circle', badge: 'Kritische Sicherheit', html: '<strong>Dokumentierte Fälle:</strong><br>- Eltern posten Fotos von Kindern Täter verfolgten GPS<br>- Reisende Fotografen Häuser wurden während ihrer Abwesenheit ausgeraubt<br>- Influencer Wohnorte wurden von obsessiven Fans identifiziert<br><br>Das ist keine Paranoia: Es ist grundlegende digitale Hygiene im Jahr 2026.' },
185
+ { type: 'diagnostic', variant: 'warning', title: 'Reale Risiken bei fehlender Reinigung', icon: 'mdi:alert-circle', badge: 'Kritische Sicherheit', html: '<strong>Dokumentierte Fälle:</strong><br>- Eltern posten Fotos von Kindern - Täter verfolgten GPS<br>- Reisende Fotografen - Häuser wurden während ihrer Abwesenheit ausgeraubt<br>- Influencer - Wohnorte wurden von obsessiven Fans identifiziert<br><br>Das ist keine Paranoia: Es ist grundlegende digitale Hygiene im Jahr 2026.' },
186
186
 
187
187
  { type: 'glossary', items: [
188
188
  {
@@ -4,7 +4,7 @@ import type { ExifCleanerUI, ExifCleanerLocaleContent } from '../index';
4
4
 
5
5
  const slug = 'nettoyeur-metadonnees-exif-supprimer-gps-confidentialite-photo';
6
6
  const title = 'Nettoyeur de Métadonnées EXIF: Supprimez le GPS et les Données Cachées';
7
- const description = 'Outil en ligne gratuit pour effacer les métadonnées EXIF, les coordonnées GPS et les caractéristiques de l\'appareil de vos images avant de les partager. 100 % confidentiel : fonctionne sans téléversement.';
7
+ const description = 'Outil en ligne gratuit pour effacer les métadonnées EXIF, les coordonnées GPS et les caractéristiques de l\'appareil de vos images avant de les partager. 100 % confidentiel: fonctionne sans téléversement.';
8
8
 
9
9
  const ui: ExifCleanerUI = {
10
10
  dropTitle: "Faites glisser votre image ici",
@@ -97,7 +97,7 @@ const seo: ExifCleanerLocaleContent['seo'] = [
97
97
  '<strong>Données de Copyright :</strong> Photographe, droits d\'auteur et notes personnelles.'
98
98
  ] },
99
99
 
100
- { type: 'title', text: 'Risques de Sécurité Réels : Cas d\'Utilisation', level: 3 },
100
+ { type: 'title', text: 'Risques de Sécurité Réels: Cas d\'Utilisation', level: 3 },
101
101
  { type: 'comparative', items: [
102
102
  {
103
103
  title: 'Photographes Professionnels',
@@ -111,7 +111,7 @@ const seo: ExifCleanerLocaleContent['seo'] = [
111
111
  },
112
112
  {
113
113
  title: 'Parents et Influenceurs',
114
- description: 'Danger extrême : localisation des enfants en temps réel',
114
+ description: 'Danger extrême: localisation des enfants en temps réel',
115
115
  icon: 'mdi:alert',
116
116
  points: [
117
117
  'Les prédateurs suivent les emplacements via l\'OSINT',
@@ -180,14 +180,14 @@ const seo: ExifCleanerLocaleContent['seo'] = [
180
180
  }
181
181
  ], proTitle: 'Avantages Clés', conTitle: 'Limitations' },
182
182
 
183
- { type: 'tip', title: 'Conseil de Sécurité Numérique', html: '<strong>Nettoyez vos photos AVANT de les publier</strong> sur n\'importe quel réseau social. Même si vous supprimez une publication, les métadonnées ont pu être indexées par des moteurs de recherche ou des archives. Mieux vaut prévenir que guérir. Prenez l\'habitude : <br><br><em>Photo → Nettoyer EXIF → Publier</em>' },
183
+ { type: 'tip', title: 'Conseil de Sécurité Numérique', html: '<strong>Nettoyez vos photos AVANT de les publier</strong> sur n\'importe quel réseau social. Même si vous supprimez une publication, les métadonnées ont pu être indexées par des moteurs de recherche ou des archives. Mieux vaut prévenir que guérir. Prenez l\'habitude: <br><br><em>Photo → Nettoyer EXIF → Publier</em>' },
184
184
 
185
- { type: 'diagnostic', variant: 'warning', title: 'Risques Réels sans Nettoyage', icon: 'mdi:alert-circle', badge: 'Sécurité Critique', html: '<strong>Cas documentés :</strong><br>- Parents publiant des photos d\'enfants - les prédateurs ont suivi le GPS<br>- Photographes voyageurs - maisons cambriolées pendant leur absence<br>- Influenceurs - lieux de résidence identifiés par des fans obsessifs<br><br>Ce n\'est pas de la paranoïa : c\'est une hygiène numérique de base en 2026.' },
185
+ { type: 'diagnostic', variant: 'warning', title: 'Risques Réels sans Nettoyage', icon: 'mdi:alert-circle', badge: 'Sécurité Critique', html: '<strong>Cas documentés :</strong><br>- Parents publiant des photos d\'enfants - les prédateurs ont suivi le GPS<br>- Photographes voyageurs - maisons cambriolées pendant leur absence<br>- Influenceurs - lieux de résidence identifiés par des fans obsessifs<br><br>Ce n\'est pas de la paranoïa: c\'est une hygiène numérique de base en 2026.' },
186
186
 
187
187
  { type: 'glossary', items: [
188
188
  {
189
189
  term: 'EXIF',
190
- definition: 'Exchangeable Image File Format. Norme qui stocke des métadonnées techniques dans les fichiers image : GPS, données d\'appareil, réglages d\'exposition. Présent dans environ 90 % des photos numériques sans intention de l\'utilisateur.'
190
+ definition: 'Exchangeable Image File Format. Norme qui stocke des métadonnées techniques dans les fichiers image: GPS, données d\'appareil, réglages d\'exposition. Présent dans environ 90 % des photos numériques sans intention de l\'utilisateur.'
191
191
  },
192
192
  {
193
193
  term: 'Coordonnées GPS',
@@ -195,7 +195,7 @@ const seo: ExifCleanerLocaleContent['seo'] = [
195
195
  },
196
196
  {
197
197
  term: 'IPTC',
198
- definition: 'International Press Telecommunications Council. Métadonnées de publication lisibles : copyright, auteur, mots-clés, description. Norme en photographie professionnelle.'
198
+ definition: 'International Press Telecommunications Council. Métadonnées de publication lisibles: copyright, auteur, mots-clés, description. Norme en photographie professionnelle.'
199
199
  },
200
200
  {
201
201
  term: 'XMP',
@@ -207,14 +207,14 @@ const seo: ExifCleanerLocaleContent['seo'] = [
207
207
  },
208
208
  {
209
209
  term: 'Anonymisation Numérique',
210
- definition: 'Processus de suppression ou d\'offuscation des informations identifiables : localisation, appareil, modèles de comportement. Essentiel pour la vie privée en ligne.'
210
+ definition: 'Processus de suppression ou d\'offuscation des informations identifiables: localisation, appareil, modèles de comportement. Essentiel pour la vie privée en ligne.'
211
211
  }
212
212
  ] },
213
213
 
214
- { type: 'message', title: 'Votre Vie Privée est votre Responsabilité', ariaLabel: 'Informations sur la confidentialité et les droits des données', html: 'Nous ne stockons, ne traitons ni ne partageons vos images. <strong>Vous avez le contrôle total.</strong> Toutes les opérations se déroulent exclusivement dans votre navigateur. Lorsque vous fermez cet onglet, aucune trace de votre activité ne subsiste. Voici comment protéger votre vie privée sur internet : des outils qui respectent vos données.' },
214
+ { type: 'message', title: 'Votre Vie Privée est votre Responsabilité', ariaLabel: 'Informations sur la confidentialité et les droits des données', html: 'Nous ne stockons, ne traitons ni ne partageons vos images. <strong>Vous avez le contrôle total.</strong> Toutes les opérations se déroulent exclusivement dans votre navigateur. Lorsque vous fermez cet onglet, aucune trace de votre activité ne subsiste. Voici comment protéger votre vie privée sur internet: des outils qui respectent vos données.' },
215
215
 
216
- { type: 'title', text: 'Conclusion : Partagez sans Traces', level: 3 },
217
- { type: 'paragraph', html: 'Protéger votre identité numérique commence par de petits détails. Nettoyer vos photos avant de les publier est une <strong>habitude d\'hygiène numérique essentielle</strong> en 2026. Cela ne protège pas seulement votre position : cela protège votre famille, vos biens et votre vie privée professionnelle. Une photo apparemment innocente peut en dire plus sur vous que vous ne l\'auriez jamais imaginé.' }
216
+ { type: 'title', text: 'Conclusion: Partagez sans Traces', level: 3 },
217
+ { type: 'paragraph', html: 'Protéger votre identité numérique commence par de petits détails. Nettoyer vos photos avant de les publier est une <strong>habitude d\'hygiène numérique essentielle</strong> en 2026. Cela ne protège pas seulement votre position: cela protège votre famille, vos biens et votre vie privée professionnelle. Une photo apparemment innocente peut en dire plus sur vous que vous ne l\'auriez jamais imaginé.' }
218
218
  ];
219
219
 
220
220
  const faqSchema: WithContext<FAQPage> = {
@@ -39,11 +39,11 @@ const faq: ExifCleanerLocaleContent['faq'] = [
39
39
  },
40
40
  {
41
41
  question: "Jakie konkretnie dane usuwa to narzędzie?",
42
- answer: "Usuwa wszystkie tagi EXIF (GPS, marka aparatu, numer seryjny), IPTC (prawa autorskie, autor) oraz XMP (historia edycji). Twoje zdjęcie staje się czyste”, zachowując jedynie wizualne piksele.",
42
+ answer: "Usuwa wszystkie tagi EXIF (GPS, marka aparatu, numer seryjny), IPTC (prawa autorskie, autor) oraz XMP (historia edycji). Twoje zdjęcie staje się \"czyste\", zachowując jedynie wizualne piksele.",
43
43
  },
44
44
  {
45
45
  question: "Czy zdjęcie traci na jakości podczas usuwania metadanych?",
46
- answer: "Nie. Usuwamy jedynie techniczny nagłówek danych pliku. Dane obrazu (piksele) pozostają identyczne, więc jakość wizualna nie zmienia się w ogóle.",
46
+ answer: "Nie. Usuwamy jedynie techniczny \"nagłówek\" danych pliku. Dane obrazu (piksele) pozostają identyczne, więc jakość wizualna nie zmienia się w ogóle.",
47
47
  },
48
48
  ];
49
49
 
@@ -54,7 +54,7 @@ const howTo: ExifCleanerLocaleContent['howTo'] = [
54
54
  },
55
55
  {
56
56
  name: "Przeanalizuj bieżące dane",
57
- text: "Narzędzie pokaże Ci, jakie wrażliwe informacje wykryło (np. Wykryto współrzędne GPS).",
57
+ text: "Narzędzie pokaże Ci, jakie wrażliwe informacje wykryło (np. \"Wykryto współrzędne GPS\").",
58
58
  },
59
59
  {
60
60
  name: "Przetwórz i oczyść",
@@ -73,12 +73,12 @@ const seo: ExifCleanerLocaleContent['seo'] = [
73
73
  items: [
74
74
  'Natychmiast usuwaj współrzędne GPS i lokalizację ze swoich zdjęć',
75
75
  'Usuwaj model aparatu, numer seryjny i informacje techniczne',
76
- 'Przetwarzanie w 100% oparte na przeglądarce Twoje zdjęcia nigdy nie opuszczają urządzenia',
77
- 'Zachowuje jakość wizualną usuwane są tylko ukryte dane'
76
+ 'Przetwarzanie w 100% oparte na przeglądarce - Twoje zdjęcia nigdy nie opuszczają urządzenia',
77
+ 'Zachowuje jakość wizualną - usuwane są tylko ukryte dane'
78
78
  ]
79
79
  },
80
80
  { type: 'title', text: 'Kompletny przewodnik po prywatności i metadanych EXIF w fotografii cyfrowej', level: 2 },
81
- { type: 'paragraph', html: 'Czy kiedykolwiek zastanawiałeś się, jak wiele danych osobowych udostępniasz, przesyłając zdjęcie do mediów społecznościowych? Metadane EXIF są jak <strong>niewidzialny odcisk palca</strong>, który może ujawnić wszystko od dokładnej lokalizacji Twojego domu po cenę Twojego sprzętu fotograficznego. Ten przewodnik wyjaśnia, jak skutecznie chronić swoją prywatność.' },
81
+ { type: 'paragraph', html: 'Czy kiedykolwiek zastanawiałeś się, jak wiele danych osobowych udostępniasz, przesyłając zdjęcie do mediów społecznościowych? Metadane EXIF są jak <strong>niewidzialny odcisk palca</strong>, który może ujawnić wszystko - od dokładnej lokalizacji Twojego domu po cenę Twojego sprzętu fotograficznego. Ten przewodnik wyjaśnia, jak skutecznie chronić swoją prywatność.' },
82
82
 
83
83
  { type: 'stats', items: [
84
84
  { value: '100%', label: 'Prywatność - Przetwarzanie Lokalne', icon: 'mdi:shield-check' },
@@ -31,7 +31,7 @@ const ui: ExifCleanerUI = {
31
31
  const faq: ExifCleanerLocaleContent['faq'] = [
32
32
  {
33
33
  question: "Что такое метаданные EXIF?",
34
- answer: "EXIF (Exchangeable Image File Format) это скрытая информация, которую ваша камера или телефон сохраняют внутри каждой фотографии. Она включает точную дату, модель устройства, настройки съёмки (ISO, диафрагма) и, что критически важно, GPS-координаты места, где было сделано фото.",
34
+ answer: "EXIF (Exchangeable Image File Format) - это скрытая информация, которую ваша камера или телефон сохраняют внутри каждой фотографии. Она включает точную дату, модель устройства, настройки съёмки (ISO, диафрагма) и, что критически важно, GPS-координаты места, где было сделано фото.",
35
35
  },
36
36
  {
37
37
  question: "Безопасно ли использовать этот онлайн-инструмент?",
@@ -39,11 +39,11 @@ const faq: ExifCleanerLocaleContent['faq'] = [
39
39
  },
40
40
  {
41
41
  question: "Какие именно данные удаляет очиститель?",
42
- answer: "Он стирает все теги EXIF (GPS, марка камеры, серийный номер), IPTC (авторские права, автор) и XMP (история редактирования). Ваше изображение становится «чистым», сохраняя только визуальные пиксели.",
42
+ answer: "Он стирает все теги EXIF (GPS, марка камеры, серийный номер), IPTC (авторские права, автор) и XMP (история редактирования). Ваше изображение становится \"чистым\", сохраняя только визуальные пиксели.",
43
43
  },
44
44
  {
45
45
  question: "Теряет ли изображение в качестве при очистке метаданных?",
46
- answer: "Нет. Мы удаляем только технический «заголовок» файла. Данные изображения (пиксели) остаются идентичными, поэтому визуальное качество никак не страдает.",
46
+ answer: "Нет. Мы удаляем только технический \"заголовок\" файла. Данные изображения (пиксели) остаются идентичными, поэтому визуальное качество никак не страдает.",
47
47
  },
48
48
  ];
49
49
 
@@ -54,7 +54,7 @@ const howTo: ExifCleanerLocaleContent['howTo'] = [
54
54
  },
55
55
  {
56
56
  name: "Проанализируйте текущие данные",
57
- text: "Инструмент покажет вам, какая конфиденциальная информация была обнаружена (например, «Обнаружены GPS координаты»).",
57
+ text: "Инструмент покажет вам, какая конфиденциальная информация была обнаружена (например, \"Обнаружены GPS координаты\").",
58
58
  },
59
59
  {
60
60
  name: "Обработка и очистка",
@@ -73,15 +73,15 @@ const seo: ExifCleanerLocaleContent['seo'] = [
73
73
  items: [
74
74
  'Мгновенно удаляйте GPS-координаты и местоположение из ваших фото',
75
75
  'Стирайте модель камеры, серийный номер и техническую информацию',
76
- '100% браузерная обработка ваши изображения не покидают устройство',
77
- 'Сохранение визуального качества удаляются только скрытые данные'
76
+ '100% браузерная обработка - ваши изображения не покидают устройство',
77
+ 'Сохранение визуального качества - удаляются только скрытые данные'
78
78
  ]
79
79
  },
80
80
  { type: 'title', text: 'Полное руководство по конфиденциальности и метаданным EXIF в цифровой фотографии', level: 2 },
81
81
  { type: 'paragraph', html: 'Задумывались ли вы когда-нибудь, каким объемом личной информации вы делитесь, загружая фото в соцсети? Метаданные EXIF похожи на <strong>невидимый отпечаток пальца</strong>, который может раскрыть всё: от вашего точного домашнего адреса до стоимости вашей фототехники. Это руководство объясняет, как эффективно защитить свою приватность.' },
82
82
 
83
83
  { type: 'stats', items: [
84
- { value: '100%', label: 'Приватность локальная обработка', icon: 'mdi:shield-check' },
84
+ { value: '100%', label: 'Приватность - локальная обработка', icon: 'mdi:shield-check' },
85
85
  { value: '0%', label: 'Данных на серверах', icon: 'mdi:database' },
86
86
  { value: 'Мгновенно', label: 'Удаление метаданных', icon: 'mdi:lightning-bolt' }
87
87
  ], columns: 3 },
@@ -163,26 +163,26 @@ const seo: ExifCleanerLocaleContent['seo'] = [
163
163
 
164
164
  { type: 'proscons', items: [
165
165
  {
166
- pro: 'Полная конфиденциальность обработка 100% в браузере',
166
+ pro: 'Полная конфиденциальность - обработка 100% в браузере',
167
167
  con: 'Требуется современный браузер с поддержкой JavaScript'
168
168
  },
169
169
  {
170
- pro: 'Мгновенно очистка одного фото занимает менее 1 секунды',
170
+ pro: 'Мгновенно - очистка одного фото занимает менее 1 секунды',
171
171
  con: 'Обработка больших фото может быть медленной на старых устройствах'
172
172
  },
173
173
  {
174
- pro: 'Без потери качества удаляются только данные, а не пиксели',
174
+ pro: 'Без потери качества - удаляются только данные, а не пиксели',
175
175
  con: 'Не редактирует само изображение (обрезка, поворот и т.д.)'
176
176
  },
177
177
  {
178
- pro: 'Полностью бесплатно и без лимитов любое количество фото',
178
+ pro: 'Полностью бесплатно и без лимитов - любое количество фото',
179
179
  con: 'Нет премиум-поддержки или облачного хранилища'
180
180
  }
181
181
  ], proTitle: 'Основные преимущества', conTitle: 'Ограничения' },
182
182
 
183
183
  { type: 'tip', title: 'Совет по цифровой безопасности', html: '<strong>Очищайте фото ДО публикации</strong> в любой соцсети. Даже если вы удалите пост, метаданные могут быть проиндексированы поисковиками. Профилактика лучше лечения. Сделайте это привычкой:<br><br><em>Фото → Очистка EXIF → Пост</em>' },
184
184
 
185
- { type: 'diagnostic', variant: 'warning', title: 'Реальные риски игнорирования очистки', icon: 'mdi:alert-circle', badge: 'Критическая безопасность', html: '<strong>Документированные случаи:</strong><br>- Родители постили фото детей преступники вычисляли GPS<br>- Фотографы-путешественники дома грабили в их отсутствие<br>- Блогеры места жительства определялись навязчивыми фанатами<br><br>Это не паранойя: это базовая цифровая гигиена в 2026 году.' },
185
+ { type: 'diagnostic', variant: 'warning', title: 'Реальные риски игнорирования очистки', icon: 'mdi:alert-circle', badge: 'Критическая безопасность', html: '<strong>Документированные случаи:</strong><br>- Родители постили фото детей - преступники вычисляли GPS<br>- Фотографы-путешественники - дома грабили в их отсутствие<br>- Блогеры - места жительства определялись навязчивыми фанатами<br><br>Это не паранойя: это базовая цифровая гигиена в 2026 году.' },
186
186
 
187
187
  { type: 'glossary', items: [
188
188
  {
@@ -211,10 +211,10 @@ const seo: ExifCleanerLocaleContent['seo'] = [
211
211
  }
212
212
  ] },
213
213
 
214
- { type: 'message', title: 'Ваша приватность ваша ответственность', ariaLabel: 'Информация о конфиденциальности и правах на данные', html: 'Мы не храним, не обрабатываем и не передаем ваши изображения. <strong>У вас полный контроль.</strong> Все операции происходят исключительно в вашем браузере. Когда вы закрываете вкладку, никаких следов вашей активности не остается. Именно так защищается приватность в интернете: инструментами, которые уважают ваши данные.' },
214
+ { type: 'message', title: 'Ваша приватность: ваша ответственность', ariaLabel: 'Информация о конфиденциальности и правах на данные', html: 'Мы не храним, не обрабатываем и не передаем ваши изображения. <strong>У вас полный контроль.</strong> Все операции происходят исключительно в вашем браузере. Когда вы закрываете вкладку, никаких следов вашей активности не остается. Именно так защищается приватность в интернете: инструментами, которые уважают ваши данные.' },
215
215
 
216
216
  { type: 'title', text: 'Заключение: делитесь, не оставляя следов', level: 3 },
217
- { type: 'paragraph', html: 'Защита вашей цифровой личности начинается с мелочей. Очистка фото перед публикацией это <strong>необходимая привычка цифровой гигиены</strong> в 2026 году. Она защищает не только ваше местоположение: она защищает вашу семью, ваше имущество и вашу профессиональную тайну. Невинное на вид фото может рассказать о вас больше, чем вы можете себе представить.' }
217
+ { type: 'paragraph', html: 'Защита вашей цифровой личности начинается с мелочей. Очистка фото перед публикацией - это <strong>необходимая привычка цифровой гигиены</strong> в 2026 году. Она защищает не только ваше местоположение: она защищает вашу семью, ваше имущество и вашу профессиональную тайну. Невинное на вид фото может рассказать о вас больше, чем вы можете себе представить.' }
218
218
  ];
219
219
 
220
220
  const faqSchema: WithContext<FAQPage> = {
@@ -39,11 +39,11 @@ const faq: ExifCleanerLocaleContent['faq'] = [
39
39
  },
40
40
  {
41
41
  question: "清除工具具体删除了哪些数据?",
42
- answer: "它擦除所有 EXIF 标签(GPS、相机品牌、序列号)、IPTC(版权、作者)和 XMP(编辑历史)。您的图像变得“干净”,仅保留视觉像素。",
42
+ answer: "它擦除所有 EXIF 标签(GPS、相机品牌、序列号)、IPTC(版权、作者)和 XMP(编辑历史)。您的图像变得\"干净\",仅保留视觉像素。",
43
43
  },
44
44
  {
45
45
  question: "清除元数据会损失画质吗?",
46
- answer: "不会。我们只删除文件的技术数据“页眉”。图像数据(像素)保持一致,因此视觉质量完全不受影响。",
46
+ answer: "不会。我们只删除文件的技术数据\"页眉\"。图像数据(像素)保持一致,因此视觉质量完全不受影响。",
47
47
  },
48
48
  ];
49
49
 
@@ -54,7 +54,7 @@ const howTo: ExifCleanerLocaleContent['howTo'] = [
54
54
  },
55
55
  {
56
56
  name: "分析当前数据",
57
- text: "工具将向您显示它检测到的敏感信息(例如,“已检测到 GPS 坐标”)。",
57
+ text: "工具将向您显示它检测到的敏感信息(例如,\"已检测到 GPS 坐标\")。",
58
58
  },
59
59
  {
60
60
  name: "处理并清除",
@@ -89,12 +89,14 @@ const { ui } = Astro.props;
89
89
  <div class="ic-inline-editor" style="display:none">
90
90
  <div class="ic-editor-controls">
91
91
  <div class="ic-editor-group">
92
- <label>{ui.qualityLabel}: <span class="ic-local-q-val">80</span>%</label>
93
- <input type="range" class="ic-local-quality" min="10" max="100" value="80" />
92
+ <label>{ui.qualityLabel}: <span class="ic-local-q-val">80</span>%
93
+ <input type="range" class="ic-local-quality" min="10" max="100" value="80" />
94
+ </label>
94
95
  </div>
95
96
  <div class="ic-editor-group">
96
- <label>{ui.maxWidthLabel}:</label>
97
- <input type="number" class="ic-local-width" placeholder="Original" />
97
+ <label>{ui.maxWidthLabel}:
98
+ <input type="number" class="ic-local-width" placeholder="Original" />
99
+ </label>
98
100
  </div>
99
101
  </div>
100
102
  <button class="ic-editor-close">{ui.closeBtn}</button>