PageSourceSearch

https://mrdev-studio.pl/assets/GeneratorHreflang-Cpo-dF_Z.js

js mrdev-studio.pl collected 2026-09-24 15:11:03 UTC 12,775 bytes, 12 lines download raw bytes

1import{j as e}from"./vendor-motion-CJ7_hwUm.js";import{r as k}from"./vendor-router-BS3aRNYz.js";import{T as G,a as N,l as y,f as h,I as u,C as $}from"./ToolPageLayout-Cf6CXVSL.js";import{a as T}from"./index-CSy7JWBg.js";import"./ContactSection-BtpFAFdz.js";import"./pricing-IHJO1nJ8.js";const m={slug:"narzedzia/generator-hreflang",pageTitle:"Generator hreflang — tagi wersji językowych i wpisy sitemap",metaDescription:'Darmowy generator tagów hreflang: dodaj wersje językowe strony, a otrzymasz komplet wzajemnych tagów link rel="alternate" oraz wpisy do mapy XML — z walidacją kodów i x-default.',heroKicker:"Darmowe narzędzie SEO",heroTitle:["Generator","hreflang."],heroSubtitle:"Strona po polsku, angielsku i niemiecku? Hreflang mówi Google, którą wersję pokazać użytkownikowi w danym kraju — ale wymaga kompletu wzajemnych odwołań na każdej wersji. Ten generator buduje je bezbłędnie: tagi do <head> i wpisy do mapy XML.",defaults:{rows:[{lang:"pl",region:"",url:"https://twojafirma.pl/"},{lang:"en",region:"",url:"https://twojafirma.pl/en/"},{lang:"de",region:"",url:"https://twojafirma.pl/de/"}],xDefaultIndex:0},languages:[{code:"pl",label:"polski"},{code:"en",label:"angielski"},{code:"de",label:"niemiecki"},{code:"uk",label:"ukraiński"},{code:"cs",label:"czeski"},{code:"sk",label:"słowacki"},{code:"fr",label:"francuski"},{code:"es",label:"hiszpański"},{code:"it",label:"włoski"},{code:"nl",label:"niderlandzki"},{code:"sv",label:"szwedzki"},{code:"no",label:"norweski"},{code:"da",label:"duński"},{code:"lt",label:"litewski"},{code:"ru",label:"rosyjski"}],regions:[{code:"",label:"— bez regionu —"},{code:"PL",label:"Polska"},{code:"GB",label:"Wielka Brytania"},{code:"US",label:"USA"},{code:"DE",label:"Niemcy"},{code:"AT",label:"Austria"},{code:"CH",label:"Szwajcaria"},{code:"UA",label:"Ukraina"},{code:"CZ",label:"Czechy"},{code:"SK",label:"Słowacja"},{code:"FR",label:"Francja"},{code:"ES",label:"Hiszpania"},{code:"IT",label:"Włochy"},{code:"NL",label:"Holandia"},{code:"IE",label:"Irlandia"}],seoSections:[{heading:"Jak działa hreflang i dlaczego tak łatwo go zepsuć?",paragraphs:['Hreflang to adnotacja mówiąca Google: „ta sama treść istnieje w innych językach — użytkownikowi z Niemiec pokaż wersję de, Polakowi wersję pl". Bez niej Google potrafi pokazać Niemcowi polską wersję strony (bo ma mocniejsze sygnały) albo potraktować wersje językowe jako duplikaty.',"Najczęstszy błąd to brak wzajemności: jeśli strona polska wskazuje angielską, to angielska MUSI wskazywać polską — i obie muszą wskazywać także same siebie. Google ignoruje tagi bez potwierdzenia zwrotnego. Dlatego ten generator tworzy jeden komplet tagów, identyczny dla każdej wersji językowej: wklejasz ten sam blok do <head> każdej z nich i wzajemność jest zapewniona z definicji.",'Druga pułapka to kody: hreflang używa kodów języka ISO 639-1 (pl, en, de) z opcjonalnym kodem kraju ISO 3166-1 (en-GB, de-AT). Popularne błędy — „en-UK" zamiast „en-GB", „cz" zamiast „cs", sam kod kraju bez języka — sprawiają, że Google tag po cichu ignoruje. Generator waliduje kody, zanim cokolwiek wygenerujesz.']},{heading:"Tagi w <head> czy w mapie XML — co wybrać?",paragraphs:["Google akceptuje hreflang w trzech miejscach: tagach <link> w <head>, nagłówkach HTTP i mapie strony XML. W praktyce wybierasz między pierwszym a ostatnim:"],tips:[{icon:"code",title:"Tagi <link> — prościej",text:"Najłatwiejsze do wdrożenia (wklejasz w szablon strony) i do debugowania (widać w źródle). Minus: powiększają każdy dokument HTML — przy kilkunastu wersjach językowych robi się z tego zauważalny narzut."},{icon:"account_tree",title:"Sitemap XML — czyściej przy skali",text:"Wpisy xhtml:link w mapie strony nie obciążają HTML-a i łatwiej nimi zarządzać centralnie — naturalny wybór dla sklepów i serwisów z wieloma rynkami."},{icon:"public",title:"x-default dla reszty świata",text:"Wersja x-default trafia do użytkowników, których język nie pasuje do żadnej wersji. Zwykle wskazuje się wersję angielską albo stronę wyboru języka — generator pozwala oznaczyć ją jednym kliknięciem."},{icon:"rule",title:"Jedno miejsce, nie dwa",text:"Wybierz tagi ALBO sitemap — duplikowanie hreflang w obu miejscach utrudnia utrzymanie i grozi sprzecznymi sygnałami po pierwszej zmianie adresów."}]}],faqHeading:"Pytania o hreflang",faqItems:[{question:"Czy hreflang jest potrzebny, jeśli strona ma tylko polską wersję?",answer:'Nie. Hreflang ma sens dopiero przy co najmniej dwóch wersjach językowych lub regionalnych tej samej treści. Dla jednojęzycznej strony wystarczy poprawny atrybut lang w znaczniku <html> (np. lang="pl"). Hreflang „na zapas" niczego nie poprawia.'},{question:'Czym różni się hreflang="en" od hreflang="en-GB"?',answer:'Sam kod języka (en) celuje we wszystkich anglojęzycznych użytkowników. Kod z regionem (en-GB) — tylko w tych z Wielkiej Brytanii. Regionów używaj, gdy naprawdę masz osobne treści dla rynków (inne ceny, waluty, oferta): np. de-DE i de-AT. Jeśli masz jedną wersję angielską dla całego świata — użyj samego „en", nie „en-US".'},{question:"Co to jest x-default i czy muszę go dodawać?",answer:"X-default wskazuje wersję dla użytkowników, których język nie pasuje do żadnej zadeklarowanej wersji — na przykład Francuza na stronie dostępnej po polsku i angielsku. Nie jest obowiązkowy, ale Google go zaleca. Zwykle wskazuje wersję angielską lub stronę wyboru języka. Bez x-default Google sam wybierze wersję, niekoniecznie trafnie."},{question:"Dlaczego Google ignoruje moje tagi hreflang?",answer:'Trzy najczęstsze powody: brak wzajemności (wersja A wskazuje B, ale B nie wskazuje A — takie tagi są pomijane), błędne kody („en-UK", „cz", sam kod kraju) oraz adresy niedostępne dla robota (przekierowania, noindex, blokada w robots.txt). Ten generator eliminuje dwa pierwsze; trzeci sprawdzisz testerem robots.txt obok.'}],relatedLinks:[{to:"/narzedzia",label:"Wszystkie darmowe narzędzia SEO"},{to:"/narzedzia/tester-robots",label:"Tester robots.txt"},{to:"/narzedzia/generator-schema",label:"Generator schema.org (JSON-LD)"},{to:"/blog/audyt-strony-internetowej",label:"Audyt strony internetowej — przewodnik"},{to:"/audyt",label:"Bezpłatny audyt strony"}],auditCta:{kicker:"Wersje językowe to dopiero początek",heading:`Upewnij 
1się, że Google widzi
2Twoją stronę tak, jak chcesz.`,text:"Hreflang, indeksacja, dane strukturalne, szybkość — bezpłatny audyt sprawdzi techniczne fundamenty Twojej strony w 30 sekund i wskaże, co wymaga uwagi."}},b=n=>n.region?`${n.lang}-${n.region}`:n.lang,L=(n,l)=>{const t=[],c=new Map;n.forEach((d,p)=>{const s=b(d);if(!d.url.trim()){t.push({type:"error",msg:`Wiersz ${p+1}: brak adresu URL.`});return}try{const w=new URL(d.url.trim());if(w.protocol!=="https:"&&w.protocol!=="http:")throw new Error}catch(w){t.push({type:"error",msg:`Wiersz ${p+1}: adres musi być pełnym URL-em (z https://).`})}c.has(s)&&t.push({type:"error",msg:`Kod ${s} występuje ${c.get(s)+1}. raz — każda wersja językowa musi mieć unikalny kod.`}),c.set(s,(c.get(s)||0)+1)});const i=n.map(d=>d.url.trim()).filter(Boolean);return new Set(i).size!==i.length&&t.push({type:"warn",msg:"Ten sam URL występuje w kilku wierszach — zwykle każda wersja językowa ma osobny adres."}),i.some(d=>d.startsWith("http://"))&&t.push({type:"warn",msg:"Część adresów używa http:// — hreflang powinien wskazywać docelowe (https) wersje."}),l==null&&t.push({type:"warn",msg:"Brak wersji x-default — Google zaleca wskazać wersję domyślną dla pozostałych języków."}),t},R=(n,l)=>{const t=n.filter(s=>s.url.trim()),c=t.map(s=>`<link rel="alternate" hreflang="${b(s)}" href="${s.url.trim()}" />`);l!=null&&t[l]&&c.push(`<link rel="alternate" hreflang="x-default" href="${t[l].url.trim()}" />`);const i=c.join(`
3`),p=`<?xml version="1.0" encoding="UTF-8"?>
4<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
5        xmlns:xhtml="http://www.w3.org/1999/xhtml">
6${t.map(s=>{const w=[...t.map(j=>`    <xhtml:link rel="alternate" hreflang="${b(j)}" href="${j.url.trim()}"/>`),...l!=null&&t[l]?[`    <xhtml:link rel="alternate" hreflang="x-default" href="${t[l].url.trim()}"/>`]:[]].join(`
7`);return`  <url>
8    <loc>${s.url.trim()}</loc>
9${w}
10  </url>`}).join(`
11`)}
12</urlset>`;return{head:i,sitemap:p}},E=()=>{const[n,l]=k.useState(m.defaults.rows),[t,c]=k.useState(m.defaults.xDefaultIndex),[i,d]=k.useState("head"),p=k.useRef(!1),s=()=>{p.current||(p.current=!0,T("tool_use",{tool:"generator-hreflang"}))},w=(a,r,o)=>{s(),l(z=>z.map((f,v)=>v===a?{...f,[r]:o}:f))},j=()=>l(a=>[...a,{lang:"en",region:"",url:""}]),S=a=>{l(r=>r.filter((o,z)=>z!==a)),c(r=>r===a?null:r>a?r-1:r)},g=L(n,t),x=R(n,t),C=g.some(a=>a.type==="error");return e.jsx(G,{data:m,children:e.jsxs("div",{className:"grid lg:grid-cols-2 gap-6 items-start",children:[e.jsxs(N,{children:[e.jsxs("div",{className:"hidden md:grid grid-cols-[1fr_1fr_2fr_60px_36px] gap-3 px-1 mb-2",children:[e.jsx("span",{className:y,children:"Język"}),e.jsx("span",{className:y,children:"Region"}),e.jsx("span",{className:y,children:"Adres URL wersji"}),e.jsx("span",{className:y,children:"x-def."}),e.jsx("span",{})]}),e.jsx("div",{className:"space-y-3",children:n.map((a,r)=>e.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-[1fr_1fr_2fr_60px_36px] gap-3 items-center",children:[e.jsx("select",{className:`${h} cursor-pointer`,value:a.lang,onChange:o=>w(r,"lang",o.target.value),"aria-label":"Język",children:m.languages.map(o=>e.jsxs("option",{value:o.code,style:{background:"#0a0f1e"},children:[o.code," — ",o.label]},o.code))}),e.jsx("select",{className:`${h} cursor-pointer`,value:a.region,onChange:o=>w(r,"region",o.target.value),"aria-label":"Region",children:m.regions.map(o=>e.jsx("option",{value:o.code,style:{background:"#0a0f1e"},children:o.code?`${o.code} — ${o.label}`:o.label},o.code))}),e.jsx("input",{className:`${h} col-span-2 md:col-span-1 font-mono !text-xs`,placeholder:"https://twojafirma.pl/en/",value:a.url,onChange:o=>w(r,"url",o.target.value),"aria-label":"Adres URL wersji językowej"}),e.jsx("label",{className:"flex items-center justify-center cursor-pointer",title:"Wersja x-default",children:e.jsx("input",{type:"radio",name:"xdefault",className:"accent-[#2b6cee] w-4 h-4 cursor-pointer",checked:t===r,onChange:()=>{s(),c(r)}})}),e.jsx("button",{type:"button",onClick:()=>S(r),"aria-label":"Usuń wiersz",className:"flex items-center justify-center w-9 h-9 rounded-lg text-gray-600 hover:text-red-400 hover:bg-white/[0.04] transition-colors cursor-pointer",children:e.jsx(u,{name:"close",className:"text-[18px]"})})]},r))}),e.jsxs("button",{type:"button",onClick:j,className:"mt-4 inline-flex items-center gap-1.5 px-4 py-2 rounded-full text-xs font-bold text-primary transition-colors hover:bg-primary/10 cursor-pointer",style:{border:"1px solid rgba(43,108,238,0.35)"},children:[e.jsx(u,{name:"add",className:"text-[16px]"})," Dodaj wersję językową"]}),g.length>0&&e.jsx("div",{className:"mt-4 space-y-1.5",children:g.map((a,r)=>
12e.jsxs("p",{className:`text-xs flex items-start gap-1.5 ${a.type==="error"?"text-red-400":"text-amber-400"}`,children:[e.jsx(u,{name:a.type==="error"?"error":"warning",className:"text-[14px] mt-0.5 shrink-0"}),a.msg]},r))}),!C&&n.some(a=>a.url.trim())&&e.jsxs("p",{className:"mt-4 text-xs font-bold text-emerald-400 flex items-center gap-1.5",children:[e.jsx(u,{name:"check_circle",className:"text-[14px]"}),"Komplet wzajemnych odwołań — ten sam blok wklej na KAŻDEJ wersji językowej."]})]}),e.jsxs(N,{children:[e.jsx("div",{className:"flex items-center gap-2 mb-4",children:[{id:"head",label:"Tagi <head>",icon:"code"},{id:"sitemap",label:"Sitemap XML",icon:"account_tree"}].map(a=>e.jsxs("button",{type:"button",onClick:()=>d(a.id),className:"inline-flex items-center gap-1.5 px-4 py-2 rounded-full text-xs font-bold transition-colors cursor-pointer",style:i===a.id?{background:"rgba(43,108,238,0.15)",color:"#93c5fd",border:"1px solid rgba(43,108,238,0.4)"}:{background:"transparent",color:"#6b7280",border:"1px solid rgba(255,255,255,0.08)"},children:[e.jsx(u,{name:a.icon,className:"text-[14px]"}),a.label]},a.id))}),e.jsx("pre",{className:"rounded-xl px-4 py-3 text-xs font-mono leading-relaxed text-gray-300 overflow-x-auto max-h-[380px] overflow-y-auto",style:{background:"#060a14",border:"1px solid rgba(255,255,255,0.06)"},children:x[i]||"— uzupełnij wersje językowe po lewej —"}),e.jsx("div",{className:"mt-4",children:e.jsx($,{text:x[i],label:i==="head"?"Kopiuj tagi":"Kopiuj sitemap",onCopy:()=>T("tool_copy",{tool:"generator-hreflang",format:i})})})]})]})})};export{E as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.