/*
**	$Id: termLocale.c,v 1.3 92/08/18 16:12:37 olsen Sta Locker: olsen $
**	$Revision: 1.3 $
**	$Date: 92/08/18 16:12:37 $
**
**	Localization support routines
**
**	Copyright © 1990-1992 by Olaf `Olsen' Barthel & MXM
**		All Rights Reserved
*/

#include "termGlobal.h"

extern struct
{
	LONG	as_ID;
	STRPTR	as_Str;
} AppStrings[];

extern LONG NumAppStrings;

struct LocaleBase	*LocaleBase;
struct Catalog		*Catalog;
struct Locale		*Locale;

	/* LocaleOpen(STRPTR CatalogName,STRPTR BuiltIn):
	 *
	 *	Open string translation tables.
	 */

VOID __regargs
LocaleOpen(STRPTR CatalogName,STRPTR BuiltIn,LONG Version)
{
#ifdef LIBRARIES_LOCALE_H
	if(LocaleBase = (struct LocaleBase *)OpenLibrary("locale.library",38))
	{
		if(LocaleBase -> lb_SysPatches)
		{
			strcpy(ConvNumber,"%lD");
			strcpy(ConvNumber10,"%10lD");

			Catalog = OpenCatalog(NULL,CatalogName,
				OC_BuiltInLanguage,	BuiltIn,
				OC_BuiltInCodeSet,	0,
				OC_Version,		Version,
			TAG_DONE);

			Locale = OpenLocale(NULL);
		}
		else
		{
			strcpy(ConvNumber,"%ld");
			strcpy(ConvNumber10,"%10ld");

			CloseLibrary(LocaleBase);

			LocaleBase = NULL;
		}
	}
	else
	{
		strcpy(ConvNumber,"%ld");
		strcpy(ConvNumber10,"%10ld");
	}
#else
	strcpy(ConvNumber,"%ld");
	strcpy(ConvNumber10,"%10ld");
#endif	/* LIBRARIES_LOCALE_H */
}

	/* LocaleClose():
	 *
	 *	Close the translation tables.
	 */

VOID
LocaleClose()
{
	if(Locale)
		CloseLocale(Locale);

	if(Catalog)
		CloseCatalog(Catalog);

	if(LocaleBase)
		CloseLibrary(LocaleBase);
}

	/* LanguageCheck():
	 *
	 *	Checks to see if the currently selected language
	 *	is english.
	 */

VOID
LanguageCheck()
{
#ifdef LIBRARIES_LOCALE_H
	if(Locale && Catalog)
	{
		if(Locale -> loc_LanguageName)
		{
			if(!Stricmp(Locale -> loc_LanguageName,"english.language"))
				English = TRUE;
			else
				English = FALSE;
		}
		else
			English = FALSE;
	}
	else
		English = TRUE;
#else
	English = TRUE;
#endif	/* LIBRARIES_LOCALE_H */
}

	/* GadToolsStrlen(STRPTR *String):
	 *
	 *	Custom version of strlen, useful for gadtools object titles
	 *	with embedded underscore characters.
	 */

WORD __regargs
GadToolsStrlen(STRPTR String)
{
	WORD Len = 0;

	while(*String)
	{
		if(*String++ != '_')
			Len++;
	}

	return(Len);
}

	/* GadToolsLongestString(WORD From,WORD To):
	 *
	 *	Determines the longest string used by a gadtools
	 *	control panel.
	 */

WORD __regargs
GadToolsLongestString(WORD From,WORD To)
{
	STRPTR	Text;
	WORD	MaxLen = 0,
		Len,i;

	for(i = From ; i <= To ; i++)
	{
		if(Text = LocaleString(i))
		{
			if((Len = GadToolsStrlen(Text)) > MaxLen)
				MaxLen = Len;
		}
	}

	return(MaxLen);
}

	/* LocaleSeconds(WORD Seconds):
	 *
	 *	Return seconds in proper format.
	 */

STRPTR __regargs
LocaleSeconds(WORD Seconds)
{
	STATIC UBYTE Time[10];

#ifdef LIBRARIES_LOCALE_H
	if(Locale)
		SPrintf(Time,"%2lD%s%02lD",Seconds / 100,Locale -> loc_DecimalPoint,Seconds % 100);
	else
		SPrintf(Time,"%2ld.%02ld",Seconds / 100,Seconds % 100);
#else
	SPrintf(Time,"%2ld.%02ld",Seconds / 100,Seconds % 100);
#endif	/* LIBRARIES_LOCALE_H */

	return(Time);
}

	/* SmallCurrency():
	 *
	 *	Support function for the rates control panel, returns a formatted
	 *	string to contain a string like "cents/unit".
	 */

