@jjlmoya/utils-tools 1.1.0 → 1.3.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 +2 -1
- package/src/category/i18n/de.ts +172 -0
- package/src/category/i18n/id.ts +172 -0
- package/src/category/i18n/it.ts +172 -0
- package/src/category/i18n/ja.ts +172 -0
- package/src/category/i18n/ko.ts +172 -0
- package/src/category/i18n/nl.ts +172 -0
- package/src/category/i18n/pl.ts +172 -0
- package/src/category/i18n/pt.ts +172 -0
- package/src/category/i18n/ru.ts +172 -0
- package/src/category/i18n/sv.ts +172 -0
- package/src/category/i18n/tr.ts +172 -0
- package/src/category/i18n/zh.ts +172 -0
- package/src/category/index.ts +13 -1
- package/src/tests/i18n_coverage.test.ts +36 -0
- package/src/tests/locale_completeness.test.ts +1 -1
- package/src/tests/slug_uniqueness.test.ts +81 -0
- package/src/tests/title_quality.test.ts +0 -1
- package/src/tool/date-diff-calculator/i18n/de.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/fr.ts +1 -1
- package/src/tool/date-diff-calculator/i18n/id.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/it.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/ja.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/ko.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/nl.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/pl.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/pt.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/ru.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/sv.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/tr.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/zh.ts +132 -0
- package/src/tool/date-diff-calculator/index.ts +12 -0
- package/src/tool/drive-direct-link/i18n/de.ts +118 -0
- package/src/tool/drive-direct-link/i18n/id.ts +118 -0
- package/src/tool/drive-direct-link/i18n/it.ts +118 -0
- package/src/tool/drive-direct-link/i18n/ja.ts +118 -0
- package/src/tool/drive-direct-link/i18n/ko.ts +118 -0
- package/src/tool/drive-direct-link/i18n/nl.ts +118 -0
- package/src/tool/drive-direct-link/i18n/pl.ts +118 -0
- package/src/tool/drive-direct-link/i18n/pt.ts +118 -0
- package/src/tool/drive-direct-link/i18n/ru.ts +118 -0
- package/src/tool/drive-direct-link/i18n/sv.ts +118 -0
- package/src/tool/drive-direct-link/i18n/tr.ts +118 -0
- package/src/tool/drive-direct-link/i18n/zh.ts +118 -0
- package/src/tool/drive-direct-link/index.ts +12 -0
- package/src/tool/email-list-cleaner/i18n/de.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/es.ts +1 -1
- package/src/tool/email-list-cleaner/i18n/fr.ts +1 -1
- package/src/tool/email-list-cleaner/i18n/id.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/it.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/ja.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/ko.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/nl.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/pl.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/pt.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/ru.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/sv.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/tr.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/zh.ts +140 -0
- package/src/tool/email-list-cleaner/index.ts +12 -0
- package/src/tool/env-badge-spain/i18n/de.ts +153 -0
- package/src/tool/env-badge-spain/i18n/es.ts +1 -1
- package/src/tool/env-badge-spain/i18n/fr.ts +1 -1
- package/src/tool/env-badge-spain/i18n/id.ts +153 -0
- package/src/tool/env-badge-spain/i18n/it.ts +153 -0
- package/src/tool/env-badge-spain/i18n/ja.ts +153 -0
- package/src/tool/env-badge-spain/i18n/ko.ts +153 -0
- package/src/tool/env-badge-spain/i18n/nl.ts +153 -0
- package/src/tool/env-badge-spain/i18n/pl.ts +153 -0
- package/src/tool/env-badge-spain/i18n/pt.ts +153 -0
- package/src/tool/env-badge-spain/i18n/ru.ts +153 -0
- package/src/tool/env-badge-spain/i18n/sv.ts +153 -0
- package/src/tool/env-badge-spain/i18n/tr.ts +153 -0
- package/src/tool/env-badge-spain/i18n/zh.ts +153 -0
- package/src/tool/env-badge-spain/index.ts +12 -0
- package/src/tool/morse-beacon/i18n/de.ts +157 -0
- package/src/tool/morse-beacon/i18n/es.ts +1 -1
- package/src/tool/morse-beacon/i18n/id.ts +157 -0
- package/src/tool/morse-beacon/i18n/it.ts +157 -0
- package/src/tool/morse-beacon/i18n/ja.ts +157 -0
- package/src/tool/morse-beacon/i18n/ko.ts +157 -0
- package/src/tool/morse-beacon/i18n/nl.ts +157 -0
- package/src/tool/morse-beacon/i18n/pl.ts +157 -0
- package/src/tool/morse-beacon/i18n/pt.ts +157 -0
- package/src/tool/morse-beacon/i18n/ru.ts +157 -0
- package/src/tool/morse-beacon/i18n/sv.ts +157 -0
- package/src/tool/morse-beacon/i18n/tr.ts +157 -0
- package/src/tool/morse-beacon/i18n/zh.ts +157 -0
- package/src/tool/morse-beacon/index.ts +13 -1
- package/src/tool/password-generator/i18n/de.ts +166 -0
- package/src/tool/password-generator/i18n/fr.ts +1 -1
- package/src/tool/password-generator/i18n/id.ts +166 -0
- package/src/tool/password-generator/i18n/it.ts +166 -0
- package/src/tool/password-generator/i18n/ja.ts +166 -0
- package/src/tool/password-generator/i18n/ko.ts +166 -0
- package/src/tool/password-generator/i18n/nl.ts +166 -0
- package/src/tool/password-generator/i18n/pl.ts +166 -0
- package/src/tool/password-generator/i18n/pt.ts +166 -0
- package/src/tool/password-generator/i18n/ru.ts +166 -0
- package/src/tool/password-generator/i18n/sv.ts +166 -0
- package/src/tool/password-generator/i18n/tr.ts +166 -0
- package/src/tool/password-generator/i18n/zh.ts +166 -0
- package/src/tool/password-generator/index.ts +13 -1
- package/src/tool/routes/i18n/de.ts +157 -0
- package/src/tool/routes/i18n/es.ts +1 -1
- package/src/tool/routes/i18n/id.ts +157 -0
- package/src/tool/routes/i18n/it.ts +157 -0
- package/src/tool/routes/i18n/ja.ts +157 -0
- package/src/tool/routes/i18n/ko.ts +157 -0
- package/src/tool/routes/i18n/nl.ts +157 -0
- package/src/tool/routes/i18n/pl.ts +157 -0
- package/src/tool/routes/i18n/pt.ts +157 -0
- package/src/tool/routes/i18n/ru.ts +157 -0
- package/src/tool/routes/i18n/sv.ts +157 -0
- package/src/tool/routes/i18n/tr.ts +157 -0
- package/src/tool/routes/i18n/zh.ts +157 -0
- package/src/tool/routes/index.ts +13 -1
- package/src/tool/rule-of-three/i18n/de.ts +171 -0
- package/src/tool/rule-of-three/i18n/en.ts +1 -1
- package/src/tool/rule-of-three/i18n/id.ts +171 -0
- package/src/tool/rule-of-three/i18n/it.ts +171 -0
- package/src/tool/rule-of-three/i18n/ja.ts +171 -0
- package/src/tool/rule-of-three/i18n/ko.ts +171 -0
- package/src/tool/rule-of-three/i18n/nl.ts +171 -0
- package/src/tool/rule-of-three/i18n/pl.ts +171 -0
- package/src/tool/rule-of-three/i18n/pt.ts +171 -0
- package/src/tool/rule-of-three/i18n/ru.ts +171 -0
- package/src/tool/rule-of-three/i18n/sv.ts +171 -0
- package/src/tool/rule-of-three/i18n/tr.ts +171 -0
- package/src/tool/rule-of-three/i18n/zh.ts +171 -0
- package/src/tool/rule-of-three/index.ts +13 -1
- package/src/tool/seo-content-optimizer/i18n/de.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/id.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/it.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/ja.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/ko.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/nl.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/pl.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/pt.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/ru.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/sv.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/tr.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/zh.ts +136 -0
- package/src/tool/seo-content-optimizer/index.ts +12 -0
- package/src/tool/speed-reader/i18n/de.ts +152 -0
- package/src/tool/speed-reader/i18n/es.ts +1 -1
- package/src/tool/speed-reader/i18n/id.ts +152 -0
- package/src/tool/speed-reader/i18n/it.ts +152 -0
- package/src/tool/speed-reader/i18n/ja.ts +152 -0
- package/src/tool/speed-reader/i18n/ko.ts +152 -0
- package/src/tool/speed-reader/i18n/nl.ts +152 -0
- package/src/tool/speed-reader/i18n/pl.ts +152 -0
- package/src/tool/speed-reader/i18n/pt.ts +152 -0
- package/src/tool/speed-reader/i18n/ru.ts +152 -0
- package/src/tool/speed-reader/i18n/sv.ts +152 -0
- package/src/tool/speed-reader/i18n/tr.ts +152 -0
- package/src/tool/speed-reader/i18n/zh.ts +152 -0
- package/src/tool/speed-reader/index.ts +12 -0
- package/src/tool/text-pixel-calculator/i18n/de.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/id.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/it.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/ja.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/ko.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/nl.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/pl.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/pt.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/ru.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/sv.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/tr.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/zh.ts +133 -0
- package/src/tool/text-pixel-calculator/index.ts +12 -0
- package/src/tool/whatsapp-link/i18n/de.ts +128 -0
- package/src/tool/whatsapp-link/i18n/es.ts +1 -1
- package/src/tool/whatsapp-link/i18n/id.ts +128 -0
- package/src/tool/whatsapp-link/i18n/it.ts +128 -0
- package/src/tool/whatsapp-link/i18n/ja.ts +128 -0
- package/src/tool/whatsapp-link/i18n/ko.ts +128 -0
- package/src/tool/whatsapp-link/i18n/nl.ts +128 -0
- package/src/tool/whatsapp-link/i18n/pl.ts +128 -0
- package/src/tool/whatsapp-link/i18n/pt.ts +128 -0
- package/src/tool/whatsapp-link/i18n/ru.ts +128 -0
- package/src/tool/whatsapp-link/i18n/sv.ts +128 -0
- package/src/tool/whatsapp-link/i18n/tr.ts +128 -0
- package/src/tool/whatsapp-link/i18n/zh.ts +128 -0
- package/src/tool/whatsapp-link/index.ts +12 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
3
|
+
import type { SeoContentOptimizerUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const faqData = [
|
|
6
|
+
{
|
|
7
|
+
question: 'Jak to narzędzie pomaga w pozycjonowaniu SEO?',
|
|
8
|
+
answer: 'Analizując gęstość słów kluczowych i czytelność zdań, upewniasz się, że Twoja treść jest łatwa do zrozumienia dla użytkowników i istotna dla wyszukiwarek, unikając kar za nadmierną optymalizację.',
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
question: 'Jakie elementy HTML sprawdza analiza techniczna?',
|
|
12
|
+
answer: 'Weryfikuje istnienie i unikalność tagu H1, obecność nagłówków H2/H3 oraz atrybuty alt w obrazach.',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: 'Czy moja treść jest przechowywana na jakimkolwiek serwerze?',
|
|
16
|
+
answer: 'Nie. Analiza odbywa się w 100% lokalnie w Twojej przeglądarce. Twoja treść nigdy nie opuszcza Twojego komputera.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: 'Czy jest zgodne z kryteriami Yoast SEO?',
|
|
20
|
+
answer: 'Tak, wdrażamy kryteria podobne do Yoast: długość zdań, rozkład akapitów i hierarchia nagłówków.',
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const howToData = [
|
|
25
|
+
{ name: 'Napisz lub wklej tekst', text: 'Wprowadź treść, którą chcesz przeanalizować, w głównym obszarze tekstowym.' },
|
|
26
|
+
{ name: 'Przejrzyj listę kontrolną optymalizacji', text: 'Sprawdź alerty dotyczące długości, czytelności i gęstości słów kluczowych w panelu bocznym.' },
|
|
27
|
+
{ name: 'Analizuj techniczny kod HTML', text: 'Przełącz się na kartę analizy technicznej, aby zweryfikować tagi H1, opisy alt obrazów i strukturę metadanych.' },
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
31
|
+
'@context': 'https://schema.org',
|
|
32
|
+
'@type': 'FAQPage',
|
|
33
|
+
mainEntity: faqData.map((item) => ({
|
|
34
|
+
'@type': 'Question',
|
|
35
|
+
name: item.question,
|
|
36
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
37
|
+
})),
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const howToSchema: WithContext<HowTo> = {
|
|
41
|
+
'@context': 'https://schema.org',
|
|
42
|
+
'@type': 'HowTo',
|
|
43
|
+
name: 'Jak optymalizować treści pod kątem SEO',
|
|
44
|
+
step: howToData.map((s) => ({ '@type': 'HowToStep', name: s.name, text: s.text })),
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
48
|
+
'@context': 'https://schema.org',
|
|
49
|
+
'@type': 'SoftwareApplication',
|
|
50
|
+
name: 'Optymalizator Treści SEO',
|
|
51
|
+
applicationCategory: 'UtilitiesApplication',
|
|
52
|
+
operatingSystem: 'Web',
|
|
53
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
54
|
+
description: 'Analizuj gęstość słów kluczowych, czytelność i techniczną strukturę HTML swoich tekstów w czasie rzeczywistym, bez wysyłania danych na serwer.',
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const ui: SeoContentOptimizerUI = {
|
|
58
|
+
tabText: 'Analiza tekstu',
|
|
59
|
+
tabHtml: 'Techniczna analiza HTML',
|
|
60
|
+
textareaPlaceholder: 'Wpisz swój tekst lub wklej tutaj kod HTML...',
|
|
61
|
+
statsChars: 'Znaki',
|
|
62
|
+
statsWords: 'Słowa',
|
|
63
|
+
statsReading: 'Czytanie',
|
|
64
|
+
statsSentences: 'Zdania',
|
|
65
|
+
checklistTitle: 'Lista kontrolna optymalizacji',
|
|
66
|
+
keywordsTitle: 'Gęstość słów kluczowych',
|
|
67
|
+
technicalTitle: 'Techniczna analiza HTML',
|
|
68
|
+
h1Label: 'Wykryto H1',
|
|
69
|
+
linksLabel: 'Linki (a)',
|
|
70
|
+
imgsLabel: 'Obrazy (img)',
|
|
71
|
+
altsLabel: 'Brakujące opisy alt',
|
|
72
|
+
emptyState: 'Brak danych',
|
|
73
|
+
analyzing: 'Analizowanie...',
|
|
74
|
+
checkInsufficient: 'Niewystarczająca długość (< 300 słów)',
|
|
75
|
+
checkPillar: 'Doskonała treść typu pillar (> 900 słów)',
|
|
76
|
+
checkGoodLength: 'Dobra długość pod kątem SEO',
|
|
77
|
+
checkLongSentences: 'Zbyt wiele długich zdań (> 25% tekstu)',
|
|
78
|
+
checkGoodReadability: 'Optymalna czytelność zdań',
|
|
79
|
+
checkLongParagraphs: 'Podziel bardzo długie akapity (> 150 słów)',
|
|
80
|
+
checkMissingH1: 'Brak tagu H1',
|
|
81
|
+
checkMultipleH1: 'Wykryto wiele tagów H1',
|
|
82
|
+
checkMissingH2: 'Brak nagłówków (H2)',
|
|
83
|
+
checkMissingTitle: 'Brak tagu meta title',
|
|
84
|
+
stopWords: JSON.stringify(['w', 'z', 'na', 'do', 'o', 'u', 'po', 'za', 'oraz', 'lub', 'i', 'ale', 'też', 'że', 'się', 'by', 'aby', 'dla', 'jest', 'był', 'było', 'były', 'są', 'będą', 'mamy', 'ma', 'miał', 'to', 'ten', 'ta', 'te', 'tych', 'nie', 'tak', 'jak', 'niż', 'mój', 'twój', 'jego', 'jej', 'nasz', 'wasz', 'ich']),
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export const content: ToolLocaleContent<SeoContentOptimizerUI> = {
|
|
88
|
+
slug: 'optymalizator-tresci-seo',
|
|
89
|
+
title: 'Optymalizator Treści SEO',
|
|
90
|
+
description: 'Analizuj gęstość słów kluczowych, czytelność i techniczną strukturę HTML swoich tekstów w czasie rzeczywistym. Darmowe i prywatne narzędzie SEO.',
|
|
91
|
+
ui,
|
|
92
|
+
faqTitle: 'Często zadawane pytania',
|
|
93
|
+
faq: faqData,
|
|
94
|
+
howTo: howToData,
|
|
95
|
+
bibliographyTitle: 'Źródła',
|
|
96
|
+
bibliography: [
|
|
97
|
+
{ name: "Wprowadzenie Google do SEO", url: 'https://developers.google.com/search/docs/fundamentals/seo-starter-guide?hl=pl' },
|
|
98
|
+
{ name: 'Kryteria czytelności Yoast SEO', url: 'https://yoast.com/what-is-readability/' },
|
|
99
|
+
],
|
|
100
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
101
|
+
seo: [
|
|
102
|
+
{ type: 'title', level: 2, text: 'Optymalizator treści SEO: słowa kluczowe, czytelność i struktura' },
|
|
103
|
+
{
|
|
104
|
+
type: 'paragraph',
|
|
105
|
+
html: 'Jakość treści nie jest już mierzona wyłącznie na podstawie zawartych w niej słów kluczowych, ale przez to, jak ustrukturyzujesz informacje, aby były przystępne zarówno dla ludzi, jak i dla robotów Google. Nasze <strong>narzędzie do analizy SEO w czasie rzeczywistym</strong> daje Ci pełną kontrolę nad gęstością słów kluczowych, czytelnością akapitów i podstawowymi technicznymi elementami HTML.',
|
|
106
|
+
},
|
|
107
|
+
{ type: 'title', level: 3, text: 'Gęstość słów kluczowych i trafność semantyczna' },
|
|
108
|
+
{
|
|
109
|
+
type: 'paragraph',
|
|
110
|
+
html: '<strong>Gęstość słów kluczowych</strong> wskazuje, jak często dany termin pojawia się w stosunku do reszty tekstu. Nadmierne powtarzanie uruchamia filtry <em>keyword stuffing</em>, podczas gdy bardzo niska gęstość może utrudnić wyszukiwarkom zidentyfikowanie głównego tematu artykułu.',
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
type: 'list',
|
|
114
|
+
items: [
|
|
115
|
+
'<strong>Analiza istotności:</strong> Sprawdź, czy najczęściej powtarzane słowa pasują do intencji wyszukiwania.',
|
|
116
|
+
'<strong>Zapobieganie karom:</strong> Unikaj nadmiernego powtarzania terminów, które mogą wyglądać jak spam.',
|
|
117
|
+
'<strong>Optymalizacja semantyczna:</strong> Znajdź równowagę między terminami technicznymi a naturalnym językiem.',
|
|
118
|
+
],
|
|
119
|
+
},
|
|
120
|
+
{ type: 'title', level: 3, text: 'Czytelność w stylu Yoast' },
|
|
121
|
+
{
|
|
122
|
+
type: 'paragraph',
|
|
123
|
+
html: 'Czytelność jest pośrednim, ale kluczowym czynnikiem rankingowym. Jeśli użytkownicy opuszczają stronę, ponieważ akapity to niekończące się bloki tekstu, Twój <em>Dwell Time</em> spada. Analizator wykrywa długie zdania (powyżej 20 słów), akapity powyżej 150 słów i sprawdza obecność nagłówków.',
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
type: 'tip',
|
|
127
|
+
title: 'Czas czytania',
|
|
128
|
+
html: 'Większość użytkowników decyduje, czy przeczytać artykuł, w czasie krótszym niż 10 sekund. Znajomość szacowanego czasu czytania (obliczanego przy średniej 200 słów na minutę) pomaga zmniejszyć współczynnik odrzuceń poprzez ustalenie oczekiwań czytelnika.',
|
|
129
|
+
},
|
|
130
|
+
{ type: 'title', level: 3, text: 'Techniczna analiza HTML' },
|
|
131
|
+
{
|
|
132
|
+
type: 'paragraph',
|
|
133
|
+
html: 'Wklej swój kod źródłowy, aby zweryfikować kluczowe elementy: unikalność <strong>H1</strong>, obecność nagłówków H2/H3, obrazy bez atrybutów <code>alt</code> oraz istnienie tagu <code>title</code>. Całe przetwarzanie odbywa się w Twojej przeglądarce, bez wysyłania danych na żaden serwer.',
|
|
134
|
+
},
|
|
135
|
+
],
|
|
136
|
+
};
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
3
|
+
import type { SeoContentOptimizerUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const faqData = [
|
|
6
|
+
{
|
|
7
|
+
question: 'Como é que esta ferramenta ajuda o meu ranking de SEO?',
|
|
8
|
+
answer: 'Ao analisar a densidade de palavras-chave e a legibilidade das frases, garante que o seu conteúdo é fácil de entender para os utilizadores e relevante para os motores de busca, evitando penalizações por sobre-otimização.',
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
question: 'Que elementos HTML verifica a análise técnica?',
|
|
12
|
+
answer: 'Verifica a existência e unicidade da tag H1, a presença de subtítulos H2/H3 e os atributos alt nas imagens.',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: 'O meu conteúdo é guardado em algum servidor?',
|
|
16
|
+
answer: 'Não. A análise corre 100% localmente no seu navegador. O seu conteúdo nunca sai do seu computador.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: 'É compatível com os critérios do Yoast SEO?',
|
|
20
|
+
answer: 'Sim, implementamos critérios semelhantes aos do Yoast: comprimento de frases, distribuição de parágrafos e hierarquia de cabeçalhos.',
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const howToData = [
|
|
25
|
+
{ name: 'Escreva ou cole o seu texto', text: 'Introduza o conteúdo que pretende analisar na área de texto principal.' },
|
|
26
|
+
{ name: 'Reveja a lista de verificação de otimização', text: 'Verifique os alertas de comprimento, legibilidade e densidade de palavras-chave no painel lateral.' },
|
|
27
|
+
{ name: 'Analise o HTML técnico', text: 'Mude para o separador de análise técnica para verificar as tags H1, os alts das imagens e a estrutura de metadados.' },
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
31
|
+
'@context': 'https://schema.org',
|
|
32
|
+
'@type': 'FAQPage',
|
|
33
|
+
mainEntity: faqData.map((item) => ({
|
|
34
|
+
'@type': 'Question',
|
|
35
|
+
name: item.question,
|
|
36
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
37
|
+
})),
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const howToSchema: WithContext<HowTo> = {
|
|
41
|
+
'@context': 'https://schema.org',
|
|
42
|
+
'@type': 'HowTo',
|
|
43
|
+
name: 'Como otimizar conteúdo para SEO',
|
|
44
|
+
step: howToData.map((s) => ({ '@type': 'HowToStep', name: s.name, text: s.text })),
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
48
|
+
'@context': 'https://schema.org',
|
|
49
|
+
'@type': 'SoftwareApplication',
|
|
50
|
+
name: 'Otimizador de Conteúdo SEO',
|
|
51
|
+
applicationCategory: 'UtilitiesApplication',
|
|
52
|
+
operatingSystem: 'Web',
|
|
53
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
54
|
+
description: 'Analise a densidade de palavras-chave, legibilidade e estrutura HTML técnica dos seus textos em tempo real, sem enviar dados para qualquer servidor.',
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const ui: SeoContentOptimizerUI = {
|
|
58
|
+
tabText: 'Análise de Texto',
|
|
59
|
+
tabHtml: 'Análise HTML Técnica',
|
|
60
|
+
textareaPlaceholder: 'Escreva o seu texto ou cole aqui o seu código HTML...',
|
|
61
|
+
statsChars: 'Caracteres',
|
|
62
|
+
statsWords: 'Palavras',
|
|
63
|
+
statsReading: 'Leitura',
|
|
64
|
+
statsSentences: 'Frases',
|
|
65
|
+
checklistTitle: 'Lista de Verificação de Otimização',
|
|
66
|
+
keywordsTitle: 'Densidade de Palavras-Chave',
|
|
67
|
+
technicalTitle: 'Análise HTML Técnica',
|
|
68
|
+
h1Label: 'H1 Detetado',
|
|
69
|
+
linksLabel: 'Links (a)',
|
|
70
|
+
imgsLabel: 'Imagens (img)',
|
|
71
|
+
altsLabel: 'Alts em falta',
|
|
72
|
+
emptyState: 'Sem dados',
|
|
73
|
+
analyzing: 'A analisar...',
|
|
74
|
+
checkInsufficient: 'Comprimento insuficiente (< 300 palavras)',
|
|
75
|
+
checkPillar: 'Excelente conteúdo pilar (> 900 palavras)',
|
|
76
|
+
checkGoodLength: 'Bom comprimento para SEO',
|
|
77
|
+
checkLongSentences: 'Demasiadas frases longas (> 25% do texto)',
|
|
78
|
+
checkGoodReadability: 'Legibilidade de frase ideal',
|
|
79
|
+
checkLongParagraphs: 'Divida parágrafos muito longos (> 150 palavras)',
|
|
80
|
+
checkMissingH1: 'Tag H1 em falta',
|
|
81
|
+
checkMultipleH1: 'Múltiplas tags H1 detetadas',
|
|
82
|
+
checkMissingH2: 'Subtítulos (H2) em falta',
|
|
83
|
+
checkMissingTitle: 'Tag meta title em falta',
|
|
84
|
+
stopWords: JSON.stringify(['o', 'a', 'os', 'as', 'um', 'uma', 'uns', 'umas', 'e', 'ou', 'mas', 'em', 'no', 'na', 'nos', 'nas', 'a', 'para', 'por', 'de', 'do', 'da', 'dos', 'das', 'com', 'por', 'como', 'é', 'era', 'são', 'eram', 'ser', 'estado', 'ter', 'tem', 'tinha', 'fazer', 'faz', 'fez', 'ele', 'seu', 'este', 'aquele', 'estes', 'aqueles', 'não', 'assim', 'acima', 'se', 'meu', 'teu', 'nosso', 'vosso', 'deles']),
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export const content: ToolLocaleContent<SeoContentOptimizerUI> = {
|
|
88
|
+
slug: 'otimizador-conteudo-seo',
|
|
89
|
+
title: 'Otimizador de Conteúdo SEO',
|
|
90
|
+
description: 'Analise a densidade de palavras-chave, legibilidade e estrutura HTML técnica dos seus textos em tempo real. Ferramenta de SEO gratuita e privada.',
|
|
91
|
+
ui,
|
|
92
|
+
faqTitle: 'Perguntas Frequentes',
|
|
93
|
+
faq: faqData,
|
|
94
|
+
howTo: howToData,
|
|
95
|
+
bibliographyTitle: 'Referências',
|
|
96
|
+
bibliography: [
|
|
97
|
+
{ name: "Guia de SEO para iniciantes do Google", url: 'https://developers.google.com/search/docs/fundamentals/seo-starter-guide?hl=pt-br' },
|
|
98
|
+
{ name: 'Critérios de legibilidade Yoast SEO', url: 'https://yoast.com/what-is-readability/' },
|
|
99
|
+
],
|
|
100
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
101
|
+
seo: [
|
|
102
|
+
{ type: 'title', level: 2, text: 'Otimizador de Conteúdo SEO: Palavras-Chave, Legibilidade e Estrutura' },
|
|
103
|
+
{
|
|
104
|
+
type: 'paragraph',
|
|
105
|
+
html: 'A qualidade do conteúdo já não é medida apenas pelas palavras-chave que inclui, mas pela forma como estrutura a sua informação para ser digerível tanto para humanos como para os rastreadores do Google. A nossa <strong>ferramenta de análise de SEO em tempo real</strong> dá-lhe o controlo total sobre a densidade de palavras-chave, legibilidade de parágrafos e elementos técnicos fundamentais de HTML.',
|
|
106
|
+
},
|
|
107
|
+
{ type: 'title', level: 3, text: 'Densidade de Palavras-Chave e Relevância Semântica' },
|
|
108
|
+
{
|
|
109
|
+
type: 'paragraph',
|
|
110
|
+
html: 'A <strong>densidade de palavras-chave</strong> indica a frequência com que um termo aparece em comparação com o resto do texto. O excesso de repetição ativa filtros de <em>keyword stuffing</em>, enquanto uma densidade muito baixa pode dificultar a identificação do tópico central do seu artigo pelos motores de busca.',
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
type: 'list',
|
|
114
|
+
items: [
|
|
115
|
+
'<strong>Análise de relevância:</strong> Identifique se as palavras mais repetidas correspondem à sua intenção de pesquisa.',
|
|
116
|
+
'<strong>Prevenção de penalizações:</strong> Evite a repetição excessiva de termos que possam parecer spam.',
|
|
117
|
+
'<strong>Otimização semântica:</strong> Encontre o equilíbrio entre termos técnicos e linguagem natural.',
|
|
118
|
+
],
|
|
119
|
+
},
|
|
120
|
+
{ type: 'title', level: 3, text: 'Legibilidade ao estilo Yoast' },
|
|
121
|
+
{
|
|
122
|
+
type: 'paragraph',
|
|
123
|
+
html: 'A legibilidade é um fator de ranking indireto, mas crucial. Se os utilizadores saem porque os parágrafos são blocos de texto intermináveis, o seu <em>Dwell Time</em> diminui. O analisador deteta frases longas (com mais de 20 palavras), parágrafos com mais de 150 palavras e verifica a existência de subtítulos.',
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
type: 'tip',
|
|
127
|
+
title: 'Tempo de leitura',
|
|
128
|
+
html: 'A maioria dos utilizadores decide se vai ler um artigo em menos de 10 segundos. Conhecer o tempo de leitura estimado (calculado com uma média de 200 palavras por minuto) ajuda a reduzir a taxa de rejeição, ao definir as expectativas do leitor.',
|
|
129
|
+
},
|
|
130
|
+
{ type: 'title', level: 3, text: 'Análise HTML Técnica' },
|
|
131
|
+
{
|
|
132
|
+
type: 'paragraph',
|
|
133
|
+
html: 'Cole o seu código-fonte para verificar elementos-chave: unicidade do <strong>H1</strong>, presença de subtítulos H2/H3, imagens sem atributos <code>alt</code> e existência da tag <code>title</code>. Todo o processamento acontece no seu navegador sem enviar dados para qualquer servidor.',
|
|
134
|
+
},
|
|
135
|
+
],
|
|
136
|
+
};
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
3
|
+
import type { SeoContentOptimizerUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const faqData = [
|
|
6
|
+
{
|
|
7
|
+
question: 'Как этот инструмент помогает моему SEO-рейтингу?',
|
|
8
|
+
answer: 'Анализируя плотность ключевых слов и читабельность предложений, вы гарантируете, что ваш контент легко понятен пользователям и актуален для поисковых систем, что позволяет избежать санкций за переоптимизацию.',
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
question: 'Какие HTML-элементы проверяет технический анализ?',
|
|
12
|
+
answer: 'Он проверяет наличие и уникальность тега H1, наличие подзаголовков H2/H3 и атрибутов alt у изображений.',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: 'Хранится ли мой контент на каком-либо сервере?',
|
|
16
|
+
answer: 'Нет. Анализ выполняется на 100% локально в вашем браузере. Ваш контент никогда не покидает ваш компьютер.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: 'Совместим ли он с критериями Yoast SEO?',
|
|
20
|
+
answer: 'Да, мы применяем критерии, аналогичные Yoast: длина предложений, распределение абзацев и иерархия заголовков.',
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const howToData = [
|
|
25
|
+
{ name: 'Напишите или вставьте текст', text: 'Введите контент, который вы хотите проанализировать, в основную текстовую область.' },
|
|
26
|
+
{ name: 'Просмотрите контрольный список оптимизации', text: 'Проверьте предупреждения о длине, читабельности и плотности ключевых слов на боковой панели.' },
|
|
27
|
+
{ name: 'Проанализируйте технический HTML', text: 'Перейдите на вкладку технического анализа, чтобы проверить теги H1, alt-тексты изображений и структуру метаданных.' },
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
31
|
+
'@context': 'https://schema.org',
|
|
32
|
+
'@type': 'FAQPage',
|
|
33
|
+
mainEntity: faqData.map((item) => ({
|
|
34
|
+
'@type': 'Question',
|
|
35
|
+
name: item.question,
|
|
36
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
37
|
+
})),
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const howToSchema: WithContext<HowTo> = {
|
|
41
|
+
'@context': 'https://schema.org',
|
|
42
|
+
'@type': 'HowTo',
|
|
43
|
+
name: 'Как оптимизировать контент для SEO',
|
|
44
|
+
step: howToData.map((s) => ({ '@type': 'HowToStep', name: s.name, text: s.text })),
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
48
|
+
'@context': 'https://schema.org',
|
|
49
|
+
'@type': 'SoftwareApplication',
|
|
50
|
+
name: 'Оптимизатор SEO-контента',
|
|
51
|
+
applicationCategory: 'UtilitiesApplication',
|
|
52
|
+
operatingSystem: 'Web',
|
|
53
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
|
|
54
|
+
description: 'Анализируйте плотность ключевых слов, читабельность и техническую структуру HTML ваших текстов в режиме реального времени без отправки данных на сервер.',
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const ui: SeoContentOptimizerUI = {
|
|
58
|
+
tabText: 'Анализ текста',
|
|
59
|
+
tabHtml: 'Технический анализ HTML',
|
|
60
|
+
textareaPlaceholder: 'Напишите текст или вставьте код HTML здесь...',
|
|
61
|
+
statsChars: 'Символы',
|
|
62
|
+
statsWords: 'Слова',
|
|
63
|
+
statsReading: 'Чтение',
|
|
64
|
+
statsSentences: 'Предложения',
|
|
65
|
+
checklistTitle: 'Контрольный список оптимизации',
|
|
66
|
+
keywordsTitle: 'Плотность ключевых слов',
|
|
67
|
+
technicalTitle: 'Технический анализ HTML',
|
|
68
|
+
h1Label: 'Обнаружен H1',
|
|
69
|
+
linksLabel: 'Ссылки (a)',
|
|
70
|
+
imgsLabel: 'Изображения (img)',
|
|
71
|
+
altsLabel: 'Отсутствующие alt',
|
|
72
|
+
emptyState: 'Нет данных',
|
|
73
|
+
analyzing: 'Анализ...',
|
|
74
|
+
checkInsufficient: 'Недостаточная длина (< 300 слов)',
|
|
75
|
+
checkPillar: 'Отличный объемный контент (> 900 слов)',
|
|
76
|
+
checkGoodLength: 'Хорошая длина для SEO',
|
|
77
|
+
checkLongSentences: 'Слишком много длинных предложений (> 25% текста)',
|
|
78
|
+
checkGoodReadability: 'Оптимальная читабельность предложений',
|
|
79
|
+
checkLongParagraphs: 'Разделите очень длинные абзацы (> 150 слов)',
|
|
80
|
+
checkMissingH1: 'Отсутствует тег H1',
|
|
81
|
+
checkMultipleH1: 'Обнаружено несколько тегов H1',
|
|
82
|
+
checkMissingH2: 'Отсутствуют подзаголовки (H2)',
|
|
83
|
+
checkMissingTitle: 'Отсутствует мета-тег title',
|
|
84
|
+
stopWords: JSON.stringify(['и', 'в', 'во', 'не', 'что', 'он', 'на', 'я', 'с', 'со', 'как', 'а', 'то', 'все', 'она', 'так', 'его', 'но', 'да', 'ты', 'к', 'у', 'же', 'вы', 'за', 'бы', 'по', 'только', 'ее', 'мне', 'было', 'вот', 'от', 'меня', 'еще', 'нет', 'о', 'из', 'ему', 'же', 'когда', 'даже', 'ну', 'вдруг', 'ли', 'если', 'уже', 'или', 'ни', 'быть', 'был', 'него', 'до', 'вас', 'нибудь', 'опять', 'уж', 'вам', 'сказал', 'ведь', 'там', 'потом', 'себя', 'ничего', 'ей', 'может', 'они', 'тут', 'где', 'есть', 'надо', 'ней', 'для', 'мы', 'тебя', 'их', 'чем', 'была', 'сам', 'чтоб', 'без', 'будто', 'чего', 'раз', 'тоже', 'себе', 'под', 'будет', 'ж', 'тогда', 'кто', 'этот', 'того', 'потому', 'этого', 'какой', 'совсем', 'ним', 'здесь', 'этом', 'один', 'почти', 'мой', 'тем', 'чтобы', 'нее', 'сейчас', 'были', 'куда', 'зачем', 'всех', 'никогда', 'можно', 'при', 'наконец', 'два', 'об', 'другой', 'хоть', 'после', 'над', 'больше', 'тот', 'через', 'эти', 'нас', 'про', 'всего', 'них', 'какая', 'много', 'разве', 'три', 'эту', 'моя', 'впрочем', 'хорошо', 'свою', 'этой', 'перед', 'иногда', 'лучше', 'чуть', 'том', 'нельзя', 'такой', 'им', 'более', 'всегда', 'конечно', 'всю', 'между']),
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export const content: ToolLocaleContent<SeoContentOptimizerUI> = {
|
|
88
|
+
slug: 'optimizator-seo-kontenta',
|
|
89
|
+
title: 'Оптимизатор SEO контента',
|
|
90
|
+
description: 'Анализируйте плотность ключевых слов, читабельность и техническую структуру HTML ваших текстов в режиме реального времени. Бесплатный и приватный SEO-инструмент.',
|
|
91
|
+
ui,
|
|
92
|
+
faqTitle: 'Часто задаваемые вопросы',
|
|
93
|
+
faq: faqData,
|
|
94
|
+
howTo: howToData,
|
|
95
|
+
bibliographyTitle: 'Источники',
|
|
96
|
+
bibliography: [
|
|
97
|
+
{ name: 'Руководство Google по поисковой оптимизации для начинающих', url: 'https://developers.google.com/search/docs/fundamentals/seo-starter-guide?hl=ru' },
|
|
98
|
+
{ name: 'Критерии читабельности Yoast SEO', url: 'https://yoast.com/what-is-readability/' },
|
|
99
|
+
],
|
|
100
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
101
|
+
seo: [
|
|
102
|
+
{ type: 'title', level: 2, text: 'Оптимизатор SEO-контента: ключевые слова, читабельность и структура' },
|
|
103
|
+
{
|
|
104
|
+
type: 'paragraph',
|
|
105
|
+
html: 'Качество контента больше не измеряется исключительно включенными в него ключевыми словами, а тем, как вы структурируете информацию, чтобы она была легко усваиваемой как для людей, так и для поисковых роботов Google. Наш <strong>инструмент SEO-анализа в реальном времени</strong> дает вам полный контроль над плотностью ключевых слов, читабельностью абзацев и фундаментальными техническими элементами HTML.',
|
|
106
|
+
},
|
|
107
|
+
{ type: 'title', level: 3, text: 'Плотность ключевых слов и семантическая релевантность' },
|
|
108
|
+
{
|
|
109
|
+
type: 'paragraph',
|
|
110
|
+
html: '<strong>Плотность ключевых слов</strong> показывает, как часто термин встречается по сравнению с остальным текстом. Избыточное повторение активирует фильтры <em>keyword stuffing</em> (переспам), в то время как очень низкая плотность может затруднить поисковым системам определение основной темы вашей статьи.',
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
type: 'list',
|
|
114
|
+
items: [
|
|
115
|
+
'<strong>Анализ релевантности:</strong> Определите, соответствуют ли наиболее часто повторяющиеся слова вашему поисковому намерению.',
|
|
116
|
+
'<strong>Предотвращение санкций:</strong> Избегайте чрезмерного повторения терминов, которые могут выглядеть как спам.',
|
|
117
|
+
'<strong>Семантическая оптимизация:</strong> Найдите баланс между техническими терминами и естественным языком.',
|
|
118
|
+
],
|
|
119
|
+
},
|
|
120
|
+
{ type: 'title', level: 3, text: 'Читабельность в стиле Yoast' },
|
|
121
|
+
{
|
|
122
|
+
type: 'paragraph',
|
|
123
|
+
html: 'Читабельность — это косвенный, но решающий фактор ранжирования. Если пользователи уходят, потому что абзацы представляют собой бесконечные блоки текста, ваше <em>время пребывания на сайте</em> сокращается. Анализатор обнаруживает длинные предложения (более 20 слов), абзацы объемом более 150 слов и проверяет наличие подзаголовков.',
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
type: 'tip',
|
|
127
|
+
title: 'Время чтения',
|
|
128
|
+
html: 'Большинство пользователей решают, стоит ли читать статью, менее чем за 10 секунд. Знание расчетного времени чтения (рассчитывается при средней скорости 200 слов в минуту) помогает снизить показатель отказов, оправдывая ожидания читателя.',
|
|
129
|
+
},
|
|
130
|
+
{ type: 'title', level: 3, text: 'Технический анализ HTML' },
|
|
131
|
+
{
|
|
132
|
+
type: 'paragraph',
|
|
133
|
+
html: 'Вставьте исходный код, чтобы проверить ключевые элементы: уникальность <strong>H1</strong>, наличие подзаголовков H2/H3, изображения без атрибутов <code>alt</code> и наличие тега <code>title</code>. Вся обработка происходит в вашем браузере без отправки данных на сервер.',
|
|
134
|
+
},
|
|
135
|
+
],
|
|
136
|
+
};
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
3
|
+
import type { SeoContentOptimizerUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const faqData = [
|
|
6
|
+
{
|
|
7
|
+
question: 'Hur hjälper detta verktyg min SEO-ranking?',
|
|
8
|
+
answer: 'Genom att analysera sökordsdensitet och meningsläsbarhet säkerställer du att ditt innehåll är lätt att förstå för användare och relevant för sökmotorer, samtidigt som du undviker straffavgifter för överoptimering.',
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
question: 'Vilka HTML-element kontrollerar den tekniska analysen?',
|
|
12
|
+
answer: 'Den verifierar förekomsten och unikheten hos H1-taggen, närvaron av H2/H3-underrubriker och alt-attribut på bilder.',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: 'Lagras mitt innehåll på någon server?',
|
|
16
|
+
answer: 'Nej. Analysen körs till 100 % lokalt i din webbläsare. Ditt innehåll lämnar aldrig din dator.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: 'Är det kompatibelt med Yoast SEO-kriterier?',
|
|
20
|
+
answer: 'Ja, vi implementerar liknande kriterier som Yoast: meningslängd, styckesfördelning och rubrikhierarki.',
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const howToData = [
|
|
25
|
+
{ name: 'Skriv eller klistra in din text', text: 'Ange innehållet du vill analysera i huvudtextområdet.' },
|
|
26
|
+
{ name: 'Granska checklistan för optimering', text: 'Kontrollera varningar om längd, läsbarhet och sökordsdensitet i sidopanelen.' },
|
|
27
|
+
{ name: 'Analysera teknisk HTML', text: 'Byt till fliken för teknisk analys för att verifiera H1-taggar, bild-alts och metadatastruktur.' },
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
31
|
+
'@context': 'https://schema.org',
|
|
32
|
+
'@type': 'FAQPage',
|
|
33
|
+
mainEntity: faqData.map((item) => ({
|
|
34
|
+
'@type': 'Question',
|
|
35
|
+
name: item.question,
|
|
36
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
37
|
+
})),
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const howToSchema: WithContext<HowTo> = {
|
|
41
|
+
'@context': 'https://schema.org',
|
|
42
|
+
'@type': 'HowTo',
|
|
43
|
+
name: 'Hur man optimerar innehåll för SEO',
|
|
44
|
+
step: howToData.map((s) => ({ '@type': 'HowToStep', name: s.name, text: s.text })),
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
48
|
+
'@context': 'https://schema.org',
|
|
49
|
+
'@type': 'SoftwareApplication',
|
|
50
|
+
name: 'SEO Content Optimizer',
|
|
51
|
+
applicationCategory: 'UtilitiesApplication',
|
|
52
|
+
operatingSystem: 'Web',
|
|
53
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
54
|
+
description: 'Analysera sökordsdensitet, läsbarhet och teknisk HTML-struktur i dina texter i realtid, utan att skicka data till någon server.',
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const ui: SeoContentOptimizerUI = {
|
|
58
|
+
tabText: 'Textanalys',
|
|
59
|
+
tabHtml: 'Teknisk HTML-analys',
|
|
60
|
+
textareaPlaceholder: 'Skriv din text eller klistra in din HTML-kod här...',
|
|
61
|
+
statsChars: 'Tecken',
|
|
62
|
+
statsWords: 'Ord',
|
|
63
|
+
statsReading: 'Läsning',
|
|
64
|
+
statsSentences: 'Meningar',
|
|
65
|
+
checklistTitle: 'Checklista för optimering',
|
|
66
|
+
keywordsTitle: 'Sökordsdensitet',
|
|
67
|
+
technicalTitle: 'Teknisk HTML-analys',
|
|
68
|
+
h1Label: 'H1 upptäckt',
|
|
69
|
+
linksLabel: 'Länkar (a)',
|
|
70
|
+
imgsLabel: 'Bilder (img)',
|
|
71
|
+
altsLabel: 'Saknade alts',
|
|
72
|
+
emptyState: 'Ingen data',
|
|
73
|
+
analyzing: 'Analyserar...',
|
|
74
|
+
checkInsufficient: 'Otillräcklig längd (< 300 ord)',
|
|
75
|
+
checkPillar: 'Utmärkt pillar-innehåll (> 900 ord)',
|
|
76
|
+
checkGoodLength: 'Bra längd för SEO',
|
|
77
|
+
checkLongSentences: 'För många långa meningar (> 25 % av texten)',
|
|
78
|
+
checkGoodReadability: 'Optimal meningsläsbarhet',
|
|
79
|
+
checkLongParagraphs: 'Dela upp mycket långa stycken (> 150 ord)',
|
|
80
|
+
checkMissingH1: 'H1-tagg saknas',
|
|
81
|
+
checkMultipleH1: 'Flera H1-taggar upptäckta',
|
|
82
|
+
checkMissingH2: 'Underrubriker (H2) saknas',
|
|
83
|
+
checkMissingTitle: 'Meta title-tagg saknas',
|
|
84
|
+
stopWords: JSON.stringify(['och', 'eller', 'men', 'i', 'på', 'vid', 'till', 'för', 'av', 'med', 'från', 'som', 'är', 'var', 'ha', 'hade', 'göra', 'den', 'det', 'denna', 'detta', 'dessa', 'inte', 'nej', 'så', 'om', 'min', 'din', 'hans', 'hennes', 'vår', 'er', 'deras']),
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export const content: ToolLocaleContent<SeoContentOptimizerUI> = {
|
|
88
|
+
slug: 'seo-innehallsoptimizerare',
|
|
89
|
+
title: 'SEO Content Optimizer',
|
|
90
|
+
description: 'Analysera sökordsdensitet, läsbarhet och teknisk HTML-struktur i dina texter i realtid. Gratis och privat SEO-verktyg.',
|
|
91
|
+
ui,
|
|
92
|
+
faqTitle: 'Vanliga frågor',
|
|
93
|
+
faq: faqData,
|
|
94
|
+
howTo: howToData,
|
|
95
|
+
bibliographyTitle: 'Referenser',
|
|
96
|
+
bibliography: [
|
|
97
|
+
{ name: "Googles startguide för SEO", url: 'https://developers.google.com/search/docs/fundamentals/seo-starter-guide?hl=sv' },
|
|
98
|
+
{ name: 'Yoast SEO läsbarhetskriterier', url: 'https://yoast.com/what-is-readability/' },
|
|
99
|
+
],
|
|
100
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
101
|
+
seo: [
|
|
102
|
+
{ type: 'title', level: 2, text: 'SEO Content Optimizer: Sökord, läsbarhet och struktur' },
|
|
103
|
+
{
|
|
104
|
+
type: 'paragraph',
|
|
105
|
+
html: 'Innehållskvalitet mäts inte längre enbart genom de sökord du inkluderar, utan genom hur du strukturerar din information så att den är lättsmält för både människor och Googles sökrobotar. Vårt <strong>verktyg för SEO-analys i realtid</strong> ger dig full kontroll över sökordsdensitet, styckesläsbarhet och grundläggande tekniska HTML-element.',
|
|
106
|
+
},
|
|
107
|
+
{ type: 'title', level: 3, text: 'Sökordsdensitet och semantisk relevans' },
|
|
108
|
+
{
|
|
109
|
+
type: 'paragraph',
|
|
110
|
+
html: '<strong>Sökordsdensitet</strong> anger hur ofta en term förekommer jämfört med resten av texten. Överdriven upprepning utlöser <em>keyword stuffing</em>-filter, medan mycket låg densitet kan göra det svårt för sökmotorer att identifiera din artikels centrala ämne.',
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
type: 'list',
|
|
114
|
+
items: [
|
|
115
|
+
'<strong>Relevansanalys:</strong> Identifiera om de mest upprepade orden matchar din sökintention.',
|
|
116
|
+
'<strong>Förebyggande av straff:</strong> Undvik att upprepa termer i onödan som kan framstå som spam.',
|
|
117
|
+
'<strong>Semantisk optimering:</strong> Hitta balansen mellan tekniska termer och naturligt språk.',
|
|
118
|
+
],
|
|
119
|
+
},
|
|
120
|
+
{ type: 'title', level: 3, text: 'Läsbarhet i Yoast-stil' },
|
|
121
|
+
{
|
|
122
|
+
type: 'paragraph',
|
|
123
|
+
html: 'Läsbarhet är en indirekt men avgörande rankningsfaktor. Om användare lämnar sidan för att styckena är oändliga textblock, sjunker din <em>Dwell Time</em>. Analysatorn upptäcker långa meningar (över 20 ord), stycken på över 150 ord och kontrollerar om det finns underrubriker.',
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
type: 'tip',
|
|
127
|
+
title: 'Lästid',
|
|
128
|
+
html: 'De flesta användare bestämmer sig för om de ska läsa en artikel på under 10 sekunder. Att känna till den beräknade lästiden (beräknad på ett genomsnitt av 200 ord per minut) hjälper till att minska avvisningsfrekvensen genom att ställa in läsarens förväntningar.',
|
|
129
|
+
},
|
|
130
|
+
{ type: 'title', level: 3, text: 'Teknisk HTML-analys' },
|
|
131
|
+
{
|
|
132
|
+
type: 'paragraph',
|
|
133
|
+
html: 'Klistra in din källkod för att verifiera nyckelelement: unikhet hos <strong>H1</strong>, närvaro av H2/H3-underrubriker, bilder utan <code>alt</code>-attribut och att <code>title</code>-taggen finns. All bearbetning sker i din webbläsare utan att data skickas till någon server.',
|
|
134
|
+
},
|
|
135
|
+
],
|
|
136
|
+
};
|