\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{polyglossia}[2015/03/25 v1.42.4
  Alternative to Babel for XeLaTeX and LuaLaTeX]
\RequirePackage{etoolbox}
\RequirePackage{makecmds}
\RequirePackage{xkeyval}[2008/08/13]
% Will raise error if used with anything else than XeTeX or LuaTeX
\RequirePackage{fontspec}[2010/06/08]% v2.0
% Ironically, ifluatex.sty is included by some other package if we run
% LuaTeX, but it's not if we run XeTeX, and we need it to know which of
% the two engines it is!  Hence we include it here.
\RequirePackage{ifluatex}
% For symmetry with ifluatex
\RequirePackage{ifxetex}
% fontspec now uses LaTeX3 packages such as expl3, so we need this:
\ExplSyntaxOn

%% This is for compatibility with Babel-aware package:
\cslet{ver@babel.sty}{\@empty} % this "fakes" babel
\def\languageshorthands#1{\relax} %this is for scrlttr2 class
\AtEndPreamble{\let\bbl@set@language\xpg@set@language} %for biblatex
\AtEndPreamble{\let\bbl@main@language\xpg@main@language} %for biblatex

\ifluatex
  \RequirePackage{luatexbase} % already included by fontspec, but needed here
  \RequireLuaModule{polyglossia}
\fi

% Useful for getting list of loaded languages and variants. Like babel's bbl@loaded
\let\xpg@loaded\@empty
\let\xpg@vloaded\@empty

