% Copyright 2007 by Till Tantau
% Copyright 2010 by Vedran Mileti\'c
% Copyright 2012,2105 by Vedran Mileti\'c, Joseph Wright
% Copyright 2017-2021 Joseph Wright
%
% This file may be distributed and/or modified
%
% 1. under the LaTeX Project Public License and/or
% 2. under the GNU Public License.
%
% See the documentation file for more details.

\ProvidesPackage{translator}
  [2021-05-31 v1.12d Easy translation of strings in LaTeX]

\RequirePackage{keyval}

\def\trans@languages{English}

\newcommand\uselanguage[2][]{%
  \g@addto@macro\trans@languages{,#2}%
}

\newcommand\languagealias[2]{%
  \expandafter\def\csname tr@ml@#1\endcsname{#2}%
}

\def\trans@use@and@alias#1#2{%
  \uselanguage{#2}%
  \languagealias{#1}{#2}%
}

\DeclareOption{acadian}        {\trans@use@and@alias{french}    {Acadian,French}}
\DeclareOption{afrikaans}      {\trans@use@and@alias{afrikaans} {Afrikaans,Dutch}}
\DeclareOption{american}       {\trans@use@and@alias{american}  {AmericanEnglish,English}}
\DeclareOption{arabic}         {\trans@use@and@alias{arabic}    {Arabic}}
\DeclareOption{austrian}       {\trans@use@and@alias{austrian}  {Austrian1997,Austrian,German1997,German}}
\DeclareOption{bahasa}         {\trans@use@and@alias{bahasa}    {Bahasa}}
\DeclareOption{basque}         {\trans@use@and@alias{basque}    {Basque}}
\DeclareOption{brazil}         {\trans@use@and@alias{brazil}    {Brazilian,Portuguese}}
\DeclareOption{brazilian}      {\trans@use@and@alias{brazilian} {Brazilian,Portuguese}}
\DeclareOption{breton}         {\trans@use@and@alias{breton}    {Breton}}
\DeclareOption{british}        {\trans@use@and@alias{british}   {BritishEnglish,English}}
\DeclareOption{bulgarian}      {\trans@use@and@alias{bulgarian} {Bulgarian}}
\DeclareOption{canadian}       {\trans@use@and@alias{canadian}  {Canadian,English}}
\DeclareOption{canadien}       {\trans@use@and@alias{canadien}  {Canadien,French}}
\DeclareOption{catalan}        {\trans@use@and@alias{catalan}   {Catalan}}
\DeclareOption{croatian}       {\trans@use@and@alias{croatian}  {Croatian}}
\DeclareOption{czech}          {\trans@use@and@alias{czech}     {Czech}}
\DeclareOption{danish}         {\trans@use@and@alias{danish}    {Danish}}
\DeclareOption{dutch}          {\trans@use@and@alias{dutch}     {Dutch}}
\DeclareOption{english}        {\trans@use@and@alias{english}   {English}}
\DeclareOption{esperanto}      {\trans@use@and@alias{esperaton} {Esperanto}}
\DeclareOption{estonian}       {\trans@use@and@alias{estonian}  {Estonian}}
\DeclareOption{finnish}        {\trans@use@and@alias{finnish}   {Finnish}}
\DeclareOption{francais}       {\trans@use@and@alias{french}    {French}}
\DeclareOption{frenchb}        {\trans@use@and@alias{french}    {French}}
\DeclareOption{french}         {\trans@use@and@alias{french}    {French}}
\DeclareOption{galician}       {\trans@use@and@alias{galician}  {Galician}}
\DeclareOption{german}         {\trans@use@and@alias{german}    {German1997,German}}
\DeclareOption{germanb}        {\trans@use@and@alias{german}    {German1997,German}}
\DeclareOption{greek}          {\trans@use@and@alias{greek}     {Greek}}
\DeclareOption{polutonikogreek}{\trans@use@and@alias{greek}     {Polutoniko,Greek}}
\DeclareOption{hebrew}         {\trans@use@and@alias{hebrew}    {Hebrew}}
\DeclareOption{hungarian}      {\trans@use@and@alias{hungarian} {Hungarian}}
\DeclareOption{icelandic}      {\trans@use@and@alias{icelandic} {Icelandic}}
\DeclareOption{irish}          {\trans@use@and@alias{irish}     {Irish}}
\DeclareOption{italian}        {\trans@use@and@alias{italian}   {Italian}}
\DeclareOption{latin}          {\trans@use@and@alias{latin}     {Latin}}
\DeclareOption{lowersorbian}   {\trans@use@and@alias{lsorbian}  {LowerSorbian,Sorbian}}
\DeclareOption{magyar}         {\trans@use@and@alias{magyar}    {Magyar}}
\DeclareOption{naustrian}      {\trans@use@and@alias{naustrian} {Austrian,German}}
\DeclareOption{ngerman}        {\trans@use@and@alias{ngerman}   {German}}
\DeclareOption{norsk}          {\trans@use@and@alias{norsk}     {Norsk}}
\DeclareOption{samin}          {\trans@use@and@alias{samin}     {Samin}}
\DeclareOption{nynorsk}        {\trans@use@and@alias{nynorsk}   {Nynorsk,Norsk}}
\DeclareOption{polish}         {\trans@use@and@alias{polish}    {Polish}}
\DeclareOption{portuges}       {\trans@use@and@alias{portuges}  {Portuguese}}
\DeclareOption{portuguese}     {\trans@use@and@alias{portuguese}{Portuguese}}
\DeclareOption{romanian}       {\trans@use@and@alias{romanian}  {Romanian}}
\DeclareOption{russian}        {\trans@use@and@alias{russian}   {Russian}}
\DeclareOption{scottish}       {\trans@use@and@alias{scottish}  {Scottish}}
\DeclareOption{serbian}        {\trans@use@and@alias{serbian}   {Serbian}}
\DeclareOption{slovak}         {\trans@use@and@alias{slovak}    {Slovak}}
\DeclareOption{slovene}        {\trans@use@and@alias{slovene}   {Slovene}}
\DeclareOption{spanish}        {\trans@use@and@alias{spanish}   {Spanish}}
\DeclareOption{swedish}        {\trans@use@and@alias{swedish}   {Swedish}}
\DeclareOption{turkish}        {\trans@use@and@alias{turkish}   {Turkish}}
\DeclareOption{ukrainian}      {\trans@use@and@alias{ukrainian} {Ukrainian}}
\DeclareOption{uppersorbian}   {\trans@use@and@alias{usorbian}  {UpperSorbian,Sorbian}}
\DeclareOption{welsh}          {\trans@use@and@alias{welsh}     {Welsh}}
\DeclareOption{UKenglish}      {\trans@use@and@alias{UKenglish} {BritishEnglish,English}}
\DeclareOption{USenglish}      {\trans@use@and@alias{USenglish} {AmericanEnglish,English}}
\ProcessOptions*\relax

\newcommand\languagepath[1]{\def\trans@languagepath{#1}}
\def\trans@languagepath{\languagename,English}

\define@key{translator}{to}{\def\trans@to{#1}}

\newcommand\iftranslationdefined[4][]{%
  \def\trans@to{\trans@defaultto}%
  \setkeys{translator}{#1}%
  \begingroup\expandafter\expandafter\expandafter\endgroup
  \expandafter\ifx\csname tr@@@\trans@to @#2\endcsname\relax%
    \let\trans@next=\@secondoftwo%
  \else%
    \let\trans@next=\@firstoftwo%
  \fi%
  \trans@next{#3}{#4}%
}

\newcommand\deftranslation[3][]{%
  \def\trans@to{\trans@defaultto}%
  \setkeys{translator}{#1}%
  \expandafter\def\csname tr@@@\trans@to @#2\endcsname{#3}%
}

\newcommand\newtranslation[3][]{%
  \iftranslationdefined[#1]{#2}{%
    \PackageError{translator}{Translation of '#2' already defined}{}%
  }%
  {%
    \deftranslation[#1]{#2}{#3}%
  }%
}

\newcommand\renewtranslation[3][]{%
  \iftranslationdefined[#1]{#2}{%
    \deftranslation[#1]{#2}{#3}%
  }%
  {%
    \PackageError{translator}{Translation of '#2' not defined}{}%
  }%
}

\newcommand\providetranslation[3][]{%
  \iftranslationdefined[#1]{#2}{%
  }%
  {%
    \deftranslation[#1]{#2}{#3}%
  }%
}

\begingroup
\lccode`\A=`\- %
\lowercase{%
  \endgroup
  \def\trans@marker{-A}%
}

\newcommand\translatelet[3][]{%
  \edef\trans@to{\trans@languagepath}%
  \setkeys{translator}{#1}%
  \let\trans@trans\trans@marker%
  \let\trans@list\@empty%
  \@for\trans@lang:=\trans@to\do%
  {%
    \expandafter\ifx\csname tr@ml@\trans@lang\endcsname\relax%
    \else%
      \expandafter\let\expandafter\trans@lang\expandafter=\csname tr@ml@\trans@lang\endcsname%
    \fi%
    \edef\trans@list{\trans@list,\trans@lang}%
  }%
  \@for\trans@lang:=\trans@list\do%
  {%
    \expandafter\ifx\csname tr@@@\trans@lang @#3\endcsname\relax%
    \else%
      \ifx\trans@trans\trans@marker%
        \expandafter\expandafter\expandafter\def
        \expandafter\expandafter\expandafter\trans@trans
        \expandafter\expandafter\expandafter{\csname tr@@@\trans@lang @#3\endcsname}%
      \fi%
    \fi%
  }%
  \ifx\trans@trans\trans@marker%
    \def\trans@trans{#3}%
  \fi%
  \let#2=\trans@trans%
}



\DeclareRobustCommand\translate[2][]{%
  \translatelet[#1]\trans@temp{#2}%
  \trans@temp%
}



\def\trans@dictionaries{}

\newcommand\usedictionary[1]{%
  \g@addto@macro\trans@dictionaries{\usedictionary{#1}}%
}

\def\trans@defaultto{English}

\AtBeginDocument{%
  \renewcommand\usedictionary[1]{%
    \@for\trans@lang:=\trans@languages\do{%
      \ifx\trans@lang\@empty%
      \else%
        \expandafter\ifx\csname ver@#1-\trans@lang.dict\endcsname\relax%
          \edef\trans@temp{%
            \def\noexpand\trans@defaultto{\trans@lang}%
            \noexpand\InputIfFileExists{#1-\trans@lang.dict}{}{}%
            \def\noexpand\trans@defaultto{\trans@defaultto}%
          }%
          \trans@temp%
        \fi%
      \fi%
    }}%
  \trans@dictionaries%
}

\def\ProvidesDictionary#1#2{%
  \begingroup
    \catcode`\ 10 %
    \@makeother\/%
    \@ifnextchar[%]
    {\@providesdictionary{#1}{#2}}{\@providesdictionary{#1}{#2}[]}%
  }
\def\@providesdictionary#1#2[#3]{%
  \wlog{Dictionary: #1, Language: #2 #3}%
  \expandafter\xdef\csname ver@#1-#2.dict\endcsname{#3}%
  \endgroup%
}


\endinput