@jjlmoya/utils-social 1.13.0 → 1.15.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 (146) hide show
  1. package/package.json +4 -2
  2. package/src/category/i18n/fr.ts +2 -2
  3. package/src/category/i18n/ru.ts +1 -1
  4. package/src/env.d.ts +5 -0
  5. package/src/layouts/PreviewLayout.astro +7 -2
  6. package/src/pages/[locale]/[slug].astro +28 -12
  7. package/src/tests/diacritics_density.test.ts +118 -0
  8. package/src/tests/inverted_punctuation.test.ts +84 -0
  9. package/src/tests/locale_completeness.test.ts +4 -14
  10. package/src/tests/no_en_dash.test.ts +70 -0
  11. package/src/tests/pagespeed_best_practices.test.ts +198 -0
  12. package/src/tests/script_density.test.ts +94 -0
  13. package/src/tests/shared-test-helpers.ts +56 -0
  14. package/src/tests/tool_exports.test.ts +34 -0
  15. package/src/tool/redditFormatter/bibliography.astro +2 -10
  16. package/src/tool/redditFormatter/bibliography.ts +12 -0
  17. package/src/tool/redditFormatter/i18n/de.ts +3 -13
  18. package/src/tool/redditFormatter/i18n/en.ts +3 -13
  19. package/src/tool/redditFormatter/i18n/es.ts +3 -13
  20. package/src/tool/redditFormatter/i18n/fr.ts +5 -15
  21. package/src/tool/redditFormatter/i18n/id.ts +3 -13
  22. package/src/tool/redditFormatter/i18n/it.ts +3 -13
  23. package/src/tool/redditFormatter/i18n/ja.ts +3 -13
  24. package/src/tool/redditFormatter/i18n/ko.ts +3 -13
  25. package/src/tool/redditFormatter/i18n/nl.ts +3 -13
  26. package/src/tool/redditFormatter/i18n/pl.ts +7 -17
  27. package/src/tool/redditFormatter/i18n/pt.ts +3 -13
  28. package/src/tool/redditFormatter/i18n/ru.ts +5 -15
  29. package/src/tool/redditFormatter/i18n/sv.ts +3 -13
  30. package/src/tool/redditFormatter/i18n/tr.ts +3 -13
  31. package/src/tool/redditFormatter/i18n/zh.ts +4 -14
  32. package/src/tool/redditFormatter/seo.astro +2 -1
  33. package/src/tool/safeZones/bibliography.astro +2 -10
  34. package/src/tool/safeZones/bibliography.ts +20 -0
  35. package/src/tool/safeZones/component.astro +1 -1
  36. package/src/tool/safeZones/i18n/de.ts +5 -23
  37. package/src/tool/safeZones/i18n/en.ts +5 -23
  38. package/src/tool/safeZones/i18n/es.ts +3 -21
  39. package/src/tool/safeZones/i18n/fr.ts +14 -32
  40. package/src/tool/safeZones/i18n/id.ts +5 -23
  41. package/src/tool/safeZones/i18n/it.ts +9 -27
  42. package/src/tool/safeZones/i18n/ja.ts +3 -21
  43. package/src/tool/safeZones/i18n/ko.ts +3 -21
  44. package/src/tool/safeZones/i18n/nl.ts +5 -23
  45. package/src/tool/safeZones/i18n/pl.ts +10 -28
  46. package/src/tool/safeZones/i18n/pt.ts +5 -23
  47. package/src/tool/safeZones/i18n/ru.ts +12 -30
  48. package/src/tool/safeZones/i18n/sv.ts +5 -23
  49. package/src/tool/safeZones/i18n/tr.ts +3 -21
  50. package/src/tool/safeZones/i18n/zh.ts +7 -25
  51. package/src/tool/safeZones/seo.astro +2 -1
  52. package/src/tool/socialImageResizer/bibliography.astro +2 -10
  53. package/src/tool/socialImageResizer/bibliography.ts +12 -0
  54. package/src/tool/socialImageResizer/component.astro +2 -2
  55. package/src/tool/socialImageResizer/i18n/de.ts +8 -18
  56. package/src/tool/socialImageResizer/i18n/en.ts +11 -21
  57. package/src/tool/socialImageResizer/i18n/es.ts +10 -20
  58. package/src/tool/socialImageResizer/i18n/fr.ts +14 -24
  59. package/src/tool/socialImageResizer/i18n/id.ts +11 -21
  60. package/src/tool/socialImageResizer/i18n/it.ts +19 -29
  61. package/src/tool/socialImageResizer/i18n/ja.ts +10 -20
  62. package/src/tool/socialImageResizer/i18n/ko.ts +10 -20
  63. package/src/tool/socialImageResizer/i18n/nl.ts +11 -21
  64. package/src/tool/socialImageResizer/i18n/pl.ts +12 -22
  65. package/src/tool/socialImageResizer/i18n/pt.ts +11 -21
  66. package/src/tool/socialImageResizer/i18n/ru.ts +17 -27
  67. package/src/tool/socialImageResizer/i18n/sv.ts +11 -21
  68. package/src/tool/socialImageResizer/i18n/tr.ts +10 -20
  69. package/src/tool/socialImageResizer/i18n/zh.ts +10 -20
  70. package/src/tool/socialImageResizer/seo.astro +2 -1
  71. package/src/tool/socialValueCalculator/bibliography.astro +2 -10
  72. package/src/tool/socialValueCalculator/bibliography.ts +16 -0
  73. package/src/tool/socialValueCalculator/component.astro +1 -2
  74. package/src/tool/socialValueCalculator/i18n/de.ts +5 -19
  75. package/src/tool/socialValueCalculator/i18n/en.ts +4 -18
  76. package/src/tool/socialValueCalculator/i18n/es.ts +5 -19
  77. package/src/tool/socialValueCalculator/i18n/fr.ts +9 -23
  78. package/src/tool/socialValueCalculator/i18n/id.ts +4 -18
  79. package/src/tool/socialValueCalculator/i18n/it.ts +17 -31
  80. package/src/tool/socialValueCalculator/i18n/ja.ts +4 -18
  81. package/src/tool/socialValueCalculator/i18n/ko.ts +4 -18
  82. package/src/tool/socialValueCalculator/i18n/nl.ts +4 -18
  83. package/src/tool/socialValueCalculator/i18n/pl.ts +4 -18
  84. package/src/tool/socialValueCalculator/i18n/pt.ts +4 -18
  85. package/src/tool/socialValueCalculator/i18n/ru.ts +10 -24
  86. package/src/tool/socialValueCalculator/i18n/sv.ts +4 -18
  87. package/src/tool/socialValueCalculator/i18n/tr.ts +4 -18
  88. package/src/tool/socialValueCalculator/i18n/zh.ts +7 -21
  89. package/src/tool/socialValueCalculator/seo.astro +2 -1
  90. package/src/tool/tinderPhotoOptimizer/bibliography.astro +2 -10
  91. package/src/tool/tinderPhotoOptimizer/bibliography.ts +12 -0
  92. package/src/tool/tinderPhotoOptimizer/component.astro +23 -6
  93. package/src/tool/tinderPhotoOptimizer/i18n/de.ts +6 -16
  94. package/src/tool/tinderPhotoOptimizer/i18n/en.ts +4 -14
  95. package/src/tool/tinderPhotoOptimizer/i18n/es.ts +3 -13
  96. package/src/tool/tinderPhotoOptimizer/i18n/fr.ts +28 -38
  97. package/src/tool/tinderPhotoOptimizer/i18n/id.ts +3 -13
  98. package/src/tool/tinderPhotoOptimizer/i18n/it.ts +3 -13
  99. package/src/tool/tinderPhotoOptimizer/i18n/ja.ts +3 -13
  100. package/src/tool/tinderPhotoOptimizer/i18n/ko.ts +3 -13
  101. package/src/tool/tinderPhotoOptimizer/i18n/nl.ts +3 -13
  102. package/src/tool/tinderPhotoOptimizer/i18n/pl.ts +3 -13
  103. package/src/tool/tinderPhotoOptimizer/i18n/pt.ts +3 -13
  104. package/src/tool/tinderPhotoOptimizer/i18n/ru.ts +12 -22
  105. package/src/tool/tinderPhotoOptimizer/i18n/sv.ts +3 -13
  106. package/src/tool/tinderPhotoOptimizer/i18n/tr.ts +3 -13
  107. package/src/tool/tinderPhotoOptimizer/i18n/zh.ts +5 -15
  108. package/src/tool/tinderPhotoOptimizer/seo.astro +2 -1
  109. package/src/tool/youtubeThumbnail/bibliography.astro +2 -10
  110. package/src/tool/youtubeThumbnail/bibliography.ts +16 -0
  111. package/src/tool/youtubeThumbnail/component.astro +1 -0
  112. package/src/tool/youtubeThumbnail/i18n/de.ts +6 -20
  113. package/src/tool/youtubeThumbnail/i18n/en.ts +4 -18
  114. package/src/tool/youtubeThumbnail/i18n/es.ts +3 -17
  115. package/src/tool/youtubeThumbnail/i18n/fr.ts +6 -20
  116. package/src/tool/youtubeThumbnail/i18n/id.ts +3 -17
  117. package/src/tool/youtubeThumbnail/i18n/it.ts +3 -17
  118. package/src/tool/youtubeThumbnail/i18n/ja.ts +3 -17
  119. package/src/tool/youtubeThumbnail/i18n/ko.ts +3 -17
  120. package/src/tool/youtubeThumbnail/i18n/nl.ts +3 -17
  121. package/src/tool/youtubeThumbnail/i18n/pl.ts +3 -17
  122. package/src/tool/youtubeThumbnail/i18n/pt.ts +3 -17
  123. package/src/tool/youtubeThumbnail/i18n/ru.ts +6 -20
  124. package/src/tool/youtubeThumbnail/i18n/sv.ts +3 -17
  125. package/src/tool/youtubeThumbnail/i18n/tr.ts +3 -17
  126. package/src/tool/youtubeThumbnail/i18n/zh.ts +5 -19
  127. package/src/tool/youtubeThumbnail/seo.astro +2 -1
  128. package/src/tool/youtubeThumbnailPreviewer/bibliography.astro +2 -10
  129. package/src/tool/youtubeThumbnailPreviewer/bibliography.ts +16 -0
  130. package/src/tool/youtubeThumbnailPreviewer/i18n/de.ts +11 -25
  131. package/src/tool/youtubeThumbnailPreviewer/i18n/en.ts +5 -19
  132. package/src/tool/youtubeThumbnailPreviewer/i18n/es.ts +3 -17
  133. package/src/tool/youtubeThumbnailPreviewer/i18n/fr.ts +12 -26
  134. package/src/tool/youtubeThumbnailPreviewer/i18n/id.ts +5 -19
  135. package/src/tool/youtubeThumbnailPreviewer/i18n/it.ts +24 -38
  136. package/src/tool/youtubeThumbnailPreviewer/i18n/ja.ts +3 -17
  137. package/src/tool/youtubeThumbnailPreviewer/i18n/ko.ts +3 -17
  138. package/src/tool/youtubeThumbnailPreviewer/i18n/nl.ts +7 -21
  139. package/src/tool/youtubeThumbnailPreviewer/i18n/pl.ts +10 -24
  140. package/src/tool/youtubeThumbnailPreviewer/i18n/pt.ts +3 -17
  141. package/src/tool/youtubeThumbnailPreviewer/i18n/ru.ts +14 -28
  142. package/src/tool/youtubeThumbnailPreviewer/i18n/sv.ts +5 -19
  143. package/src/tool/youtubeThumbnailPreviewer/i18n/tr.ts +3 -17
  144. package/src/tool/youtubeThumbnailPreviewer/i18n/zh.ts +13 -27
  145. package/src/tool/youtubeThumbnailPreviewer/seo.astro +2 -1
  146. package/src/types.ts +0 -2