STRPTR __regargs
SmallCurrency()
{
	STATIC UBYTE Buffer[30];

#ifdef LIBRARIES_LOCALE_H
	if(Locale)
		SPrintf(Buffer,LocaleString(MSG_RATEPANEL_PAY_PER_UNIT_GAD),Locale -> loc_MonSmallCS);
	else
		SPrintf(Buffer,LocaleString(MSG_RATEPANEL_PAY_PER_UNIT_GAD),"Pay");
#else
	SPrintf(Buffer,LocaleString(MSG_RATEPANEL_PAY_PER_UNIT_GAD),"Pay");
#endif	/* LIBRARIES_LOCALE_H */

	return(Buffer);
}

	/* CreateSum(LONG Quantity):
	 *
	 *	Create a string containing a monetary quantity formatted
	 *	according to the current locale rules.
	 */

STRPTR __regargs
CreateSum(LONG Quantity,BYTE UseCurrency)
{
	STATIC UBYTE Buffer[20];

#ifdef LIBRARIES_LOCALE_H
	if(Locale)
	{
		if(Locale -> loc_MonFracDigits < 6)
		{
			STATIC LONG	Power[] = { 1, 10, 100, 1000, 10000, 100000 };

			UBYTE		Buffer2[20];
			LONG		Int,
					Frac;

			if(UseCurrency)
			{
				strcpy(Buffer2,"%s %lD%s%");

				SPrintf(&Buffer2[9],"%02ld",Locale -> loc_MonFracDigits);

				strcat(Buffer2,"lD");

				Int	= Quantity / Power[Locale -> loc_MonFracDigits];
				Frac	= Quantity % Power[Locale -> loc_MonFracDigits];

				SPrintf(Buffer,Buffer2,Locale -> loc_MonCS,Int,Locale -> loc_MonDecimalPoint,Frac);
			}
			else
			{
				STATIC UBYTE Buffer1[20];

				strcpy(Buffer2,"%lD%s%");

				SPrintf(&Buffer2[6],"%02ld",Locale -> loc_MonFracDigits);

				strcat(Buffer2,"lD");

				Int	= Quantity / Power[Locale -> loc_MonFracDigits];
				Frac	= Quantity % Power[Locale -> loc_MonFracDigits];

				SPrintf(Buffer1,Buffer2,Int,Locale -> loc_MonDecimalPoint,Frac);

				return(Buffer1);
			}
		}
		else
			SPrintf(Buffer,"%lD.%02ld",Quantity / 100,Quantity % 100);
	}
	else
		SPrintf(Buffer,"%ld.%02ld",Quantity / 100,Quantity % 100);
#else
	SPrintf(Buffer,"%ld.%02ld",Quantity / 100,Quantity % 100);
#endif	/* LIBRARIES_LOCALE_H */

	return(Buffer);
}

	/* LocalizeString(STRPTR *Strings,WORD From,WORD To):
	 *
	 *	Localize an array of strings.
	 */

VOID __regargs
LocalizeString(STRPTR *Strings,WORD From,WORD To)
{
	WORD i,j;

	for(i = From, j = 0 ; i <= To ; i++)
	{
		if(!Strings[j])
			Strings[j++] = LocaleString(i);
	}
}

	/* LocalizeMenu(struct NewMenu *Menu,WORD From):
	 *
	 *	Localize a NewMenu definition.
	 */

VOID __regargs
LocalizeMenu(struct NewMenu *Menu,WORD From)
{
	STRPTR Label,Shortcut;

        while(Menu -> nm_Type != NM_END)
	{
		Shortcut = LocaleString(From);

		if(Shortcut[0] && !Shortcut[1])
			Label = Shortcut + 2;
		else
		{
			Label		= Shortcut;
			Shortcut	= NULL;
		}

		switch(Menu -> nm_Type)
		{
			case NM_TITLE:	Menu -> nm_Label = Label;

					From++;

					break;

			case NM_ITEM:
			case NM_SUB:	if(Menu -> nm_Label != NM_BARLABEL)
					{
						Menu -> nm_Label	= Label;
						Menu -> nm_CommKey	= Shortcut;

						From++;
					}

					break;
		}

		Menu++;
	}
}

	/* LocaleString(LONG ID):
	 *
	 *	Obtain a string from the translation pool.
	 */

STRPTR __regargs
LocaleString(LONG ID)
{
	STRPTR Builtin;

	if(AppStrings[ID] . as_ID == ID)
		Builtin = AppStrings[ID] . as_Str;
	else
	{
		WORD i;

		Builtin = NULL;

		for(i = 0 ; i < NumAppStrings ; i++)
		{
			if(AppStrings[i] . as_ID == ID)
			{
				Builtin = AppStrings[i] . as_Str;

				break;
			}
		}
	}

	if(Catalog)
	{
		STRPTR String = GetCatalogStr(Catalog,ID,Builtin);

		if(String[0])
			return(String);
		else
			return(Builtin);
	}
	else
		return(Builtin);
}