%% custom message macros
\providecommand*{\xpg@error}[1]{%
   \PackageError{polyglossia}{#1}{}%
}

\providecommand*{\xpg@warning}[1]{%
   \PackageWarning{polyglossia}{#1}%
}

\providecommand*{\xpg@info}[1]{%
   \PackageInfo{polyglossia}%
   {#1\@gobble}%
} %% the \@gobble is to prevent displaying the line nr

%TODO change all instances of \xpg@nopatterns in gloss-*.ldf files
\providecommand*{\xpg@nopatterns@fallback}[2][nohyphenation]{%
   \xpg@warning{No~ hyphenation~ patterns~ were~ loaded~ for~ `#2'\MessageBreak
         I~ will~ use~ \string\language=\string\l@ #1\space instead}%
   \expandafter\adddialect\csname l@#2\expandafter\endcsname\csname l@#1\endcsname\relax}

\providecommand*{\xpg@nopatterns}[1]{%
   \xpg@warning{No~ hyphenation~ patterns~ were~ loaded~ for~ `#1'\MessageBreak
         I~ will~ use~ \string\language=\string\l@nohyphenation\space instead}%
   %%TODO? \expandafter\adddialect\csname l@#1\endcsname\l@nohyphenation\relax
   }

\def\xpg@ill@value#1#2{%
  \xpg@warning{Illegal~ value~ (#1)~ for~ #2}}

%% use macro if defined, else warn that it is not
\def\csuse@warn#1{%
   \ifcsundef{#1}{\xpg@warning{ \expandafter\string\csname #1\endcsname\space is~ not~ defined}}%
   {\csname #1\endcsname}}

%% ensure directionality if bidi is loaded, else ignore
\def\@@ensure@dir#1{\ifcsundef{@ensure@dir}{#1}{\@ensure@dir{#1}}}
\def\@@ensure@maindir#1{\ifcsundef{@ensure@maindir}{#1}{\@ensure@maindir{#1}}}

%% Used by the language definitions files for right-to-left languages
\def\RequireBidi{%
  \ifxetex
    \RequirePackage{bidi}
  \else\ifluatex
    \RequirePackage{luabidi}
  \else
    \xpg@warning{You’re running a TeX engine that is not LuaTeX or XeTeX.\MessageBreak
That is almost guaranteed to cause problems.}
  \fi\fi}

%% compatibility with babel
\let\addto\gappto% gappto is defined in etoolbox

%% == Utility macros ==
%%   They are needed because \MakeUppercase and \MakeLowercase are protected,
%%   but we need to change case while defining csnames when setting up fonts for
%%   non-Latin scripts. For instance with "Script=Arabic" we need to lowercase
%%   "Arabic" to create \arabicfont.
\def\xpg@uppercasefirst#1{\expandafter\xpg@@uppercasefirst #1}
\def\xpg@@uppercasefirst#1{%
       \if a#1A\else
       \if b#1B\else
       \if c#1C\else
       \if d#1D\else
       \if e#1E\else
       \if f#1F\else
       \if g#1G\else
       \if h#1H\else
       \if i#1I\else
       \if j#1J\else
       \if k#1K\else
       \if l#1L\else
       \if m#1M\else
       \if n#1N\else
       \if o#1O\else
       \if p#1P\else
       \if q#1Q\else
       \if r#1R\else
       \if s#1S\else
       \if t#1T\else
       \if u#1U\else
       \if v#1V\else
       \if w#1W\else
       \if x#1X\else
       \if y#1Y\else
       \if z#1Z\else
       \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
}

\def\xpg@lowercasefirst#1{\expandafter\xpg@@lowercasefirst #1}
\def\xpg@@lowercasefirst#1{%
       \if A#1a\else
       \if B#1b\else
       \if C#1c\else
       \if D#1d\else
       \if E#1e\else
       \if F#1f\else
       \if G#1g\else
       \if H#1h\else
       \if I#1i\else
       \if J#1j\else
       \if K#1k\else
       \if L#1l\else
       \if M#1m\else
       \if N#1n\else
       \if O#1o\else
       \if P#1p\else
       \if Q#1q\else
       \if R#1r\else
       \if S#1s\else
       \if T#1t\else
       \if U#1u\else
       \if V#1v\else
       \if W#1w\else
       \if X#1x\else
       \if Y#1y\else
       \if Z#1z\else
       \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
}

%% NEW EXPERIMENTAL SETUP INTERFACE FOR GLOSS FILES
%% options currently available:
%% language : the name of the language (as understood by fontspec)
%% hyphennames : the different hyphenation patterns to try (comma separated list)
%%%   TODO: if pattern is prefixed by !, then it should be loaded as a fallback, with \xpg@nopatterns@fallback - i.e. with a warning: e.g. sanskrit for hindi, or catalan for asturian. – Also for languages with variants!  (English and German, etc.)
%% script : the name of the script (as understood by fontspec) – default is Latin
%% direction : the direction of the script: LR or RL
%% scripttag : the OpenType tag for the script
%% langtag : the OpenType tag for the language
%% hyphenmins : the hyphenmins for this language (comma-sep list of two integers)
%% frenchspacing : boolean
%% indentfirst : boolean
%% fontsetup : boolean
%% TODO: nouppercase : boolean (for scripts like Arabic, Devanagari, etc which have no concept of uppercase/lowercase)
%% TODO: localalph = {<alph_csname>,<Alph_csname>}
%% TODO: localnumber = <csname>
%%       or even better localdigits = {0123456789} for fully automatic setup

\newif\if@xpg@language@really@defined@
\newcommand*\PolyglossiaSetup[2]{%
  %define booleans etoolbox style and set defaults
  %% TODO ? \providetoggle{#1@setup@done}%
  \providetoggle{#1@RL}%
  \providetoggle{#1@latin}\toggletrue{#1@latin}%
  \providetoggle{#1@scriptlangequal}% whether lang and script names are same: e.g. Hebrew, Arabic
  \providebool{#1@fontsetup}%
  \providebool{#1@indentfirst}%
  \providebool{#1@frenchspacing}%
  % we initialize these so that we can use \gappto below
  \csgdef{init@extras@#1}{}%
  \csgdef{init@noextras@#1}{}% we don't use this yet: remove?
  \csgdef{xpg@langname@#1}{\xpg@uppercasefirst{#1}}%
  %needed for docsvlist with hyphennames key:
  \def\do##1{%
    \xpg@check@ifdefined{#1}
    \if@xpg@language@really@defined@\else
      \ifstrequal{#1}{##1}{}%
      {\xpg@ifdefined{##1}%
        {\expandafter\ifx\csname l@##1\endcsname\l@nohyphenation\else\csletcs{l@#1}{l@##1}\xpg@set@language@luatex@iv{##1}\fi}%
        {\csdef{l@##1}{l@nohyphenation}}%
      }%
    \fi
  }%
  %define all keys:
  \xpg@define@keys{#1}%
  \setkeys[xpg@setup]{#1}{#2}%
  % here we do the fontsetup:
  \ifbool{#1@fontsetup}%
    {\xpg@fontsetup@auto{#1}}%
    {\xpg@info{Skipping~ automatic~ font~ setup~ for~ language~ #1}}%
  %% TODO? \toggletrue{#1@setup@done}%
  % reinit \do
  \def\do##1{\setotherlanguage{##1}}%
}

\def\xpg@first#1,#2{#1}
\def\xpg@second#1,#2{#2}

\def\xpg@define@keys#1{%
  \define@key[xpg@setup]{#1}{script}{%
    \ifstrequal{##1}{Latin}%
      {\toggletrue{#1@latin}}%
      {\togglefalse{#1@latin}}%
    \csgdef{xpg@scriptname@#1}{##1}%
    \csgdef{xpg@scriptname@#1@lc}{\xpg@lowercasefirst{##1}}}%
  \define@key[xpg@setup]{#1}{scripttag}{%
    \csgdef{xpg@scripttag@#1}{##1}}%
  \define@key[xpg@setup]{#1}{language}{%
    \csgdef{xpg@langname@#1}{##1}}%
  \define@key[xpg@setup]{#1}{langtag}{%
    \csgdef{xpg@langtag@#1}{##1}}%
  \define@key[xpg@setup]{#1}{hyphennames}[{#1}]{%
    \docsvlist{##1}%
    % if l@#1 does not yet exist,
    % we assign it to nohyphenation
    % we do this here in case the hyphennames key was omitted
    \xpg@ifdefined{#1}{}%
      {\xpg@nopatterns{\csname xpg@langname@#1\endcsname}%
       \expandafter\adddialect\csname l@#1\endcsname\l@nohyphenation\relax}%
    \csdef{#1@language}{%
      \ifbool{xpg@hyphenation@disabled}{%
        \xdef\xpg@lastlanguage{\the\csname l@#1\endcsname}%
      }{%
        \ifluatex%
          \xpg@set@language@luatex@iv{#1}%
        \fi%
        \language=\csname l@#1\endcsname%
      }%
    }%
  }%
  \define@choicekey+[xpg@setup]{#1}{direction}[\val\nr]{LR,RL}[LR]%
    {\ifcase\nr\relax
        \togglefalse{#1@RL}%
      \or
        \toggletrue{#1@RL}%
        \ifcsundef{RTL}{\ifluatex\RequirePackage{luabidi}\else\RequirePackage{bidi}\fi}{}% FIXME Use \RequireBidi and remove calls in individual gloss files.
    \fi}%
    {\xpg@warning{#1: Invalid value \val\space for key "direction"}}%
  \define@key[xpg@setup]{#1}{hyphenmins}[{2,3}]%
    {\begingroup\edef\x{\endgroup
       \noexpand\setlocalhyphenmins{#1}{\xpg@first##1}{\xpg@second##1}}\x}
  \define@boolkey[xpg@setup]{#1}[#1@]{frenchspacing}[true]{%
    \ifbool{#1@frenchspacing}%
      {\csgappto{init@extras@#1}{\frenchspacing}}%
      {\csgappto{init@extras@#1}{\nonfrenchspacing}}}%
  \define@boolkey[xpg@setup]{#1}[#1@]{indentfirst}[true]{%
    \ifbool{#1@indentfirst}%
      {\csgappto{init@extras@#1}{\french@indent}}%
      {\csgappto{init@extras@#1}{\nofrench@indent}}}%
%  \define@choicekey*+[xpg@setup]{#1}{fontsetup}[\val\nr]{none,custom,auto}[none]%
%    %{\csgdef{#1@fontsetup}{\val}}%
%    {\xpg@fontsetup{\val}{#1}}%
%    {\xpg@warning{Invalid value \val\space for key "fontsetup" in module "#1"}}%
  \define@boolkey[xpg@setup]{#1}[#1@]{fontsetup}[true]{}%
  %TODO assign csnames corr. to localized alph and Alph
  %  \define@key[xpg@setup]{#1}{localalph}[{#1@alph,#1@Alph}]{%
  %  \cslet{xpg@localalph@#1}{\expandafter\csname\xpg@first##1\endcsname}%
  %  \cslet{xpg@localAlph@#1}{\expandafter\csname\xpg@second##1\endcsname}%
  %}%
  %TODO same thing with localdigits
}

\def\xpg@lastlanguage{0}%

\providebool{xpg@hyphenation@disabled}%
\boolfalse{xpg@hyphenation@disabled}

\def\xpg@disablehyphenation{%
  \ifbool{xpg@hyphenation@disabled}{}{%
    \booltrue{xpg@hyphenation@disabled}%
    \xdef\xpg@lastlanguage{\the\language}%
    \xpg@set@language@luatex@iv{nohyphenation}
    \language=\l@nohyphenation%
    \ifluatex %
      \directlua{polyglossia.disable_hyphenation()}%
    \fi %
  }%
}

\def\xpg@enablehyphenation{%
  \ifbool{xpg@hyphenation@disabled}{%
    \boolfalse{xpg@hyphenation@disabled}%
    \language=\csname xpg@lastlanguage\endcsname%
    \ifluatex %
      \directlua{polyglossia.enable_hyphenation()}%
    \fi %
  }{}%
}

\let\disablehyphenation\xpg@disablehyphenation
\let\enablehyphenation\xpg@enablehyphenation

%\def\xpg@fontsetup#1{\xpg@csifdef@warn{xpg@fontsetup@#1}}
%\def\xpg@fontsetup@none#1{\csgdef{#1@font}{\ifcsdef{#1font}{\csname #1font\endcsname}{}}} %<-- simplistic
%\def\xpg@fontsetup@custom#1{\csuse{#1@font}}

\def\xpg@fontsetup@auto#1{\iftoggle{#1@latin}%
  {\xpg@fontsetup@latin{#1}}%
  {\xpg@fontsetup@nonlatin{#1}}%
}

\def\xpg@addfontfeature@lang#1#2{% #1 is langtag, #2 is langname
  % Turkish is a special case: tag can be TRK or TUR
  \edef\tmp@Turkish{Turkish}%
  \edef\tmp@@langname{#2}%
  %  \ifstrequal{#2}{Turkish}%
  \ifx\tmp@@langname\tmp@Turkish
    \fontspec_if_language:nTF {TRK}%
      {\addfontfeature{Language=Turkish}}%
      {\fontspec_if_language:nTF {TUR}%
        {\addfontfeature{Language=Turkish}}%
        {}}%
    % else not Turkish
  \else
     \edef\tmp@@langparam{Language=#2}%
     \expandafter\expandafter\expandafter\fontspec_if_language:nTF \expandafter{#1}%
      {\expandafter\expandafter\expandafter\addfontfeature\expandafter{\tmp@@langparam}}%
      {}%
  \fi
}

\def\xpg@addfontfeature@script#1#2{% #1 is scripttag, #2 is scriptname
  \edef\tmp@@scriptparam{Script=#2}%
  \expandafter\expandafter\expandafter\fontspec_if_script:nTF \expandafter{#1}%
    {\expandafter\expandafter\expandafter\addfontfeature\expandafter{\tmp@@scriptparam}}%
    {\xpg@error{The~ current~ roman~ font~ does~ not~ contain~ the~ \expandafter\noexpand#2 ~ script!\MessageBreak
    Please~ define~ \expandafter\string\csname \xpg@lowercasefirst{#2}font\endcsname\space with~ \string\newfontfamily}}%
}

\def\xpg@fontsetup@latin#1{%
  \begingroup
  \csgdef{#1@font@rm}{%
    \ifcsdef{#1font}{\csname #1font\endcsname}%
      {\edef\tmp@langtag{\csuse{xpg@langtag@#1}}%
       \edef\tmp@langname{\csuse{xpg@langname@#1}}%
       \rmfamilylatin%
        \ifcsvoid{xpg@langtag@#1}{}{%
          \ifcsvoid{xpg@langname@#1}{}{%
           \xpg@addfontfeature@lang{\tmp@langtag}{\tmp@langname}}%
      }}}%
  \csgdef{#1@font@sf}{%
    \ifcsdef{#1fontsf}{\csname #1fontsf\endcsname}%
      {\edef\tmp@langtag{\csuse{xpg@langtag@#1}}%
       \edef\tmp@langname{\csuse{xpg@langname@#1}}%
       \sffamilylatin%
      \ifcsvoid{xpg@langtag@#1}{}{%
        \ifcsvoid{xpg@langname@#1}{}{%
           \xpg@addfontfeature@lang{\tmp@langtag}{\tmp@langname}}%
      }}}%
  \csgdef{#1@font@tt}{%
    \ifcsdef{#1fonttt}{\csname #1fonttt\endcsname}%
      {\edef\tmp@langtag{\csuse{xpg@langtag@#1}}%
       \edef\tmp@langname{\csuse{xpg@langname@#1}}%
       \ttfamilylatin%
      \ifcsvoid{xpg@langtag@#1}{}{%
        \ifcsvoid{xpg@langname@#1}{}{%
           \xpg@addfontfeature@lang{\tmp@langtag}{\tmp@langname}}%
      }}}%
  \endgroup
}

\def\xpg@fontsetup@nonlatin#1{%
  \begingroup
  \edef\tmp@langname@lc{#1}% eg ukrainian
  \edef\tmp@scriptname@lc{\csuse{xpg@scriptname@#1@lc}}% eg cyrillic
  \ifx\tmp@scriptname@lc\tmp@langname@lc
    \toggletrue{#1@scriptlangequal}%
  \else
    \togglefalse{#1@scriptlangequal}%
  \fi
  \csgdef{#1@font@rm}{%
    \ifcsdef{#1font}%
      {\@nameuse{#1font}}%
      {\edef\tmp@scripttag{\csuse{xpg@scripttag@#1}}% eg cyrl
       \edef\tmp@scriptname{\csuse{xpg@scriptname@#1}}% eg Cyrillic
       \edef\tmp@langtag{\csuse{xpg@langtag@#1}}% eg UKR
       \edef\tmp@langname{\csuse{xpg@langname@#1}}% eg Ukrainian
       \providetoggle{#1@use@script@font}%
       \iftoggle{#1@scriptlangequal}%
        {\rmfamilylatin}%
        {\expandafter\ifcsname\csuse{xpg@scriptname@#1@lc} font\endcsname% eg \cyrillicfont
           \toggletrue{#1@use@script@font}%
           \expandafter\csname\csuse{xpg@scriptname@#1@lc} font\endcsname
         \else
           \rmfamilylatin
         \fi}
       \iftoggle{#1@use@script@font}{}{%
         \ifcsvoid{xpg@scripttag@#1}{}{%
           \ifcsvoid{xpg@scriptname@#1}{}{%
             \xpg@addfontfeature@script{\tmp@scripttag}{\tmp@scriptname}}}}%
       \ifcsvoid{xpg@langtag@#1}{}{%
         \ifcsvoid{xpg@langname@#1}{}{%
         \xpg@addfontfeature@lang{\tmp@langtag}{\tmp@langname}}}%
      }}%
  \csgdef{#1@font@sf}{%
    \ifcsdef{#1fontsf}%
      {\@nameuse{#1fontsf}}%
      {\edef\tmp@scripttag{\csuse{xpg@scripttag@#1}}% eg cyrl
       \edef\tmp@scriptname{\csuse{xpg@scriptname@#1}}% eg Cyrillic
       \edef\tmp@langtag{\csuse{xpg@langtag@#1}}% eg UKR
       \edef\tmp@langname{\csuse{xpg@langname@#1}}% eg Ukrainian
       \providetoggle{#1@use@script@fontsf}%
       \iftoggle{#1@scriptlangequal}%
        {\sffamilylatin}%
        {\expandafter\ifcsname\csuse{xpg@scriptname@#1@lc} fontsf\endcsname% eg \cyrillicfontsf
           \toggletrue{#1@use@script@fontsf}%
           \expandafter\csname\csuse{xpg@scriptname@#1@lc} fontsf\endcsname
         \else
           \sffamilylatin
         \fi}
       \iftoggle{#1@use@script@fontsf}{}{%
         \ifcsvoid{xpg@scripttag@#1}{}{%
           \ifcsvoid{xpg@scriptname@#1}{}{%
             \xpg@addfontfeature@script{\tmp@scripttag}{\tmp@scriptname}}}}%
       \ifcsvoid{xpg@langtag@#1}{}{%
         \ifcsvoid{xpg@langname@#1}{}{%
         \xpg@addfontfeature@lang{\tmp@langtag}{\tmp@langname}}}%
      }}%
  \csgdef{#1@font@tt}{%
    \ifcsdef{#1fonttt}%
      {\@nameuse{#1fonttt}}%
      {\edef\tmp@scripttag{\csuse{xpg@scripttag@#1}}% eg cyrl
       \edef\tmp@scriptname{\csuse{xpg@scriptname@#1}}% eg Cyrillic
       \edef\tmp@langtag{\csuse{xpg@langtag@#1}}% eg UKR
       \edef\tmp@langname{\csuse{xpg@langname@#1}}% eg Ukrainian
       \providetoggle{#1@use@script@fonttt}%
       \iftoggle{#1@scriptlangequal}%
        {\ttfamilylatin}%
        {\expandafter\ifcsname\csuse{xpg@scriptname@#1@lc} fonttt\endcsname% eg \cyrillicfonttt
           \toggletrue{#1@use@script@fonttt}%
           \expandafter\csname\csuse{xpg@scriptname@#1@lc} fonttt\endcsname
         \else
           \ttfamilylatin
         \fi}
       \iftoggle{#1@use@script@fonttt}{}{%
         \ifcsvoid{xpg@scripttag@#1}{}{%
           \ifcsvoid{xpg@scriptname@#1}{}{%
             \xpg@addfontfeature@script{\tmp@scripttag}{\tmp@scriptname}}}}%
       \ifcsvoid{xpg@langtag@#1}{}{%
         \ifcsvoid{xpg@langname@#1}{}{%
         \xpg@addfontfeature@lang{\tmp@langtag}{\tmp@langname}}}%
      }}%
  \endgroup
}

%%% END OF PolyglossiaSetup

%% ensure localization of \markright and \markboth commands
%%% THIS IS NOW DISABLED BY DEFAULT
\define@boolkey{polyglossia}[xpg@]{localmarks}[false]{%
   \ifbool{xpg@localmarks}{%
      \xpg@info{Option:~ localmarks}%
      \def\local@marks##1{%
         \def\markboth####1####2{%
            \begingroup
               \let\label\relax \let\index\relax \let\glossary\relax
               \unrestored@protected@xdef\@themark
         {{\foreignlanguage{##1}{%
            \protect\@@ensure@maindir{####1}}}%
          {\foreignlanguage{##1}{%
      \protect\@@ensure@maindir{####2}}}}%
               \@temptokena \expandafter{\@themark}%
               \mark{\the\@temptokena}%
            \endgroup
            \if@nobreak\ifvmode\nobreak\fi\fi}%
            \def\markright####1{%
               \begingroup
                  \let\label\relax \let\index\relax \let\glossary\relax
                  \expandafter\@markright\@themark
      {\foreignlanguage{##1}{\protect\@@ensure@maindir{####1}}}%
                  \@temptokena \expandafter{\@themark}%
                  \mark{\the\@temptokena}%
               \endgroup
               \if@nobreak\ifvmode\nobreak\fi\fi}%
            \def\@markright####1####2####3{\@temptokena{\protect\@@ensure@maindir{####1}}%
               \unrestored@protected@xdef\@themark{{\the\@temptokena}%
               {\protect\@@ensure@maindir{####3}}}}}%
    }{% else
      \def\local@marks##1{}%
    }%
}
\setkeys{polyglossia}{localmarks=false}

% Easy way out – Arthur, 2012-08-01
\ifcsdef{newXeTeXintercharclass}{%
% to reset the intercharclass of a character to "normal"
\newXeTeXintercharclass\xpg@normalclass %TODO
}{}

%% when no patterns are available, we use \l@nohyphenation, assigned to 255
%%  (suggestion by Enrico Gregorio)
\@ifundefined{l@nohyphenation}{\chardef\l@nohyphenation=255 }{}

%we call this macro when a gloss file is not found for a given language
\def\xpg@nogloss#1{%
   \xpg@warning{File~ gloss-#1.ldf~ does~ not~ exist!\MessageBreak
   I~ will~ nevertheless~ try~ to~ use~ hyphenation~ patterns~ for~ #1.}%
  \PolyglossiaSetup{#1}{hyphenmins,hyphennames={#1},fontsetup=true}%
  % the above amounts to:
  %\ifcsundef{l@#1}%
  %  {\expandafter\adddialect\csname l@#1\endcsname\l@nohyphenation\relax}%
  %  {\setlocalhyphenmins{#1}{2}{3}}%
  %\csdef{#1@language}{\language=\csname l@#1\endcsname}%
}

\newcommand{\xpg@input}[1]{%
  \chardef\xpg@atcatcode\catcode`\@
  \makeatletter
  \input{#1}\catcode`\@=\xpg@atcatcode}

\newcommand{\setdefaultlanguage}[2][]{%
  \edef\xpg@loaded{#2\ifx\xpg@loaded\@empty\else,\xpg@loaded\fi}%
   \IfFileExists{gloss-#2.ldf}%
   {\ifcsundef{#2@loaded}%
     {\xpg@input{gloss-#2.ldf}%
     \xpg@info{Default~ language~ is~ #2}%
     \def\languagename{#2}%
     \ifluatex %
       \directlua{polyglossia.set_default_language('\luatexluaescapestring{\string#2}')}%
     \fi %
      % This is needed because \arabic is a built-in LaTeX command:
      % so now we have \begin{Arabic}... instead of \begin{arabic}...
      \ifstrequal{#2}{arabic}%
      {\newenvironment{Arabic}[1][]{\begin{otherlanguage}[####1]{arabic}}%
        {\end{otherlanguage}}}%
      {\newenvironment{#2}[1][]{\begin{otherlanguage}[####1]{#2}}%
        {\end{otherlanguage}}}%
      \expandafter\newcommand\csname text#2\endcsname[2][]{%
        \ifcsdef{RTL}%
          {\iftoggle{#2@RL}%
            {\@ensure@RTL{\foreignlanguage[####1]{#2}{####2}}}%
            {\@ensure@LTR{\foreignlanguage[####1]{#2}{####2}}}%
          }% else bidi not loaded
          {\iftoggle{#2@RL}%
            {\xpg@error{Language~ #2~ is~ right-to-left,~ but~ bidi~ package~ was~ not~ loaded!}}%
            {\foreignlanguage[####1]{#2}{####2}}%
          }%
      }%
      \csletcs{local#2}{text#2}%
      \csgdef{#2@loaded}{}%
      \gdef\xpg@main@language{#2}%
      }%
      {\xpg@warning{gloss-#2.ldf~ is~ already~ loaded!}}%:
      %% The following settings are for the default language and script:
      \iftoggle{#2@RL}{\@RTLmaintrue}{}% this tells bidi.sty that the document is RTL
      \AtBeginDocument{%
      \selectlanguage[#1]{#2}%
      \selectbackgroundlanguage{#2}}%
   }%
   %ELSE
   {\xpg@nogloss{#2}}%
}

\let\setmainlanguage=\setdefaultlanguage

\newcommand{\resetdefaultlanguage}[2][]{%
    \ifcsundef{#2@loaded}{%
     \xpg@error{gloss-#2.ldf~ is~ not~ loaded!}}%
    {\csuse{no\xpg@main@language @globalnumbers}% disable globalnumbers of previously defined default language
    \csuse{noextras@\xpg@main@language}%
    \csuse{init@noextras@\xpg@main@language}%
    \def\languagename{#2}%
    \iftoggle{#2@RL}{\@rlmaintrue\@rl@footnotetrue}{}%
    \selectlanguage[#1]{#2}%
    \selectbackgroundlanguage{#2}}}

\expandafter\ifx\familydefault\sfdefault
  \def\familytype{sf}
\else\expandafter\ifx\familydefault\ttdefault
  \def\familytype{tt}
\else
  \def\familytype{rm}
\fi\fi
% This robustifies the redefinitions of \<xx>family (suggestion by Enrico Gregorio)
% e.g. to prevent expansion of the \familytype redefinition in auxiliary files
\csgappto{rmfamily~}{\def\familytype{rm}}
\csgappto{sffamily~}{\def\familytype{sf}}
\csgappto{ttfamily~}{\def\familytype{tt}}
% This saves the normalfont for the latin script since we may change normalfont in other scripts
\let\normalfontlatin=\normalfont%
\let\rmfamilylatin=\rmfamily%
\let\sffamilylatin=\sffamily%
\let\ttfamilylatin=\ttfamily%

\def\resetfontlatin{%
   \let\rmfamily=\rmfamilylatin%
   \let\sffamily=\sffamilylatin%
   \let\ttfamily=\ttfamilylatin%
   \let\normalfont=\normalfontlatin}

\def\selectfontfamilylatin{%
  \def\tmp@tt{tt}\def\tmp@sf{sf}%
  \ifx\familytype\tmp@tt%
    \ttfamilylatin%
    \else\ifx\familytype\tmp@sf%
      \sffamilylatin%
      \else\rmfamilylatin\fi\fi}

\def\xpg@select@fontfamily#1{%
  \def\tmp@tt{tt}\def\tmp@sf{sf}%
  \ifx\familytype\tmp@tt
    \csuse@warn{#1@font@tt}%
  \else\ifx\familytype\tmp@sf
    \csuse@warn{#1@font@sf}%
      \else\csuse@warn{#1@font@rm}\fi\fi}

\def\xpg@set@normalfont#1{%
  \letcs{\rmfamily}{#1@font@rm}%
  \letcs{\sffamily}{#1@font@sf}%
  \letcs{\ttfamily}{#1@font@tt}%
  \gdef\normalfont{\protect\xpg@select@fontfamily{#1}}%
  \gdef\reset@font{\protect\normalfont}%
}

\let\@@fterindentfalse\@afterindentfalse
\def\french@indent{\let\@afterindentfalse\@afterindenttrue
                        \@afterindenttrue}
\def\nofrench@indent{\let\@afterindentfalse\@@fterindentfalse
                          \@afterindentfalse}

\newcommand{\selectbackgroundlanguage}[1]{%
    \iftoggle{#1@latin}{}{\xpg@set@normalfont{#1}}%
    \csuse{#1@globalnumbers}%
    }

\newcommand{\setotherlanguage}[2][]{%
  \edef\xpg@loaded{#2\ifx\xpg@loaded\@empty\else,\xpg@loaded\fi}%
   \IfFileExists{gloss-#2.ldf}%
   {\ifcsundef{#2@loaded}%
     {\xpg@input{gloss-#2.ldf}%
      \setkeys{#2}{#1}%
      \edef\@tmpa{arabic}%
      \edef\@tmpb{#2}%
      \ifx\@tmpb\@tmpa%
      \newenvironment{Arabic}[1][]{\begin{otherlanguage}[####1]{arabic}}%
         {\end{otherlanguage}}%
      \else
      \newenvironment{#2}[1][]{\begin{otherlanguage}[####1]{#2}}%
         {\end{otherlanguage}}%
      \fi
      \expandafter\newcommand\csname text#2\endcsname[2][]{%
        \ifcsdef{RTL}%
          {\iftoggle{#2@RL}%
            {\@ensure@RTL{\foreignlanguage[####1]{#2}{####2}}}%
            {\@ensure@LTR{\foreignlanguage[####1]{#2}{####2}}}%
          }% else bidi not loaded
          {\iftoggle{#2@RL}%
            {\xpg@error{Language~ #2~ is~ right-to-left,~ but~ bidi~ package~ was~ not~ loaded!}}%
            {\foreignlanguage[####1]{#2}{####2}}%
          }%
        }%
     \csletcs{local#2}{text#2}%
     \csgdef{#2@loaded}{}%
     }%
     {\xpg@warning{gloss-#2.ldf~ is~ already~ loaded!}}%
   }%
   %ELSE
   {\xpg@nogloss{#2}}%
}

\newcommand\setotherlanguages[1]{%
  \def\do##1{\setotherlanguage{##1}}%
   \docsvlist{#1}}%

\def\common@language{% FIXME is this really needed???
  \ifbool{xpg@hyphenation@disabled}{%
    \xdef\xpg@lastlanguage{\z@}%
  }{%
    \language=\z@
  }%
  \lefthyphenmin=\tw@
  \righthyphenmin=\thr@@}

\def\noextrascurrent#1{\csuse{noextras@#1}}

\def\xpg@initial@setup{\ifcsundef{languagename}{}%
   {\noextrascurrent{\languagename}}%
   \common@language}

\AtBeginDocument{\xpg@initial@setup}

\providecommand{\foreignlanguage}{}

\renewcommand{\foreignlanguage}[3][]{%
   \ifcsundef{#2@loaded}%
     {\xpg@nogloss{#2}}%
     {{\select@@language{#2}%
      \setkeys{#2}{#1}%
      \use@localhyphenmins{#2}%
      \ifbool{#2@frenchspacing}{\frenchspacing}{\nonfrenchspacing}%
      \csuse{inlineextras@#2}%
      #3}%
     }%
}

% otherlanguage* is the environment equivalent of \foreignlanguage
\expandafter\providecommand\csname otherlanguage*\endcsname{}
\renewenvironment{otherlanguage*}[2][]{%
   \ifcsundef{#2@loaded}%
     {\xpg@nogloss{#2}}%
     {\select@@language{#2}%
      \setkeys{#2}{#1}%
      \use@localhyphenmins{#2}%
      \ifbool{#2@frenchspacing}{\frenchspacing}{\nonfrenchspacing}%
      \csuse{inlineextras@#2}\csuse{date#2}%
     }%
}{}

%Hook that other package authors can use
%(for instance biblatex):
\newcommand*{\xpg@hook@setlanguage}{}

\providecommand{\selectlanguage}{}
\renewcommand{\selectlanguage}[2][]{%
   \ifcsundef{#2@loaded}%
     {\xpg@nogloss{#2}}%
     {\def\xpg@pop@language{%
         \xpg@set@language{\languagename}%
         \xpg@hook@setlanguage%
         \let\emp@langname\@undefined}%
      \aftergroup\xpg@pop@language%
      % If the optional argument sets a value for the key “variant”, copy it to xpg@langvariant
      \def\do##1{%
          \def\xpg@parsekeyvalue####1=####2\relax{%
              \def\@tmpa{####1}
              \def\@tmpb{variant}
              \ifx\@tmpa\@tmpb\setkeys{xpg@langvariant}{##1}\fi
          }%
          \xpg@parsekeyvalue##1=\relax
      }%
      \docsvlist{#1}
      \setkeys{#2}{#1}%
      \xpg@set@language{#2}%
     }%
}

% Save any variant in csv list of variants
\define@key{xpg@langvariant}{variant}{%
  \edef\xpg@vloaded{#1\ifx\xpg@vloaded\@empty\else,\xpg@vloaded\fi}}

\newcommand{\xpg@set@language}[1]{%
   \select@language{#1}%
   \if@filesw%
      \protected@write\@auxout{}{\protect\select@language{#1}}%
      \addtocontents{toc}{\protect\select@language{#1}}%
      \addtocontents{lof}{\protect\select@language{#1}}%
      \addtocontents{lot}{\protect\select@language{#1}}%
   \fi
}

\def\xpg@set@language@luatex@iii#1#2{%
    % here we use lu@texhyphen@loaded@\the\language, the same as in babel
    \ifcsdef{bbl@hyphendata@#2}{}{%
        \global\@namedef{bbl@hyphendata@\the\language}{}%
        \directlua{polyglossia.select_language('\luatexluaescapestring{\string#1}', \the\csname l@#1\endcsname)}%
    }
}

\newcommand\xpg@check@ifdefined[1]{%
    \expandafter\ifx\csname l@#1\endcsname\relax\@xpg@language@really@defined@false\else
        \ifx\csname l@#1\endcsname\l@nohyphenation\@xpg@language@really@defined@false\else
            \@xpg@language@really@defined@true
        \fi
    \fi
}

\newcommand\xpg@ifdefined[3]{%
    \ifluatex
        \xpg@set@language@luatex@iv{#1}%
    \fi
    \xpg@check@ifdefined{#1}
    \if@xpg@language@really@defined@#2\else#3\fi
}%

\newcommand\xpg@set@language@luatex@iv[1]{%
    \ifluatex
        \xpg@check@ifdefined{#1}%
        \if@xpg@language@really@defined@\else
            \expandafter\chardef\csname l@#1\endcsname=\directlua{tex.sprint(polyglossia.newloader('#1'))}%
        \fi
        \language\directlua{tex.sprint(polyglossia.newloader('#1'))}%
    \fi
}

\newcommand\xpg@set@language@luatex@ii[1]{%
   \ifluatex %
     \xpg@set@language@luatex@iii{#1}{\expandafter\the\csname l@#1\endcsname}
   \fi % 
}

\def\select@language#1{%
   \ifluatex %
      \xpg@set@language@luatex@iii{#1}{\the\language}
   \fi %
   \xpg@initial@setup%
   \select@@language{#1}%
   \ifcsundef{setRL}{}%
   {\iftoggle{#1@RL}{\setRL}{\setLR}}%
   \csuse{captions#1}%
   \local@marks{#1}%
   \csuse{init@extras@#1}%
   \csuse{blockextras@#1}%
}

% Common code for `\select@language' and `\foreignlanguage'.
\newcommand{\select@@language}[1]{%
  \edef\languagename{#1}%
  \xpg@select@fontfamily{#1}%
  \csuse@warn{#1@language}%
  \csuse{date#1}%
  \csuse{#1@numbers}%
  \use@localhyphenmins{#1}%
}


\let\xpg@pop@language\relax

\provideenvironment{otherlanguage}{}{}

\renewenvironment{otherlanguage}[2][]
   {\selectlanguage[#1]{#2}}
   {}

\newcommand{\setlocalhyphenmins}[3]{%
   \xpg@ifdefined{#1}{%
      \expandafter\ifx\csname l@#1\endcsname\l@nohyphenation%
        \xpg@warning{\string\setlocalhyphenmin\space~ useless~ for~ unhyphenated~ language~ #1}%
      \else
      \providehyphenmins{#1}{#2#3}%
      \fi
   }{%
     \xpg@warning{\string\setlocalhyphenmin\space~ useless~ for~ unknown~ language~ #1}%
   }}%

\def\use@localhyphenmins#1{%
   \ifcsundef{#1hyphenmins}{}%
   {\expandafter\expandafter\expandafter\set@hyphenmins\csname #1hyphenmins\endcsname\relax}}

\define@boolkey{polyglossia}[system@]{babelshorthands}[false]{}

\AtEndPreamble{\@ifpackageloaded{bidi}{\providecommand*{\aemph}[1]{$\overline{\hboxR{#1}}$}}{}}% TODO Make that work for luabidi too.

%% Package Options %%
\DeclareOption{nolocalmarks}{\setkeys{polyglossia}{localmarks=false}}
\DeclareOption{localmarks}{\setkeys{polyglossia}{localmarks=true}}
\DeclareOption{babelshorthands}{\setkeys{polyglossia}{babelshorthands=true}}
\DeclareOption{quiet}{%
   \gdef\@latex@info#1{\relax}% no latex info
   \gdef\@font@info#1{\relax}% no latex font info
   \gdef\@font@warning#1{\relax}% no latex font warnings
   \gdef\zf@PackageInfo#1{\relax}% no fontspec info
   \gdef\xpg@info#1{\relax}}% no polyglossia info
%
% FIXME these should also be loaded \AtEndOfPackage !!!
\def\xpg@option#1#2{%
  \ifcsundef{xpg@main@language}{\setdefaultlanguage}{\setotherlanguage}%
    [#1]{#2}}
\ExplSyntaxOff
\ProcessOptions*
\endinput
