home *** CD-ROM | disk | FTP | other *** search
/ Aminet 10 / aminetcdnumber101996.iso / Aminet / util / rexx / ScionRexx.lha / Translate.rexx < prev   
OS/2 REXX Batch file  |  1995-10-31  |  14KB  |  415 lines

  1. /****************************************************************************
  2.  *                                                                          *
  3.  * $VER: Translate 1.36 (28 Oct 1995)
  4.  *                                                                          *
  5.  *                      Written by Freddy Ariës                             *
  6.  * Address: Lindeboomweg 7, NL-7135 KE Harreveld, The Netherlands.          *
  7.  *                                                                          *
  8.  * You may have noticed that setting another language in Locale means that  *
  9.  * the date (month) fields of your database are no longer recognized        *
  10.  * correctly. This is where Translate comes in.                             *
  11.  * It will convert all the standard language fields in a Scion database (in *
  12.  * v4.0+, that means the Date fields) into another (predefined) language.   *
  13.  * Currently Dutch, German, French, Italian, Norwegian, Swedish and Finnish *
  14.  * are supported, but only translation to and from English is possible.     *
  15.  * Adding other languages shouldn't be too hard.                            *
  16.  *                                                                          *
  17.  * This script uses (by default) the rexxreqtools.library (which requires   *
  18.  * a version of reqtools larger than 2.0 and rexxsyslib.library)            *
  19.  * If you do not have these, run SetDefaults.rexx to change the settings.   *
  20.  *                                                                          *
  21.  * DONE:                                                                    *
  22.  * - progress indicator, using rexxarplib.library                           *
  23.  *   (requested by Robbie Akins himself)                                    *
  24.  * - now uses preference file for default settings                          *
  25.  *                                                                          *
  26.  ****************************************************************************/
  27.  
  28. options results
  29. arg panum outval
  30.  
  31. versionstr = "1.36"
  32.  
  33. /* Don't change the settings here! Run SetDefaults.rexx instead! */
  34. usereq = 1; outp = 1; prgrs = 1; pgopen = 0
  35. PSCR = "SCIONGEN"
  36.  
  37. scrdev = stdout
  38. scrname = "CON:0//639//Scion Output/AUTO/SCREEN"
  39. NL = '0A'x
  40.  
  41. /* parse command line options, to allow calling the script automatically,
  42.  * eg. from a function key
  43.  */
  44.   
  45. do while panum = '?'
  46.   Tell("NUMOPT/N,QUIET/S,NOREQ/s: ")
  47.   pull panum outval
  48. end
  49.  
  50. /* read preferences file. */
  51.  
  52. if open(pfile, 'ENV:Scion/ScionRexx.prefs', 'r') then do
  53.   do while ~eof(pfile)
  54.     inln = readln(pfile)
  55.     if inln ~= "" then do
  56.       wstr = upper(word(inln, 1))
  57.       if wstr = "USEREQ" then
  58.         usereq = 1
  59.       else if wstr = "NOUSEREQ" then
  60.         usereq = 0
  61.       else if wstr = "PROGRESS" then
  62.         prgrs = 1
  63.       else if wstr = "NOPROGRESS" then
  64.         prgrs = 0
  65.       else if wstr = "PUBSCREEN" then
  66.         pscr = strip(delstr(inln, 1, length(wstr)), 'b', ' "')
  67.     end
  68.   end
  69.   close(pfile)
  70. end
  71.  
  72. if pscr = "" | (pscr ~= "WORKBENCH" & ~show('p', pscr)) then
  73.   pscr = "SCIONGEN"
  74. wstr = right(notesdir, 1)
  75. if wstr ~= '/' & wstr ~= ':' then notesdir = ""
  76. scrname = scrname||pscr
  77.  
  78. if panum ~= "" then do
  79.   if panum = "QUIET" then do
  80.     panum = ""; outval = "QUIET"
  81.     lang = 0
  82.   end
  83.   else if panum = "NOREQ" then do
  84.     panum = ""; outval = "NOREQ"
  85.     lang = 0
  86.   end
  87.   else do
  88.     pnum = C2D(upper(left(panum,1)))
  89.     if pnum >= 65 & pnum <= 90 then do
  90.       panum = pnum - 64
  91.       lang = CheckAnswer(panum)
  92.     end
  93.     else if pnum > 47 & pnum < 57 then
  94.       lang = CheckAnswer(panum)
  95.     else do
  96.       lang = 0; panum = ""
  97.     end
  98.   end
  99. end
  100. else
  101.   lang = 0
  102.  
  103. if outval = "QUIET" then do
  104.   outp = 0; usereq = 0; prgrs  0
  105. end
  106. else if outval = "NOREQ" then do
  107.   usereq = 0; prgrs = 0
  108. end
  109.  
  110. if usereq & ~show('l','rexxreqtools.library') then do
  111.   if exists('libs:rexxreqtools.library') then
  112.     call addlib('rexxreqtools.library',0,-30,0)
  113.   else do
  114.     usereq = 0; outp = 1
  115.     Tell("Unable to open rexxreqtools.library - using text output")
  116.   end
  117. end
  118.  
  119. if ~usereq then prgrs = 0
  120.  
  121. if prgrs & ~show('l','rexxarplib.library') then do
  122.   if exists('libs:rexxarplib.library') then
  123.     call addlib('rexxarplib.library',0,-30,0)
  124.   else
  125.     prgrs = 0
  126. end
  127.  
  128. screentofront(pscr)
  129.  
  130. /* Originally stolen from Peter Billing - thanks Peter ;-) */
  131. if ~show('P','SCIONGEN') then do
  132.   EndString('I am sorry to say that the SCION Genealogist' || NL ||,
  133.     'database is not available. Please start the' || NL ||,
  134.     'SCION program BEFORE using this script!')
  135. end
  136.  
  137. myport = "SCIONGEN"
  138. address value myport
  139. GETDBNAME
  140. dbname = upper(RESULT)
  141. GETPROGVERSION
  142. progvers = RESULT
  143.  
  144. if outp & ~usereq then do
  145.   if pscr ~= "WORKBENCH" then do
  146.     scrdev = 'SCNDSCSCR'
  147.     if ~open(scrdev, scrname, 'w') then scrdev = stdout
  148.   end
  149.   Tell("Translate - Scion Language Fields Converter "||versionstr||" by Freddy Ariës")
  150.   Tell("Database: "||dbname|| NL)
  151. end
  152.  
  153. if lang = 0 then do
  154.   if ~outp then
  155.     EndString("Missing required argument!")
  156.     /* even though you will never get to see the message... */
  157.   if usereq then do
  158.     answ = rtezrequest('Database: '||dbname || NL ||,
  159.       'Please select one of the following conversions: ' || NL || NL ||,
  160.       ' a) Nederlands -> English      i) Norsk    -> English' || NL ||,
  161.       ' b) English    -> Nederlands   j) English  -> Norsk' || NL ||,
  162.       ' c) Deutsch    -> English      k) Svenska  -> English' || NL ||,
  163.       ' d) English    -> Deutsch      l) English  -> Svenska' || NL ||,
  164.       ' e) Français   -> English      m) Suomi    -> English' || NL ||,
  165.       ' f) English    -> Français     n) English  -> Suomi' || NL ||,
  166.       ' g) Italiano   -> English' || NL ||,
  167.       ' h) English    -> Italiano     0) Abort' ||,
  168.       NL, '_a|_b|_c|_d|_e|_f|_g|_h|_i|_j|_k|_l|_m|_n|_0','Translate - Scion Language Field Converter '|| versionstr || ' by Freddy Ariës','rtez_flags=ezreqf_noreturnkey rt_pubscrname='||PSCR)
  169.   end
  170.   else if outp then do
  171.     Tell("Please select one of the following conversions: ")
  172.     Tell(" a) Nederlands -> English      i) Norsk    -> English")
  173.     Tell(" b) English    -> Nederlands   j) English  -> Norsk")
  174.     Tell(" c) Deutsch    -> English      k) Svenska  -> English")
  175.     Tell(" d) English    -> Deutsch      l) English  -> Svenska")
  176.     Tell(" e) Français   -> English      m) Suomo    -> English")
  177.     Tell(" f) English    -> Français     n) English  -> Suomi")
  178.     Tell(" g) Italiano   -> English")
  179.     Tell(" h) English    -> Italiano     0) Abort")
  180.     TellNN("Your choice: ")
  181.     answ = readln(scrdev)
  182.     answ = upper(left(answ,1))
  183.     pnum = C2D(answ)
  184.     if pnum >= 65 & pnum <= 90 then
  185.       answ = pnum - 64
  186.   end
  187.   lang = CheckAnswer(answ)
  188. end
  189.  
  190. if lang = 0 | answ = 0 then EXIT
  191.  
  192. if prgrs then do
  193.   Postmsg(10, 10, "Scion Translate (by Freddy Ariës)\Database: "||dbname||"\ \ ", PSCR)
  194.   pgopen = 1
  195. end
  196.  
  197. select
  198.   /* Make sure the string in datout is always <= the one in datin, or
  199.    * the resulting string might not fit in the date field anymore.
  200.    * Note: some 2-letter fields ('CA', 'VR', 'AV') can't follow this rule.
  201.    */
  202.   when lang = 1 then do
  203.     datin = "MRT MAA MEI OKT CA CA. CIRCA VR VR. VOOR NA"
  204.     datout= "Mar Mar May Oct Abt Abt About Bef Bef Bef Aft"
  205.   end
  206.   when lang = 2 then do
  207.     datin = "MAR MAY ABT ABOUT BEF BEFORE AFT AFTER"
  208.     datout= "Mrt Mei Ca Circa Vr Voor Na Na"
  209.   end
  210.   when lang = 3 then do
  211.       datin = "MÄR Mär MRZ MAI OKT DEZ CA CA. UNGEFÄHR UNGEFäHR VOR NAC NACH"
  212.       datout= "Mar Mar Mar May Oct Dec Abt Abt About About Bef Aft Aft"
  213.   end
  214.   when lang = 4 then do
  215.     datin = "MAR MAY OCT DEC ABT ABOUT BEF BEFORE AFT AFTER"
  216.     datout= "Mär Mai Okt Dez Ca Ca Vor Vor Nac Nach"
  217.   end
  218.   when lang = 5 then do
  219.     datin = "FEV FéV FÉV AVR MAI UIN UIL OUT OÛT OûT DéC DÉC ENV ENVIRON AV AVANT APR APRES APRèS APRÈS"
  220.     datout = "Feb Feb Feb Apr May Jun Jul Aug Aug Aug Dec Dec Abt About Bef Bef Aft After After After"
  221.   end
  222.   when lang = 6 then do
  223.     datin = "FEB APR MAY JUN JUL AUG DEC ABT ABOUT BEF BEFORE AFT AFTER"
  224.     datout= "Fév Avr Mai uin uil oût Déc Env Env Av Avant Apr Après"
  225.   end
  226.   when lang = 7 then do
  227.     datin = "GEN MAG GIU LUG AGO SET OTT DIC INTORNO AL CA. PRIMA PRI DOPO DOP"
  228.     datout = "Jan May Jun Jul Aug Sep Oct Dec About . Abt Bef Bef Aft Aft"
  229.   end
  230.   when lang = 8 then do
  231.     datin = "JAN MAY JUN JUL AUG SEP OCT DEC ABOUT ABT BEFORE BEF AFTER AFT"
  232.     datout= "Gen Mag Giu Lug Ago Set Ott Dic Ca. Ca. Prima Pri Dopo Dop"
  233.   end
  234.   when lang = 9 then do
  235.     datin = "MAI OKT DES OMKRING CA. FøR FØR ETTER ETT"
  236.     datout = "May Oct Dec About Abt Bef Bef After Aft"
  237.   end
  238.   when lang = 10 then do
  239.     datin = "MAY OCT DEC ABOUT ABT BEFORE BEF AFTER AFT"
  240.     datout= "Mai Okt Des Ca. Ca. Før Før Etter Ett"
  241.   end
  242.   when lang = 11 then do
  243.     datin = "MAJ OKT UNGEFäR UNGEFÄR CA. FöRE FÖRE F. EFTER EFT"
  244.     datout = "May Oct Dec About About Abt Bef Bef Bef After Aft"
  245.   end
  246.   when lang = 12 then do
  247.     datin = "MAY OCT ABOUT ABT BEFORE BEF AFTER AFT"
  248.     datout= "Maj Okt Ca. Ca. Före F. Efter Eft"
  249.   end
  250.   when lang = 13 then do
  251.     datin = "TAM HEL MAA HUH TOU KES HEI ELO SYY LOK MAR JOU NOIN N. ENNEN ENN JäLKEEN JÄLKEEN JäL JÄL"
  252.     datout = "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Abt Abt Bef Bef After After Aft Aft"
  253.   end
  254.   when lang = 14 then do
  255.     datin = "JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC ABOUT ABT BEFORE BEF AFTER AFT"
  256.     datout= "Tam Hel Maa Huh Tou Kes Hei Elo Syy Lok Mar Jou Noin n. Ennen Enn Jäl Jäl"
  257.   end
  258.   otherwise
  259.     EndString("Invalid option: "lang)
  260. end
  261.  
  262. if ~usereq then
  263.   Tell("Parsing Personal Details...")
  264. else if pgopen then
  265.   Postmsg(,, "\\Processing person:\", PSCR)
  266.  
  267. GETTOTALIRN
  268. TotalIRN = RESULT
  269. do i = 1 to TotalIRN
  270.   if pgopen then Postmsg(,,"\\\"||i||" (of "||TotalIRN||")", PSCR)
  271.   EXISTPERSON i
  272.   /* Skip deleted persons */
  273.   if RESULT = 'YES' then
  274.   do
  275.  
  276.     if progvers < 4 then do
  277.       /* Since V4, sex is a toggle gadget, and conversion is unnecessary */
  278.       GETSEX i
  279.       sx = ConvertSex(RESULT)
  280.       if sx ~= "" then PUTSEX i sx
  281.     end
  282.  
  283.     GETBIRTHDATE i
  284.     datestr = ParseDate(RESULT)
  285.     if datestr ~= "" then PUTBIRTHDATE i datestr
  286.     GETBAPTISMDATE i
  287.     datestr = ParseDate(RESULT)
  288.     if datestr ~= "" then PUTBAPTISMDATE i datestr
  289.     GETDEATHDATE i
  290.     datestr = ParseDate(RESULT)
  291.     if datestr ~= "" then PUTDEATHDATE i datestr
  292.     GETBURIALDATE i
  293.     datestr = ParseDate(RESULT)
  294.     if datestr ~= "" then PUTBURIALDATE i datestr
  295.   end
  296. end
  297. if ~usereq then do
  298.   Tell("Done ("||TotalIRN||" persons parsed).")
  299.  
  300.   /* Now the list of families... */
  301.   Tell("Parsing Family Details...")
  302. end
  303. else if pgopen then
  304.   Postmsg(,, "\\Processing family:\ ", PSCR)
  305.  
  306.   
  307. GETTOTALFGRN
  308. TotalFGRN = Result
  309. do i = 1 to TotalFGRN
  310.   if pgopen then Postmsg(,, "\\\"||i||" (of "||TotalFGRN||")", PSCR)
  311.   EXISTFAMILY i
  312.   /* Skip deleted families */
  313.   if RESULT = 'YES' then do
  314.     GETMARRYDATE i
  315.     datestr = ParseDate(RESULT)
  316.     if datestr ~= "" then PUTMARRYDATE i datestr
  317.     GETENGAGEDATE i
  318.     datestr = ParseDate(RESULT)
  319.     if datestr ~= "" then PUTENGAGEDATE i datestr
  320.     GETENDDATE i
  321.     datestr = ParseDate(RESULT)
  322.     if datestr ~= "" then PUTENDDATE i datestr
  323.   end
  324. end
  325.  
  326. if usereq then do
  327.   rtezrequest('Scion Translation is ready.' || NL || 'Parsed '||,
  328.     TotalIRN||' persons and '||TotalFGRN||' families.','_Ok','Translate Message:','rt_pubscrname = '||PSCR)
  329.   if pgopen then Postmsg()
  330. end
  331. else
  332.   EndString("Done ("||TotalFGRN||" families parsed)."||NL)
  333.  
  334. EXIT
  335.  
  336. CheckAnswer: PROCEDURE EXPOSE outp usereq pgopen scrdev pscr
  337. parse arg str
  338. if str < 0 | str > 14 then
  339.   EndString("Invalid option: "||str||" -- program terminated.")
  340. return str
  341.  
  342. ConvertSex: PROCEDURE EXPOSE lang
  343. parse arg sxstr
  344. if lang = '1' & sxstr = "V" then sxstr = "F"
  345. else if lang = '2' & sxstr = "F" then sxstr = "V"
  346. else if lang = '3' & sxstr = "W" then sxstr = "F"
  347. else if lang = '4' & sxstr = "F" then sxstr = "W"
  348. else if (lang = '9' | lang = '11') & sxstr = "K" then sxstr = "F"
  349. else if (lang = '10' | lang = '12') & sxstr = "F" then sxstr = "K"
  350. else if lang = '13' & sxstr = "N" then sxstr = "F"
  351. else if lang = '14' & sxstr = "F" then sxstr = "N"
  352. /* French and Italian: 'M' and 'F', same as in English */
  353. else sxstr = ""
  354. return sxstr
  355.  
  356. /* PARSEDATE SUBROUTINE */
  357. /* For each word in the datestr string, see if it occurs in the datin
  358.  * string. If it does, replace it with the equivalent in the datout string
  359.  */
  360. ParseDate: PROCEDURE EXPOSE datin datout
  361. parse arg datestr
  362. datestr = strip(datestr); /* remove leading blanks */
  363. if datestr = "" then return datestr
  364. rdate = translate(datestr,'  ','-/'); /* replace all '-' or '/' by ' ' */
  365.  
  366. datestr = upper(rdate)
  367.  /* keep rdate in its original case, so we don't accidentally change
  368.   * the case of any other words in the resulting
  369.   */
  370. cp = 1
  371.  
  372. /* check all words with the datin string */
  373. do cnt = 1 to words(datestr)
  374.   cw = word(datestr, cnt)
  375.   num = find(datin, cw)
  376.   if num > 0 then do
  377.     rep = word(datout, num)
  378.     if rep="." then rep=""
  379.     rl = length(rep)
  380.     cl = length(cw)
  381.     cp = index(upper(rdate), cw, cp)
  382.     rdate = delstr(rdate, cp, cl)
  383.     rdate = insert(rep, rdate, cp-1)
  384.   end
  385. end
  386. return rdate
  387.  
  388. Tell: PROCEDURE EXPOSE outp scrdev
  389. parse arg str
  390. if outp then
  391.   writeln(scrdev, str)
  392. return 0
  393.  
  394. TellNN: PROCEDURE EXPOSE outp scrdev
  395. parse arg str
  396. if outp then
  397.   writech(scrdev, str)
  398. return 0
  399.  
  400. EndString: PROCEDURE EXPOSE outp usereq pgopen scrdev pscr
  401. parse arg str
  402. /* If you turned off stdout, no error messages will be shown! */
  403. if usereq then
  404.   rtezrequest(str,'E_xit','Translate Message:','rt_pubscrname = '||PSCR)
  405. else do
  406.   Tell(str || '0A'x)
  407. end
  408. if pgopen then Postmsg()
  409. if outp & ~usereq & (scrdev ~= stdout) then do
  410.   Tell("Press <return> to exit.")
  411.   readln(scrdev)
  412.   close(scrdev)
  413. end
  414. EXIT
  415.