Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Added new pseudocode for tag replacement

...

 !!!CONSIDER THAT WE SHOULD HAVE IN SOURCE SEGMENT ONLY 3 TYPES OF TAGS - PH_ELEMENT, BPT_ELEMENT and EPT_ELEMENT, because all of them was regenerated with their attributes at import stage
    At this point we read the source and target segments "as is", without any tag replacement in lists. so original_id would be id, that was generated_id at import stage. 
        
        SOURCE_SEGMENT{            
            <ph x="1" />{  
                search for matching tag in saved tags: 
                    looking in REQUEST_TAGS in REVERSE for matchingTag which have  
                                                                          matchingTag.generated_tagType == PH_ELEMENT //or our_tag.original_tagType
                                                                      AND matchingTag.generated_id  ==   our_tag.original_id
                                                                    ]
                if found
                    set our_tag.generated_tagType = matchingTag.original_tagType
                    set our_tag.generated_id = matchingTag.original_id
                    use that that data to generate tag like <our_tag.generated_tagType id="{our_tag.generated_id}" />                 
                else 
                    maybe just return <x/> tag? 
                        
                   save tag in SOURCE_TAGS
                
            }
            
            <bpt i="1" x="2"/> {
                search for matching tag in saved tags: 
                    looking in REQUEST_TAGS in REVERSE for matchingTag which have  
                                                                    [        matchingTag.generated_tagType == BPT_ELEMENT //or our_tag.original_tagType
                                                                      AND  matchingTag.generated_id  ==   our_tag.original_id
                                                                    ]
                if found
                    set our_tag.generated_tagType = matchingTag.original_tagType
                    set our_tag.generated_id = matchingTag.original_id
                    set our_tag.generated_i  = matchingTag.original_i
                    
                    if matchingTag.original_tagType == BX_ELEMENT // do BX_ELEMENT always have id and rid attributes provided?
                        use that that data to generate tag like <our_tag.generated_tagType id="{our_tag.generated_id}" rid="{our_tag.generated_id}" />
                    else: 
                        [rid="{our_tag.generated_id}"] - means optional, so for example if it's bigger than 0, then we should add this attribute
                        use that that data to generate tag like <our_tag.generated_tagType [id="{our_tag.generated_id}"] [rid="{our_tag.generated_id}"] >
                else 
                    maybe just return <bx/> tag? 
                        
                 save tag in SOURCE_TAGS              
            }
            
            <ept i="1" /> {
                search for matching tag in saved tags: 
                    looking in REQUEST_TAGS in REVERSE for matchingTag which have  
                                                                    [        matchingTag.generated_tagType == EPT_ELEMENT //or our_tag.original_tagType
                                                                      AND  matchingTag.generated_id  ==   our_tag.original_id  // id should hold information about paired BPT_ELEMENT, or it's absence
                                                                    ]
                if found
                    set our_tag.generated_tagType = matchingTag.original_tagType
                    set our_tag.generated_id = matchingTag.original_id
                    set our_tag.generated_i  = matchingTag.original_i
                    use that that data to generate tag like <our_tag.generated_tagType id="{our_tag.generated_id}" rid="{our_tag.generated_id}" />
                    
                    if matchingTag.original_tagType == EX_ELEMENT // do EX_ELEMENT always have id and rid attributes provided?
                        use that that data to generate tag like <our_tag.generated_tagType id="{our_tag.generated_id}" rid="{our_tag.generated_id}" />
                    else: 
                        [rid="{our_tag.generated_id}"] - means optional, so for example if it's bigger than 0, then we should add this attribute
                        use that that data to generate tag like </our_tag.generated_tagType>    
                else 
                    maybe just return <ex/> tag? or add some specific attributes?
                        
                 save tag in SOURCE_TAGS    
            }  
        }   

}                 

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////NEW PSEUDO CODE//////////////////////////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////

