167 lines
6.7 KiB
Text
167 lines
6.7 KiB
Text
|
# Id: README,v 8.4 1994/11/22 09:52:04 bostic Exp (Berkeley) Date: 1994/11/22 09:52:04
|
||
|
|
||
|
Generally, all non-system error and informational messages in nvi are
|
||
|
catalog messages, i.e. they can be tailored to a specific langauge.
|
||
|
Command strings, usage strings, system errors and other "known text"
|
||
|
are not. It would certainly be possible to internationalize all the
|
||
|
text strings in nvi, but it's unclear that it's the right thing to do.
|
||
|
|
||
|
First, there's no portable way to do message catalogs. The System V
|
||
|
scheme is a reasonable choice, but none of the 4BSD derived systems
|
||
|
support it. So, catalogs are completely implemented within nvi, and
|
||
|
don't require any library support.
|
||
|
|
||
|
Message catalogs in nvi are fairly simple. Every catalog message
|
||
|
consists of two parts -- an initial number followed by a pipe (`|')
|
||
|
character, followed by the English text for the message. For example:
|
||
|
|
||
|
msgq(sp, M_ERR, "001|This is an error message");
|
||
|
|
||
|
would be a typical message.
|
||
|
|
||
|
When the msgq() routine is called, if the user has specified a message
|
||
|
catalog and the format string (the third argument) has a leading number,
|
||
|
then it is converted to a record number, and that record is retrieved
|
||
|
from the message catalog and used as a replacement format string. If
|
||
|
the record can't be retrieved for any reason, the English text is displayed
|
||
|
instead.
|
||
|
|
||
|
Each message format string MUST map into the English format string, i.e.
|
||
|
it can't display more or different arguments than the English one.
|
||
|
|
||
|
For example:
|
||
|
|
||
|
msgq(sp, M_ERR, "002|Error: %d %x", arg1, arg2);
|
||
|
|
||
|
is a format string that displays two arguments. It is possible, however,
|
||
|
to reorder the arguments or to not display all of them. The convention
|
||
|
nvi uses is the System V printf(3) convention, i.e. "%[0-9]*$" is the name
|
||
|
of a specific, numbered argument. For example:
|
||
|
|
||
|
msgq(sp, M_ERR, "002|Error: %2$d %1$x", arg1, arg2);
|
||
|
|
||
|
displays the arguments in reverse order.
|
||
|
|
||
|
If the system supports this convention in its library printf routines
|
||
|
(as specified by the test #define NL_ARGMAX), nvi uses those routines.
|
||
|
Otherwise, there is some serious magic going on in common/msg.c to make
|
||
|
this all work.
|
||
|
|
||
|
Arguments to the msgq function are required to contain ONLY printable
|
||
|
characters. No further translation is done by the msgq routine before
|
||
|
displaying the message on the screen. For example, in the msgq call:
|
||
|
|
||
|
msgq(sp, M_ERR, "003|File: %s", file_name);
|
||
|
|
||
|
"file_name" must contain only printable characters. The routine
|
||
|
msg_print() returns a printable version of a string in allocated
|
||
|
memory. For example:
|
||
|
|
||
|
char *p;
|
||
|
|
||
|
p = msg_print(sp, file_name);
|
||
|
msgq(sp, M_ERR, M("003", "File: %s"), p);
|
||
|
FREE_SPACE(sp, p, 0);
|
||
|
|
||
|
makes sure that "file_name" is printable before calling the msgq
|
||
|
routine.
|
||
|
|
||
|
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||
|
|
||
|
The message catalogs themselves are maintained in two files. The first
|
||
|
is the "base file" which contains two fields, a record number and the
|
||
|
message itself. All base files are named using the convention
|
||
|
"vi_<language>.base", e.g. the English one is "vi_english.base". For
|
||
|
example:
|
||
|
|
||
|
002 "Unable to create temporary file"
|
||
|
003 "Warning: %s is not a regular file"
|
||
|
004 "%s already locked, session is read-only"
|
||
|
005 "%s: remove"
|
||
|
006 "%s: close"
|
||
|
007 "%s: remove"
|
||
|
008 "%s: remove"
|
||
|
009 "Read-only file, not written; use ! to override"
|
||
|
010 "Read-only file, not written"
|
||
|
|
||
|
are the first few lines of the current vi_english.base file. Note that
|
||
|
message #1 is missing -- the first message of each catalog is a special
|
||
|
one, so that nvi can recognize message catalog files. It's added by the
|
||
|
Makefile script that creates the second version of the message catalog.
|
||
|
|
||
|
The second file is the file used by nvi to access messages, and is a list
|
||
|
of the messages, one per line:
|
||
|
|
||
|
VI_MESSAGE_CATALOG
|
||
|
Unable to create temporary fileX
|
||
|
Warning: %s is not a regular fileX
|
||
|
%s already locked, session is read-onlyX
|
||
|
%s: removeX
|
||
|
%s: closeX
|
||
|
%s: removeX
|
||
|
%s: removeX
|
||
|
Read-only file, not written; use ! to overrideX
|
||
|
Read-only file, not writtenX
|
||
|
|
||
|
Note that all messages have had a trailing 'X' character appended. This
|
||
|
is to provide nvi a place to store a trailing nul for the message so that
|
||
|
C library routines that expect one won't be disappointed.
|
||
|
|
||
|
These files are named for their language, e.g. "vi_english". The second
|
||
|
files are automatically created from the first files.
|
||
|
|
||
|
To create a new catalog for nvi:
|
||
|
|
||
|
Copy the file vi_english.base to a file that you can modify , e.g. "cp
|
||
|
vi_english.base vi_german.base". For each of the messages in the file,
|
||
|
replace the message with the string that you want to use. To find out
|
||
|
what the arguments to a message are, I'm afraid you'll have to search
|
||
|
the source code for the message number. You can find them fairly quickly
|
||
|
by doing:
|
||
|
|
||
|
cd ..; egrep '123\|' */*.[chys]
|
||
|
|
||
|
I'm sorry that there's not an easier way, but I couldn't think of
|
||
|
anything that wasn't a lot of work.
|
||
|
|
||
|
If, for some reason, you don't have the file vi_english.base, or you
|
||
|
have new sources for which you want to create a new base catalog, you
|
||
|
can create it by running the command "make english" in the catalog
|
||
|
directory.
|
||
|
|
||
|
Once you've translated all of the strings, then add your catalog to the
|
||
|
"CAT=" line of the Makefile, and run the command "make catalog". This
|
||
|
will create the second (and corresponding) file for each file named
|
||
|
<language>.base.
|
||
|
|
||
|
Don't worry about missing line numbers, i.e. base files that look like:
|
||
|
|
||
|
005 Message number 5.
|
||
|
007 Message number 7.
|
||
|
|
||
|
This simply means that a message was deleted during the course of nvi's
|
||
|
development. It will be taken care of automatically when you create
|
||
|
the second form of the file.
|
||
|
|
||
|
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||
|
If you add new messages to the nvi sources, you can check your work by
|
||
|
doing "make english; make check". The "make check" target lists unused
|
||
|
message numbers, duplicate message numbers, and duplicate messages.
|
||
|
Unused message numbers are only useful if you are condensing messages.
|
||
|
Duplicate message numbers are a serious problem and have to be fixed.
|
||
|
Duplicate messages are only interesting if a message appears often enough
|
||
|
that it's worth creating a routine so that the string is only need in
|
||
|
a single place.
|
||
|
|
||
|
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||
|
To select a catalog when running nvi, set the "msgcat" option. If the
|
||
|
value of this option ends with a '/', it is treated as the name of a
|
||
|
directory that contains a message catalog "vi_XXXX", where XXXX is the
|
||
|
value of the LANG environmental variable, if it's set, or the value of
|
||
|
the LC_MESSAGES environmental variable if it's not. If neither of those
|
||
|
environmental variables are set, or if the option doesn't end in a '/',
|
||
|
the option is treated as the full path name of the message catalog to use.
|
||
|
|
||
|
If any messages are missing from the catalog, the backup text (English)
|
||
|
is used instead.
|