Guides / 3 of 15

XLIFF from a translation management system: export, translate offline, import back

How the cloud translation systems export a job as XLIFF for offline work, what each one puts in the file and refuses on the way back in, and how to translate the file in your browser and upload it without errors.

Most cloud translation systems let a translator download a job as XLIFF, translate it in another tool and upload it back. Phrase TMS (formerly Memsource), Crowdin, Lokalise, Smartling, XTM Cloud, Transifex and Smartcat all document this round trip. Each one writes its own kind of file, keeps the status in its own place, and checks different things when the file comes back.

This guide takes them one at a time: how to export the file, what is in it, what xliff.ai does with it, what to watch for, and how to import it again. Every statement about a system comes from that system’s own documentation, linked where it is used and read on 2026-11-06. Every statement about xliff.ai is backed by a test run against a small hand-made file in that system’s documented shape. No file exported from xliff.ai has yet been uploaded to any of these systems, and each section says so.

The same four rules everywhere

The details differ, but every system’s documentation comes down to the same four rules:

  • The file goes back where it came from. The same project and job, and often the same workflow step, branch or language. A file downloaded before the job changed can be refused.
  • The structure stays as it was. Unit IDs, the number of units and the inline tags. Only target text is meant to change.
  • The status says the work is done. Several systems read the state attribute on <target>, or let you choose at upload which statuses count.
  • The name and extension stay the same. Upload the file you downloaded, not a copy saved in another format.

xliff.ai is built around the second rule. Its export splices the targets you changed into the original bytes. The source text, the IDs, the vendor’s own attributes, notes and stored matches come back exactly as they arrived, under the original file name. It never adds segmentation markup a file did not have.

Two things it does write, on segments you change:

  • Ctrl+Enter confirms a segment and writes state="translated" on its <target>.
  • A segment you edit and do not confirm is a Draft, written as state="needs-translation". Repetitions that xliff.ai fills for you when you confirm a segment arrive as Draft too, so read and confirm them as well.

For the third rule, confirm every segment you translate. For the other three, upload the file xliff.ai exports, unrenamed, to the place you downloaded it from. Before the export, the QA checks report tag and placeholder mismatches, which are what most imports refuse.

SystemExport for offline workXLIFFStatus in the fileImport
Phrase TMSJobs, Download, Bilingual MXLIFF1.2, with Phrase’s m: namespacem:confirmedTools, Upload
CrowdinEditor, File, Export as XLIFF1.2 per its format pagestate on <target>File, Upload Translations
LokaliseOffline translation widget, Download all as XLIFF1.2state on <target>Upload translated XLIFF
SmartlingJobs Dashboard, Export Content1.2Not documentedImport Content
XTM CloudFile Manager, Generate XLIFF1.2state on <target>Upload XLIFF
TransifexLanguage, Download for translation as XLIFFNot documentedNot documentedUpload XLIFF file
SmartcatExport, Special formats, XLIFF1.2Not namedUpload, Update translation

Phrase TMS (Memsource) and MXLIFF

Phrase TMS calls its bilingual file MXLIFF (.mxliff). Its developer guide to the format describes it as XLIFF 1.2 with a Phrase namespace, m, declared as http://www.memsource.com/mxlf/2.0.

Export

  1. Open the project, select the job or jobs on the Jobs list, choose Download and then the bilingual MXLIFF. The editor’s Document menu and the linguist portal offer the same download (MXLIFF files, CAT editor).
  2. If the download is missing, a project manager may have switched off linguist downloads in the project’s access and security settings.

Plain XLIFF is offered only through Phrase’s API, not in the interface. In a later workflow step, the file holds only the previous step’s targets that existed when you downloaded it (Workflow).

