@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
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { RedditFormatterUI } from '../ui';
@@ -87,19 +88,8 @@ export const content: ToolLocaleContent<RedditFormatterUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Sıkça Sorulan Sorular',
91
- faq: faqData,
92
- bibliographyTitle: 'Referanslar',
93
- bibliography: [
94
- {
95
- name: 'Reddit Yardımı: Gönderilerde ve yorumlarda metni biçimlendirme',
96
- url: 'https://support.reddithelp.com/hc/en-us/articles/360043033952-Formatting-text-in-posts-and-comments',
97
- },
98
- {
99
- name: 'Reddit Markdown kılavuzu',
100
- url: 'https://www.reddit.com/wiki/markdown/',
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, HowToThing, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { RedditFormatterUI } from '../ui';
@@ -45,7 +46,7 @@ const howToData = [
45
46
  },
46
47
  {
47
48
  name: '复制并发布',
48
- text: '点击“复制文本”并直接粘贴到 Reddit 或任何论坛。',
49
+ text: '点击\"复制文本\"并直接粘贴到 Reddit 或任何论坛。',
49
50
  },
50
51
  ];
51
52
 
@@ -87,19 +88,8 @@ export const content: ToolLocaleContent<RedditFormatterUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: '常见问题',
91
- faq: faqData,
92
- bibliographyTitle: '参考资料',
93
- bibliography: [
94
- {
95
- name: 'Reddit 帮助:在帖子和评论中格式化文本',
96
- url: 'https://support.reddithelp.com/hc/en-us/articles/360043033952-Formatting-text-in-posts-and-comments',
97
- },
98
- {
99
- name: 'Reddit Markdown 指南',
100
- url: 'https://www.reddit.com/wiki/markdown/',
101
- },
102
- ],
91
+ faq: faqData,
92
+ bibliography,
103
93
  howTo: howToData,
104
94
  schemas: [faqSchema, howToSchema, appSchema],
105
95
  seo: [
@@ -11,4 +11,5 @@ const { locale = 'es' } = Astro.props;
11
11
  const content = await redditFormatter.i18n[locale]?.();
12
12
  if (!content) return null;
13
13
  ---
14
- <SEORenderer content={{ locale: locale as string, sections: content.seo }} />
14
+
15
+ {content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
@@ -1,14 +1,6 @@
1
1
  ---
2
2
  import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
3
- import { safeZones } from './index';
4
- import type { KnownLocale } from '../../types';
5
-
6
- interface Props {
7
- locale?: KnownLocale;
8
- }
9
-
10
- const { locale = 'es' } = Astro.props;
11
- const content = await safeZones.i18n[locale]?.();
3
+ import { bibliography } from './bibliography';
12
4
  ---
13
5
 
14
- {content && <SharedBibliography links={content.bibliography} />}
6
+ <SharedBibliography links={bibliography} />
@@ -0,0 +1,20 @@
1
+ import type { BibliographyEntry } from '../../types';
2
+
3
+ export const bibliography: BibliographyEntry[] = [
4
+ {
5
+ name: 'TikTok Creator Portal: Video optimization and safe zones',
6
+ url: 'https://www.tiktok.com/creators/creator-portal/en-us/foundation/video-optimization/',
7
+ },
8
+ {
9
+ name: 'Instagram Business: Best practices for Reels',
10
+ url: 'https://business.instagram.com/creators/reels-best-practices',
11
+ },
12
+ {
13
+ name: 'YouTube Help: Create YouTube Shorts',
14
+ url: 'https://support.google.com/youtube/answer/10343433',
15
+ },
16
+ {
17
+ name: 'Meta for Creators: Safe zones and aspect ratios for video',
18
+ url: 'https://www.facebook.com/business/help/103816146375741',
19
+ },
20
+ ];
@@ -86,7 +86,7 @@ const YOUTUBE_SVG = `<svg viewBox="0 0 24 24" fill="currentColor" width="24" hei
86
86
  <span class="szl-section-label">{t.labelOpacity}</span>
87
87
  <span class="szl-opacity-val" data-szl-opacity-val>85%</span>
88
88
  </div>
89
- <input type="range" class="szl-slider" data-szl-slider min="0" max="100" value="85" />
89
+ <input type="range" class="szl-slider" data-szl-slider min="0" max="100" value="85" aria-label={t.labelOpacity} />
90
90
  </div>
91
91
 
92
92
  <div class="szl-toggles">
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { SafeZonesUI } from '../ui';
@@ -33,7 +34,7 @@ const faqData = [
33
34
  const howToData = [
34
35
  {
35
36
  name: 'Bild oder Video laden',
36
- text: 'Laden Sie die Datei hoch, die Sie in der Vorschau sehen möchten. Die Verarbeitung erfolgt lokal und privat – es wird nichts ins Internet hochgeladen.',
37
+ text: 'Laden Sie die Datei hoch, die Sie in der Vorschau sehen möchten. Die Verarbeitung erfolgt lokal und privat - es wird nichts ins Internet hochgeladen.',
37
38
  },
38
39
  {
39
40
  name: 'Plattform auswählen',
@@ -87,27 +88,8 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Häufig gestellte Fragen',
91
- faq: faqData,
92
- bibliographyTitle: 'Offizielle Plattform-Dokumentation',
93
- bibliography: [
94
- {
95
- name: 'TikTok Creator Portal: Video-Optimierung und Safe Zones',
96
- url: 'https://www.tiktok.com/creators/creator-portal/en-us/foundation/video-optimization/',
97
- },
98
- {
99
- name: 'Instagram Business: Best Practices für Reels',
100
- url: 'https://business.instagram.com/creators/reels-best-practices',
101
- },
102
- {
103
- name: 'YouTube Hilfe: YouTube Shorts erstellen',
104
- url: 'https://support.google.com/youtube/answer/10343433',
105
- },
106
- {
107
- name: 'Meta for Creators: Safe Zones und Seitenverhältnisse für Videos',
108
- url: 'https://www.facebook.com/business/help/103816146375741',
109
- },
110
- ],
91
+ faq: faqData,
92
+ bibliography,
111
93
  howTo: howToData,
112
94
  schemas: [faqSchema, howToSchema, appSchema],
113
95
  seo: [
@@ -195,7 +177,7 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
195
177
  },
196
178
  {
197
179
  type: 'paragraph',
198
- html: 'Design für soziale Medien ist nicht nur Ästhetik – es ist <strong>Benutzerfreundlichkeit</strong>. Wenn ein Benutzer kämpfen muss, um Text zu lesen, weil die Symbole der Plattform ihn verdecken, wischt er einfach zum nächsten Video weiter. Die Verweildauer (Watch Time) sinkt drastisch, wenn es visuelle Reibung gibt.',
180
+ html: 'Design für soziale Medien ist nicht nur Ästhetik - es ist <strong>Benutzerfreundlichkeit</strong>. Wenn ein Benutzer kämpfen muss, um Text zu lesen, weil die Symbole der Plattform ihn verdecken, wischt er einfach zum nächsten Video weiter. Die Verweildauer (Watch Time) sinkt drastisch, wenn es visuelle Reibung gibt.',
199
181
  },
200
182
  {
201
183
  type: 'paragraph',
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { SafeZonesUI } from '../ui';
@@ -33,7 +34,7 @@ const faqData = [
33
34
  const howToData = [
34
35
  {
35
36
  name: 'Load your image or video',
36
- text: 'Upload the file you want to preview. Processing is local and private — nothing is uploaded to the internet.',
37
+ text: 'Upload the file you want to preview. Processing is local and private - nothing is uploaded to the internet.',
37
38
  },
38
39
  {
39
40
  name: 'Select the platform',
@@ -87,27 +88,8 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Frequently Asked Questions',
91
- faq: faqData,
92
- bibliographyTitle: 'Official Platform Documentation',
93
- bibliography: [
94
- {
95
- name: 'TikTok Creator Portal: Video optimization and safe zones',
96
- url: 'https://www.tiktok.com/creators/creator-portal/en-us/foundation/video-optimization/',
97
- },
98
- {
99
- name: 'Instagram Business: Best practices for Reels',
100
- url: 'https://business.instagram.com/creators/reels-best-practices',
101
- },
102
- {
103
- name: 'YouTube Help: Create YouTube Shorts',
104
- url: 'https://support.google.com/youtube/answer/10343433',
105
- },
106
- {
107
- name: 'Meta for Creators: Safe zones and aspect ratios for video',
108
- url: 'https://www.facebook.com/business/help/103816146375741',
109
- },
110
- ],
91
+ faq: faqData,
92
+ bibliography,
111
93
  howTo: howToData,
112
94
  schemas: [faqSchema, howToSchema, appSchema],
113
95
  seo: [
@@ -195,7 +177,7 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
195
177
  },
196
178
  {
197
179
  type: 'paragraph',
198
- html: 'Designing for social media is not just aesthetics — it is <strong>usability</strong>. If a user has to struggle to read text because the platform\'s icons are covering it, they will simply swipe to the next video. Retention (Watch Time) drops sharply when there is visual friction.',
180
+ html: 'Designing for social media is not just aesthetics - it is <strong>usability</strong>. If a user has to struggle to read text because the platform\'s icons are covering it, they will simply swipe to the next video. Retention (Watch Time) drops sharply when there is visual friction.',
199
181
  },
200
182
  {
201
183
  type: 'paragraph',
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { SafeZonesUI } from '../ui';
@@ -87,27 +88,8 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Preguntas Frecuentes',
91
- faq: faqData,
92
- bibliographyTitle: 'Documentación Oficial de Plataformas',
93
- bibliography: [
94
- {
95
- name: 'TikTok Creator Portal: Video optimization and safe zones',
96
- url: 'https://www.tiktok.com/creators/creator-portal/en-us/foundation/video-optimization/',
97
- },
98
- {
99
- name: 'Instagram Business: Best practices for Reels',
100
- url: 'https://business.instagram.com/creators/reels-best-practices',
101
- },
102
- {
103
- name: 'YouTube Help: Create YouTube Shorts',
104
- url: 'https://support.google.com/youtube/answer/10343433',
105
- },
106
- {
107
- name: 'Meta for Creators: Safe zones and aspect ratios for video',
108
- url: 'https://www.facebook.com/business/help/103816146375741',
109
- },
110
- ],
91
+ faq: faqData,
92
+ bibliography,
111
93
  howTo: howToData,
112
94
  schemas: [faqSchema, howToSchema, appSchema],
113
95
  seo: [
@@ -1,9 +1,10 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { SafeZonesUI } from '../ui';
4
5
 
5
6
  const slug = 'simulateur-reseaux';
6
- const title = 'Safe Zones Réseaux Sociaux : Simulateur Vidéo TikTok, Reels et Shorts';
7
+ const title = 'Safe Zones Réseaux Sociaux: Simulateur Vidéo TikTok, Reels et Shorts';
7
8
  const description =
8
9
  'Prévisualisez vos images et vidéos avec la vraie interface des réseaux sociaux. Assurez-vous que votre contenu est toujours visible et évitez les recadrages accidentels.';
9
10
 
@@ -33,7 +34,7 @@ const faqData = [
33
34
  const howToData = [
34
35
  {
35
36
  name: 'Charger votre image ou vidéo',
36
- text: "Téléchargez le fichier que vous souhaitez prévisualiser. Le traitement est local et privé — rien n'est envoyé sur internet.",
37
+ text: "Téléchargez le fichier que vous souhaitez prévisualiser. Le traitement est local et privé - rien n'est envoyé sur internet.",
37
38
  },
38
39
  {
39
40
  name: 'Sélectionner la plateforme',
@@ -87,33 +88,14 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Questions Fréquentes',
91
- faq: faqData,
92
- bibliographyTitle: 'Documentation Officielle des Plateformes',
93
- bibliography: [
94
- {
95
- name: 'TikTok Creator Portal: Video optimization and safe zones',
96
- url: 'https://www.tiktok.com/creators/creator-portal/en-us/foundation/video-optimization/',
97
- },
98
- {
99
- name: 'Instagram Business: Best practices for Reels',
100
- url: 'https://business.instagram.com/creators/reels-best-practices',
101
- },
102
- {
103
- name: 'YouTube Help: Create YouTube Shorts',
104
- url: 'https://support.google.com/youtube/answer/10343433',
105
- },
106
- {
107
- name: 'Meta for Creators: Safe zones and aspect ratios for video',
108
- url: 'https://www.facebook.com/business/help/103816146375741',
109
- },
110
- ],
91
+ faq: faqData,
92
+ bibliography,
111
93
  howTo: howToData,
112
94
  schemas: [faqSchema, howToSchema, appSchema],
113
95
  seo: [
114
96
  {
115
97
  type: 'title',
116
- text: 'Guide Maître des Zones Sécurisées : Optimisez vos Reels, TikToks et Shorts',
98
+ text: 'Guide Maître des Zones Sécurisées: Optimisez vos Reels, TikToks et Shorts',
117
99
  level: 2,
118
100
  },
119
101
  {
@@ -129,19 +111,19 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
129
111
  columns: [
130
112
  {
131
113
  type: 'card',
132
- title: "TikTok : L'interface la plus invasive",
133
- html: "<p>TikTok possède l'interface la plus dense. Sur la droite, une colonne d'icônes occupe environ 15% de la largeur. En bas, la description peut s'étendre sur 4 ou 5 lignes si elle est longue, couvrant presque un tiers de l'écran depuis le bas.</p><ul><li><strong>Marge inférieure :</strong> Laissez libres les 250 derniers pixels pour éviter le texte de la description et le nom d'utilisateur.</li><li><strong>Marge droite :</strong> Évitez de placer du texte à moins de 100px du bord droit.</li><li><strong>Haut :</strong> Les boutons « Abonnements » et « Pour toi » occupent la bande supérieure centrale.</li></ul>",
114
+ title: "TikTok: L'interface la plus invasive",
115
+ html: "<p>TikTok possède l'interface la plus dense. Sur la droite, une colonne d'icônes occupe environ 15% de la largeur. En bas, la description peut s'étendre sur 4 ou 5 lignes si elle est longue, couvrant presque un tiers de l'écran depuis le bas.</p><ul><li><strong>Marge inférieure :</strong> Laissez libres les 250 derniers pixels pour éviter le texte de la description et le nom d'utilisateur.</li><li><strong>Marge droite :</strong> Évitez de placer du texte à moins de 100px du bord droit.</li><li><strong>Haut :</strong> Les boutons \" Abonnements \" et \" Pour toi \" occupent la bande supérieure centrale.</li></ul>",
134
116
  },
135
117
  {
136
118
  type: 'card',
137
- title: 'IG Reels : Le facteur du fil',
119
+ title: 'IG Reels: Le facteur du fil',
138
120
  html: "<p>Contrairement à TikTok, Instagram Reels recadre la vidéo au format 4:5 lorsqu'elle est visualisée depuis le fil principal (pas depuis l'onglet Reels). Cela signifie que si vous placez des informations vitales dans les 15% supérieurs ou inférieurs de votre vidéo 9:16, elles disparaîtront dans le fil.</p><ul><li><strong>La règle du 4:5 :</strong> Gardez les titres et éléments clés dans la zone centrale pour assurer la visibilité dans le fil.</li><li><strong>Interface :</strong> Les icônes de Reels sont plus subtiles que celles de TikTok, permettant un peu plus de marge latérale.</li><li><strong>Bouton audio :</strong> Situé en bas à droite, il couvre généralement bien moins que le disque tournant de TikTok.</li></ul>",
139
121
  },
140
122
  ],
141
123
  },
142
124
  {
143
125
  type: 'title',
144
- text: 'YouTube Shorts : Attention à la droite',
126
+ text: 'YouTube Shorts: Attention à la droite',
145
127
  level: 3,
146
128
  },
147
129
  {
@@ -153,7 +135,7 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
153
135
  items: [
154
136
  '<strong>Marge droite :</strong> Évitez de placer du texte ou des éléments importants dans les 20% inférieurs droits.',
155
137
  "<strong>Marge inférieure :</strong> Laissez libres les 150 derniers pixels pour éviter le texte de la description et le nom d'utilisateur.",
156
- "<strong>Haut :</strong> Les boutons « S'abonner » et « Plus » occupent la bande supérieure centrale.",
138
+ "<strong>Haut :</strong> Les boutons \" S'abonner \" et \" Plus \" occupent la bande supérieure centrale.",
157
139
  ],
158
140
  },
159
141
  {
@@ -168,7 +150,7 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
168
150
  },
169
151
  {
170
152
  type: 'paragraph',
171
- html: 'La « Zone d\'Or » pour l\'action principale est le tiers central de la vidéo. Si vous filmez une personne, assurez-vous que ses yeux et sa bouche se trouvent dans cette zone. Les éléments graphiques importants doivent être légèrement décalés vers le haut par rapport au centre géométrique pour éviter la description inférieure.',
153
+ html: 'La \" Zone d\'Or \" pour l\'action principale est le tiers central de la vidéo. Si vous filmez une personne, assurez-vous que ses yeux et sa bouche se trouvent dans cette zone. Les éléments graphiques importants doivent être légèrement décalés vers le haut par rapport au centre géométrique pour éviter la description inférieure.',
172
154
  },
173
155
  {
174
156
  type: 'title',
@@ -186,7 +168,7 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
186
168
  },
187
169
  {
188
170
  type: 'paragraph',
189
- html: 'Rappelez-vous que les téléphones modernes ont des « encoches » ou des trous de caméra à l\'écran. Cet outil inclut une marge de sécurité supérieure pour que votre contenu n\'entre pas en conflit avec l\'horloge ou les icônes système (batterie, signal).',
171
+ html: 'Rappelez-vous que les téléphones modernes ont des \" encoches \" ou des trous de caméra à l\'écran. Cet outil inclut une marge de sécurité supérieure pour que votre contenu n\'entre pas en conflit avec l\'horloge ou les icônes système (batterie, signal).',
190
172
  },
191
173
  {
192
174
  type: 'title',
@@ -195,7 +177,7 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
195
177
  },
196
178
  {
197
179
  type: 'paragraph',
198
- html: "Concevoir pour les réseaux sociaux n'est pas seulement esthétique — c'est de l'<strong>utilisabilité</strong>. Si un utilisateur doit faire un effort pour lire un texte parce que les icônes de la plateforme le couvrent, il passera simplement à la vidéo suivante. La rétention (Watch Time) chute brutalement en cas de friction visuelle.",
180
+ html: "Concevoir pour les réseaux sociaux n'est pas seulement esthétique - c'est de l'<strong>utilisabilité</strong>. Si un utilisateur doit faire un effort pour lire un texte parce que les icônes de la plateforme le couvrent, il passera simplement à la vidéo suivante. La rétention (Watch Time) chute brutalement en cas de friction visuelle.",
199
181
  },
200
182
  {
201
183
  type: 'paragraph',
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { SafeZonesUI } from '../ui';
@@ -33,7 +34,7 @@ const faqData = [
33
34
  const howToData = [
34
35
  {
35
36
  name: 'Muat gambar atau video Anda',
36
- text: 'Unggah file yang ingin Anda pratinjau. Pemrosesan bersifat lokal dan pribadi — tidak ada yang diunggah ke internet.',
37
+ text: 'Unggah file yang ingin Anda pratinjau. Pemrosesan bersifat lokal dan pribadi - tidak ada yang diunggah ke internet.',
37
38
  },
38
39
  {
39
40
  name: 'Pilih platform',
@@ -87,27 +88,8 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Pertanyaan yang Sering Diajukan',
91
- faq: faqData,
92
- bibliographyTitle: 'Dokumentasi Platform Resmi',
93
- bibliography: [
94
- {
95
- name: 'Portal Kreator TikTok: Optimasi video dan zona aman',
96
- url: 'https://www.tiktok.com/creators/creator-portal/en-us/foundation/video-optimization/',
97
- },
98
- {
99
- name: 'Instagram Business: Praktik terbaik untuk Reels',
100
- url: 'https://business.instagram.com/creators/reels-best-practices',
101
- },
102
- {
103
- name: 'Bantuan YouTube: Membuat YouTube Shorts',
104
- url: 'https://support.google.com/youtube/answer/10343433',
105
- },
106
- {
107
- name: 'Meta for Creators: Zona aman dan rasio aspek untuk video',
108
- url: 'https://www.facebook.com/business/help/103816146375741',
109
- },
110
- ],
91
+ faq: faqData,
92
+ bibliography,
111
93
  howTo: howToData,
112
94
  schemas: [faqSchema, howToSchema, appSchema],
113
95
  seo: [
@@ -195,7 +177,7 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
195
177
  },
196
178
  {
197
179
  type: 'paragraph',
198
- html: 'Mendesain untuk media sosial bukan hanya tentang estetika — ini tentang <strong>kegunaan</strong>. Jika pengguna harus berjuang untuk membaca teks karena ikon platform menutupinya, mereka akan langsung beralih ke video berikutnya. Retensi (Watch Time) turun tajam saat terjadi gesekan visual.',
180
+ html: 'Mendesain untuk media sosial bukan hanya tentang estetika - ini tentang <strong>kegunaan</strong>. Jika pengguna harus berjuang untuk membaca teks karena ikon platform menutupinya, mereka akan langsung beralih ke video berikutnya. Retensi (Watch Time) turun tajam saat terjadi gesekan visual.',
199
181
  },
200
182
  {
201
183
  type: 'paragraph',
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { SafeZonesUI } from '../ui';
@@ -24,7 +25,7 @@ const faqData = [
24
25
  "Sono molto simili ma non identiche. I pulsanti di YouTube Shorts sono posizionati diversamente rispetto a quelli di Reels. Il nostro strumento ti consente di passare da una piattaforma all'altra per verificare il tuo design su ognuna di esse.",
25
26
  },
26
27
  {
27
- question: 'Cosa succede se metto del testo nell’angolo in basso a destra?',
28
+ question: 'Cosa succede se metto del testo nell\'angolo in basso a destra?',
28
29
  answer:
29
30
  "Probabilmente sarà invisibile o molto difficile da leggere, poiché è lì che si trovano le icone del profilo, del cuore e dei commenti. Idealmente, tieni testi e volti nell'area centrale superiore (Zona Sicura).",
30
31
  },
@@ -33,7 +34,7 @@ const faqData = [
33
34
  const howToData = [
34
35
  {
35
36
  name: 'Carica la tua immagine o il tuo video',
36
- text: "Carica il file che desideri visualizzare in anteprima. L'elaborazione è locale e privata — nulla viene caricato su internet.",
37
+ text: "Carica il file che desideri visualizzare in anteprima. L'elaborazione è locale e privata - nulla viene caricato su internet.",
37
38
  },
38
39
  {
39
40
  name: 'Seleziona la piattaforma',
@@ -87,27 +88,8 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Domande Frequenti',
91
- faq: faqData,
92
- bibliographyTitle: 'Documentazione Ufficiale delle Piattaforme',
93
- bibliography: [
94
- {
95
- name: 'TikTok Creator Portal: Ottimizzazione video e zone sicure',
96
- url: 'https://www.tiktok.com/creators/creator-portal/en-us/foundation/video-optimization/',
97
- },
98
- {
99
- name: 'Instagram Business: Best practice per i Reels',
100
- url: 'https://business.instagram.com/creators/reels-best-practices',
101
- },
102
- {
103
- name: 'Guida di YouTube: Creare YouTube Shorts',
104
- url: 'https://support.google.com/youtube/answer/10343433',
105
- },
106
- {
107
- name: 'Meta for Creators: Zone sicure e rapporti d’aspetto per i video',
108
- url: 'https://www.facebook.com/business/help/103816146375741',
109
- },
110
- ],
91
+ faq: faqData,
92
+ bibliography,
111
93
  howTo: howToData,
112
94
  schemas: [faqSchema, howToSchema, appSchema],
113
95
  seo: [
@@ -129,8 +111,8 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
129
111
  columns: [
130
112
  {
131
113
  type: 'card',
132
- title: 'TikTok: L’interfaccia più invasiva',
133
- html: "<p>TikTok ha l'interfaccia più densa. Sul lato destro, c’è una colonna di icone che occupa circa il 15% della larghezza. In basso, la descrizione può estendersi su 4 o 5 righe, coprendo quasi un terzo dello schermo dal basso.</p><ul><li><strong>Margine inferiore:</strong> Lascia liberi gli ultimi 250px per evitare il testo della descrizione e il nome utente.</li><li><strong>Margine destro:</strong> Evita di posizionare il testo entro 100px dal bordo destro.</li><li><strong>In alto:</strong> I pulsanti \"Seguiti\" e \"Per te\" occupano la fascia centrale superiore.</li></ul>",
114
+ title: 'TikTok: L\'interfaccia più invasiva',
115
+ html: "<p>TikTok ha l'interfaccia più densa. Sul lato destro, c\'è una colonna di icone che occupa circa il 15% della larghezza. In basso, la descrizione può estendersi su 4 o 5 righe, coprendo quasi un terzo dello schermo dal basso.</p><ul><li><strong>Margine inferiore:</strong> Lascia liberi gli ultimi 250px per evitare il testo della descrizione e il nome utente.</li><li><strong>Margine destro:</strong> Evita di posizionare il testo entro 100px dal bordo destro.</li><li><strong>In alto:</strong> I pulsanti \"Seguiti\" e \"Per te\" occupano la fascia centrale superiore.</li></ul>",
134
116
  },
135
117
  {
136
118
  type: 'card',
@@ -146,7 +128,7 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
146
128
  },
147
129
  {
148
130
  type: 'paragraph',
149
- html: "YouTube Shorts ha un’interfaccia asimmetrica. Il pulsante iscriviti è molto visibile e di colore solido (solitamente nero o bianco), creando un importante punto cieco visivo in basso a destra.",
131
+ html: "YouTube Shorts ha un\'interfaccia asimmetrica. Il pulsante iscriviti è molto visibile e di colore solido (solitamente nero o bianco), creando un importante punto cieco visivo in basso a destra.",
150
132
  },
151
133
  {
152
134
  type: 'list',
@@ -195,7 +177,7 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
195
177
  },
196
178
  {
197
179
  type: 'paragraph',
198
- html: "Progettare per i social media non è solo estetica — è <strong>usabilità</strong>. Se un utente deve sforzarsi per leggere il testo perché le icone della piattaforma lo coprono, passerà semplicemente al video successivo. La ritenzione (Watch Time) cala drasticamente quando c'è un attrito visivo.",
180
+ html: "Progettare per i social media non è solo estetica - è <strong>usabilità</strong>. Se un utente deve sforzarsi per leggere il testo perché le icone della piattaforma lo coprono, passerà semplicemente al video successivo. La ritenzione (Watch Time) cala drasticamente quando c'è un attrito visivo.",
199
181
  },
200
182
  {
201
183
  type: 'paragraph',
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { SafeZonesUI } from '../ui';
@@ -87,27 +88,8 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'よくある質問',
91
- faq: faqData,
92
- bibliographyTitle: '公式プラットフォームドキュメント',
93
- bibliography: [
94
- {
95
- name: 'TikTokクリエイターポータル:動画の最適化とセーフゾーン',
96
- url: 'https://www.tiktok.com/creators/creator-portal/en-us/foundation/video-optimization/',
97
- },
98
- {
99
- name: 'Instagram Business:リールのベストプラクティス',
100
- url: 'https://business.instagram.com/creators/reels-best-practices',
101
- },
102
- {
103
- name: 'YouTubeヘルプ:YouTube Shortsを作成する',
104
- url: 'https://support.google.com/youtube/answer/10343433',
105
- },
106
- {
107
- name: 'Meta for Creators:動画のセーフゾーンとアスペクト比',
108
- url: 'https://www.facebook.com/business/help/103816146375741',
109
- },
110
- ],
91
+ faq: faqData,
92
+ bibliography,
111
93
  howTo: howToData,
112
94
  schemas: [faqSchema, howToSchema, appSchema],
113
95
  seo: [
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { SafeZonesUI } from '../ui';
@@ -87,27 +88,8 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: '자주 묻는 질문',
91
- faq: faqData,
92
- bibliographyTitle: '공식 플랫폼 문서',
93
- bibliography: [
94
- {
95
- name: '틱톡 크리에이터 포털: 동영상 최적화 및 세이프 존',
96
- url: 'https://www.tiktok.com/creators/creator-portal/en-us/foundation/video-optimization/',
97
- },
98
- {
99
- name: '인스타그램 비즈니스: 릴스를 위한 모범 사례',
100
- url: 'https://business.instagram.com/creators/reels-best-practices',
101
- },
102
- {
103
- name: '유튜브 고객센터: 유튜브 쇼츠 만들기',
104
- url: 'https://support.google.com/youtube/answer/10343433',
105
- },
106
- {
107
- name: '메타 크리에이터: 동영상의 세이프 존 및 화면비',
108
- url: 'https://www.facebook.com/business/help/103816146375741',
109
- },
110
- ],
91
+ faq: faqData,
92
+ bibliography,
111
93
  howTo: howToData,
112
94
  schemas: [faqSchema, howToSchema, appSchema],
113
95
  seo: [
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { SafeZonesUI } from '../ui';
@@ -33,7 +34,7 @@ const faqData = [
33
34
  const howToData = [
34
35
  {
35
36
  name: 'Laad uw afbeelding of video',
36
- text: 'Upload het bestand waarvan u een voorbeeld wilt zien. De verwerking is lokaal en privé — er wordt niets naar internet geüpload.',
37
+ text: 'Upload het bestand waarvan u een voorbeeld wilt zien. De verwerking is lokaal en privé - er wordt niets naar internet geüpload.',
37
38
  },
38
39
  {
39
40
  name: 'Selecteer het platform',
@@ -87,27 +88,8 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Veelgestelde Vragen',
91
- faq: faqData,
92
- bibliographyTitle: 'Officiële Platform Documentatie',
93
- bibliography: [
94
- {
95
- name: 'TikTok Creator Portal: Video optimization and safe zones',
96
- url: 'https://www.tiktok.com/creators/creator-portal/en-us/foundation/video-optimization/',
97
- },
98
- {
99
- name: 'Instagram Business: Best practices voor Reels',
100
- url: 'https://business.instagram.com/creators/reels-best-practices',
101
- },
102
- {
103
- name: 'YouTube Help: YouTube Shorts maken',
104
- url: 'https://support.google.com/youtube/answer/10343433',
105
- },
106
- {
107
- name: 'Meta for Creators: Veilige zones en aspectratio\'s voor video',
108
- url: 'https://www.facebook.com/business/help/103816146375741',
109
- },
110
- ],
91
+ faq: faqData,
92
+ bibliography,
111
93
  howTo: howToData,
112
94
  schemas: [faqSchema, howToSchema, appSchema],
113
95
  seo: [
@@ -195,7 +177,7 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
195
177
  },
196
178
  {
197
179
  type: 'paragraph',
198
- html: 'Ontwerpen voor sociale media gaat niet alleen over esthetiek — het gaat over <strong>gebruiksvriendelijkheid</strong>. Als een gebruiker moeite moet doen om tekst te lezen omdat de iconen van het platform deze bedekken, zullen ze simpelweg naar de volgende video swipen. Retentie (kijkduur) daalt scherp als er visuele wrijving is.',
180
+ html: 'Ontwerpen voor sociale media gaat niet alleen over esthetiek - het gaat over <strong>gebruiksvriendelijkheid</strong>. Als een gebruiker moeite moet doen om tekst te lezen omdat de iconen van het platform deze bedekken, zullen ze simpelweg naar de volgende video swipen. Retentie (kijkduur) daalt scherp als er visuele wrijving is.',
199
181
  },
200
182
  {
201
183
  type: 'paragraph',