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
stateattribute 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.
| System | Export for offline work | XLIFF | Status in the file | Import |
|---|---|---|---|---|
| Phrase TMS | Jobs, Download, Bilingual MXLIFF | 1.2, with Phrase’s m: namespace | m:confirmed | Tools, Upload |
| Crowdin | Editor, File, Export as XLIFF | 1.2 per its format page | state on <target> | File, Upload Translations |
| Lokalise | Offline translation widget, Download all as XLIFF | 1.2 | state on <target> | Upload translated XLIFF |
| Smartling | Jobs Dashboard, Export Content | 1.2 | Not documented | Import Content |
| XTM Cloud | File Manager, Generate XLIFF | 1.2 | state on <target> | Upload XLIFF |
| Transifex | Language, Download for translation as XLIFF | Not documented | Not documented | Upload XLIFF file |
| Smartcat | Export, Special formats, XLIFF | 1.2 | Not named | Upload, 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
- 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).
- 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:confirmedis the workflow level at which the segment was confirmed,m:lockedsays whether it is locked, andm:scoreandm:trans-originrecord 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 inm: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-lencontext 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 instate. For the same reason, confirming a segment here does not changem: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-lenlimit 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
- 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. - 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
- A project manager has to enable Allow offline translation in the project settings (Privacy and collaboration). Managers can always download.
- 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).
- 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 astate-qualifiernaming the source; approved="yes"counts asfinal;maxwidthwithsize-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-translationas 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 writesstate="translated"and keeps thestate-qualifier. approvedis never changed. A string that arrived withapproved="yes"keeps it, even after you edit it.
Watch for
- Confirm every segment you translate. Crowdin’s offline page says the
statehas to betranslatedorfinal“to be sure that translations will be successfully uploaded”. A Draft is written asneeds-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
- In the Editor, choose File, then Upload Translations, or choose Upload XLIFF translations on the language page.
- 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.
- 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
- 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).
- 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.
- 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:
translatedandnew: not reviewed, verified;finalandsigned-off: reviewed;- every
needs-value,needs-translationincluded: 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 writefinalorsigned-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
- 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).
- 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
- 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.
- 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.
- 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
- On the Jobs Dashboard, open the job’s ⋯ menu, choose Import Content and drop the
.xlifffiles. Only.xlifffiles are accepted. - Choose Save and remain in current step or Save and submit to next step, then Import Files.
- 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
- In your active tasks, open the task’s menu and choose Open File Manager (Project – Files).
- 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.
- 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.
- 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
.xlfextension (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
- In the same File Manager, in the Offline translation column, choose the upload icon and Upload XLIFF (or Upload multi XLIFF) (Uploading XLIFF).
- 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-translationorneeds-review-adaptation. Segments you confirmed in xliff.ai aretranslated. A Draft is not completed. - 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
- XLIFF needs the Growth plan or higher. Open Source content, the resource, and the language you are translating (Translate offline).
- Choose Download for translation as XLIFF, which includes translated and untranslated strings, or Download untranslated strings as XLIFF (PO files).
- 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
- In the same language window, choose Upload XLIFF file. It works when the file was downloaded as XLIFF.
- 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
- 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).
- 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
- On the project page, open the arrow beside Upload and choose Update translation (Exporting XLIFF files).
- If segments changed in Smartcat while you worked, choose Update all segments to overwrite them or Skip segments changed in Smartcat to keep them.
- 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
- The file is the export of the file you downloaded, under the same name and extension.
- It goes back to the same project, job, workflow step, branch and language.
- Every segment you translated is confirmed, including the repetitions xliff.ai filled as Draft.
- No tag or placeholder mismatch is left in the QA panel.
- Locked segments are untouched, including the ones xliff.ai does not show as locked, in Phrase TMS and XTM Cloud files.
- 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.