What is in the file

  • Status and locks are Phrase attributes on each <trans-unit>: m:confirmed is the workflow level at which the segment was confirmed, m:locked says whether it is locked, and m:score and m:trans-origin record a pre-translation’s score and where it came from.
  • Tags are not XLIFF inline elements. Phrase writes them as plain-text placeholders in the text, {1} for a standalone tag and {2>text<2} for a pair, and keeps what they stand for in m:tunit-metadata (Tags).
  • Matches travel inside the unit: <alt-trans> elements hold the memory and machine translation suggestions.
  • A length limit is an x-max-len context on the paragraph’s <group>.

In xliff.ai

The file opens as XLIFF 1.2, and the export keeps the .mxliff name. Everything outside the targets you change comes back byte for byte: the m: attributes, the metadata and the stored matches. The target shown for each segment is the unit’s own, never a match from <alt-trans>. Confirming a segment writes state="translated" on its <target> and changes nothing else.

xliff.ai does not yet read Phrase’s own attributes, and the gaps matter:

  • Segments confirmed in Phrase show as Draft here, because the confirmation is in m:confirmed, not in state. For the same reason, confirming a segment here does not change m:confirmed. Check the confirmations in Phrase’s editor after the upload.
  • Segments locked in Phrase are editable here. xliff.ai does not read m:locked. Leave locked segments as they are. Phrase’s documentation does not say what an upload does with a changed locked segment in an MXLIFF.
  • The x-max-len limit is not checked. Keep to the limit yourself.

Watch for

  • The tag placeholders are text. Type them, or start from the source with Ctrl+Insert and translate around them. The placeholder check reports a missing {1}, but not a missing {2> or <2} of a pair, so compare pairs by eye.
  • Do not edit the source. If the project owner does not allow source edits, an upload with a changed source fails with “Source edits prohibited by project owner. Upload failed.” xliff.ai never changes the source.
  • Phrase does not promise anything outside its own tools: it says it “cannot be guaranteed” how other software processes an MXLIFF.

Import it back

  1. On the project’s Jobs list, choose Tools, then Upload, and upload the .mxliff. Several files can go in one .zip. From the desktop editor, Document, Upload to server does the same; a linguist can upload from the portal’s Tools menu, or send the file to the project manager.
  2. Upload it to the same project, and to the same workflow step it was exported from.

Phrase’s desktop editor article lists why an upload fails: the MXLIFF belongs to a different project, it was added to a different workflow step, the job has been deleted, or the file is broken. An “Access denied” error at 95% of an upload means the job has not been accepted, is already Completed or was given to another linguist (CAT editor). Uploads cannot be undone, so keep the file you downloaded (Bilingual DOCX).

Not yet verified in Phrase TMS. The export is tested byte for byte against a hand-made MXLIFF, but no file from xliff.ai has been uploaded to Phrase yet.

Crowdin

Export

  1. A project manager has to enable Allow offline translation in the project settings (Privacy and collaboration). Managers can always download.
  2. In the Editor, choose File, then Download or Export as XLIFF. Export Filtered as XLIFF exports only the strings the current filter shows, such as the untranslated ones. From the language page, Export in XLIFF gives one file with all source strings and completed translations (Offline translation).
  3. With task-based access, export from the task instead (Roles).

What is in the file

Every <target> carries a state: needs-translation, translated or final. Crowdin’s offline page links to its XLIFF 1.2 format page, which documents the rest:

  • strings filled from memory, machine translation or AI that nobody has reviewed are exported as needs-review-translation, with a state-qualifier naming the source;
  • approved="yes" counts as final;
  • maxwidth with size-unit="char" is a character limit;
  • translate="no" marks a hidden string;
  • comments are <note> elements, and plural forms are units in a <group restype="x-gettext-plurals">, one per form.

In xliff.ai

  • The character limit is checked. The length check reports a target over the maxwidth.
  • Hidden strings are locked, and the editor refuses to change them.
  • Notes are shown with the segment, and each plural form is its own row, with a unit ID ending in [0], [1] and so on.
  • Unreviewed pre-translations show as Reviewed. xliff.ai reads needs-review-translation as Reviewed, a confirmed status, so Ctrl+Enter’s jump to the next unconfirmed segment passes over them. Choose the Reviewed status chip in the filter bar to find them, read each one and press Ctrl+Enter. That writes state="translated" and keeps the state-qualifier.
  • approved is never changed. A string that arrived with approved="yes" keeps it, even after you edit it.

