@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 { SocialValueCalculatorUI } from '../ui';
@@ -9,7 +10,7 @@ const description =
9
10
 
10
11
  const faqData = [
11
12
  {
12
- question: 'Il calcolatore del valore dell’account è gratuito?',
13
+ question: 'Il calcolatore del valore dell\'account è gratuito?',
13
14
  answer:
14
15
  'Sì, il nostro strumento è gratuito al 100% e non richiede registrazione né connessione ai tuoi account social. Devi solo inserire le tue metriche pubbliche.',
15
16
  },
@@ -87,30 +88,15 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Domande Frequenti',
91
- faq: faqData,
92
- bibliographyTitle: 'Fonti e Studi di Mercato',
93
- bibliography: [
94
- {
95
- name: 'Influencer Marketing Hub: Influencer Rates 2026',
96
- url: 'https://influencermarketinghub.com/influencer-rates/',
97
- },
98
- {
99
- name: 'HypeAuditor: Rapporto Engagement TikTok e Instagram',
100
- url: 'https://hypeauditor.com/free-tools/tiktok-engagement-calculator/',
101
- },
102
- {
103
- name: 'Social Blade: Statistiche Social Media',
104
- url: 'https://socialblade.com/',
105
- },
106
- ],
91
+ faq: faqData,
92
+ bibliography,
107
93
  howTo: howToData,
108
94
  schemas: [faqSchema, howToSchema, appSchema],
109
95
  seo: [
110
96
  {
111
97
  type: 'tip',
112
98
  title: 'In questa guida imparerai',
113
- html: '<ul><li>Il tuo <strong>reale valore di mercato</strong> basato sui dati 2026.</li><li>Come differenziare l’impatto di <strong>TikTok vs Instagram</strong>.</li><li>Come la tua <strong>nicchia</strong> influisce drasticamente sul tuo CPM.</li><li>Un modello professionale per <strong>negoziare con i brand</strong>.</li></ul>',
99
+ html: '<ul><li>Il tuo <strong>reale valore di mercato</strong> basato sui dati 2026.</li><li>Come differenziare l\'impatto di <strong>TikTok vs Instagram</strong>.</li><li>Come la tua <strong>nicchia</strong> influisce drasticamente sul tuo CPM.</li><li>Un modello professionale per <strong>negoziare con i brand</strong>.</li></ul>',
114
100
  },
115
101
  {
116
102
  type: 'title',
@@ -123,12 +109,12 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
123
109
  },
124
110
  {
125
111
  type: 'title',
126
- text: 'L’ascesa della creator economy',
112
+ text: 'L\'ascesa della creator economy',
127
113
  level: 3,
128
114
  },
129
115
  {
130
116
  type: 'paragraph',
131
- html: 'L’influencer marketing è maturato e non si tratta più solo di numero di follower. I brand cercano risultati e connessione profonda. Il nostro strumento offre un punto di partenza solido basato su dati reali di mercato.',
117
+ html: 'L\'influencer marketing è maturato e non si tratta più solo di numero di follower. I brand cercano risultati e connessione profonda. Il nostro strumento offre un punto di partenza solido basato su dati reali di mercato.',
132
118
  },
133
119
  {
134
120
  type: 'grid',
@@ -145,7 +131,7 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
145
131
  },
146
132
  {
147
133
  type: 'card',
148
- title: '15€–50€',
134
+ title: '15€ a 50€',
149
135
  html: '<p>CPM medio in nicchie di alto valore (stabile)</p>',
150
136
  },
151
137
  ],
@@ -157,7 +143,7 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
157
143
  },
158
144
  {
159
145
  type: 'paragraph',
160
- html: 'A differenza di quanto si credesse anni fa, il numero di follower è solo la punta dell’iceberg. Ecco le componenti fondamentali:',
146
+ html: 'A differenza di quanto si credesse anni fa, il numero di follower è solo la punta dell\'iceberg. Ecco le componenti fondamentali:',
161
147
  },
