ftp.nice.ch/pub/next/developer/objc/appkit/Localization.s.tar.gz#/Localization/AskMe/Localization.m

This is Localization.m in view mode; [Download] [Up]

/*
 * You may freely copy, distribute, and reuse the code in this example.
 * NeXT disclaims any warranty of any kind, expressed or  implied, as to its
 * fitness for any particular use.
 * 
 */

#import <appkit/Application.h>
#import <appkit/NXImage.h>
#import <appkit/nextstd.h>
#import <objc/NXStringTable.h>
#import <appkit/defaults.h>
#import <libc.h>
#import "Localization.h"

#define NATIVE_LANGUAGE "English"
static char *launchDir = NULL;	/* if this is NULL, it will be calculated */

/*
 * launchDirOK will return a NULL launchDir if you launch from a Terminal Shell. 
 */
static BOOL launchDirOk()
{
    const char *slash;

    if (launchDir) return YES;

    slash = strrchr(NXArgv[0], '/');
    if (slash && slash-NXArgv[0]) {
	launchDir = malloc((slash-NXArgv[0]+1)*sizeof(char));
	strncpy(launchDir, NXArgv[0], slash-NXArgv[0]);
	launchDir[slash-NXArgv[0]] = '\0';
	return YES;
    }

    return NO;
}

void InitLocalDateAndTime()
{
    time_t t;
    char buffer[16];
    t = time(NULL);
    strftime(buffer, 15, "%H:%M", localtime(&t));
}

		
void LocalDateAndTime(char *buffer,int  maxBufferSize, const time_t *time) 
{
    const char *format;
    
    format = NXGetDefaultValue([NXApp appName], "NXDateAndTime");
    if (format == NULL)
        format = "%a %b %d %H:%M:%S %Z %Y";
    strftime(buffer,maxBufferSize,format,localtime(time));
}

void LocalDate(char *buffer,int  maxBufferSize, const time_t *time)
{
    const char *format;
    
    format = NXGetDefaultValue([NXApp appName], "NXDate");
    if (format == NULL)
        format = "%a %b %d %Y";
    strftime(buffer,maxBufferSize,format,localtime(time));
}

void LocalTime(char *buffer,int maxBufferSize, const time_t *time)
{
    const char *format;
    
    format = NXGetDefaultValue([NXApp appName], "NXTime");
    if (format == NULL)
        format = "%H:%M:%S %Z";
    strftime(buffer,maxBufferSize,format,localtime(time));
}


/* If the user has not set a language preference, load the nib
 * section stored in the Mach-O by default. Otherwise,
 * the nib file loaded would follow the language set in the Preferences
 * Application.
 */
id LoadLocalNib(const char *nibFile, id owner)
{
    BOOL found = NO;
    id retval = nil;
    const char *const *languages;
    char path[MAXPATHLEN+1];

    languages = [NXApp systemLanguages];
    if (languages && launchDirOk()) {
	while (!found && *languages) {
	    if (!strcmp(*languages, NATIVE_LANGUAGE)) break;
	    sprintf(path, "%s/%s.lproj/%s", launchDir, *languages, nibFile);
	    if (!access(path, R_OK)) {
		retval = [NXApp loadNibFile:path owner:owner withNames:NO];
		found = YES;
	    }
	languages++;
	}
    }

    return found ? retval : [NXApp loadNibSection:nibFile owner:owner withNames:NO];
}



id LocalImage(const char *file)
{
    id retval = nil;
    const char *const *languages;
    char path[MAXPATHLEN+1];

    languages = [NXApp systemLanguages];
    if (languages) {
	while (!retval && *languages) {
	    if (!strcmp(*languages, NATIVE_LANGUAGE)) break;
	    sprintf(path, "%s/%s.lproj/%s", launchDir, *languages, file);
	    retval = [NXImage newFromFile:file];
	    languages++;
	}
    } else {
	retval = [NXImage newFromSection:file];
    }

    return retval;
}

