@jjlmoya/utils-tools 1.2.0 → 1.4.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_language_code_format.test.ts +23 -0
- 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/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/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/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/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/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/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: '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
|
+
};
|
|
@@ -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: 'Bu araç SEO sıralamama nasıl yardımcı olur?',
|
|
8
|
+
answer: 'Anahtar kelime yoğunluğunu ve cümle okunabilirliğini analiz ederek, içeriğinizin kullanıcılar için anlaşılmasını kolaylaştırır, arama motorları için alakalı hale getirir ve aşırı optimizasyon cezalarından kaçınmanızı sağlarsınız.',
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
question: 'Teknik analiz hangi HTML öğelerini kontrol eder?',
|
|
12
|
+
answer: 'H1 etiketinin varlığını ve benzersizliğini, H2/H3 alt başlıklarının varlığını ve görsellerdeki alt özniteliklerini doğrular.',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: 'İçeriğim herhangi bir sunucuda saklanıyor mu?',
|
|
16
|
+
answer: 'Hayır. Analiz %100 tarayıcınızda yerel olarak çalışır. İçeriğiniz asla bilgisayarınızdan dışarı çıkmaz.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: 'Yoast SEO kriterleri ile uyumlu mu?',
|
|
20
|
+
answer: 'Evet, Yoast\'a benzer kriterler uyguluyoruz: cümle uzunluğu, paragraf dağılımı ve başlık hiyerarşisi.',
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const howToData = [
|
|
25
|
+
{ name: 'Metninizi yazın veya yapıştırın', text: 'Analiz etmek istediğiniz içeriği ana metin alanına girin.' },
|
|
26
|
+
{ name: 'Optimizasyon kontrol listesini inceleyin', text: 'Yan paneldeki uzunluk, okunabilirlik ve anahtar kelime yoğunluğu uyarılarını kontrol edin.' },
|
|
27
|
+
{ name: 'Teknik HTML\'i analiz edin', text: 'H1 etiketlerini, görsel alt metinlerini ve meta veri yapısını doğrulamak için teknik analiz sekmesine geçin.' },
|
|
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: 'İçerik SEO için nasıl optimize edilir?',
|
|
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 İçerik Optimize Edici',
|
|
51
|
+
applicationCategory: 'UtilitiesApplication',
|
|
52
|
+
operatingSystem: 'Web',
|
|
53
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
54
|
+
description: 'Metinlerinizin anahtar kelime yoğunluğunu, okunabilirliğini ve teknik HTML yapısını gerçek zamanlı olarak, hiçbir sunucuya veri göndermeden analiz edin.',
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const ui: SeoContentOptimizerUI = {
|
|
58
|
+
tabText: 'Metin Analizi',
|
|
59
|
+
tabHtml: 'Teknik HTML Analizi',
|
|
60
|
+
textareaPlaceholder: 'Metninizi yazın veya HTML kodunuzu buraya yapıştırın...',
|
|
61
|
+
statsChars: 'Karakter',
|
|
62
|
+
statsWords: 'Kelime',
|
|
63
|
+
statsReading: 'Okuma süresi',
|
|
64
|
+
statsSentences: 'Cümle',
|
|
65
|
+
checklistTitle: 'Optimizasyon Kontrol Listesi',
|
|
66
|
+
keywordsTitle: 'Anahtar Kelime Yoğunluğu',
|
|
67
|
+
technicalTitle: 'Teknik HTML Analizi',
|
|
68
|
+
h1Label: 'H1 Algılandı',
|
|
69
|
+
linksLabel: 'Bağlantılar (a)',
|
|
70
|
+
imgsLabel: 'Görseller (img)',
|
|
71
|
+
altsLabel: 'Eksik alt metinler',
|
|
72
|
+
emptyState: 'Veri yok',
|
|
73
|
+
analyzing: 'Analiz ediliyor...',
|
|
74
|
+
checkInsufficient: 'Yetersiz uzunluk (< 300 kelime)',
|
|
75
|
+
checkPillar: 'Mükemmel kapsamlı içerik (> 900 kelime)',
|
|
76
|
+
checkGoodLength: 'SEO için uygun uzunluk',
|
|
77
|
+
checkLongSentences: 'Çok fazla uzun cümle (> metnin %25\'i)',
|
|
78
|
+
checkGoodReadability: 'Optimal cümle okunabilirliği',
|
|
79
|
+
checkLongParagraphs: 'Çok uzun paragrafları bölün (> 150 kelime)',
|
|
80
|
+
checkMissingH1: 'H1 etiketi eksik',
|
|
81
|
+
checkMultipleH1: 'Birden fazla H1 etiketi algılandı',
|
|
82
|
+
checkMissingH2: 'Alt başlıklar (H2) eksik',
|
|
83
|
+
checkMissingTitle: 'Meta başlık (title) etiketi eksik',
|
|
84
|
+
stopWords: JSON.stringify(['ve', 'veya', 'ama', 'fakat', 'ancak', 'lakin', 'da', 'de', 'ki', 'ile', 'için', 'gibi', 'kadar', 'tarafından', 'rağmen', 'göre', 'den', 'dan', 'ten', 'tan', 'ise', 'dir', 'dır', 'dur', 'dür', 'tir', 'tır', 'tur', 'tür', 'bir', 'bu', 'şu', 'o', 'ne', 'hakkında', 'olarak', 'mi', 'mı', 'mu', 'mü', 'şeyi', 'şeye', 'şey', 'benim', 'senin', 'onun', 'bizim', 'sizin', 'onların']),
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export const content: ToolLocaleContent<SeoContentOptimizerUI> = {
|
|
88
|
+
slug: 'seo-icerik-optimize-edici',
|
|
89
|
+
title: 'SEO İçerik Optimize Edici',
|
|
90
|
+
description: 'Metinlerinizin anahtar kelime yoğunluğunu, okunabilirliğini ve teknik HTML yapısını gerçek zamanlı olarak analiz edin. Ücretsiz ve gizlilik odaklı SEO aracı.',
|
|
91
|
+
ui,
|
|
92
|
+
faqTitle: 'Sıkça Sorulan Sorular',
|
|
93
|
+
faq: faqData,
|
|
94
|
+
howTo: howToData,
|
|
95
|
+
bibliographyTitle: 'Kaynaklar',
|
|
96
|
+
bibliography: [
|
|
97
|
+
{ name: "Google'ın SEO Başlangıç Kılavuzu", url: 'https://developers.google.com/search/docs/fundamentals/seo-starter-guide?hl=tr' },
|
|
98
|
+
{ name: 'Yoast SEO okunabilirlik kriterleri', url: 'https://yoast.com/what-is-readability/' },
|
|
99
|
+
],
|
|
100
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
101
|
+
seo: [
|
|
102
|
+
{ type: 'title', level: 2, text: 'SEO İçerik Optimize Edici: Anahtar Kelimeler, Okunabilirlik ve Yapı' },
|
|
103
|
+
{
|
|
104
|
+
type: 'paragraph',
|
|
105
|
+
html: 'İçerik kalitesi artık sadece dahil ettiğiniz anahtar kelimelerle değil, bilginizi hem insanlar hem de Google tarayıcıları için sindirilebilir olacak şekilde nasıl yapılandırdığınızla ölçülüyor. <strong>Gerçek zamanlı SEO analiz aracımız</strong>; anahtar kelime yoğunluğu, paragraf okunabilirliği ve temel HTML teknik öğeleri üzerinde tam kontrol sağlar.',
|
|
106
|
+
},
|
|
107
|
+
{ type: 'title', level: 3, text: 'Anahtar Kelime Yoğunluğu ve Semantik Alaka' },
|
|
108
|
+
{
|
|
109
|
+
type: 'paragraph',
|
|
110
|
+
html: '<strong>Anahtar kelime yoğunluğu</strong>, bir terimin metnin geri kalanına göre ne sıklıkla göründüğünü gösterir. Aşırı tekrarlama <em>anahtar kelime doldurma (keyword stuffing)</em> filtrelerini tetiklerken, çok düşük yoğunluk arama motorlarının makalenizin ana konusunu belirlemesini zorlaştırabilir.',
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
type: 'list',
|
|
114
|
+
items: [
|
|
115
|
+
'<strong>Alaka analizi:</strong> En çok tekrarlanan kelimelerin arama amacınızla eşleşip eşleşmediğini belirleyin.',
|
|
116
|
+
'<strong>Ceza önleme:</strong> Spam gibi görünebilecek terimlerin aşırı tekrarlanmasından kaçının.',
|
|
117
|
+
'<strong>Semantik optimizasyon:</strong> Teknik terimler ile doğal dil arasında denge kurun.',
|
|
118
|
+
],
|
|
119
|
+
},
|
|
120
|
+
{ type: 'title', level: 3, text: 'Yoast Tarzı Okunabilirlik' },
|
|
121
|
+
{
|
|
122
|
+
type: 'paragraph',
|
|
123
|
+
html: 'Okunabilirlik dolaylı ama kritik bir sıralama faktörüdür. Paragraflar sonsuz metin blokları olduğu için kullanıcılar sayfayı terk ederse, <em>Hemen Çıkma Oranınız</em> artar ve kalma süreniz düşer. Analizör uzun cümleleri (20 kelime üzeri), 150 kelime üzerindeki paragrafları algılar ve alt başlıkları kontrol eder.',
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
type: 'tip',
|
|
127
|
+
title: 'Okuma süresi',
|
|
128
|
+
html: 'Çoğu kullanıcı bir makaleyi okuyup okumayacağına 10 saniyenin altında karar verir. Tahmini okuma süresini bilmek (dakikada ortalama 200 kelime üzerinden hesaplanır), okuyucunun beklentilerini belirleyerek hemen çıkma oranını düşürmeye yardımcı olur.',
|
|
129
|
+
},
|
|
130
|
+
{ type: 'title', level: 3, text: 'Teknik HTML Analizi' },
|
|
131
|
+
{
|
|
132
|
+
type: 'paragraph',
|
|
133
|
+
html: 'Temel öğeleri doğrulamak için kaynak kodunuzu yapıştırın: <strong>H1</strong> etiketinin benzersizliği, H2/H3 alt başlıklarının varlığı, <code>alt</code> özniteliği olmayan görseller ve <code>title</code> etiketinin varlığı. Tüm işlemler veri hiçbir sunucuya gönderilmeden tarayıcınızda gerçekleşir.',
|
|
134
|
+
},
|
|
135
|
+
],
|
|
136
|
+
};
|