@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: 'このツールはどのように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: 'seo-content-optimizer',
|
|
89
|
+
title: 'SEOコンテンツ最適化ツール',
|
|
90
|
+
description: 'テキストのキーワード密度、読みやすさ、テクニカルHTML構造をリアルタイムで分析します。サーバーにデータを送信しない、無料でプライバシーに配慮したSEOツールです。',
|
|
91
|
+
ui,
|
|
92
|
+
faqTitle: 'よくある質問',
|
|
93
|
+
faq: faqData,
|
|
94
|
+
howTo: howToData,
|
|
95
|
+
bibliographyTitle: '参考文献',
|
|
96
|
+
bibliography: [
|
|
97
|
+
{ name: 'Google SEOスターターガイド', url: 'https://developers.google.com/search/docs/fundamentals/seo-starter-guide?hl=ja' },
|
|
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>キーワードスタッフィング</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: '読みやすさの分析' },
|
|
121
|
+
{
|
|
122
|
+
type: 'paragraph',
|
|
123
|
+
html: '読みやすさは、間接的ですが重要なランキング要因です。段落がいつまでも続くテキストブロックであるためにユーザーが離脱すると、<em>滞在時間</em>が短くなります。アナライザーは、長い文章(英単語換算で20語相当以上)や非常に長い段落を検出し、小見出しの有無をチェックします。',
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
type: 'tip',
|
|
127
|
+
title: '読了時間',
|
|
128
|
+
html: 'ほとんどのユーザーは、記事を読むかどうかを10秒以内に判断します。推定読了時間(平均読書速度から算出)を知ることで、読者の期待値を設定し、直帰率を減らすことができます。',
|
|
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: '이 도구가 내 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: 'seo-content-optimizer',
|
|
89
|
+
title: 'SEO 콘텐츠 최적화 도구',
|
|
90
|
+
description: '텍스트의 키워드 밀도, 가독성 및 기술 HTML 구조를 실시간으로 분석하세요. 무료로 제공되는 개인정보 보호 SEO 도구입니다.',
|
|
91
|
+
ui,
|
|
92
|
+
faqTitle: '자주 묻는 질문',
|
|
93
|
+
faq: faqData,
|
|
94
|
+
howTo: howToData,
|
|
95
|
+
bibliographyTitle: '참고 문헌',
|
|
96
|
+
bibliography: [
|
|
97
|
+
{ name: 'Google 검색 엔진 최적화(SEO) 기본 가이드', url: 'https://developers.google.com/search/docs/fundamentals/seo-starter-guide?hl=ko' },
|
|
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>체류 시간(Dwell Time)</em>이 감소합니다. 분석기는 긴 문장(단어 수 기준), 긴 단락을 감지하고 부제목이 있는지 확인합니다.',
|
|
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: 'Hoe helpt deze tool mijn SEO-ranking?',
|
|
8
|
+
answer: 'Door de zoekwoorddichtheid en de leesbaarheid van zinnen te analyseren, zorgt u ervoor dat uw inhoud gemakkelijk te begrijpen is voor gebruikers en relevant is voor zoekmachines, terwijl u boetes voor over-optimalisatie vermijdt.',
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
question: 'Welke HTML-elementen controleert de technische analyse?',
|
|
12
|
+
answer: 'Het verifieert het bestaan en de uniciteit van de H1-tag, de aanwezigheid van H2/H3-subkoppen en alt-attributen bij afbeeldingen.',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: 'Wordt mijn inhoud op een server opgeslagen?',
|
|
16
|
+
answer: 'Nee. De analyse draait 100% lokaal in uw browser. Uw inhoud verlaat nooit uw computer.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: 'Is het compatibel met de Yoast SEO-criteria?',
|
|
20
|
+
answer: 'Ja, we implementeren vergelijkbare criteria als Yoast: zinlengte, alinea-verdeling en koptekst-hiërarchie.',
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const howToData = [
|
|
25
|
+
{ name: 'Schrijf of plak uw tekst', text: 'Voer de inhoud die u wilt analyseren in het hoofdtekstveld in.' },
|
|
26
|
+
{ name: 'Bekijk de optimalisatie-checklist', text: 'Controleer de waarschuwingen voor lengte, leesbaarheid en zoekwoorddichtheid in het zijpaneel.' },
|
|
27
|
+
{ name: 'Analyseer technische HTML', text: 'Schakel over naar het tabblad voor technische analyse om H1-tags, alt-teksten van afbeeldingen en metagegevensstructuur te verifiëren.' },
|
|
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: 'Hoe inhoud te optimaliseren voor 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: 'Analyseer de zoekwoorddichtheid, leesbaarheid en technische HTML-structuur van uw teksten in realtime, zonder gegevens naar een server te verzenden.',
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const ui: SeoContentOptimizerUI = {
|
|
58
|
+
tabText: 'Tekstanalyse',
|
|
59
|
+
tabHtml: 'Technische HTML-analyse',
|
|
60
|
+
textareaPlaceholder: 'Schrijf uw tekst of plak hier uw HTML-code...',
|
|
61
|
+
statsChars: 'Tekens',
|
|
62
|
+
statsWords: 'Woorden',
|
|
63
|
+
statsReading: 'Leestijd',
|
|
64
|
+
statsSentences: 'Zinnen',
|
|
65
|
+
checklistTitle: 'Optimalisatie-checklist',
|
|
66
|
+
keywordsTitle: 'Zoekwoorddichtheid',
|
|
67
|
+
technicalTitle: 'Technische HTML-analyse',
|
|
68
|
+
h1Label: 'H1 gedetecteerd',
|
|
69
|
+
linksLabel: 'Links (a)',
|
|
70
|
+
imgsLabel: 'Afbeeldingen (img)',
|
|
71
|
+
altsLabel: 'Ontbrekende alts',
|
|
72
|
+
emptyState: 'Geen gegevens',
|
|
73
|
+
analyzing: 'Analyseren...',
|
|
74
|
+
checkInsufficient: 'Onvoldoende lengte (< 300 woorden)',
|
|
75
|
+
checkPillar: 'Uitstekende pillar-content (> 900 woorden)',
|
|
76
|
+
checkGoodLength: 'Goede lengte voor SEO',
|
|
77
|
+
checkLongSentences: 'Te veel lange zinnen (> 25% van de tekst)',
|
|
78
|
+
checkGoodReadability: 'Optimale leesbaarheid van zinnen',
|
|
79
|
+
checkLongParagraphs: 'Splits zeer lange alinea\'s (> 150 woorden)',
|
|
80
|
+
checkMissingH1: 'H1-tag ontbreekt',
|
|
81
|
+
checkMultipleH1: 'Meerdere H1-tags gedetecteerd',
|
|
82
|
+
checkMissingH2: 'Subkoppen (H2) ontbreken',
|
|
83
|
+
checkMissingTitle: 'Meta title-tag ontbreekt',
|
|
84
|
+
stopWords: JSON.stringify(['de', 'het', 'een', 'en', 'of', 'maar', 'in', 'op', 'bij', 'te', 'voor', 'van', 'met', 'door', 'uit', 'als', 'is', 'was', 'zijn', 'waren', 'worden', 'geweest', 'hebben', 'heeft', 'had', 'doen', 'doet', 'deed', 'het', 'zijn', 'dit', 'dat', 'deze', 'die', 'niet', 'geen', 'zo', 'op', 'als', 'mijn', 'jouw', 'zijn', 'haar', 'onze', 'jullie', 'hun']),
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export const content: ToolLocaleContent<SeoContentOptimizerUI> = {
|
|
88
|
+
slug: 'seo-inhoud-optimizer',
|
|
89
|
+
title: 'SEO Content Optimizer',
|
|
90
|
+
description: 'Analyseer de zoekwoorddichtheid, leesbaarheid en technische HTML-structuur van uw teksten in realtime. Gratis en privé SEO-tool.',
|
|
91
|
+
ui,
|
|
92
|
+
faqTitle: 'Veelgestelde Vragen',
|
|
93
|
+
faq: faqData,
|
|
94
|
+
howTo: howToData,
|
|
95
|
+
bibliographyTitle: 'Referenties',
|
|
96
|
+
bibliography: [
|
|
97
|
+
{ name: "Google's SEO-starthandleiding", url: 'https://developers.google.com/search/docs/fundamentals/seo-starter-guide?hl=nl' },
|
|
98
|
+
{ name: 'Yoast SEO leesbaarheidscriteria', url: 'https://yoast.com/what-is-readability/' },
|
|
99
|
+
],
|
|
100
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
101
|
+
seo: [
|
|
102
|
+
{ type: 'title', level: 2, text: 'SEO Content Optimizer: Zoekwoorden, Leesbaarheid en Structuur' },
|
|
103
|
+
{
|
|
104
|
+
type: 'paragraph',
|
|
105
|
+
html: 'De kwaliteit van de inhoud wordt niet langer uitsluitend gemeten aan de hand van de zoekwoorden die u opneemt, maar aan de hand van de manier waarop u uw informatie structureert, zodat deze begrijpelijk is voor zowel mensen als Google-crawlers. Onze <strong>realtime SEO-analysetool</strong> geeft u volledige controle over zoekwoorddichtheid, leesbaarheid van alinea\'s en fundamentele technische HTML-elementen.',
|
|
106
|
+
},
|
|
107
|
+
{ type: 'title', level: 3, text: 'Zoekwoorddichtheid en semantische relevantie' },
|
|
108
|
+
{
|
|
109
|
+
type: 'paragraph',
|
|
110
|
+
html: 'De <strong>zoekwoorddichtheid</strong> geeft aan hoe vaak een term voorkomt in vergelijking met de rest van de tekst. Overmatige herhaling activeert <em>keyword stuffing</em>-filters, terwijl een zeer lage dichtheid het voor zoekmachines moeilijk kan maken om het centrale onderwerp van uw artikel te identificeren.',
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
type: 'list',
|
|
114
|
+
items: [
|
|
115
|
+
'<strong>Relevantie-analyse:</strong> Identificeer of de meest herhaalde woorden overeenkomen met uw zoekintentie.',
|
|
116
|
+
'<strong>Voorkomen van boetes:</strong> Vermijd het overmatig herhalen van termen die als spam kunnen overkomen.',
|
|
117
|
+
'<strong>Semantische optimalisatie:</strong> Vind de balans tussen technische termen en natuurlijke taal.',
|
|
118
|
+
],
|
|
119
|
+
},
|
|
120
|
+
{ type: 'title', level: 3, text: 'Leesbaarheid in de Yoast-stijl' },
|
|
121
|
+
{
|
|
122
|
+
type: 'paragraph',
|
|
123
|
+
html: 'Leesbaarheid is een indirecte maar cruciale rankingfactor. Als gebruikers vertrekken omdat alinea\'s eindeloze tekstblokken zijn, daalt uw <em>Dwell Time</em>. De analyzer detecteert lange zinnen (meer dan 20 woorden), alinea\'s van meer dan 150 woorden en controleert op subkoppen.',
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
type: 'tip',
|
|
127
|
+
title: 'Leestijd',
|
|
128
|
+
html: 'De meeste gebruikers beslissen binnen 10 seconden of ze een artikel gaan lezen. Het kennen van de geschatte leestijd (berekend op een gemiddelde van 200 woorden per minuut) helpt het bouncepercentage te verlagen door de verwachtingen van de lezer te managen.',
|
|
129
|
+
},
|
|
130
|
+
{ type: 'title', level: 3, text: 'Technische HTML-analyse' },
|
|
131
|
+
{
|
|
132
|
+
type: 'paragraph',
|
|
133
|
+
html: 'Plak uw broncode om belangrijke elementen te verifiëren: uniciteit van de <strong>H1</strong>, aanwezigheid van H2/H3-subkoppen, afbeeldingen zonder <code>alt</code>-attributen en het bestaan van de <code>title</code>-tag. Alle verwerking vindt plaats in uw browser zonder gegevens naar een server te verzenden.',
|
|
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: '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
|
+
};
|