OminaisuudetLisäosaHinnastoResurssit
Vaihda kieltä
ResurssitMiten kääntää XLIFF-tiedostoja (Drupal, Symfony, Angular, iOS)

Miten kääntää XLIFF-tiedostoja (Drupal, Symfony, Angular, iOS)

SimplePoTranslate Team16. huhtikuuta 2026
Miten kääntää XLIFF-tiedostoja (Drupal, Symfony, Angular, iOS)

Eräs Drupal-kehittäjä postasi Stack Overflow'hun viime viikolla tarinan, joka toistuu tuhansia kertoja vuodessa yritysten lokalisointitiimeissä. Hänen tiiminsä vei 40 megatavun XLIFF-tiedoston Drupal-sivustoltaan. Hän avasi sen tekstieditorissa, liitti osia Google Translateen, kokosi tiedoston uudelleen ja toi sen takaisin Drupaliin – ja puolet sivuista kieltäytyi renderöimästä, koska käännetyt merkkijonot sisälsivät virheellistä XML:ää, vääriin paikkoihin sijoitettuja escape-merkkejä ja rikkinäisiä <g>-tageja, joissa sisäinen muotoilu oli tuhoutunut.

XLIFF on yritystason lokalisoinnin standardi syystä. Se perustuu XML:ään, on työkaluriippumaton ja tukee sitä rikasta metatietoa, jota vakavat käännösprojektit tarvitsevat: käännöstilat, vaihtoehtoiset käännökset, muistiinpanot kääntäjien ja kehittäjien välillä sekä strukturoitu inline-merkintä. Mutta sen joustavuus tekee siitä helposti vioitettavan, ja työkalut, jotka käsittelevät .po-tiedostoja turvallisesti, pettävät usein XLIFF-tiedostojen kanssa.

Tämä opas käy läpi, mikä tekee XLIFF:stä ainutlaatuisen, miksi yleiset käännösmenetelmät rikkovat sen, ja oikean tavan kääntää XLIFF-tiedostoja Drupalille, Symfonylle, Angularille ja iOS:lle – neljälle alustalle, joilla XLIFF:ää käytetään yleisimmin vuonna 2026.

Mikä XLIFF on (ja miksi yritystiimit käyttävät sitä)

XLIFF tarkoittaa XML Localization Interchange File Formatia. Se on OASIS-standardi, joka on suunniteltu erityisesti käännösten siirtämiseen työkalujen välillä – sisällönhallintajärjestelmien, käännösmuistitietokantojen, CAT-työkalujen ja lokalisointialustojen välillä. Toisin kuin Gettext .po-tiedostot (jotka tallentavat litteitä avain-arvo-pareja) tai JSON-paikallistiedostot (jotka pesiytyvät mielivaltaisesti), XLIFF on strukturoitu XML-dokumentti standardoidulla skeemalla.

XLIFF 1.2 vs XLIFF 2.0

Kaksi versiota on käytössä, eivätkä ne ole täysin yhteensopivia.

XLIFF 1.2 on vanhempi, laajemmalti käytössä oleva versio. Se käyttää <trans-unit>-elementtejä kääntämisen vaativan sisällön ympärille, <source>- ja <target>-ali-elementtien kanssa. Sisäinen muotoilu käyttää <g>, <x> ja <bpt> / <ept>-parillisia tageja. Drupalin Translation Management Tool ja monet vanhemmat alustat vievät edelleen 1.2-versiota.

XLIFF 2.0 on vuoden 2014 tarkistus, yksinkertaisempi ja selkeämpi. Se käyttää <unit>- ja <segment>-elementtejä <source>- ja <target>-elementtien kanssa. Sisäinen merkintä käyttää <pc>:tä (parillinen koodi) ja <ph>:ta (paikkamerkki). Symfonyn kääntäjäkomponentti ja modernit iOS-viennit käyttävät oletuksena 2.0-versiota.

Käännöstyökalu, joka käsittelee 1.2-versiota, ei automaattisesti käsittele 2.0-versiota. Tagien sanastot ovat erilaisia, ja escape-säännöt eroavat hieman. Tarkista aina, minkä version alustasi vie, ennen kuin valitset käännösprosessin.

XLIFF-yksikön rakenne

Minimaalinen XLIFF 1.2 -trans-unit näyttää tältä:

<trans-unit id="msg_welcome" datatype="plaintext">
  <source>Welcome, <g id="1">%name%</g>!</source>
  <target state="needs-translation">Welcome, <g id="1">%name%</g>!</target>
  <note>Displayed on the homepage after login</note>
</trans-unit>

<g id="1"> ympäröi paikkamerkkimuuttujan. state-määrite kertoo alustalle, että tämä merkkijono tarvitsee kääntämistä. <note> on kehittäjän vihje. Kääntäjän, joka ymmärtää XLIFF:ää, pitäisi tuottaa:

<target state="translated">¡Bienvenido, <g id="1">%name%</g>!</target>

Kääntäjä, joka käsittelee tiedostoa pelkkänä tekstinä, saattaa tuottaa minkä tahansa seuraavista rikkinäisistä muunnelmista:

<target>¡Bienvenido, <g id="1">%nombre%</g>!</target>
<target>¡Bienvenido, &lt;g id="1"&gt;%name%&lt;/g&gt;!</target>
<target>¡Bienvenido, %name%!</target>

Jokainen näistä rikkoo tuonnin eri tavoin. Ensimmäinen nimeää muuttujan uudelleen. Toinen pakottaa XML:n. Kolmas jättää muotoilutagin kokonaan pois.

Huonot ratkaisut (Miksi XML:ää ei voi vain kääntää)

Useimmat tiimit aloittavat samoilla kolmella lähestymistavalla ja polttavat useita päiviä ennen kuin antavat periksi.

XLIFF-tiedoston syöttäminen yleiselle tekoälylle

Kopioi tiedosto, liitä Claudeen tai ChatGPT:hen, pyydä käännöstä. Malli tekee yleensä kohtuullisen työn tekstin kanssa, mutta käsittelee XLIFF-tageja epäjohdonmukaisesti. Joskus se säilyttää <g>-tagit, joskus se kääntää id-määritteen, joskus se poistaa ne kokonaan. Validointi epäonnistuu. Tuontisi antaa XML-jäsennyksen virheitä.

CAT-työkalun käyttäminen ilman XLIFF-tukea

Työkalut kuten Poedit on rakennettu .po-muotoa varten. Ne saattavat avata XLIFF-tiedostoja, mutta käsittelevät niitä yleisenä tekstisäiliönä. Sisäisiä tageja ei ole lukittu. Paikkamerkkejä ei ole suojattu. Saat käännöksen, joka näyttää hyvältä editorissa, mutta epäonnistuu skeeman validoinnissa tuonnissa.

Oman skriptin kirjoittaminen

Tiimisi kirjoittaa Node- tai Python-skriptin, joka jäsentää XLIFF-tiedoston xml2js:llä, poimii lähdemerkkijonot, kutsuu Google Translatea ja kirjoittaa kohteet takaisin. Se toimii 90 % merkkijonoista. Loput 10 % – merkkijonot, joissa on sisäkkäistä muotoilua, monikkomuotoja tai erikoismerkkejä – rikkoutuvat tavoilla, jotka ilmenevät vasta, kun olet jo julkaissut.

Sama ”joustava muoto kohtaa naiivin kääntäjän” -virhetila vaikuttaa myös i18next JSON- ja Gettext .po-tiedostoihin. Oppaamme i18next JSON -tiedostojen kääntämisestä Reactille ja Next.js:lle ja postauksemme miten kääntää .po-tiedostoja rikkomatta koodimuuttujia käsittelevät näiden formaattien rinnakkaisia ongelmia.

Oikea tapa: Syntaksitietoinen XLIFF-käsittely

Oikea XLIFF-käännösprosessi noudattaa samoja periaatteita kuin PO-moottorimme, mukautettuna XML:ään.

Jäsennä, älä käytä säännöllisiä lausekkeita

Käsittele XLIFF:ää strukturoituna dokumenttina. Jäsennä se oikealla XML-jäsentäjällä, rakenna puu ja käy läpi <trans-unit> (tai <unit> 2.0-versiolle) elementit. Yrittäminen käyttää säännöllisiä lausekkeita lähde- ja kohdesisällön täsmäyttämiseen on nopea tapa vioittuneisiin tiedostoihin.

Lukitse sisäiset tagit ennen kääntämistä