Tag replacement feature implementation is splited into 2 functions: 
GenerateReplacingTag -     input  - tagType, attributeList
                        output - tagInfo
    this function would generate tagInfo data structure that saves original data(tagType, attributes(i\rid and x\id only) and would generate new data that suits context\segment 
PrintTag - input  - tagInfo
         - output - text representation of tag with attributes depending on context 
    this function would print tag with attributes(if they exist(bigger than 0). If it's fuzzy call, would replace for source and target segments tags with matching tags from request. 
        If matching tag not found - would generate new tag in xliff format with id or rid attributes that rising starting from biggest id and rid values +1 that was present in requested segment 
        for request segment this function would pring tag with generated data - that is never used in production, but can be used to find out how mechanism normalized input request segment
            (we base tag matching on this normalization.)

////////////////////////////////////
   
struct TagInfo
 {
    bool fPairTagClosed = true;           // false for bpt tag - waiting for matching ept tag. If we'll find matching tag -> we'll set this to true 
    bool fTagAlreadyUsedInTarget = false; // would be set to true if we would already use this tag as matching for target

    // this we generate to save in TM. this would be saved as <{generated_tagType} [x={generated_id}] [i={generated_i}]/>. 
    // we would skip x attribute for generated_tagType=EPT_ELEMENT and i for generated_tagType=PH_ELEMENT
    int generated_i = -1;                 // for pair tags - generated identifier to find matching tag. the same as in original_i if it's not binded to other tag in segment
    int generated_id = -1;                 // id of tag. should match original_id, if it's not occupied by other tags
    TagType generated_tagType = UNKNOWN_ELEMENT; // replaced tagType, could be only PH_ELEMENT, BPT_ELEMENT, EPT_ELEMENT  

    // this cant be generated, only saved from provided data 
    int original_i = -1;        // original paired tags i
    int original_id = -1;        // original id of tag
    TagType original_tagType = UNKNOWN_ELEMENT;  // original tagType, could be any tag
  };
}

TagType could be one of the values in enum:

  BPT_ELEMENT EPT_ELEMENT G_ELEMENT  HI_ELEMENT SUB_ELEMENT BX_ELEMENT  EX_ELEMENT
  //standalone tags 
  BEGIN_STANDALONE_TAGS PH_ELEMENT  X_ELEMENT  IT_ELEMENT  UT_ELEMENT
]

We make normalization process to tags which means to replace original xliff\tmx tags\attributes with only 3 tags:
    <ph x='1' />
    <bpt x='2' i='1' />
    <ept i='1' /> 
which means that we would regenerate id\x in source, target and request segments to make them unified

for source\target segments this replacement is done at import process, for request we do tag replacement, then look for matches between source 
    and request segments(this happens in PringTag function), then replace tag from source with original tag that was in request
then we do the same with target segment - we try to find matches of target tags with generated tags in request, and then replace tags in target 
    with original tags from request 
    
for example, we have this segments in import process 
    'source':"Select the <hi>net<ph/>work <g>BLK360</g> tag </hi>",
    'target':"Select the <hi>net<ph/>work <g>BLK360</g> tag </hi>",
after tag replacement we would have this saved in tm:
    'source' :'Select the <bpt x="1" i="1"/>net<ph x="2"/>work <bpt x="3" i="2"/>BLK360<ept i="2"/> tag <ept i="1"/>',
    'target' :'Select the <bpt x="1" i="1"/>net<ph x="2"/>work <bpt x="3" i="2"/>BLK360<ept i="2"/> tag <ept i="1"/>',

then if we would have fuzzy request call with segment:    
    "Select the <g>net<x/>work< <g>BLK360</g> tag </g>"
after normalization we would get this:
    "Select the <bpt x="1" i="1"/>net<ph x="2"/>work <bpt x="3" i="2"/>BLK360<ept i="2"/> tag <ept i="1"/>"

and then we would try to find matching tags in source and normalized request segments and in case of match-replace tag in src with original from request
and then do the same with target and request 
in responce we should have:
'source' :'Select the <g>net<x/>work <g>BLK360</q> tag </g>',
 'target' :'Select the <g>net<x/>work <g>BLK360</q> tag </g>',


////////////////////////////TagReplacer class//////////////////////

