home *** CD-ROM | disk | FTP | other *** search
/ Otherware / Otherware_1_SB_Development.iso / amiga / comms / comprgs / term232.lha / Source_Code / termSource / termLocale.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-08-18  |  6.4 KB  |  377 lines

  1. /*
  2. **    $Id: termLocale.c,v 1.3 92/08/18 16:12:37 olsen Sta Locker: olsen $
  3. **    $Revision: 1.3 $
  4. **    $Date: 92/08/18 16:12:37 $
  5. **
  6. **    Localization support routines
  7. **
  8. **    Copyright ⌐ 1990-1992 by Olaf `Olsen' Barthel & MXM
  9. **        All Rights Reserved
  10. */
  11.  
  12. #include "termGlobal.h"
  13.  
  14. extern struct
  15. {
  16.     LONG    as_ID;
  17.     STRPTR    as_Str;
  18. } AppStrings[];
  19.  
  20. extern LONG NumAppStrings;
  21.  
  22. struct LocaleBase    *LocaleBase;
  23. struct Catalog        *Catalog;
  24. struct Locale        *Locale;
  25.  
  26.     /* LocaleOpen(STRPTR CatalogName,STRPTR BuiltIn):
  27.      *
  28.      *    Open string translation tables.
  29.      */
  30.  
  31. VOID __regargs
  32. LocaleOpen(STRPTR CatalogName,STRPTR BuiltIn,LONG Version)
  33. {
  34. #ifdef LIBRARIES_LOCALE_H
  35.     if(LocaleBase = (struct LocaleBase *)OpenLibrary("locale.library",38))
  36.     {
  37.         if(LocaleBase -> lb_SysPatches)
  38.         {
  39.             strcpy(ConvNumber,"%lD");
  40.             strcpy(ConvNumber10,"%10lD");
  41.  
  42.             Catalog = OpenCatalog(NULL,CatalogName,
  43.                 OC_BuiltInLanguage,    BuiltIn,
  44.                 OC_BuiltInCodeSet,    0,
  45.                 OC_Version,        Version,
  46.             TAG_DONE);
  47.  
  48.             Locale = OpenLocale(NULL);
  49.         }
  50.         else
  51.         {
  52.             strcpy(ConvNumber,"%ld");
  53.             strcpy(ConvNumber10,"%10ld");
  54.  
  55.             CloseLibrary(LocaleBase);
  56.  
  57.             LocaleBase = NULL;
  58.         }
  59.     }
  60.     else
  61.     {
  62.         strcpy(ConvNumber,"%ld");
  63.         strcpy(ConvNumber10,"%10ld");
  64.     }
  65. #else
  66.     strcpy(ConvNumber,"%ld");
  67.     strcpy(ConvNumber10,"%10ld");
  68. #endif    /* LIBRARIES_LOCALE_H */
  69. }
  70.  
  71.     /* LocaleClose():
  72.      *
  73.      *    Close the translation tables.
  74.      */
  75.  
  76. VOID
  77. LocaleClose()
  78. {
  79.     if(Locale)
  80.         CloseLocale(Locale);
  81.  
  82.     if(Catalog)
  83.         CloseCatalog(Catalog);
  84.  
  85.     if(LocaleBase)
  86.         CloseLibrary(LocaleBase);
  87. }
  88.  
  89.     /* LanguageCheck():
  90.      *
  91.      *    Checks to see if the currently selected language
  92.      *    is english.
  93.      */
  94.  
  95. VOID
  96. LanguageCheck()
  97. {
  98. #ifdef LIBRARIES_LOCALE_H
  99.     if(Locale && Catalog)
  100.     {
  101.         if(Locale -> loc_LanguageName)
  102.         {
  103.             if(!Stricmp(Locale -> loc_LanguageName,"english.language"))
  104.                 English = TRUE;
  105.             else
  106.                 English = FALSE;
  107.         }
  108.         else
  109.             English = FALSE;
  110.     }
  111.     else
  112.         English = TRUE;
  113. #else
  114.     English = TRUE;
  115. #endif    /* LIBRARIES_LOCALE_H */
  116. }
  117.  
  118.     /* GadToolsStrlen(STRPTR *String):
  119.      *
  120.      *    Custom version of strlen, useful for gadtools object titles
  121.      *    with embedded underscore characters.
  122.      */
  123.  
  124. WORD __regargs
  125. GadToolsStrlen(STRPTR String)
  126. {
  127.     WORD Len = 0;
  128.  
  129.     while(*String)
  130.     {
  131.         if(*String++ != '_')
  132.             Len++;
  133.     }
  134.  
  135.     return(Len);
  136. }
  137.  
  138.     /* GadToolsLongestString(WORD From,WORD To):
  139.      *
  140.      *    Determines the longest string used by a gadtools
  141.      *    control panel.
  142.      */
  143.  
  144. WORD __regargs
  145. GadToolsLongestString(WORD From,WORD To)
  146. {
  147.     STRPTR    Text;
  148.     WORD    MaxLen = 0,
  149.         Len,i;
  150.  
  151.     for(i = From ; i <= To ; i++)
  152.     {
  153.         if(Text = LocaleString(i))
  154.         {
  155.             if((Len = GadToolsStrlen(Text)) > MaxLen)
  156.                 MaxLen = Len;
  157.         }
  158.     }
  159.  
  160.     return(MaxLen);
  161. }
  162.  
  163.     /* LocaleSeconds(WORD Seconds):
  164.      *
  165.      *    Return seconds in proper format.
  166.      */
  167.  
  168. STRPTR __regargs
  169. LocaleSeconds(WORD Seconds)
  170. {
  171.     STATIC UBYTE Time[10];
  172.  
  173. #ifdef LIBRARIES_LOCALE_H
  174.     if(Locale)
  175.         SPrintf(Time,"%2lD%s%02lD",Seconds / 100,Locale -> loc_DecimalPoint,Seconds % 100);
  176.     else
  177.         SPrintf(Time,"%2ld.%02ld",Seconds / 100,Seconds % 100);
  178. #else
  179.     SPrintf(Time,"%2ld.%02ld",Seconds / 100,Seconds % 100);
  180. #endif    /* LIBRARIES_LOCALE_H */
  181.  
  182.     return(Time);
  183. }
  184.  
  185.     /* SmallCurrency():
  186.      *
  187.      *    Support function for the rates control panel, returns a formatted
  188.      *    string to contain a string like "cents/unit".
  189.      */
  190.  
  191. STRPTR __regargs
  192. SmallCurrency()
  193. {
  194.     STATIC UBYTE Buffer[30];
  195.  
  196. #ifdef LIBRARIES_LOCALE_H
  197.     if(Locale)
  198.         SPrintf(Buffer,LocaleString(MSG_RATEPANEL_PAY_PER_UNIT_GAD),Locale -> loc_MonSmallCS);
  199.     else
  200.         SPrintf(Buffer,LocaleString(MSG_RATEPANEL_PAY_PER_UNIT_GAD),"Pay");
  201. #else
  202.     SPrintf(Buffer,LocaleString(MSG_RATEPANEL_PAY_PER_UNIT_GAD),"Pay");
  203. #endif    /* LIBRARIES_LOCALE_H */
  204.  
  205.     return(Buffer);
  206. }
  207.  
  208.     /* CreateSum(LONG Quantity):
  209.      *
  210.      *    Create a string containing a monetary quantity formatted
  211.      *    according to the current locale rules.
  212.      */
  213.  
  214. STRPTR __regargs
  215. CreateSum(LONG Quantity,BYTE UseCurrency)
  216. {
  217.     STATIC UBYTE Buffer[20];
  218.  
  219. #ifdef LIBRARIES_LOCALE_H
  220.     if(Locale)
  221.     {
  222.         if(Locale -> loc_MonFracDigits < 6)
  223.         {
  224.             STATIC LONG    Power[] = { 1, 10, 100, 1000, 10000, 100000 };
  225.  
  226.             UBYTE        Buffer2[20];
  227.             LONG        Int,
  228.                     Frac;
  229.  
  230.             if(UseCurrency)
  231.             {
  232.                 strcpy(Buffer2,"%s %lD%s%");
  233.  
  234.                 SPrintf(&Buffer2[9],"%02ld",Locale -> loc_MonFracDigits);
  235.  
  236.                 strcat(Buffer2,"lD");
  237.  
  238.                 Int    = Quantity / Power[Locale -> loc_MonFracDigits];
  239.                 Frac    = Quantity % Power[Locale -> loc_MonFracDigits];
  240.  
  241.                 SPrintf(Buffer,Buffer2,Locale -> loc_MonCS,Int,Locale -> loc_MonDecimalPoint,Frac);
  242.             }
  243.             else
  244.             {
  245.                 STATIC UBYTE Buffer1[20];
  246.  
  247.                 strcpy(Buffer2,"%lD%s%");
  248.  
  249.                 SPrintf(&Buffer2[6],"%02ld",Locale -> loc_MonFracDigits);
  250.  
  251.                 strcat(Buffer2,"lD");
  252.  
  253.                 Int    = Quantity / Power[Locale -> loc_MonFracDigits];
  254.                 Frac    = Quantity % Power[Locale -> loc_MonFracDigits];
  255.  
  256.                 SPrintf(Buffer1,Buffer2,Int,Locale -> loc_MonDecimalPoint,Frac);
  257.  
  258.                 return(Buffer1);
  259.             }
  260.         }
  261.         else
  262.             SPrintf(Buffer,"%lD.%02ld",Quantity / 100,Quantity % 100);
  263.     }
  264.     else
  265.         SPrintf(Buffer,"%ld.%02ld",Quantity / 100,Quantity % 100);
  266. #else
  267.     SPrintf(Buffer,"%ld.%02ld",Quantity / 100,Quantity % 100);
  268. #endif    /* LIBRARIES_LOCALE_H */
  269.  
  270.     return(Buffer);
  271. }
  272.  
  273.     /* LocalizeString(STRPTR *Strings,WORD From,WORD To):
  274.      *
  275.      *    Localize an array of strings.
  276.      */
  277.  
  278. VOID __regargs
  279. LocalizeString(STRPTR *Strings,WORD From,WORD To)
  280. {
  281.     WORD i,j;
  282.  
  283.     for(i = From, j = 0 ; i <= To ; i++)
  284.     {
  285.         if(!Strings[j])
  286.             Strings[j++] = LocaleString(i);
  287.     }
  288. }
  289.  
  290.     /* LocalizeMenu(struct NewMenu *Menu,WORD From):
  291.      *
  292.      *    Localize a NewMenu definition.
  293.      */
  294.  
  295. VOID __regargs
  296. LocalizeMenu(struct NewMenu *Menu,WORD From)
  297. {
  298.     STRPTR Label,Shortcut;
  299.  
  300.         while(Menu -> nm_Type != NM_END)
  301.     {
  302.         Shortcut = LocaleString(From);
  303.  
  304.         if(Shortcut[0] && !Shortcut[1])
  305.             Label = Shortcut + 2;
  306.         else
  307.         {
  308.             Label        = Shortcut;
  309.             Shortcut    = NULL;
  310.         }
  311.  
  312.         switch(Menu -> nm_Type)
  313.         {
  314.             case NM_TITLE:    Menu -> nm_Label = Label;
  315.  
  316.                     From++;
  317.  
  318.                     break;
  319.  
  320.             case NM_ITEM:
  321.             case NM_SUB:    if(Menu -> nm_Label != NM_BARLABEL)
  322.                     {
  323.                         Menu -> nm_Label    = Label;
  324.                         Menu -> nm_CommKey    = Shortcut;
  325.  
  326.                         From++;
  327.                     }
  328.  
  329.                     break;
  330.         }
  331.  
  332.         Menu++;
  333.     }
  334. }
  335.  
  336.     /* LocaleString(LONG ID):
  337.      *
  338.      *    Obtain a string from the translation pool.
  339.      */
  340.  
  341. STRPTR __regargs
  342. LocaleString(LONG ID)
  343. {
  344.     STRPTR Builtin;
  345.  
  346.     if(AppStrings[ID] . as_ID == ID)
  347.         Builtin = AppStrings[ID] . as_Str;
  348.     else
  349.     {
  350.         WORD i;
  351.  
  352.         Builtin = NULL;
  353.  
  354.         for(i = 0 ; i < NumAppStrings ; i++)
  355.         {
  356.             if(AppStrings[i] . as_ID == ID)
  357.             {
  358.                 Builtin = AppStrings[i] . as_Str;
  359.  
  360.                 break;
  361.             }
  362.         }
  363.     }
  364.  
  365.     if(Catalog)
  366.     {
  367.         STRPTR String = GetCatalogStr(Catalog,ID,Builtin);
  368.  
  369.         if(String[0])
  370.             return(String);
  371.         else
  372.             return(Builtin);
  373.     }
  374.     else
  375.         return(Builtin);
  376. }
  377.