/* If the user has not selected a language preference,
 * return the key by default. 
 * NOTE: The key is in the same language as the NATIVE_LANGUAGE.
 */
 
const char *doLocalString(const char *tableName, const char *key, const char *value)
{
    id table = nil;
    const char *tableValue;
    const char *const *languages;
    BOOL isMyAppsLanguage = NO;
    char buffer[MAXPATHLEN+1];
    static int debugLanguages = -1;
    static id stringTableTable = nil;

    if (!(languages = [NXApp systemLanguages])) return value ? value : key;

    if (!tableName) tableName = [NXApp appName];
    if (tableName[0] == '"' && tableName[strlen(tableName)-1] == '"') {
	strcpy(buffer, tableName+1);
	buffer[strlen(buffer)-1] = '\0';
	tableName = NXUniqueString(buffer);
    }

    if (debugLanguages < 0) debugLanguages = NXGetDefaultValue([NXApp appName], "NXDebugLanguages") ? 1 : 0;

    if (!(table = [stringTableTable valueForKey:tableName])) {
	while (!table && *languages) {
	    if (!strcmp(*languages, NATIVE_LANGUAGE)) {
		isMyAppsLanguage = YES;
		break;
	    }
	    sprintf(buffer, "%s/%s.lproj/%s.strings", launchDir, *languages, tableName);
	    table = [NXStringTable newFromFile:buffer];
		languages++;
	}
	if (!table) {
	    if (debugLanguages && !isMyAppsLanguage) NXLogError("Cannot parse '%s' strings.", tableName);
	    table = [NXStringTable new];
	}
	if (!stringTableTable) stringTableTable = [HashTable newKeyDesc:"*"];
	[stringTableTable insertKey:tableName value:table];
    }

    tableValue = [table valueForStringKey:key];

    if (!tableValue) {
	if (debugLanguages && !isMyAppsLanguage)
	    NXLogError("Cannot find value for string '%s' in table '%s'.", key, tableName);
	tableValue = value ? value : key;
	[table insertKey:key value:(void *)value];
    }

    return tableValue;
}

/* If the application is launched from the Workspace, NXArgv[0] will contain the full pathname of the executable file. If you launch the application from a terminal command line, NXArgv[0] will contain only the filename specified in the command. To get from that file name to the absolute path of its directory, you can use a combination of chdir() and getwd().
*/
 
void getAppDirectory (char *appDirectory)
{
    char *suffix;

    strcpy (appDirectory,NXArgv[0]);
    if (suffix = rindex(appDirectory,'/'))	
        *suffix  = '\0'; 	/* remove executable name */
    if (appDirectory) chdir(appDirectory); 
    getwd(appDirectory);
     
}


/* This method is specific to the AskMe application. It retrieves the proper
 * AskMeText folder depending on which language preference has been set
 * by the user.
 * If the user has not set a language preference,the default language
 * "English" will be used.
 * Also, getAppDirectory is used to find the full directory path even
 * if the user launches the app from the terminal shell.
 */
const char * findLocalDir()
{
	char path[MAXPATHLEN+1], appDirectory[MAXPATHLEN+1];
	const char *dirName, *fullDirName;
    const char *const *languages;
	BOOL  found = NO;
	
		
	dirName = LocalString( "AskMeText", NULL,
							 "Directory where text files are stored ");
	getAppDirectory(appDirectory);
		
    languages = [NXApp systemLanguages];
    if (languages) {
	while (!found && *languages) {
	    sprintf(path, "%s/%s.lproj/%s", launchDir, *languages, dirName);
	    if (!access(path, R_OK)) {
		found = YES;
	    }
		languages++;
	}
	} 
	if (!found) {
	sprintf(path, "%s/%s.lproj/%s", appDirectory,NATIVE_LANGUAGE, dirName); 
	}
	

	fullDirName = NXUniqueString(path);	
	return fullDirName;

}


These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.