This file documents the necessary procedure for adding a new language
to the list of languages that Wine can display system menus and forms
in.

To add a new language you need to be able to translate the relatively
few texts, of course.  You will need very little knowledge of
programming, so you have almost no excuses for not adding your language,
right?  We should easily be able to support 20 languages within a few
months, get going!  Apart from re-compilation it'll take you about an
hour.

To add a new language to the list of languages that Wine can handle
you must...

1.  Edit ./wine.man (search for -language) to show the new language
    abbreviation.

2.  Edit misc/main.c variable "Languages" to contain the new language
    abbreviation and language ID.  Also edit macro "USAGE" to show the
    new abbreviation.

3.  Edit include/options.h enum "WINE_LANGUAGE" to have a member called
    LANG_XX where XX is the new abbreviation.

4.  Edit misc/ole2nls.c function "GetUserDefaultLCID" to contain an
    extra case for your language.  The correct return values seem to
    be a mystery, but don't worry.

5.  Edit resources/sysrec.c to include "sysres_XX.h" where XX is the
    abbreviation for your language.  (That file will be produced auto-
    matically.)  Edit variable "SYSRES_Resources" to contain an entry
    for your language.

6.  Create a new file, resources/sysres_XX.rc, where XX is the
    abbreviation that you chose.  Your best bet is to copy one of the
    other *.rc files and start translating.  [Warning: the author of
    this file does not know the details of the structure of these
    files.  There seems to be no need to, however.]

    In menus, the character "&" means that the next character will
    be highlighted and that pressing that letter will select the item.
    You should place these "&"s suitably for your language, not just
    copy the positions from (say) English.  In particular, items within
    one menu should have different highlighted letters.

7.  Edit resources/Makefile.in to add the name of the new file to the
    SYSRES_SRCS variable.

8.  Edit misc/ole2nls.c function "GetLocaleInfoA" to contain a case for
    your language.

9.  Re-configure, re-make dependencies, and re-make Wine.

10. Check your new menus and forms; when they're ok, submit patches
    for inclusion in the next Wine release, see file ./ANNOUNCE for
    details about where to submit.


January 1996
Morten Welinder

[I hope I got all the places where changes are needed.  If you see any
place missing from the above list, submit a patch to this file please.
Also note that re-organization of the source code might change the list
of places.]