Watch for

  • Confirm every segment you translate. Crowdin’s offline page says the state has to be translated or final “to be sure that translations will be successfully uploaded”. A Draft is written as needs-translation.
  • Skipped by default (Uploading translations): translations identical to the source, translations identical to the existing ones, and translations of hidden strings. The upload report also lists translations skipped because they failed one of the project’s QA checks.
  • Translators cannot approve. Approving is for proofreaders and above.

Import it back

  1. In the Editor, choose File, then Upload Translations, or choose Upload XLIFF translations on the language page.
  2. Set the import options: Allow target translation to match source for strings that are meant to stay identical, Approve added translations, and Translate hidden strings. Some of them may be available only to managers.
  3. Read the summary: Imported, Approved and Skipped.

Not yet verified in Crowdin. The export is tested byte for byte against a hand-made file built from Crowdin’s samples, but no file from xliff.ai has been uploaded to Crowdin yet.

Lokalise

Export

  1. Offline translation is available from the Growth plan up, and not in Lokalise Vantage. A project admin turns it on in the project settings, under General, Miscellaneous, Offline translation (Offline translation).
  2. Switch the editor to the bilingual view. The offline translation widget offers Download all as XLIFF for the selected target language, or Download filtered as XLIFF for the keys the current filter shows.
  3. In a task, use the task’s Download XLIFF. It downloads every language in one .zip.

What is in the file

Lokalise reads and writes XLIFF 1.2 (XLIFF). The offline file includes key descriptions, links to screenshots and each translation’s status, as the state attribute on <target>. Lokalise reads state back like this:

  • translated and new: not reviewed, verified;
  • final and signed-off: reviewed;
  • every needs- value, needs-translation included: unverified.

In a project that uses segmentation, offline keys are renamed lokalise-<key_id>-<segment_number> on export (Segmentation).

In xliff.ai

Key descriptions are shown with the segment, and statuses on segments you do not change are written back exactly as they arrived. Lokalise asks Trados Studio users to switch off stored segmentation before they upload. xliff.ai writes none, so there is nothing to switch off.

Watch for

  • A Draft is imported as unverified, because xliff.ai writes it as needs-translation. Confirm every segment you translate.
  • A reviewed segment you change is no longer reviewed. Confirming writes translated, which Lokalise reads as not reviewed. xliff.ai cannot write final or signed-off, so in a review task, segments you leave untouched keep the reviewed status they arrived with, and segments you correct come back as translated.
  • Custom placeholders do not work with offline XLIFF (Custom placeholders).
  • A changed source marks the translation unverified. If the source in Lokalise no longer matches the source in the file, the uploaded translation is marked unverified.

Import it back

  1. In the bilingual view, use the widget’s Upload translated XLIFF, or the task’s Upload XLIFF. The upload replaces the existing translations with the file’s, so upload the export of the latest file you downloaded (Onboarding guide for translators).
  2. In a project with branches, the file can only be uploaded to the branch it was downloaded from.

Not yet verified in Lokalise. Lokalise publishes no sample of its offline file, so the export is tested byte for byte against a hand-made file built from its XLIFF article. No file from xliff.ai has been uploaded to Lokalise yet.

Smartling

Export

  1. The job’s workflow step must allow assignment and offline work, and the job must be authorized and in progress (Translating offline). If the step does not allow offline work, the export options are greyed out.
  2. On the Jobs Dashboard, open the job’s ⋯ menu and choose Export Content, or Export translations for one language and step. The XLIFF is always included, up to 20,000 strings; a TMX memory and a TBX glossary are optional.
  3. The package has one folder per locale. If it is emailed, the link works for seven days, and only for the person who started the export.

What is in the file

