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. Currently at least the following languages are still missing: 
Bulgarian, Chinese, Greek, Icelandic, Japanese, Dutch, Polish, Portuguese,
Romanian, Russian, Croatian, Slovak, Swedish, Turkish, and Slovanian.

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 a
    case for your language by uncommenting the return value of it.

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.]
