import { ITranslationMessagesFile } from '../api/i-translation-messages-file' ; import { INormalizedMessage } from '../api/i-normalized-message' ; import { ITransUnit } from '../api/i-trans-unit' ; import { INote } from '../api/i-note' ; import { DOMUtilities } from './dom-utilities' ; import { AbstractTransUnit } from './abstract-trans-unit' ; import { XmbMessageParser } from './xmb-message-parser' ; import { ParsedMessage } from './parsed-message' ; import { AbstractMessageParser } from './abstract-message-parser' ; /**
 * Created by martin on 01.05.2017.
 * A Translation Unit in an XMB file.
 */ export class XmbTransUnit extends AbstractTransUnit implements ITransUnit { constructor ( _element , _id , _translationMessagesFile ) { super ( _element , _id , _translationMessagesFile ) ; } param sourceAndPos return private static parseSourceAndPos ( sourceAndPos ) { const index = sourceAndPos . lastIndexOf ( ':' ) ; if ( index < 0 ) { return { sourcefile : sourceAndPos , linenumber : 0 } ; } else { return { sourcefile : sourceAndPos . substring ( 0 , index ) , linenumber : XmbTransUnit . parseLineNumber ( sourceAndPos . substring ( index + 1 ) ) } ; } } private static parseLineNumber ( lineNumberString ) { return Number . parseInt ( lineNumberString , 10 ) ; } return public sourceContent ( ) { let msgContent = DOMUtilities . getXMLContent ( this . _element ) ; const reSourceElem = /<source>.*<\/source>/g ; msgContent = msgContent . replace ( reSourceElem , '' ) ; return msgContent ; } /**
     * Test, wether setting of source content is supported.
     * If not, setSourceContent in trans-unit will do nothing.
     * xtb does not support this, all other formats do.
     */ supportsSetSourceContent ( ) { return false ; } param newContent public setSourceContent ( newContent ) { } /**
     * Return a parser used for normalized messages.
     */ protected messageParser ( ) { return new XmbMessageParser ( ) ; } /**
     * The original text value, that is to be translated, as normalized message.
     */ public createSourceContentNormalized ( ) { return this . messageParser ( ) . createNormalizedMessageFromXML ( this . _element , null ) ; } /**
     * the translated value (containing all markup, depends on the concrete format used).
     */ public targetContent ( ) { return this . sourceContent ( ) ; } /**
     * the translated value, but all placeholders are replaced with {{n}} (starting at 0)
     * and all embedded html is replaced by direct html markup.
     */ targetContentNormalized ( ) { return new XmbMessageParser ( ) . createNormalizedMessageFromXML ( this . _element , this . sourceContentNormalized ( ) ) ; } /**
     * State of the translation.
     * (not supported in xmb)
     */ public nativeTargetState ( ) { return null ; } param state returns throws protected mapStateToNativeState ( state ) { return state ; } param nativeState protected mapNativeStateToState ( nativeState ) { return nativeState ; } param nativeState protected setNativeTargetState ( nativeState ) { } /**
     * All the source elements in the trans unit.
     * The source element is a reference to the original template.
     * It contains the name of the template file and a line number with the position inside the template.
     * It is just a help for translators to find the context for the translation.
     * This is set when using Angular 4.0 or greater.
     * Otherwise it just returns an empty array.
     */ public sourceReferences ( ) { const sourceElements = this . _element . getElementsByTagName ( 'source' ) ; const sourceRefs = [ ] ; for ( let i = 0 ; i < sourceElements . length ; i ++ ) { const elem = sourceElements . item ( i ) ; const sourceAndPos = DOMUtilities . getPCDATA ( elem ) ; sourceRefs . push ( XmbTransUnit . parseSourceAndPos ( sourceAndPos ) ) ; } return sourceRefs ; } param sourceRefs public setSourceReferences ( sourceRefs ) { this . removeAllSourceReferences ( ) ; let insertPosition = this . _element . childNodes . item ( 0 ) ; for ( let i = sourceRefs . length - 1 ; i >= 0 ; i -- ) { const ref = sourceRefs [ i ] ; const source = this . _element . ownerDocument . createElement ( 'source' ) ; source . appendChild ( this . _element . ownerDocument . createTextNode ( ref . sourcefile + ':' + ref . linenumber . toString ( 10 ) ) ) ; this . _element . insertBefore ( source , insertPosition ) ; insertPosition = source ; } } private removeAllSourceReferences ( ) { const sourceElements = this . _element . getElementsByTagName ( 'source' ) ; const toBeRemoved = [ ] ; for ( let i = 0 ; i < sourceElements . length ; i ++ ) { const elem = sourceElements . item ( i ) ; toBeRemoved . push ( elem ) ; } toBeRemoved . forEach ( ( elem ) => { elem . parentNode . removeChild ( elem ) ; } ) ; } /**
     * The description set in the template as value of the i18n-attribute.
     * e.g. i18n="mydescription".
     * In xmb this is stored in the attribute "desc".
     */ public description ( ) { return this . _element . getAttribute ( 'desc' ) ; } /**
     * The meaning (intent) set in the template as value of the i18n-attribute.
     * This is the part in front of the | symbol.
     * e.g. i18n="meaning|mydescription".
     * In xmb this is stored in the attribute "meaning".
     */ public meaning ( ) { return this . _element . getAttribute ( 'meaning' ) ; } /**
     * Test, wether setting of description and meaning is supported.
     * If not, setDescription and setMeaning will do nothing.
     * xtb does not support this, all other formats do.
     */ public supportsSetDescriptionAndMeaning ( ) { return false ; } param description public setDescription ( description ) { } param meaning public setMeaning ( meaning ) { } /**
     * Get all notes of the trans-unit.
     * There are NO notes in xmb/xtb
     */ public notes ( ) { return [ ] ; } /**
     * Test, wether setting of notes is supported.
     * If not, setNotes will do nothing.
     * xtb does not support this, all other formats do.
     */ public supportsSetNotes ( ) { return false ; } param newNotes public setNotes ( newNotes ) { } /**
     * Copy source to target to use it as dummy translation.
     * Returns a changed copy of this trans unit.
     * receiver is not changed.
     * (internal usage only, a client should call importNewTransUnit on ITranslationMessageFile)
     * In xmb there is nothing to do, because there is only a target, no source.
     */ public cloneWithSourceAsTarget ( isDefaultLang , copyContent , targetFile ) { return this ; } /**
     * Copy source to target to use it as dummy translation.
     * (internal usage only, a client should call createTranslationFileForLang on ITranslationMessageFile)
     */ public useSourceAsTarget ( isDefaultLang , copyContent ) { } param translation protected translateNative ( translation ) { throw new Error ( 'You cannot translate xmb files, use xtb instead.' ) ; } }