Smartling’s export and import article shows a sample of the file: XLIFF 1.2, a string as a <trans-unit> with a 32-character hexadecimal ID, its source split into segments in <seg-source> with <mrk mtype="seg"> markers, and an empty <target> while it is not yet translated.

Two things do not travel. Character limits are lost in the exported file, so they are not checked on import. And the client’s quality checks do not run on offline work.

In xliff.ai

Each <mrk> segment is its own row. When you translate a string whose <target> is empty, xliff.ai writes your text inside an <mrk> with the same mid as the source segment, and leaves the rest of the unit as it was.

Watch for

  • Ask for the character limits. They are not in the file, so neither Smartling nor xliff.ai can check them. xliff.ai’s length check still compares each target with its source.
  • Run QA before you export. Imported translations are not checked, and Smartling notes that they can even be in a different language from the one the job asked for.
  • A string that fails to import comes back with a blank target. Smartling names the most common cause: tags in the offline translation that it does not support for that file type (Export and import jobs).

Import it back

  1. On the Jobs Dashboard, open the job’s ⋯ menu, choose Import Content and drop the .xliff files. Only .xliff files are accepted.
  2. Choose Save and remain in current step or Save and submit to next step, then Import Files.
  3. Imported translations go into the translation memory only once they are edited in Smartling or published.

Not yet verified in Smartling. The export is tested byte for byte against a hand-made file that starts from Smartling’s published sample, but no file from xliff.ai has been uploaded to Smartling yet.

XTM Cloud

Export

  1. In your active tasks, open the task’s menu and choose Open File Manager (Project – Files).
  2. In the Offline translation column, choose Generate XLIFF. It writes an XLIFF 1.2 file for the workflow step assigned to you. Generate multi XLIFF writes one file for several jobs in the same language pair.
  3. XTM asks whether to fill untranslated targets with the source. Choose not to: an empty target is one xliff.ai’s QA reports as empty, and a copied source looks translated.
  4. Download the generated file.

Whether you can do this depends on your access rights. When text formatting is enabled for a project, no offline files can be generated (Text formatting).

What is in the file

XLIFF 1.2, with XTM’s status in the state attribute on <target>: an administrator can map the statuses, and by default a translated segment is translated (Export mapping). Formatting and codes are XLIFF inline elements. A segment can be locked with an xtm:locked attribute.

In xliff.ai

The file keeps its .xlf name, and the inline elements are tags that cannot be split by typing. xliff.ai does not read xtm:locked, so a segment XTM locked is editable here. Leave it as it is.

Watch for

XTM’s knowledge base on offline XLIFF lists what it refuses:

  • The number of inline elements must be exactly the same. A deleted tag makes the file impossible to upload. The tag check reports a missing tag. xliff.ai does not stop you exporting a file with one, so clear every tag mismatch first.
  • Only the file XTM generated can go back. Not a file converted to another tool’s format, such as SDLXLIFF or MQXLIFF. Keep the .xlf extension (How to translate offline).
  • A reanalysis makes older files stale. After the project is reanalysed or updated, a file generated before it no longer matches the document’s ID and is refused.
  • Single and multi files do not mix. A file generated as multi XLIFF goes back as multi XLIFF, and a single one as single.

Import it back

  1. In the same File Manager, in the Offline translation column, choose the upload icon and Upload XLIFF (or Upload multi XLIFF) (Uploading XLIFF).
  2. Under Approve segment status for, choose which segments are set to Completed. Use XLIFF segment status completes, by default, segments marked signed-off, final, translated, needs-review-translation or needs-review-adaptation. Segments you confirmed in xliff.ai are translated. A Draft is not completed.
  3. If the upload fails, the error icon in the same column says why.

Not yet verified in XTM Cloud. The export is tested byte for byte against a hand-made file shaped like the one in XTM’s knowledge base, but no file from xliff.ai has been uploaded to XTM yet.

Transifex

