%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 needs a further cleanup (real split between ii/iv).

%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}

\startmessages  dutch  library: linguals
  title: taal
      1: afbreekpatronen -- voor -- geladen (n=--,e=--,m=--)
      2: geen afbreekpatronen -- voor -- (n=--,e=--,m=--) (--,--)
      3: afbreekdefinities -- voor -- geladen (n=--,e=--,m=--)
      4: geen afbreekdefinities -- voor -- (n=--,e=--,m=--)
      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=--,e=--,m=--)
      2: no patterns -- for -- (n=--,e=--,m=--) (--,--)
      3: hyphenations -- for -- loaded (n=--,e=--,m=--)
      4: no hyphenations -- for -- (n=--,e=--,m=--)
      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=--,e=--,m=--)
      2: Keine Trennmuster -- fuer -- (n=--,e=--,m=--) (--,--)
      3: Trenndefinitionen -- fuer -- geladen (n=--,e=--,m=--)
      4: Keine Trenndefinitionen -- fuer -- (n=--,e=--,m=--)
      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=--,e=--,m=--)
      2: zadne vzory -- pro -- (n=--,e=--,m=--) (--,--)
      3: deleni slov -- pro -- nacteno (n=--,e=--,m=--)
      4: zadne deleni slov -- pro -- (n=--,e=--,m=--)
      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

\startmessages  italian  library: linguals
  title: lingua
      1: schemi -- per -- caricati (n=--,e=--,m=--)
      2: niente schemi -- per -- (n=--,e=--,m=--) (--,--)
      3: sillabazione -- per -- caricata (n=--,e=--,m=--)
      4: niente sillabazione -- per -- (n=--,e=--,m=--)
      5: schemi per -- non caricati
      6: lingua -- non definita
      7: opzioni specifiche per la lingua [--] introducono un salto --
      8: opzioni specifiche per la lingua [--] aggiunte trasparentemente
      9: lingua -- attiva
     10: schemi -- caricati
\stopmessages

\startmessages  norwegian  library: linguals
  title: sprøk
      1: orddelingsmønster -- for -- er lest inn (n=--,e=--,m=--)
      2: ingen orddelingsmønster -- for -- (n=--,e=--,m=--) (--,--)
      3: orddelingsdefinisjon -- for -- er lest inn (n=--,e=--,m=--)
      4: ingen orddelingsdefinisjon -- for -- (n=--,e=--,m=--)
      5: orddelingsmønster for -- er ikke lest inn
      6: spràk -- er udefinert
      7: spràk spesifikk opsjon [--] introduserer et -- hopp
      8: spràk spesifikk opsjon [--] problemfritt tilføyd
      9: spràk -- er aktivt
     10: orddelingsmønster -- er lest inn
\stopmessages

\startmessages  romanian  library: linguals
  title: limbi
      1: sablonul -- pentru -- s-a incarcat (n=--,e=--,m=--)
      2: nu exista sabloane -- pentru -- (n=--,e=--,m=--) (--,--)
      3: despartirea in silabe -- pentru -- s-a incarcat (n=--,e=--,m=--)
      4: nu exista despartire in silabe -- pentru -- (n=--,e=--,m=--)
      5: sabloanele pentru -- nu sunt incarcate
      6: limba -- nu este definita
      7: optiunile specifice ale limbii [--] introduc un spatiu --
      8: optiunile specifice ale limbii [--] adaugate
      9: limba -- este activa
     10: sabloanele -- incarcate
\stopmessages

\startmessages  french  library: linguals
  title: langue
      1: les motifs -- pour -- sont chargés (n=--,e=--,m=--)
      2: pas de motifs -- pour -- (n=--,e=--,m=--) (--,--)
      3: hyphenations -- pour -- chargés (n=--,e=--,m=--)
      4: pas d'hyphenations -- pour -- (n=--,e=--,m=--)
      5: les motifs pour -- ne sont pas chargés
      6: langue -- non définie
      7: les options spécifiques de langue [--] introduisent un -- saut
      8: les options spécifiques de langue [--] sont ajoutés en douceur
      9: la langue -- est active
     10: motifs -- chargés
\stopmessages

\unprotect

\ifx\nonfrenchspacing\undefined \let\nonfrenchspacing\relax \fi
\ifx\frenchspacing   \undefined \let\frenchspacing   \relax \fi

