%D \module
%D   [       file=lang-ini,
%D        version=1996.01.25,
%D          title=\CONTEXT\ Language Macros,
%D       subtitle=Initialization,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for 
%C details. 

%D This module implements the (for the moment still simple)
%D multi||language support of \CONTEXT, which should not be
%D confused with the multi||lingual interface. This support
%D will be extended when needed.

\writestatus{loading}{Context Language Macros / Initialization}

\unprotect

\startmessages  dutch  library: linguals
  title: taal
      1: afbreekpatronen -- voor -- geladen (n=--)
      2: geen afbreekpatronen -- voor -- (n=--)
      3: afbreekdefinities -- voor -- geladen (n=--)
      4: geen afbreekdefinities -- voor -- (n=--)
      5: afbreekpatronen voor -- niet geladen
      6: taal -- is niet gedefinieerd
      7: taal specifieke opties [--] introduceren een skip van --
      8: taal specifieke opties [--] naadloos toegevoegd
      9: taal -- is actief
     10: patronen --geladen 
\stopmessages

\startmessages  english  library: linguals
  title: language
      1: patterns -- for -- loaded (n=--)
      2: no patterns -- for -- (n=--)
      3: hyphenations -- for -- loaded (n=--)
      4: no hyphenations -- for -- (n=--)
      5: patterns for -- not loaded
      6: language -- is undefined
      7: language specific options [--] introduce a -- skip
      8: language specific options [--] seamless appended
      9: language -- is active
     10: patterns --loaded
\stopmessages

\startmessages  german  library: linguals
  title: Sprache
      1: Trennmuster -- fuer -- geladen (n=--)
      2: Keine Trennmuster -- fuer -- (n=--)
      3: Trenndefinitionen -- fuer -- geladen (n=--)
      4: Keine Trenndefinitionen -- fuer -- (n=--)
      5: Trennmuster fuer -- nicht geladen
      6: Sprache -- ist undefiniert
      7: Sprachenspezifische Option [--] fuegt eine Luecke von -- ein
      8: Sprachenspezifische Option [--] nahtlos hinzugefuegt
      9: Sprache -- ist aktiv
     10: Trennmuster --geladen  
\stopmessages

% TOM: 9 and 10 

\startmessages  czech  library: linguals
  title: jazyky
      1: vzory -- pro -- nacteny (n=--)
      2: zadne vzory -- pro -- (n=--)
      3: deleni slov -- pro -- nacteno (n=--)
      4: zadne deleni slov -- pro -- (n=--)
      5: vzory pro -- nenacteny
      6: jazyk -- neni definovan
      7: specificke volby jazyka [--] zavadeji -- (zavlecenou) mezeru
      8: specificke volby jazyka [--] bez mezer pripojeny
      9: language -- is active
     10: vzory --nacteny 
\stopmessages

% dutch   : \lccode`\'=`\'
% english : \lccode`\'=0
% german  : \lccode`\'=`\'
% french  : \lccode`\'=`\'
% czech   : \lccode`\'=`\'

%D When loading hyphenation patterns, \TEX\ assign a number to
%D each loaded table, starting with~0. Switching to a specific
%D table is done by assigning the relevant number to the
%D predefined \COUNTER\ \type{\language}. Unfortunately the
%D name of this command suits very well the name of the
%D language switching command we are to define, so let's save
%D this primitive under another name:

\let\normallanguage = \language

%D We keep track of the last loaded patterns by means of a
%D pseudo \COUNTER. This just one of those situations in which
%D we don't want to spent a real one.

\newcounter\loadedlanguage

%D \macros
%D   {currentlanguage, setcurrentlanguage}
%D
%D Instead of numbers,we are going to use symbolic names for
%D the languages. The current langage is saved in the macro
%D \type {\currentlanguage}. The setup macro is mainly used 
%D for cosmetic purposes. 

\let\currentlanguage=\empty

\def\setupcurrentlanguage[#1]%
  {\edef\currentlanguage{#1}} 

%D \macros
%D   {installlanguage}
%D
%D Hyphenation patterns can only be loaded when the format file
%D is prepared. The next macro takes care of this loading. A
%D language is specified with
%D
%D \showsetup{\y!installlanguage}
%D
%D When \type{\c!status} equals \type{\v!start}, both patterns
%D and additional hyphenation specifications are loaded. These
%D files are seached for on the system path and are to be
%D named:
%D
%D \starttypen
%D \f!languageprefix-identifier.\f!patternsextension
%D \f!languageprefix-identifier.\f!hyhensextension
%D \stoptypen
%D
%D The \type{\c!spatiering} specifies how the spaces after
%D punctuation has to be handled. English is by tradition more
%D tolerant to inter||sentence spacing than other languages.
%D
%D This macro also defines \type{\identifier} as a shortcut
%D switch to the language. Furthermore the command defined as
%D being language specific, are executed. With
%D \type{\c!default} we can default to another language
%D (patterns) at format generation time. This default language
%D is overruled when the appropriate patterns are loaded (some
%D implementations support run time addition of patterns to a
%D preloaded format).

\def\dodoinstalllanguage#1#2% #2 added 
  {\doifundefined{#1}{\setvalue{#1}{\language[#2]}}%
   \expanded{\noexpand\uppercase{\noexpand\edef\noexpand\ascii{#1}}}%
   \doifundefined{\ascii}{\setvalue{\ascii}{\language[#2]}}}      

%D \macros
%D   {preloadlanguages}
%D
%D We first try to load the files defined as file synonym 
%D for \type {lang-*.pat} and \type {lang-*.hyp}. After that we
%D fall back on those files. The macro \type {\preloadpatterns} 
%D reports which patterns are loaded and what hyphenmin 
%D values are set. 

\let\preloadedpatterns\empty

\def\showpatterns#1%
  {\getvalue{\??la#1\s!lefthyphenmin}%
   -#1-%
   \getvalue{\??la#1\s!righthyphenmin} }

\def\preloadlanguages% 
  {\doifsomething{\preloadedpatterns}
     {\showmessage{\m!linguals}{10}{\preloadedpatterns}}}

\def\doinstalllanguage[#1][#2]%
  {\ConvertConstantAfter\doifinstringelse{=}{#2}
     {\doifdefinedelse{\??la#1\c!status}
        {\getparameters[\??la#1][#2]}
        {\setvalue{\l!prefix!#1}{#1}%
         \dodoinstalllanguage{#1}{#1}%
         \getparameters
           [\??la#1]
           [\s!lefthyphenmin=2,
            \s!righthyphenmin=2,
            \c!spatiering=\v!opelkaar,
            \c!leftsentence=---,
            \c!rightsentence=---,
            \c!leftsubsentence=---,
            \c!rightsubsentence=---,
            \c!leftquote=\upperleftsinglesixquote,
            \c!rightquote=\upperrightsingleninequote,
            \c!leftquotation=\upperleftdoublesixquote,
            \c!rightquotation=\upperrightdoubleninequote,
            \c!datum={\v!jaar,\ ,\v!maand,\ ,\v!dag},
            \c!status=\v!stop,
            \c!default=,
            \s!patterns=,
            \s!mapping=,
            \s!encoding=,
            #2]%
         \doifvaluesomething{\??la#1\c!default}
           {\doifnotvalue{\??la#1\c!default}{#1}
              {\getparameters
                 [\??la#1]
                 [\s!lefthyphenmin=\languagedefault{#1}\s!lefthyphenmin,
                  \s!righthyphenmin=\languagedefault{#1}\s!righthyphenmin,
                  \c!spatiering=\languagedefault{#1}\c!spatiering,
                  \c!leftsentence=\languagedefault{#1}\c!leftsentence,
                  \c!rightsentence=\languagedefault{#1}\c!rightsentence,
                  \c!leftsubsentence=\languagedefault{#1}\c!leftsubsentence,
                  \c!rightsubsentence=\languagedefault{#1}\c!rightsubsentence,
                  \c!leftquote=\languagedefault{#1}\c!leftquote,
                  \c!rightquote=\languagedefault{#1}\c!rightquote,
                  \c!leftquotation=\languagedefault{#1}\c!leftquotation,
                  \c!rightquotation=\languagedefault{#1}\c!rightquotation,
                  \c!datum=\languagedefault{#1}\c!datum,
                  \s!mapping=\languagedefault{#1}\s!mapping,
                  \s!encoding=\languagedefault{#1}\s!encoding,
                  #2]}}}%
      \doifvalue{\??la#1\c!default}{#1}{\letvalue{\??la#1\c!default}\empty}%
% loop in deo
% \doifvalue{\??la#1\s!patterns}{#1}{\letvalue{\??la#1\c!default}\empty}%
%
      \doifelsevalue{\??la#1\c!status}{\v!start}
        {\doifelsevaluenothing{\??la#1\s!patterns}
           {\edef\languagesuffix{#1}}
           {\edef\languagesuffix{\getvalue{\??la#1\s!patterns}}}%
         \doifundefinedelse{\??la\??la\languagesuffix}
           {\normallanguage=\loadedlanguage
            \letvalue{\??la\??la\languagesuffix}=\loadedlanguage
            \bgroup
            \scratchtoks=\everyjob % we don't want additional junk put there
            \let\showpatterns\relax
            \startencoding[\getvalue{\??la\languagesuffix\s!encoding}]%
            \enablemapping[\getvalue{\??la\languagesuffix\s!mapping}]%
\startreadingfile
\let\dohandleaccent\donthandleaccent % no checking done
            \readsysfile{\truefilename{\f!languageprefix\languagesuffix.\f!patternsextension}}
              {\setxvalue{\??la#1\s!patterns}{\languagesuffix}%
               \xdef\preloadedpatterns{\preloadedpatterns\showpatterns{\languagesuffix}}%
               \showmessage{\m!linguals}{1}{\languagesuffix,#1,\loadedlanguage}}
              {\readsysfile{\f!languageprefix\languagesuffix.\f!patternsextension}
                 {\setxvalue{\??la#1\s!patterns}{\languagesuffix}%
                  \xdef\preloadedpatterns{\preloadedpatterns\showpatterns{\languagesuffix}}%
                  \showmessage{\m!linguals}{1}{\languagesuffix,#1,\loadedlanguage}}
                 {\showmessage{\m!linguals}{2}{\languagesuffix,#1,\loadedlanguage}}}%
            \readsysfile{\truefilename{\f!languageprefix\languagesuffix.\f!hyphensextension}}
              {\showmessage{\m!linguals}{3}{\languagesuffix,#1,\loadedlanguage}}
              {\readsysfile{\f!languageprefix\languagesuffix.\f!hyphensextension}
                 {\showmessage{\m!linguals}{3}{\languagesuffix,#1,\loadedlanguage}}
                 {\showmessage{\m!linguals}{4}{\languagesuffix,#1,\loadedlanguage}}}%
\stopreadingfile
            \stopencoding
            \global\everyjob=\scratchtoks
            \egroup
            \increment\loadedlanguage}
           {\bgroup
            \edef\loadedlanguage{\getvalue{\??la\??la\languagesuffix}}%
            \showmessage{\m!linguals}{1}{\languagesuffix,#1,\loadedlanguage}%
            \showmessage{\m!linguals}{3}{\languagesuffix,#1,\loadedlanguage}%
            \egroup}}
        {\showmessage{\m!linguals}{5}{#1}}}
     {\setvalue{\l!prefix!#1}{#2}% 
      \dodoinstalllanguage{#1}{#2}}}

% ^^ \language[#1] gave unwanted side effect of loading language specifics 

\def\installlanguage%
  {\dodoubleargument\doinstalllanguage}

%D When the second argument is a language identifier, a 
%D synonym is created. This feature is present because we 
%D used dutch mnemonics in the dutch version, but nowadays 
%D conform a standard.  

%D \macros 
%D   {setuplanguage}
%D
%D Quick and dirty, but useful: 
%D
%D \showsetup{\y!setuplanguage}

\def\setuplanguage[#1]%
  {\dodoubleargument\getparameters[\??la#1]}

%D The values \type {\c!leftsentence} and \type
%D {\c!rightsentence} can be (and are) used to implement
%D automatic subsentence boundary glyphs, like in {\fr
%D |<|french guillemots|>|} or {\de |<|german guillemots|>|} or
%D {\nl |<|dutch dashes|>|} like situations. Furthermore \type
%D {\c!leftquotation} and \type {\c!leftquote} come into view
%D \citaat {when we quote} or \citeer {quote} something.

%D \macros
%D  {currentdatespecification}
%D
%D Just to make things easy we can ask for the current date
%D specification by saying:

\def\currentdatespecification%
  {\getvalue{\??la\currentlanguage\c!datum}}

%D This command is not meant for users.

%D Carefull reading of these macros shows that it's legal to
%D say
%D
%D \starttypen
%D \installlanguage [du] [de]
%D \stoptypen

%D \macros
%D   {language,mainlanguage}
%D
%D Switching to another language (actually another hyphenation
%D pattern) is done with:
%D
%D \starttypen
%D \language[identifier]
%D \stoptypen
%D
%D or with \type{\identifier}. Just to be compatible with
%D \PLAIN\ \TEX, we still support the original meaning, so
%D
%D \starttypen
%D \language=1
%D \stoptypen
%D
%D is a valid operation, where the relation between number
%D and language depends on the order in installing languages. 
%D
%D \showsetup{\y!language}
%D \showsetup{\y!mainlanguage}
%D
%D Both commands take a predefined language identifier as
%D argument. We can use \type{\mainlanguage[identifier]} for
%D setting the (indeed) main language. This is the language
%D used for translating labels like {\em figure} and {\em
%D table}. The main language defaults to the current language.
%D
%D We take care of local as well as standardized language
%D switching (fr and fa, de and du, but nl and nl).

\def\setnormallanguage#1#2%
  {\doifdefined{\??la\??la#2}{\doifvaluesomething{\??la\??la#2}
     {\donetrue
      \setxvalue{\??la#1\s!patterns}{#2}%
      \normallanguage=\getvalue{\??la\??la#2}}}} 
    
\def\docomplexlanguage[#1]%
  {\donefalse
   \setnormallanguage{#1}{\getvalue{\??la#1\s!patterns}}%
   \ifdone\else
     \setnormallanguage{#1}{#1}%
     \ifdone\else
       \doifvaluesomething{\??la#1\c!default}
         {\setnormallanguage{#1}{\getvalue{\??la\defaultlanguage{#1}\s!patterns}}%
          \ifdone\else
            \setnormallanguage{#1}{\defaultlanguage{#1}}%
          \fi}%
     \fi
   \fi          
   \edef\currentlanguage{#1}%
   \enablelanguagespecifics[#1]%
   \enablemapping[\getvalue{\??la#1\s!mapping}]%
   \lefthyphenmin =0\getvalue{\??la#1\s!lefthyphenmin}\relax
   \righthyphenmin=0\getvalue{\??la#1\s!righthyphenmin}\relax
   \processaction
     [\getvalue{\??la#1\c!spatiering}]
     [\v!opelkaar=>\frenchspacing,
          \v!ruim=>\nonfrenchspacing,
       \s!unknown=>\frenchspacing]}

\def\complexlanguage[#1]%
  {\doifdefinedelse{\l!prefix!#1}
     {\expanded{\docomplexlanguage[\getvalue{\l!prefix!#1}]}}
     {\showmessage{\m!linguals}{6}{#1}}}

\def\simplelanguage%
  {\normallanguage}

\definecomplexorsimple\language

\let\currentmainlanguage=\empty

%\def\mainlanguage[#1]%
%  {\edef\currentmainlanguage{#1}} % We expand indeed!

\def\mainlanguage[#1]%
  {\doifsomething{#1}
     {\doifdefined{\l!prefix!#1}
        {\@EA\let\@EA\currentmainlanguage\csname\l!prefix!#1\endcsname
         \language[#1]}}}

%D \macros
%D   {defaultlanguage,languagedefault}
%D
%D The macro \type {\defaultlanguage{id}} expands into the 
%D default language, when defined, while \type 
%D {\languagedefault{id}\c!parameter} returns the default's 
%D parameter. 

\def\defaultlanguage#1%
  {\@EA\ifx\csname\??la#1\c!default\endcsname\empty
     #1%
   \else
     \@EA\defaultlanguage\@EA{\csname\??la#1\c!default\endcsname}%
   \fi}

\def\languagedefault#1#2% 
  {\csname\??la\defaultlanguage{#1}#2\endcsname}

%D \macros
%D   {startlanguagespecifics,enablelanguagespecifics}
%D
%D Each language has its own typographic pecularities. Some of
%D those can be influenced by parameters, others are handled by
%D the interface, but as soon as specific commands come into
%D view we need another mechanism. In the macro that activates
%D a language, we call \type{\enablelanguagespecifics}. This
%D macro in return calls for the setup of language specific
%D macros. Such specifics are defined as:
%D
%D \starttypen
%D \startlanguagespecifics[de]
%D   \installcompoundcharacter "a {\"a}
%D   \installcompoundcharacter "e {\"e}
%D   \installcompoundcharacter "s {\SS}
%D \stoplanguagespecifics
%D \stoptypen
%D
%D Instead of \type{[du]} we can pass a comma separated
%D list, like \type{[du,nl]}. Next calls to this macro add the
%D specifics to the current list.
%D
%D Before we actually read the specifics, we first take some
%D precautions that will prevent spurious spaces to creep into
%D the list.

\def\startlanguagespecifics%                % we use double to 
  {\bgroup
   \catcode`\^^I=\@@ignore
   \catcode`\^^M=\@@ignore
   \catcode`\^^L=\@@ignore
   \dodoubleempty\dostartlanguagespecifics} % get rid of spaces

%D The main macro looks quite complicated but actually does
%D nothing special. By embedding \type{\do} we can easily
%D append to the lists and also execute them at will. Just to
%D be sure, we check on spurious spaces.

\def\languageencoding%
  {\ifx\characterencoding\nocharacterencoding \else
     \characterencoding-%
   \fi}

\long\def\dostartlanguagespecifics[#1][#2]#3\stoplanguagespecifics%
  {\egroup
   \long\def\docommando##1%
     {\doifdefinedelse{\??la\languageencoding##1\??la}
        {\long\def\do####1####2####3%
           {\setvalue{\??la\languageencoding####1\??la}{\do{####1}{####2####3}}}%
         \getvalue{\??la\languageencoding##1\??la}{#3}}
        {\setvalue{\??la\languageencoding##1\??la}{\do{##1}{#3}}}%
      \bgroup
      \setbox0=\hbox{\enablelanguagespecifics[##1]}%
      \ifdim\wd0>\!!zeropoint
        \showmessage{\m!linguals}{7}{\currentencoding-##1,\the\wd0\space}\wait
      \else
        \showmessage{\m!linguals}{8}{\currentencoding-##1}%
      \fi
      \egroup
      \doif{##1}{\currentmainlanguage}
        {\enablelanguagespecifics[##1]}}%
   \processcommalist[#1]\docommando}

%D Enabling them is rather straightforward. We only have to
%D define \type{\do} in such a way that \type{{ }} is removed
%D and the language key is gobbled.

\def\enablelanguagespecifics[#1]%
  {\long\def\do##1##2{##2}%
   \doifvaluesomething{\??la#1\c!default}
     {\getvalue{\??la\getvalue{\??la#1\c!default}\??la}%
      \getvalue{\??la\languageencoding\getvalue{\??la#1\c!default}\??la}}%
   % or 
   %\doifvaluesomething{\??la#1\c!default}
   %  {\expanded{\enablelanguagespecifics[\getvalue{\??la#1\c!default}]}}%
   \getvalue{\??la#1\??la}%
   \getvalue{\??la\languageencoding#1\??la}}

%D \macros
%D   {leftguillemot,rightguillemot,leftsubguillemot,rightsubguillemot,
%D    ...single...quote,...double...quote}
%D
%D We assign logical names to all kind of quote and sentence
%D boundary characters.
%D
%D When using Computer Modern Roman, the next definitions 
%D looks a bit better than the default ligatures. 
%D 
%D \starttypen
%D \def\lowerleftsingleninequote  {,}
%D \def\lowerleftdoubleninequote  {,\kern-.1em,}
%D \def\upperleftsingleninequote  {'}
%D \def\upperleftdoubleninequote  {''\kern-.1em}
%D \def\upperleftsinglesixquote   {`}
%D \def\upperleftdoublesixquote   {`\kern-.1em`}
%D 
%D \def\lowerrightsingleninequote {,}
%D \def\lowerrightdoubleninequote {,\kern-.1em,}
%D \def\upperrightsingleninequote {'}
%D \def\upperrightdoubleninequote {''}
%D \def\upperrightsinglesixquote  {`}
%D \def\upperrightdoublesixquote  {\kern-.125em``}
%D \stoptypen
%D
%D But in other fonts, these definitions can give problems, so
%D we just say:

\def\lowerleftsingleninequote  {,}
\def\lowerleftdoubleninequote  {,,}
\def\upperleftsingleninequote  {'}
\def\upperleftdoubleninequote  {''}
\def\upperleftsinglesixquote   {`}
\def\upperleftdoublesixquote   {``}

\def\lowerrightsingleninequote {,}
\def\lowerrightdoubleninequote {,,}
\def\upperrightsingleninequote {'}
\def\upperrightdoubleninequote {''}
\def\upperrightsinglesixquote  {`}
\def\upperrightdoublesixquote  {``}

%D Yes I know, they are ugly: 

\def\leftguillemot%
  {\dontleavehmode\hbox{\raise.25ex\hbox{$\scriptscriptstyle\ll$}}}

\def\rightguillemot%
  {\hbox{\raise.25ex\hbox{$\scriptscriptstyle\gg$}}}

\def\leftsubguillemot%
  {\dontleavehmode\hbox{\raise.25ex\hbox{$\scriptscriptstyle<$}}}

\def\rightsubguillemot%
  {\hbox{\raise.25ex\hbox{$\scriptscriptstyle>$}}}

%D Just like with subsentence boundary symbols, quotes
%D placement depends on the current language, therefore we show
%D the defaults here.
%D
%D \def\ShowLanguageValues [#1] [#2] #3 #4
%D   {\blanko
%D    \startregelcorrectie
%D    \vbox\bgroup
%D    \language[#1]%
%D    \setbox0=\hbox to \hsize{\hss\bf#2 subsentence symbol and quotes\hss}
%D    \dp0=0pt
%D    \box0
%D    \vskip.5em
%D    \hrule
%D    \vskip.5em
%D    \hbox to \hsize
%D      {\hfil\citaat{#3 #4}\hfil\citeer{#2}\hfil\strut|<||<|#3|>|#4|>|\hfil}
%D    \vskip.5em
%D    \hrule
%D    \egroup
%D    \stopregelcorrectie
%D    \blanko}
%D
%D \ShowLanguageValues [af] [afrikaans]  afrikaanse ...
%D \ShowLanguageValues [cz] [czech]      tjechisch tex  
%D \ShowLanguageValues [cz] [slovak]     slowaakse ... 
%D \ShowLanguageValues [da] [danish]     deense ...
%D \ShowLanguageValues [de] [german]     duitse degelijkheid
%D \ShowLanguageValues [en] [english]    engelse humor
%D \ShowLanguageValues [fi] [finnish]    finse ...
%D \ShowLanguageValues [fr] [french]     franse slag
%D \ShowLanguageValues [it] [italian]    italiaanse ...
%D \ShowLanguageValues [la] [latin]      latijnse missen 
%D \ShowLanguageValues [nl] [dutch]      nederlandse zuinigheid
%D \ShowLanguageValues [no] [norwegian]  noorse ...
%D \ShowLanguageValues [pl] [polish]     poolse ...
%D \ShowLanguageValues [pt] [portuguese] portugese ...
%D \ShowLanguageValues [sp] [spanish]    spaans benauwd
%D \ShowLanguageValues [sv] [swedish]    zweedse ...
%D \ShowLanguageValues [tr] [turkish]    turks fruit

%D We support a lot of languages. These are specified and 
%D loaded in separate files, according to their roots. Here 
%D we only take care of (postponed) setting of the current 
%D language. 
%D 
%D \unprotect
%D \plaatstabel{The germanic languages (\type{lang-ger})}
%D \starttabel[||||]
%D \HL 
%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC\SR
%D \HL 
%D \NC \s!nl        \NC dutch        \NC germanic  \NC\FR  
%D \NC \s!en        \NC english      \NC germanic  \NC\MR  
%D \NC \s!de        \NC german       \NC germanic  \NC\MR    
%D \NC \s!da        \NC danish       \NC germanic  \NC\MR    
%D \NC \s!sv        \NC swedish      \NC germanic  \NC\MR    
%D \NC \s!af        \NC afrikaans    \NC germanic  \NC\MR    
%D \NC \s!no        \NC norwegian    \NC germanic  \NC\LR    
%D \HL 
%D \stoptabel
%D \protect
%D 
%D \unprotect
%D \plaatstabel{The italic languages (\type{lang-ita})}
%D \starttabel[||||]
%D \HL 
%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC\SR
%D \HL 
%D \NC \s!fr        \NC french       \NC italic    \NC\FR
%D \NC \s!sp        \NC spanish      \NC italic    \NC\MR    
%D \NC \s!it        \NC italian      \NC italic    \NC\MR    
%D \NC \s!la        \NC latin        \NC italic    \NC\MR    
%D \NC \s!pt        \NC portuguese   \NC italic    \NC\LR    
%D \HL 
%D \stoptabel
%D \protect
%D 
%D \unprotect
%D \plaatstabel{The slavic languages (\type{lang-sla})}
%D \starttabel[||||]
%D \HL 
%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC\SR
%D \HL 
%D \NC \s!pl        \NC polish       \NC slavic    \NC\FR    
%D \NC \s!cz        \NC czech        \NC slavic    \NC\MR    
%D \NC \s!sk        \NC slavik       \NC slavic    \NC\LR    
%D \HL 
%D \stoptabel
%D \protect
%D \unprotect
%D 
%D \plaatstabel{The altaic languages (\type{lang-alt})}
%D \starttabel[||||]
%D \HL 
%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC\SR
%D \HL 
%D \NC \s!tr        \NC turkish      \NC altaic    \NC\SR    
%D \HL 
%D \stoptabel
%D
%D \plaatstabel{The uralic languages (\type{lang-ura})}
%D \starttabel[||||]
%D \HL 
%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC\SR
%D \HL 
%D \NC \s!fi        \NC finnish      \NC uralic    \NC\SR    
%D \HL 
%D \stoptabel
%D \protect

%D We default to the language belonging to the interface. This
%D is one of the few places outside the interface modules where
%D \type{\startinterface} is used. 

\let\normaldoublequote ="
\let\normalforwardslash=/

%D We default to english: 

\setupcurrentlanguage[\s!en]

\appendtoks\mainlanguage[\currentlanguage]\to\everyjob

\appendtoks\showmessage{\m!linguals}{9}{\currentlanguage}\to\everyjob

\protect

\endinput
