include "translate.m";
translate := load Translate Translate->PATH;
Dict: adt {
    new:    fn(): ref Dict;
    add:    fn(d: self ref Dict, file: string): string;
    xlate:  fn(d: self ref Dict, s: string): string;
    xlaten: fn(d: self ref Dict, s: string, note: string): string;
};
init:       fn();
opendict:   fn(file: string): (ref Dict, string);
opendicts:  fn(files: list of string): (ref Dict, string);
mkdictname: fn(locale, app: string): string;
Init should be called before using any of these functions.
Opendict opens a dictionary file (of the format defined below) and returns a tuple: a reference to a Dict that represents it and a diagnostic string (which is nil if no error occurred). Opendicts is similar, but loads each of the files in turn into the same Dict, producing a composite dictionary in which translations in later files can override translations in earlier ones; the diagnostic string summarises all errors (if any).
Mkdictname returns the conventional name of a dictionary file given locale and application names. The locale is normally nil to use the current locale, which is formed by binding the desired locale directory (or directories) onto /lib/locale.
Dict.new returns an empty dictionary. Dict.add loads the given dictionary file into an existing dictionary, returning a non-nil diagnostic string on error. Translations are made by Dict.xlate and Dict.xlaten: they look for a string s (eg, text in one language), optionally qualified by a note, and return the corresponding translation text from the dictionary. If no such translation exists, they return the original text s.
include "translate.m";
	translate: Translate;
	Dict: import translate;
dict: ref Dict;
X(s: string): string
{
	if(dict == nil)
		return s;
	return dict.xlate(s);
}
init(ctxt: ref Draw->Context, args: list of string)
{
	...
	translate = load Translate Translate->PATH;
	if(translate != nil){
		translate->init();
		(dict, nil) = translate->opendict(
					translate->mkdictname("", "vmail"));
	}
	...
	optioncfg := array [] of {
		"frame .op -relief flat -borderwidth 8",
		"frame .op.lbs",
		"label .op.lbs.a -text {" +
			X("Voice Mail Active") + ":}",
		"label .op.lbs.g -text {" +
			X("Answer Calls With") + ":}",
		"label .op.lbs.r -text {" +
			X("Rings before Answering") + ":}",
		"label .op.lbs.l -text {" +
			X("Length of Incoming Messages") + ":}}",
		...
	};
	...
	wmlib->tkcmds(top, optioncfg);
}
The intermediate function X is defined to allow the program to be used (albeit with text in English) even when the Translate module cannot be loaded.
| TRANSLATE(2 ) | Rev: Thu Feb 15 14:43:27 GMT 2007 |