162
148
  {
163
149
  type: 'title',
@@ -171,7 +157,7 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
171
157
  {
172
158
  type: 'tip',
173
159
  title: 'Consiglio engagement',
174
- html: '<p>Prova a rispondere ai commenti nelle prime ore dopo il post per inviare segnali positivi all’algoritmo.</p>',
160
+ html: '<p>Prova a rispondere ai commenti nelle prime ore dopo il post per inviare segnali positivi all\'algoritmo.</p>',
175
161
  },
176
162
  {
177
163
  type: 'title',
@@ -189,7 +175,7 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
189
175
  },
190
176
  {
191
177
  type: 'paragraph',
192
- html: 'Non tutte le audience valgono lo stesso. Un creatore tech o finance può chiedere tariffe molto più alte di un creatore di intrattenimento generale, a causa del maggior valore dell’utente finale.',
178
+ html: 'Non tutte le audience valgono lo stesso. Un creatore tech o finance può chiedere tariffe molto più alte di un creatore di intrattenimento generale, a causa del maggior valore dell\'utente finale.',
193
179
  },
194
180
  {
195
181
  type: 'title',
@@ -225,7 +211,7 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
225
211
  {
226
212
  type: 'card',
227
213
  title: 'TikTok',
228
- html: '<p>La terra della viralità estrema. L’algoritmo regna sui follower. ROI esplosivo a breve termine.</p><ul><li>Valuta portata massiccia</li><li>Potenziale virale assoluto</li><li>Bassi costi di produzione</li><li>Audience molto attiva</li></ul>',
214
+ html: '<p>La terra della viralità estrema. L\'algoritmo regna sui follower. ROI esplosivo a breve termine.</p><ul><li>Valuta portata massiccia</li><li>Potenziale virale assoluto</li><li>Bassi costi di produzione</li><li>Audience molto attiva</li></ul>',
229
215
  },
230
216
  ],
231
217
  },
@@ -236,12 +222,12 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
236
222
  },
237
223
  {
238
224
  type: 'paragraph',
239
- html: 'Ottieni l’intervallo di prezzo dal nostro strumento e usalo come guida. Presenta le tue metriche con sicurezza usando questo modello:',
225
+ html: 'Ottieni l\'intervallo di prezzo dal nostro strumento e usalo come guida. Presenta le tue metriche con sicurezza usando questo modello:',
240
226
  },
241
227
  {
242
228
  type: 'tip',
243
229
  title: 'Modello di negoziazione',
244
- html: '<p>Ciao [Nome Brand], grazie per il contatto. In base alle mie attuali metriche di portata (media di [X] visualizzazioni) e al mio tasso di engagement del [X]%, la mia tariffa per un’integrazione in un [Reel/TikTok] è [Prezzo €]. Questo include: scripting e produzione video, 1 link in bio per 24h, 2 Stories di amplificazione, diritti d’uso per 30 giorni.</p>',
230
+ html: '<p>Ciao [Nome Brand], grazie per il contatto. In base alle mie attuali metriche di portata (media di [X] visualizzazioni) e al mio tasso di engagement del [X]%, la mia tariffa per un\'integrazione in un [Reel/TikTok] è [Prezzo €]. Questo include: scripting e produzione video, 1 link in bio per 24h, 2 Stories di amplificazione, diritti d\'uso per 30 giorni.</p>',
245
231
  },
246
232
  {
247
233
  type: 'title',
@@ -251,9 +237,9 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
251
237
  {
252
238
  type: 'list',
253
239
  items: [
254
- '<strong>Fomenta l’interazione:</strong> Rispondi a ogni commento.',
255
- '<strong>Alza la qualità:</strong> L’audio è il 50% di un buon video.',
256
- '<strong>Specializzati:</strong> Essere "l’esperto" ti permette di chiedere di più.',
240
+ '<strong>Fomenta l\'interazione:</strong> Rispondi a ogni commento.',
241
+ '<strong>Alza la qualità:</strong> L\'audio è il 50% di un buon video.',
242
+ '<strong>Specializzati:</strong> Essere "l\'esperto" ti permette di chiedere di più.',
257
243
  '<strong>Crea un Media Kit:</strong> Documenta i tuoi successi con i dati.',
258
244
  ],
259
245
  },
@@ -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 { SocialValueCalculatorUI } from '../ui';
@@ -87,23 +88,8 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'よくある質問',
91
- faq: faqData,
92
- bibliographyTitle: '出典&市場調査',
93
- bibliography: [
94
- {
95
- name: 'Influencer Marketing Hub: 2026年インフルエンサー料金',
96
- url: 'https://influencermarketinghub.com/influencer-rates/',
97
- },
98
- {
99
- name: 'HypeAuditor: TikTok&Instagram エンゲージメントレポート',
100
- url: 'https://hypeauditor.com/free-tools/tiktok-engagement-calculator/',
101
- },
102
- {
103
- name: 'Social Blade: ソーシャルメディア統計',
104
- url: 'https://socialblade.com/',
105
- },
106
- ],
91
+ faq: faqData,
92
+ bibliography,
107
93
  howTo: howToData,
108
94
  schemas: [faqSchema, howToSchema, appSchema],
109
95
  seo: [
@@ -145,7 +131,7 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
145
131
  },
146
132
  {
147
133
  type: 'card',
148
- title: '¥2,000–¥7,000',
134
+ title: '¥2,000 to ¥7,000',
149
135
  html: '<p>価値の高いジャンルにおける平均CPM(推定)</p>',
150
136
  },
151
137
  ],
