@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
@@ -0,0 +1,94 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { ALL_TOOLS } from '../tools';
3
+
4
+ type ScriptLocale = keyof typeof SCRIPT_RULES;
5
+
6
+ const SCRIPT_RULES = {
7
+ ja: {
8
+ language: 'Japanese',
9
+ scriptName: 'kana/kanji',
10
+ scriptCharacters: /[\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Han}]/gu,
11
+ minScriptRatio: 0.45,
12
+ },
13
+ ko: {
14
+ language: 'Korean',
15
+ scriptName: 'hangul',
16
+ scriptCharacters: /\p{Script=Hangul}/gu,
17
+ minScriptRatio: 0.55,
18
+ },
19
+ ru: {
20
+ language: 'Russian',
21
+ scriptName: 'cyrillic',
22
+ scriptCharacters: /\p{Script=Cyrillic}/gu,
23
+ minScriptRatio: 0.65,
24
+ },
25
+ zh: {
26
+ language: 'Chinese',
27
+ scriptName: 'han',
28
+ scriptCharacters: /\p{Script=Han}/gu,
29
+ minScriptRatio: 0.45,
30
+ },
31
+ } as const;
32
+
33
+ const LETTERS = /\p{L}/gu;
34
+ const TRANSLATABLE_KEYS = ['title', 'description', 'ui', 'seo', 'faq', 'howTo'] as const;
35
+
36
+ function collectStrings(value: unknown): string[] {
37
+ if (typeof value === 'string') return [value];
38
+ if (!value || typeof value !== 'object') return [];
39
+ if (Array.isArray(value)) return value.flatMap(collectStrings);
40
+ return Object.values(value).flatMap(collectStrings);
41
+ }
42
+
43
+ function normalizeText(value: unknown): string {
44
+ return collectStrings(value).join(' ').normalize('NFC');
45
+ }
46
+
47
+ function translatableContent(content: Record<string, unknown>) {
48
+ return TRANSLATABLE_KEYS.map((key) => content[key]);
49
+ }
50
+
51
+ function letterCount(text: string): number {
52
+ return text.match(LETTERS)?.length ?? 0;
53
+ }
54
+
55
+ function scriptCount(text: string, locale: ScriptLocale): number {
56
+ return text.match(SCRIPT_RULES[locale].scriptCharacters)?.length ?? 0;
57
+ }
58
+
59
+ function scriptRatio(text: string, locale: ScriptLocale): number {
60
+ const letters = letterCount(text);
61
+ if (letters === 0) return 0;
62
+ return scriptCount(text, locale) / letters;
63
+ }
64
+
65
+ describe('Native script density validation', () => {
66
+ ALL_TOOLS.forEach((tool) => {
67
+ describe(`Tool: ${tool.entry.id}`, () => {
68
+ Object.keys(SCRIPT_RULES).forEach((locale) => {
69
+ it(`${locale} keeps most translated text in its native script`, async () => {
70
+ const typedLocale = locale as ScriptLocale;
71
+ const loader = tool.entry.i18n[typedLocale];
72
+ if (!loader) return;
73
+
74
+ const content = await loader();
75
+ const rule = SCRIPT_RULES[typedLocale];
76
+ const text = normalizeText(translatableContent(content as Record<string, unknown>));
77
+ const letters = letterCount(text);
78
+ const matches = scriptCount(text, typedLocale);
79
+ const ratio = scriptRatio(text, typedLocale);
80
+
81
+ expect(
82
+ ratio,
83
+ [
84
+ `Possible broken translation detected in ${tool.entry.id}/${typedLocale} (${rule.language}).`,
85
+ `The text has ${matches} ${rule.scriptName} characters out of ${letters} analyzed letters (${(ratio * 100).toFixed(1)}%).`,
86
+ `Most translatable content should be written in ${rule.scriptName} script.`,
87
+ 'Non-translatable fields such as slug, bibliography, and schemas are ignored to avoid false positives.',
88
+ ].join(' '),
89
+ ).toBeGreaterThanOrEqual(rule.minScriptRatio);
90
+ });
91
+ });
92
+ });
93
+ });
94
+ });
@@ -0,0 +1,56 @@
1
+ import type { ToolDefinition } from '../types';
2
+
3
+ export interface ToolExportValidationResult {
4
+ passed: boolean;
5
+ failures: string[];
6
+ }
7
+
8
+ function validateComponentType(
9
+ toolId: string,
10
+ componentName: string,
11
+ component: unknown,
12
+ failures: string[],
13
+ ): void {
14
+ if (typeof component !== 'function') {
15
+ failures.push(`${toolId}: ${componentName} is not a function (${typeof component})`);
16
+ }
17
+ }
18
+
19
+ async function validateComponentExecution(
20
+ toolId: string,
21
+ componentName: string,
22
+ fn: () => Promise<unknown>,
23
+ failures: string[],
24
+ ): Promise<void> {
25
+ try {
26
+ const result = await fn();
27
+ if (!result || typeof result !== 'object') {
28
+ failures.push(`${toolId}: ${componentName} import returned invalid result`);
29
+ }
30
+ } catch (error) {
31
+ failures.push(`${toolId}: ${componentName} execution error - ${error instanceof Error ? error.message : 'unknown'}`);
32
+ }
33
+ }
34
+
35
+ export async function validateToolExports(tools: ToolDefinition[]): Promise<ToolExportValidationResult> {
36
+ const failures: string[] = [];
37
+
38
+ for (const tool of tools) {
39
+ validateComponentType(tool.entry.id, 'Component', tool.Component, failures);
40
+ validateComponentType(tool.entry.id, 'SEOComponent', tool.SEOComponent, failures);
41
+ validateComponentType(tool.entry.id, 'BibliographyComponent', tool.BibliographyComponent, failures);
42
+
43
+ const componentFn = tool.Component as () => Promise<unknown>;
44
+ const seoFn = tool.SEOComponent as () => Promise<unknown>;
45
+ const bibFn = tool.BibliographyComponent as () => Promise<unknown>;
46
+
47
+ await validateComponentExecution(tool.entry.id, 'Component', componentFn, failures);
48
+ await validateComponentExecution(tool.entry.id, 'SEOComponent', seoFn, failures);
49
+ await validateComponentExecution(tool.entry.id, 'BibliographyComponent', bibFn, failures);
50
+ }
51
+
52
+ return {
53
+ passed: failures.length === 0,
54
+ failures,
55
+ };
56
+ }
@@ -0,0 +1,34 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { ALL_TOOLS } from '../tools';
3
+ import { validateToolExports } from './shared-test-helpers';
4
+
5
+ describe('Tool Exports Pattern Validation', () => {
6
+ describe('Component Exports Format', () => {
7
+ ALL_TOOLS.forEach((tool) => {
8
+ it(`${tool.entry.id}: Component should be a lazy-loaded function`, () => {
9
+ expect(typeof tool.Component).toBe('function');
10
+ expect(tool.Component).toBeInstanceOf(Function);
11
+ });
12
+
13
+ it(`${tool.entry.id}: SEOComponent should be a lazy-loaded function`, () => {
14
+ expect(typeof tool.SEOComponent).toBe('function');
15
+ expect(tool.SEOComponent).toBeInstanceOf(Function);
16
+ });
17
+
18
+ it(`${tool.entry.id}: BibliographyComponent should be a lazy-loaded function`, () => {
19
+ expect(typeof tool.BibliographyComponent).toBe('function');
20
+ expect(tool.BibliographyComponent).toBeInstanceOf(Function);
21
+ });
22
+ });
23
+ });
24
+
25
+ describe('Dynamic Import Validation', () => {
26
+ it('all tools must have functional dynamic imports', async () => {
27
+ const result = await validateToolExports(ALL_TOOLS);
28
+ if (!result.passed) {
29
+ throw new Error(`Tool export validation failed:\n${result.failures.join('\n')}`);
30
+ }
31
+ expect(result.passed).toBe(true);
32
+ });
33
+ });
34
+ });
@@ -1,14 +1,6 @@
1
1
  ---
