Transifex

  • Documentation
  • File formats
  • XLIFF

XLIFF

Note

File conversion to XLIFF format is only available on the Premium plan and up.

  • File extensions: .xliff, .xlf, .xml
  • i18n type: XLIFF

The XLIFF format is an industry standard format to exchange localization files (XML Localisation Interchange File Format).

Transifex currently supports a certain subset of the features XLIFF provides:

  • The <group>, <context-group>, <context>, <trans-unit>, <source>, <note> and <target>; elements are handled.
  • Any context data are handled.
  • Developer comments are supported the following way:
<note from="developer">TRANSLATORS: please limit the page width to 79
    characters here.
</note>

and appear in the Web Editor as Developer Notes.

  • Character limits are also supported
<trans-unit id="1" maxwidth="30" size-unit="char"></trans-unit>

where the attribute maxwidth should be a positive number and the site-unit must be set to char.

  • References are also supported where each reference is mapped to two <context> elements, one specifying the source file (context-type attribute set to sourcefile) and the other representing the location in the source file ( context-type attribute set to linenumber). Each reference is in addition grouped in a <context-group> element, with the name attribute set to a value that must be unique within the enclosing <file> element and the purpose attribute set to location
<context-group name="po-reference-2" purpose="location">
  <context context-type="sourcefile">simple.c</context>
  <context context-type="linenumber">5</context>
</context-group>

They appear as Occurrences in the Web Editor.

  • Approved attribute is also supported. It indicates whether a translation is final or has passed its final review.
      <trans-unit approved="yes" id="1" xml:space="preserve">
        <source>username</source>
        <target>Nom d'utilisateur</target>
      </trans-unit>
      <trans-unit approved="no" id="2" xml:space="preserve">
        <source>Email address</source>
        <target>Adresse de courriel</target>
      </trans-unit>

After uploading such a translation file where the approved attribute is included, the parser will behave as follows:

  1. Entries with approved="yes" will be marked as translated in Transifex having the translation text available in the translation string's area.
  2. Entries with approved="no" will remain untranslated in Transifex. However, the text inside the <target> elements will be considered a user suggestion and it will be available under the suggestions tab in the editor.

e.g.

approved_no_xliff.png#asset:4510

Plural Support

Plural data are handled in the following manner:

      <group restype="x-gettext-plurals">
       <trans-unit id="1[0]" xml:space="preserve">
       <source>Your trial ends in 1 day</source>
       </trans-unit>
       <trans-unit id="1[1]" xml:space="preserve">
       <source>Your trial ends in %@ days</source>
       </trans-unit>
     </group>

For more information on how plurals are represented in the web-editor, consult our documentation guide here.

The following features are not supported:

  • Attributes of the above elements.
  • The <alt-trans> element.
  • Binary elements, like <bin-unit>, <bin-source>; and <bin-target>.
  • The <glossary> elements.
  • Any other minor elements.

How To Distinguish Between a Source File and a Translation File

XLIFF is a universal standard for translating across various systems. If a translation agency is supplying translations from their TMS so that you can upload them into Transifex you need to ensure that the source file is uploaded into Transifex first. A source file is different than a translation file. The translation file contains <Target> references, whereas a source file does not. For example:

  • The following header belongs to a source file:
<file datatype="plaintext" original="en.lproj/Localizable.txt" source-language="en">
  • The following header belongs to a translation file:
<file datatype="plaintext" original="en.lproj/Localizable.txt" source-language="en" target-language="fr">

In the example above, notice that the translation file contains a target-language whereas the source file does not. Please note that an XLIFF file can contain multiple entries of this type.

  • The following XLIFF entry represents an untranslated string. Only untranslated strings can be found in a source file:
<trans-unit datatype="html" id="576413276e4ee299f9a138e749b71e2f5b0d3ed5">

        <source>Confirm email address</source>

</trans-unit>
  • The following XLIFF entry represents a translated string. Translated strings can only be found in a translation file:
<trans-unit datatype="html" id="576413276e4ee299f9a138e749b71e2f5b0d3ed5">
        <source>Confirm email address</source>
        <target>Confirmez l'adresse courriel</target>
</trans-unit>

Escaping Characters

Even though the rich/raw option appears in the editor’s settings, the XLIFF file format handler does not support rich/raw mode.

For file formats that do not support rich/raw, all strings are exposed in the editor in the rich mode. Then, when the language files get compiled, they will be properly escaped (converted to raw) according to the rules of the file format.

Examples can be found below:

During parsing, we unescape (convert from raw to rich):

||*Source file*||*Editor*||
|foo|foo|
|“foo”|“foo”|
|&quot;foo&quot;|"foo"|
|&amp;quot;foo&amp;quot;|&quot;foo&quot;|
|&foo&|PARSE ERROR|
|&amp;foo&amp;|&foo&|
|&amp;amp;foo&amp;amp;|&amp;foo&amp;|

During compiling, we escape (convert from rich to raw):

||*Editor*||*Language file*||
|foo|foo|
|"foo"|&quot;foo&quot;|
|&quot;foo&quot;|&amp;quot;foo&amp;quot;|
|&amp;quot;foo&amp;quot;|&amp;amp;quot;foo&amp;amp;quot;|
|&foo&|&amp;foo&amp;|
|&amp;foo&amp;|&amp;amp;foo&amp;amp;|
|&amp;amp;foo&amp;amp;|&amp;amp;amp;foo&amp;amp;amp;|

However, if the translation contains some special XLIFF tags (bpt, ept, it, ph, g, bx, ex, x, sub), we don’t escape between the {{<}} and {{>}} symbols. So:

||*Editor*||*Language file*||
|foo <x a="b">bar</x>|foo <x a="b">bar</x>|
|"foo" <x a="b">bar</x>|&quot;foo&quot; <x a="b">bar</x>|
|&quot;foo&quot; <x a="b">bar</x>|&amp;quot;foo&amp;quot; <x a="b">bar</x>|
|&amp;quot;foo&amp;quot; <x a="b">bar</x>|&amp;amp;quot;foo&amp;amp;quot; <x a="b">bar</x>|
|&foo& <x a="b">bar</x>|&amp;foo&amp; <x a="b">bar</x>|
|&amp;foo&amp; <x a="b">bar</x>|&amp;amp;foo&amp;amp; <x a="b">bar</x>|
|&amp;amp;foo&amp;amp; <x a="b">bar</x>|&amp;amp;amp;foo&amp;amp;amp; <x a="b">bar</x>|