tag normalization statements: 
- all single tags we understand as ph_tag that have only x attribute, and looks like this: "<ph x="1"/>"
- all opening pair tags we understand as bpt_tag that always have both i and x attributes, and looks like this: "<bpt x="1" i="1"/>"
- all closing pair tags we understand as ept_tag that always have only i attribute looks like this: "<ept i="1"/>"
- we ignore/skip context within <bpt> and </bpt> and replace this with single <bpt/> type tag, same is true for <ph/> and <ept/> 
- as id we understand one of following attributes(which is present in original tag) : 'x', 'id' 
- as i  we understand one of following attributes(which is present in original tag) : 'i', 'rid' 

TagReplacer{
      // lists of tagInfo 
      SOURCE_TAGS
      TARGET_TAGS
      REQUEST_TAGS
      
      activeSegment  //could be one of following SOURCE_SEGMENT(default value), TARGET_SEGMENT, REQUEST_SEGMENT. Say us how we should handle tag replacement
      
      iHighestI   = 0;               // increments with each opening pair tags
      iHighestId  = 0;               // increments with each tag
      
      fFuzzyRequest = false;         // flag, that tracks if we are dealing with import or fuzzy request. Say us how we should handle tag replacement

      //to track id and i attributes in request and then generate new values for tags in srt and trg that is not matching
      iHighestRequestsOriginalI  = 0; // during saving original data of tags in request segment we save here biggest original I and Id, 
      iHighestRequestsOriginalId = 0; //     and in case if we couldn't find match in source segment, we would generate xliff tag([bx, ex ,x] or can we left [bpt, ept, ph]?) 
      // with using and incrementing this values 

      //functions 
      // during parsing of tags by xercesc we call this function to
      // - collect and save original tagType and attributes(only 'id' and 'i')
      // - generate normalized tag data 
      // - find matches between TARGET and SOURCE segment tags. If we have match - use generated data from SOURCE, if not - generate new unique data
      // - save generated tags in lists depends on activeSegment value
      // - returns tagInfo data structure 
      GenerateReplacingTag(tagType, attributes); 
      
      //accepts tagInfo data
      //depending on fFuzzyRequest and activeSegment values just prints generated normalized tags with generated attributes
      //    or try to find match for tag from SOURCE\TARGET to REQUEST and print matching tag from REQUEST, or, if no matched, generate new xliff tag with unique attributes   
      PrintTag(tagInfo);
};    


TagInfo{
      fPairedTagClosed = false;        // flag, set to false for bpt/ept tag - waiting for matching ept/bpt tag 
      fTagAlreadyUsedInTarget = false; // flag, that we use only when we save tags from source segment and then try to match\bind them in target

      generated_i = 0;                 // for pair tags - generated identifier to find matching tag. the same as in original_i if it's not binded to other tag in segment
      generated_id = 0;                 // id of tag. should match original_id, if it's not occupied by other tags
      generated_tagType = UNKNOWN_ELEMENT;           // replaced tagType, could be PH_ELEMENT, BPT_ELEMENT, EPT_ELEMENT  

      original_i = 0;        // original paired tags i
      original_id = 0;        // original id of tag
      original_tagType;  // original tagType
  };


//////////////////////////////////////////////////