2
2
  import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
3
- import { redditFormatter } 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 redditFormatter.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: 'Reddit Help: Formatting text in posts and comments',
6
+ url: 'https://support.reddithelp.com/hc/en-us/articles/360043033952-Formatting-text-in-posts-and-comments',
7
+ },
8
+ {
9
+ name: 'Reddit Markdown guide',
10
+ url: 'https://www.reddit.com/wiki/markdown/',
11
+ },
12
+ ];
@@ -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: 'Häufig gestellte Fragen',
91
- faq: faqData,
92
- bibliographyTitle: 'Referenzen',
93
- bibliography: [
94
- {
95
- name: 'Reddit Hilfe: Text in Beiträgen und Kommentaren formatieren',
96
- url: 'https://support.reddithelp.com/hc/en-us/articles/360043033952-Formatting-text-in-posts-and-comments',
97
- },
98
- {
99
- name: 'Reddit Markdown Leitfaden',
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';
@@ -87,19 +88,8 @@ export const content: ToolLocaleContent<RedditFormatterUI> = {
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: 'Reddit Help: Formatting text in posts and comments',
96
- url: 'https://support.reddithelp.com/hc/en-us/articles/360043033952-Formatting-text-in-posts-and-comments',
97
- },
98
- {
99
- name: 'Reddit Markdown guide',
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';
@@ -87,19 +88,8 @@ export const content: ToolLocaleContent<RedditFormatterUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Preguntas Frecuentes',
91
- faq: faqData,
92
- bibliographyTitle: 'Referencias',
93
- bibliography: [
94
- {
95
- name: 'Reddit Help: Formatting text in posts and comments',
96
- url: 'https://support.reddithelp.com/hc/en-us/articles/360043033952-Formatting-text-in-posts-and-comments',
97
- },
98
- {
99
- name: 'Reddit Markdown guide',
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,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 { RedditFormatterUI } from '../ui';
4
5
 
5
6
  const slug = 'formateur-reddit';
6
- const title = "Formateur Reddit : Nettoyeur et Adaptateur de Texte";
7
+ const title = "Formateur Reddit: Nettoyeur et Adaptateur de Texte";
7
8
  const description =
8
9
  "Nettoyeur avancé de texte pour publier sur Reddit. Corrige les sauts de ligne manquants, supprime les espaces multiples et les caractères cachés qui cassent le Markdown.";
9
10
 
@@ -37,7 +38,7 @@ const howToData = [
37
38
  },
38
39
  {
39
40
  name: "Choisissez les options",
40
- text: "Activez ou désactivez les options selon vos besoins : corriger les paragraphes, supprimer les espaces ou nettoyer les caractères cachés.",
41
+ text: "Activez ou désactivez les options selon vos besoins: corriger les paragraphes, supprimer les espaces ou nettoyer les caractères cachés.",
41
42
  },
42
43
  {
43
44
  name: "Vérifiez le résultat",
@@ -87,19 +88,8 @@ export const content: ToolLocaleContent<RedditFormatterUI> = {
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: 'Reddit Help: Formatting text in posts and comments',
96
- url: 'https://support.reddithelp.com/hc/en-us/articles/360043033952-Formatting-text-in-posts-and-comments',
97
- },
98
- {
99
- name: 'Reddit Markdown guide',
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';
@@ -87,19 +88,8 @@ export const content: ToolLocaleContent<RedditFormatterUI> = {
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: 'Bantuan Reddit: Memformat teks dalam postingan dan komentar',
96
- url: 'https://support.reddithelp.com/hc/en-us/articles/360043033952-Formatting-text-in-posts-and-comments',
97
- },
98
- {
99
- name: 'Panduan Markdown Reddit',
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';
@@ -87,19 +88,8 @@ export const content: ToolLocaleContent<RedditFormatterUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Domande Frequenti',
91
- faq: faqData,
92
- bibliographyTitle: 'Riferimenti',
93
- bibliography: [
94
- {
95
- name: 'Aiuto di Reddit: Formattazione del testo nei post e nei commenti',
96
- url: 'https://support.reddithelp.com/hc/en-us/articles/360043033952-Formatting-text-in-posts-and-comments',
97
- },
98
- {
99
- name: 'Guida al Markdown di Reddit',
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';
@@ -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: [
@@ -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: '자주 묻는 질문',
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 마크다운 가이드',
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';
@@ -87,19 +88,8 @@ export const content: ToolLocaleContent<RedditFormatterUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Veelgestelde Vragen',
91
- faq: faqData,
92
- bibliographyTitle: 'Referenties',
93
- bibliography: [
94
- {
95
- name: 'Reddit Help: Tekst opmaken in berichten en reacties',
96
- url: 'https://support.reddithelp.com/hc/en-us/articles/360043033952-Formatting-text-in-posts-and-comments',
97
- },
98
- {
99
- name: 'Reddit Markdown gids',
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: 'Skopiuj i opublikuj',
48
- text: 'Kliknij „Kopiuj tekst” i wklej go bezpośrednio na Reddit lub dowolne forum.',
49
+ text: 'Kliknij \"Kopiuj tekst\" i wklej go bezpośrednio na Reddit lub dowolne forum.',
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: 'Często Zadawane Pytania',
91
- faq: faqData,
92
- bibliographyTitle: 'Referencje',
93
- bibliography: [
94
- {
95
- name: 'Pomoc Reddit: Formatowanie tekstu w postach i komentarzach',
96
- url: 'https://support.reddithelp.com/hc/en-us/articles/360043033952-Formatting-text-in-posts-and-comments',
97
- },
98
- {
99
- name: 'Przewodnik po Markdown na Reddit',
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: [
@@ -123,7 +113,7 @@ export const content: ToolLocaleContent<RedditFormatterUI> = {
123
113
  },
124
114
  {
125
115
  type: 'paragraph',
126
- html: 'Po drugie, narzędzie usuwa niewidoczne znaki i wielokrotne spacje. Podczas kopiowania tekstu ze stron internetowych często „przeciąga się” znaki o zerowej szerokości, które psują formatowanie lub powodują dziwne zachowanie na forach. Czyścik usuwa te intruzywne elementy i normalizuje powtarzające się spacje do pojedynczej, czystej spacji. Opcjonalnie możesz usunąć wszystkie surowe hiperłącza ze swojej treści, aby opublikować całkowicie neutralny tekst.',
116
+ html: 'Po drugie, narzędzie usuwa niewidoczne znaki i wielokrotne spacje. Podczas kopiowania tekstu ze stron internetowych często \"przeciąga się\" znaki o zerowej szerokości, które psują formatowanie lub powodują dziwne zachowanie na forach. Czyścik usuwa te intruzywne elementy i normalizuje powtarzające się spacje do pojedynczej, czystej spacji. Opcjonalnie możesz usunąć wszystkie surowe hiperłącza ze swojej treści, aby opublikować całkowicie neutralny tekst.',
127
117
  },
128
118
  {
129
119
  type: 'title',
@@ -146,7 +136,7 @@ export const content: ToolLocaleContent<RedditFormatterUI> = {
146
136
  },
147
137
  {
148
138
  type: 'paragraph',
149
- html: 'Aplikacje takie jak Microsoft Word czy Google Docs dodają niewidoczną warstwę bogatego formatowania do tekstu. Gdy kopiujesz i wklejasz tę treść bezpośrednio do podstawowego edytora lub trybu Markdown na Reddit, bogate formatowanie znika, a to, co pozostaje, to często bezkształtna mieszanina. Reddit używa dość rygorystycznego wariantu Markdown. Jeśli nie znasz składni Reddit lub po prostu chcesz usprawnić proces przenoszenia esejów lub opowiadań na forum, wcześniejsze wyczyszczenie tekstu tutaj zapobiega otrzymywaniu przez Twój post „downvote’ów” tylko dlatego, że nie da się go wygodnie przeczytać.',
139
+ html: 'Aplikacje takie jak Microsoft Word czy Google Docs dodają niewidoczną warstwę bogatego formatowania do tekstu. Gdy kopiujesz i wklejasz tę treść bezpośrednio do podstawowego edytora lub trybu Markdown na Reddit, bogate formatowanie znika, a to, co pozostaje, to często bezkształtna mieszanina. Reddit używa dość rygorystycznego wariantu Markdown. Jeśli nie znasz składni Reddit lub po prostu chcesz usprawnić proces przenoszenia esejów lub opowiadań na forum, wcześniejsze wyczyszczenie tekstu tutaj zapobiega otrzymywaniu przez Twój post \"downvote\'ów\" tylko dlatego, że nie da się go wygodnie przeczytać.',
150
140
  },
151
141
  {
152
142
  type: 'title',
@@ -174,7 +164,7 @@ export const content: ToolLocaleContent<RedditFormatterUI> = {
174
164
  },
175
165
  {
176
166
  type: 'paragraph',
177
- html: 'Znalezienie właściwych odpowiedzi na temat interakcji z zasadami redakcyjnymi Reddit nie zawsze jest oczywiste. Sprawdź sekcję FAQ, w której omawiamy główne pytania dotyczące poprawnych formatów i sposobów unikania kar za potężne „ściany tekstu”.',
167
+ html: 'Znalezienie właściwych odpowiedzi na temat interakcji z zasadami redakcyjnymi Reddit nie zawsze jest oczywiste. Sprawdź sekcję FAQ, w której omawiamy główne pytania dotyczące poprawnych formatów i sposobów unikania kar za potężne \"ściany tekstu\".',
178
168
  },
179
169
  ],
180
170
  ui: {
@@ -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: 'Perguntas Frequentes',
91
- faq: faqData,
92
- bibliographyTitle: 'Referências',
93
- bibliography: [
94
- {
95
- name: 'Ajuda do Reddit: Formatação de texto em posts e comentários',
96
- url: 'https://support.reddithelp.com/hc/en-us/articles/360043033952-Formatting-text-in-posts-and-comments',
97
- },
98
- {
99
- name: 'Guia de Markdown do Reddit',
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: 'Руководство по Markdown на Reddit',
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: [
@@ -174,7 +164,7 @@ export const content: ToolLocaleContent<RedditFormatterUI> = {
174
164
  },
175
165
  {
176
166
  type: 'paragraph',
177
- html: 'Найти правильные ответы на вопросы о том, как взаимодействовать с правилами редактирования Reddit, не всегда просто. Ознакомьтесь с разделом часто задаваемых вопросов, где мы рассматриваем основные вопросы о допустимых форматах и о том, как избежать штрафов за огромные «стены текста».',
167
+ html: 'Найти правильные ответы на вопросы о том, как взаимодействовать с правилами редактирования Reddit, не всегда просто. Ознакомьтесь с разделом часто задаваемых вопросов, где мы рассматриваем основные вопросы о допустимых форматах и о том, как избежать штрафов за огромные \"стены текста\".',
178
168
  },
179
169
  ],
180
170
  ui: {
@@ -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: 'Vanliga frågor',
91
- faq: faqData,
92
- bibliographyTitle: 'Referenser',
93
- bibliography: [
94
- {
95
- name: 'Reddit Help: Formatera text i inlägg och kommentarer',
96
- url: 'https://support.reddithelp.com/hc/en-us/articles/360043033952-Formatting-text-in-posts-and-comments',
97
- },
98
- {
99
- name: 'Reddit Markdown-guide',
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: [