static CharSequence generateXliff(
      SoyMsgBundle msgBundle, String sourceLocaleString, @Nullable String targetLocaleString) {

    Escaper attributeEscaper = XmlEscapers.xmlAttributeEscaper();
    Escaper contentEscaper = XmlEscapers.xmlContentEscaper();

    boolean hasTarget = targetLocaleString != null && targetLocaleString.length() > 0;

    IndentedLinesBuilder ilb = new IndentedLinesBuilder(2);
    ilb.appendLine("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
    ilb.appendLine("<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">");
    ilb.increaseIndent();
    ilb.appendLineStart(
        "<file original=\"SoyMsgBundle\" datatype=\"x-soy-msg-bundle\"",
        " xml:space=\"preserve\"",
        " source-language=\"",
        attributeEscaper.escape(sourceLocaleString),
        "\"");
    if (hasTarget) {
      ilb.appendParts(" target-language=\"", attributeEscaper.escape(targetLocaleString), "\"");
    }
    ilb.appendLineEnd(">");
    ilb.increaseIndent();
    ilb.appendLine("<body>");
    ilb.increaseIndent();

    for (SoyMsg msg : msgBundle) {

      // Begin 'trans-unit'.
      ilb.appendLineStart("<trans-unit id=\"", Long.toString(msg.getId()), "\"");
      String contentType = msg.getContentType();
      if (contentType != null && contentType.length() > 0) {
        String xliffDatatype = CONTENT_TYPE_TO_XLIFF_DATATYPE_MAP.get(contentType);
        if (xliffDatatype == null) {
          xliffDatatype = contentType; // just use the contentType string
        }
        ilb.appendParts(" datatype=\"", attributeEscaper.escape(xliffDatatype), "\"");
      }
      ilb.appendLineEnd(">");
      ilb.increaseIndent();

      // Source.
      ilb.appendLineStart("<source>");
      for (SoyMsgPart msgPart : msg.getParts()) {
        if (msgPart instanceof SoyMsgRawTextPart) {
          String rawText = ((SoyMsgRawTextPart) msgPart).getRawText();
          ilb.append(contentEscaper.escape(rawText));
        } else if (msgPart instanceof SoyMsgPlaceholderPart) {
          SoyMsgPlaceholderPart placeholder = (SoyMsgPlaceholderPart) msgPart;
          ilb.appendParts(
              "<x id=\"",
              attributeEscaper.escape(placeholder.getPlaceholderName()),
              "\""
                  // placeholder examples are not part of the xliff standard. It is an android
                  // convention so we add it in the hope that tools will support it anyway.
                  + (placeholder.getPlaceholderExample() != null
                      ? " example=\""
                          + attributeEscaper.escape(placeholder.getPlaceholderExample())
                          + "\""
                      : "")
                  + "/>");
        } else {
          throw new RuntimeException(
              "Xliff doesn't support plurals or genders. " + msg.getSourceLocations());
        }
      }
      ilb.appendLineEnd("</source>");

      // Target.
      if (hasTarget) {
        ilb.appendLine("<target/>");
      }

      // Description and meaning.
      String desc = msg.getDesc();
      if (desc != null && desc.length() > 0) {
        ilb.appendLine(
            "<note priority=\"1\" from=\"description\">", contentEscaper.escape(desc), "</note>");
      }
      String meaning = msg.getMeaning();
      if (meaning != null && meaning.length() > 0) {
        ilb.appendLine(
            "<note priority=\"1\" from=\"meaning\">", contentEscaper.escape(meaning), "</note>");
      }

      // End 'trans-unit'.
      ilb.decreaseIndent();
      ilb.appendLine("</trans-unit>");
    }

    ilb.decreaseIndent();
    ilb.appendLine("</body>");
    ilb.decreaseIndent();
    ilb.appendLine("</file>");
    ilb.decreaseIndent();
    ilb.appendLine("</xliff>");

    return ilb;
  }
static CharSequence generateXliff ( SoyMsgBundle msgBundle , String sourceLocaleString , @ Nullable String targetLocaleString ) { Escaper attributeEscaper = XmlEscapers . xmlAttributeEscaper ( ) ; Escaper contentEscaper = XmlEscapers . xmlContentEscaper ( ) ; boolean hasTarget = targetLocaleString != null && targetLocaleString . length ( ) > 0 ; IndentedLinesBuilder ilb = new IndentedLinesBuilder ( 2 ) ; ilb . appendLine ( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" ) ; ilb . appendLine ( "<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">" ) ; ilb . increaseIndent ( ) ; ilb . appendLineStart ( "<file original=\"SoyMsgBundle\" datatype=\"x-soy-msg-bundle\"" , " xml:space=\"preserve\"" , " source-language=\"" , attributeEscaper . escape ( sourceLocaleString ) , "\"" ) ; if ( hasTarget ) { ilb . appendParts ( " target-language=\"" , attributeEscaper . escape ( targetLocaleString ) , "\"" ) ; } ilb . appendLineEnd ( ">" ) ; ilb . increaseIndent ( ) ; ilb . appendLine ( "<body>" ) ; ilb . increaseIndent ( ) ; for ( SoyMsg msg : msgBundle ) { ilb . appendLineStart ( "<trans-unit id=\"" , Long . toString ( msg . getId ( ) ) , "\"" ) ; String contentType = msg . getContentType ( ) ; if ( contentType != null && contentType . length ( ) > 0 ) { String xliffDatatype = CONTENT_TYPE_TO_XLIFF_DATATYPE_MAP . get ( contentType ) ; if ( xliffDatatype == null ) { xliffDatatype = contentType ; } ilb . appendParts ( " datatype=\"" , attributeEscaper . escape ( xliffDatatype ) , "\"" ) ; } ilb . appendLineEnd ( ">" ) ; ilb . increaseIndent ( ) ; ilb . appendLineStart ( "<source>" ) ; for ( SoyMsgPart msgPart : msg . getParts ( ) ) { if ( msgPart instanceof SoyMsgRawTextPart ) { String rawText = ( ( SoyMsgRawTextPart ) msgPart ) . getRawText ( ) ; ilb . append ( contentEscaper . escape ( rawText ) ) ; } else if ( msgPart instanceof SoyMsgPlaceholderPart ) { SoyMsgPlaceholderPart placeholder = ( SoyMsgPlaceholderPart ) msgPart ; ilb . appendParts ( "<x id=\"" , attributeEscaper . escape ( placeholder . getPlaceholderName ( ) ) , "\"" + ( placeholder . getPlaceholderExample ( ) != null ? " example=\"" + attributeEscaper . escape ( placeholder . getPlaceholderExample ( ) ) + "\"" : "" ) + "/>" ) ; } else { throw new RuntimeException ( "Xliff doesn't support plurals or genders. " + msg . getSourceLocations ( ) ) ; } } ilb . appendLineEnd ( "</source>" ) ; if ( hasTarget ) { ilb . appendLine ( "<target/>" ) ; } String desc = msg . getDesc ( ) ; if ( desc != null && desc . length ( ) > 0 ) { ilb . appendLine ( "<note priority=\"1\" from=\"description\">" , contentEscaper . escape ( desc ) , "</note>" ) ; } String meaning = msg . getMeaning ( ) ; if ( meaning != null && meaning . length ( ) > 0 ) { ilb . appendLine ( "<note priority=\"1\" from=\"meaning\">" , contentEscaper . escape ( meaning ) , "</note>" ) ; } ilb . decreaseIndent ( ) ; ilb . appendLine ( "</trans-unit>" ) ; } ilb . decreaseIndent ( ) ; ilb . appendLine ( "</body>" ) ; ilb . decreaseIndent ( ) ; ilb . appendLine ( "</file>" ) ; ilb . decreaseIndent ( ) ; ilb . appendLine ( "</xliff>" ) ; return ilb ; }
Generates the output XLIFF file content for a given SoyMsgBundle.

@param msgBundle The SoyMsgBundle to process.
@param sourceLocaleString The source language/locale string of the messages.
@param targetLocaleString The target language/locale string of the messages (optional). If
specified, the resulting XLIFF file will specify this target language and will contain
empty 'target' tags. If not specified, the resulting XLIFF file will not contain target
language and will not contain 'target' tags.
@return The generated XLIFF file content.