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

\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}.

%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\installedlanguages\empty

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

\def\doloadlanguagefiles#1%
  {\doifelsevalue{\??la#1\c!state}\v!start
     {\edef\languagesuffix{\specificlanguageparameter{#1}\s!patterns}%
      \ifx\languagesuffix\empty
        \edef\languagesuffix{\defaultlanguage{#1}}%
      \else\ifx\languagesuffix\relax
        \edef\languagesuffix{\defaultlanguage{#1}}%
      \fi\fi
      \ifx\languagesuffix\empty
        \edef\languagesuffix{#1}%
      \fi
      \doifundefinedelse{\??la\??la:\currentencoding:\currentmapping:\languagesuffix}
        {\doloadpatterns{#1}\languagesuffix}
        {\bgroup
         \edef\loadedlanguage{\getvalue{\??la\??la:\currentencoding:\currentmapping:\languagesuffix}}%
        %\showmessage\m!linguals1{\languagesuffix,#1,\loadedlanguage,*,*}%
        %\showmessage\m!linguals3{\languagesuffix,#1,\loadedlanguage,*,*}%
         \egroup}}
     {\showmessage\m!linguals5{#1}}}

\def\doinstalllanguage[#1][#2]%
  {\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!start,#2]}%
      \doloadlanguagefiles{#1}}
     {\setvalue{\l!prefix!#1}{#2}%
      \getparameters[\??la#1][\s!default=#2]%
      \dodoinstalllanguage{#1}{#2}}}

\def\reallanguagetag#1%
  {\ifcsname\l!prefix!#1\endcsname\csname\l!prefix!#1\endcsname\else#1\fi}

\let\preloadedpatterns\empty
\let\preloadedpmessage\empty

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

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

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

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

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

\def\doifpatternselse#1%
  {\expanded{\doifinsetelse{#1}{\preloadedpatterns}}}

\def\doloadpatterns#1#2%
  {\edef\askedlanguageencoding{\specificlanguageparameter{#1}\s!encoding}%
   \edef\askedlanguagemapping {\specificlanguageparameter{#1}\s!mapping}%
   \expanded{\getcommacommandsize[\askedlanguageencoding]}%
   % slightly faster: \let\unicodechar\utfunihashglyph
   \ifnum\commalistsize>0
    %\message{[nofpatterns #2: \commalistsize/\askedlanguageencoding]}%
     \dorecurse\commalistsize
       {\expanded{\getfromcommacommand[\askedlanguageencoding][\recurselevel]}%
        \let\patternencoding\commalistelement
        \expanded{\getfromcommacommand[\askedlanguagemapping][\recurselevel]}%
        \let\patternmapping \commalistelement
       %\message{[patterns: #1/#2/\patternencoding/\patternmapping]}%
        \dodoloadpatterns{#1}{#2}\patternencoding\patternmapping}%
   \else
    %\message{[patterns: #1/#2]}%
     \dodoloadpatterns{#1}{#2}{}{}%
   \fi}

\ifnum\texengine=\xetexengine

    \def\doloadpatterns#1#2%
      {%\letvalue{\??la#2\s!encoding}\empty
       %\letvalue{\??la#2\s!mapping }\empty
       \dodoloadpatterns{#1}{#2}{}{}}

\fi

\def\setuphyppatencoding
  {\pathypsettings
   \enableregime[utf]}

\def\dodoloadpatterns#1#2#3#4% beware, loaded language also incr
  {\normallanguage\loadedlanguage % when not really needed
   \bgroup
   \let\synchronizepatterns\relax % needed?
   \let\enabledmapping     \empty % needed?
   \doifelsenothing{#3}{\enableencoding[\s!default]}{\enableencoding[#3]}%
   \doifelsenothing{#4}{\enablemapping [\s!default]}{\enablemapping [#4]}%
   \setuphyppatencoding
   \ifundefined{\??la\??la:\currentencoding:\currentmapping:#2}%
     \let\doshowpatterns\relax
     \edef\alreadyloadedlanguage
       {\executeifdefined{\??la\??la:\currentencoding:\currentmapping:\truefilename{\f!languageprefix#2.\f!patternsextension}}\empty}%
     \edef\alreadyloadedlanguage
       {\executeifdefined{\??la\??la:\currentencoding:\currentmapping:\f!languageprefix#2.\f!patternsextension}\alreadyloadedlanguage}%
     \ifx\alreadyloadedlanguage\empty
       \letgvalue{\??la\??la:\currentencoding:\currentmapping:#2}\loadedlanguage
       \doifundefined{\??la\??la:\s!default:\s!default:#2}{\letgvalue{\??la\??la:\s!default:\s!default:#2}\loadedlanguage}% fall back
       \startpatternloading{\truefilename{\f!languageprefix#2.\f!patternsextension}}{#3}{#4}%
         \readsysfile{\truefilename{\f!languageprefix#2.\f!patternsextension}}
           {\setxvalue{\??la#1\s!patterns}{#2}%
            \setxvalue{\??la\??la:\currentencoding:\currentmapping:\truefilename{\f!languageprefix#2.\f!patternsextension}}{\number\loadedlanguage}%
            \xdef\preloadedpmessage{\preloadedpmessage\doshowpatterns{#2}{\number\normallanguage}{\currentencoding}{\currentmapping}}%
            \doglobal\addtocommalist{#2}\preloadedpatterns
            \showmessage\m!linguals1{#2,#1,\loadedlanguage,\currentencoding,\currentmapping}}
           {\showmessage\m!linguals2{#2,#1,\loadedlanguage,\currentencoding,\currentmapping,\f!languageprefix#2.\f!patternsextension,\truefilename{\f!languageprefix#2.\f!patternsextension}}}%
       \stoppatternloading
       \startpatternloading{\truefilename{\f!languageprefix#2.\f!hyphensextension}}{#3}{#4}%
         \readsysfile{\truefilename{\f!languageprefix#2.\f!hyphensextension}}
           {\showmessage\m!linguals3{#2,#1,\loadedlanguage,\currentencoding,\currentmapping}}
           {\showmessage\m!linguals4{#2,#1,\loadedlanguage,\currentencoding,\currentmapping}}%
       \stoppatternloading
       \doglobal\increment\loadedlanguage
       % \stopencoding
     \else % optimization, introduced 2004.08.24, while sorting out changes in tl
       \letgvalue{\??la\??la:\currentencoding:\currentmapping:#2}\alreadyloadedlanguage
       \doifundefined{\??la\??la:\s!default:\s!default:#2}{\letgvalue{\??la\??la:\s!default:\s!default:#2}\loadedlanguage}% fall back
       \setxvalue{\??la#1\s!patterns}{#2}%
       \xdef\preloadedpmessage{\preloadedpmessage\doshowpatterns{#2}{[\number\alreadyloadedlanguage]}{\currentencoding}{\currentmapping}}%
       \doglobal\addtocommalist{#2}\preloadedpatterns
       \showmessage\m!linguals1{#2,#1,[\alreadyloadedlanguage],\currentencoding,\currentmapping}%
     \fi
   \fi
   \egroup}

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

%D Since we can only load patterns in ini\TeX, we nil the
%D loading before dumping (which saves a bit of memory, but
%D strangely enough not in the format).

\appendtoks
  \gdef\doloadpatterns{\doglobal\increment\loadedlanguage\gobbletwoarguments}%
  \globallet\dodoloadpatterns\gobblefourarguments
\to \everydump

%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,
   \s!patterns=,
   \c!spacing=\v!packed,
   \s!encoding=,
   \s!mapping=,
   \c!lefthyphen=,
   \c!righthyphen=-,
   \c!hyphen=-,
   \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

\def\setnormallanguage#1#2% current default
  {% called quite often, so we use \csname
   % \def\synchronizepatterns{\setnormallanguage
   %   {\csname\??la\currentlanguage\s!patterns\endcsname}}% called often
   % of even better pre-expand in an ugly way:
%    \@EA\def\@EA\synchronizepatterns\@EA{\@EA\dosetnormallanguage
%      \csname\??la\currentlanguage\s!patterns\endcsname}%
\edef\synchronizepatterns{\noexpand\dosetnormallanguage{\languageparameter\s!patterns}}%
   \donefalse
   \synchronizepatterns
   \ifdone\else
     \def\synchronizepatterns{\dosetnormallanguage\currentlanguage}%
     \synchronizepatterns
     \ifdone\else
       \ifx\currentdefaultlanguage\empty\else
%          \@EA\def\@EA\synchronizepatterns\@EA{\@EA\dosetnormallanguage
%            \csname\??la\currentdefaultlanguage\s!patterns\endcsname}%
\edef\synchronizepatterns{\noexpand\dosetnormallanguage{\specificlanguageparameter\currentdefaultlanguage\s!patterns}}%
         \synchronizepatterns
         \ifdone\else
           \dosetnormallanguage\currentdefaultlanguage
           \synchronizepatterns
         \fi
       \fi
     \fi
   \fi}

\def\dosetnormallanguage#1% #1 == \cs (no longer)
  {\dodosetnormallanguage{:\currentencoding:\currentmapping:}{#1}{%
   \dodosetnormallanguage{:\currentencoding:\s!default     :}{#1}{%
   \dodosetnormallanguage{:\s!default      :\currentmapping:}{#1}{%
   \dodosetnormallanguage{:\s!default      :\s!default     :}{#1}\empty}}}}

\def\dodosetnormallanguage#1#2%
  {\ifcsname\??la\??la#1#2\endcsname
     \edef\thenormallanguage{\csname\??la\??la#1#2\endcsname}% can be \chardef
     \ifx\thenormallanguage\empty
       \@EAEAEA\firstofoneargument
     \else
       \donetrue
       \@EA\xdef\csname\??la\currentlanguage\s!patterns\endcsname{#2}%
       \normallanguage\thenormallanguage\relax % \relax is needed for lookahead problems
       \@EAEAEA\gobbleoneargument
     \fi
   \else
     \@EA\firstofoneargument
   \fi}

\newevery \everylanguage \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}%
   \setnormallanguage\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\currentlanguage\askedlanguage
         \ifx\currentmainlanguage\askedlanguage
         \else
           \setcurrentlanguage\askedlanguage\askedlanguage
           \docomplexlanguage
         \fi
       \else
         \setcurrentlanguage\askedlanguage\askedlanguage
         \docomplexlanguage
       \fi
     \fi
   \fi}

%D \macros
%D   {defaultlanguage,languageparameter,specificlanguageparameter}

\def\defaultlanguage#1%
  {\ifcsname\??la#1\s!default\endcsname
     \expandafter\defaultlanguage\csname\??la#1\s!default\endcsname
   \else
     #1%
   \fi}

\def\languageparameter#1%
  {\ifcsname\??la\currentlanguage#1\endcsname
     \csname\??la\currentlanguage#1\endcsname
   \else\ifcsname\??la\currentlanguage\s!default\endcsname
     \expandafter\specificlanguageparameter\csname\??la\currentlanguage\s!default\endcsname{#1}%
   \else\ifcsname\??la\s!default#1\endcsname
     \csname\??la\s!default#1\endcsname
   \fi\fi\fi}

\def\specificlanguageparameter#1#2%
  {\ifcsname\??la#1#2\endcsname
     \csname\??la#1#2\endcsname
   \else\ifcsname\??la#1\s!default\endcsname
     \expandafter\specificlanguageparameter\csname\??la#1\s!default\endcsname{#2}%
   \else\ifcsname\??la\s!default#2\endcsname
     \csname\??la\s!default#2\endcsname
   \fi\fi\fi}

%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 [cs] [czech]      tjechisch tex
%D \ShowLanguageValues [cs] [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 [nb] [bokmal]     noorse zalm
%D \ShowLanguageValues [nn] [nnynorsk]   noorse zalm
%D \ShowLanguageValues [pl] [polish]     poolse vlag
%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!nb        \NC bokmal       \NC germanic  \NC\LR
%D \NC \s!nn        \NC nynorsk      \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!cs        \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 \XETEX\ is \UNICODE:

\ifnum\texengine=\xetexengine

    \def\synchronizepatternswithfont{}
    \def\doloadpatterns         #1#2{\dodoloadpatterns{#1}{#2}\s!default\s!default}
    \def\dosetnormallanguage      #1{\dodosetnormallanguage{:\s!default:\s!default:}{#1}\empty}
    \def\setuphyppatencoding        {\pathypsettings}

\fi

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

\def\initializemainlanguage
  {\mainlanguage[\currentlanguage]%
   \showmessage\m!linguals9\currentlanguage}

\protect \endinput