@@ -202,11 +202,11 @@ const t = (ui ?? {}) as TinderPhotoOptimizerUI;
202
202
  <div class="tfo-panel">
203
203
  <h3>{t.panelManual}</h3>
204
204
  <div class="tfo-control-group">
205
- <label>{t.labelZoom} <span>1.0x</span></label>
205
+ <label for="zoom-slider">{t.labelZoom} <span>1.0x</span></label>
206
206
  <input type="range" id="zoom-slider" min="1" max="3" step="0.1" value="1" />
207
207
  </div>
208
208
  <div class="tfo-control-group">
209
- <label>{t.labelBrightness} <span>100%</span></label>
209
+ <label for="brightness-slider">{t.labelBrightness} <span>100%</span></label>
210
210
  <input type="range" id="brightness-slider" min="50" max="150" step="1" value="100" />
211
211
  </div>
212
212
  </div>
@@ -310,6 +310,8 @@ const t = (ui ?? {}) as TinderPhotoOptimizerUI;
310
310
  <script>
311
311
  import { TinderOptimizerEngine } from './logic';
312
312
 
313
+ const getRect = (el: Element) => el.getBoundingClientRect();
314
+
313
315
  class TinderOptimizerUI {
314
316
  private engine: TinderOptimizerEngine;
315
317
  private canvas: HTMLCanvasElement;
@@ -334,6 +336,10 @@ const t = (ui ?? {}) as TinderPhotoOptimizerUI;
334
336
  private isSelecting = false;
335
337
  private selectionRect = { x: 0, y: 0, w: 0, h: 0 };
336
338
  private lastPos = { x: 0, y: 0 };
339
+ private cachedClientWidth = 0;
340
+ private cachedClientHeight = 0;
341
+ private cachedRect = { left: 0, top: 0, width: 1, height: 1 };
342
+ private resizeObserver: ResizeObserver | null = null;
337
343
 
338
344
  constructor() {
339
345
  this.canvas = document.getElementById('editor-canvas') as HTMLCanvasElement;
@@ -422,6 +428,17 @@ const t = (ui ?? {}) as TinderPhotoOptimizerUI;
422
428
  this.setupSliders();
423
429
  this.setupToggles();
424
430
  this.setupButtons();
431
+ this.cachedClientWidth = 1;
432
+ this.cachedClientHeight = 1;
433
+ this.resizeObserver = new ResizeObserver((entries) => {
434
+ for (const entry of entries) {
435
+ this.cachedClientWidth = entry.contentRect.width || 1;
436
+ this.cachedClientHeight = entry.contentRect.height || 1;
437
+ const r = getRect(entry.target);
438
+ this.cachedRect = { left: r.left, top: r.top, width: entry.contentRect.width || 1, height: entry.contentRect.height || 1 };
439
+ }
440
+ });
441
+ this.resizeObserver.observe(this.canvas);
425
442
  }
426
443
 
427
444
  private reset() {
@@ -480,7 +497,7 @@ const t = (ui ?? {}) as TinderPhotoOptimizerUI;
480
497
  private onStart(e: MouseEvent | TouchEvent) {
481
498
  if (e instanceof TouchEvent) e.preventDefault();
482
499
  const { x: cx, y: cy } = this.getClientPos(e);
483
- const rect = this.canvas.getBoundingClientRect();
500
+ const rect = this.cachedRect;
484
501
  const x = (cx - rect.left) * (this.canvas.width / rect.width);
485
502
  const y = (cy - rect.top) * (this.canvas.height / rect.height);
486
503
  this.initInteraction(x, y, cx, cy);
@@ -503,15 +520,15 @@ const t = (ui ?? {}) as TinderPhotoOptimizerUI;
503
520
  }
504
521
 
505
522
  private handleSelectionMove(clientX: number, clientY: number) {
506
- const rect = this.canvas.getBoundingClientRect();
523
+ const rect = this.cachedRect;
507
524
  this.selectionRect.w = (clientX - rect.left) * (this.canvas.width / rect.width) - this.selectionRect.x;
508
525
  this.selectionRect.h = (clientY - rect.top) * (this.canvas.height / rect.height) - this.selectionRect.y;
509
526
  this.draw();
510
527
  }
511
528
 
512
529
  private handleDragMove(clientX: number, clientY: number) {
513
- const dx = (clientX - this.lastPos.x) * (this.canvas.width / this.canvas.clientWidth);
514
- const dy = (clientY - this.lastPos.y) * (this.canvas.height / this.canvas.clientHeight);
530
+ const dx = (clientX - this.lastPos.x) * (this.canvas.width / this.cachedClientWidth);
531
+ const dy = (clientY - this.lastPos.y) * (this.canvas.height / this.cachedClientHeight);
515
532
  const offset = this.engine.offset;
516
533
  this.engine.updateState(parseFloat(this.zoomSlider.value), { x: offset.x + dx, y: offset.y + dy }, parseInt(this.brightnessSlider.value));
517
534
  this.lastPos = { x: clientX, y: clientY };
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { TinderPhotoOptimizerUI } from '../ui';
@@ -11,7 +12,7 @@ const faqData = [
11
12
  {
12
13
  question: 'Wie verbessert dieses Tool meine Tinder-Matches?',
13
14
  answer:
14
- 'Das Tool analysiert wichtige technische Faktoren: das Verhältnis der Gesichtsgröße (ideal 30–50 %), die Position der Augenlinie im Verhältnis zum oberen Drittel, die Abdeckung des Bildausschnitts und die Totzonen der Tinder-Benutzeroberfläche. Durch die Anpassung dieser Parameter projiziert Ihr Foto mehr Vertrauen und überwindet die visuellen Filter des Algorithmus.',
15
+ 'Das Tool analysiert wichtige technische Faktoren: das Verhältnis der Gesichtsgröße (ideal 30-50 %), die Position der Augenlinie im Verhältnis zum oberen Drittel, die Abdeckung des Bildausschnitts und die Totzonen der Tinder-Benutzeroberfläche. Durch die Anpassung dieser Parameter projiziert Ihr Foto mehr Vertrauen und überwindet die visuellen Filter des Algorithmus.',
15
16
  },
16
17
  {
17
18
  question: 'Ist es sicher, meine Fotos hier hochzuladen?',
@@ -26,7 +27,7 @@ const faqData = [
26
27
  {
27
28
  question: 'Warum wird ein Zoom von 1,2x empfohlen?',
28
29
  answer:
29
- 'Frontkameras von Smartphones verwenden Weitwinkeloptiken (24 mm), die das Gesicht durch Tonnenverzerrung verzerren. Ein Zoom von 1,2x simuliert eine Brennweite von 50–85 mm, wodurch die Verzerrung eliminiert wird und natürlichere und attraktivere Gesichtsproportionen entstehen.',
30
+ 'Frontkameras von Smartphones verwenden Weitwinkeloptiken (24 mm), die das Gesicht durch Tonnenverzerrung verzerren. Ein Zoom von 1,2x simuliert eine Brennweite von 50-85 mm, wodurch die Verzerrung eliminiert wird und natürlichere und attraktivere Gesichtsproportionen entstehen.',
30
31
  },
31
32
  ];
32
33
 
@@ -87,19 +88,8 @@ export const content: ToolLocaleContent<TinderPhotoOptimizerUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Häufig gestellte Fragen',
91
- faq: faqData,
92
- bibliographyTitle: 'Referenzen',
93
- bibliography: [
94
- {
95
- name: 'face-api.js: JavaScript Face Recognition in the Browser',
96
- url: 'https://github.com/justadudewhohacks/face-api.js',
97
- },
98
- {
99
- name: 'MDN Web Docs: Canvas API',
100
- url: 'https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API',
101
- },
102
- ],
91
+ faq: faqData,
92
+ bibliography,
103
93
  howTo: howToData,
104
94
  schemas: [faqSchema, howToSchema, appSchema],
105
95
  seo: [
@@ -196,7 +186,7 @@ export const content: ToolLocaleContent<TinderPhotoOptimizerUI> = {
196
186
  {
197
187
  type: 'tip',
198
188
  title: 'Expertenrat',
199
- html: '<p>Das erste Foto sollte IMMER ein klares Porträt ab den Schultern aufwärts sein. Heben Sie Ganzkörperfotos oder Aktivitätsfotos für die 3. oder 4. Position auf. Stellen Sie sicher, dass Ihr Blick beim ersten Eindruck frei von Hindernissen ist und Ihr Gesicht die optimale Größe (30–50 %) hat.</p>',
189
+ html: '<p>Das erste Foto sollte IMMER ein klares Porträt ab den Schultern aufwärts sein. Heben Sie Ganzkörperfotos oder Aktivitätsfotos für die 3. oder 4. Position auf. Stellen Sie sicher, dass Ihr Blick beim ersten Eindruck frei von Hindernissen ist und Ihr Gesicht die optimale Größe (30-50 %) hat.</p>',
200
190
  },
201
191
  {
202
192
  type: 'title',
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { TinderPhotoOptimizerUI } from '../ui';
@@ -87,19 +88,8 @@ export const content: ToolLocaleContent<TinderPhotoOptimizerUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Frequently Asked Questions',
91
- faq: faqData,
92
- bibliographyTitle: 'References',
93
- bibliography: [
94
- {
95
- name: 'face-api.js: JavaScript Face Recognition in the Browser',
96
- url: 'https://github.com/justadudewhohacks/face-api.js',
97
- },
98
- {
99
- name: 'MDN Web Docs: Canvas API',
100
- url: 'https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API',
101
- },
102
- ],
91
+ faq: faqData,
92
+ bibliography,
103
93
  howTo: howToData,
104
94
  schemas: [faqSchema, howToSchema, appSchema],
105
95
  seo: [
@@ -140,7 +130,7 @@ export const content: ToolLocaleContent<TinderPhotoOptimizerUI> = {
140
130
  },
141
131
  {
142
132
  type: 'paragraph',
143
- html: '<strong>Barrel Aberration:</strong> At less than one meter distance, a 24mm lens (standard on phones) expands the center of the image. This makes noses look bigger and faces rounder than they really are. Our <strong>1.2x Zoom</strong> recommendation is corrective: by applying a slight digital crop, you simulate a 50mm to 85mm focal length — the golden focal length photographers use to slim the face and maintain real proportions.',
133
+ html: '<strong>Barrel Aberration:</strong> At less than one meter distance, a 24mm lens (standard on phones) expands the center of the image. This makes noses look bigger and faces rounder than they really are. Our <strong>1.2x Zoom</strong> recommendation is corrective: by applying a slight digital crop, you simulate a 50mm to 85mm focal length - the golden focal length photographers use to slim the face and maintain real proportions.',
144
134
  },
145
135
  {
146
136
  type: 'title',
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { TinderPhotoOptimizerUI } from '../ui';
@@ -24,7 +25,7 @@ const faqData = [
24
25
  'Utiliza face-api.js para detectar 68 puntos de referencia facial, analizar la expresión (sonrisa, expresión seria), evaluar la posición de los ojos y medir la inclinación de la cabeza. Todo el análisis ocurre localmente en tu dispositivo.',
25
26
  },
26
27
  {
27
- question: '¿Por qué recomienda el zoom al 1.2x?',
28
+ question: '¿Por qué recomienda el zoom al 1,2x?',
28
29
  answer:
29
30
  'Las cámaras frontales de smartphone usan ópticas gran angular (24mm) que distorsionan el rostro con la aberración de barril. Un zoom de 1.2x simula una focal de 50-85mm, eliminando la distorsión y proporcionando proporciones faciales más naturales y atractivas.',
30
31
  },
@@ -87,19 +88,8 @@ export const content: ToolLocaleContent<TinderPhotoOptimizerUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Preguntas Frecuentes',
91
91
  faq: faqData,
92
- bibliographyTitle: 'Referencias',
93
- bibliography: [
94
- {
95
- name: 'face-api.js: JavaScript Face Recognition in the Browser',
96
- url: 'https://github.com/justadudewhohacks/face-api.js',
97
- },
98
- {
99
- name: 'MDN Web Docs: Canvas API',
100
- url: 'https://developer.mozilla.org/es/docs/Web/API/Canvas_API',
101
- },
102
- ],
92
+ bibliography,
103
93
  howTo: howToData,
104
94
  schemas: [faqSchema, howToSchema, appSchema],
105
95
  seo: [
@@ -1,9 +1,10 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { TinderPhotoOptimizerUI } from '../ui';
4
5
 
5
6
  const slug = 'optimiseur-photos-tinder';
6
- const title = "Optimiseur de Photos pour Tinder : Analyse de Visage et Composition";
7
+ const title = "Optimiseur de Photos pour Tinder: Analyse de Visage et Composition";
7
8
  const description =
8
9
  "Optimisez vos photos pour Tinder avec une analyse algorithmique du visage. Simule l'interface 2026, analyse le cadrage scientifique et la ligne des yeux, exporte des portraits 9:16 parfaits pour maximiser vos matchs.";
9
10
 
@@ -11,7 +12,7 @@ const faqData = [
11
12
  {
12
13
  question: "Comment cet outil améliore-t-il mes matchs sur Tinder ?",
13
14
  answer:
14
- "L'outil analyse des facteurs techniques clés : le ratio de taille du visage (idéal 30-50%), la position de la ligne des yeux par rapport au tiers supérieur, la couverture du cadre et les zones mortes de l'interface Tinder. En ajustant ces paramètres, votre photo projette plus de confiance et passe les filtres visuels de l'algorithme.",
15
+ "L'outil analyse des facteurs techniques clés: le ratio de taille du visage (idéal 30-50%), la position de la ligne des yeux par rapport au tiers supérieur, la couverture du cadre et les zones mortes de l'interface Tinder. En ajustant ces paramètres, votre photo projette plus de confiance et passe les filtres visuels de l'algorithme.",
15
16
  },
16
17
  {
17
18
  question: "Est-il sûr de télécharger mes photos ici ?",
@@ -87,34 +88,23 @@ export const content: ToolLocaleContent<TinderPhotoOptimizerUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Questions Fréquentes',
91
- faq: faqData,
92
- bibliographyTitle: 'Références',
93
- bibliography: [
94
- {
95
- name: 'face-api.js: JavaScript Face Recognition in the Browser',
96
- url: 'https://github.com/justadudewhohacks/face-api.js',
97
- },
98
- {
99
- name: 'MDN Web Docs: Canvas API',
100
- url: 'https://developer.mozilla.org/fr/docs/Web/API/Canvas_API',
101
- },
102
- ],
91
+ faq: faqData,
92
+ bibliography,
103
93
  howTo: howToData,
104
94
  schemas: [faqSchema, howToSchema, appSchema],
105
95
  seo: [
106
96
  {
107
97
  type: 'title',
108
- text: "Optimiseur de Photos pour Tinder : Le Guide Scientifique et Technique Définitif (2026)",
98
+ text: "Optimiseur de Photos pour Tinder: Le Guide Scientifique et Technique Définitif (2026)",
109
99
  level: 2,
110
100
  },
111
101
  {
112
102
  type: 'paragraph',
113
- html: "Dans l'écosystème des rencontres numériques, votre profil Tinder est traité par deux algorithmes simultanément : l'algorithme de vision avancée de la plateforme elle-même et le cerveau humain de l'utilisateur qui fait glisser. Notre outil intègre des principes de <strong>psychologie évolutive</strong>, de <strong>biométrie faciale</strong> et de <strong>traitement du signal numérique</strong> pour garantir que votre image projette une valeur sociale et un attrait technique maximum.",
103
+ html: "Dans l'écosystème des rencontres numériques, votre profil Tinder est traité par deux algorithmes simultanément: l'algorithme de vision avancée de la plateforme elle-même et le cerveau humain de l'utilisateur qui fait glisser. Notre outil intègre des principes de <strong>psychologie évolutive</strong>, de <strong>biométrie faciale</strong> et de <strong>traitement du signal numérique</strong> pour garantir que votre image projette une valeur sociale et un attrait technique maximum.",
114
104
  },
115
105
  {
116
106
  type: 'title',
117
- text: "La Psychologie de la Première Impression : L'Effet des 1,2 Secondes",
107
+ text: "La Psychologie de la Première Impression: L'Effet des 1,2 Secondes",
118
108
  level: 3,
119
109
  },
120
110
  {
@@ -131,7 +121,7 @@ export const content: ToolLocaleContent<TinderPhotoOptimizerUI> = {
131
121
  },
132
122
  {
133
123
  type: 'title',
134
- text: "Analyse Technique de l'Objectif : Le Problème du Grand Angle",
124
+ text: "Analyse Technique de l'Objectif: Le Problème du Grand Angle",
135
125
  level: 3,
136
126
  },
137
127
  {
@@ -140,11 +130,11 @@ export const content: ToolLocaleContent<TinderPhotoOptimizerUI> = {
140
130
  },
141
131
  {
142
132
  type: 'paragraph',
143
- html: "<strong>L'Aberration en Barillet :</strong> À moins d'un mètre de distance, un objectif de 24mm (standard sur mobile) élargit le centre de l'image. Cela fait paraître les nez plus grands et le visage plus rond que dans la réalité. Notre recommandation de <strong>Zoom 1,2x</strong> est corrective : en appliquant un léger recadrage numérique, vous simulez une focale de 50mm à 85mm, la focale dorée que les photographes de mode utilisent pour affiner le visage et maintenir les proportions réelles.",
133
+ html: "<strong>L'Aberration en Barillet :</strong> À moins d'un mètre de distance, un objectif de 24mm (standard sur mobile) élargit le centre de l'image. Cela fait paraître les nez plus grands et le visage plus rond que dans la réalité. Notre recommandation de <strong>Zoom 1,2x</strong> est corrective: en appliquant un léger recadrage numérique, vous simulez une focale de 50mm à 85mm, la focale dorée que les photographes de mode utilisent pour affiner le visage et maintenir les proportions réelles.",
144
134
  },
145
135
  {
146
136
  type: 'title',
147
- text: "L'Interface Tinder : La Science des Zones Mortes",
137
+ text: "L'Interface Tinder: La Science des Zones Mortes",
148
138
  level: 3,
149
139
  },
150
140
  {
@@ -161,7 +151,7 @@ export const content: ToolLocaleContent<TinderPhotoOptimizerUI> = {
161
151
  },
162
152
  {
163
153
  type: 'title',
164
- text: "Analyse Visuelle en Temps Réel : Décoder l'Algorithme",
154
+ text: "Analyse Visuelle en Temps Réel: Décoder l'Algorithme",
165
155
  level: 3,
166
156
  },
167
157
  {
@@ -205,7 +195,7 @@ export const content: ToolLocaleContent<TinderPhotoOptimizerUI> = {
205
195
  },
206
196
  {
207
197
  type: 'paragraph',
208
- html: "Nous comprenons que vos photos sont privées. Cet optimiseur utilise la <strong>technologie Client-Side</strong> : les images sont traitées via un moteur canvas dans votre navigateur local. Aucune donnée ne quitte votre appareil. C'est la façon la plus sûre et la plus rapide d'optimiser votre profil sans compromettre votre vie privée.",
198
+ html: "Nous comprenons que vos photos sont privées. Cet optimiseur utilise la <strong>technologie Client-Side</strong>: les images sont traitées via un moteur canvas dans votre navigateur local. Aucune donnée ne quitte votre appareil. C'est la façon la plus sûre et la plus rapide d'optimiser votre profil sans compromettre votre vie privée.",
209
199
  },
210
200
  ],
211
201
  ui: {
@@ -254,21 +244,21 @@ export const content: ToolLocaleContent<TinderPhotoOptimizerUI> = {
254
244
  statusNeutral: 'NEUTRE',
255
245
 
256
246
  alertExcellent: 'Excellente composition technique.',
257
- alertEmptySpaces: 'ESPACES VIDES : L\'image ne couvre pas tout le cadre. Ajustez le zoom ou la position.',
258
- alertAlmostInvisible: 'PRESQUE INVISIBLE : Vous êtes trop loin. Zoomez jusqu\'à ce que votre visage occupe au moins un tiers de l\'écran.',
259
- alertTooClose: 'TROP PRÈS : Les gros plans extrêmes peuvent paraître agressifs.',
260
- alertPerfectSize: 'TAILLE PARFAITE : Votre visage a le ratio idéal pour transmettre la confiance.',
261
- alertImpactfulLook: 'REGARD IMPACTANT : Vos yeux sont sur la ligne d\'attention maximale.',
262
- alertEyeLineMoveUp: 'LIGNE DES YEUX : Pour un cadrage professionnel, remontez légèrement le visage jusqu\'à la ligne supérieure.',
263
- alertEyeLineMoveDown: 'LIGNE DES YEUX : Pour un cadrage professionnel, baissez légèrement le visage jusqu\'à la ligne supérieure.',
264
- alertTiltedHead: 'TÊTE INCLINÉE : Une posture trop inclinée peut transmettre de l\'instabilité.',
265
- alertSmileDetected: 'SOURIRE DÉTECTÉ : Les sourires augmentent considérablement le taux de match.',
266
- alertSevereExpression: 'EXPRESSION SÉVÈRE : Essayez d\'utiliser une photo avec un geste plus amical.',
267
- alertObstructedTop: 'OBSTRUÉ : La barre de progression cache votre visage.',
268
- alertObstructedBottom: 'OBSTRUÉ : Le bloc d\'information cache votre visage.',
269
- alertLowLight: 'ÉCLAIRAGE DÉFICIENT : L\'IA a des difficultés à vous voir. Cherchez une photo avec une meilleure lumière.',
270
- alertCutOff: 'COUPÉ : Le visage sort du cadre vertical.',
271
- alertProTip: 'CONSEIL PRO : S\'il s\'agit d\'un selfie, utilisez le Zoom (1.2x) pour éviter les distorsions de l\'objectif.',
247
+ alertEmptySpaces: 'ESPACES VIDES: L\'image ne couvre pas tout le cadre. Ajustez le zoom ou la position.',
248
+ alertAlmostInvisible: 'PRESQUE INVISIBLE: Vous êtes trop loin. Zoomez jusqu\'à ce que votre visage occupe au moins un tiers de l\'écran.',
249
+ alertTooClose: 'TROP PRÈS: Les gros plans extrêmes peuvent paraître agressifs.',
250
+ alertPerfectSize: 'TAILLE PARFAITE: Votre visage a le ratio idéal pour transmettre la confiance.',
251
+ alertImpactfulLook: 'REGARD IMPACTANT: Vos yeux sont sur la ligne d\'attention maximale.',
252
+ alertEyeLineMoveUp: 'LIGNE DES YEUX: Pour un cadrage professionnel, remontez légèrement le visage jusqu\'à la ligne supérieure.',
253
+ alertEyeLineMoveDown: 'LIGNE DES YEUX: Pour un cadrage professionnel, baissez légèrement le visage jusqu\'à la ligne supérieure.',
254
+ alertTiltedHead: 'TÊTE INCLINÉE: Une posture trop inclinée peut transmettre de l\'instabilité.',
255
+ alertSmileDetected: 'SOURIRE DÉTECTÉ: Les sourires augmentent considérablement le taux de match.',
256
+ alertSevereExpression: 'EXPRESSION SÉVÈRE: Essayez d\'utiliser une photo avec un geste plus amical.',
257
+ alertObstructedTop: 'OBSTRUÉ: La barre de progression cache votre visage.',
258
+ alertObstructedBottom: 'OBSTRUÉ: Le bloc d\'information cache votre visage.',
259
+ alertLowLight: 'ÉCLAIRAGE DÉFICIENT: L\'IA a des difficultés à vous voir. Cherchez une photo avec une meilleure lumière.',
260
+ alertCutOff: 'COUPÉ: Le visage sort du cadre vertical.',
261
+ alertProTip: 'CONSEIL PRO: S\'il s\'agit d\'un selfie, utilisez le Zoom (1.2x) pour éviter les distorsions de l\'objectif.',
272
262
 
273
263
  canvasFaceDetected: 'Visage détecté',
274
264
  },
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { TinderPhotoOptimizerUI } from '../ui';
@@ -87,19 +88,8 @@ export const content: ToolLocaleContent<TinderPhotoOptimizerUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Pertanyaan yang Sering Diajukan',
91
- faq: faqData,
92
- bibliographyTitle: 'Referensi',
93
- bibliography: [
94
- {
95
- name: 'face-api.js: JavaScript Face Recognition in the Browser',
96
- url: 'https://github.com/justadudewhohacks/face-api.js',
97
- },
98
- {
99
- name: 'MDN Web Docs: Canvas API',
100
- url: 'https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API',
101
- },
102
- ],
91
+ faq: faqData,
92
+ bibliography,
103
93
  howTo: howToData,
104
94
  schemas: [faqSchema, howToSchema, appSchema],
105
95
  seo: [
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { TinderPhotoOptimizerUI } from '../ui';
@@ -87,19 +88,8 @@ export const content: ToolLocaleContent<TinderPhotoOptimizerUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Domande Frequenti',
91
- faq: faqData,
92
- bibliographyTitle: 'Riferimenti',
93
- bibliography: [
94
- {
95
- name: 'face-api.js: JavaScript Face Recognition in the Browser',
96
- url: 'https://github.com/justadudewhohacks/face-api.js',
97
- },
98
- {
99
- name: 'MDN Web Docs: Canvas API',
100
- url: 'https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API',
101
- },
102
- ],
91
+ faq: faqData,
92
+ bibliography,
103
93
  howTo: howToData,
104
94
  schemas: [faqSchema, howToSchema, appSchema],
105
95
  seo: [
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { TinderPhotoOptimizerUI } from '../ui';
@@ -87,19 +88,8 @@ export const content: ToolLocaleContent<TinderPhotoOptimizerUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'よくある質問',
91
- faq: faqData,
92
- bibliographyTitle: '参考文献',
93
- bibliography: [
94
- {
95
- name: 'face-api.js: JavaScript Face Recognition in the Browser',
96
- url: 'https://github.com/justadudewhohacks/face-api.js',
97
- },
98
- {
99
- name: 'MDN Web Docs: Canvas API',
100
- url: 'https://developer.mozilla.org/ja/docs/Web/API/Canvas_API',
101
- },
102
- ],
91
+ faq: faqData,
92
+ bibliography,
103
93
  howTo: howToData,
104
94
  schemas: [faqSchema, howToSchema, appSchema],
105
95
  seo: [
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { TinderPhotoOptimizerUI } from '../ui';
@@ -87,19 +88,8 @@ export const content: ToolLocaleContent<TinderPhotoOptimizerUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: '자주 묻는 질문',
91
- faq: faqData,
92
- bibliographyTitle: '참고 문헌',
93
- bibliography: [
94
- {
95
- name: 'face-api.js: JavaScript Face Recognition in the Browser',
96
- url: 'https://github.com/justadudewhohacks/face-api.js',
97
- },
98
- {
99
- name: 'MDN Web Docs: Canvas API',
100
- url: 'https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API',
101
- },
102
- ],
91
+ faq: faqData,
92
+ bibliography,
103
93
  howTo: howToData,
104
94
  schemas: [faqSchema, howToSchema, appSchema],
105
95
  seo: [
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { TinderPhotoOptimizerUI } from '../ui';
@@ -87,19 +88,8 @@ export const content: ToolLocaleContent<TinderPhotoOptimizerUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Veelgestelde Vragen',
91
- faq: faqData,
92
- bibliographyTitle: 'Referenties',
93
- bibliography: [
94
- {
95
- name: 'face-api.js: JavaScript Face Recognition in the Browser',
96
- url: 'https://github.com/justadudewhohacks/face-api.js',
97
- },
98
- {
99
- name: 'MDN Web Docs: Canvas API',
100
- url: 'https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API',
101
- },
102
- ],
91
+ faq: faqData,
92
+ bibliography,
103
93
  howTo: howToData,
104
94
  schemas: [faqSchema, howToSchema, appSchema],
105
95
  seo: [
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { TinderPhotoOptimizerUI } from '../ui';
@@ -87,19 +88,8 @@ export const content: ToolLocaleContent<TinderPhotoOptimizerUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Często Zadawane Pytania',
91
- faq: faqData,
92
- bibliographyTitle: 'Źródła',
93
- bibliography: [
94
- {
95
- name: 'face-api.js: JavaScript Face Recognition in the Browser',
96
- url: 'https://github.com/justadudewhohacks/face-api.js',
97
- },
98
- {
99
- name: 'MDN Web Docs: Canvas API',
100
- url: 'https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API',
101
- },
102
- ],
91
+ faq: faqData,
92
+ bibliography,
103
93
  howTo: howToData,
104
94
  schemas: [faqSchema, howToSchema, appSchema],
105
95
  seo: [
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { TinderPhotoOptimizerUI } from '../ui';
@@ -87,19 +88,8 @@ export const content: ToolLocaleContent<TinderPhotoOptimizerUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Perguntas Frequentes',
91
- faq: faqData,
92
- bibliographyTitle: 'Referências',
93
- bibliography: [
94
- {
95
- name: 'face-api.js: JavaScript Face Recognition in the Browser',
96
- url: 'https://github.com/justadudewhohacks/face-api.js',
97
- },
98
- {
99
- name: 'MDN Web Docs: Canvas API',
100
- url: 'https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API',
101
- },
102
- ],
91
+ faq: faqData,
92
+ bibliography,
103
93
  howTo: howToData,
104
94
  schemas: [faqSchema, howToSchema, appSchema],
105
95
  seo: [
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { TinderPhotoOptimizerUI } from '../ui';
@@ -11,7 +12,7 @@ const faqData = [
11
12
  {
12
13
  question: 'Как этот инструмент улучшает мои совпадения в Tinder?',
13
14
  answer:
14
- 'Инструмент анализирует ключевые технические факторы: соотношение размера лица (идеально 30–50%), положение линии глаз относительно верхней трети, охват кадра и «мертвые зоны» интерфейса Tinder. Настраивая эти параметры, вы транслируете больше уверенности и обходите визуальные фильтры алгоритма.',
15
+ 'Инструмент анализирует ключевые технические факторы: соотношение размера лица (идеально 30-50%), положение линии глаз относительно верхней трети, охват кадра и \"мертвые зоны\" интерфейса Tinder. Настраивая эти параметры, вы транслируете больше уверенности и обходите визуальные фильтры алгоритма.',
15
16
  },
16
17
  {
17
18
  question: 'Безопасно ли загружать сюда мои фотографии?',
@@ -26,7 +27,7 @@ const faqData = [
26
27
  {
27
28
  question: 'Почему рекомендуется зум 1.2x?',
28
29
  answer:
29
- 'Фронтальные камеры смартфонов используют широкоугольную оптику (24 мм), которая искажает лицо из-за бочкообразной аберрации. Зум 1.2x симулирует фокусное расстояние 50–85 мм, устраняя искажения и обеспечивая более естественные и привлекательные пропорции лица.',
30
+ 'Фронтальные камеры смартфонов используют широкоугольную оптику (24 мм), которая искажает лицо из-за бочкообразной аберрации. Зум 1.2x симулирует фокусное расстояние 50-85 мм, устраняя искажения и обеспечивая более естественные и привлекательные пропорции лица.',
30
31
  },
31
32
  ];
32
33
 
@@ -87,19 +88,8 @@ export const content: ToolLocaleContent<TinderPhotoOptimizerUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Часто задаваемые вопросы',
91
- faq: faqData,
92
- bibliographyTitle: 'Ссылки',
93
- bibliography: [
94
- {
95
- name: 'face-api.js: JavaScript Face Recognition in the Browser',
96
- url: 'https://github.com/justadudewhohacks/face-api.js',
97
- },
98
- {
99
- name: 'MDN Web Docs: Canvas API',
100
- url: 'https://developer.mozilla.org/ru/docs/Web/API/Canvas_API',
101
- },
102
- ],
91
+ faq: faqData,
92
+ bibliography,
103
93
  howTo: howToData,
104
94
  schemas: [faqSchema, howToSchema, appSchema],
105
95
  seo: [
@@ -136,11 +126,11 @@ export const content: ToolLocaleContent<TinderPhotoOptimizerUI> = {
136
126
  },
137
127
  {
138
128
  type: 'paragraph',
139
- html: 'Почти все фото профиля делаются на смартфоны, фронтальные камеры которых являются широкоугольными. Самая частая ошибка — подходить слишком близко к устройству.',
129
+ html: 'Почти все фото профиля делаются на смартфоны, фронтальные камеры которых являются широкоугольными. Самая частая ошибка - подходить слишком близко к устройству.',
140
130
  },
141
131
  {
142
132
  type: 'paragraph',
143
- html: '<strong>Бочкообразная аберрация:</strong> На расстоянии менее метра линза 24 мм (стандарт в мобильных телефонах) расширяет центр изображения. Из-за этого нос кажется крупнее, а лицо — круглее, чем на самом деле. Наша рекомендация <strong>Зум 1.2x</strong> является корректирующей: применяя легкое цифровое кадрирование, вы симулируете фокусное расстояние от 50 до 85 мм — «золотой стандарт», который используют фэшн-фотографы для визуального сужения лица и сохранения реальных пропорций.',
133
+ html: '<strong>Бочкообразная аберрация:</strong> На расстоянии менее метра линза 24 мм (стандарт в мобильных телефонах) расширяет центр изображения. Из-за этого нос кажется крупнее, а лицо - круглее, чем на самом деле. Наша рекомендация <strong>Зум 1.2x</strong> является корректирующей: применяя легкое цифровое кадрирование, вы симулируете фокусное расстояние от 50 до 85 мм - \"золотой стандарт\", который используют фэшн-фотографы для визуального сужения лица и сохранения реальных пропорций.',
144
134
  },
145
135
  {
146
136
  type: 'title',
@@ -149,12 +139,12 @@ export const content: ToolLocaleContent<TinderPhotoOptimizerUI> = {
149
139
  },
150
140
  {
151
141
  type: 'paragraph',
152
- html: 'Многие отличные фото «проваливаются» из-за игнорирования программного слоя (UI), который Tinder накладывает сверху. Среднестатистический пользователь видит не ваше чистое фото, а смесь кнопок, градиентов и текста.',
142
+ html: 'Многие отличные фото \"проваливаются\" из-за игнорирования программного слоя (UI), который Tinder накладывает сверху. Среднестатистический пользователь видит не ваше чистое фото, а смесь кнопок, градиентов и текста.',
153
143
  },
154
144
  {
155
145
  type: 'list',
156
146
  items: [
157
- '<strong>Зона заголовков (верхние 15%):</strong> Здесь располагаются индикаторы прогресса и строка состояния. Если ваш лоб или глаза здесь, интерфейс визуально «отрезает» часть головы.',
147
+ '<strong>Зона заголовков (верхние 15%):</strong> Здесь располагаются индикаторы прогресса и строка состояния. Если ваш лоб или глаза здесь, интерфейс визуально \"отрезает\" часть головы.',
158
148
  '<strong>Зона действия (кнопки):</strong> Иконки Like, Nope и Boost занимают нижние боковые части. Если ваши руки или элементы стиля находятся там, они будут полностью потеряны.',
159
149
  '<strong>Градиент читаемости (нижние 28%):</strong> Tinder применяет черное затемнение, чтобы имя и возраст были читаемы. Если лицо попадает в эту зону, текст наложится на черты лица, портя эстетику профиля.',
160
150
  ],
@@ -183,12 +173,12 @@ export const content: ToolLocaleContent<TinderPhotoOptimizerUI> = {
183
173
  },
184
174
  {
185
175
  type: 'paragraph',
186
- html: 'Знаете ли вы, что «вес» вашего изображения влияет на алгоритм? Приложения для знакомств отдают приоритет контенту, который загружается быстро, чтобы не прерывать флоу пользователя.',
176
+ html: 'Знаете ли вы, что \"вес\" вашего изображения влияет на алгоритм? Приложения для знакомств отдают приоритет контенту, который загружается быстро, чтобы не прерывать флоу пользователя.',
187
177
  },
188
178
  {
189
179
  type: 'list',
190
180
  items: [
191
- '<strong>Metadata Stripping (приватность и SEO):</strong> Мы удаляем записи EXIF. Чистое фото дает вам «новый холст» для алгоритма платформы.',
181
+ '<strong>Metadata Stripping (приватность и SEO):</strong> Мы удаляем записи EXIF. Чистое фото дает вам \"новый холст\" для алгоритма платформы.',
192
182
  '<strong>Умное сжатие без потерь:</strong> Мы уменьшаем вес файла JPG, сохраняя цветовое пространство sRGB, нативное для iOS и Android. Ваше фото будет выглядеть сочно даже при плохом сигнале.',
193
183
  '<strong>Иммерсивный формат 9:16:</strong> Выдавая ровно 1080x1920 пикселей, мы предотвращаем применение Tinder собственного агрессивного алгоритма сжатия, создающего артефакты изображения.',
194
184
  ],
@@ -196,7 +186,7 @@ export const content: ToolLocaleContent<TinderPhotoOptimizerUI> = {
196
186
  {
197
187
  type: 'tip',
198
188
  title: 'Совет эксперта',
199
- html: '<p>Первое фото ВСЕГДА должно быть четким портретом по плечи. Фото в полный рост или за каким-то занятием оставьте для 3-й или 4-й позиции. Убедитесь, что при этом первом впечатлении ваш взгляд ничем не заслонен, а лицо имеет оптимальный размер (30–50%).</p>',
189
+ html: '<p>Первое фото ВСЕГДА должно быть четким портретом по плечи. Фото в полный рост или за каким-то занятием оставьте для 3-й или 4-й позиции. Убедитесь, что при этом первом впечатлении ваш взгляд ничем не заслонен, а лицо имеет оптимальный размер (30-50%).</p>',
200
190
  },
201
191
  {
202
192
  type: 'title',