@@ -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 { SocialValueCalculatorUI } from '../ui';
@@ -87,23 +88,8 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: '자주 묻는 질문',
91
- faq: faqData,
92
- bibliographyTitle: '출처 및 시장 조사',
93
- bibliography: [
94
- {
95
- name: 'Influencer Marketing Hub: 2026년 인플루언서 단가',
96
- url: 'https://influencermarketinghub.com/influencer-rates/',
97
- },
98
- {
99
- name: 'HypeAuditor: 틱톡 및 인스타그램 참여도 리포트',
100
- url: 'https://hypeauditor.com/free-tools/tiktok-engagement-calculator/',
101
- },
102
- {
103
- name: 'Social Blade: 소셜 미디어 통계',
104
- url: 'https://socialblade.com/',
105
- },
106
- ],
91
+ faq: faqData,
92
+ bibliography,
107
93
  howTo: howToData,
108
94
  schemas: [faqSchema, howToSchema, appSchema],
109
95
  seo: [
@@ -145,7 +131,7 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
145
131
  },
146
132
  {
147
133
  type: 'card',
148
- title: '₩15,000–₩50,000',
134
+ title: '₩15,000 to ₩50,000',
149
135
  html: '<p>고부가가치 분야의 평균 CPM(추정치)</p>',
150
136
  },
151
137
  ],
@@ -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 { SocialValueCalculatorUI } from '../ui';
@@ -87,23 +88,8 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Veelgestelde Vragen',
91
- faq: faqData,
92
- bibliographyTitle: 'Bronnen & Marktstudies',
93
- bibliography: [
94
- {
95
- name: 'Influencer Marketing Hub: Influencer Rates 2026',
96
- url: 'https://influencermarketinghub.com/influencer-rates/',
97
- },
98
- {
99
- name: 'HypeAuditor: TikTok & Instagram Engagement Rapport',
100
- url: 'https://hypeauditor.com/free-tools/tiktok-engagement-calculator/',
101
- },
102
- {
103
- name: 'Social Blade: Social Media Statistieken',
104
- url: 'https://socialblade.com/',
105
- },
106
- ],
91
+ faq: faqData,
92
+ bibliography,
107
93
  howTo: howToData,
108
94
  schemas: [faqSchema, howToSchema, appSchema],
109
95
  seo: [
@@ -145,7 +131,7 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
145
131
  },
146
132
  {
147
133
  type: 'card',
148
- title: '€15–€50',
134
+ title: '€15 tot €50',
149
135
  html: '<p>Gemiddelde CPM in niches met hoge waarde (stabiel)</p>',
150
136
  },
151
137
  ],
@@ -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 { SocialValueCalculatorUI } from '../ui';
@@ -87,23 +88,8 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Często zadawane pytania',
91
- faq: faqData,
92
- bibliographyTitle: 'Źródła i badania rynku',
93
- bibliography: [
94
- {
95
- name: 'Influencer Marketing Hub: Stawki influencerów 2026',
96
- url: 'https://influencermarketinghub.com/influencer-rates/',
97
- },
98
- {
99
- name: 'HypeAuditor: Raport zaangażowania TikTok i Instagram',
100
- url: 'https://hypeauditor.com/free-tools/tiktok-engagement-calculator/',
101
- },
102
- {
103
- name: 'Social Blade: Statystyki mediów społecznościowych',
104
- url: 'https://socialblade.com/',
105
- },
106
- ],
91
+ faq: faqData,
92
+ bibliography,
107
93
  howTo: howToData,
