icSourceFile | input | character | Name of the resource file (with full path) |
icLanguage | input | character | The language code |
olUpdatesDone | output | logical | Parameter indicating whether the load of the resource file changed anything in the internal translated strings. The value will be false if the internal translated strings are the same as the ones that are in the resource file. |
oiReturnStatus | output | integer | Return status of the method. |
assign olUpdatesDone = false vhTargetProcedure = {&TARGETPROCEDURE} icSourceFile = lc(icSourceFile) vcSourceFile = search(icSourceFile) vcLanguageToLoad = icLanguage. /* First check the existence of the file to load */ if vcSourceFile = ? then do : <M-6 run SetMessage (input 'Could not load the resource file ($1).':U (icMessage), input icSourceFile (icArguments), input '' (icFieldName), input '' (icFieldValue), input 'E':U (icType), input 1 (iiSeverity), input '' (icRowid), input 'BLF-104':U (icFcMsgNumber), input '' (icFcExplanation), input '' (icFcIdentification), input '' (icFcContext), output viFcReturnSuper (oiReturnStatus)) in BFcTranslation> assign oiReturnStatus = -3. return. end. vcFreeform = "for each fcTranslation where ":U + "fcTranslation.TranslationProjShortCode = '":U + vcProjectCode + "' and fcTranslation.TranslationLanguageCode = '":U + icLanguage + "'":U. <M-8 run DataLoad (input '' (icRowids), input '' (icPkeys), input '' (icObjectIds), input vcFreeform (icFreeform), input no (ilKeepPrevious), output viFcReturnSuper (oiReturnStatus)) in BFcTranslation> if viFcReturnSuper = -4 then viFcReturnSuper = 0. if viFcReturnSuper <> 0 then oiReturnStatus = viFcReturnSuper. if viFcReturnSuper < 0 then return. /* Copy data into an indexed temp-table to allow performant retrieval */ empty temp-table tfcTranslationCopy. for each tfcTranslation on error undo, throw: create tfcTranslationCopy. assign tfcTranslationCopy.tcTranslationLanguageCode = tfcTranslation.TranslationLanguageCode tfcTranslationCopy.tcTranslationProjShortCode = tfcTranslation.TranslationProjShortCode tfcTranslationCopy.tiTranslationStringNumber = tfcTranslation.TranslationStringNumber tfcTranslationCopy.tcTranslationStringText = tfcTranslation.TranslationStringText tfcTranslationCopy.tcBusinessClass = tfcTranslation.BusinessClass tfcTranslationCopy.tcClassTempTableRowId = tfcTranslation.tc_Rowid. end. viParseReturnStatus = 0. vlTruncated = false. CREATE SAX-READER vhSaxParser in widget-pool "non-persistent". vhSaxParser:VALIDATION-ENABLED = FALSE. vhSaxParser:HANDLER = THIS-PROCEDURE. vhSaxParser:SET-INPUT-SOURCE( "FILE":U, vcSourceFile ). vhSaxParser:SAX-PARSE no-error. if error-status:error then do : assign vcMessage = "Error in SAX parser.":U + chr(10) + error-status:get-message(1) + chr(10) + error-status:get-message(2) + chr(10) + error-status:get-message(3) oiReturnStatus = -3. <M-5 run SetMessage (input vcMessage (icMessage), input '' (icArguments), input '' (icFieldName), input '' (icFieldValue), input 'S':U (icType), input 2 (iiSeverity), input '' (icRowid), input 'BLF-103':U (icFcMsgNumber), input '' (icFcExplanation), input '' (icFcIdentification), input '' (icFcContext), output viFcReturnSuper (oiReturnStatus)) in BFcTranslation> DELETE OBJECT vhSaxParser. return. end. DELETE OBJECT vhSaxParser. ASSIGN vhSaxParser = ?. if viParseReturnStatus <> 0 then oiReturnStatus = viParseReturnStatus. if viParseReturnStatus < 0 then return. /* Second: check whether there are custom translations. If so, try to load them */ assign vcSourceFile = icSourceFile entry(1,vcSourceFile,".":U) = entry(1,vcSourceFile,".":U) + "cust":U vcSourceFile = search(vcSourceFile). if vcSourceFile <> ? then do : CREATE SAX-READER vhSaxParser in widget-pool "non-persistent". vhSaxParser:VALIDATION-ENABLED = FALSE. vhSaxParser:HANDLER = THIS-PROCEDURE. vhSaxParser:SET-INPUT-SOURCE( "FILE":U, vcSourceFile ). vhSaxParser:SAX-PARSE no-error. if error-status:error then do : assign vcMessage = "Error in SAX parser.":U + chr(10) + error-status:get-message(1) + chr(10) + error-status:get-message(2) + chr(10) + error-status:get-message(3) oiReturnStatus = -3. <M-7 run SetMessage (input vcMessage (icMessage), input '' (icArguments), input '' (icFieldName), input '' (icFieldValue), input 'S':U (icType), input 2 (iiSeverity), input '' (icRowid), input 'BLF-105':U (icFcMsgNumber), input '' (icFcExplanation), input '' (icFcIdentification), input '' (icFcContext), output viFcReturnSuper (oiReturnStatus)) in BFcTranslation> DELETE OBJECT vhSaxParser. return. end. DELETE OBJECT vhSaxParser. ASSIGN vhSaxParser = ?. end. if vlTruncated then do: oiReturnStatus = 1. <M-9 run SetMessage (input #T-24'Translations cannot be longer than 255 characters. Some translations were truncated.':255(846477648)T-24# (icMessage), input '' (icArguments), input '' (icFieldName), input '' (icFieldValue), input 'W' (icType), input 3 (iiSeverity), input '' (icRowid), input 'blf-152998':U (icFcMsgNumber), input '' (icFcExplanation), input '' (icFcIdentification), input 'language code = ' + icLanguage + chr(10) + 'resource file = ' + icSourceFile (icFcContext), output viFcReturnSuper (oiReturnStatus)) in BFcTranslation> end. /* Check the number of records in tFcTranslation. If there is one, the vlUpdatesDone flag needs to be set */ /* Make sure the update is done in batches of 1000, otherwise the server will stop with an error on the -L parameter */ do while can-find(first tfcTranslationCopy where tfcTranslationCopy.tcStatus > ""): assign vlFcDataValidated = yes viCnt = 0. for each tfcTranslationCopy where tfcTranslationCopy.tcStatus > "":U on error undo, throw: find tfcTranslation where tfcTranslation.tc_Rowid = tfcTranslationCopy.tcClassTempTableRowId. assign tfcTranslation.TranslationStringText = tfcTranslationCopy.tcTranslationStringText tfcTranslation.BusinessClass = tfcTranslationCopy.tcBusinessClass tfcTranslation.tc_Status = tfcTranslationCopy.tcStatus. delete tfcTranslationCopy. assign viCnt = viCnt + 1. if viCnt > 1000 then leave. end. <M-3 run DataSave (output viFcReturnSuper (oiReturnStatus)) in BFcTranslation> if viFcReturnSuper <> 0 then oiReturnStatus = viFcReturnSuper. if viFcReturnSuper < 0 then return. assign olUpdatesDone = TRUE. end. assign vcProjectsLoaded = (if vcProjectsLoaded = "" then vcProjectCode else vcProjectsLoaded + ",":U + vcProjectCode). do viCnt = 1 to num-entries(vcProjectsToLoad): if lookup(ENTRY(viCnt,vcProjectsToLoad),vcProjectsLoaded) = 0 then do: assign vcProjectCode = entry(viCnt,vcProjectsToLoad). <M-4 run LoadResourceFile (input 'xml/':U + entry(viCnt,vcProjectsToLoad) + '.':U + vclanguageToLoad + '.resx':U (icSourceFile), input vcLanguageToLoad (icLanguage), output vlUpdatesDone (olUpdatesDone), output viFcReturnSuper (oiReturnStatus)) in BFcTranslation> if viFcReturnSuper <> 0 then oiReturnStatus = viFcReturnSuper. if viFcReturnSuper < 0 then return. if vlUpdatesDone then assign olUpdatesDone = true. END. end.