GenerateReplacingTag{
     
     SOURCE_SEGMENT/REQUEST_SEGMENT 
     //we handle SOURCE and REQUEST segments here the same way, but we 
     // use variables activeTagList, that should point to SOURCE_TAGS or REQUEST_TAGS
     // to make code more generic
     {            
            <single tags> -> would be saved as <ph>{ // for ph and all single tags 
                if(type == "lb"){
                    replace with newline
                }else{
                    save original_tagType        
                    save original_id if provided
                    
                    if it's REQUEST_SEGMENT AND original_id > iHighestRequestsOriginalId
                        save original_id as new iHighestRequestsOriginalId
                    
                    set  generated_tagType to PH_ELEMENT
                    set fPairedTagClosed to true 
                    generate generated_id incrementally ( increment iHighestId value, then use it ) 
            
                    save tag to activeTagList // SOURCE_TAGS or REQUEST_TAGS
                }
            }
            
            <opening pair tags> -> would be saved as <bpt>{               
                save original_i  if provided
                save original_id if provided
                save original_tagType 
                set  generated_tagType to BPT_ELEMENT
                
                //save biggest id and i attributes in request original data to generate new values
                // that wouldn't overlap with other tags in case we wouldn't have matches
                if it's REQUEST_SEGMENT AND original_i > iHighestRequestsOriginalI
                    save original_i as new iHighestRequestsOriginalI
                    
                if it's REQUEST_SEGMENT AND original_id > iHighestRequestsOriginalId
                    save original_id as new iHighestRequestsOriginalId
                
                originalTagTypeToFind = UNKNOWN_ELEMENT // use this variable to identify which tag type we are looking for
                
                if generated_tagType is BPT_ELEMENT
                    set originalTagTypeToFind to EPT_ELEMENT
                else if generated_tagType is BX_ELEMENT
                    set originalTagTypeToFind to EX_ELEMENT
                else
                    skip search, because other tags could never have wrong order between opening and closing tags
                    that would be error in <xml> and parser would throw INVALID_XML error then 
                
                if originalTagTypeToFind is not UNKNOWN_ELEMENT
                    try to find matching ept tag in this segment
                        looking in REVERSE order in activeTagList for matchingTag which have  [ 
                                                              matchingTag.fPairTagClosed    == false
                                                          AND matchingTag.generated_tagType == EPT_ELEMENT         //all CLOSING PAIR TAGs always has BPT_ELEMENT here
                                                          AND matchingTag.original_tagType  == originalTagTypeToFind
                                                          AND matchingTag.original_i        == our_bpt_tag.original_i
                                                        ]
                    
                
                
                if mathingTag found
                    set generated_i to    mathingTag.generated_i
                    set generated_id to  -mathingTag.generated_id // EPT_TAGS have negative id's/x's that is equal to matching -bpt.x
                                                                  // if there are no matching bpt, ept have unique, but still negative value.
                                                                  // negative values and 0 would never be printed in PrintTag
                    set fPairTagClosed to true 
                    set matchingTag.fPairTagClosed to true
                else
                    generate generated_i  incrementally ( increment iHighestI  value, then use it ) 
                    generate generated_id incrementally ( increment iHighestId value, then use it ) 
                    set  fPairTagClosed to false; // it would be set to true if we would use this tag as matching
                
                save tag to activeTagList        
            }
            
            <closing pair tags> -> would be saved as <ept>{
                save original_i  if provided
                save original_id if provided
                save original_tagType 
                set  generated_tagType to EPT_ELEMENT
                
                //save biggest id and i attributes in request original data to generate new values
                // that wouldn't overlap with other tags in case we wouldn't have matches
                if it's REQUEST_SEGMENT AND original_i > iHighestRequestsOriginalI
                    save original_i as new iHighestRequestsOriginalI
                    
                if it's REQUEST_SEGMENT AND original_id > iHighestRequestsOriginalId
                    save original_id as new iHighestRequestsOriginalId
                
                originalTagTypeToFind = UNKNOWN_ELEMENT // use this variable to identify which tag type we are looking for
                
                
                if generated_tagType is EPT_ELEMENT
                    set originalTagTypeToFind to BPT_ELEMENT
                else if generated_tagType is EX_ELEMENT
                    set originalTagTypeToFind to BX_ELEMENT
                else
                    skip search, because other tags could never have wrong order between opening and closing tags
                    that would be error in <xml> and parser would throw INVALID_XML error then 
                
                
                
                
                if originalTagTypeToFind is not UNKNOWN_ELEMENT
                    try to find matching ept tag in this segment
                        looking in REVERSE order in activeTagList for matchingTag which have  [ 
                                                              matchingTag.fPairTagClosed    == false
                                                          AND matchingTag.generated_tagType == BPT_ELEMENT         //all CLOSING PAIR TAGs always has BPT_ELEMENT here
                                                          AND matchingTag.original_tagType  == originalTagTypeToFind
                                                          AND matchingTag.original_i        == our_ept_tag.original_i
                                                        ]
                    
                
                
                if mathingTag found
                    set generated_i to    mathingTag.generated_i
                    set generated_id to  -mathingTag.generated_id // EPT_TAGS have negative id's/x's that is equal to matching -bpt.x
                                                                  // if there are no matching bpt, ept have unique, but still negative value.
                                                                  // negative values and 0 would never be printed in PrintTag
                    set fPairTagClosed to true 
                    set matchingTag.fPairTagClosed to true
                else
                    generate generated_i  incrementally ( increment iHighestI  value, then use it ) 
                    generate generated_id incrementally ( increment iHighestId value, then  multiply it by *(-1) and use it ) 
                    set  fPairTagClosed to false; // it would be set to true if we would use this tag as matching
                
                save tag to activeTagList        
            }
     }
    
    TARGET_SEGMENT
    //here we try to find connections from original Target tags to original Source tags and use data, 
    //   that was generated for matching SOURCE tag. If there are no matching SOURCE tag - generate new unique attributes  
    {
        save original_tagType
        save original_id if provided
        save original_i  if provided
        set  generated_tagType to    - PH_ELEMENT if we have single tag
                                     - BPT_ELEMENT if we have opening pair tag 
                                     - EPT_ELEMENT if we have closing pair tag 
        
        
        try to find matching source tag
            looking in SOURCE_TAGS for matchingSourceTag which have  [ 
                                                  matchingSourceTag.fAlreadyUsedInTarget    == false
                                              AND matchingSourceTag.original_tagType  == our_tag.original_tagType
                                              AND matchingSourceTag.original_id        == our_tag.original_id
                                            ]
        if found:
            set generated_i  to   matchingSourceTag.generated_i
            set generated_id to  matchingSourceTag.generated_id 
             // maybe we should add here search for matching ept\bpt tag in TARGET_TAGS, to set valid fPairTagClosed for both
            set matchingSourceTag.fAlreadyUsedInTarget to true
        else
            if generated_tagType is PH_ELEMENT
                set fPairTagClosed = true 
            else
                use matchingTagOriginalType and matchingTagGeneratedType to find matching tag in TARGET_TAGS
                    if original_tagType is BPT_ELEMENT
                        set matchingTagOriginalType to EPT_ELEMENT
                        
                    else if generated_tagType is BX_ELEMENT
                        set matchingTagOriginalType to EX_ELEMENT
                        
                    else if original_tagType is EPT_ELEMENT
                        set matchingTagOriginalType to BPT_ELEMENT
                        
                    else if generated_tagType is EX_ELEMENT
                        set matchingTagOriginalType to BX_ELEMENT
                        
                    else
                        matchingTagOriginalType = original_tagType
                    
                    if our_tag.generated_tagType = BPT_ELEMENT
                        set matchingTagGeneratedType to EPT_ELEMENT
                    else 
                        set matchingTagGeneratedType to BPT_ELEMENT
                
                try to find matching pair tag in this segment
                        looking in REVERSE order in TARGET for matchingPairTag which have  [ 
                                                              matchingPairTag.fPairTagClosed    == false
                                                          AND matchingPairTag.original_tagType  == matchingTagOriginalType
                                                          AND matchingPairTag.generated_tagType == matchingTagGeneratedType
                                                          AND matchingPairTag.original_i        == our_tag.original_i
                                                        ]
                if found: 
                    set generated_i to    mathingTag.generated_i
                    set generated_id to  -mathingTag.generated_id // EPT_TAGS have negative id's/x's that is equal to matching -bpt.x
                                                                  // if there are no matching bpt, ept have unique, but still negative value.
                                                                  // negative values and 0 would never be printed in PrintTag
                    set fPairTagClosed to true 
                    set matchingPairTag.fPairTagClosed to true                
                else:
                    if we dealing with pair tags -> generate generated_i  incrementally ( increment iHighestI value, then use it ) 
                    generate generated_id incrementally ( increment iHighestId value, then  multiply it by *(-1) and use it ) 
                    set  fPairTagClosed to false; // it would be set to true if we would use this tag as matching                
        
        save tag in TARGET_TAGS
    }    

}


