@jjlmoya/utils-developer 1.29.1 → 1.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +70 -70
- package/src/category/seo.astro +1 -1
- package/src/components/PreviewNavSidebar.astro +1 -1
- package/src/components/PreviewToolbar.astro +1 -1
- package/src/data.ts +1 -1
- package/src/env.d.ts +1 -1
- package/src/layouts/PreviewLayout.astro +1 -1
- package/src/pages/[locale]/[slug].astro +162 -162
- package/src/pages/index.astro +1 -1
- package/src/tests/entry_contract.test.ts +8 -2
- package/src/tests/faq_count.test.ts +1 -1
- package/src/tests/i18n_coverage.test.ts +2 -6
- package/src/tests/inverted_punctuation.test.ts +113 -113
- package/src/tests/mocks/astro_mock.js +1 -1
- package/src/tests/no_h1_in_components.test.ts +1 -1
- package/src/tests/promote_this_website_i18n.test.ts +33 -0
- package/src/tests/slug_language_code_format.test.ts +25 -25
- package/src/tests/slug_uniqueness.test.ts +86 -86
- package/src/tests/tool_validation.test.ts +15 -15
- package/src/tool/aspectRatio/i18n/de.ts +164 -164
- package/src/tool/aspectRatio/i18n/ja.ts +1 -1
- package/src/tool/aspectRatio/i18n/ko.ts +1 -1
- package/src/tool/aspectRatio/i18n/pl.ts +164 -164
- package/src/tool/aspectRatio/i18n/ru.ts +164 -164
- package/src/tool/aspectRatio/i18n/zh.ts +165 -165
- package/src/tool/aspectRatio/seo.astro +15 -15
- package/src/tool/calculadoraTiempoDatos/i18n/de.ts +143 -143
- package/src/tool/calculadoraTiempoDatos/i18n/ja.ts +1 -1
- package/src/tool/calculadoraTiempoDatos/i18n/ko.ts +1 -1
- package/src/tool/calculadoraTiempoDatos/i18n/pl.ts +143 -143
- package/src/tool/calculadoraTiempoDatos/i18n/ru.ts +144 -144
- package/src/tool/calculadoraTiempoDatos/i18n/sv.ts +143 -143
- package/src/tool/calculadoraTiempoDatos/i18n/zh.ts +144 -144
- package/src/tool/calculadoraTiempoDatos/seo.astro +15 -15
- package/src/tool/colorConverter/i18n/de.ts +120 -120
- package/src/tool/colorConverter/i18n/ja.ts +1 -1
- package/src/tool/colorConverter/i18n/ko.ts +1 -1
- package/src/tool/colorConverter/i18n/ru.ts +120 -120
- package/src/tool/colorConverter/i18n/zh.ts +1 -1
- package/src/tool/colorConverter/seo.astro +15 -15
- package/src/tool/conversorExcelCsvHtml/i18n/ja.ts +1 -1
- package/src/tool/conversorExcelCsvHtml/i18n/ko.ts +1 -1
- package/src/tool/conversorExcelCsvHtml/i18n/pl.ts +124 -124
- package/src/tool/conversorExcelCsvHtml/i18n/ru.ts +124 -124
- package/src/tool/conversorExcelCsvHtml/i18n/zh.ts +125 -125
- package/src/tool/conversorExcelCsvHtml/seo.astro +15 -15
- package/src/tool/cronGenerator/i18n/ja.ts +1 -1
- package/src/tool/cronGenerator/i18n/ko.ts +1 -1
- package/src/tool/cronGenerator/i18n/zh.ts +183 -183
- package/src/tool/cronGenerator/seo.astro +15 -15
- package/src/tool/cssSpecificityCalculator/i18n/ja.ts +1 -1
- package/src/tool/cssSpecificityCalculator/i18n/ko.ts +1 -1
- package/src/tool/cssSpecificityCalculator/i18n/zh.ts +1 -1
- package/src/tool/cssSpecificityCalculator/seo.astro +15 -15
- package/src/tool/cssToInlineConverter/i18n/ja.ts +1 -1
- package/src/tool/cssToInlineConverter/i18n/ko.ts +1 -1
- package/src/tool/cssToInlineConverter/i18n/zh.ts +1 -1
- package/src/tool/cssToInlineConverter/seo.astro +15 -15
- package/src/tool/duplicateCssRemover/i18n/ja.ts +1 -1
- package/src/tool/duplicateCssRemover/i18n/ko.ts +1 -1
- package/src/tool/duplicateCssRemover/i18n/zh.ts +1 -1
- package/src/tool/duplicateCssRemover/seo.astro +15 -15
- package/src/tool/generadorSecurityTxt/i18n/ja.ts +1 -1
- package/src/tool/generadorSecurityTxt/i18n/ko.ts +1 -1
- package/src/tool/generadorSecurityTxt/i18n/zh.ts +1 -1
- package/src/tool/generadorSecurityTxt/seo.astro +15 -15
- package/src/tool/hashGenerator/i18n/ja.ts +1 -1
- package/src/tool/hashGenerator/i18n/ko.ts +1 -1
- package/src/tool/hashGenerator/seo.astro +15 -15
- package/src/tool/inspectorCertificadosSsl/i18n/ja.ts +1 -1
- package/src/tool/inspectorCertificadosSsl/i18n/ko.ts +1 -1
- package/src/tool/inspectorCertificadosSsl/i18n/zh.ts +1 -1
- package/src/tool/inspectorCertificadosSsl/seo.astro +15 -15
- package/src/tool/jsonFormatter/seo.astro +15 -15
- package/src/tool/jwtDecoder/i18n/es.ts +248 -248
- package/src/tool/jwtDecoder/i18n/fr.ts +248 -248
- package/src/tool/jwtDecoder/i18n/tr.ts +248 -248
- package/src/tool/keycode/seo.astro +15 -15
- package/src/tool/llmCostCalculator/i18n/fr.ts +149 -149
- package/src/tool/llmCostCalculator/i18n/ja.ts +1 -1
- package/src/tool/llmCostCalculator/i18n/ko.ts +1 -1
- package/src/tool/llmCostCalculator/seo.astro +15 -15
- package/src/tool/mobileMockupGenerator/i18n/ja.ts +1 -1
- package/src/tool/mobileMockupGenerator/i18n/ko.ts +1 -1
- package/src/tool/mobileMockupGenerator/i18n/zh.ts +1 -1
- package/src/tool/mobileMockupGenerator/seo.astro +15 -15
- package/src/tool/musicalTypography/i18n/ja.ts +1 -1
- package/src/tool/musicalTypography/i18n/ko.ts +1 -1
- package/src/tool/musicalTypography/i18n/zh.ts +1 -1
- package/src/tool/musicalTypography/seo.astro +15 -15
- package/src/tool/placeholderGenerator/i18n/ja.ts +1 -1
- package/src/tool/placeholderGenerator/i18n/ko.ts +1 -1
- package/src/tool/placeholderGenerator/i18n/zh.ts +1 -1
- package/src/tool/placeholderGenerator/seo.astro +15 -15
- package/src/tool/promoteThisWebsite/entry.ts +13 -0
- package/src/tool/promoteThisWebsite/i18n/de.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/fr.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/id.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/it.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/ja.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/ko.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/nl.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/pl.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/pt.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/ru.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/sv.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/tr.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/zh.ts +95 -0
- package/src/tool/promptLibrary/i18n/ja.ts +1 -1
- package/src/tool/promptLibrary/i18n/ko.ts +1 -1
- package/src/tool/promptLibrary/i18n/zh.ts +1 -1
- package/src/tool/promptLibrary/seo.astro +15 -15
- package/src/tool/readabilityCalculator/i18n/ja.ts +1 -1
- package/src/tool/readabilityCalculator/i18n/ko.ts +1 -1
- package/src/tool/readabilityCalculator/i18n/zh.ts +1 -1
- package/src/tool/readabilityCalculator/seo.astro +15 -15
- package/src/tool/serpPixelSimulator/entry.ts +30 -30
- package/src/tool/serpPixelSimulator/i18n/en.ts +211 -211
- package/src/tool/serpPixelSimulator/i18n/fr.ts +214 -214
- package/src/tool/serpPixelSimulator/i18n/ru.ts +214 -214
- package/src/tool/serpPixelSimulator/logic.ts +18 -18
- package/src/tool/serpPixelSimulator/serp-pixel-simulator.css +195 -195
- package/src/tool/svgSanitizer/i18n/ja.ts +1 -1
- package/src/tool/svgSanitizer/i18n/ko.ts +1 -1
- package/src/tool/svgSanitizer/seo.astro +15 -15
- package/src/tool/svgToCss/i18n/ja.ts +1 -1
- package/src/tool/svgToCss/i18n/ko.ts +1 -1
- package/src/tool/svgToCss/seo.astro +15 -15
- package/src/tool/urlCleaner/i18n/ja.ts +1 -1
- package/src/tool/urlCleaner/i18n/ko.ts +1 -1
- package/src/tool/urlCleaner/i18n/zh.ts +1 -1
- package/src/tool/urlCleaner/seo.astro +15 -15
- package/src/tool/urlEncoderDecoder/i18n/es.ts +146 -146
- package/src/tool/urlEncoderDecoder/i18n/ko.ts +1 -1
- package/src/tool/urlEncoderDecoder/seo.astro +15 -15
- package/src/tool/utmGenerator/i18n/ja.ts +1 -1
- package/src/tool/utmGenerator/i18n/ko.ts +1 -1
- package/src/tool/utmGenerator/i18n/zh.ts +1 -1
- package/src/tool/utmGenerator/seo.astro +15 -15
- package/src/types.ts +1 -1
|
@@ -1,248 +1,248 @@
|
|
|
1
|
-
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
-
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
-
import type { JwtDecoderUI } from '../ui';
|
|
4
|
-
import { bibliography } from '../bibliography';
|
|
5
|
-
|
|
6
|
-
const slug = 'jwt-cozucu-ayristirici-ve-claims-denetleyicisi';
|
|
7
|
-
const title = 'JWT Cozucu, Ayrıstırıcı ve Claims Denetleyicisi';
|
|
8
|
-
const description = 'Bir JSON Web Token yapıstırın, header ve payload kısmını anında cozun, kayıtlı claimsleri inceleyin, suresi dolmus tokenleri tespit edin ve kimlik dogrulama akıslarında hata ayıklamak icin temiz JSON kopyalayın.';
|
|
9
|
-
|
|
10
|
-
const howTo = [
|
|
11
|
-
{
|
|
12
|
-
name: 'JWTyi yapıstırın',
|
|
13
|
-
text: 'Authorization header, cookie, log kaydı veya kimlik saglayıcıdan bir token kopyalayın ve giris alanına yapıstırın.',
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
name: 'Cozulmus header ve payloadı okuyun',
|
|
17
|
-
text: 'Arac tokeni header, payload ve imza olarak ayırır, ardından hızlı inceleme icin JSON segmentlerini ayrı panellerde gosterir.',
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
name: 'Onemli claimsleri kontrol edin',
|
|
21
|
-
text: 'Unix zaman damgalarını manuel olarak donusturmeden algoritma, yayıncı, hedef kitle, konu, yayınlanma zamanı, gecerlilik baslangıcı ve sona erme suresini gozden gecirin.',
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
name: 'Ihtiyacınız olan veriyi kopyalayın',
|
|
25
|
-
text: 'Ekibinizle temizlenmis bir hata ayıklama anlık goruntusu paylasmanız gerektiginde bir cozulmus bolumu veya tum cozulmus cıktıyı kopyalayın.',
|
|
26
|
-
},
|
|
27
|
-
];
|
|
28
|
-
|
|
29
|
-
const faq = [
|
|
30
|
-
{
|
|
31
|
-
question: 'JWTnin cozulmesi tokenin gecerli oldugunu kanıtlar mı?',
|
|
32
|
-
answer: 'Hayır. Cozme islemi yalnızca base64url ile kodlanmıs header ve payloadı ortaya cıkarır. Bir token ancak imza, yayıncı, hedef kitle, sona erme suresi ve ilgili claimsler uygulama veya kimlik saglayıcı tarafından dogrulandıktan sonra guvenilirdir.',
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
question: 'Bu JWT cozucuyu access tokenler ve ID tokenler icin kullanabilir miyim?',
|
|
36
|
-
answer: 'Evet. Cozucu, standart uc parcalı JWT formatını kullandıkları surece OAuth access tokenleri, OpenID Connect ID tokenleri, oturum tokenleri ve servisler arası tokenleri incelemek icin kullanıslıdır.',
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
question: 'Imza paneli tokeni neden dogrulamıyor?',
|
|
40
|
-
answer: 'JWT dogrulaması dogru gizli anahtar, acık anahtar veya JWKS yapılandırması gerektirir. Bu arac kasıtlı olarak cozme ve incelemeye odaklanır, boylece gelistiriciler gorunur bir imza dizisinin gecerlilik kanıtıymıs gibi gostermeden token icerigini gorebilir.',
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
question: 'Bir JWTde hata ayıklarken ilk olarak neyi kontrol etmeliyim?',
|
|
44
|
-
answer: 'exp, nbf, iss, aud ve alg ile baslayın. Gercek uretim sorunlarının cogu suresi dolmus tokenlerden, saat kaymasından, yanlıs hedef kitle degerlerinden, beklenmedik yayıncı URLlerinden veya guvensiz algoritma varsayımlarından kaynaklanır.',
|
|
45
|
-
},
|
|
46
|
-
];
|
|
47
|
-
|
|
48
|
-
const ui: JwtDecoderUI = {
|
|
49
|
-
tokenLabel: 'JWT tokeni',
|
|
50
|
-
tokenPlaceholder: 'Buraya bir JWT yapıstırın: header.payload.imza',
|
|
51
|
-
sampleButton: 'Ornek yukle',
|
|
52
|
-
clearButton: 'Temizle',
|
|
53
|
-
statusWaiting: 'JSON header, payload ve claims icerigini cozmek icin bir token yapıstırın.',
|
|
54
|
-
statusValid: 'JWT basarıyla cozuldu.',
|
|
55
|
-
statusInvalid: 'Bu gecerli uc parcalı bir JWT gibi gorunmuyor.',
|
|
56
|
-
statusExpired: 'JWT cozuldu, ancak exp claim suresi dolmus.',
|
|
57
|
-
statusUnsigned: 'JWT cozuldu, ancak imzasız veya none algoritması kullanıyor.',
|
|
58
|
-
headerTitle: 'Header',
|
|
59
|
-
payloadTitle: 'Payload',
|
|
60
|
-
signatureTitle: 'Imza',
|
|
61
|
-
claimsTitle: 'Kayıtlı claimsler',
|
|
62
|
-
copyHeader: 'Cozulmus headeri kopyala',
|
|
63
|
-
copyPayload: 'Cozulmus payloadı kopyala',
|
|
64
|
-
copySignature: 'Imzayı kopyala',
|
|
65
|
-
copyAll: 'Tumunu kopyala',
|
|
66
|
-
copiedLabel: 'Kopyalandı',
|
|
67
|
-
invalidTokenTitle: 'Gecersiz JWT',
|
|
68
|
-
invalidTokenBody: 'Tokenin nokta ile ayrılmıs uc base64url segmenti oldugunu kontrol edin.',
|
|
69
|
-
invalidSegmentError: 'Tokenin nokta ile ayrılmıs uc base64url segmenti oldugunu kontrol edin.',
|
|
70
|
-
invalidDecodeError: 'Header veya payload gecerli JSON olarak cozulemedi.',
|
|
71
|
-
emptyJson: '{}',
|
|
72
|
-
signaturePresent: 'Imza segmenti mevcut; dogru anahtarla kimlik dogrulama katmanınızda dogrulayın.',
|
|
73
|
-
signatureMissing: 'Imza segmenti yok',
|
|
74
|
-
algorithmLabel: 'Algoritma',
|
|
75
|
-
typeLabel: 'Tur',
|
|
76
|
-
issuerLabel: 'Yayıncı',
|
|
77
|
-
subjectLabel: 'Konu',
|
|
78
|
-
audienceLabel: 'Hedef kitle',
|
|
79
|
-
issuedAtLabel: 'Yayınlanma',
|
|
80
|
-
notBeforeLabel: 'Gecerlilik baslangıcı',
|
|
81
|
-
expiresAtLabel: 'Sona erme',
|
|
82
|
-
claimMissing: 'Mevcut degil',
|
|
83
|
-
privacyNote: 'Cozme islemi tarayıcı oturumunuzda calısır. Guvenlik politikanız izin vermedikce uretim sırlarını hicbir araca yapıstırmayın.',
|
|
84
|
-
sampleToken: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJnYW1lYm9iLXVzZXItNDIiLCJuYW1lIjoiR2FtZUJvYiBEZXZlbG9wZXIiLCJpc3MiOiJodHRwczovL3d3dy5nYW1lYm9iLmRldiIsImF1ZCI6ImRldmVsb3Blci10b29scyIsImlhdCI6MTcxNzIwMDAwMCwibmJmIjoxNzE3MjAwMDAwLCJleHAiOjE4OTM0NTYwMDAsInJvbGUiOiJhZG1pbiJ9.demo-signature',
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
const faqSchema: WithContext<FAQPage> = {
|
|
88
|
-
'@context': 'https://schema.org',
|
|
89
|
-
'@type': 'FAQPage',
|
|
90
|
-
mainEntity: faq.map((item) => ({
|
|
91
|
-
'@type': 'Question',
|
|
92
|
-
name: item.question,
|
|
93
|
-
acceptedAnswer: {
|
|
94
|
-
'@type': 'Answer',
|
|
95
|
-
text: item.answer,
|
|
96
|
-
},
|
|
97
|
-
})),
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
const howToSchema: WithContext<HowTo> = {
|
|
101
|
-
'@context': 'https://schema.org',
|
|
102
|
-
'@type': 'HowTo',
|
|
103
|
-
name: title,
|
|
104
|
-
description,
|
|
105
|
-
step: howTo.map((step, index) => ({
|
|
106
|
-
'@type': 'HowToStep',
|
|
107
|
-
position: index + 1,
|
|
108
|
-
name: step.name,
|
|
109
|
-
text: step.text,
|
|
110
|
-
})),
|
|
111
|
-
};
|
|
112
|
-
|
|
113
|
-
const appSchema: WithContext<SoftwareApplication> = {
|
|
114
|
-
'@context': 'https://schema.org',
|
|
115
|
-
'@type': 'SoftwareApplication',
|
|
116
|
-
name: title,
|
|
117
|
-
description,
|
|
118
|
-
applicationCategory: 'DeveloperApplication',
|
|
119
|
-
operatingSystem: 'Any',
|
|
120
|
-
offers: {
|
|
121
|
-
'@type': 'Offer',
|
|
122
|
-
price: '0',
|
|
123
|
-
priceCurrency: 'EUR',
|
|
124
|
-
},
|
|
125
|
-
inLanguage: 'tr',
|
|
126
|
-
};
|
|
127
|
-
|
|
128
|
-
export const content: ToolLocaleContent<JwtDecoderUI> = {
|
|
129
|
-
slug,
|
|
130
|
-
title,
|
|
131
|
-
description,
|
|
132
|
-
ui,
|
|
133
|
-
faqTitle: 'JWT cozucu SSS',
|
|
134
|
-
faq,
|
|
135
|
-
bibliographyTitle: 'JWT spesifikasyonları ve guvenlik referansları',
|
|
136
|
-
bibliography,
|
|
137
|
-
howTo,
|
|
138
|
-
schemas: [appSchema, faqSchema, howToSchema],
|
|
139
|
-
seo: [
|
|
140
|
-
{
|
|
141
|
-
type: 'title',
|
|
142
|
-
text: 'JWTleri guvenlik baglamını kaybetmeden cozun',
|
|
143
|
-
level: 2,
|
|
144
|
-
},
|
|
145
|
-
{
|
|
146
|
-
type: 'paragraph',
|
|
147
|
-
html: 'Bir JSON Web Token kucuk gorunur, ancak cogu zaman bir kimlik dogrulama hatasını acıklayan tam ayrıntıyı tasır: imza algoritması, yayıncı, hedef kitle, konu, yayınlanma zamanı, gecerlilik baslangıc zamanı, sona erme suresi ve uygulamaya ozel yetkilendirme claimsleri. Bu <strong>JWT cozucu, ayrıstırıcı ve claims denetleyicisi</strong>, uc token segmentini okunabilir JSONa donusturerek kimlik dogrulama akıslarında daha hızlı hata ayıklamanıza olanak tanır.',
|
|
148
|
-
},
|
|
149
|
-
{
|
|
150
|
-
type: 'diagnostic',
|
|
151
|
-
variant: 'warning',
|
|
152
|
-
title: 'Cozulmus olması guvenilir oldugu anlamına gelmez',
|
|
153
|
-
html: 'Herkes bir JWTyi base64url olarak cozebilir. Guven, yalnızca uygulamanız imzayı dogru gizli anahtar, acık anahtar veya JWKS ile dogruladıktan ve ardından yayıncı, hedef kitle, sona erme suresi ve alana ozgu claimsleri onayladıktan sonra baslar. Bu aracı verileri incelemek icin kullanın, bir tokeni gercek olarak kabul etmek icin degil.',
|
|
154
|
-
},
|
|
155
|
-
{
|
|
156
|
-
type: 'title',
|
|
157
|
-
text: 'Her JWT segmentinin size soyledikleri',
|
|
158
|
-
level: 3,
|
|
159
|
-
},
|
|
160
|
-
{
|
|
161
|
-
type: 'table',
|
|
162
|
-
headers: ['Segment', 'Tipik icerik', 'Hata ayıklama degeri'],
|
|
163
|
-
rows: [
|
|
164
|
-
['Header', 'Algoritma, token turu ve istege baglı anahtar kimligi', 'Tokenin HS256, RS256, ES256 veya baska bir dogrulama stratejisi bekleyip beklemedigini gosterir.'],
|
|
165
|
-
['Payload', 'Kayıtlı claimsler ve uygulama claimsleri', 'Kimlik, kiracı, kapsamlar, roller, sona erme suresi ve hedef kitle uyusmazlıklarını ortaya cıkarır.'],
|
|
166
|
-
['Imza', 'Base64url olarak kodlanmıs kriptografik imza baytları', 'Bir imza segmentinin var oldugunu onaylar, ancak baska bir yerde dogru anahtarla dogrulanmalıdır.'],
|
|
167
|
-
],
|
|
168
|
-
},
|
|
169
|
-
{
|
|
170
|
-
type: 'title',
|
|
171
|
-
text: 'Genellikle bozuk kimlik dogrulamayı acıklayan claimsler',
|
|
172
|
-
level: 3,
|
|
173
|
-
},
|
|
174
|
-
{
|
|
175
|
-
type: 'list',
|
|
176
|
-
items: [
|
|
177
|
-
'<strong>exp:</strong> tokenin suresi dolduysa, yenileme mantıgı veya saat ayarları yanlıs olabilir.',
|
|
178
|
-
'<strong>nbf:</strong> token henuz aktif degilse, sunucu ve kimlik saglayıcı saatleri senkronize olmayabilir.',
|
|
179
|
-
'<strong>iss:</strong> yayıncı URLsi yapılandırmadan farklıysa, token yanlıs kiracıdan veya ortamdan gelebilir.',
|
|
180
|
-
'<strong>aud:</strong> hedef kitle API tanımlayıcısıyla eslesmiyorsa, token baska bir kaynak icin olusturulmustur.',
|
|
181
|
-
'<strong>alg:</strong> algoritma beklenmedikse, dogrulayıcınız tokeni reddedebilir veya tehlikeli bir yapılandırma hatasını acıga cıkarabilir.',
|
|
182
|
-
],
|
|
183
|
-
},
|
|
184
|
-
{
|
|
185
|
-
type: 'title',
|
|
186
|
-
text: 'Gelistirme sırasında JWT ayrıstırıcı kullanım senaryoları',
|
|
187
|
-
level: 3,
|
|
188
|
-
},
|
|
189
|
-
{
|
|
190
|
-
type: 'comparative',
|
|
191
|
-
columns: 3,
|
|
192
|
-
items: [
|
|
193
|
-
{
|
|
194
|
-
title: 'On yuz hata ayıklama',
|
|
195
|
-
description: 'Kapsamları, rolleri ve profil claimslerini dogrulamak icin oturum acıldıktan sonra alınan ID tokenleri ve access tokenleri inceleyin.',
|
|
196
|
-
icon: 'mdi:monitor-dashboard',
|
|
197
|
-
points: ['Profil claimslerini kontrol edin', 'Kapsamları ve rolleri dogrulayın', 'Oturum acma ortamlarını karsılastırın'],
|
|
198
|
-
},
|
|
199
|
-
{
|
|
200
|
-
title: 'Arka uc API QA',
|
|
201
|
-
description: 'Beklenen yayıncı ve hedef kitle degerlerini, Authorization headerda gercekte gonderilen token ile karsılastırın.',
|
|
202
|
-
icon: 'mdi:api',
|
|
203
|
-
highlight: true,
|
|
204
|
-
points: ['Hedef kitle yapısını dogrulayın', 'Yayıncı uyusmazlıklarını tespit edin', 'Bearer tokenleri inceleyin'],
|
|
205
|
-
},
|
|
206
|
-
{
|
|
207
|
-
title: 'Kimlik saglayıcı kurulumu',
|
|
208
|
-
description: 'Auth0, Azure AD, Cognito, Keycloak veya ozel bir saglayıcıdan gelen claimslerin uygulamanızın bekledigi sekilde yapılandırılıp yapılandırılmadıgını kontrol edin.',
|
|
209
|
-
icon: 'mdi:account-key',
|
|
210
|
-
points: ['Kiracı verilerini gozden gecirin', 'Ozel claimsleri kontrol edin', 'Saglayıcı eslestirmelerini karsılastırın'],
|
|
211
|
-
},
|
|
212
|
-
],
|
|
213
|
-
},
|
|
214
|
-
{
|
|
215
|
-
type: 'title',
|
|
216
|
-
text: 'Bu denetleyicinin belirgin hale getirdigi yaygın JWT hataları',
|
|
217
|
-
level: 3,
|
|
218
|
-
},
|
|
219
|
-
{
|
|
220
|
-
type: 'proscons',
|
|
221
|
-
title: 'Hızlı kontroller ve guven kararları',
|
|
222
|
-
items: [
|
|
223
|
-
{
|
|
224
|
-
pro: 'Hatalı tokenleri hemen gorun.',
|
|
225
|
-
con: 'Beklenen hedef kitlenizi veya yayıncınızı bilemez.',
|
|
226
|
-
},
|
|
227
|
-
{
|
|
228
|
-
pro: 'Unix zaman damgası claimslerini okunabilir tarihlere donusturun.',
|
|
229
|
-
con: 'Gercek anahtar materyali olmadan bir imzayı dogrulayamaz.',
|
|
230
|
-
},
|
|
231
|
-
{
|
|
232
|
-
pro: 'Eksik yayıncı, hedef kitle, konu veya tur degerlerini tespit edin.',
|
|
233
|
-
con: 'Kapsamların ve rollerin uygulamanız icin guvenli oldugunu kanıtlayamaz.',
|
|
234
|
-
},
|
|
235
|
-
],
|
|
236
|
-
},
|
|
237
|
-
{
|
|
238
|
-
type: 'summary',
|
|
239
|
-
title: 'En iyi uygulama is akısı',
|
|
240
|
-
items: [
|
|
241
|
-
'Istemcinin veya API\'nin gercekte ne aldıgını anlamak icin tokeni cozun.',
|
|
242
|
-
'Uygulama mantıgına dalmadan once exp, nbf, iss, aud, sub ve algyi kontrol edin.',
|
|
243
|
-
'Imzaları ve guven kararlarını yalnızca kimlik dogrulama katmanınızda dogrulayın.',
|
|
244
|
-
'Hassas uretim JWTlerini biletlerde, loglarda veya ekran goruntulerinde paylasmaktan kacının.',
|
|
245
|
-
],
|
|
246
|
-
},
|
|
247
|
-
],
|
|
248
|
-
};
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { JwtDecoderUI } from '../ui';
|
|
4
|
+
import { bibliography } from '../bibliography';
|
|
5
|
+
|
|
6
|
+
const slug = 'jwt-cozucu-ayristirici-ve-claims-denetleyicisi';
|
|
7
|
+
const title = 'JWT Cozucu, Ayrıstırıcı ve Claims Denetleyicisi';
|
|
8
|
+
const description = 'Bir JSON Web Token yapıstırın, header ve payload kısmını anında cozun, kayıtlı claimsleri inceleyin, suresi dolmus tokenleri tespit edin ve kimlik dogrulama akıslarında hata ayıklamak icin temiz JSON kopyalayın.';
|
|
9
|
+
|
|
10
|
+
const howTo = [
|
|
11
|
+
{
|
|
12
|
+
name: 'JWTyi yapıstırın',
|
|
13
|
+
text: 'Authorization header, cookie, log kaydı veya kimlik saglayıcıdan bir token kopyalayın ve giris alanına yapıstırın.',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
name: 'Cozulmus header ve payloadı okuyun',
|
|
17
|
+
text: 'Arac tokeni header, payload ve imza olarak ayırır, ardından hızlı inceleme icin JSON segmentlerini ayrı panellerde gosterir.',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: 'Onemli claimsleri kontrol edin',
|
|
21
|
+
text: 'Unix zaman damgalarını manuel olarak donusturmeden algoritma, yayıncı, hedef kitle, konu, yayınlanma zamanı, gecerlilik baslangıcı ve sona erme suresini gozden gecirin.',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: 'Ihtiyacınız olan veriyi kopyalayın',
|
|
25
|
+
text: 'Ekibinizle temizlenmis bir hata ayıklama anlık goruntusu paylasmanız gerektiginde bir cozulmus bolumu veya tum cozulmus cıktıyı kopyalayın.',
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
const faq = [
|
|
30
|
+
{
|
|
31
|
+
question: 'JWTnin cozulmesi tokenin gecerli oldugunu kanıtlar mı?',
|
|
32
|
+
answer: 'Hayır. Cozme islemi yalnızca base64url ile kodlanmıs header ve payloadı ortaya cıkarır. Bir token ancak imza, yayıncı, hedef kitle, sona erme suresi ve ilgili claimsler uygulama veya kimlik saglayıcı tarafından dogrulandıktan sonra guvenilirdir.',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
question: 'Bu JWT cozucuyu access tokenler ve ID tokenler icin kullanabilir miyim?',
|
|
36
|
+
answer: 'Evet. Cozucu, standart uc parcalı JWT formatını kullandıkları surece OAuth access tokenleri, OpenID Connect ID tokenleri, oturum tokenleri ve servisler arası tokenleri incelemek icin kullanıslıdır.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
question: 'Imza paneli tokeni neden dogrulamıyor?',
|
|
40
|
+
answer: 'JWT dogrulaması dogru gizli anahtar, acık anahtar veya JWKS yapılandırması gerektirir. Bu arac kasıtlı olarak cozme ve incelemeye odaklanır, boylece gelistiriciler gorunur bir imza dizisinin gecerlilik kanıtıymıs gibi gostermeden token icerigini gorebilir.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
question: 'Bir JWTde hata ayıklarken ilk olarak neyi kontrol etmeliyim?',
|
|
44
|
+
answer: 'exp, nbf, iss, aud ve alg ile baslayın. Gercek uretim sorunlarının cogu suresi dolmus tokenlerden, saat kaymasından, yanlıs hedef kitle degerlerinden, beklenmedik yayıncı URLlerinden veya guvensiz algoritma varsayımlarından kaynaklanır.',
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
const ui: JwtDecoderUI = {
|
|
49
|
+
tokenLabel: 'JWT tokeni',
|
|
50
|
+
tokenPlaceholder: 'Buraya bir JWT yapıstırın: header.payload.imza',
|
|
51
|
+
sampleButton: 'Ornek yukle',
|
|
52
|
+
clearButton: 'Temizle',
|
|
53
|
+
statusWaiting: 'JSON header, payload ve claims icerigini cozmek icin bir token yapıstırın.',
|
|
54
|
+
statusValid: 'JWT basarıyla cozuldu.',
|
|
55
|
+
statusInvalid: 'Bu gecerli uc parcalı bir JWT gibi gorunmuyor.',
|
|
56
|
+
statusExpired: 'JWT cozuldu, ancak exp claim suresi dolmus.',
|
|
57
|
+
statusUnsigned: 'JWT cozuldu, ancak imzasız veya none algoritması kullanıyor.',
|
|
58
|
+
headerTitle: 'Header',
|
|
59
|
+
payloadTitle: 'Payload',
|
|
60
|
+
signatureTitle: 'Imza',
|
|
61
|
+
claimsTitle: 'Kayıtlı claimsler',
|
|
62
|
+
copyHeader: 'Cozulmus headeri kopyala',
|
|
63
|
+
copyPayload: 'Cozulmus payloadı kopyala',
|
|
64
|
+
copySignature: 'Imzayı kopyala',
|
|
65
|
+
copyAll: 'Tumunu kopyala',
|
|
66
|
+
copiedLabel: 'Kopyalandı',
|
|
67
|
+
invalidTokenTitle: 'Gecersiz JWT',
|
|
68
|
+
invalidTokenBody: 'Tokenin nokta ile ayrılmıs uc base64url segmenti oldugunu kontrol edin.',
|
|
69
|
+
invalidSegmentError: 'Tokenin nokta ile ayrılmıs uc base64url segmenti oldugunu kontrol edin.',
|
|
70
|
+
invalidDecodeError: 'Header veya payload gecerli JSON olarak cozulemedi.',
|
|
71
|
+
emptyJson: '{}',
|
|
72
|
+
signaturePresent: 'Imza segmenti mevcut; dogru anahtarla kimlik dogrulama katmanınızda dogrulayın.',
|
|
73
|
+
signatureMissing: 'Imza segmenti yok',
|
|
74
|
+
algorithmLabel: 'Algoritma',
|
|
75
|
+
typeLabel: 'Tur',
|
|
76
|
+
issuerLabel: 'Yayıncı',
|
|
77
|
+
subjectLabel: 'Konu',
|
|
78
|
+
audienceLabel: 'Hedef kitle',
|
|
79
|
+
issuedAtLabel: 'Yayınlanma',
|
|
80
|
+
notBeforeLabel: 'Gecerlilik baslangıcı',
|
|
81
|
+
expiresAtLabel: 'Sona erme',
|
|
82
|
+
claimMissing: 'Mevcut degil',
|
|
83
|
+
privacyNote: 'Cozme islemi tarayıcı oturumunuzda calısır. Guvenlik politikanız izin vermedikce uretim sırlarını hicbir araca yapıstırmayın.',
|
|
84
|
+
sampleToken: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJnYW1lYm9iLXVzZXItNDIiLCJuYW1lIjoiR2FtZUJvYiBEZXZlbG9wZXIiLCJpc3MiOiJodHRwczovL3d3dy5nYW1lYm9iLmRldiIsImF1ZCI6ImRldmVsb3Blci10b29scyIsImlhdCI6MTcxNzIwMDAwMCwibmJmIjoxNzE3MjAwMDAwLCJleHAiOjE4OTM0NTYwMDAsInJvbGUiOiJhZG1pbiJ9.demo-signature',
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
88
|
+
'@context': 'https://schema.org',
|
|
89
|
+
'@type': 'FAQPage',
|
|
90
|
+
mainEntity: faq.map((item) => ({
|
|
91
|
+
'@type': 'Question',
|
|
92
|
+
name: item.question,
|
|
93
|
+
acceptedAnswer: {
|
|
94
|
+
'@type': 'Answer',
|
|
95
|
+
text: item.answer,
|
|
96
|
+
},
|
|
97
|
+
})),
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
const howToSchema: WithContext<HowTo> = {
|
|
101
|
+
'@context': 'https://schema.org',
|
|
102
|
+
'@type': 'HowTo',
|
|
103
|
+
name: title,
|
|
104
|
+
description,
|
|
105
|
+
step: howTo.map((step, index) => ({
|
|
106
|
+
'@type': 'HowToStep',
|
|
107
|
+
position: index + 1,
|
|
108
|
+
name: step.name,
|
|
109
|
+
text: step.text,
|
|
110
|
+
})),
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
114
|
+
'@context': 'https://schema.org',
|
|
115
|
+
'@type': 'SoftwareApplication',
|
|
116
|
+
name: title,
|
|
117
|
+
description,
|
|
118
|
+
applicationCategory: 'DeveloperApplication',
|
|
119
|
+
operatingSystem: 'Any',
|
|
120
|
+
offers: {
|
|
121
|
+
'@type': 'Offer',
|
|
122
|
+
price: '0',
|
|
123
|
+
priceCurrency: 'EUR',
|
|
124
|
+
},
|
|
125
|
+
inLanguage: 'tr',
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
export const content: ToolLocaleContent<JwtDecoderUI> = {
|
|
129
|
+
slug,
|
|
130
|
+
title,
|
|
131
|
+
description,
|
|
132
|
+
ui,
|
|
133
|
+
faqTitle: 'JWT cozucu SSS',
|
|
134
|
+
faq,
|
|
135
|
+
bibliographyTitle: 'JWT spesifikasyonları ve guvenlik referansları',
|
|
136
|
+
bibliography,
|
|
137
|
+
howTo,
|
|
138
|
+
schemas: [appSchema, faqSchema, howToSchema],
|
|
139
|
+
seo: [
|
|
140
|
+
{
|
|
141
|
+
type: 'title',
|
|
142
|
+
text: 'JWTleri guvenlik baglamını kaybetmeden cozun',
|
|
143
|
+
level: 2,
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
type: 'paragraph',
|
|
147
|
+
html: 'Bir JSON Web Token kucuk gorunur, ancak cogu zaman bir kimlik dogrulama hatasını acıklayan tam ayrıntıyı tasır: imza algoritması, yayıncı, hedef kitle, konu, yayınlanma zamanı, gecerlilik baslangıc zamanı, sona erme suresi ve uygulamaya ozel yetkilendirme claimsleri. Bu <strong>JWT cozucu, ayrıstırıcı ve claims denetleyicisi</strong>, uc token segmentini okunabilir JSONa donusturerek kimlik dogrulama akıslarında daha hızlı hata ayıklamanıza olanak tanır.',
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
type: 'diagnostic',
|
|
151
|
+
variant: 'warning',
|
|
152
|
+
title: 'Cozulmus olması guvenilir oldugu anlamına gelmez',
|
|
153
|
+
html: 'Herkes bir JWTyi base64url olarak cozebilir. Guven, yalnızca uygulamanız imzayı dogru gizli anahtar, acık anahtar veya JWKS ile dogruladıktan ve ardından yayıncı, hedef kitle, sona erme suresi ve alana ozgu claimsleri onayladıktan sonra baslar. Bu aracı verileri incelemek icin kullanın, bir tokeni gercek olarak kabul etmek icin degil.',
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
type: 'title',
|
|
157
|
+
text: 'Her JWT segmentinin size soyledikleri',
|
|
158
|
+
level: 3,
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
type: 'table',
|
|
162
|
+
headers: ['Segment', 'Tipik icerik', 'Hata ayıklama degeri'],
|
|
163
|
+
rows: [
|
|
164
|
+
['Header', 'Algoritma, token turu ve istege baglı anahtar kimligi', 'Tokenin HS256, RS256, ES256 veya baska bir dogrulama stratejisi bekleyip beklemedigini gosterir.'],
|
|
165
|
+
['Payload', 'Kayıtlı claimsler ve uygulama claimsleri', 'Kimlik, kiracı, kapsamlar, roller, sona erme suresi ve hedef kitle uyusmazlıklarını ortaya cıkarır.'],
|
|
166
|
+
['Imza', 'Base64url olarak kodlanmıs kriptografik imza baytları', 'Bir imza segmentinin var oldugunu onaylar, ancak baska bir yerde dogru anahtarla dogrulanmalıdır.'],
|
|
167
|
+
],
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
type: 'title',
|
|
171
|
+
text: 'Genellikle bozuk kimlik dogrulamayı acıklayan claimsler',
|
|
172
|
+
level: 3,
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
type: 'list',
|
|
176
|
+
items: [
|
|
177
|
+
'<strong>exp:</strong> tokenin suresi dolduysa, yenileme mantıgı veya saat ayarları yanlıs olabilir.',
|
|
178
|
+
'<strong>nbf:</strong> token henuz aktif degilse, sunucu ve kimlik saglayıcı saatleri senkronize olmayabilir.',
|
|
179
|
+
'<strong>iss:</strong> yayıncı URLsi yapılandırmadan farklıysa, token yanlıs kiracıdan veya ortamdan gelebilir.',
|
|
180
|
+
'<strong>aud:</strong> hedef kitle API tanımlayıcısıyla eslesmiyorsa, token baska bir kaynak icin olusturulmustur.',
|
|
181
|
+
'<strong>alg:</strong> algoritma beklenmedikse, dogrulayıcınız tokeni reddedebilir veya tehlikeli bir yapılandırma hatasını acıga cıkarabilir.',
|
|
182
|
+
],
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
type: 'title',
|
|
186
|
+
text: 'Gelistirme sırasında JWT ayrıstırıcı kullanım senaryoları',
|
|
187
|
+
level: 3,
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
type: 'comparative',
|
|
191
|
+
columns: 3,
|
|
192
|
+
items: [
|
|
193
|
+
{
|
|
194
|
+
title: 'On yuz hata ayıklama',
|
|
195
|
+
description: 'Kapsamları, rolleri ve profil claimslerini dogrulamak icin oturum acıldıktan sonra alınan ID tokenleri ve access tokenleri inceleyin.',
|
|
196
|
+
icon: 'mdi:monitor-dashboard',
|
|
197
|
+
points: ['Profil claimslerini kontrol edin', 'Kapsamları ve rolleri dogrulayın', 'Oturum acma ortamlarını karsılastırın'],
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
title: 'Arka uc API QA',
|
|
201
|
+
description: 'Beklenen yayıncı ve hedef kitle degerlerini, Authorization headerda gercekte gonderilen token ile karsılastırın.',
|
|
202
|
+
icon: 'mdi:api',
|
|
203
|
+
highlight: true,
|
|
204
|
+
points: ['Hedef kitle yapısını dogrulayın', 'Yayıncı uyusmazlıklarını tespit edin', 'Bearer tokenleri inceleyin'],
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
title: 'Kimlik saglayıcı kurulumu',
|
|
208
|
+
description: 'Auth0, Azure AD, Cognito, Keycloak veya ozel bir saglayıcıdan gelen claimslerin uygulamanızın bekledigi sekilde yapılandırılıp yapılandırılmadıgını kontrol edin.',
|
|
209
|
+
icon: 'mdi:account-key',
|
|
210
|
+
points: ['Kiracı verilerini gozden gecirin', 'Ozel claimsleri kontrol edin', 'Saglayıcı eslestirmelerini karsılastırın'],
|
|
211
|
+
},
|
|
212
|
+
],
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
type: 'title',
|
|
216
|
+
text: 'Bu denetleyicinin belirgin hale getirdigi yaygın JWT hataları',
|
|
217
|
+
level: 3,
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
type: 'proscons',
|
|
221
|
+
title: 'Hızlı kontroller ve guven kararları',
|
|
222
|
+
items: [
|
|
223
|
+
{
|
|
224
|
+
pro: 'Hatalı tokenleri hemen gorun.',
|
|
225
|
+
con: 'Beklenen hedef kitlenizi veya yayıncınızı bilemez.',
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
pro: 'Unix zaman damgası claimslerini okunabilir tarihlere donusturun.',
|
|
229
|
+
con: 'Gercek anahtar materyali olmadan bir imzayı dogrulayamaz.',
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
pro: 'Eksik yayıncı, hedef kitle, konu veya tur degerlerini tespit edin.',
|
|
233
|
+
con: 'Kapsamların ve rollerin uygulamanız icin guvenli oldugunu kanıtlayamaz.',
|
|
234
|
+
},
|
|
235
|
+
],
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
type: 'summary',
|
|
239
|
+
title: 'En iyi uygulama is akısı',
|
|
240
|
+
items: [
|
|
241
|
+
'Istemcinin veya API\'nin gercekte ne aldıgını anlamak icin tokeni cozun.',
|
|
242
|
+
'Uygulama mantıgına dalmadan once exp, nbf, iss, aud, sub ve algyi kontrol edin.',
|
|
243
|
+
'Imzaları ve guven kararlarını yalnızca kimlik dogrulama katmanınızda dogrulayın.',
|
|
244
|
+
'Hassas uretim JWTlerini biletlerde, loglarda veya ekran goruntulerinde paylasmaktan kacının.',
|
|
245
|
+
],
|
|
246
|
+
},
|
|
247
|
+
],
|
|
248
|
+
};
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
---
|
|
2
|
-
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
-
import { keycode } from './index';
|
|
4
|
-
import type { KnownLocale } from '../../types';
|
|
5
|
-
|
|
6
|
-
interface Props {
|
|
7
|
-
locale?: KnownLocale;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
const { locale = 'es' } = Astro.props;
|
|
11
|
-
const content = await keycode.i18n[locale]?.();
|
|
12
|
-
if (!content) return null;
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
1
|
+
---
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { keycode } from './index';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'es' } = Astro.props;
|
|
11
|
+
const content = await keycode.i18n[locale]?.();
|
|
12
|
+
if (!content) return null;
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|