Export

  1. XLIFF needs the Growth plan or higher. Open Source content, the resource, and the language you are translating (Translate offline).
  2. Choose Download for translation as XLIFF, which includes translated and untranslated strings, or Download untranslated strings as XLIFF (PO files).
  3. The XLIFF options appear only when the resource itself is not XLIFF. For an XLIFF resource, download the file for translation instead.

What is in the file

Transifex does not document the version, or show a sample. It does say that untranslated strings are downloaded without a <target> element. Its XLIFF article describes how it reads XLIFF: developer notes in <note from="developer">, character limits in maxwidth with size-unit="char", and the approved attribute, where a target in a unit marked approved="no" is kept only as a suggestion.

In xliff.ai

When you translate a string that has no <target>, xliff.ai inserts one after its <source>. Developer notes are shown, and a maxwidth in characters is checked. approved is never changed.

Watch for

  • Reviewed and locked strings stay as they are in Transifex. Translators cannot change strings already reviewed there, and locked strings cannot be translated by upload (Uploading translations, Preventing translation edits).
  • Checks do not stop an upload. Translations that fail a check are saved anyway (Translation checks).
  • If the source changed while you worked, translations of changed strings are applied to the new source and need review, and strings that no longer exist are ignored.

Import it back

  1. In the same language window, choose Upload XLIFF file. It works when the file was downloaded as XLIFF.
  2. The upload overwrites the existing translations. Entries with no translation are ignored, and the file has to be UTF-8. After a wrong upload, the earlier translations are under the History tab in the editor (Wrong upload).

Not yet verified in Transifex. Transifex publishes no sample of the file, so the export is tested byte for byte against a hand-made file built from its XLIFF article. No file from xliff.ai has been uploaded to Transifex yet.

Smartcat

Export

  1. On the project page, select the documents and choose Export, then Special formats, then XLIFF. In the editor, the same is under the arrow beside the download button (XLIFF export and import, Translating XLIFF files).
  2. The file is XLIFF 1.2, and you can export it at any point during the translation. A manager can restrict downloads for linguists (Exporting files).

What is in the file

Source, target and each segment’s status, with a few Smartcat-specific attributes that the documentation does not name. Smartcat asks for tags in the order the source has them (Tags).

In xliff.ai

Smartcat publishes no sample of its XLIFF, so xliff.ai has not been tested against its shape. The general rules above apply: the export changes only the targets you edit and their state.

Import it back

  1. On the project page, open the arrow beside Upload and choose Update translation (Exporting XLIFF files).
  2. If segments changed in Smartcat while you worked, choose Update all segments to overwrite them or Skip segments changed in Smartcat to keep them.
  3. Choose whether to confirm the updated segments and save them to the translation memory, or leave them unconfirmed to check in Smartcat’s editor. Updated segments are marked Updated.

Not yet verified in Smartcat. No file from xliff.ai has been uploaded to Smartcat yet.

Before you upload

  1. The file is the export of the file you downloaded, under the same name and extension.
  2. It goes back to the same project, job, workflow step, branch and language.
  3. Every segment you translated is confirmed, including the repetitions xliff.ai filled as Draft.
  4. No tag or placeholder mismatch is left in the QA panel.
  5. Locked segments are untouched, including the ones xliff.ai does not show as locked, in Phrase TMS and XTM Cloud files.
  6. You still have the file you downloaded, until the upload has gone through.

xliff.ai’s exports are tested byte for byte, here against hand-made files in each system’s documented shape, but not yet inside the systems themselves. What has and has not been proved explains the difference. If a system refuses a file exported from xliff.ai, please send it to us.

For the file itself, see the references on XLIFF 1.2 and XLIFF 2.0, and How to translate an XLIFF file, step by step for the work in between.

Phrase, Memsource, Crowdin, Lokalise, Smartling, XTM, Transifex and Smartcat are trademarks of their respective owners. xliff.ai is not affiliated with, endorsed by or connected to any of them. This guide describes their published documentation so that their users can work with the files those systems export.