PrintTag{
    variables: idToPrint = 0, 
                iToPrint = 0, 
                tagTypeToPrint = tag.generated_tagType                
    flags: fClosedTag = true;   //for slash at the end of tags like <ph/>
           fClosingTag = false; //for slash at the beginning of tag like </g>
    
    if it's REQUEST_SEGMENT
        // we need this only to track how tag replacement normalized tags in request segment
        idToPrint = tag.generated_id
         iToPrint = tag.generated_i
    else
        try to find matching request tag
            looking in SOURCE_TAGS for matchingRequestTag which have  [ 
                                                  matchingRequestTag.generated_id                == our_tag.generated_i
                                              AND matchingRequestTag.generated_tagType        == our_tag.generated_tagType
                                            ]
        if found:
            set  idToPrint to      matchingRequestTag.original_id
            set   iToPrint to      matchingRequestTag.original_i
            set  tagTypeToPrint to matchingRequestTag.original_tagType
            set fClosingTag to     tag.generated_tagType == EPT_ELEMENT 
                                   AND tagTypeToPrint != EPT_ELEMENT 
                                   AND tagTypeToPrint != EX_ELEMENT

        else
            //generate new id and i
            generate idToPrint using iHighestRequestsOriginalId incrementally ( increment incrementally value and use it ) 
            if generated_tagType is not PH_ELEMENT
                //could be improved here if we need 
                generate iToPrint using iHighestRequestsOriginalI incrementally ( increment incrementally value and use it ) 
        
    
    if fClosingTag is true
        return ["</" + tagTypeToPrint + ">"]
    else
        output = ["<" + tagTypeToPrint]
        if idToPrint > 0 
            if fFuzzyRequest is true:
                append to output [' id="' + idToPrint + '"'] 
            else 
                append to output [' x="' + idToPrint + '"'] 
        
        if idToPrint > 0 
            if fFuzzyRequest is true:
                append to output [' rid="' + iToPrint + '"'] 
            else 
                append to output [' i="' + iToPrint + '"'] 
            
        //tag that has slash at the end looks like this: <tag />
        fClosedTag   =  tagTypeToPrint == BPT_ELEMENT OR
                        tagTypeToPrint == EPT_ELEMENT OR
                        tagTypeToPrint ==  PH_ELEMENT OR
                        tagTypeToPrint ==  BX_ELEMENT OR
                        tagTypeToPrint ==  EX_ELEMENT OR
                        tagTypeToPrint ==   X_ELEMENT ; //  other tags could be only not closed(<g>) or closing(</g>) 
                        
        if fClosedTag is true
            append to output "/"
        append to output ">"
        return output
}


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////