%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. Language zero has no
%D patterns, first of all because I like to start numbering
%D at one. It may come in handy for special purposes as well.

\normallanguage\zerocount \def\loadedlanguage{1}

%D \macros
%D   {currentlanguage, setupcurrentlanguage}
%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.
%D
%D \starttyping
%D \dorecurse{3}
%D   {\language[nl]
%D    \startmode[*en] english \stopmode
%D    \startmode[*nl] dutch   \stopmode
%D    \language[en]
%D    \startmode[*en] english \stopmode
%D    \startmode[*nl] dutch   \stopmode}
%D \stoptyping

\let\currentlanguage    \empty
\let\currentmainlanguage\empty

\def\setupcurrentlanguage[#1]{\setcurrentlanguage\currentmainlanguage{#1}}

\def\setcurrentlanguage#1#2% sets modes: **id (currentmain) *id (current)
  {\doifsomething{#1}
     {\ifx\currentmainlanguage\empty\else\resetsystemmode{\systemmodeprefix\currentmainlanguage}\fi
      \edef\currentmainlanguage{#1}%
      \setsystemmode{\systemmodeprefix\currentmainlanguage}}%
   \doifsomething{#2}
     {\ifx\currentlanguage\empty\else\resetsystemmode\currentlanguage\fi
      \edef\currentlanguage{#2}%
      \setsystemmode\currentlanguage}}

%D The internal macros will be defined later.

%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{installlanguage}
%D
%D When \type {state} equals \type {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 \starttyping
%D \f!languageprefix-identifier.\f!patternsextension
%D \f!languageprefix-identifier.\f!hyhensextension
%D \stoptyping
%D
%D The \type{spacing} variable 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 {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}{\complexlanguage[#2]}}%
   \expanded{\noexpand\uppercase{\noexpand\edef\noexpand\ascii{#1}}}%
   \doifundefined\ascii{\setvalue\ascii{\complexlanguage[#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
\let\preloadedpmessage\empty

\def\doshowpatterns#1#2#3#4% language number encoding mapping
  {#1->#3:#4->#2->\xxlanguageparameter{#1}\s!lefthyphenmin:\xxlanguageparameter{#1}\s!righthyphenmin\space}

\def\preloadlanguages
  {\doifsomething\preloadedpmessage{\showmessage\m!linguals{10}\preloadedpmessage}}

\fetchruntimecommand \showpatterns {\f!languageprefix\s!run}

\let\installedlanguages\empty

\def\doiflanguageelse#1{\doifdefinedelse{\??la#1\c!state}}

\ifx\mkloadlanguagefiles\undefined \let\mkloadlanguagefiles\gobbleoneargument \fi

\def\doinstalllanguage[#1][#2]% some day we will make one for mkii and mkiv
  {\doifassignmentelse{#2}
     {\doiflanguageelse{#1}
        {\getparameters[\??la#1][#2]}
        {\setvalue{\l!prefix!#1}{#1}%
         \addtocommalist{#1}\installedlanguages
         \dodoinstalllanguage{#1}{#1}%
         \getparameters
           [\??la#1]
           [\c!state=\v!stop,
            \c!default=,
            \s!patterns=,
            \s!mapping=,
            \s!encoding=,
            \s!lefthyphenmin=\defaultlanguageparameter\s!lefthyphenmin,
            \s!righthyphenmin=\defaultlanguageparameter\s!righthyphenmin,
            #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}%
      \mkloadlanguagefiles{#1}}
     {\setvalue{\l!prefix!#1}{#2}%
      \dodoinstalllanguage{#1}{#2}}}

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

\def\installlanguage
  {\dodoubleargument\doinstalllanguage}

%D Handy

\def\preloadallpatterns
  {\gdef\preloadallpatterns##1{\installlanguage[##1][\c!state=\v!start]}%
   \processcommacommand[\installedlanguages]\preloadallpatterns
   \global\let\preloadallpatterns\relax}

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

\let \patternencoding \s!default
\let \patternmapping  \s!default

\ifx\mkloadpatterns    \undefined \let\mkloadpatterns    \gobbletwoarguments \fi
\ifx\mkdoifpatternselse\undefined \let\mkdoifpatternselse\gobbletwoarguments \fi

\def\doloadpatterns  {\mkdoloadpatterns}
\def\doifpatternselse{\mkdoifpatternselse}

%D \macros
%D   {setuplanguage}
%D
%D Quick and dirty, but useful:
%D
%D \showsetup{setuplanguage}
%D
%D Beware, this command can only be used when a language is installed.

\unprotected \def\setuplanguage
  {\dodoubleempty\dosetuplanguage}

\def\dosetuplanguage[#1][#2]% handy patch for testing
  {\ifsecondargument
     \getparameters[\??la#1][#2]%
     \doif{#1}\currentlanguage\docomplexlanguage
   \else
     \getparameters[\??la\currentlanguage][#1]%
     \docomplexlanguage
   \fi}

\setuplanguage
  [\s!default]
  [\s!lefthyphenmin=2,
   \s!righthyphenmin=2,
   \c!spacing=\v!packed,
   \c!midsentence=---,
   \c!leftsentence=---,
   \c!rightsentence=---,
   \c!leftsubsentence=---,
   \c!rightsubsentence=---,
   \c!leftquote=\upperleftsinglesixquote,
   \c!rightquote=\upperrightsingleninequote,
   \c!leftquotation=\upperleftdoublesixquote,
   \c!rightquotation=\upperrightdoubleninequote,
   \c!leftspeech=\languageparameter\c!leftquotation,
   \c!middlespeech=,
   \c!rightspeech=\languageparameter\c!rightquotation,
   \c!limittext=\unknown,
   \c!date={\v!year,\ ,\v!month,\ ,\v!day},
   \c!text=Ag]

% rather new, split and per language

\setuplanguage
  [\s!default]
  [\c!compoundhyphen=\compoundhyphen,
   \c!leftcompoundhyphen=\compoundhyphen,
   \c!rightcompoundhyphen=]

%D The values \type {leftsentence} and \type
%D {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 {leftquotation} and \type {leftquote} come into view
%D \quotation {when we quote} or \quote {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{\languageparameter\c!date}

%D This command is not meant for users.

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

%D \macros
%D   {language,mainlanguage}
%D
%D Switching to another language (actually another hyphenation
%D pattern) is done with:
%D
%D \starttyping
%D \language[identifier]
%D \stoptyping
%D
%D or with \type{\identifier}. Just to be compatible with
%D \PLAIN\ \TEX, we still support the original meaning, so
%D
%D \starttyping
%D \language=1
%D \stoptyping
%D
%D is a valid operation, where the relation between number
%D and language depends on the order in installing languages.
%D
%D \showsetup{language}
%D \showsetup{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).

\ifx\synchronizepatterns        \undefined \let\synchronizepatterns\relax                         \fi
\ifx\synchronizepatternswithfont\undefined \def\synchronizepatternswithfont{\synchronizepatterns} \fi

\ifx\mksetnormallanguage\undefined \let\mksetnormallanguage\gobbletwoarguments \fi

\def\setnormallanguage{\mksetnormallanguage}

\newevery \everylanguage               \relax
\newevery \everyresetlanguagespecifics \relax

\def\disablelanguagespecifics
  {\ignorecompoundcharacter}

\def\sethyphenationvariables
  {\lefthyphenmin 0\languageparameter\s!lefthyphenmin \relax
   \righthyphenmin0\languageparameter\s!righthyphenmin\relax
   \lefthyphenmin \numexpr\lefthyphenmin +\hyphenminoffset\relax
   \righthyphenmin\numexpr\righthyphenmin+\hyphenminoffset\relax}

\def\docomplexlanguage% assumes that \currentlanguage is set
  {\edef\currentdefaultlanguage{\defaultlanguage\currentlanguage}%
   \mksetnormallanguage\currentlanguage\currentdefaultlanguage
   \the\everylanguage
   \enablelanguagespecifics[\currentlanguage]%
   \sethyphenationvariables
   \relax
   % will be definable and move to core-spa !
   \doifelse{\languageparameter\c!spacing}\v!broad
     \nonfrenchspacing\frenchspacing}

\ifx\enablelanguagespecifics\undefined \def\enablelanguagespecifics[#1]{} \fi

% The following may be a solution for the fact that one cannot
% change catcodes of characters like : and ; inside an environment.

\appendtoks
  \enablelanguagespecifics[\currentlanguage]%
\to \everystarttext

\def\complexlanguage[#1]%
  {\edef\askedlanguage{#1}%
   \ifx\askedlanguage\empty \else
     \ifcsname\l!prefix!\askedlanguage\endcsname
       \edef\askedlanguage{\csname\l!prefix!\askedlanguage\endcsname}%
       \ifx\currentlanguage\askedlanguage \else
         \setcurrentlanguage\currentmainlanguage\askedlanguage
         \docomplexlanguage
       \fi
     \else
       \showmessage\m!linguals6{#1}%
     \fi
   \fi}

\let\simplelanguage\normallanguage

\definecomplexorsimple\language

\def\mainlanguage[#1]%
  {\edef\askedlanguage{#1}%
   \ifx\askedlanguage\empty \else
     \ifcsname\l!prefix!\askedlanguage\endcsname
       \edef\askedlanguage{\csname\l!prefix!\askedlanguage\endcsname}%
       \ifx\currentmainlanguage\askedlanguage \else
         \setcurrentlanguage\askedlanguage\askedlanguage
         \docomplexlanguage
       \fi
     \fi
   \fi}

%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\csname\??la#1\c!default\endcsname
   \fi}

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

\def\languageparameter % @EA = speedup
  {\@EA\dolanguageparameter\@EA{\defaultlanguage\currentlanguage}}

\def\specificlanguageparameter#1% @EA = speedup
  {\@EA\dospecificlanguageparameter\@EA{\defaultlanguage{#1}}{#1}}

\def\xxlanguageparameter#1% @EA = speedup
  {\@EA\dolanguageparameter\@EA{\defaultlanguage{#1}}}

\def\defaultlanguageparameter#1%
  {\csname\??la\s!default#1\endcsname}

\def\dolanguageparameter#1#2%
  {\csname\??la
     \ifcsname\??la\currentlanguage#2\endcsname
       \currentlanguage
     \else\ifcsname\??la#1#2\endcsname
       \@EA\ifx\csname\??la#1#2\endcsname\empty\s!default\else#1\fi
     \else
       \s!default
     \fi\fi
   #2\endcsname}

\def\dospecificlanguageparameter#1#2#3%
  {\csname\??la
     \ifcsname\??la#2#3\endcsname
       \@EA\ifx\csname\??la#2#3\endcsname\empty\s!default\else#2\fi
     \else\ifcsname\??la#1#3\endcsname
       \@EA\ifx\csname\??la#1#3\endcsname\empty\s!default\else#1\fi
     \else
       \s!default
     \fi\fi
   #3\endcsname}

%D New (see nomarking and nolist):

\def\splitsequence#1#2%
  {\doifelse{#1}\v!no{#2}{\doifelse{#1}\v!yes{\languageparameter\c!limittext}{#1}}}

\def\splitsymbol#1%
  {\splitsequence{#1}{\languageparameter\c!limittext}}

%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   {\blank
%D    \startlinecorrection
%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    \let\normalbar=|
%D    \hbox to \hsize
%D      {\hfil\quotation{#3 #4}\hfil\quote{#2}\hfil
%D       \let|=\normalbar\strut|<||<|#3|>|#4|>|\hfil}
%D    \vskip.5em
%D    \hrule
%D    \egroup
%D    \stoplinecorrection
%D    \blank}
%D
%D \ShowLanguageValues [af] [afrikaans]  afrikaanse ...
%D \ShowLanguageValues [ca] [catalan]    catalan ...
%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 [es] [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 \placetable{The germanic languages (\type{lang-ger})}
%D \starttable[||||]
%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 \stoptable
%D \protect
%D
%D \unprotect
%D \placetable{The italic languages (\type{lang-ita})}
%D \starttable[||||]
%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!ca        \NC catalan      \NC italic    \NC\MR
%D \NC \s!es        \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 \stoptable
%D \protect
%D
%D \unprotect
%D \placetable{The slavic languages (\type{lang-sla})}
%D \starttable[||||]
%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 \stoptable
%D \protect
%D \unprotect
%D
%D \placetable{The altaic languages (\type{lang-alt})}
%D \starttable[||||]
%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 \stoptable
%D
%D \placetable{The uralic languages (\type{lang-ura})}
%D \starttable[||||]
%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 \stoptable
%D \protect

% \bgroup \normallanguage255 \patterns{} \egroup
% \def\nopatterns{\normallanguage255 }

\def\nopatterns{\normallanguage\minusone}

%D Mark plugin:

\loadmarkfile{lang-ini} % not yet

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

%D We default to english:

\setupcurrentlanguage[\s!en]

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

\appendtoks\showmessage\m!linguals9\currentlanguage\to\everyjob

\protect \endinput
