@jjlmoya/utils-developer 1.14.0 → 1.15.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 +1 -1
- package/src/category/i18n/fr.ts +1 -1
- package/src/category/i18n/ru.ts +1 -1
- package/src/layouts/PreviewLayout.astro +1 -0
- package/src/pages/[locale]/[slug].astro +29 -12
- package/src/tests/diacritics_density.test.ts +118 -0
- package/src/tests/inverted_punctuation.test.ts +113 -0
- package/src/tests/no_en_dash.test.ts +73 -0
- package/src/tests/script_density.test.ts +94 -0
- package/src/tests/shared-test-helpers.ts +56 -0
- package/src/tests/tool_exports.test.ts +34 -0
- package/src/tool/aspectRatio/i18n/de.ts +1 -1
- package/src/tool/aspectRatio/i18n/fr.ts +1 -1
- package/src/tool/aspectRatio/i18n/pl.ts +2 -2
- package/src/tool/aspectRatio/i18n/ru.ts +4 -4
- package/src/tool/aspectRatio/i18n/zh.ts +1 -1
- package/src/tool/aspectRatio/seo.astro +2 -1
- package/src/tool/calculadoraTiempoDatos/i18n/de.ts +1 -1
- package/src/tool/calculadoraTiempoDatos/i18n/pl.ts +1 -1
- package/src/tool/calculadoraTiempoDatos/i18n/ru.ts +5 -5
- package/src/tool/calculadoraTiempoDatos/i18n/sv.ts +5 -5
- package/src/tool/calculadoraTiempoDatos/i18n/zh.ts +1 -1
- package/src/tool/calculadoraTiempoDatos/seo.astro +2 -1
- package/src/tool/colorConverter/i18n/de.ts +1 -1
- package/src/tool/colorConverter/i18n/ru.ts +2 -2
- package/src/tool/colorConverter/seo.astro +2 -1
- package/src/tool/conversorExcelCsvHtml/i18n/es.ts +1 -1
- package/src/tool/conversorExcelCsvHtml/i18n/pl.ts +1 -1
- package/src/tool/conversorExcelCsvHtml/i18n/ru.ts +2 -2
- package/src/tool/conversorExcelCsvHtml/i18n/zh.ts +2 -2
- package/src/tool/conversorExcelCsvHtml/seo.astro +2 -1
- package/src/tool/cronGenerator/i18n/de.ts +4 -4
- package/src/tool/cronGenerator/i18n/en.ts +1 -1
- package/src/tool/cronGenerator/i18n/es.ts +2 -2
- package/src/tool/cronGenerator/i18n/fr.ts +5 -5
- package/src/tool/cronGenerator/i18n/id.ts +1 -1
- package/src/tool/cronGenerator/i18n/nl.ts +1 -1
- package/src/tool/cronGenerator/i18n/pl.ts +8 -8
- package/src/tool/cronGenerator/i18n/pt.ts +1 -1
- package/src/tool/cronGenerator/i18n/ru.ts +9 -9
- package/src/tool/cronGenerator/i18n/sv.ts +1 -1
- package/src/tool/cronGenerator/i18n/zh.ts +3 -3
- package/src/tool/cronGenerator/seo.astro +2 -1
- package/src/tool/cssSpecificityCalculator/i18n/de.ts +1 -1
- package/src/tool/cssSpecificityCalculator/i18n/fr.ts +3 -3
- package/src/tool/cssSpecificityCalculator/i18n/pl.ts +2 -2
- package/src/tool/cssSpecificityCalculator/i18n/ru.ts +2 -2
- package/src/tool/cssSpecificityCalculator/seo.astro +2 -1
- package/src/tool/cssToInlineConverter/i18n/de.ts +6 -6
- package/src/tool/cssToInlineConverter/i18n/es.ts +1 -1
- package/src/tool/cssToInlineConverter/i18n/fr.ts +3 -3
- package/src/tool/cssToInlineConverter/seo.astro +2 -1
- package/src/tool/duplicateCssRemover/i18n/de.ts +7 -7
- package/src/tool/duplicateCssRemover/i18n/fr.ts +1 -1
- package/src/tool/duplicateCssRemover/i18n/id.ts +1 -1
- package/src/tool/duplicateCssRemover/i18n/nl.ts +1 -1
- package/src/tool/duplicateCssRemover/i18n/pl.ts +1 -1
- package/src/tool/duplicateCssRemover/i18n/pt.ts +1 -1
- package/src/tool/duplicateCssRemover/i18n/ru.ts +3 -3
- package/src/tool/duplicateCssRemover/i18n/sv.ts +1 -1
- package/src/tool/duplicateCssRemover/seo.astro +2 -1
- package/src/tool/generadorSecurityTxt/i18n/de.ts +5 -5
- package/src/tool/generadorSecurityTxt/i18n/ru.ts +2 -2
- package/src/tool/generadorSecurityTxt/seo.astro +2 -1
- package/src/tool/hashGenerator/i18n/ru.ts +5 -5
- package/src/tool/hashGenerator/i18n/zh.ts +2 -2
- package/src/tool/hashGenerator/seo.astro +2 -1
- package/src/tool/inspectorCertificadosSsl/i18n/de.ts +6 -6
- package/src/tool/inspectorCertificadosSsl/i18n/ru.ts +5 -5
- package/src/tool/inspectorCertificadosSsl/seo.astro +2 -1
- package/src/tool/jsonFormatter/i18n/de.ts +4 -4
- package/src/tool/jsonFormatter/i18n/en.ts +4 -4
- package/src/tool/jsonFormatter/i18n/es.ts +4 -4
- package/src/tool/jsonFormatter/i18n/fr.ts +4 -4
- package/src/tool/jsonFormatter/i18n/id.ts +4 -4
- package/src/tool/jsonFormatter/i18n/it.ts +4 -4
- package/src/tool/jsonFormatter/i18n/ja.ts +4 -4
- package/src/tool/jsonFormatter/i18n/ko.ts +4 -4
- package/src/tool/jsonFormatter/i18n/nl.ts +4 -4
- package/src/tool/jsonFormatter/i18n/pl.ts +4 -4
- package/src/tool/jsonFormatter/i18n/pt.ts +4 -4
- package/src/tool/jsonFormatter/i18n/ru.ts +5 -5
- package/src/tool/jsonFormatter/i18n/sv.ts +4 -4
- package/src/tool/jsonFormatter/i18n/tr.ts +4 -4
- package/src/tool/jsonFormatter/i18n/zh.ts +5 -5
- package/src/tool/jsonFormatter/seo.astro +2 -1
- package/src/tool/keycode/i18n/de.ts +7 -7
- package/src/tool/keycode/i18n/en.ts +5 -5
- package/src/tool/keycode/i18n/es.ts +5 -5
- package/src/tool/keycode/i18n/fr.ts +7 -7
- package/src/tool/keycode/i18n/id.ts +5 -5
- package/src/tool/keycode/i18n/it.ts +5 -5
- package/src/tool/keycode/i18n/ja.ts +5 -5
- package/src/tool/keycode/i18n/ko.ts +5 -5
- package/src/tool/keycode/i18n/nl.ts +5 -5
- package/src/tool/keycode/i18n/pl.ts +7 -7
- package/src/tool/keycode/i18n/pt.ts +5 -5
- package/src/tool/keycode/i18n/ru.ts +6 -6
- package/src/tool/keycode/i18n/sv.ts +5 -5
- package/src/tool/keycode/i18n/tr.ts +5 -5
- package/src/tool/keycode/i18n/zh.ts +5 -5
- package/src/tool/keycode/seo.astro +2 -1
- package/src/tool/llmCostCalculator/i18n/de.ts +4 -4
- package/src/tool/llmCostCalculator/i18n/en.ts +3 -3
- package/src/tool/llmCostCalculator/i18n/fr.ts +3 -3
- package/src/tool/llmCostCalculator/i18n/id.ts +3 -3
- package/src/tool/llmCostCalculator/i18n/pt.ts +3 -3
- package/src/tool/llmCostCalculator/i18n/ru.ts +3 -3
- package/src/tool/llmCostCalculator/i18n/sv.ts +3 -3
- package/src/tool/llmCostCalculator/i18n/tr.ts +3 -3
- package/src/tool/llmCostCalculator/i18n/zh.ts +3 -3
- package/src/tool/llmCostCalculator/seo.astro +2 -1
- package/src/tool/mobileMockupGenerator/i18n/es.ts +1 -1
- package/src/tool/mobileMockupGenerator/seo.astro +2 -1
- package/src/tool/musicalTypography/i18n/de.ts +1 -1
- package/src/tool/musicalTypography/i18n/fr.ts +1 -1
- package/src/tool/musicalTypography/i18n/id.ts +1 -1
- package/src/tool/musicalTypography/i18n/it.ts +1 -1
- package/src/tool/musicalTypography/i18n/ko.ts +1 -1
- package/src/tool/musicalTypography/i18n/ru.ts +3 -3
- package/src/tool/musicalTypography/seo.astro +2 -1
- package/src/tool/placeholderGenerator/i18n/de.ts +4 -4
- package/src/tool/placeholderGenerator/i18n/ru.ts +1 -1
- package/src/tool/placeholderGenerator/seo.astro +2 -1
- package/src/tool/promptLibrary/i18n/de.ts +1 -1
- package/src/tool/promptLibrary/seo.astro +2 -1
- package/src/tool/readabilityCalculator/i18n/de.ts +2 -2
- package/src/tool/readabilityCalculator/seo.astro +2 -1
- package/src/tool/readabilityCalculator/visual-readability-calculator-wcag-apca.css +87 -3
- package/src/tool/svgSanitizer/i18n/de.ts +2 -2
- package/src/tool/svgSanitizer/i18n/id.ts +1 -1
- package/src/tool/svgSanitizer/i18n/pl.ts +1 -1
- package/src/tool/svgSanitizer/i18n/ru.ts +7 -7
- package/src/tool/svgSanitizer/i18n/sv.ts +3 -3
- package/src/tool/svgSanitizer/i18n/tr.ts +3 -3
- package/src/tool/svgSanitizer/i18n/zh.ts +3 -3
- package/src/tool/svgSanitizer/seo.astro +2 -1
- package/src/tool/svgToCss/i18n/de.ts +2 -2
- package/src/tool/svgToCss/i18n/es.ts +1 -1
- package/src/tool/svgToCss/i18n/fr.ts +1 -1
- package/src/tool/svgToCss/i18n/pl.ts +1 -1
- package/src/tool/svgToCss/i18n/ru.ts +2 -2
- package/src/tool/svgToCss/i18n/zh.ts +2 -2
- package/src/tool/svgToCss/seo.astro +2 -1
- package/src/tool/urlCleaner/component.astro +23 -5
- package/src/tool/urlCleaner/i18n/de.ts +3 -3
- package/src/tool/urlCleaner/i18n/es.ts +1 -1
- package/src/tool/urlCleaner/i18n/id.ts +1 -1
- package/src/tool/urlCleaner/i18n/nl.ts +1 -1
- package/src/tool/urlCleaner/seo.astro +2 -1
- package/src/tool/urlCleaner/url-tracking-cleaner.css +92 -2
- package/src/tool/urlEncoderDecoder/i18n/de.ts +5 -5
- package/src/tool/urlEncoderDecoder/i18n/fr.ts +2 -2
- package/src/tool/urlEncoderDecoder/i18n/pl.ts +5 -5
- package/src/tool/urlEncoderDecoder/i18n/ru.ts +8 -8
- package/src/tool/urlEncoderDecoder/i18n/sv.ts +5 -5
- package/src/tool/urlEncoderDecoder/i18n/zh.ts +5 -5
- package/src/tool/urlEncoderDecoder/seo.astro +2 -1
- package/src/tool/utmGenerator/i18n/de.ts +2 -2
- package/src/tool/utmGenerator/i18n/pl.ts +5 -5
- package/src/tool/utmGenerator/i18n/ru.ts +6 -6
- package/src/tool/utmGenerator/seo.astro +2 -1
|
@@ -119,11 +119,11 @@ export const content: ToolLocaleContent<CssSpecificityCalculatorUI> = {
|
|
|
119
119
|
},
|
|
120
120
|
{
|
|
121
121
|
type: 'paragraph',
|
|
122
|
-
html: 'Specyficzność CSS to algorytm, według którego przeglądarki decydują, które wartości właściwości zastosować do danego elementu. To nic innego jak matematyczny wynik, który mówi przeglądarce, jak bardzo
|
|
122
|
+
html: 'Specyficzność CSS to algorytm, według którego przeglądarki decydują, które wartości właściwości zastosować do danego elementu. To nic innego jak matematyczny wynik, który mówi przeglądarce, jak bardzo "szczegółowa" jest dana reguła.',
|
|
123
123
|
},
|
|
124
124
|
{
|
|
125
125
|
type: 'paragraph',
|
|
126
|
-
html: 'Jeśli dwie reguły mają różne poziomy specyficzności, wygrywa ta o wyższej wadze
|
|
126
|
+
html: 'Jeśli dwie reguły mają różne poziomy specyficzności, wygrywa ta o wyższej wadze - niezależnie od kolejności, w jakiej zostały napisane. Gdy obie mają tę samą wagę, decyduje ta zadeklarowana później w kodzie źródłowym.',
|
|
127
127
|
},
|
|
128
128
|
{
|
|
129
129
|
type: 'title',
|
|
@@ -11,7 +11,7 @@ const faqData = [
|
|
|
11
11
|
{
|
|
12
12
|
question: 'Что такое специфичность CSS?',
|
|
13
13
|
answer:
|
|
14
|
-
'Специфичность
|
|
14
|
+
'Специфичность - это алгоритм, который браузеры используют для определения того, какое правило CSS применяется к элементу, когда несколько правил конкурируют. Она представлена трёхколонным счётом (A, B, C), указывающим идентификаторы, классы/атрибуты/псевдо-классы и элементы/псевдо-элементы соответственно.',
|
|
15
15
|
},
|
|
16
16
|
{
|
|
17
17
|
question: 'Может ли класс когда-либо победить ID в специфичности?',
|
|
@@ -119,7 +119,7 @@ export const content: ToolLocaleContent<CssSpecificityCalculatorUI> = {
|
|
|
119
119
|
},
|
|
120
120
|
{
|
|
121
121
|
type: 'paragraph',
|
|
122
|
-
html: 'Специфичность CSS
|
|
122
|
+
html: 'Специфичность CSS - это алгоритм, по которому браузеры определяют, какие значения свойств применять к конкретному элементу. По сути это математический счёт, который говорит браузеру "насколько специфичным" является правило.',
|
|
123
123
|
},
|
|
124
124
|
{
|
|
125
125
|
type: 'paragraph',
|
|
@@ -9,6 +9,7 @@ interface Props {
|
|
|
9
9
|
|
|
10
10
|
const { locale = 'es' } = Astro.props;
|
|
11
11
|
const content = await cssSpecificityCalculator.i18n[locale]?.();
|
|
12
|
+
if (!content) return null;
|
|
12
13
|
---
|
|
13
14
|
|
|
14
|
-
{content && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -16,32 +16,32 @@ const faqData = [
|
|
|
16
16
|
{
|
|
17
17
|
question: 'Was passiert, wenn ein Element bereits ein eigenes style-Attribut hat?',
|
|
18
18
|
answer:
|
|
19
|
-
'Das Werkzeug respektiert vorhandene Inline-Styles und fügt die neuen Eigenschaften dahinter an
|
|
19
|
+
'Das Werkzeug respektiert vorhandene Inline-Styles und fügt die neuen Eigenschaften dahinter an - es simuliert dabei das Verhalten der CSS-Kaskade: Bei Konflikten überschreiben später deklarierte Eigenschaften frühere.',
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
22
|
question: 'Funktioniert es auch mit komplexen Selektoren wie :hover oder Media Queries?',
|
|
23
23
|
answer:
|
|
24
|
-
'Das Werkzeug verarbeitet Klassen-, ID-, Attribut- und strukturelle Pseudo-Klassen-Selektoren, die DOMParser auflösen kann. Zustandsabhängige Selektoren wie :hover und Media Queries können nicht inline eingebettet werden
|
|
24
|
+
'Das Werkzeug verarbeitet Klassen-, ID-, Attribut- und strukturelle Pseudo-Klassen-Selektoren, die DOMParser auflösen kann. Zustandsabhängige Selektoren wie :hover und Media Queries können nicht inline eingebettet werden - sie hängen von der Laufzeitumgebung ab und werden ignoriert.',
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
27
|
question: 'Wird mein HTML- und CSS-Code an einen Server gesendet?',
|
|
28
28
|
answer:
|
|
29
|
-
'Nein. Die gesamte Verarbeitung findet zu 100 % in Ihrem Browser mithilfe der nativen DOMParser-API statt. Kein einziges Byte Ihres Codes verlässt Ihr Gerät
|
|
29
|
+
'Nein. Die gesamte Verarbeitung findet zu 100 % in Ihrem Browser mithilfe der nativen DOMParser-API statt. Kein einziges Byte Ihres Codes verlässt Ihr Gerät - das garantiert vollständige Privatsphäre, auch bei Vorlagen mit vertraulichen Inhalten.',
|
|
30
30
|
},
|
|
31
31
|
];
|
|
32
32
|
|
|
33
33
|
const howToData = [
|
|
34
34
|
{
|
|
35
35
|
name: 'Fügen Sie Ihr HTML ein',
|
|
36
|
-
text: 'Schreiben oder fügen Sie das HTML, das Sie verarbeiten möchten, in das Feld
|
|
36
|
+
text: 'Schreiben oder fügen Sie das HTML, das Sie verarbeiten möchten, in das Feld "Original-HTML" ein. Es kann sich um ein Fragment oder ein vollständiges Dokument handeln.',
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
39
|
name: 'CSS-Regeln hinzufügen',
|
|
40
|
-
text: 'Fügen Sie die Klassen und IDs, die Sie einbetten möchten, in das Feld
|
|
40
|
+
text: 'Fügen Sie die Klassen und IDs, die Sie einbetten möchten, in das Feld "CSS-Regeln" ein. Das Werkzeug wendet sie unter Berücksichtigung der Selektorspezifität an.',
|
|
41
41
|
},
|
|
42
42
|
{
|
|
43
43
|
name: 'Konvertieren und kopieren',
|
|
44
|
-
text: 'Klicken Sie auf
|
|
44
|
+
text: 'Klicken Sie auf "CSS in HTML einbetten". Das Ergebnis mit allen Inline-Styles erscheint darunter - bereit zum Kopieren und Einfügen in Ihren E-Mail-Manager oder Ihr CMS.',
|
|
45
45
|
},
|
|
46
46
|
];
|
|
47
47
|
|
|
@@ -19,7 +19,7 @@ const faqData = [
|
|
|
19
19
|
'La herramienta respeta los estilos inline existentes y añade las nuevas propiedades a continuación, simulando el comportamiento de la cascada CSS: las propiedades declaradas más tarde sobreescriben las anteriores en caso de conflicto.',
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
|
-
question: '¿Funciona con selectores complejos como
|
|
22
|
+
question: '¿Funciona con selectores complejos como hover o media queries?',
|
|
23
23
|
answer:
|
|
24
24
|
'La herramienta procesa selectores de clase, id, atributos y pseudo-clases estructurales que DOMParser puede resolver. Los selectores dependientes de estado como :hover y las media queries no se pueden inlinear (ya que dependen del entorno en tiempo de ejecución) y son ignorados.',
|
|
25
25
|
},
|
|
@@ -16,7 +16,7 @@ const faqData = [
|
|
|
16
16
|
{
|
|
17
17
|
question: 'Que se passe-t-il si un élément a déjà son propre attribut style ?',
|
|
18
18
|
answer:
|
|
19
|
-
'L\'outil respecte les styles inline existants et ajoute les nouvelles propriétés à la suite, simulant le comportement de la cascade CSS
|
|
19
|
+
'L\'outil respecte les styles inline existants et ajoute les nouvelles propriétés à la suite, simulant le comportement de la cascade CSS: les propriétés déclarées plus tard écrasent les précédentes en cas de conflit.',
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
22
|
question: 'Fonctionne-t-il avec des sélecteurs complexes comme :hover ou les media queries ?',
|
|
@@ -124,11 +124,11 @@ export const content: ToolLocaleContent<CssToInlineConverterUI> = {
|
|
|
124
124
|
},
|
|
125
125
|
{
|
|
126
126
|
type: 'paragraph',
|
|
127
|
-
html: 'Lors du développement d\'applications web modernes, nous sommes habitués à séparer les responsabilités
|
|
127
|
+
html: 'Lors du développement d\'applications web modernes, nous sommes habitués à séparer les responsabilités: le HTML construit la structure, et un fichier CSS externe apporte tout le style visuel. Cependant, tous les environnements ne font pas confiance aux feuilles de style externes ni aux balises globales <code><style></code>.',
|
|
128
128
|
},
|
|
129
129
|
{
|
|
130
130
|
type: 'paragraph',
|
|
131
|
-
html: 'Le cas d\'usage le plus populaire où le CSS externe échoue est le <strong>Développement de Modèles d\'Email</strong>. Dans ces environnements, la seule façon fiable qu\'une police, couleur ou marge se rende correctement est qu\'elle soit imbriquée directement dans la balise
|
|
131
|
+
html: 'Le cas d\'usage le plus populaire où le CSS externe échoue est le <strong>Développement de Modèles d\'Email</strong>. Dans ces environnements, la seule façon fiable qu\'une police, couleur ou marge se rende correctement est qu\'elle soit imbriquée directement dans la balise: <code><span style="color: red;"></code>.',
|
|
132
132
|
},
|
|
133
133
|
{
|
|
134
134
|
type: 'title',
|
|
@@ -9,6 +9,7 @@ interface Props {
|
|
|
9
9
|
|
|
10
10
|
const { locale = 'es' } = Astro.props;
|
|
11
11
|
const content = await cssToInlineConverter.i18n[locale]?.();
|
|
12
|
+
if (!content) return null;
|
|
12
13
|
---
|
|
13
14
|
|
|
14
|
-
{content && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -5,7 +5,7 @@ import type { DuplicateCssRemoverUI } from '../ui';
|
|
|
5
5
|
const slug = 'doppeltes-css-entfernen';
|
|
6
6
|
const title = 'Doppelten CSS Code online entfernen. Stylesheets vereinheitlichen und bereinigen';
|
|
7
7
|
const description =
|
|
8
|
-
'Kostenloses Tool zum Bereinigen und Entfernen doppelter CSS-Regeln. Fasst redundante Selektoren zusammen, respektiert die Kaskade und reduziert sofort die Dateigröße
|
|
8
|
+
'Kostenloses Tool zum Bereinigen und Entfernen doppelter CSS-Regeln. Fasst redundante Selektoren zusammen, respektiert die Kaskade und reduziert sofort die Dateigröße - direkt im Browser.';
|
|
9
9
|
|
|
10
10
|
const faqData = [
|
|
11
11
|
{
|
|
@@ -26,22 +26,22 @@ const faqData = [
|
|
|
26
26
|
{
|
|
27
27
|
question: 'Wird mein CSS an einen Server übertragen?',
|
|
28
28
|
answer:
|
|
29
|
-
'Nein. Die gesamte Verarbeitung findet direkt in Ihrem Browser per lokalem JavaScript statt. Kein Teil Ihres CSS wird an externe Server übertragen
|
|
29
|
+
'Nein. Die gesamte Verarbeitung findet direkt in Ihrem Browser per lokalem JavaScript statt. Kein Teil Ihres CSS wird an externe Server übertragen - Ihr Code bleibt vollständig privat.',
|
|
30
30
|
},
|
|
31
31
|
];
|
|
32
32
|
|
|
33
33
|
const howToData = [
|
|
34
34
|
{
|
|
35
35
|
name: 'Ihren CSS Code einfügen',
|
|
36
|
-
text: 'Kopieren Sie den Inhalt Ihrer CSS-Datei mit wiederholten Selektoren und fügen Sie ihn in das linke Feld
|
|
36
|
+
text: 'Kopieren Sie den Inhalt Ihrer CSS-Datei mit wiederholten Selektoren und fügen Sie ihn in das linke Feld "Dirty / Duplicate CSS" ein.',
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
39
|
name: 'Bereinigung starten',
|
|
40
|
-
text: 'Klicken Sie auf
|
|
40
|
+
text: 'Klicken Sie auf "CSS bereinigen und vereinheitlichen". Das Tool durchsucht alle Selektoren, führt Eigenschaften zusammen und entfernt redundante Blöcke.',
|
|
41
41
|
},
|
|
42
42
|
{
|
|
43
43
|
name: 'Ergebnis prüfen und kopieren',
|
|
44
|
-
text: 'Sehen Sie sich die Byte-Einsparungen an und kopieren Sie das optimierte CSS über den Button
|
|
44
|
+
text: 'Sehen Sie sich die Byte-Einsparungen an und kopieren Sie das optimierte CSS über den Button "Code kopieren" direkt in Ihr Projekt.',
|
|
45
45
|
},
|
|
46
46
|
];
|
|
47
47
|
|
|
@@ -141,7 +141,7 @@ export const content: ToolLocaleContent<DuplicateCssRemoverUI> = {
|
|
|
141
141
|
},
|
|
142
142
|
{
|
|
143
143
|
type: 'tip',
|
|
144
|
-
html: 'Redundante Stile zu bereinigen ist keine reine Ordnungsfrage
|
|
144
|
+
html: 'Redundante Stile zu bereinigen ist keine reine Ordnungsfrage - es ist eine messbare und unmittelbare Verbesserung wichtiger Metriken wie dem <strong>First Contentful Paint (FCP)</strong>.',
|
|
145
145
|
},
|
|
146
146
|
{
|
|
147
147
|
type: 'title',
|
|
@@ -161,7 +161,7 @@ export const content: ToolLocaleContent<DuplicateCssRemoverUI> = {
|
|
|
161
161
|
},
|
|
162
162
|
{
|
|
163
163
|
type: 'paragraph',
|
|
164
|
-
html: 'Schluss damit, Kilobytes toter Textdaten an die Mobilgeräte Ihrer Nutzer zu schicken. Vereinheitlichen Sie Ihren Code in Millisekunden
|
|
164
|
+
html: 'Schluss damit, Kilobytes toter Textdaten an die Mobilgeräte Ihrer Nutzer zu schicken. Vereinheitlichen Sie Ihren Code in Millisekunden - vollständig offline, direkt im Browser.',
|
|
165
165
|
},
|
|
166
166
|
],
|
|
167
167
|
};
|
|
@@ -16,7 +16,7 @@ const faqData = [
|
|
|
16
16
|
{
|
|
17
17
|
question: 'Des propriétés seront-elles perdues lors de la suppression des doublons ?',
|
|
18
18
|
answer:
|
|
19
|
-
'Non. L\'algorithme respecte strictement la cascade CSS
|
|
19
|
+
'Non. L\'algorithme respecte strictement la cascade CSS: pour les propriétés en conflit sous le même sélecteur, il préserve toujours la dernière déclarée. Les propriétés uniques de chaque bloc sont combinées sous un sélecteur unifié.',
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
22
|
question: 'Fonctionne-t-il avec du CSS minifié ou des commentaires ?',
|
|
@@ -141,7 +141,7 @@ export const content: ToolLocaleContent<DuplicateCssRemoverUI> = {
|
|
|
141
141
|
},
|
|
142
142
|
{
|
|
143
143
|
type: 'tip',
|
|
144
|
-
html: 'Membuang gaya yang redundan bukan sekadar soal kerapian kode
|
|
144
|
+
html: 'Membuang gaya yang redundan bukan sekadar soal kerapian kode - ini adalah peningkatan nyata dan terukur pada metrik penting seperti <strong>First Contentful Paint (FCP)</strong>.',
|
|
145
145
|
},
|
|
146
146
|
{
|
|
147
147
|
type: 'title',
|
|
@@ -141,7 +141,7 @@ export const content: ToolLocaleContent<DuplicateCssRemoverUI> = {
|
|
|
141
141
|
},
|
|
142
142
|
{
|
|
143
143
|
type: 'tip',
|
|
144
|
-
html: 'Overbodige stijlen verwijderen gaat niet alleen om codenetjes
|
|
144
|
+
html: 'Overbodige stijlen verwijderen gaat niet alleen om codenetjes - het is een meetbare en directe verbetering van vitale metrics zoals de <strong>First Contentful Paint (FCP)</strong>.',
|
|
145
145
|
},
|
|
146
146
|
{
|
|
147
147
|
type: 'title',
|
|
@@ -141,7 +141,7 @@ export const content: ToolLocaleContent<DuplicateCssRemoverUI> = {
|
|
|
141
141
|
},
|
|
142
142
|
{
|
|
143
143
|
type: 'tip',
|
|
144
|
-
html: 'Usuwanie nadmiarowych stylów to nie tylko kwestia porządku w kodzie
|
|
144
|
+
html: 'Usuwanie nadmiarowych stylów to nie tylko kwestia porządku w kodzie - to mierzalna i natychmiastowa poprawa kluczowych metryk, takich jak <strong>First Contentful Paint (FCP)</strong>.',
|
|
145
145
|
},
|
|
146
146
|
{
|
|
147
147
|
type: 'title',
|
|
@@ -141,7 +141,7 @@ export const content: ToolLocaleContent<DuplicateCssRemoverUI> = {
|
|
|
141
141
|
},
|
|
142
142
|
{
|
|
143
143
|
type: 'tip',
|
|
144
|
-
html: 'Purgar estilos redundantes não é apenas uma questão de organização do código
|
|
144
|
+
html: 'Purgar estilos redundantes não é apenas uma questão de organização do código - é uma melhoria mensurável e imediata em métricas vitais como o <strong>First Contentful Paint (FCP)</strong>.',
|
|
145
145
|
},
|
|
146
146
|
{
|
|
147
147
|
type: 'title',
|
|
@@ -26,7 +26,7 @@ const faqData = [
|
|
|
26
26
|
{
|
|
27
27
|
question: 'Отправляется ли мой CSS на сервер?',
|
|
28
28
|
answer:
|
|
29
|
-
'Нет. Вся обработка происходит прямо в браузере с помощью локального JavaScript. Никакая часть вашего CSS не передаётся на внешние серверы
|
|
29
|
+
'Нет. Вся обработка происходит прямо в браузере с помощью локального JavaScript. Никакая часть вашего CSS не передаётся на внешние серверы - полная конфиденциальность кода гарантирована.',
|
|
30
30
|
},
|
|
31
31
|
];
|
|
32
32
|
|
|
@@ -141,7 +141,7 @@ export const content: ToolLocaleContent<DuplicateCssRemoverUI> = {
|
|
|
141
141
|
},
|
|
142
142
|
{
|
|
143
143
|
type: 'tip',
|
|
144
|
-
html: 'Удаление лишних стилей
|
|
144
|
+
html: 'Удаление лишних стилей - это не просто вопрос чистоты кода. Это измеримое и немедленное улучшение ключевых показателей, таких как <strong>First Contentful Paint (FCP)</strong>.',
|
|
145
145
|
},
|
|
146
146
|
{
|
|
147
147
|
type: 'title',
|
|
@@ -155,7 +155,7 @@ export const content: ToolLocaleContent<DuplicateCssRemoverUI> = {
|
|
|
155
155
|
{
|
|
156
156
|
type: 'list',
|
|
157
157
|
items: [
|
|
158
|
-
'Представьте, что у вас есть правило <code>.box { color: red; }</code>, а сотню строк спустя
|
|
158
|
+
'Представьте, что у вас есть правило <code>.box { color: red; }</code>, а сотню строк спустя - <code>.box { padding: 10px; color: blue; }</code>. Инструмент объединит оба блока под одним селектором <code>.box</code>, включив padding.',
|
|
159
159
|
'<strong>Сохранение каскада CSS:</strong> При прямых конфликтах алгоритм строго сохраняет последнее объявленное свойство. Это гарантирует, что ваша вёрстка не сломается после очистки документа.',
|
|
160
160
|
],
|
|
161
161
|
},
|
|
@@ -141,7 +141,7 @@ export const content: ToolLocaleContent<DuplicateCssRemoverUI> = {
|
|
|
141
141
|
},
|
|
142
142
|
{
|
|
143
143
|
type: 'tip',
|
|
144
|
-
html: 'Att rensa bort redundanta stilar handlar inte bara om kodordning
|
|
144
|
+
html: 'Att rensa bort redundanta stilar handlar inte bara om kodordning - det är en mätbar och omedelbar förbättring av viktiga mätvärden som <strong>First Contentful Paint (FCP)</strong>.',
|
|
145
145
|
},
|
|
146
146
|
{
|
|
147
147
|
type: 'title',
|
|
@@ -9,6 +9,7 @@ interface Props {
|
|
|
9
9
|
|
|
10
10
|
const { locale = 'es' } = Astro.props;
|
|
11
11
|
const content = await duplicateCssRemover.i18n[locale]?.();
|
|
12
|
+
if (!content) return null;
|
|
12
13
|
---
|
|
13
14
|
|
|
14
|
-
{content && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -21,14 +21,14 @@ const faqData = [
|
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
question: 'Welche Felder sind in einer security.txt erforderlich?',
|
|
24
|
-
answer: 'Laut RFC 9116 sind die Pflichtfelder
|
|
24
|
+
answer: 'Laut RFC 9116 sind die Pflichtfelder "Contact" (mit einer E-Mail-Adresse oder URL) und "Expires" (mit einem zukünftigen Datum im ISO-8601-Format).',
|
|
25
25
|
},
|
|
26
26
|
];
|
|
27
27
|
|
|
28
28
|
const howToData = [
|
|
29
29
|
{ name: 'Felder ausfüllen', text: 'Tragen Sie Ihre E-Mail-Adresse oder Kontakt-URL ein und wählen Sie ein Ablaufdatum.' },
|
|
30
30
|
{ name: 'Optionale Felder hinzufügen', text: 'Ergänzen Sie weitere Angaben wie Ihren PGP-Schlüssel, Ihre Sicherheitsrichtlinie oder Stellenangebote.' },
|
|
31
|
-
{ name: 'Datei herunterladen oder kopieren', text: 'Klicken Sie auf
|
|
31
|
+
{ name: 'Datei herunterladen oder kopieren', text: 'Klicken Sie auf ".txt herunterladen" oder kopieren Sie den Inhalt und speichern Sie ihn als security.txt.' },
|
|
32
32
|
{ name: 'Auf den Server hochladen', text: 'Legen Sie die Datei im Ordner /.well-known/ Ihrer Domain ab.' },
|
|
33
33
|
];
|
|
34
34
|
|
|
@@ -112,7 +112,7 @@ export const content: ToolLocaleContent<GeneradorSecurityTxtUI> = {
|
|
|
112
112
|
},
|
|
113
113
|
{
|
|
114
114
|
type: 'paragraph',
|
|
115
|
-
html: 'Der Zweck von <strong>security.txt</strong> besteht darin, Sicherheitsforschern eine standardisierte Möglichkeit zu bieten, die Verantwortlichen einer Website zu kontaktieren, wenn sie eine Schwachstelle entdecken. Ohne diese Datei weiß ein ethischer Hacker, der einen Fehler in Ihrem System findet, möglicherweise nicht, an wen er sich wenden soll
|
|
115
|
+
html: 'Der Zweck von <strong>security.txt</strong> besteht darin, Sicherheitsforschern eine standardisierte Möglichkeit zu bieten, die Verantwortlichen einer Website zu kontaktieren, wenn sie eine Schwachstelle entdecken. Ohne diese Datei weiß ein ethischer Hacker, der einen Fehler in Ihrem System findet, möglicherweise nicht, an wen er sich wenden soll - mit der Folge, dass die Information verloren geht, ohne Vorwarnung veröffentlicht oder von Angreifern ausgenutzt wird.',
|
|
116
116
|
},
|
|
117
117
|
{ type: 'title', text: 'Security.txt nach RFC 9116 erstellen und einbinden', level: 2 },
|
|
118
118
|
{
|
|
@@ -142,7 +142,7 @@ export const content: ToolLocaleContent<GeneradorSecurityTxtUI> = {
|
|
|
142
142
|
items: [
|
|
143
143
|
'<strong>Encryption:</strong> Ein Link zu Ihrem öffentlichen PGP-Schlüssel, damit Forscher Ihnen verschlüsselte Informationen zusenden können.',
|
|
144
144
|
'<strong>Policy:</strong> Ein Link zu Ihrer Sicherheitsrichtlinien-Seite, auf der Sie den Prozess der verantwortungsvollen Offenlegung erläutern.',
|
|
145
|
-
'<strong>Acknowledgments:</strong> Ein Link zu Ihrer
|
|
145
|
+
'<strong>Acknowledgments:</strong> Ein Link zu Ihrer "Hall of Fame" oder Danksagungsseite für Sicherheitsforscher.',
|
|
146
146
|
'<strong>Hiring:</strong> Ein Link zu Ihren offenen Stellen im Bereich Cybersicherheit.',
|
|
147
147
|
],
|
|
148
148
|
},
|
|
@@ -163,7 +163,7 @@ export const content: ToolLocaleContent<GeneradorSecurityTxtUI> = {
|
|
|
163
163
|
{ type: 'title', text: 'Fazit: Ein einfacher Schritt für mehr Sicherheit im Web', level: 2 },
|
|
164
164
|
{
|
|
165
165
|
type: 'paragraph',
|
|
166
|
-
html: 'Kurz gesagt: <strong>security.txt herunterladen</strong> und auf Ihren Server hochladen gehört zu den schnellsten und wirkungsvollsten Sicherheitsmaßnahmen, die Sie noch heute umsetzen können. Sie erleichtern den
|
|
166
|
+
html: 'Kurz gesagt: <strong>security.txt herunterladen</strong> und auf Ihren Server hochladen gehört zu den schnellsten und wirkungsvollsten Sicherheitsmaßnahmen, die Sie noch heute umsetzen können. Sie erleichtern den "Guten" die Arbeit, schrecken Neugierige ab und signalisieren der Welt, dass Sie Datenschutz und Nutzerdaten ernst nehmen.',
|
|
167
167
|
},
|
|
168
168
|
{
|
|
169
169
|
type: 'paragraph',
|
|
@@ -13,7 +13,7 @@ const faqData = [
|
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
15
|
question: 'Где должен быть размещён файл security.txt?',
|
|
16
|
-
answer: 'Рекомендуемое стандартное место
|
|
16
|
+
answer: 'Рекомендуемое стандартное место - папка /.well-known/ вашего домена, что даёт URL https://example.com/.well-known/security.txt.',
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
19
|
question: 'Почему дата истечения обязательна?',
|
|
@@ -163,7 +163,7 @@ export const content: ToolLocaleContent<GeneradorSecurityTxtUI> = {
|
|
|
163
163
|
{ type: 'title', text: 'Вывод: Простой шаг к более безопасному Интернету', level: 2 },
|
|
164
164
|
{
|
|
165
165
|
type: 'paragraph',
|
|
166
|
-
html: 'В заключение, <strong>загрузка security.txt</strong> и его загрузка на сервер
|
|
166
|
+
html: 'В заключение, <strong>загрузка security.txt</strong> и его загрузка на сервер - это одна из самых быстрых и эффективных задач по обслуживанию безопасности, которую вы можете выполнить сегодня. Вы облегчаете задачу "хорошим парням", отбиваете охоту у любопытствующих и показываете миру, что серьёзно относитесь к конфиденциальности пользователей и данным.',
|
|
167
167
|
},
|
|
168
168
|
{
|
|
169
169
|
type: 'paragraph',
|
|
@@ -9,6 +9,7 @@ interface Props {
|
|
|
9
9
|
|
|
10
10
|
const { locale = 'es' } = Astro.props;
|
|
11
11
|
const content = await generadorSecurityTxt.i18n[locale]?.();
|
|
12
|
+
if (!content) return null;
|
|
12
13
|
---
|
|
13
14
|
|
|
14
|
-
{content && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -9,7 +9,7 @@ const description = 'Мгновенно вычисляйте хеши MD5, SHA-1
|
|
|
9
9
|
const faqData = [
|
|
10
10
|
{
|
|
11
11
|
question: 'Что такое хеш и для чего он используется?',
|
|
12
|
-
answer: 'Хеш
|
|
12
|
+
answer: 'Хеш - это уникальный цифровой отпечаток текста или файла. Он используется для проверки того, что данные не были подделаны, а также для безопасного хранения паролей.',
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
15
|
question: 'Безопасно ли использовать этот онлайн-генератор?',
|
|
@@ -20,8 +20,8 @@ const faqData = [
|
|
|
20
20
|
answer: 'Для современной безопасности и хранения ключей мы рекомендуем SHA-256 или SHA-512. MD5 и SHA-1 следует использовать только для совместимости с устаревшими системами.',
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
|
-
question: 'Что означает добавление
|
|
24
|
-
answer: 'Salt
|
|
23
|
+
question: 'Что означает добавление "Salt" (соли)?',
|
|
24
|
+
answer: 'Salt - это дополнительная строка, смешиваемая с вашим текстом, чтобы сделать хеш уникальным и его было гораздо сложнее взломать с помощью атак по словарю.',
|
|
25
25
|
},
|
|
26
26
|
];
|
|
27
27
|
|
|
@@ -92,7 +92,7 @@ export const content: ToolLocaleContent<HashGeneratorUI> = {
|
|
|
92
92
|
{ type: 'title', text: 'Что такое криптографический хеш?', level: 2 },
|
|
93
93
|
{
|
|
94
94
|
type: 'paragraph',
|
|
95
|
-
html: '<strong>Криптографический хеш</strong>
|
|
95
|
+
html: '<strong>Криптографический хеш</strong> - это математическая функция, которая преобразует любой объем данных в строку фиксированной длины. Одни и те же входные данные всегда дают один и тот же результат, но любое минимальное изменение во входных данных генерирует совершенно другой хеш.',
|
|
96
96
|
},
|
|
97
97
|
{ type: 'title', text: 'Доступные алгоритмы', level: 3 },
|
|
98
98
|
{
|
|
@@ -107,7 +107,7 @@ export const content: ToolLocaleContent<HashGeneratorUI> = {
|
|
|
107
107
|
{ type: 'title', text: 'Соль и Key Stretching', level: 3 },
|
|
108
108
|
{
|
|
109
109
|
type: 'paragraph',
|
|
110
|
-
html: '<strong>Соль</strong>
|
|
110
|
+
html: '<strong>Соль</strong> - это случайная строка, добавляемая к тексту перед хешированием, гарантирующая, что два идентичных входа создадут разные хеши. <strong>Key Stretching</strong> (раунды) применяет функцию хеширования несколько раз, чтобы повысить устойчивость к атакам перебором.',
|
|
111
111
|
},
|
|
112
112
|
{ type: 'title', text: 'Полная конфиденциальность: 100% на стороне клиента', level: 3 },
|
|
113
113
|
{
|
|
@@ -20,14 +20,14 @@ const faqData = [
|
|
|
20
20
|
answer: '对于现代安全和密钥存储,我们推荐使用 SHA-256 或 SHA-512。MD5 和 SHA-1 仅应在为了兼容旧系统时使用。',
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
|
-
question: '
|
|
23
|
+
question: '添加"盐"(Salt)是什么意思?',
|
|
24
24
|
answer: '盐是混入文本中的一段额外字符串,目的是使哈希值变得独一无二,从而使通过字典攻击进行的破解变得更加困难。',
|
|
25
25
|
},
|
|
26
26
|
];
|
|
27
27
|
|
|
28
28
|
const howToData = [
|
|
29
29
|
{ name: '输入文本', text: '在此输入框中输入或粘贴您想要计算哈希值的文本。' },
|
|
30
|
-
{ name: '配置安全选项', text: '
|
|
30
|
+
{ name: '配置安全选项', text: '您可以选择添加"盐"或增加处理轮数(拉伸),以增强安全性。' },
|
|
31
31
|
{ name: '获取结果', text: '当您输入时,各种哈希(MD5、SHA 等)会实时计算出来。' },
|
|
32
32
|
{ name: '复制哈希值', text: '点击每种算法旁边的复制图标,将其保存到剪贴板。' },
|
|
33
33
|
];
|
|
@@ -9,6 +9,7 @@ interface Props {
|
|
|
9
9
|
|
|
10
10
|
const { locale = 'es' } = Astro.props;
|
|
11
11
|
const content = await hashGenerator.i18n[locale]?.();
|
|
12
|
+
if (!content) return null;
|
|
12
13
|
---
|
|
13
14
|
|
|
14
|
-
{content && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -105,7 +105,7 @@ export const content: ToolLocaleContent<InspectorCertificadosSslUI> = {
|
|
|
105
105
|
bibliography: [
|
|
106
106
|
{ name: 'RFC 5280: Internet X.509 Public Key Infrastructure Certificate and CRL Profile', url: 'https://datatracker.ietf.org/doc/html/rfc5280' },
|
|
107
107
|
{ name: 'NIST: FIPS 180-4 Secure Hash Standard (SHA)', url: 'https://csrc.nist.gov/publications/detail/fips/180/4/final' },
|
|
108
|
-
{ name: 'Mozilla: SSL/TLS Verschlüsselung
|
|
108
|
+
{ name: 'Mozilla: SSL/TLS Verschlüsselung - Übersicht', url: 'https://developer.mozilla.org/de/docs/Glossary/TLS' },
|
|
109
109
|
{ name: 'OpenSSL: X.509 Zertifikatsformat Dokumentation', url: 'https://www.openssl.org/docs/man1.1.1/man1/x509.html' },
|
|
110
110
|
],
|
|
111
111
|
howTo: howToData,
|
|
@@ -166,12 +166,12 @@ export const content: ToolLocaleContent<InspectorCertificadosSslUI> = {
|
|
|
166
166
|
},
|
|
167
167
|
{
|
|
168
168
|
type: 'paragraph',
|
|
169
|
-
html: 'Selbst wenn Ihre Datei eine ungewöhnliche Erweiterung hat
|
|
169
|
+
html: 'Selbst wenn Ihre Datei eine ungewöhnliche Erweiterung hat - sofern die interne Struktur ein standardkonformes X.509-Zertifikat ist, kann unser auf <strong>node-forge</strong> basierender Parser es problemlos verarbeiten.',
|
|
170
170
|
},
|
|
171
171
|
{ type: 'title', text: 'Warum dieses Tool statt OpenSSL nutzen?', level: 2 },
|
|
172
172
|
{
|
|
173
173
|
type: 'paragraph',
|
|
174
|
-
html: 'OpenSSL ist das Schweizer Taschenmesser der Kryptografie
|
|
174
|
+
html: 'OpenSSL ist das Schweizer Taschenmesser der Kryptografie - aber seine Befehle sind schwer zu merken. Um ein Zertifikat über die Kommandozeile anzuzeigen, müssten Sie Folgendes eingeben:',
|
|
175
175
|
},
|
|
176
176
|
{ type: 'code', text: 'openssl x509 -in certificado.crt -text -noout' },
|
|
177
177
|
{
|
|
@@ -183,7 +183,7 @@ export const content: ToolLocaleContent<InspectorCertificadosSslUI> = {
|
|
|
183
183
|
items: [
|
|
184
184
|
'<strong>Schnelligkeit:</strong> Kein Terminal öffnen, keine komplexen Flags merken.',
|
|
185
185
|
'<strong>Übersichtlichkeit:</strong> Feldnamen (Locality, Organization) werden lesbar formatiert, nicht als kryptische Kürzel wie "L" oder "O".',
|
|
186
|
-
'<strong>Gültigkeitswarnungen:</strong> Automatische Berechnung, ob das Zertifikat heute noch gültig ist
|
|
186
|
+
'<strong>Gültigkeitswarnungen:</strong> Automatische Berechnung, ob das Zertifikat heute noch gültig ist - kein manueller Datumsabgleich nötig.',
|
|
187
187
|
'<strong>Plattformunabhängig:</strong> Funktioniert auf jedem Betriebssystem mit einem modernen Browser, ohne Installation zusätzlicher Software.',
|
|
188
188
|
],
|
|
189
189
|
},
|
|
@@ -204,10 +204,10 @@ export const content: ToolLocaleContent<InspectorCertificadosSslUI> = {
|
|
|
204
204
|
{
|
|
205
205
|
type: 'list',
|
|
206
206
|
items: [
|
|
207
|
-
'<strong>Server-Debugging:</strong> Wenn Sie ein Zertifikat installiert haben, die Website aber weiterhin Fehler wirft
|
|
207
|
+
'<strong>Server-Debugging:</strong> Wenn Sie ein Zertifikat installiert haben, die Website aber weiterhin Fehler wirft - um sicherzustellen, dass nicht versehentlich das alte Zertifikat geladen wurde.',
|
|
208
208
|
'<strong>Kettenprüfung:</strong> Um festzustellen, ob eine Datei das Endzertifikat oder ein Zwischenzertifikat enthält.',
|
|
209
209
|
'<strong>Asset-Audit:</strong> Um nachzuvollziehen, welche Zertifizierungsstelle in einem älteren Projekt verwendet wurde.',
|
|
210
|
-
'<strong>Integritätsprüfung:</strong> Beim Verschieben von Zertifikaten zwischen Servern
|
|
210
|
+
'<strong>Integritätsprüfung:</strong> Beim Verschieben von Zertifikaten zwischen Servern - durch Vergleich des SHA-256-Fingerabdrucks lässt sich sicherstellen, dass die Datei nicht beschädigt ist.',
|
|
211
211
|
],
|
|
212
212
|
},
|
|
213
213
|
],
|
|
@@ -114,7 +114,7 @@ export const content: ToolLocaleContent<InspectorCertificadosSslUI> = {
|
|
|
114
114
|
{ type: 'title', text: 'Что такое инспектор сертификатов SSL/TLS и зачем он нужен?', level: 2 },
|
|
115
115
|
{
|
|
116
116
|
type: 'paragraph',
|
|
117
|
-
html: 'В мире веб-разработки и кибербезопасности <strong>сертификаты SSL (Secure Sockets Layer) и TLS (Transport Layer Security)</strong>
|
|
117
|
+
html: 'В мире веб-разработки и кибербезопасности <strong>сертификаты SSL (Secure Sockets Layer) и TLS (Transport Layer Security)</strong> - это основание доверия. Цифровой сертификат - это просто файл, связывающий криптографический ключ с данными организации или домена. Однако эти файлы часто поставляются в бинарном формате (.der) или кодировке Base64 (.pem, .crt), которые не читаются с первого взгляда.',
|
|
118
118
|
},
|
|
119
119
|
{
|
|
120
120
|
type: 'paragraph',
|
|
@@ -136,7 +136,7 @@ export const content: ToolLocaleContent<InspectorCertificadosSslUI> = {
|
|
|
136
136
|
{
|
|
137
137
|
type: 'tip',
|
|
138
138
|
title: 'Полная приватность',
|
|
139
|
-
html: 'Самая важная часть этого процесса
|
|
139
|
+
html: 'Самая важная часть этого процесса - <strong>приватность</strong>. Файл никогда не загружается на наши серверы. Все разбор ASN.1 структуры сертификата происходит в RAM вашего браузера. Полная безопасность для ваших открытых ключей.',
|
|
140
140
|
},
|
|
141
141
|
{ type: 'title', text: 'Ключевые поля, которые вы увидите при анализе сертификата', level: 2 },
|
|
142
142
|
{
|
|
@@ -166,12 +166,12 @@ export const content: ToolLocaleContent<InspectorCertificadosSslUI> = {
|
|
|
166
166
|
},
|
|
167
167
|
{
|
|
168
168
|
type: 'paragraph',
|
|
169
|
-
html: 'Даже если ваш файл имеет необычное расширение, если внутренняя структура
|
|
169
|
+
html: 'Даже если ваш файл имеет необычное расширение, если внутренняя структура - это стандартный сертификат X.509, наш движок на базе <strong>node-forge</strong> сможет его интерпретировать без проблем.',
|
|
170
170
|
},
|
|
171
171
|
{ type: 'title', text: 'Почему использовать этот инструмент вместо OpenSSL?', level: 2 },
|
|
172
172
|
{
|
|
173
173
|
type: 'paragraph',
|
|
174
|
-
html: 'OpenSSL
|
|
174
|
+
html: 'OpenSSL - это швейцарский армейский нож криптографии, но его команды трудно запомнить. Чтобы просмотреть сертификат из консоли, вам нужно написать:',
|
|
175
175
|
},
|
|
176
176
|
{ type: 'code', text: 'openssl x509 -in certificado.crt -text -noout' },
|
|
177
177
|
{
|
|
@@ -190,7 +190,7 @@ export const content: ToolLocaleContent<InspectorCertificadosSslUI> = {
|
|
|
190
190
|
{ type: 'title', text: 'Безопасность и приватность: ваш сертификат никогда не покидает RAM', level: 2 },
|
|
191
191
|
{
|
|
192
192
|
type: 'paragraph',
|
|
193
|
-
html: 'Как разработчик, я знаю, насколько критично правильное обращение с этой информацией. Хотя сертификат технически является <strong>публичной информацией</strong> (отправляется в любой браузер, посещающий ваш сайт), тем не менее, это хорошая практика
|
|
193
|
+
html: 'Как разработчик, я знаю, насколько критично правильное обращение с этой информацией. Хотя сертификат технически является <strong>публичной информацией</strong> (отправляется в любой браузер, посещающий ваш сайт), тем не менее, это хорошая практика - не загружать файлы на внешние серверы без необходимости.',
|
|
194
194
|
},
|
|
195
195
|
{
|
|
196
196
|
type: 'paragraph',
|
|
@@ -9,6 +9,7 @@ interface Props {
|
|
|
9
9
|
|
|
10
10
|
const { locale = 'es' } = Astro.props;
|
|
11
11
|
const content = await inspectorCertificadosSsl.i18n[locale]?.();
|
|
12
|
+
if (!content) return null;
|
|
12
13
|
---
|
|
13
14
|
|
|
14
|
-
{content && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -109,19 +109,19 @@ export const content: ToolLocaleContent<JsonFormatterUI> = {
|
|
|
109
109
|
bibliographyTitle: 'Referenzen und Standards',
|
|
110
110
|
bibliography: [
|
|
111
111
|
{
|
|
112
|
-
name: 'RFC 8259
|
|
112
|
+
name: 'RFC 8259 - The JavaScript Object Notation (JSON) Data Interchange Format (IETF)',
|
|
113
113
|
url: 'https://datatracker.ietf.org/doc/html/rfc8259',
|
|
114
114
|
},
|
|
115
115
|
{
|
|
116
|
-
name: 'ECMA-404
|
|
116
|
+
name: 'ECMA-404 - The JSON Data Interchange Syntax (Ecma International)',
|
|
117
117
|
url: 'https://www.ecma-international.org/publications-and-standards/standards/ecma-404/',
|
|
118
118
|
},
|
|
119
119
|
{
|
|
120
|
-
name: 'JSON.org
|
|
120
|
+
name: 'JSON.org - Introducing JSON',
|
|
121
121
|
url: 'https://www.json.org/json-en.html',
|
|
122
122
|
},
|
|
123
123
|
{
|
|
124
|
-
name: 'MDN Web Docs
|
|
124
|
+
name: 'MDN Web Docs - JSON',
|
|
125
125
|
url: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON',
|
|
126
126
|
},
|
|
127
127
|
],
|
|
@@ -109,19 +109,19 @@ export const content: ToolLocaleContent<JsonFormatterUI> = {
|
|
|
109
109
|
bibliographyTitle: 'References and Standards',
|
|
110
110
|
bibliography: [
|
|
111
111
|
{
|
|
112
|
-
name: 'RFC 8259
|
|
112
|
+
name: 'RFC 8259 - The JavaScript Object Notation (JSON) Data Interchange Format (IETF)',
|
|
113
113
|
url: 'https://datatracker.ietf.org/doc/html/rfc8259',
|
|
114
114
|
},
|
|
115
115
|
{
|
|
116
|
-
name: 'ECMA-404
|
|
116
|
+
name: 'ECMA-404 - The JSON Data Interchange Syntax (Ecma International)',
|
|
117
117
|
url: 'https://www.ecma-international.org/publications-and-standards/standards/ecma-404/',
|
|
118
118
|
},
|
|
119
119
|
{
|
|
120
|
-
name: 'JSON.org
|
|
120
|
+
name: 'JSON.org - Introducing JSON',
|
|
121
121
|
url: 'https://www.json.org/json-en.html',
|
|
122
122
|
},
|
|
123
123
|
{
|
|
124
|
-
name: 'MDN Web Docs
|
|
124
|
+
name: 'MDN Web Docs - JSON',
|
|
125
125
|
url: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON',
|
|
126
126
|
},
|
|
127
127
|
],
|