Jokainen <g>, <x>, <bpt>, <ept>, <ph>, <pc> <source>-elementin sisällä on säilytettävä sijainnin ja id-määritteen mukaan. Korvaa ne numeerisilla paikkamerkeillä ennen tekstin lähettämistä LLM:ään, ja aseta sitten alkuperäiset tagit takaisin attribuutteineen käännöksen palattua.

Kunnoita tilakonetta

XLIFF-yksiköillä on tilamääritteitä: new, needs-translation, translated, reviewed, final, signed-off. Prosessin tulisi kääntää vain new- tai needs-translation-tilassa olevia yksiköitä ja asettaa tulostilaksi translated (ei final – tarkastajan tulisi silti varmistaa).

Säilytä rakenne käännösyksiköiden ulkopuolella

XLIFF-tiedostot sisältävät otsikoita, metatietoja, tiedostotason attribuutteja, muistiinpanoja ja vaihtoehtoisia käännöksiä (<alt-trans>). Nämä on säilytettävä muuttumattomina edestakaisen siirron aikana. Niiden poistaminen tai uudelleenjärjestely rikkoo edestakaisen yhteensopivuuden lähdealustan kanssa.

Validoi ennen toimitusta

Ennen käännetyn XLIFF-tiedoston palauttamista, validoi se skeemaa vastaan. XLIFF 1.2:lla on virallinen XSD. XLIFF 2.0:lla on oma. Työkalu, joka ei pysty itse validoimaan, toimittaa sinulle rikkinäisiä tiedostoja.

Alustakohtaisia huomioita

Jokaisella suurella XLIFF:ää käyttävällä alustalla on tuntemisen arvoisia erikoispiirteitä.

Drupal

Drupalin Translation Management Tool (TMGMT) vie XLIFF 1.2 -tiedostoja. Sisältötyyppejä ovat solmut (sivut, artikkelit), taksonomiatermit ja konfiguraatio. TMGMT käärii jokaisen käännettävän kentän erilliseen <trans-unit>-elementtiin Drupal-spesifisellä tunnuksen muodolla (fieldname:delta:format).

Huomio: Drupal tallentaa tekstiformaattitietoja (suodatettu HTML, täysi HTML, pelkkä teksti) sisällön rinnalle. Käännöksen on säilytettävä HTML-merkintä, kun formaatti sallii sen, ja poistettava se pelkkään tekstiin, kun formaatti ei salli. Prosessisi tarvitsee kenttäkohtaista tietoisuutta.

Symfony

Symfonyn käännöskomponentti käyttää XLIFF 2.0:aa oletuksena (Symfony 4:stä lähtien). Merkkijonot sijaitsevat translations/messages.xx.xliff-tiedostoissa. Symfony tukee ICU-viestimuotoa XLIFF:n sisällä, mikä tarkoittaa, että yksi yksikkö voi sisältää {count, plural, one {...} other {...}}-rakenteita.

Huomio: ICU-monikkomuodot XLIFF:n sisällä tarvitsevat kaksinkertaisen suojauksen. XML-tagit pysyvät ehjinä, JA ICU-avainsanoja (plural, one, other, =0) ei saa kääntää. Monet XLIFF-työkalut käsittelevät toista kerrosta, mutta eivät molempia.

Angular i18n

Angular vie XLIFF 1.2- tai 2.0-tiedostoja ng extract-i18n -komennolla. Tiedostot sisältävät komponenttimallin merkkijonoja, joissa <x>-tagit edustavat Angular-lausekkeita ja interpolointeja, kuten {{ count }}.

Huomio: Angular käyttää id-hash-ristiriitoja identtisten lähdemerkkijonojen välillä. Käännöksen on säilytettävä yksikkötunnukset tarkalleen, tai Angular ei pysty täsmäämään niitä tuonnissa. id-määritteiden uudelleennimeäminen käsittelyn aikana on välitön rikkoutuminen.

iOS (Xcode-vienti)

Xcode vie XLIFF 1.2 -tiedostoja sovellusten lokalisointiin Product > Export Localizations -toiminnolla. Merkkijonot tulevat Localizable.strings-tiedostoista, Info.plist-merkinnöistä, storybordeista ja XIB-tiedostoista. iOS-monikkomuotosäännöt sijaitsevat .stringsdict-tiedostoissa, jotka viedään lisäkäännösyksikköinä.

