home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d8xx / d832 / term.lha / Term / term-3.1-Source.lha / termLocale.c < prev    next >
C/C++ Source or Header  |  1993-02-18  |  6KB  |  366 lines

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