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 withName, NXZone *zone)
{
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)) {
if ( zone == NULL){
retval = [NXApp loadNibFile:path owner:owner
withNames:NO];
found = YES;
}
else {
retval = [NXApp loadNibFile:path owner:owner
withNames:withName fromZone:zone];
found = YES;
}
}
languages++;
}
}
if ( zone == NULL)
return found ? retval : [NXApp loadNibSection:nibFile owner:owner
withNames:NO];
else
return found ? retval : [NXApp loadNibSection:nibFile owner:owner
withNames:withName fromZone:zone];
}
NXStream *LocalMapFile(const char *file, int flag)
{
BOOL found = NO;
const char *const *languages;
char path[MAXPATHLEN+1];
NXStream *stream=NULL;
languages = [NXApp systemLanguages];
if (languages && launchDirOk()) {
while (!found && *languages) {
sprintf(path, "%s/%s.lproj/%s", launchDir, *languages, file);
if (!access(path, R_OK)) {
stream = NXMapFile(path, flag);
found = YES;
}
languages++;
}
}
if (!found) {
sprintf(path, "%s/%s", launchDir, file);
stream = NXMapFile(path, flag);
}
return (NXStream *)stream;
}
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;
/*
sprintf(buffer, "%s/%s.lproj/%s.strings", launchDir, *languages, tableName);
table = [[NXStringTable alloc] init] ;
[table readFromFile:buffer];
*/
break;
}
sprintf(buffer, "%s/%s.lproj/%s.strings", launchDir, *languages, tableName);
table = [[NXStringTable alloc] init] ;
[table readFromFile: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];
}
/*
NXHashState state;
const char *dkey;const char *dvalue;
state=[table initState];
while([table nextState:(NXHashState *)&state key:(const void **)&dkey value:(void **)&dvalue] == YES)
printf("key = %s, value = %s\n",dkey,dvalue);
*/
return tableValue;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.