Previous documentation:

Code Block
languagejs
titleResponse
collapsetrue
http://opentm2/translationmemory/
POST - creating a new or importing an existing filebased binary OpenTM2 TM

The Parameter „name“ contains the TM Name as a string. The string has a maxlength of 256 chars. It can contain any characters except the characters backslash (\), slash(/), colon (:), question mark (?), asterisk (*), vertical line (|), less than sign (<), and greater than sign (>).

Uploading a file is optional, omitting a file means creating a empty TM only.

If an empty TM is created, the POST request contains only the JSON structure with the TM Name.

If an existing binary OpenTM2 file should be additionally imported to the new TM, the POST must be encoded as multipart/form-data.

The JSON structure with the meta data will then be in the first chunk of the multiparted request, the chunk must be named “meta”.

The second chunk contains the plain binary file content and must be named “data”. This binary data contains the TM content

The resulting body contains the name of the TM, as given in the POST request.




To OpenTM2 – without data / creating an empty TM:

{
sourceLang: “en”, // the source language is required for a new TM
name: „TM Name“,
[loggingThreshold:"2"]
}



Raw POST to OpenTM2 – with provided import file:

POST http://opentm2/translationmemory HTTP/1.1
Content-Type: multipart/form-data; boundary="autogenerated"

-- autogenerated
Content-Type: application/json; charset=utf-8
Content-Disposition: form-data; name=meta

{"name":"TM Name", sourceLang:"en"}

--autogenerated
Content-Type: image/jpeg
Content-Disposition: form-data; name=data; filename=Original Filename.jpg
...TM content ...
--autogenerated--





In both cases from OpenTM2 - HTTP 200 OK:

{

name: „TM Name“

}

Errors:
400 Bad Request – if parameters are missing or are not well formed.
409 Conflict – if a memory with the given name already exists.
500 Server Error – for other technical problems.
http://opentm2/translationmemory/[TM_Name]/import
POST import a TMX file into an existing OpenTM2 TM

To OpenTM2:

multipart/form-data like on POST above, expect that no separate JSON section is needed here.

Call answers directly after the upload is done, but before the import starts with HTTP 201 – this means: Import is created and will be started now.

From OpenTM2 - HTTP 201 OK:

{ // empty JSON object, since no data expected as result here!

}

Errors:
400 Bad Request – if parameters are missing or are not well formed.
404 Not Found – if the memory of the given name does not exist
500 Server Error – for other technical problems.
http://opentm2/translationmemory/[TM_Name]/status
GET status of a TM

To OpenTM2:

multipart/form-data like on POST above, expect that no separate JSON section is needed here.

From OpenTM2 - HTTP 200 OK:

{

‘status’:’import’ //allowed status values: import, available, error

}

Errors:
400 Bad Request – if parameters are missing or are not well formed.
404 Not Found – if the memory of the given name does not exist
500 Server Error – for other technical problems.
http://opentm2/translationmemory/
GET – retrieving a list of available TM Files

To OpenTM2: -

From OpenTM2 - HTTP 200 OK:

[{

name: 'my nice TM'

}]

Errors:
500 Server Error – for other technical problems.
http://opentm2/translationmemory/[TM_Name]/
TM_Name is URL-encoded
GET – retrieving a single TM File

To OpenTM2: -

From OpenTM2 - HTTP 200 OK:

Same as POST from OpenTM2 result.

Errors:
404 Not Found – if TM file to given [TMID] in URL was not found
500 Server Error – for other technical problems.
DELETE – deletes an existing TM File

Adressed by the given URL, no body needed.

Errors:
404 Not Found – if TM file to given [TMID] in URL was not found
500 Server Error – for other technical problems.
PUT – updating an existing TM File in one request

Currently not needed, would be only to change the TM name

GET – list of all segments from TM

Currently not needed.




http://opentm2/translationmemory/[TM_Name]/entry/
POST – creates a new entry or updates target entry if match pair already exists

This method updates an existing proposal when a proposal with the same key information (source text, language, segment number, and document name) exists.

Parameters sourceLang and targetLang are containing the languages as RFC5646.

Parameters source and target are containing the entry contents to be stored. Format? plain string?

Attribute Parameters:

documentName: contains the filename where the segment resides in Translate5.
context: evaluates to Translate5 segment mid.
markupTable: OpenTM2 gets a new markup table named „translate5“, so this is the value which is delivered by Translate5.
timestamp: this parameter is not set by translate5, but calculated automatically and delivered from OpenTM2 to translate5.
author: contains the named user which provides the update / new entry
In addition there are the following OpenTM2 Attributes currently not used by translate5:
segmentNumber
additional info
type

To OpenTM2:

{

sourceLang: 'de',

targetLang: 'en',

source: „Das ist das Haus des Nikolaus“,

target: „This is the house of St. Nicholas“,

documentName: 'my file.sdlxliff',

segmentNumber: ,

markupTable: 'translate5',

author: „Thomas Lauria“,

type: '',

timeStamp: '',

context: '123',

addInfo: '',

[loggingThreshold:"2"]

}

The result from the server contains the same data as posted to the server. No additonal ID is added, since the entries are identified by the whole source string instead by an ID, only the timestamp is added.

From OpenTM2 – HTTP 200 OK:

{

sourceLang: 'de',

targetLang: 'en',

source: „Das ist das Haus des Nikolaus“,

target: „This is the house of St. Nicholas“,

documentName: 'my file.sdlxliff',

segmentNumber: 123,

markupTable: 'translate5',

timestamp: '2015-05-12 13:46:12',

author: „Thomas Lauria“

}

Errors:
404 Not Found – if TM file to given [TM_Name] in URL was not found
500 Server Error – for other technical problems.
400 Bad Request – if JSON parameters are missing or are not well formed.





