@jjlmoya/utils-developer 1.14.0 → 1.16.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/category/index.ts +2 -1
- package/src/entries.ts +4 -1
- package/src/index.ts +2 -0
- 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/locale_completeness.test.ts +2 -3
- package/src/tests/no_en_dash.test.ts +73 -0
- package/src/tests/pagespeed_best_practices.test.ts +198 -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/tests/tool_validation.test.ts +2 -2
- package/src/tool/aspectRatio/component.astro +3 -1
- 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/component.astro +3 -3
- 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/component.astro +1 -2
- 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/component.astro +4 -5
- 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/component.astro +2 -2
- 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/component.astro +4 -4
- 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/serpPixelSimulator/bibliography.astro +7 -0
- package/src/tool/serpPixelSimulator/bibliography.ts +16 -0
- package/src/tool/serpPixelSimulator/component.astro +84 -0
- package/src/tool/serpPixelSimulator/controller.ts +323 -0
- package/src/tool/serpPixelSimulator/entry.ts +30 -0
- package/src/tool/serpPixelSimulator/i18n/de.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/en.ts +213 -0
- package/src/tool/serpPixelSimulator/i18n/es.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/fr.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/id.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/it.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/ja.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/ko.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/nl.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/pl.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/pt.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/ru.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/sv.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/tr.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/zh.ts +214 -0
- package/src/tool/serpPixelSimulator/index.ts +12 -0
- package/src/tool/serpPixelSimulator/logic.ts +18 -0
- package/src/tool/serpPixelSimulator/seo.astro +12 -0
- package/src/tool/serpPixelSimulator/serp-pixel-simulator.css +335 -0
- package/src/tool/serpPixelSimulator/ui.ts +33 -0
- 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
- package/src/tools.ts +2 -2
|
@@ -15,7 +15,7 @@ const t = (ui ?? {}) as UrlCleanerUI;
|
|
|
15
15
|
<label for="uc-url-input" class="uc-label">{t.labelInput}</label>
|
|
16
16
|
<div class="uc-input-group">
|
|
17
17
|
<input type="url" id="uc-url-input" class="uc-input" placeholder="https://example.com?utm_source=twitter&fbclid=123..." />
|
|
18
|
-
<button id="uc-btn-clean" class="uc-btn-primary">
|
|
18
|
+
<button id="uc-btn-clean" class="uc-btn-primary" type="button">
|
|
19
19
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M19.36 2.72L20.78 4.14L15.06 9.85C16.13 11.39 16.28 13.24 15.38 14.44L9.06 8.12C10.26 7.22 12.11 7.38 13.65 8.44L19.36 2.72M5.93 17.57C3.92 15.56 2.69 13.16 2.35 10.92L7.23 8.83L14.67 16.27L12.58 21.15C10.34 20.81 7.94 19.58 5.93 17.57Z"/></svg>
|
|
20
20
|
{t.btnClean}
|
|
21
21
|
</button>
|
|
@@ -26,7 +26,7 @@ const t = (ui ?? {}) as UrlCleanerUI;
|
|
|
26
26
|
<div class="uc-result-card">
|
|
27
27
|
<div class="uc-card-header">
|
|
28
28
|
<h3 class="uc-card-title">{t.labelCleaned}</h3>
|
|
29
|
-
<button id="uc-btn-copy" class="uc-copy-btn">
|
|
29
|
+
<button id="uc-btn-copy" class="uc-copy-btn" type="button">
|
|
30
30
|
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"/></svg>
|
|
31
31
|
{t.btnCopy}
|
|
32
32
|
</button>
|
|
@@ -161,14 +161,32 @@ const t = (ui ?? {}) as UrlCleanerUI;
|
|
|
161
161
|
if (e.key === 'Enter') cleanUrl();
|
|
162
162
|
});
|
|
163
163
|
|
|
164
|
+
async function copyText(text: string): Promise<void> {
|
|
165
|
+
if (navigator.clipboard?.writeText) {
|
|
166
|
+
await navigator.clipboard.writeText(text);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const textarea = document.createElement('textarea');
|
|
171
|
+
textarea.value = text;
|
|
172
|
+
textarea.setAttribute('readonly', '');
|
|
173
|
+
textarea.style.position = 'fixed';
|
|
174
|
+
textarea.style.inset = '0 auto auto 0';
|
|
175
|
+
textarea.style.opacity = '0';
|
|
176
|
+
document.body.appendChild(textarea);
|
|
177
|
+
textarea.select();
|
|
178
|
+
document.execCommand('copy');
|
|
179
|
+
textarea.remove();
|
|
180
|
+
}
|
|
181
|
+
|
|
164
182
|
copyBtn.addEventListener('click', () => {
|
|
165
183
|
const text = cleanedUrlEl.textContent || '';
|
|
166
|
-
|
|
167
|
-
const
|
|
184
|
+
copyText(text).then(() => {
|
|
185
|
+
const origHtml = copyBtn.innerHTML;
|
|
168
186
|
copyBtn.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"/></svg> ${t.btnCopied}`;
|
|
169
187
|
copyBtn.classList.add('uc-copied');
|
|
170
188
|
setTimeout(() => {
|
|
171
|
-
copyBtn.
|
|
189
|
+
copyBtn.innerHTML = origHtml;
|
|
172
190
|
copyBtn.classList.remove('uc-copied');
|
|
173
191
|
}, 2000);
|
|
174
192
|
});
|
|
@@ -13,15 +13,15 @@ const faqData = [
|
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
15
|
question: 'Beeinträchtigt das die Funktionalität der Website?',
|
|
16
|
-
answer: 'In der Regel nicht. Diese Parameter werden fast ausschließlich für Analyse und Marketing verwendet. Wenn du sie entfernst, lädt die Seite ganz normal
|
|
16
|
+
answer: 'In der Regel nicht. Diese Parameter werden fast ausschließlich für Analyse und Marketing verwendet. Wenn du sie entfernst, lädt die Seite ganz normal - nur der Websitebetreiber kann nicht mehr nachvollziehen, woher dein Klick stammte.',
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
19
|
question: 'Ist es sicher, meine Links hier zu verarbeiten?',
|
|
20
|
-
answer: 'Absolut. Wie alle unsere Tools läuft der Prozess zu 100 % clientseitig ab. Deine Links werden niemals an unsere Server übertragen
|
|
20
|
+
answer: 'Absolut. Wie alle unsere Tools läuft der Prozess zu 100 % clientseitig ab. Deine Links werden niemals an unsere Server übertragen - alles geschieht privat in deinem eigenen Browser.',
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
question: 'Warum sind meine Facebook-Links so lang?',
|
|
24
|
-
answer: 'Facebook hängt an jeden Link, der die Plattform verlässt, einen Parameter namens
|
|
24
|
+
answer: 'Facebook hängt an jeden Link, der die Plattform verlässt, einen Parameter namens "fbclid" an. Damit können sie deine Aktivitäten auf anderen Websites verfolgen - selbst wenn du Drittanbieter-Werbung blockiert hast.',
|
|
25
25
|
},
|
|
26
26
|
];
|
|
27
27
|
|
|
@@ -98,7 +98,7 @@ export const content: ToolLocaleContent<UrlCleanerUI> = {
|
|
|
98
98
|
{ type: 'title', text: '¿Qué es un Limpiador de Tracking de URL y por qué lo necesitas?', level: 3 },
|
|
99
99
|
{
|
|
100
100
|
type: 'paragraph',
|
|
101
|
-
html: 'Alguna vez has copiado un enlace para enviárselo a un amigo y te has dado cuenta de que es tres veces más largo de lo que debería ser? Ese "ruido" extra son los parámetros de rastreo. Un <strong>limpiador de tracking</strong> es una herramienta diseñada para "desnudar" la dirección web de toda la información publicitaria y de seguimiento que las grandes plataformas inyectan en cada clic que haces.',
|
|
101
|
+
html: '¿Alguna vez has copiado un enlace para enviárselo a un amigo y te has dado cuenta de que es tres veces más largo de lo que debería ser? Ese "ruido" extra son los parámetros de rastreo. Un <strong>limpiador de tracking</strong> es una herramienta diseñada para "desnudar" la dirección web de toda la información publicitaria y de seguimiento que las grandes plataformas inyectan en cada clic que haces.',
|
|
102
102
|
},
|
|
103
103
|
{ type: 'title', text: 'Parámetros de rastreo más comunes', level: 3 },
|
|
104
104
|
{
|
|
@@ -13,7 +13,7 @@ const faqData = [
|
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
15
|
question: 'Apakah ini mempengaruhi fungsionalitas website?',
|
|
16
|
-
answer: 'Umumnya tidak. Parameter-parameter ini hampir sepenuhnya digunakan untuk analitik dan pemasaran. Saat Anda menghapusnya, halaman akan tetap terbuka seperti biasa
|
|
16
|
+
answer: 'Umumnya tidak. Parameter-parameter ini hampir sepenuhnya digunakan untuk analitik dan pemasaran. Saat Anda menghapusnya, halaman akan tetap terbuka seperti biasa - hanya saja pemilik website tidak bisa melacak dari mana asal klik Anda.',
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
19
|
question: 'Apakah aman memproses tautan saya di sini?',
|
|
@@ -13,7 +13,7 @@ const faqData = [
|
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
15
|
question: 'Heeft dit invloed op de werking van de website?',
|
|
16
|
-
answer: 'Doorgaans niet. Deze parameters worden vrijwel uitsluitend gebruikt voor analyse en marketing. Als je ze verwijdert, laadt de pagina gewoon
|
|
16
|
+
answer: 'Doorgaans niet. Deze parameters worden vrijwel uitsluitend gebruikt voor analyse en marketing. Als je ze verwijdert, laadt de pagina gewoon - alleen kan de websitebeheerder niet meer zien waar jouw klik vandaan kwam.',
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
19
|
question: 'Is het veilig om mijn links hier te verwerken?',
|
|
@@ -9,6 +9,7 @@ interface Props {
|
|
|
9
9
|
|
|
10
10
|
const { locale = 'es' } = Astro.props;
|
|
11
11
|
const content = await urlCleaner.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 }} />}
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
.uc-root {
|
|
2
2
|
width: 100%;
|
|
3
|
+
min-width: 0;
|
|
3
4
|
}
|
|
4
5
|
|
|
5
6
|
.uc-container {
|
|
7
|
+
container-type: inline-size;
|
|
6
8
|
max-width: 900px;
|
|
7
9
|
margin: 0 auto;
|
|
8
10
|
display: flex;
|
|
9
11
|
flex-direction: column;
|
|
10
12
|
gap: 1.5rem;
|
|
11
13
|
padding-bottom: 2rem;
|
|
14
|
+
min-width: 0;
|
|
12
15
|
}
|
|
13
16
|
|
|
14
17
|
.uc-input-card {
|
|
@@ -22,6 +25,7 @@
|
|
|
22
25
|
display: flex;
|
|
23
26
|
flex-direction: column;
|
|
24
27
|
gap: 1rem;
|
|
28
|
+
min-width: 0;
|
|
25
29
|
}
|
|
26
30
|
|
|
27
31
|
.theme-dark .uc-input-card {
|
|
@@ -44,10 +48,12 @@
|
|
|
44
48
|
.uc-input-group {
|
|
45
49
|
display: flex;
|
|
46
50
|
gap: 0.75rem;
|
|
51
|
+
min-width: 0;
|
|
47
52
|
}
|
|
48
53
|
|
|
49
54
|
.uc-input {
|
|
50
55
|
flex-grow: 1;
|
|
56
|
+
min-width: 0;
|
|
51
57
|
background: white;
|
|
52
58
|
border: 1px solid rgb(226, 232, 240);
|
|
53
59
|
border-radius: 0.75rem;
|
|
@@ -82,6 +88,14 @@
|
|
|
82
88
|
gap: 0.5rem;
|
|
83
89
|
transition: all 0.2s ease;
|
|
84
90
|
font-size: 0.875rem;
|
|
91
|
+
justify-content: center;
|
|
92
|
+
min-height: 2.875rem;
|
|
93
|
+
min-width: 0;
|
|
94
|
+
white-space: nowrap;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.uc-btn-primary svg {
|
|
98
|
+
flex: 0 0 auto;
|
|
85
99
|
}
|
|
86
100
|
|
|
87
101
|
.uc-btn-primary:hover {
|
|
@@ -91,7 +105,7 @@
|
|
|
91
105
|
|
|
92
106
|
.uc-results {
|
|
93
107
|
display: grid;
|
|
94
|
-
grid-template-columns: 1fr 1fr;
|
|
108
|
+
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
|
|
95
109
|
gap: 1.5rem;
|
|
96
110
|
}
|
|
97
111
|
|
|
@@ -112,6 +126,7 @@
|
|
|
112
126
|
display: flex;
|
|
113
127
|
flex-direction: column;
|
|
114
128
|
gap: 1rem;
|
|
129
|
+
min-width: 0;
|
|
115
130
|
}
|
|
116
131
|
|
|
117
132
|
.theme-dark .uc-result-card {
|
|
@@ -123,6 +138,7 @@
|
|
|
123
138
|
display: flex;
|
|
124
139
|
justify-content: space-between;
|
|
125
140
|
align-items: center;
|
|
141
|
+
gap: 1rem;
|
|
126
142
|
}
|
|
127
143
|
|
|
128
144
|
.uc-card-title {
|
|
@@ -132,6 +148,7 @@
|
|
|
132
148
|
margin: 0;
|
|
133
149
|
text-transform: uppercase;
|
|
134
150
|
letter-spacing: 0.05em;
|
|
151
|
+
overflow-wrap: anywhere;
|
|
135
152
|
}
|
|
136
153
|
|
|
137
154
|
.theme-dark .uc-card-title {
|
|
@@ -146,6 +163,7 @@
|
|
|
146
163
|
padding: 1rem;
|
|
147
164
|
border-radius: 0.5rem;
|
|
148
165
|
border: 1px solid rgba(0, 0, 0, 0.05);
|
|
166
|
+
min-width: 0;
|
|
149
167
|
}
|
|
150
168
|
|
|
151
169
|
.theme-dark .uc-url-display {
|
|
@@ -167,6 +185,8 @@
|
|
|
167
185
|
color: rgb(71, 85, 105);
|
|
168
186
|
cursor: pointer;
|
|
169
187
|
transition: all 0.2s ease;
|
|
188
|
+
flex: 0 0 auto;
|
|
189
|
+
white-space: nowrap;
|
|
170
190
|
}
|
|
171
191
|
|
|
172
192
|
.theme-dark .uc-copy-btn {
|
|
@@ -217,6 +237,7 @@
|
|
|
217
237
|
font-size: 0.75rem;
|
|
218
238
|
color: rgb(100, 116, 139);
|
|
219
239
|
margin-left: 0.5rem;
|
|
240
|
+
overflow-wrap: anywhere;
|
|
220
241
|
}
|
|
221
242
|
|
|
222
243
|
.uc-item-desc {
|
|
@@ -246,6 +267,7 @@
|
|
|
246
267
|
display: grid;
|
|
247
268
|
grid-template-columns: 1fr 1fr;
|
|
248
269
|
gap: 1.5rem;
|
|
270
|
+
min-width: 0;
|
|
249
271
|
}
|
|
250
272
|
|
|
251
273
|
.theme-dark .uc-stats-card {
|
|
@@ -277,4 +299,72 @@
|
|
|
277
299
|
|
|
278
300
|
.theme-dark .uc-stat-label {
|
|
279
301
|
color: rgb(148, 163, 184);
|
|
280
|
-
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
@container (max-width: 520px) {
|
|
305
|
+
.uc-container {
|
|
306
|
+
gap: 1rem;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
.uc-input-card,
|
|
310
|
+
.uc-result-card,
|
|
311
|
+
.uc-stats-card {
|
|
312
|
+
border-radius: 1rem;
|
|
313
|
+
padding: 1rem;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
.uc-input-group {
|
|
317
|
+
flex-direction: column;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
.uc-btn-primary {
|
|
321
|
+
width: 100%;
|
|
322
|
+
padding: 0.75rem 1rem;
|
|
323
|
+
white-space: normal;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
.uc-card-header {
|
|
327
|
+
align-items: flex-start;
|
|
328
|
+
flex-direction: column;
|
|
329
|
+
gap: 0.75rem;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
.uc-copy-btn {
|
|
333
|
+
justify-content: center;
|
|
334
|
+
width: 100%;
|
|
335
|
+
border-radius: 0.75rem;
|
|
336
|
+
padding: 0.65rem 0.875rem;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
.uc-stats-card {
|
|
340
|
+
grid-template-columns: 1fr;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
.uc-item-val {
|
|
344
|
+
display: block;
|
|
345
|
+
margin: 0.25rem 0 0;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
@media (max-width: 640px) {
|
|
350
|
+
.uc-container {
|
|
351
|
+
gap: 1rem;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
.uc-input-card,
|
|
355
|
+
.uc-result-card,
|
|
356
|
+
.uc-stats-card {
|
|
357
|
+
border-radius: 1rem;
|
|
358
|
+
padding: 1rem;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
.uc-input-group {
|
|
362
|
+
flex-direction: column;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
.uc-btn-primary {
|
|
366
|
+
width: 100%;
|
|
367
|
+
padding: 0.75rem 1rem;
|
|
368
|
+
white-space: normal;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
@@ -33,15 +33,15 @@ const faqData = [
|
|
|
33
33
|
const howToData = [
|
|
34
34
|
{
|
|
35
35
|
name: 'Rohtext einfügen',
|
|
36
|
-
text: 'Geben Sie Ihre URL oder Zeichenfolge in das obere Feld
|
|
36
|
+
text: 'Geben Sie Ihre URL oder Zeichenfolge in das obere Feld "Rohtext (lesbar)" ein oder fügen Sie sie ein.',
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
39
|
name: 'Kodieren oder Dekodieren',
|
|
40
|
-
text: 'Klicken Sie auf
|
|
40
|
+
text: 'Klicken Sie auf "URL kodieren", um den Text in das sichere Percent-Encoding-Format zu konvertieren, oder auf "Dekodieren", um eine kodierte URL wieder in ihre lesbare Form zu bringen.',
|
|
41
41
|
},
|
|
42
42
|
{
|
|
43
43
|
name: 'Ergebnis kopieren',
|
|
44
|
-
text: 'Verwenden Sie die Schaltfläche
|
|
44
|
+
text: 'Verwenden Sie die Schaltfläche "Kopieren" des entsprechenden Feldes, um das Ergebnis in Ihre Zwischenablage zu übernehmen.',
|
|
45
45
|
},
|
|
46
46
|
];
|
|
47
47
|
|
|
@@ -123,7 +123,7 @@ export const content: ToolLocaleContent<UrlEncoderDecoderUI> = {
|
|
|
123
123
|
},
|
|
124
124
|
{
|
|
125
125
|
type: 'paragraph',
|
|
126
|
-
html: 'Beim Surfen im Internet oder beim Senden von Anfragen an Server betrachtet man eine URL (Uniform Resource Locator) oft einfach als
|
|
126
|
+
html: 'Beim Surfen im Internet oder beim Senden von Anfragen an Server betrachtet man eine URL (Uniform Resource Locator) oft einfach als "Webadresse". Das Internetprotokoll schreibt jedoch vor, dass URLs nur mit einem sehr eingeschränkten Satz von <strong>Standard-ASCII</strong>-Zeichen übertragen werden dürfen.',
|
|
127
127
|
},
|
|
128
128
|
{
|
|
129
129
|
type: 'paragraph',
|
|
@@ -136,7 +136,7 @@ export const content: ToolLocaleContent<UrlEncoderDecoderUI> = {
|
|
|
136
136
|
},
|
|
137
137
|
{
|
|
138
138
|
type: 'paragraph',
|
|
139
|
-
html: 'Wenn Sie dieses Tool verwenden, nimmt der Algorithmus jedes
|
|
139
|
+
html: 'Wenn Sie dieses Tool verwenden, nimmt der Algorithmus jedes "unsichere" Zeichen (wie ein Leerzeichen oder einen Umlaut wie ä) und ersetzt es durch ein Prozentzeichen <code>%</code> gefolgt von zwei hexadezimalen Ziffern, die seinem Wert im UTF-8-Standard entsprechen.',
|
|
140
140
|
},
|
|
141
141
|
{
|
|
142
142
|
type: 'list',
|
|
@@ -11,7 +11,7 @@ const faqData = [
|
|
|
11
11
|
{
|
|
12
12
|
question: 'Quels caractères sont encodés dans une URL ?',
|
|
13
13
|
answer:
|
|
14
|
-
"Tous les caractères non autorisés dans le standard ASCII pour les URLs sont encodés
|
|
14
|
+
"Tous les caractères non autorisés dans le standard ASCII pour les URLs sont encodés: espaces, lettres accentuées, symboles tels que &, =, +, #, ?, / et d'autres. Par exemple, un espace devient %20 et ñ devient %C3%B1.",
|
|
15
15
|
},
|
|
16
16
|
{
|
|
17
17
|
question: 'Quelle est la différence entre encodeURI et encodeURIComponent ?',
|
|
@@ -141,7 +141,7 @@ export const content: ToolLocaleContent<UrlEncoderDecoderUI> = {
|
|
|
141
141
|
{
|
|
142
142
|
type: 'list',
|
|
143
143
|
items: [
|
|
144
|
-
'<strong>Exemple Basique
|
|
144
|
+
'<strong>Exemple Basique:</strong> Un simple espace sera remplacé par son équivalent sécurisé: <code>%20</code>.',
|
|
145
145
|
'<strong>Support Étendu :</strong> La lettre <code>á</code> devient <code>%C3%A1</code>, et <code>ñ</code> devient <code>%C3%B1</code>.',
|
|
146
146
|
],
|
|
147
147
|
},
|
|
@@ -33,15 +33,15 @@ const faqData = [
|
|
|
33
33
|
const howToData = [
|
|
34
34
|
{
|
|
35
35
|
name: 'Wklej surowy tekst',
|
|
36
|
-
text: 'Wpisz lub wklej swój adres URL lub ciąg tekstowy w górnym polu
|
|
36
|
+
text: 'Wpisz lub wklej swój adres URL lub ciąg tekstowy w górnym polu "Tekst surowy (czytelny)".',
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
39
|
name: 'Zakoduj lub dekoduj',
|
|
40
|
-
text: 'Kliknij
|
|
40
|
+
text: 'Kliknij "Koduj URL", aby przekonwertować tekst na bezpieczny format Percent-Encoding, lub "Dekoduj", aby przywrócić zakodowany adres URL do jego czytelnej formy.',
|
|
41
41
|
},
|
|
42
42
|
{
|
|
43
43
|
name: 'Skopiuj wynik',
|
|
44
|
-
text: 'Użyj przycisku
|
|
44
|
+
text: 'Użyj przycisku "Kopiuj" w odpowiednim polu, aby przenieść wynik do schowka.',
|
|
45
45
|
},
|
|
46
46
|
];
|
|
47
47
|
|
|
@@ -123,7 +123,7 @@ export const content: ToolLocaleContent<UrlEncoderDecoderUI> = {
|
|
|
123
123
|
},
|
|
124
124
|
{
|
|
125
125
|
type: 'paragraph',
|
|
126
|
-
html: 'Podczas przeglądania Internetu lub wysyłania żądań do serwerów często myślimy o adresie URL (Uniform Resource Locator) po prostu jako o
|
|
126
|
+
html: 'Podczas przeglądania Internetu lub wysyłania żądań do serwerów często myślimy o adresie URL (Uniform Resource Locator) po prostu jako o "adresie internetowym". Jednak protokół internetowy dyktuje, że adresy URL mogą być przesyłane wyłącznie przy użyciu bardzo ograniczonego zestawu <strong>standardowych znaków ASCII</strong>.',
|
|
127
127
|
},
|
|
128
128
|
{
|
|
129
129
|
type: 'paragraph',
|
|
@@ -136,7 +136,7 @@ export const content: ToolLocaleContent<UrlEncoderDecoderUI> = {
|
|
|
136
136
|
},
|
|
137
137
|
{
|
|
138
138
|
type: 'paragraph',
|
|
139
|
-
html: 'Gdy korzystasz z tego narzędzia, algorytm pobiera dowolny
|
|
139
|
+
html: 'Gdy korzystasz z tego narzędzia, algorytm pobiera dowolny "niebezpieczny" znak (taki jak spacja lub litera z akcentem, np. ñ) i zastępuje go znakiem procenta <code>%</code>, po którym następują dwie cyfry szesnastkowe odpowiadające jego wartości w standardzie UTF-8.',
|
|
140
140
|
},
|
|
141
141
|
{
|
|
142
142
|
type: 'list',
|
|
@@ -11,7 +11,7 @@ const faqData = [
|
|
|
11
11
|
{
|
|
12
12
|
question: 'Какие символы кодируются в URL?',
|
|
13
13
|
answer:
|
|
14
|
-
'Кодируются все символы, не разрешенные стандартом ASCII для URL: пробелы, буквы с диакритическими знаками, символы, такие как &, =, +, #, ?, / и другие. Например, пробел заменяется на %20, а ñ
|
|
14
|
+
'Кодируются все символы, не разрешенные стандартом ASCII для URL: пробелы, буквы с диакритическими знаками, символы, такие как &, =, +, #, ?, / и другие. Например, пробел заменяется на %20, а ñ - на %C3%B1.',
|
|
15
15
|
},
|
|
16
16
|
{
|
|
17
17
|
question: 'В чем разница между encodeURI и encodeURIComponent?',
|
|
@@ -21,7 +21,7 @@ const faqData = [
|
|
|
21
21
|
{
|
|
22
22
|
question: 'Почему в моем URL-адресе %20 вместо пробелов?',
|
|
23
23
|
answer:
|
|
24
|
-
'Протокол HTTP не допускает использования пробелов в URL-адресах. %20
|
|
24
|
+
'Протокол HTTP не допускает использования пробелов в URL-адресах. %20 - это представление пробела в кодировке Percent-Encoding согласно стандарту ASCII. Некоторые системы используют знак + в качестве альтернативы, но %20 является наиболее универсальным и безопасным.',
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
27
|
question: 'Безопасно ли использовать этот инструмент с личными URL-адресами?',
|
|
@@ -33,15 +33,15 @@ const faqData = [
|
|
|
33
33
|
const howToData = [
|
|
34
34
|
{
|
|
35
35
|
name: 'Вставьте исходный текст',
|
|
36
|
-
text: 'Введите или вставьте ваш URL-адрес или текстовую строку в верхнее поле
|
|
36
|
+
text: 'Введите или вставьте ваш URL-адрес или текстовую строку в верхнее поле "Исходный текст (читаемый)".',
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
39
|
name: 'Закодируйте или декодируйте',
|
|
40
|
-
text: 'Нажмите
|
|
40
|
+
text: 'Нажмите "Закодировать URL", чтобы преобразовать текст в безопасный формат Percent-Encoding, или "Декодировать", чтобы вернуть закодированный URL-адрес в читаемый вид.',
|
|
41
41
|
},
|
|
42
42
|
{
|
|
43
43
|
name: 'Скопируйте результат',
|
|
44
|
-
text: 'Используйте кнопку
|
|
44
|
+
text: 'Используйте кнопку "Копировать" в соответствующем поле, чтобы перенести результат в буфер обмена.',
|
|
45
45
|
},
|
|
46
46
|
];
|
|
47
47
|
|
|
@@ -123,7 +123,7 @@ export const content: ToolLocaleContent<UrlEncoderDecoderUI> = {
|
|
|
123
123
|
},
|
|
124
124
|
{
|
|
125
125
|
type: 'paragraph',
|
|
126
|
-
html: 'При просмотре веб-страниц или отправке запросов на серверы часто думают об URL (Uniform Resource Locator) просто как о
|
|
126
|
+
html: 'При просмотре веб-страниц или отправке запросов на серверы часто думают об URL (Uniform Resource Locator) просто как о "веб-адресе". Однако интернет-протокол диктует, что URL-адреса могут передаваться только с использованием очень ограниченного набора <strong>стандартных символов ASCII</strong>.',
|
|
127
127
|
},
|
|
128
128
|
{
|
|
129
129
|
type: 'paragraph',
|
|
@@ -136,13 +136,13 @@ export const content: ToolLocaleContent<UrlEncoderDecoderUI> = {
|
|
|
136
136
|
},
|
|
137
137
|
{
|
|
138
138
|
type: 'paragraph',
|
|
139
|
-
html: 'Когда вы используете этот инструмент, алгоритм берет любой
|
|
139
|
+
html: 'Когда вы используете этот инструмент, алгоритм берет любой "небезопасный" символ (например, пробел или букву с диакритическим знаком, такую как ñ) и заменяет его знаком процента <code>%</code>, за которым следуют две шестнадцатеричные цифры, соответствующие его значению в стандарте UTF-8.',
|
|
140
140
|
},
|
|
141
141
|
{
|
|
142
142
|
type: 'list',
|
|
143
143
|
items: [
|
|
144
144
|
'<strong>Базовый пример:</strong> обычный пробел будет заменен его безопасным эквивалентом: <code>%20</code>.',
|
|
145
|
-
'<strong>Расширенная поддержка:</strong> буква <code>ё</code> заменяется на <code>%D1%91</code>, а <code>й</code>
|
|
145
|
+
'<strong>Расширенная поддержка:</strong> буква <code>ё</code> заменяется на <code>%D1%91</code>, а <code>й</code> - на <code>%D0%B9</code>.',
|
|
146
146
|
],
|
|
147
147
|
},
|
|
148
148
|
{
|
|
@@ -33,15 +33,15 @@ const faqData = [
|
|
|
33
33
|
const howToData = [
|
|
34
34
|
{
|
|
35
35
|
name: 'Klistra in råtexten',
|
|
36
|
-
text: 'Skriv eller klistra in din URL eller textsträng i det övre fältet
|
|
36
|
+
text: 'Skriv eller klistra in din URL eller textsträng i det övre fältet "Råtext (läsbar)".',
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
39
|
name: 'Koda eller avkoda',
|
|
40
|
-
text: 'Klicka på
|
|
40
|
+
text: 'Klicka på "Koda URL" för att konvertera texten till det säkra Percent-Encoding-formatet, eller "Avkoda" för att återställa en kodad URL till dess läsbara form.',
|
|
41
41
|
},
|
|
42
42
|
{
|
|
43
43
|
name: 'Kopiera resultatet',
|
|
44
|
-
text: 'Använd knappen
|
|
44
|
+
text: 'Använd knappen "Kopiera" i motsvarande fält för att ta resultatet till ditt urklipp.',
|
|
45
45
|
},
|
|
46
46
|
];
|
|
47
47
|
|
|
@@ -123,7 +123,7 @@ export const content: ToolLocaleContent<UrlEncoderDecoderUI> = {
|
|
|
123
123
|
},
|
|
124
124
|
{
|
|
125
125
|
type: 'paragraph',
|
|
126
|
-
html: 'När man surfar på internet eller skickar förfrågningar till servrar är det vanligt att tänka på en URL (Uniform Resource Locator) helt enkelt som en
|
|
126
|
+
html: 'När man surfar på internet eller skickar förfrågningar till servrar är det vanligt att tänka på en URL (Uniform Resource Locator) helt enkelt som en "webbadress". Internetprotokoll föreskriver dock att URL:er endast kan överföras med en mycket begränsad uppsättning <strong>standard-ASCII</strong>-tecken.',
|
|
127
127
|
},
|
|
128
128
|
{
|
|
129
129
|
type: 'paragraph',
|
|
@@ -136,7 +136,7 @@ export const content: ToolLocaleContent<UrlEncoderDecoderUI> = {
|
|
|
136
136
|
},
|
|
137
137
|
{
|
|
138
138
|
type: 'paragraph',
|
|
139
|
-
html: 'När du använder det här verktyget tar algoritmen alla
|
|
139
|
+
html: 'När du använder det här verktyget tar algoritmen alla "osäkra" tecken (som ett blanksteg eller ett tecken med accent som ñ) och ersätter det med ett procenttecken <code>%</code> följt av två hexadecimala siffror som motsvarar dess värde i UTF-8-standarden.',
|
|
140
140
|
},
|
|
141
141
|
{
|
|
142
142
|
type: 'list',
|
|
@@ -33,15 +33,15 @@ const faqData = [
|
|
|
33
33
|
const howToData = [
|
|
34
34
|
{
|
|
35
35
|
name: '粘贴原始文本',
|
|
36
|
-
text: '
|
|
36
|
+
text: '在上方"原始文本(可读)"字段中输入或粘贴您的 URL 或文本字符串。',
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
39
|
name: '编码或解码',
|
|
40
|
-
text: '
|
|
40
|
+
text: '点击"URL 编码"将文本转换为安全的百分比编码格式,或点击"解码"将已编码的 URL 恢复为可读形式。',
|
|
41
41
|
},
|
|
42
42
|
{
|
|
43
43
|
name: '复制结果',
|
|
44
|
-
text: '
|
|
44
|
+
text: '使用对应字段的"复制"按钮将结果保存到剪贴板。',
|
|
45
45
|
},
|
|
46
46
|
];
|
|
47
47
|
|
|
@@ -123,7 +123,7 @@ export const content: ToolLocaleContent<UrlEncoderDecoderUI> = {
|
|
|
123
123
|
},
|
|
124
124
|
{
|
|
125
125
|
type: 'paragraph',
|
|
126
|
-
html: '在浏览互联网或向服务器发送请求时,人们通常将 URL
|
|
126
|
+
html: '在浏览互联网或向服务器发送请求时,人们通常将 URL(统一资源定位符)简单地视为"网址"。然而,互联网协议规定 URL 只能使用非常有限的 <strong>标准 ASCII</strong> 字符集进行传输。',
|
|
127
127
|
},
|
|
128
128
|
{
|
|
129
129
|
type: 'paragraph',
|
|
@@ -136,7 +136,7 @@ export const content: ToolLocaleContent<UrlEncoderDecoderUI> = {
|
|
|
136
136
|
},
|
|
137
137
|
{
|
|
138
138
|
type: 'paragraph',
|
|
139
|
-
html: '
|
|
139
|
+
html: '当您使用此工具时,算法会将任何"不安全"的字符(如空格或 ñ 等带重音符号的字母)替换为百分号 <code>%</code>,后跟与其在 UTF-8 标准中的值相对应的两个十六进制数字。',
|
|
140
140
|
},
|
|
141
141
|
{
|
|
142
142
|
type: 'list',
|
|
@@ -9,6 +9,7 @@ interface Props {
|
|
|
9
9
|
|
|
10
10
|
const { locale = 'es' } = Astro.props;
|
|
11
11
|
const content = await urlEncoderDecoder.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 }} />}
|
|
@@ -17,7 +17,7 @@ const faqData = [
|
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
19
|
question: 'Unterscheidet Google Analytics bei UTM zwischen Groß- und Kleinschreibung?',
|
|
20
|
-
answer: 'Ja.
|
|
20
|
+
answer: 'Ja. "google", "Google" und "GOOGLE" werden als unterschiedliche Quellen behandelt. Achten Sie immer auf Konsistenz, am besten verwenden Sie nur Kleinschreibung.',
|
|
21
21
|
},
|
|
22
22
|
];
|
|
23
23
|
|
|
@@ -107,7 +107,7 @@ export const content: ToolLocaleContent<UtmGeneratorUI> = {
|
|
|
107
107
|
{
|
|
108
108
|
type: 'list',
|
|
109
109
|
items: [
|
|
110
|
-
'<strong>Einheitliche Schreibweise:</strong> Tools unterscheiden zwischen
|
|
110
|
+
'<strong>Einheitliche Schreibweise:</strong> Tools unterscheiden zwischen "Google", "GOOGLE" und "google". Verwenden Sie immer Kleinschreibung, um Duplikate zu vermeiden.',
|
|
111
111
|
'<strong>Leerzeichen vermeiden:</strong> Leerzeichen werden zu %20. Verwenden Sie stattdessen Bindestriche (-) oder Unterstriche (_).',
|
|
112
112
|
'<strong>Nicht bei internen Links verwenden:</strong> UTM-Tracking ist ausschließlich für externen Traffic gedacht. Bei internen Links unterbricht es die Sitzung und verfälscht wichtige Kennzahlen.',
|
|
113
113
|
'<strong>Dokumentieren Sie Ihre Tags:</strong> Führen Sie Protokoll über alle verwendeten Kombinationen, um Inkonsistenzen zu vermeiden.',
|
|
@@ -17,7 +17,7 @@ const faqData = [
|
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
19
|
question: 'Czy Google Analytics rozróżnia wielkość liter w UTM?',
|
|
20
|
-
answer: 'Tak.
|
|
20
|
+
answer: 'Tak. "google", "Google" i "GOOGLE" będą traktowane jako różne źródła. Zawsze zachowuj spójność, najlepiej używając tylko małych liter.',
|
|
21
21
|
},
|
|
22
22
|
];
|
|
23
23
|
|
|
@@ -81,8 +81,8 @@ export const content: ToolLocaleContent<UtmGeneratorUI> = {
|
|
|
81
81
|
faq: faqData,
|
|
82
82
|
bibliographyTitle: 'Referencje',
|
|
83
83
|
bibliography: [
|
|
84
|
-
{ name: 'Gromadzenie danych kampanii za pomocą niestandardowych adresów URL
|
|
85
|
-
{ name: 'Najlepsze praktyki tagowania adresów URL kampanii
|
|
84
|
+
{ name: 'Gromadzenie danych kampanii za pomocą niestandardowych adresów URL - Pomoc Google Analytics (2024)', url: 'https://support.google.com/analytics/answer/1033863' },
|
|
85
|
+
{ name: 'Najlepsze praktyki tagowania adresów URL kampanii - Blog VWO (2023)', url: 'https://vwo.com/blog/utm-tagging-best-practices/' },
|
|
86
86
|
],
|
|
87
87
|
howTo: howToData,
|
|
88
88
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
@@ -99,7 +99,7 @@ export const content: ToolLocaleContent<UtmGeneratorUI> = {
|
|
|
99
99
|
'<strong>Źródło kampanii:</strong> Identyfikuje wyszukiwarkę, sieć społecznościową lub pochodzenie ruchu. Przykład: google, newsletter, facebook.',
|
|
100
100
|
'<strong>Medium kampanii:</strong> Odnosi się do kanału marketingowego. Przykład: cpc, e-mail, social, banner, organic.',
|
|
101
101
|
'<strong>Nazwa kampanii:</strong> Konkretna nazwa Twojej kampanii. Przykład: oferta_letnia_2025, app_launch_v2.',
|
|
102
|
-
'<strong>Termin kampanii:</strong> W przypadku wyszukiwania płatnego
|
|
102
|
+
'<strong>Termin kampanii:</strong> W przypadku wyszukiwania płatnego - słowa kluczowe, na które licytujesz. Przykład: kup_buty_sportowe.',
|
|
103
103
|
'<strong>Treść kampanii:</strong> Do testów A/B. Rozróżnia podobne elementy w ramach kampanii. Przykład: header_v1, sidebar_v2.',
|
|
104
104
|
],
|
|
105
105
|
},
|
|
@@ -107,7 +107,7 @@ export const content: ToolLocaleContent<UtmGeneratorUI> = {
|
|
|
107
107
|
{
|
|
108
108
|
type: 'list',
|
|
109
109
|
items: [
|
|
110
|
-
'<strong>Spójność wielkości liter:</strong> Narzędzia rozróżniają
|
|
110
|
+
'<strong>Spójność wielkości liter:</strong> Narzędzia rozróżniają "Google", "GOOGLE" i "google". Zawsze używaj małych liter, aby uniknąć duplikatów.',
|
|
111
111
|
'<strong>Unikaj spacji:</strong> Spacje zmieniają się w %20. Zamiast nich używaj łączników (-) lub podkreśleń (_).',
|
|
112
112
|
'<strong>Nie używaj w linkach wewnętrznych:</strong> Śledzenie UTM służy wyłącznie do ruchu zewnętrznego. W linkach wewnętrznych przerywa sesję i psuje kluczowe wskaźniki.',
|
|
113
113
|
'<strong>Dokumentuj swoje tagi:</strong> Prowadź rejestr wszystkich używanych kombinacji, aby zapobiec niespójnościom.',
|