Huomio: iOS-storyboard-merkkijonot viittaavat käyttöliittymäelementtien tunnuksiin. Näitä ei saa muuttaa. Lisäksi Xcode edellyttää, että target-language-määrite vastaa täsmälleen sen odottamaa kielialueformaattia (es, ei es-ES, joissakin yhteyksissä), tai se ohittaa tuonnin hiljaisesti.

XLIFF-tiedostojen kääntäminen SimplePoTranslatella

SimplePoTranslate tukee XLIFF:ää Pro- ja Lifetime-sopimuksilla. Työnkulku on sama kuin .po-tiedostoille.

1. Vie XLIFF-tiedostosi

Vie lähdealustaltasi yksi tai useampi .xliff-tiedosto. Drupalille käytä TMGMT:n vientitoimintoa. Symfonylle etsi translations/messages.en.xliff. Angularille aja ng extract-i18n --format=xlf2. Xcodea varten käytä Localization-vientiä.

2. Lataa SimplePoTranslateen

Vedä tiedosto hallintapaneeliin. Alusta tunnistaa automaattisesti XLIFF-version (1.2 tai 2.0), jäsentää rakenteen ja tunnistaa käännettävät yksiköt. Valitse kohdekieli ja sävy.

3. Syntaksitietoinen käännös

Sisäiset tagit, ICU-parametrit, paikkamerkit ja yksikkötunnukset lukitaan ennen kääntämistä. Taustalla oleva tekoälymoottori näkee vain puhtaan tekstin kontekstin kanssa. Käännetty teksti lisätään takaisin täsmälleen alkuperäiseen rakenteeseen, tilat päivitetään, ja tiedosto validoidaan XLIFF-skeemaa vastaan ennen toimitusta.

4. Lataa ja tuo

Lataa käännetty XLIFF (sekä .po-, .json- ja .php-vastineet, jos tarvitset useita alustoja). Tuo lähdealustallesi. Validoi renderöimällä muutama käännetty sivu tai näkymä ennen käyttöönottoa.

# Angular example
ng extract-i18n --format=xlf2 --output-path=src/locale
# upload src/locale/messages.xlf to SimplePoTranslate
# download messages.es.xlf
# reference in angular.json i18n configuration
ng build --localize

5. Integroi CI-järjestelmään

Kun luotat prosessiin, automatisoi se. Vie XLIFF jokaisella julkaisulla, lähetä API:n kautta, lataa käännetyt tiedostot, sitouta repositorioon, ota käyttöön. Tämä on sama CI-ystävällinen kaava, jota monet virastot käyttävät WordPressin .po-käännöksiin – katso postauksemme pilvipohjaisesta käännöksestä ilman rikkinäisiä sivustoja arkkitehtonisen kaavan osalta.

Yhteenveto

XLIFF on oikea työkalu vakavaan lokalisointityöhön – jäsennelty, työkaluriippumaton ja riittävän rikas kuljettamaan projektin metatietoja järjestelmien välillä. Mutta sen XML-rakenne on myös hauras. Jokaisella tagilla, attribuutilla ja tilan arvolla on semanttinen painoarvo, ja kääntäjä, joka ei ymmärrä XLIFF:ää formaattina, vioittaa tiedostoasi tavoilla, jotka eivät ehkä ilmene ennen kuin tuonti epäonnistuu tai käyttäjä ilmoittaa käyttöliittymän rikkoutuneen.

Turvallinen lähestymistapa on syntaksitietoinen: jäsennä XML, lukitse rakenteelliset elementit, käännä vain tekstipinnat kontekstin kanssa, validoi skeemaa vastaan ennen toimitusta. Tämä pätee riippumatta siitä, lähetätkö Drupal-sivuston, Symfony API:n, Angular SPA:n tai iOS-sovelluksen. Alusta eroaa, mutta XLIFF-periaate ei.

Oletko valmis kääntämään XLIFF-tiedostoja Drupalille, Symfonylle, Angularille tai iOS:lle rikkomatta tageja? Kokeile SimplePoTranslatea ilmaiseksi – luottokorttia ei vaadita. Lataa .xliff, lataa turvalliset käännökset, tuo alustallesi.

Aiheeseen liittyvät aiheet