@jjlmoya/utils-developer 1.30.0 → 1.32.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.
- package/package.json +70 -70
- package/src/category/i18n/en.ts +1 -1
- package/src/category/i18n/es.ts +1 -1
- package/src/category/index.ts +2 -1
- package/src/category/seo.astro +1 -1
- package/src/components/PreviewNavSidebar.astro +1 -1
- package/src/components/PreviewToolbar.astro +1 -1
- package/src/data.ts +1 -1
- package/src/entries.ts +2 -0
- package/src/env.d.ts +1 -1
- package/src/index.ts +1 -0
- package/src/layouts/PreviewLayout.astro +1 -1
- package/src/pages/[locale]/[slug].astro +161 -161
- package/src/pages/index.astro +1 -1
- package/src/tests/bibliography_wellformed_export.test.ts +46 -0
- package/src/tests/category_seo_quality.test.ts +76 -0
- package/src/tests/entry_contract.test.ts +8 -2
- package/src/tests/faq_count.test.ts +1 -1
- package/src/tests/i18n_coverage.test.ts +2 -6
- package/src/tests/inverted_punctuation.test.ts +113 -113
- package/src/tests/locale_completeness.test.ts +1 -1
- package/src/tests/mocks/astro_mock.js +1 -1
- package/src/tests/no_h1_in_components.test.ts +1 -1
- package/src/tests/promote_this_website_i18n.test.ts +33 -0
- package/src/tests/seo_translation_completeness.test.ts +69 -0
- package/src/tests/seo_wellformed_export.test.ts +65 -0
- package/src/tests/slug_language_code_format.test.ts +25 -25
- package/src/tests/slug_uniqueness.test.ts +86 -86
- package/src/tests/tool_validation.test.ts +16 -16
- package/src/tool/aspectRatio/i18n/de.ts +164 -164
- package/src/tool/aspectRatio/i18n/ja.ts +1 -1
- package/src/tool/aspectRatio/i18n/ko.ts +1 -1
- package/src/tool/aspectRatio/i18n/pl.ts +164 -164
- package/src/tool/aspectRatio/i18n/ru.ts +164 -164
- package/src/tool/aspectRatio/i18n/zh.ts +165 -165
- package/src/tool/aspectRatio/seo.astro +15 -15
- package/src/tool/calculadoraTiempoDatos/i18n/de.ts +143 -143
- package/src/tool/calculadoraTiempoDatos/i18n/ja.ts +1 -1
- package/src/tool/calculadoraTiempoDatos/i18n/ko.ts +1 -1
- package/src/tool/calculadoraTiempoDatos/i18n/pl.ts +143 -143
- package/src/tool/calculadoraTiempoDatos/i18n/ru.ts +144 -144
- package/src/tool/calculadoraTiempoDatos/i18n/sv.ts +143 -143
- package/src/tool/calculadoraTiempoDatos/i18n/zh.ts +144 -144
- package/src/tool/calculadoraTiempoDatos/seo.astro +15 -15
- package/src/tool/colorConverter/i18n/de.ts +120 -120
- package/src/tool/colorConverter/i18n/ja.ts +1 -1
- package/src/tool/colorConverter/i18n/ko.ts +1 -1
- package/src/tool/colorConverter/i18n/ru.ts +120 -120
- package/src/tool/colorConverter/i18n/zh.ts +1 -1
- package/src/tool/colorConverter/seo.astro +15 -15
- package/src/tool/conversorExcelCsvHtml/i18n/ja.ts +1 -1
- package/src/tool/conversorExcelCsvHtml/i18n/ko.ts +1 -1
- package/src/tool/conversorExcelCsvHtml/i18n/pl.ts +124 -124
- package/src/tool/conversorExcelCsvHtml/i18n/ru.ts +124 -124
- package/src/tool/conversorExcelCsvHtml/i18n/zh.ts +125 -125
- package/src/tool/conversorExcelCsvHtml/seo.astro +15 -15
- package/src/tool/cronGenerator/i18n/ja.ts +1 -1
- package/src/tool/cronGenerator/i18n/ko.ts +1 -1
- package/src/tool/cronGenerator/i18n/zh.ts +183 -183
- package/src/tool/cronGenerator/seo.astro +15 -15
- package/src/tool/cssSpecificityCalculator/i18n/ja.ts +1 -1
- package/src/tool/cssSpecificityCalculator/i18n/ko.ts +1 -1
- package/src/tool/cssSpecificityCalculator/i18n/zh.ts +1 -1
- package/src/tool/cssSpecificityCalculator/seo.astro +15 -15
- package/src/tool/cssToInlineConverter/i18n/ja.ts +1 -1
- package/src/tool/cssToInlineConverter/i18n/ko.ts +1 -1
- package/src/tool/cssToInlineConverter/i18n/zh.ts +1 -1
- package/src/tool/cssToInlineConverter/seo.astro +15 -15
- package/src/tool/dualOsIconPreview/assets/day-check.webp +0 -0
- package/src/tool/dualOsIconPreview/assets/fast-task.webp +0 -0
- package/src/tool/dualOsIconPreview/assets/fortune-cookie.webp +0 -0
- package/src/tool/dualOsIconPreview/assets/lexi-crash.webp +0 -0
- package/src/tool/dualOsIconPreview/assets/pizzametrics.webp +0 -0
- package/src/tool/dualOsIconPreview/assets/sauce-lab.webp +0 -0
- package/src/tool/dualOsIconPreview/assets/vesp.webp +0 -0
- package/src/tool/dualOsIconPreview/bibliography.astro +6 -0
- package/src/tool/dualOsIconPreview/bibliography.ts +7 -0
- package/src/tool/dualOsIconPreview/component.astro +117 -0
- package/src/tool/dualOsIconPreview/controller.ts +157 -0
- package/src/tool/dualOsIconPreview/dom-views.ts +82 -0
- package/src/tool/dualOsIconPreview/dual-ios-android-app-icon-preview.css +861 -0
- package/src/tool/dualOsIconPreview/entry.ts +31 -0
- package/src/tool/dualOsIconPreview/evaluator.ts +20 -0
- package/src/tool/dualOsIconPreview/i18n/de.ts +56 -0
- package/src/tool/dualOsIconPreview/i18n/en.ts +46 -0
- package/src/tool/dualOsIconPreview/i18n/es.ts +56 -0
- package/src/tool/dualOsIconPreview/i18n/fr.ts +56 -0
- package/src/tool/dualOsIconPreview/i18n/id.ts +56 -0
- package/src/tool/dualOsIconPreview/i18n/it.ts +56 -0
- package/src/tool/dualOsIconPreview/i18n/ja.ts +56 -0
- package/src/tool/dualOsIconPreview/i18n/ko.ts +56 -0
- package/src/tool/dualOsIconPreview/i18n/nl.ts +56 -0
- package/src/tool/dualOsIconPreview/i18n/pl.ts +56 -0
- package/src/tool/dualOsIconPreview/i18n/pt.ts +56 -0
- package/src/tool/dualOsIconPreview/i18n/ru.ts +56 -0
- package/src/tool/dualOsIconPreview/i18n/sv.ts +56 -0
- package/src/tool/dualOsIconPreview/i18n/tr.ts +43 -0
- package/src/tool/dualOsIconPreview/i18n/zh.ts +43 -0
- package/src/tool/dualOsIconPreview/index.ts +11 -0
- package/src/tool/dualOsIconPreview/logic.test.ts +63 -0
- package/src/tool/dualOsIconPreview/logic.ts +135 -0
- package/src/tool/dualOsIconPreview/seo.astro +15 -0
- package/src/tool/dualOsIconPreview/storage.ts +18 -0
- package/src/tool/dualOsIconPreview/ui.ts +52 -0
- package/src/tool/duplicateCssRemover/i18n/ja.ts +1 -1
- package/src/tool/duplicateCssRemover/i18n/ko.ts +1 -1
- package/src/tool/duplicateCssRemover/i18n/zh.ts +1 -1
- package/src/tool/duplicateCssRemover/seo.astro +15 -15
- package/src/tool/generadorSecurityTxt/i18n/ja.ts +1 -1
- package/src/tool/generadorSecurityTxt/i18n/ko.ts +1 -1
- package/src/tool/generadorSecurityTxt/i18n/zh.ts +1 -1
- package/src/tool/generadorSecurityTxt/seo.astro +15 -15
- package/src/tool/hashGenerator/i18n/ja.ts +1 -1
- package/src/tool/hashGenerator/i18n/ko.ts +1 -1
- package/src/tool/hashGenerator/seo.astro +15 -15
- package/src/tool/inspectorCertificadosSsl/i18n/ja.ts +1 -1
- package/src/tool/inspectorCertificadosSsl/i18n/ko.ts +1 -1
- package/src/tool/inspectorCertificadosSsl/i18n/zh.ts +1 -1
- package/src/tool/inspectorCertificadosSsl/seo.astro +15 -15
- package/src/tool/jsonFormatter/seo.astro +15 -15
- package/src/tool/jwtDecoder/i18n/es.ts +248 -248
- package/src/tool/jwtDecoder/i18n/fr.ts +248 -248
- package/src/tool/jwtDecoder/i18n/tr.ts +248 -248
- package/src/tool/keycode/seo.astro +15 -15
- package/src/tool/llmCostCalculator/i18n/fr.ts +149 -149
- package/src/tool/llmCostCalculator/i18n/ja.ts +1 -1
- package/src/tool/llmCostCalculator/i18n/ko.ts +1 -1
- package/src/tool/llmCostCalculator/seo.astro +15 -15
- package/src/tool/mobileMockupGenerator/i18n/ja.ts +1 -1
- package/src/tool/mobileMockupGenerator/i18n/ko.ts +1 -1
- package/src/tool/mobileMockupGenerator/i18n/zh.ts +1 -1
- package/src/tool/mobileMockupGenerator/seo.astro +15 -15
- package/src/tool/musicalTypography/i18n/ja.ts +1 -1
- package/src/tool/musicalTypography/i18n/ko.ts +1 -1
- package/src/tool/musicalTypography/i18n/zh.ts +1 -1
- package/src/tool/musicalTypography/seo.astro +15 -15
- package/src/tool/placeholderGenerator/i18n/ja.ts +1 -1
- package/src/tool/placeholderGenerator/i18n/ko.ts +1 -1
- package/src/tool/placeholderGenerator/i18n/zh.ts +1 -1
- package/src/tool/placeholderGenerator/seo.astro +15 -15
- package/src/tool/promoteThisWebsite/entry.ts +13 -0
- package/src/tool/promoteThisWebsite/i18n/de.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/fr.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/id.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/it.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/ja.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/ko.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/nl.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/pl.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/pt.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/ru.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/sv.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/tr.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/zh.ts +95 -0
- package/src/tool/promptLibrary/i18n/ja.ts +1 -1
- package/src/tool/promptLibrary/i18n/ko.ts +1 -1
- package/src/tool/promptLibrary/i18n/zh.ts +1 -1
- package/src/tool/promptLibrary/seo.astro +15 -15
- package/src/tool/readabilityCalculator/i18n/ja.ts +1 -1
- package/src/tool/readabilityCalculator/i18n/ko.ts +1 -1
- package/src/tool/readabilityCalculator/i18n/zh.ts +1 -1
- package/src/tool/readabilityCalculator/seo.astro +15 -15
- package/src/tool/serpPixelSimulator/entry.ts +30 -30
- package/src/tool/serpPixelSimulator/i18n/en.ts +211 -211
- package/src/tool/serpPixelSimulator/i18n/fr.ts +214 -214
- package/src/tool/serpPixelSimulator/i18n/ru.ts +214 -214
- package/src/tool/serpPixelSimulator/logic.ts +18 -18
- package/src/tool/serpPixelSimulator/serp-pixel-simulator.css +195 -195
- package/src/tool/svgSanitizer/i18n/ja.ts +1 -1
- package/src/tool/svgSanitizer/i18n/ko.ts +1 -1
- package/src/tool/svgSanitizer/seo.astro +15 -15
- package/src/tool/svgToCss/i18n/ja.ts +1 -1
- package/src/tool/svgToCss/i18n/ko.ts +1 -1
- package/src/tool/svgToCss/seo.astro +15 -15
- package/src/tool/urlCleaner/i18n/ja.ts +1 -1
- package/src/tool/urlCleaner/i18n/ko.ts +1 -1
- package/src/tool/urlCleaner/i18n/zh.ts +1 -1
- package/src/tool/urlCleaner/seo.astro +15 -15
- package/src/tool/urlEncoderDecoder/i18n/es.ts +146 -146
- package/src/tool/urlEncoderDecoder/i18n/ko.ts +1 -1
- package/src/tool/urlEncoderDecoder/seo.astro +15 -15
- package/src/tool/utmGenerator/i18n/ja.ts +1 -1
- package/src/tool/utmGenerator/i18n/ko.ts +1 -1
- package/src/tool/utmGenerator/i18n/zh.ts +1 -1
- package/src/tool/utmGenerator/seo.astro +15 -15
- package/src/tools.ts +2 -1
- package/src/types.ts +1 -1
|
@@ -1,214 +1,214 @@
|
|
|
1
|
-
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
-
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
-
import type { SerpPixelSimulatorUI } from '../ui';
|
|
4
|
-
import { bibliography } from '../bibliography';
|
|
5
|
-
|
|
6
|
-
const slug = 'simulateur-serp-compteur-pixels';
|
|
7
|
-
const title = 'Simulateur SERP et Compteur de Pixels SEO';
|
|
8
|
-
const description = 'Prévisualisez des extraits de recherche façon Google en temps réel, mesurez la largeur en pixels du titre et de la meta description, et voyez exactement où votre texte sera tronqué.';
|
|
9
|
-
|
|
10
|
-
const howTo = [
|
|
11
|
-
{
|
|
12
|
-
name: 'Saisissez la balise title',
|
|
13
|
-
text: 'Tapez ou collez le titre de page que vous souhaitez tester. L\'aperçu SERP et le compteur de pixels se mettent à jour à chaque frappe.',
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
name: 'Ajoutez l\'URL visible',
|
|
17
|
-
text: 'Utilisez un domaine et un chemin réalistes pour que l\'extrait ressemble au résultat qu\'un internaute analyserait.',
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
name: 'Rédigez la meta description',
|
|
21
|
-
text: 'Ajoutez le texte de la description et surveillez la barre de pixels. Lorsqu\'elle dépasse la largeur visuelle recommandée, l\'aperçu la tronque avec des points de suspension.',
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
name: 'Alternez entre bureau et mobile',
|
|
25
|
-
text: 'Comparez le rendu du titre avec la largeur de carte bureau ou mobile avant de publier les métadonnées.',
|
|
26
|
-
},
|
|
27
|
-
];
|
|
28
|
-
|
|
29
|
-
const faq = [
|
|
30
|
-
{
|
|
31
|
-
question: 'Pourquoi compter les pixels plutôt que les caractères pour les titres SEO ?',
|
|
32
|
-
answer: 'Les fiches de résultats Google sont limitées par la largeur visuelle. Un titre composé de nombreuses lettres étroites peut contenir plus de caractères qu\'un titre avec des lettres larges, des majuscules ou des glyphes épais. La mesure en pixels donne un aperçu plus fidèle du résultat visible.',
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
question: 'Cela garantit-il exactement la façon dont Google tronquera mon extrait ?',
|
|
36
|
-
answer: 'Non. Google peut réécrire les liens de titre et les extraits, et le rendu peut varier selon la requête, l\'appareil, la langue et les expérimentations. L\'outil est conçu comme un garde-fou visuel pratique pour rédiger des métadonnées moins susceptibles d\'être coupées.',
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
question: 'Quelles limites de pixels le simulateur utilise-t-il ?',
|
|
40
|
-
answer: 'La limite par défaut du titre sur bureau est de 580 px, celle du titre sur mobile est de 600 px, et celle de la meta description est de 920 px. Ce sont des objectifs de rédaction, pas des limites officielles de Google.',
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
question: 'Pourquoi l\'aperçu ajoute-t-il des points de suspension ?',
|
|
44
|
-
answer: 'Lorsque le texte mesuré dépasse la largeur en pixels disponible, le simulateur tronque la chaîne au dernier caractère qui tient et ajoute trois points, reproduisant le comportement pratique dont les équipes SEO ont besoin pour repérer une perte de sens.',
|
|
45
|
-
},
|
|
46
|
-
];
|
|
47
|
-
|
|
48
|
-
const ui: SerpPixelSimulatorUI = {
|
|
49
|
-
titleLabel: 'Balise title',
|
|
50
|
-
titlePlaceholder: 'GameBob | Studio de Développement Indépendant',
|
|
51
|
-
urlLabel: 'URL visible',
|
|
52
|
-
urlPlaceholder: 'https://www.gamebob.dev/fr/',
|
|
53
|
-
descriptionLabel: 'Meta description',
|
|
54
|
-
descriptionPlaceholder: 'Découvrez notre collection d\'outils et de jeux conçus pour enrichir votre flux de travail numérique et vos loisirs.',
|
|
55
|
-
deviceLabel: 'Mode d\'aperçu',
|
|
56
|
-
desktopLabel: 'Bureau',
|
|
57
|
-
mobileLabel: 'Mobile',
|
|
58
|
-
titlePixelsLabel: 'Largeur du titre',
|
|
59
|
-
descriptionPixelsLabel: 'Largeur de la description',
|
|
60
|
-
charactersLabel: 'caractères',
|
|
61
|
-
previewLabel: 'Aperçu en direct style Google',
|
|
62
|
-
tooLongLabel: 'Trop large',
|
|
63
|
-
goodLabel: 'Correct',
|
|
64
|
-
emptyTitle: 'Votre titre apparaîtra ici',
|
|
65
|
-
emptyDescription: 'L\'aperçu de votre meta description apparaîtra ici au fur et à mesure que vous tapez.',
|
|
66
|
-
defaultTitle: 'GameBob | Studio de Développement Indépendant',
|
|
67
|
-
defaultUrl: 'https://www.gamebob.dev/fr/',
|
|
68
|
-
defaultDescription: 'Découvrez notre collection d\'outils et de jeux conçus pour enrichir votre flux de travail numérique et vos loisirs.',
|
|
69
|
-
fallbackUrl: 'exemple.com',
|
|
70
|
-
fallbackFaviconText: 'G',
|
|
71
|
-
pixelUnit: 'px',
|
|
72
|
-
ellipsis: '...',
|
|
73
|
-
fetchButtonLabel: 'Récupérer',
|
|
74
|
-
fetchLoadingLabel: 'Récupération...',
|
|
75
|
-
fetchSuccessLabel: 'Métadonnées chargées depuis l\'URL.',
|
|
76
|
-
fetchCorsError: 'Le navigateur n\'a pas pu lire cette page. Elle peut être bloquée par CORS, une redirection, du contenu mixte ou une règle réseau. Vous pouvez toujours coller ou modifier les métadonnées manuellement.',
|
|
77
|
-
fetchInvalidUrlError: 'Saisissez une URL valide avant de récupérer les métadonnées.',
|
|
78
|
-
fetchNoMetadataError: 'La page a été récupérée, mais aucun titre ni meta description n\'a été trouvé.',
|
|
79
|
-
fetchGenericError: 'Les métadonnées n\'ont pas pu être récupérées depuis cette URL. Vérifiez l\'adresse ou remplissez les champs manuellement.',
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
const faqSchema: WithContext<FAQPage> = {
|
|
83
|
-
'@context': 'https://schema.org',
|
|
84
|
-
'@type': 'FAQPage',
|
|
85
|
-
mainEntity: faq.map((item) => ({
|
|
86
|
-
'@type': 'Question',
|
|
87
|
-
name: item.question,
|
|
88
|
-
acceptedAnswer: {
|
|
89
|
-
'@type': 'Answer',
|
|
90
|
-
text: item.answer,
|
|
91
|
-
},
|
|
92
|
-
})),
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
const howToSchema: WithContext<HowTo> = {
|
|
96
|
-
'@context': 'https://schema.org',
|
|
97
|
-
'@type': 'HowTo',
|
|
98
|
-
name: title,
|
|
99
|
-
description,
|
|
100
|
-
step: howTo.map((step, index) => ({
|
|
101
|
-
'@type': 'HowToStep',
|
|
102
|
-
position: index + 1,
|
|
103
|
-
name: step.name,
|
|
104
|
-
text: step.text,
|
|
105
|
-
})),
|
|
106
|
-
};
|
|
107
|
-
|
|
108
|
-
const appSchema: WithContext<SoftwareApplication> = {
|
|
109
|
-
'@context': 'https://schema.org',
|
|
110
|
-
'@type': 'SoftwareApplication',
|
|
111
|
-
name: title,
|
|
112
|
-
description,
|
|
113
|
-
applicationCategory: 'BusinessApplication',
|
|
114
|
-
operatingSystem: 'Any',
|
|
115
|
-
offers: {
|
|
116
|
-
'@type': 'Offer',
|
|
117
|
-
price: '0',
|
|
118
|
-
priceCurrency: 'EUR',
|
|
119
|
-
},
|
|
120
|
-
inLanguage: 'fr',
|
|
121
|
-
};
|
|
122
|
-
|
|
123
|
-
export const content: ToolLocaleContent<SerpPixelSimulatorUI> = {
|
|
124
|
-
slug,
|
|
125
|
-
title,
|
|
126
|
-
description,
|
|
127
|
-
ui,
|
|
128
|
-
faqTitle: 'FAQ du simulateur SERP',
|
|
129
|
-
faq,
|
|
130
|
-
bibliographyTitle: 'Documentation sur les résultats de recherche',
|
|
131
|
-
bibliography,
|
|
132
|
-
howTo,
|
|
133
|
-
schemas: [appSchema, faqSchema, howToSchema],
|
|
134
|
-
seo: [
|
|
135
|
-
{
|
|
136
|
-
type: 'title',
|
|
137
|
-
text: 'Arrêtez de deviner à quoi ressemblera votre résultat Google',
|
|
138
|
-
level: 2,
|
|
139
|
-
},
|
|
140
|
-
{
|
|
141
|
-
type: 'paragraph',
|
|
142
|
-
html: 'Une balise title peut sembler parfaite dans un tableur et pourtant échouer dans le résultat de recherche. Google ne réserve pas d\'espace par nombre de caractères ; il rend le texte à l\'intérieur d\'une carte visuelle. Cela signifie que <strong>GameBob | Studio de Développement Indépendant</strong> et un autre titre avec le même nombre de caractères peuvent occuper des largeurs très différentes selon les lettres, les majuscules, la ponctuation et l\'espacement.',
|
|
143
|
-
},
|
|
144
|
-
{
|
|
145
|
-
type: 'tip',
|
|
146
|
-
title: 'La règle qui aide vraiment',
|
|
147
|
-
html: 'Rédigez l\'extrait pour que la promesse importante survive aux points de suspension. Placez le type de page, l\'intention de recherche et la raison la plus forte de cliquer avant la limite de pixels. Les noms de marque sont utiles, mais ils ne doivent pas repousser le bénéfice principal hors de vue.',
|
|
148
|
-
},
|
|
149
|
-
{
|
|
150
|
-
type: 'title',
|
|
151
|
-
text: 'Ce que mesure le compteur de pixels',
|
|
152
|
-
level: 3,
|
|
153
|
-
},
|
|
154
|
-
{
|
|
155
|
-
type: 'table',
|
|
156
|
-
headers: ['Élément', 'Ce qui compte', 'Comment utiliser le résultat'],
|
|
157
|
-
rows: [
|
|
158
|
-
['Balise title', 'Largeur rendue en pixels, pas le nombre brut de caractères', 'Gardez le mot-clé principal et la promesse de clic visibles avant la troncature.'],
|
|
159
|
-
['URL visible', 'Confiance visuelle et clarté du sujet', 'Utilisez un chemin lisible qui renforce la destination du résultat.'],
|
|
160
|
-
['Meta description', 'Une zone d\'extrait plus large avec un comportement dépendant de la requête', 'Placez le bénéfice en premier car Google peut la raccourcir ou la réécrire.'],
|
|
161
|
-
['Mode appareil', 'Les cartes bureau et mobile peuvent sembler différentes', 'Vérifiez les deux avant de publier les métadonnées des pages importantes.'],
|
|
162
|
-
],
|
|
163
|
-
},
|
|
164
|
-
{
|
|
165
|
-
type: 'title',
|
|
166
|
-
text: 'Pourquoi les limites de caractères sont une mauvaise habitude SEO',
|
|
167
|
-
level: 3,
|
|
168
|
-
},
|
|
169
|
-
{
|
|
170
|
-
type: 'paragraph',
|
|
171
|
-
html: 'Le conseil traditionnel "gardez les titres sous 60 caractères" est pratique, mais il masque le vrai problème. Les lettres larges comme le W et le M, les mots en majuscules, les séparateurs, les chiffres et les longs noms de marque consomment tous un espace différent. La mesure en pixels rend le compromis visible immédiatement: vous pouvez voir si une phrase mérite sa place ou vole de l\'espace à un message plus fort.',
|
|
172
|
-
},
|
|
173
|
-
{
|
|
174
|
-
type: 'title',
|
|
175
|
-
text: 'Un flux de travail pratique pour de meilleurs extraits',
|
|
176
|
-
level: 3,
|
|
177
|
-
},
|
|
178
|
-
{
|
|
179
|
-
type: 'list',
|
|
180
|
-
items: [
|
|
181
|
-
'<strong>Commencez par l\'intention :</strong> décrivez ce que l\'utilisateur obtient, pas seulement comment la page s\'appelle.',
|
|
182
|
-
'<strong>Testez le titre complet :</strong> collez-le dans le simulateur et surveillez la barre avant de publier.',
|
|
183
|
-
'<strong>Supprimez les mots faibles :</strong> si la barre devient rouge, retirez le remplissage avant de couper des termes précieux.',
|
|
184
|
-
'<strong>Vérifiez les points de suspension :</strong> si l\'aperçu tronqué perd son sens, réécrivez le titre au lieu d\'accepter la coupure.',
|
|
185
|
-
'<strong>Répétez pour la description :</strong> assurez-vous que la première phrase porte la proposition de valeur à elle seule.',
|
|
186
|
-
],
|
|
187
|
-
},
|
|
188
|
-
{
|
|
189
|
-
type: 'diagnostic',
|
|
190
|
-
variant: 'info',
|
|
191
|
-
title: 'Quand la barre devient rouge',
|
|
192
|
-
html: 'Une barre rouge n\'est pas un avertissement de pénalité. Cela signifie que le texte actuel est plus large que la cible visuelle sélectionnée, donc le simulateur le tronque avec des points. Considérez cela comme un signal éditorial: décidez si les mots cachés sont jetables ou si l\'extrait a besoin d\'une structure plus affûtée.',
|
|
193
|
-
},
|
|
194
|
-
{
|
|
195
|
-
type: 'title',
|
|
196
|
-
text: 'Limites, réécritures et attentes réalistes',
|
|
197
|
-
level: 3,
|
|
198
|
-
},
|
|
199
|
-
{
|
|
200
|
-
type: 'paragraph',
|
|
201
|
-
html: 'Aucun simulateur ne peut garantir l\'extrait exact que Google affichera. Google peut réécrire les liens de titre, mettre en gras les termes de la requête, choisir le texte de la page au lieu de la meta description, ou afficher des extraits différents pour différentes recherches. Cet outil est plus efficace comme étape rapide de rédaction et de contrôle qualité: il détecte les débordements visuels évidents avant que la page n\'arrive en production.',
|
|
202
|
-
},
|
|
203
|
-
{
|
|
204
|
-
type: 'summary',
|
|
205
|
-
title: 'Meilleure utilisation de ce simulateur SERP',
|
|
206
|
-
items: [
|
|
207
|
-
'Utilisez la barre de pixels pour détecter les débordements visuels avant de publier les métadonnées.',
|
|
208
|
-
'Gardez l\'intention de recherche principale et la promesse de clic visibles avant toute ellipse.',
|
|
209
|
-
'Récupérez les métadonnées des URL qui autorisent le CORS, puis modifiez le résultat manuellement si nécessaire.',
|
|
210
|
-
'Considérez l\'aperçu comme un guide de rédaction, car Google peut encore réécrire les extraits selon la requête.',
|
|
211
|
-
],
|
|
212
|
-
},
|
|
213
|
-
],
|
|
214
|
-
};
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { SerpPixelSimulatorUI } from '../ui';
|
|
4
|
+
import { bibliography } from '../bibliography';
|
|
5
|
+
|
|
6
|
+
const slug = 'simulateur-serp-compteur-pixels';
|
|
7
|
+
const title = 'Simulateur SERP et Compteur de Pixels SEO';
|
|
8
|
+
const description = 'Prévisualisez des extraits de recherche façon Google en temps réel, mesurez la largeur en pixels du titre et de la meta description, et voyez exactement où votre texte sera tronqué.';
|
|
9
|
+
|
|
10
|
+
const howTo = [
|
|
11
|
+
{
|
|
12
|
+
name: 'Saisissez la balise title',
|
|
13
|
+
text: 'Tapez ou collez le titre de page que vous souhaitez tester. L\'aperçu SERP et le compteur de pixels se mettent à jour à chaque frappe.',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
name: 'Ajoutez l\'URL visible',
|
|
17
|
+
text: 'Utilisez un domaine et un chemin réalistes pour que l\'extrait ressemble au résultat qu\'un internaute analyserait.',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: 'Rédigez la meta description',
|
|
21
|
+
text: 'Ajoutez le texte de la description et surveillez la barre de pixels. Lorsqu\'elle dépasse la largeur visuelle recommandée, l\'aperçu la tronque avec des points de suspension.',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: 'Alternez entre bureau et mobile',
|
|
25
|
+
text: 'Comparez le rendu du titre avec la largeur de carte bureau ou mobile avant de publier les métadonnées.',
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
const faq = [
|
|
30
|
+
{
|
|
31
|
+
question: 'Pourquoi compter les pixels plutôt que les caractères pour les titres SEO ?',
|
|
32
|
+
answer: 'Les fiches de résultats Google sont limitées par la largeur visuelle. Un titre composé de nombreuses lettres étroites peut contenir plus de caractères qu\'un titre avec des lettres larges, des majuscules ou des glyphes épais. La mesure en pixels donne un aperçu plus fidèle du résultat visible.',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
question: 'Cela garantit-il exactement la façon dont Google tronquera mon extrait ?',
|
|
36
|
+
answer: 'Non. Google peut réécrire les liens de titre et les extraits, et le rendu peut varier selon la requête, l\'appareil, la langue et les expérimentations. L\'outil est conçu comme un garde-fou visuel pratique pour rédiger des métadonnées moins susceptibles d\'être coupées.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
question: 'Quelles limites de pixels le simulateur utilise-t-il ?',
|
|
40
|
+
answer: 'La limite par défaut du titre sur bureau est de 580 px, celle du titre sur mobile est de 600 px, et celle de la meta description est de 920 px. Ce sont des objectifs de rédaction, pas des limites officielles de Google.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
question: 'Pourquoi l\'aperçu ajoute-t-il des points de suspension ?',
|
|
44
|
+
answer: 'Lorsque le texte mesuré dépasse la largeur en pixels disponible, le simulateur tronque la chaîne au dernier caractère qui tient et ajoute trois points, reproduisant le comportement pratique dont les équipes SEO ont besoin pour repérer une perte de sens.',
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
const ui: SerpPixelSimulatorUI = {
|
|
49
|
+
titleLabel: 'Balise title',
|
|
50
|
+
titlePlaceholder: 'GameBob | Studio de Développement Indépendant',
|
|
51
|
+
urlLabel: 'URL visible',
|
|
52
|
+
urlPlaceholder: 'https://www.gamebob.dev/fr/',
|
|
53
|
+
descriptionLabel: 'Meta description',
|
|
54
|
+
descriptionPlaceholder: 'Découvrez notre collection d\'outils et de jeux conçus pour enrichir votre flux de travail numérique et vos loisirs.',
|
|
55
|
+
deviceLabel: 'Mode d\'aperçu',
|
|
56
|
+
desktopLabel: 'Bureau',
|
|
57
|
+
mobileLabel: 'Mobile',
|
|
58
|
+
titlePixelsLabel: 'Largeur du titre',
|
|
59
|
+
descriptionPixelsLabel: 'Largeur de la description',
|
|
60
|
+
charactersLabel: 'caractères',
|
|
61
|
+
previewLabel: 'Aperçu en direct style Google',
|
|
62
|
+
tooLongLabel: 'Trop large',
|
|
63
|
+
goodLabel: 'Correct',
|
|
64
|
+
emptyTitle: 'Votre titre apparaîtra ici',
|
|
65
|
+
emptyDescription: 'L\'aperçu de votre meta description apparaîtra ici au fur et à mesure que vous tapez.',
|
|
66
|
+
defaultTitle: 'GameBob | Studio de Développement Indépendant',
|
|
67
|
+
defaultUrl: 'https://www.gamebob.dev/fr/',
|
|
68
|
+
defaultDescription: 'Découvrez notre collection d\'outils et de jeux conçus pour enrichir votre flux de travail numérique et vos loisirs.',
|
|
69
|
+
fallbackUrl: 'exemple.com',
|
|
70
|
+
fallbackFaviconText: 'G',
|
|
71
|
+
pixelUnit: 'px',
|
|
72
|
+
ellipsis: '...',
|
|
73
|
+
fetchButtonLabel: 'Récupérer',
|
|
74
|
+
fetchLoadingLabel: 'Récupération...',
|
|
75
|
+
fetchSuccessLabel: 'Métadonnées chargées depuis l\'URL.',
|
|
76
|
+
fetchCorsError: 'Le navigateur n\'a pas pu lire cette page. Elle peut être bloquée par CORS, une redirection, du contenu mixte ou une règle réseau. Vous pouvez toujours coller ou modifier les métadonnées manuellement.',
|
|
77
|
+
fetchInvalidUrlError: 'Saisissez une URL valide avant de récupérer les métadonnées.',
|
|
78
|
+
fetchNoMetadataError: 'La page a été récupérée, mais aucun titre ni meta description n\'a été trouvé.',
|
|
79
|
+
fetchGenericError: 'Les métadonnées n\'ont pas pu être récupérées depuis cette URL. Vérifiez l\'adresse ou remplissez les champs manuellement.',
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
83
|
+
'@context': 'https://schema.org',
|
|
84
|
+
'@type': 'FAQPage',
|
|
85
|
+
mainEntity: faq.map((item) => ({
|
|
86
|
+
'@type': 'Question',
|
|
87
|
+
name: item.question,
|
|
88
|
+
acceptedAnswer: {
|
|
89
|
+
'@type': 'Answer',
|
|
90
|
+
text: item.answer,
|
|
91
|
+
},
|
|
92
|
+
})),
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const howToSchema: WithContext<HowTo> = {
|
|
96
|
+
'@context': 'https://schema.org',
|
|
97
|
+
'@type': 'HowTo',
|
|
98
|
+
name: title,
|
|
99
|
+
description,
|
|
100
|
+
step: howTo.map((step, index) => ({
|
|
101
|
+
'@type': 'HowToStep',
|
|
102
|
+
position: index + 1,
|
|
103
|
+
name: step.name,
|
|
104
|
+
text: step.text,
|
|
105
|
+
})),
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
109
|
+
'@context': 'https://schema.org',
|
|
110
|
+
'@type': 'SoftwareApplication',
|
|
111
|
+
name: title,
|
|
112
|
+
description,
|
|
113
|
+
applicationCategory: 'BusinessApplication',
|
|
114
|
+
operatingSystem: 'Any',
|
|
115
|
+
offers: {
|
|
116
|
+
'@type': 'Offer',
|
|
117
|
+
price: '0',
|
|
118
|
+
priceCurrency: 'EUR',
|
|
119
|
+
},
|
|
120
|
+
inLanguage: 'fr',
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
export const content: ToolLocaleContent<SerpPixelSimulatorUI> = {
|
|
124
|
+
slug,
|
|
125
|
+
title,
|
|
126
|
+
description,
|
|
127
|
+
ui,
|
|
128
|
+
faqTitle: 'FAQ du simulateur SERP',
|
|
129
|
+
faq,
|
|
130
|
+
bibliographyTitle: 'Documentation sur les résultats de recherche',
|
|
131
|
+
bibliography,
|
|
132
|
+
howTo,
|
|
133
|
+
schemas: [appSchema, faqSchema, howToSchema],
|
|
134
|
+
seo: [
|
|
135
|
+
{
|
|
136
|
+
type: 'title',
|
|
137
|
+
text: 'Arrêtez de deviner à quoi ressemblera votre résultat Google',
|
|
138
|
+
level: 2,
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
type: 'paragraph',
|
|
142
|
+
html: 'Une balise title peut sembler parfaite dans un tableur et pourtant échouer dans le résultat de recherche. Google ne réserve pas d\'espace par nombre de caractères ; il rend le texte à l\'intérieur d\'une carte visuelle. Cela signifie que <strong>GameBob | Studio de Développement Indépendant</strong> et un autre titre avec le même nombre de caractères peuvent occuper des largeurs très différentes selon les lettres, les majuscules, la ponctuation et l\'espacement.',
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
type: 'tip',
|
|
146
|
+
title: 'La règle qui aide vraiment',
|
|
147
|
+
html: 'Rédigez l\'extrait pour que la promesse importante survive aux points de suspension. Placez le type de page, l\'intention de recherche et la raison la plus forte de cliquer avant la limite de pixels. Les noms de marque sont utiles, mais ils ne doivent pas repousser le bénéfice principal hors de vue.',
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
type: 'title',
|
|
151
|
+
text: 'Ce que mesure le compteur de pixels',
|
|
152
|
+
level: 3,
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
type: 'table',
|
|
156
|
+
headers: ['Élément', 'Ce qui compte', 'Comment utiliser le résultat'],
|
|
157
|
+
rows: [
|
|
158
|
+
['Balise title', 'Largeur rendue en pixels, pas le nombre brut de caractères', 'Gardez le mot-clé principal et la promesse de clic visibles avant la troncature.'],
|
|
159
|
+
['URL visible', 'Confiance visuelle et clarté du sujet', 'Utilisez un chemin lisible qui renforce la destination du résultat.'],
|
|
160
|
+
['Meta description', 'Une zone d\'extrait plus large avec un comportement dépendant de la requête', 'Placez le bénéfice en premier car Google peut la raccourcir ou la réécrire.'],
|
|
161
|
+
['Mode appareil', 'Les cartes bureau et mobile peuvent sembler différentes', 'Vérifiez les deux avant de publier les métadonnées des pages importantes.'],
|
|
162
|
+
],
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
type: 'title',
|
|
166
|
+
text: 'Pourquoi les limites de caractères sont une mauvaise habitude SEO',
|
|
167
|
+
level: 3,
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
type: 'paragraph',
|
|
171
|
+
html: 'Le conseil traditionnel "gardez les titres sous 60 caractères" est pratique, mais il masque le vrai problème. Les lettres larges comme le W et le M, les mots en majuscules, les séparateurs, les chiffres et les longs noms de marque consomment tous un espace différent. La mesure en pixels rend le compromis visible immédiatement: vous pouvez voir si une phrase mérite sa place ou vole de l\'espace à un message plus fort.',
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
type: 'title',
|
|
175
|
+
text: 'Un flux de travail pratique pour de meilleurs extraits',
|
|
176
|
+
level: 3,
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
type: 'list',
|
|
180
|
+
items: [
|
|
181
|
+
'<strong>Commencez par l\'intention :</strong> décrivez ce que l\'utilisateur obtient, pas seulement comment la page s\'appelle.',
|
|
182
|
+
'<strong>Testez le titre complet :</strong> collez-le dans le simulateur et surveillez la barre avant de publier.',
|
|
183
|
+
'<strong>Supprimez les mots faibles :</strong> si la barre devient rouge, retirez le remplissage avant de couper des termes précieux.',
|
|
184
|
+
'<strong>Vérifiez les points de suspension :</strong> si l\'aperçu tronqué perd son sens, réécrivez le titre au lieu d\'accepter la coupure.',
|
|
185
|
+
'<strong>Répétez pour la description :</strong> assurez-vous que la première phrase porte la proposition de valeur à elle seule.',
|
|
186
|
+
],
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
type: 'diagnostic',
|
|
190
|
+
variant: 'info',
|
|
191
|
+
title: 'Quand la barre devient rouge',
|
|
192
|
+
html: 'Une barre rouge n\'est pas un avertissement de pénalité. Cela signifie que le texte actuel est plus large que la cible visuelle sélectionnée, donc le simulateur le tronque avec des points. Considérez cela comme un signal éditorial: décidez si les mots cachés sont jetables ou si l\'extrait a besoin d\'une structure plus affûtée.',
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
type: 'title',
|
|
196
|
+
text: 'Limites, réécritures et attentes réalistes',
|
|
197
|
+
level: 3,
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
type: 'paragraph',
|
|
201
|
+
html: 'Aucun simulateur ne peut garantir l\'extrait exact que Google affichera. Google peut réécrire les liens de titre, mettre en gras les termes de la requête, choisir le texte de la page au lieu de la meta description, ou afficher des extraits différents pour différentes recherches. Cet outil est plus efficace comme étape rapide de rédaction et de contrôle qualité: il détecte les débordements visuels évidents avant que la page n\'arrive en production.',
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
type: 'summary',
|
|
205
|
+
title: 'Meilleure utilisation de ce simulateur SERP',
|
|
206
|
+
items: [
|
|
207
|
+
'Utilisez la barre de pixels pour détecter les débordements visuels avant de publier les métadonnées.',
|
|
208
|
+
'Gardez l\'intention de recherche principale et la promesse de clic visibles avant toute ellipse.',
|
|
209
|
+
'Récupérez les métadonnées des URL qui autorisent le CORS, puis modifiez le résultat manuellement si nécessaire.',
|
|
210
|
+
'Considérez l\'aperçu comme un guide de rédaction, car Google peut encore réécrire les extraits selon la requête.',
|
|
211
|
+
],
|
|
212
|
+
},
|
|
213
|
+
],
|
|
214
|
+
};
|