[{"data":1,"prerenderedAt":677},["ShallowReactive",2],{"blog-llm-translation-pipeline-i18n-hu":3},{"slug":4,"published":5,"minutes":6,"category":7,"tags":8,"keywords":14,"about":26,"sources":36,"cover":69,"og":70,"expertise":71,"locales":72,"lang":75,"title":76,"description":77,"coverAlt":78,"metaTitle":79,"takeaways":80,"faq":86,"toc":102,"blocks":136,"others":427},"llm-translation-pipeline-i18n","2026-10-17",9,"web",[9,10,11,12,13],"Translation","i18n","LLM","Vue","Localization",[15,16,17,18,19,20,21,22,23,24,25],"llm translation pipeline","icu messageformat placeholders","vue i18n llm translation","translation memory llm","glossary enforcement translation","german informal sie du","hungarian translation quality llm","structured output json translation","machine translation post-editing","locale file validation","cldr plural categories",[27,30,33],{"name":28,"url":29},"Internationalization and localization","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FInternationalization_and_localization",{"name":31,"url":32},"ICU MessageFormat","https:\u002F\u002Funicode-org.github.io\u002Ficu\u002Fuserguide\u002Fformat_parse\u002Fmessages\u002F",{"name":34,"url":35},"Vue I18n","https:\u002F\u002Fvue-i18n.intlify.dev\u002F",[37,39,42,45,48,51,54,57,60,63,66],{"title":38,"url":32},"Unicode ICU User Guide: Formatting Messages",{"title":40,"url":41},"Vue I18n: Message Format Syntax","https:\u002F\u002Fvue-i18n.intlify.dev\u002Fguide\u002Fessentials\u002Fsyntax",{"title":43,"url":44},"Nuxt i18n: Getting started","https:\u002F\u002Fi18n.nuxtjs.org\u002Fdocs\u002Fgetting-started",{"title":46,"url":47},"Unicode CLDR: Plural rules","https:\u002F\u002Fcldr.unicode.org\u002Findex\u002Fcldr-spec\u002Fplural-rules",{"title":49,"url":50},"OpenAI: Structured outputs","https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Fstructured-outputs",{"title":52,"url":53},"DeepL API: Glossaries","https:\u002F\u002Fdevelopers.deepl.com\u002Fdocs\u002Fapi-reference\u002Fglossaries",{"title":55,"url":56},"W3C: Localization vs. internationalization","https:\u002F\u002Fwww.w3.org\u002FInternational\u002Fquestions\u002Fqa-i18n",{"title":58,"url":59},"GNU gettext manual","https:\u002F\u002Fwww.gnu.org\u002Fsoftware\u002Fgettext\u002Fmanual\u002Fgettext.html",{"title":61,"url":62},"RFC 5646: Tags for Identifying Languages","https:\u002F\u002Fwww.rfc-editor.org\u002Frfc\u002Frfc5646",{"title":64,"url":65},"Rat für deutsche Rechtschreibung","https:\u002F\u002Fwww.rechtschreibrat.com\u002F",{"title":67,"url":68},"Microsoft Writing Style Guide","https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fstyle-guide\u002Fwelcome\u002F","\u002Fimages\u002Fblog\u002Fllm-translation-pipeline-i18n\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fllm-translation-pipeline-i18n\u002Fog.jpg","vue-nuxt-developer",[73,74,75],"en","de","hu","LLM-fordítási pipeline i18n-hez: glosszárium, helyőrzők és review","Termék- és weboldalszövegek fordítása LLM-mel úgy, hogy a helyőrzők, a többes szám és a hangnem épen maradjon: glosszárium, ICU üzenetek, QA-ellenőrzések.","Három forráskártya, egy lefordított kártya glosszárium-szalaggal, majd ellenőrzött tábla.","LLM-fordítási pipeline i18n-hez · Balázs Csorba",[81,82,83,84,85],"A helyőrzőket, tageket és az ICU szintaxist még a modell előtt védd le, utána pedig ellenőrizd; ez a vizsgálat szinte minden valódi hibát megfog.","Értékeket fordíts, soha ne kulcsokat, és tartsd változatlanul a fájlszerkezetet, hogy a build diffelhető és átnézhető maradjon.","A glosszárium és a ne-fordítsd lista több konzisztenciát ad, mint bármilyen prompt-szövegezés, mert géppel kikényszeríthető.","A németnél és a magyarnál előre kell dönteni: tegezés vagy magázás, összetett szavak kezelése és az idézőjelek stílusa.","A modell fordít, a szkriptek ellenőriznek, az ember pedig csak azt a szöveget nézi át, ahol egy hiba drága.",[87,90,93,96,99],{"q":88,"a":89},"Kell még translation management rendszer?","Nem feltétlenül. Egy nyelvankénti JSON-fájl review-kapuval a repositoryban a legtöbb termékoldalhoz elég. Egy TMS akkor térül meg, ha külső fordítók, sok nyelv vagy release-ágak vannak.",{"q":91,"a":92},"Mekkora legyen egy fordítási batch?","Elég kicsi ahhoz, hogy egy hiba olcsón újrapróbálható legyen, elég nagy ahhoz, hogy legyen kontextus. A gyakorlatban 20-60 szöveg kérésenként, oldal vagy komponens szerint csoportosítva.",{"q":94,"a":95},"Láthatja a modell a teljes fájlt kontextusként?","Igen, csak olvasási segítségként. Küldd a forrásfájlt a fordítandó szövegek megjelölésével, és a válasz csak a lefordított értékeket tartalmazza. Így a prompt és a válaszséma is kicsi marad.",{"q":97,"a":98},"Mi a helyzet az olyan nyelvekkel, ahol nincs angol típusú többes szám?","Az ICU kezeli, de csak ha a forrásszöveg is ICU-t használ. A számlálókat és többes számokat először ICU üzenetbe kell tenni, és magát az üzenetet fordítani, nem az összefűzött mondatot.",{"q":100,"a":101},"Kell még utószerkesztés?","A jól látható szövegeknél igen. A ritkán olvasott hibaüzeneteknél és beállításcímkéknél egy jó glosszárium és az automatikus ellenőrzések általában jobbak, mint egy sietős emberi átfutás.",[103,106,109,112,115,118,121,124,127,130,133],{"id":104,"title":105},"why-translation-breaks","Mi törik el valójában",{"id":107,"title":108},"pipeline-stages","A folyamat",{"id":110,"title":111},"protect-placeholders","Először a helyőrzők és tagek védelme",{"id":113,"title":114},"icu-messages","A többes szám és a select az ICU dolga",{"id":116,"title":117},"structured-output","Értékeket fordíts, soha ne kulcsokat",{"id":119,"title":120},"glossary-and-translation-memory","Glosszárium és fordítási memória",{"id":122,"title":123},"german-and-hungarian-notes","Német és magyar sajátosságok",{"id":125,"title":126},"qa-checks","Ellenőrzések, amelyek szinte mindent elkapnak",{"id":128,"title":129},"cost-and-throughput","Költség és átbocsátás",{"id":131,"title":132},"review-gates","Ahol az ember még számít",{"id":134,"title":135},"sources","Források",[137,141,144,147,155,168,169,178,181,182,185,187,194,195,198,225,227,230,231,234,236,239,240,243,281,284,285,288,291,301,302,305,307,319,328,329,332,369,372,373,376,387,390,391],{"type":138,"content":139},"paragraph",[140],"Minden termékweboldal előbb-utóbb kap egy fordítási folyamatot, akár tervezik, akár nem. A szokásos változat egy táblázat, egy egyszer megírt szkript és az a szabály, hogy a német szövegeknek a release-ág levágása előtt készen kell lenniük. Ez addig működik, amíg egy helyőrzőt át nem neveznek, el nem tűnik egy többes számú alak, vagy ugyanaz a gombfelirat háromféleképpen nem lesz lefordítva.",{"type":138,"content":142},[143],"Ez a bejegyzés azt a folyamatot írja le, amelyet Vue és Nuxt oldalakon használok: a szövegek JSON-ban élnek, a modell glosszáriummal és explicit kontextussal fordítja az értékeket, a szkriptek gépi ellenőrzést végeznek, az ember pedig csak a drága hibák kockázatát hordozó szövegeket nézi át. Ez szándékosan unalmas, és pont ez a lényeg: a fordítás legyen build-lépés, ne esemény.",{"type":145,"level":146,"id":104,"text":105},"heading",2,{"type":138,"content":148},[149,150,154],"A sima prózai szöveg gépi fordítása az európai nyelveknél megoldott kérdés. Szoftverben az törik el, amit a mondat nem hordoz: a szöveg belsejében lévő ",{"tag":151,"children":152},"code",[153],"{count}",", a link körüli HTML-tag, a többes szám, amelyre a németnek és a magyarnak is szüksége van, a terméknév, amelynek angolul kell maradnia.",{"type":156,"items":157},"list",[158,160,162,164,166],[159],"Egy eltűnt vagy átnevezett helyőrző, amely a működő oldalt futásidejű hibává vagy üres hellyé teszi.",[161],"Egy elrontott ICU üzenet, mert a többes szám kategóriái nyelvenként eltérnek, összefűzéssel pedig nem fejezhetők ki.",[163],"Lefordított HTML- vagy Markdown-tagek, amelyek vagy a megjelenítést törik el, vagy a látható szövegbe kerülnek.",[165],"Következetlen terminológia: ugyanazt a funkciót három néven említi egy oldal.",[167],"Hangnem-eltolódás, amikor egy formális német felület hirtelen tegezni kezdi az olvasót.",{"type":145,"level":146,"id":107,"text":108},{"type":170,"attrs":171,"inner":175,"caption":176},"diagram",{"viewBox":172,"role":173,"aria-labelledby":174},"0 0 720 170","img","tr1-t tr1-d","\u003Ctitle id=\"tr1-t\">A fordítási folyamat lépései\u003C\u002Ftitle>\u003Cdesc id=\"tr1-d\">A forrásszövegek kinyerése, kontextussal és glosszáriummal fordítása, szkriptes ellenőrzése, szükség esetén emberi átnézése és a builddel való publikálása.\u003C\u002Fdesc>\u003Cdefs>\u003Cmarker id=\"tr1-ah\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto-start-reverse\">\u003Cpath d=\"M0 0L10 5L0 10z\" class=\"d-head\" \u002F>\u003C\u002Fmarker>\u003C\u002Fdefs>\u003Crect x=\"20\" y=\"47\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"79\" y=\"81\" text-anchor=\"middle\" class=\"d-text\">Kinyerés\u003C\u002Ftext>\u003Ctext x=\"79\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">locale JSON\u003C\u002Ftext>\u003Cpath d=\"M138 85H158\" class=\"d-line\" marker-end=\"url(#tr1-ah)\" \u002F>\u003Crect x=\"160\" y=\"47\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"220\" y=\"81\" text-anchor=\"middle\" class=\"d-text\">Fordítás\u003C\u002Ftext>\u003Ctext x=\"220\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">kontextus + glosszárium\u003C\u002Ftext>\u003Cpath d=\"M279 85H299\" class=\"d-line\" marker-end=\"url(#tr1-ah)\" \u002F>\u003Crect x=\"301\" y=\"47\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"360\" y=\"81\" text-anchor=\"middle\" class=\"d-text\">Ellenőrzés\u003C\u002Ftext>\u003Ctext x=\"360\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">szkriptek\u003C\u002Ftext>\u003Cpath d=\"M419 85H439\" class=\"d-line\" marker-end=\"url(#tr1-ah)\" \u002F>\u003Crect x=\"441\" y=\"47\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"500\" y=\"81\" text-anchor=\"middle\" class=\"d-text\">Review\u003C\u002Ftext>\u003Ctext x=\"500\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">diff nézet\u003C\u002Ftext>\u003Cpath d=\"M560 85H580\" class=\"d-line\" marker-end=\"url(#tr1-ah)\" \u002F>\u003Crect x=\"582\" y=\"47\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"641\" y=\"81\" text-anchor=\"middle\" class=\"d-text\">Publikálás\u003C\u002Ftext>\u003Ctext x=\"641\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">build\u003C\u002Ftext>",[177],"Öt lépés: kinyerés, fordítás, ellenőrzés, review, publikálás. Csak kettőben van modell.",{"type":138,"content":179},[180],"A kinyerés az egyetlen lépés, amely forrásszövegeket állít elő. A komponensbe égetett szöveg soha nem lesz lefordítva, ezért az első hasznos ellenőrzés egy linter, amely hibát jelez a sablonokban látható szövegkonstansokra. A fordítási lépés állapotmentes: beolvassa a forrásfájlt, a glosszáriumot és ugyanazon kulcs korábbi fordítását, majd új értékeket ír.",{"type":145,"level":146,"id":110,"text":111},{"type":138,"content":183},[184],"A helyőrző szerződés a szöveg és az azt megjelenítő kód között. A modell nem fordíthatja le, nem rendezheti át és nem hagyhatja el, a kód pedig nem feltételezheti, hogy épen maradt. A megbízható minta: a kérések előtt kinyerni minden helyőrzőt, majd a válasz után összevetni a listát; az eltérés kemény hiba, nem figyelmeztetés.",{"type":151,"code":186},"import re\n\nPLACEHOLDER = re.compile(r\"\\{[A-Za-z_][\\w]*(?:,[^}]*)?\\}|\\{[0-9]+\\}|%[sd]|\u003C\u002F?[a-z][^>]*>\")\n\ndef slots(text: str) -> list[str]:\n    \"Every placeholder and tag in the string, in order of appearance.\"\n    return PLACEHOLDER.findall(text)\n\ndef check(source: str, target: str) -> list[str]:\n    \"Returns the differences; empty list means the translation is safe to ship.\"\n    a, b = slots(source), slots(target)\n    return [f\"missing {s}\" for s in a if s not in b] + [f\"added {s}\" for s in b if s not in a]\n",{"type":138,"content":188},[189,190,193],"A tagek ugyanezt a kezelést érdemlik. Ha a forrás ",{"tag":151,"children":191},[192],"\u003Cstrong>{name}\u003C\u002Fstrong>"," szöveget tartalmaz, a fordítás áthelyezheti a taget, de mindkét felét és a helyőrzőt meg kell tartania. Egy egyszerű sorrendi összevetés a gyakori eseteket kapja el, egy HTML-parser a többit.",{"type":145,"level":146,"id":113,"text":114},{"type":138,"content":196},[197],"A német és a magyar is megkülönbözteti az egyes és többes számot, ezért a csak angolul helyes többes szám ártalmatlannak tűnik egészen az első nullás számlálóig. Az ICU MessageFormat ezt rendesen megoldja, a Vue I18n pedig beszéli az ICU-t, így az üzenet a locale-fájlban maradhat és egységként fordítható.",{"type":199,"head":200,"rows":206},"table",[201,203,204,205],[202],"Szöveg",[73],[74],[75],[207,216],[208,210,212,214],[209],"Kosár darabszám",[211],"{count, plural, one {# item} other {# items}}",[213],"{count, plural, one {# Artikel} other {# Artikel}}",[215],"{count, plural, one {# termék} other {# termék}}",[217,219,221,223],[218],"Tárhelyméret",[220],"{size} GB of {total} GB used",[222],"{size} GB von {total} GB belegt",[224],"{size} GB a {total} GB-ból",{"type":151,"code":226},"\u003Cp>{{ $t('cart.items', { count: items.length }, items.length) }}\u003C\u002Fp>\n\n\u002F\u002F en.json\n\"cart\": { \"items\": \"{count, plural, one {# item} other {# items}}\" }\n\n\u002F\u002F de.json\n\"cart\": { \"items\": \"{count, plural, one {# Artikel} other {# Artikel}}\" }\n\n\u002F\u002F hu.json\n\"cart\": { \"items\": \"{count, plural, one {# termék} other {# termék}}\" }\n",{"type":138,"content":228},[229],"Két szokás tartja működésben ezt. Soha ne építs mondatot úgy, hogy egy lefordított töredéket számhoz vagy névhez fűzöl, mert a szórend eltér; a szám az üzeneten belül maradjon. És a folyamat soha ne lásson félig lefordított többes számot: az egész ICU üzenetet egyetlen szövegként fordítsd, ugyanazokkal a kategórianevekkel, és egy ellenőrzés igazolja, hogy a forrás minden kategóriája létezik a célban.",{"type":145,"level":146,"id":116,"text":117},{"type":138,"content":232},[233],"A fordítási lépés egy JSON-objektumot kap, és azonos alakú objektumot ad vissza. A kulcsok azonosítók, érintetlenek maradnak, csak az értékek változnak. Strukturált kimenettel ez API-szinten kikényszeríthető, séma nélkül is ez a legegyszerűbben ellenőrizhető szerződés: a kulcshalmaznak a művelet előtt és után azonosnak kell lennie.",{"type":151,"code":235},"{\n  \"page\": \"checkout\",                  \u002F\u002F context for the model, not translated\n  \"glossary\": [[\"cart\", \"Warenkorb\"], [\"checkout\", \"Kassa\"]],\n  \"strings\": {\n    \"cart.title\": \"Your cart\",\n    \"cart.empty\": \"Your cart is empty\",\n    \"cart.items\": \"{count, plural, one {# item} other {# items}}\"\n  }\n}",{"type":138,"content":237},[238],"A csoportosítás fontosabb, mint a méret. Az azonos oldalhoz, komponenshez vagy hangnemhez tartozó szövegek egy kérésbe kerülnek, mert a modell a szomszédokat kontextusként használja. Kérésenként 20-60 szöveg jó tartomány: az újrapróbálkozás olcsó, a kontextus pedig specifikus marad. Csak azt fordítsd újra, ami változott, a forrásérték hash-összevetésével, így az első teljes kör után a napi költség a nullához közelít.",{"type":145,"level":146,"id":119,"text":120},{"type":138,"content":241},[242],"A glosszárium a folyamat legolcsóbb konzisztenciaeszköze: forráskifejezések listája a jóváhagyott célkifejezésekkel, valamint írásmódra és ragozásra vonatkozó szabállyal. A modell bemenetként kapja, egy ellenőrzés pedig utólag kikényszeríti. Ha tiltott fordítás jelenik meg, a szöveg egyszer ismétlődik az idézett szabálysértéssel, utána pedig review-ba kerül, nem ciklusba.",{"type":199,"head":244,"rows":253},[245,247,249,251],[246],"Forrás",[248],"német",[250],"magyar",[252],"Szabály",[254,263,272],[255,257,259,261],[256],"cart",[258],"Warenkorb",[260],"kosár",[262],"főnév, németül nagybetűs",[264,266,268,270],[265],"checkout",[267],"Kassa",[269],"fizetés",[271],"ne fordítstd, ne ragozd",[273,275,277,279],[274],"AI agent",[276],"AI-Agent",[278],"AI-ügynök",[280],"az angol kifejezés marad, első előfordulásnál magyarázattal",{"type":138,"content":282},[283],"A fordítási memória a másik fél: a korábbi kiadásokból származó pontos egyezések modellhívás nélkül újrahasznosulnak, a közelítő egyezések javaslatként mennek tovább. Nyelvenkénti JSON-felállásban a memória csupán forrásszövegek és elfogadott célok táblája, a hatás ugyanaz: a modell csak az igazán újat látja, a reviewer pedig csak azt, ami a legutóbbi kiadás óta változott.",{"type":145,"level":146,"id":122,"text":123},{"type":138,"content":286},[287],"A német a következetlenséget jobban bünteti, mint a nyelvtani hibát. Válassz egy megszólítási formát termékenként, dokumentáld, és tedd a glosszáriummal együtt szállított stílusútmutatóba; egy webshop, amely a láblécben magáz és a bevezetőben tegez, összerakottnak hat. A főnevek nagybetűsek maradnak, az összetett szavak egybe írandók, az idézőjelek pedig a német „így” formát követik.",{"type":138,"content":289},[290],"A magyar agglutináló és nincs nyelvtani neme, ami két gyakorlati módon változtatja meg a folyamatot. Egyrészt a „felhasználó” vagy „ügyfél” nem vihető tovább névmással: a fordítás vagy megismétli a főnevet, vagy nélküle fogalmaz. Másrészt a toldalékok a főnévhez kapcsolódnak, ezért a toldalék belsejébe kerülő helyőrzőt kerülni kell, vagy át kell alakítani az üzenetet, amíg a toldalék a szó mellé kerül.",{"type":156,"items":292},[293,295,297,299],[294],"Nyelvenként egy oldalas hangnem-jegyzet, a glosszárium mellett a repóban.",[296],"Minden visszatérő kifejezés legyen glosszáriumelem, ne a promptban ismételt szöveg.",[298],"Egy anyanyelvi lektor egyszer javítsa a hangnem-jegyzetet, utána a javítások lint-szabállyá válnak.",[300],"A végeredményt a layoutban teszteld, ne a JSON-ban: a német és a magyar általában hosszabb az angolnál.",{"type":145,"level":146,"id":125,"text":126},{"type":138,"content":303},[304],"Az első szakasz minden hibatípusához tartozik gépi ellenőrzés. Ugyanabban a commitban futtasd őket, mint a fordítást, ne egy későbbi takarító sprintben; egy folyamat, amely nem tud hangosan elbukni, csendben szállít hibás szövegeket.",{"type":151,"code":306},"\u002F\u002F verify-locales.mjs - runs in CI, exits non-zero on the first real problem\nconst checks = [\n  ['placeholder parity', (src, tgt) => sameSlots(src, tgt)],\n  ['icu category parity', (src, tgt) => sameIcuCategories(src, tgt)],\n  ['no empty values', (src, tgt) => tgt.trim().length > 0],\n  ['glossary respected', (src, tgt) => glossaryViolations(src, tgt).length === 0],\n  ['length sanity', (src, tgt) => tgt.length \u003C src.length * 2.2],\n]\n",{"type":156,"items":308},[309,311,313,315,317],[310],"Helyőrző- és tag-paritás, szövegenként és ICU üzenetenként.",[312],"Azonos kulcshalmaz a forrás- és a cél-locale fájlban.",[314],"Nincs üres vagy változatlan érték ott, ahol a forrás megváltozott.",[316],"A glosszárium-sértések a sértő kifejezéssel együtt, hogy az újrapróbálkozó prompt idézhesse.",[318],"Hosszarány-korlátok, amelyek a csonkítást és a szétrobbanó bővülést még a designer előtt jelzik.",{"type":320,"variant":321,"title":322,"body":323},"callout","warn","A szkript döntsön, ne a modell",[324,326],[325],"Csábító, hogy egy elbukó ellenőrzést ciklusban visszaadjunk a modellnek, amíg át nem megy. A ciklust egy újrapróbálkozásra korlátozd, a második hibánál pedig essen review-ba: egy modell, amelynek helyőrző-ellenőrzést kell kielégítenie, megoldásokat fog találni, akár kitalált helyőrzőmásolatokat a szövegben.",[327],"A szerződés a checké; a modell csak értékeket javasol.",{"type":145,"level":146,"id":128,"text":129},{"type":138,"content":330},[331],"A fordítás az LLM-számla kis része, mert a szövegek rövidek. Ökölszabály: ezer darab, egyenként húsz szavas szöveg nagyjából 20k bemeneti és 25k kimeneti token; egy középkategóriás modellnél, három dollár per millió bemeneti és tizenöt dollár per millió kimeneti token áron ez körülbelül negyvenöt cent ezer szövegre. A csúcsmodatok ennek többszörösébe kerülnek, és itt ritkán térülnek meg.",{"type":199,"head":333,"rows":340},[334,336,338],[335],"Kör",[337],"Mit lát",[339],"Költségtényező",[341,348,355,362],[342,344,346],[343],"Első teljes futás",[345],"Minden forrásszöveg és a glosszárium",[347],"Forrásmennyiség, egyszer",[349,351,353],[350],"Kiadáskülönbség",[352],"Csak a megváltozott forrású kulcsok",[354],"Változási arány",[356,358,360],[357],"Pontos memória-találat",[359],"Semmit, memóriából másolva",[361],"Nulla",[363,365,367],[364],"Review",[366],"Diffs, jelölt szabálysértések, minták",[368],"Emberi percek",{"type":138,"content":370},[371],"Az átbocsátás kérdése fontosabb az árnál. Néhány ezer szöveg teljes köré percek alatt lefut és CI-ben is futtatható; a szűk keresztmetszet a review, ezért a folyamat a reviewereknek a megváltozott kulcsok diffjét és a megjelölt szövegek listáját mutassa, ne egy elejétől olvasandó fájlt.",{"type":145,"level":146,"id":131,"text":132},{"type":138,"content":374},[375],"A review-kapu akkor éri meg az árát, ha a hiba drága: onboarding, árazási oldalak, jogi szövegek, bármi, amit az ügyfél visszaidézhet. A hibaüzenetek és beállításcímkék hosszú farkánál az automatikus ellenőrzések és a glosszárium jobbak egy sietős emberi körnél, és ennek tagadása csak a következő kiadásra tolja a munkát.",{"type":156,"ordered":377,"items":378},true,[379,381,383,385],[380],"A folyamat nyelvenkénti diffet és megjelölt szövegek listáját állítja elő.",[382],"A reviewer csak a megjelölt és jól látható elemeket hagyja jóvá vagy javítja.",[384],"A jóváhagyott értékek visszaíródnak, ami frissíti a fordítási memóriát.",[386],"A build publikálja az oldalt, és az ellenőrzések a publikált artefaktumon újra lefutnak.",{"type":138,"content":388},[389],"Ebből semmi sem egzotikus. Forrásszövegek JSON-ban, mellettük glosszárium, egy modell, amely értékeket fordít, egy szkript, amely szerződéseket ellenőriz, és egy ember, aki a diffet nézi. A folyamat szándékosan unalmas, mert egy termék érdekes részei soha nem a fordítások.",{"type":145,"level":146,"id":134,"text":135},{"type":156,"ordered":377,"items":392},[393,397,400,403,406,409,412,415,418,421,424],[394],{"tag":395,"href":32,"children":396},"a",[38],[398],{"tag":395,"href":41,"children":399},[40],[401],{"tag":395,"href":44,"children":402},[43],[404],{"tag":395,"href":47,"children":405},[46],[407],{"tag":395,"href":50,"children":408},[49],[410],{"tag":395,"href":53,"children":411},[52],[413],{"tag":395,"href":56,"children":414},[55],[416],{"tag":395,"href":59,"children":417},[58],[419],{"tag":395,"href":62,"children":420},[61],[422],{"tag":395,"href":65,"children":423},[64],[425],{"tag":395,"href":68,"children":426},[67],[428,502,557,629],{"slug":429,"published":5,"minutes":430,"category":7,"tags":431,"keywords":437,"about":449,"sources":458,"cover":495,"og":496,"expertise":497,"locales":498,"lang":75,"title":499,"description":500,"coverAlt":501},"schema-org-structured-data-b2b-shop",10,[432,433,434,435,436],"Schema.org","Structured data","B2B e-commerce","Technical SEO","Nuxt",[438,439,440,441,442,443,444,445,446,447,448],"schema.org b2b shop","product structured data b2b","merchant listing structured data","product snippet vs merchant listing","unitpricespecification referencequantity","productgroup variants structured data","organization schema vatid","b2b prices behind login seo","json-ld nuxt schema org","merchant return policy structured data","mpn gtin structured data",[450,452,455],{"name":432,"url":451},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSchema.org",{"name":453,"url":454},"JSON-LD","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FJSON-LD",{"name":456,"url":457},"Business-to-business","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FBusiness-to-business",[459,462,465,468,471,474,477,480,483,486,489,492],{"title":460,"url":461},"Google Search Central: Introduction to Product structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct",{"title":463,"url":464},"Google Search Central: Merchant listing (Product, Offer) structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fmerchant-listing",{"title":466,"url":467},"Google Search Central: Product snippet structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct-snippet",{"title":469,"url":470},"Google Search Central: Product variant structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct-variants",{"title":472,"url":473},"Google Search Central: Organization structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Forganization",{"title":475,"url":476},"Google Search Central: Merchant return policy structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Freturn-policy",{"title":478,"url":479},"Google Search Central: General structured data guidelines","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fsd-policies",{"title":481,"url":482},"Google Search Central: Generate structured data with JavaScript","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fgenerate-structured-data-with-javascript",{"title":484,"url":485},"Schema.org: Offer","https:\u002F\u002Fschema.org\u002FOffer",{"title":487,"url":488},"Schema.org: UnitPriceSpecification","https:\u002F\u002Fschema.org\u002FUnitPriceSpecification",{"title":490,"url":491},"Unhead: Product schema (defineProduct)","https:\u002F\u002Funhead.unjs.io\u002Fdocs\u002Fschema-org\u002Fapi\u002Fschema\u002Fproduct",{"title":493,"url":494},"Nuxt SEO: Schema.org identity setup","https:\u002F\u002Fnuxtseo.com\u002Fdocs\u002Fschema-org\u002Fguides\u002Fsetup-identity","\u002Fimages\u002Fblog\u002Fschema-org-structured-data-b2b-shop\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fschema-org-structured-data-b2b-shop\u002Fog.jpg","b2b-ecommerce-developer",[73,74,75],"Schema.org strukturált adatok B2B webshopokhoz: bejelentkezés mögötti árak, egységek és változatok","Termék-markup B2B shopokhoz: snippet vagy kereskedői lista, melyik ár, cikkszámok, egységárak, változatok, Organization és SSR Nuxtban.","Terméktéglalap vékony kerettel, alsó kis mezőjét alacsony fal takarja el.",{"slug":503,"published":5,"minutes":6,"category":7,"tags":504,"keywords":509,"about":521,"sources":529,"cover":551,"og":552,"expertise":497,"locales":553,"lang":75,"title":554,"description":555,"coverAlt":556},"ai-assistant-b2b-shop-customer-support",[434,505,506,507,508],"AI assistant","Customer support","LLM agents","EU AI Act",[510,511,512,513,514,515,516,517,518,519,520],"ai assistant b2b shop","ai customer support b2b ecommerce","llm chatbot order status","ai agent customer service tools","chatbot liability air canada","klarna ai assistant results","human handoff chatbot design","eu ai act chatbot disclosure","owasp excessive agency","ai support resolution rate","b2b customer portal chatbot",[522,525,528],{"name":523,"url":524},"Customer service","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCustomer_service",{"name":526,"url":527},"Chatbot","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FChatbot",{"name":456,"url":457},[530,533,536,539,542,545,548],{"title":531,"url":532},"Klarna: AI assistant handles two-thirds of customer service chats in its first month (press release, 2024)","https:\u002F\u002Fwww.klarna.com\u002Finternational\u002Fpress\u002Fklarna-ai-assistant-handles-two-thirds-of-customer-service-chats-in-its-first-month\u002F",{"title":534,"url":535},"Entrepreneur: Klarna is hiring customer service agents again, according to its CEO (May 2025)","https:\u002F\u002Fwww.entrepreneur.com\u002Fbusiness-news\u002Fklarna-ceo-reverses-course-by-hiring-more-humans-not-ai\u002F491396",{"title":537,"url":538},"ABA Business Law Today: BC tribunal confirms companies remain liable for information provided by AI chatbot","https:\u002F\u002Fwww.americanbar.org\u002Fgroups\u002Fbusiness_law\u002Fresources\u002Fbusiness-law-today\u002F2024-february\u002Fbc-tribunal-confirms-companies-remain-liable-information-provided-ai-chatbot\u002F",{"title":540,"url":541},"OWASP GenAI Security Project: LLM06:2025 Excessive Agency","https:\u002F\u002Fgenai.owasp.org\u002Fllmrisk\u002Fllm062025-excessive-agency\u002F",{"title":543,"url":544},"OWASP GenAI Security Project: LLM05:2025 Improper Output Handling","https:\u002F\u002Fgenai.owasp.org\u002Fllmrisk\u002Fllm052025-improper-output-handling\u002F",{"title":546,"url":547},"EU AI Act, Article 50: Transparency obligations","https:\u002F\u002Fartificialintelligenceact.eu\u002Farticle\u002F50\u002F",{"title":549,"url":550},"Intercom: Fin pricing and billable outcomes","https:\u002F\u002Ffin.ai\u002Fpricing","\u002Fimages\u002Fblog\u002Fai-assistant-b2b-shop-customer-support\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fai-assistant-b2b-shop-customer-support\u002Fog.jpg",[73,74,75],"AI-asszisztens a B2B webshop ügyfélszolgálatához: eszközök, jogosultságok és átadás embernek","Hogyan építs AI ügyfélszolgálati asszisztenst B2B shophoz: mit automatizálj, eszközök ügyfélkontextusban, átadás embernek, AI Act és mérőszámok.","Magas fal keskeny réssel: nyíl halad át rajta a három négyzetből álló bekerített mezőbe, egy másik lefelé, egy tálca felé mutat.",{"slug":558,"published":5,"minutes":559,"category":7,"tags":560,"keywords":564,"about":576,"sources":586,"cover":623,"og":624,"expertise":71,"locales":625,"lang":75,"title":626,"description":627,"coverAlt":628},"vue-ai-chat-ui-streaming-accessibility",11,[12,436,561,562,563],"Accessibility","Streaming","AI chat",[565,566,567,568,569,570,571,572,573,574,575],"vue ai chat ui","nuxt llm streaming","sse vs fetch streaming","aria-live streaming text","accessible chat interface","abort fetch stream vue","dompurify markdown llm","role log chat","reduced motion chat ui","wcag 2.2 chat","screen reader streaming",[577,580,583],{"name":578,"url":579},"Web accessibility","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWeb_accessibility",{"name":581,"url":582},"Server-sent events","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FServer-sent_events",{"name":584,"url":585},"Vue.js","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FVue.js",[587,590,593,596,599,602,605,608,611,614,617,620],{"title":588,"url":589},"MDN: Using server-sent events","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FServer-sent_events\u002FUsing_server-sent_events",{"title":591,"url":592},"MDN: AbortController","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FAbortController",{"title":594,"url":595},"MDN: ReadableStream","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FReadableStream",{"title":597,"url":598},"MDN: TextDecoderStream","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FTextDecoderStream",{"title":600,"url":601},"MDN: ARIA log role","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAccessibility\u002FARIA\u002FReference\u002FRoles\u002Flog_role",{"title":603,"url":604},"W3C: Understanding SC 4.1.3 Status Messages","https:\u002F\u002Fwww.w3.org\u002FWAI\u002FWCAG22\u002FUnderstanding\u002Fstatus-messages.html",{"title":606,"url":607},"W3C WAI: What's new in WCAG 2.2","https:\u002F\u002Fwww.w3.org\u002FWAI\u002Fstandards-guidelines\u002Fwcag\u002Fnew-in-22\u002F",{"title":609,"url":610},"MDN: prefers-reduced-motion","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FCSS\u002F@media\u002Fprefers-reduced-motion",{"title":612,"url":613},"DOMPurify README","https:\u002F\u002Fgithub.com\u002Fcure53\u002FDOMPurify",{"title":615,"url":616},"markdown-it README","https:\u002F\u002Fgithub.com\u002Fmarkdown-it\u002Fmarkdown-it",{"title":618,"url":619},"AI SDK docs: useChat","https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Fai-sdk-ui\u002Fchatbot",{"title":621,"url":622},"Vue docs: nextTick","https:\u002F\u002Fvuejs.org\u002Fapi\u002Fgeneral.html#nexttick","\u002Fimages\u002Fblog\u002Fvue-ai-chat-ui-streaming-accessibility\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fvue-ai-chat-ui-streaming-accessibility\u002Fog.jpg",[73,74,75],"AI-csevegő UI Vue-ban és Nuxtban: akadálymentes streaming","AI-csevegő Vue-ban vagy Nuxtban: fetch-stream, megszakítás és újrapróbálás, biztonságos markdown, aria-live bejelentések, billentyűzet és reduced motion.","Üzenetkártya villogó kurzorral, pontozott vonal hullámokká nyílik, mellette pipa.",{"slug":630,"published":631,"minutes":632,"category":7,"tags":633,"keywords":637,"about":648,"sources":655,"cover":671,"og":672,"expertise":71,"locales":673,"lang":75,"title":674,"description":675,"coverAlt":676},"nuxt-i18n-multilingual-seo-hreflang","2026-10-16",8,[436,10,634,635,636],"SEO","hreflang","Multilingual",[638,639,640,641,642,643,644,645,646,647],"nuxt i18n seo","nuxt hreflang","useLocaleHead","nuxt i18n canonical","hreflang x-default","prefix_except_default","multilingual seo nuxt","nuxt i18n sitemap hreflang","hreflang self-referencing","nuxt i18n baseUrl",[649,651,654],{"name":436,"url":650},"https:\u002F\u002Fnuxt.com\u002F",{"name":652,"url":653},"Hreflang","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHreflang",{"name":28,"url":29},[656,659,662,665,668],{"title":657,"url":658},"Nuxt i18n docs: SEO (useLocaleHead)","https:\u002F\u002Fi18n.nuxtjs.org\u002Fdocs\u002Fguide\u002Fseo",{"title":660,"url":661},"Nuxt i18n docs: Routing strategies","https:\u002F\u002Fi18n.nuxtjs.org\u002Fdocs\u002Fguide",{"title":663,"url":664},"Google Search Central: Tell Google about localized versions of your page","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fspecialty\u002Finternational\u002Flocalized-versions",{"title":666,"url":667},"Google Search Central: Managing multi-regional and multilingual sites","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fspecialty\u002Finternational\u002Fmanaging-multi-regional-sites",{"title":669,"url":670},"Google Search Central: How to specify a canonical URL","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fcrawling-indexing\u002Fconsolidate-duplicate-urls","\u002Fimages\u002Fblog\u002Fnuxt-i18n-multilingual-seo-hreflang\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fnuxt-i18n-multilingual-seo-hreflang\u002Fog.jpg",[73,74,75],"Többnyelvű SEO Nuxt i18n-nel: URL-stratégia, hreflang, canonical és sitemap","Így állítsd be a Nuxt i18n modult, hogy a keresők minden nyelvet indexeljenek: útvonal-stratégia, useLocaleHead, hreflang, részleges fordítás, sitemap.","Nagy lapot három vízszintes kapcsolat köt össze három kisebb lap oszlopával.",1792245343986]