108
94
  schemas: [faqSchema, howToSchema, appSchema],
109
95
  seo: [
@@ -145,7 +131,7 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
145
131
  },
146
132
  {
147
133
  type: 'card',
148
- title: '60zł–200zł',
134
+ title: '60zł do 200zł',
149
135
  html: '<p>Średni CPM w niszach o wysokiej wartości (stabilny)</p>',
150
136
  },
151
137
  ],
@@ -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 { SocialValueCalculatorUI } from '../ui';
@@ -87,23 +88,8 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Perguntas Frequentes',
91
- faq: faqData,
92
- bibliographyTitle: 'Fontes e Estudos de Mercado',
93
- bibliography: [
94
- {
95
- name: 'Influencer Marketing Hub: Influencer Rates 2026',
96
- url: 'https://influencermarketinghub.com/influencer-rates/',
97
- },
98
- {
99
- name: 'HypeAuditor: Relatório de Engagement TikTok e Instagram',
100
- url: 'https://hypeauditor.com/free-tools/tiktok-engagement-calculator/',
101
- },
102
- {
103
- name: 'Social Blade: Estatísticas de Redes Sociais',
104
- url: 'https://socialblade.com/',
105
- },
106
- ],
91
+ faq: faqData,
92
+ bibliography,
107
93
  howTo: howToData,
108
94
  schemas: [faqSchema, howToSchema, appSchema],
109
95
  seo: [
@@ -145,7 +131,7 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
145
131
  },
146
132
  {
147
133
  type: 'card',
148
- title: '15€–50€',
134
+ title: '15€ a 50€',
149
135
  html: '<p>CPM médio em nichos de alto valor (estável)</p>',
150
136
  },
151
137
  ],