http://opentm2/translationmemory/[TM_Name]/fuzzysearch/
POST– Serves a memory lookup based on the provided search criteria

To OpenTM2:

{

sourceLang: 'de',

targetLang: 'en-US',

source: „Das ist das Haus des Nikolaus“,

documentName: 'my file.sdlxliff', // can be empty

segmentNumber: 123, // can be empty

markupTable: 'translate5', // can be empty

context: „xyz“, // can be empty

[loggingThreshold:"2"]

}

From OpenTM2 HTTP 200 OK:

{

'NumOfFoundProposals': 2,

'results':

[{

source: „Das ist das Haus des Nikolaus“,

target: „This is the house of St. Nicholas“,

sourceLang: 'de', ← rfc5646

targetLang: 'en', ← rfc5646

matchRate: '100',

documentName: 'my file.sdlxliff',

DocumentShortName: 'shortnam.txt',

id: 'identifier',

type: 'Manual',

matchType: 'Exact',

segmentNumber: 123,

markupTable: 'XYZ',

timestamp: '2015-05-12 13:46:12',

author: „Thomas Lauria“.

context: '',

addInfo: ''

},{

source: „Das ist das Haus des Nikolaus“,

target: „This is the house of St. Nicholas“,

sourceLang: 'de', ← rfc5646

targetLang: 'en', ← rfc5646

matchRate: '100',

documentName: 'my file.sdlxliff',

DocumentShortName: 'shortnam.txt',

id: 'identifier',

type: 'Manual',

matchType: 'Exact',

segmentNumber: 123,

markupTable: 'XYZ',

timestamp: '2015-05-12 13:46:12',

author: „Thomas Lauria“.

context: '',

addInfo: ''

}]}

Errors:
400 Bad Request – if search, query or language parameters are missing or are not well formed.
404 Not Found – if TM file to given [TM_Name] in URL was not found
500 Server Error – for other technical problems.





http://opentm2/translationmemory/[TM_Name]/concordancesearch /?
POST – Performs a context search of the given search string in the proposals contained in a memory. Returns one proposal per request.









To OpenTM2:

{

searchString: 'Haus des Nikolaus',

searchType: 'source', // values can be source or target

searchPosition: 123// can be empty; Position where a search should start in the memory, see below


numResults: 1,

msSearchAfterNumResults: 100 //number of milliseconds the search will continue, after the first result is found. All additional results that are found in this additional time will also be returned until numResults is reached. If numResults is reached before msSearchAfterNumResults is reached, the search will abort. If msSearchAfterNumResults is reached before numResults is reached, search is also aborted. All found results are delivered in both cases.

[loggingThreshold:"2"]

}

From OpenTM2 HTTP 200 OK:

{

NewSearchPosition: '123:54', /returns NULL, if end of TM is reached, see below


results:[{

source: „Das ist das Haus des Nikolaus“,

target: „This is the house of St. Nicholas“,

sourceLang: 'de', ← rfc5646

targetLang: 'en', ← rfc5646

matchRate: '100',

documentName: 'my file.sdlxliff',

DocumentShortName: 'shortnam.txt',

id: 'identifier',

type: 'Manual',

matchType: 'Exact',

segmentNumber: 123,

markupTable: 'XYZ',

timestamp: '2015-05-12 13:46:12',

author: „Thomas Lauria“.

context: '',

addInfo: ''

},{

source: „Das ist das Haus des Nikolaus“,

target: „This is the house of St. Nicholas“,

sourceLang: 'de', ← rfc5646

targetLang: 'en', ← rfc5646

matchRate: '100',

documentName: 'my file.sdlxliff',

DocumentShortName: 'shortnam.txt',

id: 'identifier',

type: 'Manual',

matchType: 'Exact',

segmentNumber: 123,

markupTable: 'XYZ',

timestamp: '2015-05-12 13:46:12',

author: „Thomas Lauria“.

context: '',

addInfo: ''

}]}

Errors:
400 Bad Request – if search, query or language parameters are missing or are not well formed.
404 Not Found – if TM file to given [TM_Name] in URL was not found
500 Server Error – for other technical problems.                  


...