@@ -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 { SocialValueCalculatorUI } from '../ui';
@@ -21,7 +22,7 @@ const faqData = [
21
22
  {
22
23
  question: 'Какой уровень вовлеченности считается хорошим для повышения цены?',
23
24
  answer:
24
- 'Как правило, вовлеченность выше 3% считается здоровой. Аккаунты с вовлеченностью более 10% считаются «премиум-профилями» и могут запрашивать значительную надбавку.',
25
+ 'Как правило, вовлеченность выше 3% считается здоровой. Аккаунты с вовлеченностью более 10% считаются \"премиум-профилями\" и могут запрашивать значительную надбавку.',
25
26
  },
26
27
  {
27
28
  question: 'Ниша действительно так сильно влияет на цену?',
@@ -33,7 +34,7 @@ const faqData = [
33
34
  const howToData = [
34
35
  {
35
36
  name: 'Выберите платформу',
36
- text: 'Выберите, для какой соцсети вы хотите рассчитать стоимость — TikTok или Instagram.',
37
+ text: 'Выберите, для какой соцсети вы хотите рассчитать стоимость - TikTok или Instagram.',
37
38
  },
38
39
  {
39
40
  name: 'Введите показатели',
@@ -87,23 +88,8 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Часто задаваемые вопросы',
91
- faq: faqData,
92
- bibliographyTitle: 'Источники и исследования рынка',
93
- bibliography: [
94
- {
95
- name: 'Influencer Marketing Hub: ставки инфлюенсеров 2026',
96
- url: 'https://influencermarketinghub.com/influencer-rates/',
97
- },
98
- {
99
- name: 'HypeAuditor: отчет по вовлеченности в TikTok и Instagram',
100
- url: 'https://hypeauditor.com/free-tools/tiktok-engagement-calculator/',
101
- },
102
- {
103
- name: 'Social Blade: статистика социальных сетей',
104
- url: 'https://socialblade.com/',
105
- },
106
- ],
91
+ faq: faqData,
92
+ bibliography,
107
93
  howTo: howToData,
108
94
  schemas: [faqSchema, howToSchema, appSchema],
109
95
  seo: [
@@ -145,7 +131,7 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
145
131
  },
146
132
  {
147
133
  type: 'card',
148
- title: '1500–5000₽',
134
+ title: '1500 до 5000₽',
149
135
  html: '<p>Средний CPM в ценных нишах (стабильный)</p>',
150
136
  },
151
137
  ],
@@ -157,7 +143,7 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
157
143
  },
158
144
  {
159
145
  type: 'paragraph',
160
- html: 'В отличие от того, что считалось раньше, количество подписчиков — это лишь верхушка айсберга. Вот основные компоненты:',
146
+ html: 'В отличие от того, что считалось раньше, количество подписчиков - это лишь верхушка айсберга. Вот основные компоненты:',
161
147
  },
162
148
  {
163
149
  type: 'title',
@@ -166,7 +152,7 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
166
152
  },
167
153
  {
168
154
  type: 'paragraph',
169
- html: 'Это ключевой показатель. Он измеряет, какой процент вашего сообщества активно взаимодействует с вашим контентом. Небольшой аккаунт с высокой активностью гораздо ценнее, чем огромный «мертвый» профиль.',
155
+ html: 'Это ключевой показатель. Он измеряет, какой процент вашего сообщества активно взаимодействует с вашим контентом. Небольшой аккаунт с высокой активностью гораздо ценнее, чем огромный \"мертвый\" профиль.',
170
156
  },
171
157
  {
172
158
  type: 'tip',
@@ -212,7 +198,7 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
212
198
  },
213
199
  {
214
200
  type: 'paragraph',
215
- html: 'Хотя оба сервиса используют вертикальное видео, их модели монетизации различаются. Instagram — это брендинг, TikTok — это чистая эффективность (перформанс).',
201
+ html: 'Хотя оба сервиса используют вертикальное видео, их модели монетизации различаются. Instagram - это брендинг, TikTok - это чистая эффективность (перформанс).',
216
202
  },
217
203
  {
218
204
  type: 'grid',
@@ -252,7 +238,7 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
252
238
  type: 'list',
253
239
  items: [
254
240
  '<strong>Стимулируйте активность:</strong> отвечайте на каждый комментарий.',
255
- '<strong>Повышайте качество:</strong> звук — это 50% успеха хорошего видео.',
241
+ '<strong>Повышайте качество:</strong> звук - это 50% успеха хорошего видео.',
256
242
  '<strong>Спецциализируйтесь:</strong> статус эксперта позволяет брать больше.',
257
243
  '<strong>Создайте медиакит:</strong> фиксируйте свои успехи в цифрах.',
258
244
  ],
@@ -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 { SocialValueCalculatorUI } from '../ui';
@@ -87,23 +88,8 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Vanliga frågor',
91
- faq: faqData,
92
- bibliographyTitle: 'Källor & marknadsstudier',
93
- bibliography: [
94
- {
95
- name: 'Influencer Marketing Hub: Influencer Rates 2026',
96
- url: 'https://influencermarketinghub.com/influencer-rates/',
97
- },
98
- {
99
- name: 'HypeAuditor: TikTok & Instagram Engagement Report',
100
- url: 'https://hypeauditor.com/free-tools/tiktok-engagement-calculator/',
101
- },
102
- {
103
- name: 'Social Blade: Social Media Statistik',
104
- url: 'https://socialblade.com/',
105
- },
106
- ],
91
+ faq: faqData,
92
+ bibliography,
107
93
  howTo: howToData,
108
94
  schemas: [faqSchema, howToSchema, appSchema],
109
95
  seo: [
@@ -145,7 +131,7 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
145
131
  },
146
132
  {
147
133
  type: 'card',
148
- title: '150kr–500kr',
134
+ title: '150kr till 500kr',
149
135
  html: '<p>Genomsnittlig CPM i nischer med högt värde (stabilt)</p>',
150
136
  },
151
137
  ],
@@ -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 { SocialValueCalculatorUI } from '../ui';
@@ -87,23 +88,8 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Sıkça Sorulan Sorular',
91
- faq: faqData,
92
- bibliographyTitle: 'Kaynaklar ve Piyasa Araştırmaları',
93
- bibliography: [
94
- {
95
- name: 'Influencer Marketing Hub: Influencer Ücretleri 2026',
96
- url: 'https://influencermarketinghub.com/influencer-rates/',
97
- },
98
- {
99
- name: 'HypeAuditor: TikTok ve Instagram Etkileşim Raporu',
100
- url: 'https://hypeauditor.com/free-tools/tiktok-engagement-calculator/',
101
- },
102
- {
103
- name: 'Social Blade: Sosyal Medya İstatistikleri',
104
- url: 'https://socialblade.com/',
105
- },
106
- ],
91
+ faq: faqData,
92
+ bibliography,
107
93
  howTo: howToData,
108
94
  schemas: [faqSchema, howToSchema, appSchema],
109
95
  seo: [
@@ -145,7 +131,7 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
145
131
  },
146
132
  {
147
133
  type: 'card',
148
- title: '300₺–1000₺',
134
+ title: '300₺ ile 1000₺',
149
135
  html: '<p>Yüksek değerli nişlerde ortalama CPM (tahmini)</p>',
150
136
  },
151
137
  ],
@@ -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 { SocialValueCalculatorUI } from '../ui';
@@ -21,7 +22,7 @@ const faqData = [
21
22
  {
22
23
  question: '什么样的互动率可以收更高的费用?',
23
24
  answer:
24
- '通常,3% 以上的互动率被认为是健康的。互动率超过 10% 的账号被视为“优质账号”,可以收取显著的溢价。',
25
+ '通常,3% 以上的互动率被认为是健康的。互动率超过 10% 的账号被视为\"优质账号\",可以收取显著的溢价。',
25
26
  },
26
27
  {
27
28
  question: '领域(Niche)真的对价格影响那么大吗?',
@@ -87,23 +88,8 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: '常见问题',
91
- faq: faqData,
92
- bibliographyTitle: '来源与市场研究',
93
- bibliography: [
94
- {
95
- name: 'Influencer Marketing Hub:2026 红人定价',
96
- url: 'https://influencermarketinghub.com/influencer-rates/',
97
- },
98
- {
99
- name: 'HypeAuditor:TikTok 和 Instagram 互动报告',
100
- url: 'https://hypeauditor.com/free-tools/tiktok-engagement-calculator/',
101
- },
102
- {
103
- name: 'Social Blade:社交媒体统计数据',
104
- url: 'https://socialblade.com/',
105
- },
106
- ],
91
+ faq: faqData,
92
+ bibliography,
107
93
  howTo: howToData,
108
94
  schemas: [faqSchema, howToSchema, appSchema],
109
95
  seo: [
@@ -145,7 +131,7 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
145
131
  },
146
132
  {
147
133
  type: 'card',
148
- title: '¥100–¥400',
134
+ title: '¥100至¥400',
149
135
  html: '<p>高价值领域的平均 CPM(预计)</p>',
150
136
  },
151
137
  ],
@@ -166,7 +152,7 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
166
152
  },
167
153
  {
168
154
  type: 'paragraph',
169
- html: '这是关键指标。它衡量您的社区中有多大比例的人在积极与您的内容互动。一个互动量高的小账号远比一个毫无反应的“僵尸”大号更有价值。',
155
+ html: '这是关键指标。它衡量您的社区中有多大比例的人在积极与您的内容互动。一个互动量高的小账号远比一个毫无反应的\"僵尸\"大号更有价值。',
170
156
  },
171
157
  {
172
158
  type: 'tip',
@@ -253,7 +239,7 @@ export const content: ToolLocaleContent<SocialValueCalculatorUI> = {
253
239
  items: [
254
240
  '<strong>鼓励互动:</strong> 回复每一条评论。',
255
241
  '<strong>提高质量:</strong> 音频占好视频成功因素的 50%。',
256
- '<strong>专业化:</strong> 成为“专家”能让您收更多钱。',
242
+ '<strong>专业化:</strong> 成为\"专家\"能让您收更多钱。',
257
243
  '<strong>制作媒体手册 (Media Kit):</strong> 用数据记录您的成功案例。',
258
244
  ],
259
245
  },
@@ -11,4 +11,5 @@ const { locale = 'es' } = Astro.props;
11
11
  const content = await socialValueCalculator.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 { tinderPhotoOptimizer } 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 tinderPhotoOptimizer.i18n[locale]?.();
3
+ import { bibliography } from './bibliography';
12
4
  ---
13
5
 
14
- {content && <SharedBibliography links={content.bibliography} />}
6
+ <SharedBibliography links={bibliography} />
@@ -0,0 +1,12 @@
1
+ import type { BibliographyEntry } from '../../types';
2
+
3
+ export const bibliography: BibliographyEntry[] = [
4
+ {
5
+ name: 'face-api.js: JavaScript Face Recognition in the Browser',
6
+ url: 'https://github.com/justadudewhohacks/face-api.js',
7
+ },
8
+ {
9
+ name: 'MDN Web Docs: Canvas API',
10
+ url: 'https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API',
11
+ },
12
+ ];