\NeedsTeXFormat{LaTeX2e}[2020-10-01]
\RequirePackage{l3keys2e}
\ProvidesExplPackage
  {projlib-language}
  {2022/03/09} {}
  {Multi-language configuration}

\clist_const:Nn \c__projlib_language_supported_clist
  {
    english     ,
    french      ,
    ngerman     ,
    italian     ,
    portuguese  ,
    brazilian   ,
    spanish     ,
    schinese    ,
    tchinese    ,
    japanese    ,
    russian     ,
  }

\clist_new:N \g__projlib_language_babel_option_clist

\str_new:N \g__projlib_language_main_str

\bool_new:N        \g__projlib_language_enabled_all_bool
\bool_gset_true:N  \g__projlib_language_enabled_all_bool

\clist_map_inline:Nn \c__projlib_language_supported_clist
  {
    \bool_new:c        { g__projlib_language_enabled_ #1 _bool }
    \bool_gset_false:c { g__projlib_language_enabled_ #1 _bool }
  }

\cs_new:Nn \projlib_language_set_option_no_babel:n
  {
    \bool_gset_false:N \g__projlib_language_enabled_all_bool
    \bool_gset_true:c { g__projlib_language_enabled_ #1 _bool }
    \str_if_empty:NT \g__projlib_language_main_str
      {
        \str_gset:Nn \g__projlib_language_main_str { #1 }
      }
  }
\cs_new:Nn \projlib_language_set_option:n
  {
    \projlib_language_set_option_no_babel:n { #1 }
    \clist_gput_left:Nn \g__projlib_language_babel_option_clist { #1 }
  }

\keys_define:nn { projlib-language }
  {
    , EN                  .meta:n       = { english }
    , english             .code:n       = { \projlib_language_set_option:n { english } }
    , English             .meta:n       = { english }
    , FR                  .meta:n       = { french }
    , french              .code:n       = { \projlib_language_set_option:n { french } }
    , French              .meta:n       = { french }
    , DE                  .meta:n       = { ngerman }
    , german              .meta:n       = { ngerman }
    , ngerman             .code:n       = { \projlib_language_set_option:n { ngerman } }
    , German              .meta:n       = { ngerman }
    , IT                  .meta:n       = { italian }
    , italian             .code:n       = { \projlib_language_set_option:n { italian } }
    , Italian             .meta:n       = { italian }
    , PT                  .meta:n       = { portuguese }
    , portuguese          .code:n       = { \projlib_language_set_option:n { portuguese } }
    , Portuguese          .meta:n       = { portuguese }
    , BR                  .meta:n       = { brazilian }
    , brazilian           .code:n       = { \projlib_language_set_option:n { brazilian } }
    , Brazilian           .meta:n       = { brazilian }
    , ES                  .meta:n       = { spanish }
    , spanish             .code:n       = { \clist_gput_left:Nn \g__projlib_language_babel_option_clist { es-notilde, es-noquoting }
                                            \projlib_language_set_option:n { spanish } }
    , Spanish             .meta:n       = { spanish }
    , CN                  .meta:n       = { schinese }
    , chinese             .meta:n       = { schinese }
    , schinese            .code:n       = { \projlib_language_set_option_no_babel:n { schinese } }
    , simplified-chinese  .meta:n       = { schinese }
    , simplified~chinese  .meta:n       = { schinese }
    , simplified chinese  .meta:n       = { schinese }
    , Chinese             .meta:n       = { schinese }
    , SChinese            .meta:n       = { schinese }
    , Simplified-Chinese  .meta:n       = { schinese }
    , Simplified~Chinese  .meta:n       = { schinese }
    , Simplified Chinese  .meta:n       = { schinese }
    , TC                  .meta:n       = { tchinese }
    , tchinese            .code:n       = { \projlib_language_set_option_no_babel:n { tchinese } }
    , traditional-chinese .meta:n       = { tchinese }
    , traditional~chinese .meta:n       = { tchinese }
    , traditional chinese .meta:n       = { tchinese }
    , TChinese            .meta:n       = { tchinese }
    , Traditional-Chinese .meta:n       = { tchinese }
    , Traditional~Chinese .meta:n       = { tchinese }
    , Traditional Chinese .meta:n       = { tchinese }
    , JP                  .meta:n       = { japanese }
    , japanese            .code:n       = { \projlib_language_set_option:n { japanese } }
    , Japanese            .meta:n       = { japanese }
    , RU                  .meta:n       = { russian }
    , russian             .code:n       = { \projlib_language_set_option:n { russian } }
    , Russian             .meta:n       = { russian }
    , unknown             .code:n       = {}
  }
\ProcessKeysOptions { projlib-language }

\cs_new_protected:Nn \projlib_language_clear_global_option:n
  {
    \clist_remove_all:cn { @classoptionslist } { #1 }
  }

\projlib_language_clear_global_option:n { chinese }
\projlib_language_clear_global_option:n { Chinese }

\clist_gput_right:Nn \g__projlib_language_babel_option_clist { shorthands = off }

\str_if_empty:NT \g__projlib_language_main_str
  {
    \str_gset:Nn \g__projlib_language_main_str { english }
  }

\bool_if:NT \g__projlib_language_enabled_all_bool
  {
    \clist_map_inline:Nn \c__projlib_language_supported_clist
      {
        \bool_gset_true:c { g__projlib_language_enabled_ #1 _bool }
      }
  }


\cs_new:Nn \projlib_language_str_to_languagename:n
  {
    \str_case_e:nnF { \str_foldcase:n { #1 } }
      {
        { all                }    { common     }
        { common             }    { common     }
        { cn                 }    { schinese   }
        { chinese            }    { schinese   }
        { schinese           }    { schinese   }
        { simplifiedchinese  }    { schinese   }
        { simplified-chinese }    { schinese   }
        { tc                 }    { tchinese   }
        { tchinese           }    { tchinese   }
        { traditionalchinese }    { tchinese   }
        { traditional-chinese}    { tchinese   }
        { jp                 }    { japanese   }
        { japanese           }    { japanese   }
        { en                 }    { english    }
        { english            }    { english    }
        { fr                 }    { french     }
        { french             }    { french     }
        { de                 }    { ngerman    }
        { german             }    { ngerman    }
        { ngerman            }    { ngerman    }
        { it                 }    { italian    }
        { italian            }    { italian    }
        { pt                 }    { portuguese }
        { portuguese         }    { portuguese }
        { br                 }    { brazilian  }
        { brazilian          }    { brazilian  }
        { es                 }    { spanish    }
        { spanish            }    { spanish    }
        { ru                 }    { russian    }
        { russian            }    { russian    }
      }
      { #1 }
  }

\cs_new:Nn \projlib_language_str_to_languagetype:n
  {
    \str_case_e:nn { \str_foldcase:n { #1 } }
      {
        { cn                 }    {  cjk  }
        { chinese            }    {  cjk  }
        { schinese           }    {  cjk  }
        { simplifiedchinese  }    {  cjk  }
        { simplified-chinese }    {  cjk  }
        { tc                 }    {  cjk  }
        { tchinese           }    {  cjk  }
        { traditionalchinese }    {  cjk  }
        { traditional-chinese}    {  cjk  }
        { jp                 }    {  cjk  }
        { japanese           }    {  cjk  }
        { en                 }    { latin }
        { english            }    { latin }
        { fr                 }    { latin }
        { french             }    { latin }
        { de                 }    { latin }
        { german             }    { latin }
        { ngerman            }    { latin }
        { it                 }    { latin }
        { italian            }    { latin }
        { pt                 }    { latin }
        { portuguese         }    { latin }
        { br                 }    { latin }
        { brazilian          }    { latin }
        { es                 }    { latin }
        { spanish            }    { latin }
        { ru                 }    { latin }
        { russian            }    { latin }
      }
  }

\sys_if_engine_pdftex:T
  {
    \RequirePackage [T1] { fontenc }
  }

\bool_if:NTF \g__projlib_language_enabled_all_bool
  {
    \sys_if_engine_pdftex:F
      {
        \PassOptionsToPackage { japanese, russian } { babel }
      }
    \PassOptionsToPackage { italian, portuguese, brazilian, spanish, es-notilde, es-noquoting, ngerman, french, english, shorthands = off } { babel }
  }
  {
    \PassOptionsToPackage { \g__projlib_language_babel_option_clist } { babel }
  }

\PassOptionsToPackage { italian, brazilian, spanish, ngerman, french, english } { cleveref }
\RequirePackage { babel }


\bool_if:NT \g__projlib_language_enabled_french_bool
  {
    \frenchsetup { PartNameFull = false }
  }

\bool_if:NT \g__projlib_language_enabled_portuguese_bool
  {
    \NewCommandCopy \__projlib_language_babel_ord: \ord
    \cs_undefine:N \ord
    \hook_gput_code:nnn { begindocument } { projlib-language }
      {
        \cs_if_exist:NT \ord
          {
            \NewCommandCopy \__projlib_language_user_ord: \ord
            \cs_set_protected:Npn \ord
              {
                \mode_if_math:TF
                  { \__projlib_language_user_ord:  }
                  { \__projlib_language_babel_ord: }
              }
          }
      }
  }

\babelprovide { schinese }
\babelprovide { tchinese }


\NewCommandCopy \projlib_language_backup_today:n \today

\tl_new:N \g_projlib_language_settings_common_tl
\clist_map_inline:Nn \c__projlib_language_supported_clist
  {
    \tl_new:c { g_projlib_language_settings_ #1 _tl }
  }

\tl_gput_right:Nn \g_projlib_language_settings_common_tl
  {
    \cs_if_exist:NT \ProjLibToday
      {
        \RenewCommandCopy \today \ProjLibToday
      }
  }

\tl_gput_right:Nn \g_projlib_language_settings_schinese_tl
  {
    \g_projlib_language_settings_common_tl
    \tl_gset:Nn \languagename          { schinese }
    \tl_gset:cn { abstractname   }     { 摘要     }
    \tl_gset:cn { proofname      }     { 证明     }
    \tl_gset:cn { contentsname   }     { 目录     }
    \tl_gset:cn { listfigurename }     { 插图     }
    \tl_gset:cn { listtablename  }     { 表格     }
    \tl_gset:cn { figurename     }     { 图       }
    \tl_gset:cn { tablename      }     { 表       }
    \tl_gset:cn { indexname      }     { 索引     }
    \tl_gset:cn { appendixname   }     { 附录     }
    \tl_gset:cn { refname        }     { 参考文献 }
    \tl_gset:cn { bibname        }     { 参考文献 }
  }

\tl_gput_right:Nn \g_projlib_language_settings_tchinese_tl
  {
    \g_projlib_language_settings_common_tl
    \tl_gset:Nn \languagename          { tchinese }
    \tl_gset:cn { abstractname   }     { 摘要     }
    \tl_gset:cn { proofname      }     { 證明     }
    \tl_gset:cn { contentsname   }     { 目錄     }
    \tl_gset:cn { listfigurename }     { 插圖     }
    \tl_gset:cn { listtablename  }     { 表格     }
    \tl_gset:cn { figurename     }     { 圖       }
    \tl_gset:cn { tablename      }     { 表       }
    \tl_gset:cn { indexname      }     { 索引     }
    \tl_gset:cn { appendixname   }     { 附錄     }
    \tl_gset:cn { refname        }     { 參考文獻 }
    \tl_gset:cn { bibname        }     { 參考文獻 }
  }

\tl_gput_right:Nn \g_projlib_language_settings_japanese_tl
  {
    \selectlanguage { japanese }
    \g_projlib_language_settings_common_tl
  }

\tl_gput_right:Nn \g_projlib_language_settings_english_tl
  {
    \selectlanguage { english }
    \g_projlib_language_settings_common_tl
  }

\tl_gput_right:Nn \g_projlib_language_settings_french_tl
  {
    \selectlanguage { french }
    \g_projlib_language_settings_common_tl
    \tl_gset:cn { frenchpartname } { Partie }
  }

\tl_gput_right:Nn \g_projlib_language_settings_ngerman_tl
  {
    \selectlanguage { ngerman }
    \g_projlib_language_settings_common_tl
  }

\tl_gput_right:Nn \g_projlib_language_settings_italian_tl
  {
    \selectlanguage { italian }
    \g_projlib_language_settings_common_tl
  }

\tl_gput_right:Nn \g_projlib_language_settings_portuguese_tl
  {
    \selectlanguage { portuguese }
    \g_projlib_language_settings_common_tl
  }

\tl_gput_right:Nn \g_projlib_language_settings_brazilian_tl
  {
    \selectlanguage { brazilian }
    \g_projlib_language_settings_common_tl
  }

\tl_gput_right:Nn \g_projlib_language_settings_spanish_tl
  {
    \selectlanguage { spanish }
    \g_projlib_language_settings_common_tl
  }

\tl_gput_right:Nn \g_projlib_language_settings_russian_tl
  {
    \selectlanguage { russian }
    \g_projlib_language_settings_common_tl
  }

\NewDocumentCommand \AddLanguageSetting { O{} m }
  {
    \IfNoValueTF { #1 }
      {
        \tl_gput_right:Nn \g_projlib_language_settings_common_tl { #2 }
      }
      {
        \tl_gput_right:cn { g_projlib_language_settings_ \projlib_language_str_to_languagename:n { #1 } _tl } { #2 }
      }
  }


\RequirePackage { setspace }

\tl_new:N  \g_projlib_language_linespacing_latin_tl
\tl_new:N  \g_projlib_language_linespacing_cjk_tl

\tl_gset:Nn \g_projlib_language_linespacing_latin_tl
  {
    \setstretch { 1.00 }
  }
\tl_gset:Nn \g_projlib_language_linespacing_cjk_tl
  {
    \onehalfspacing
  }

\cs_new:Nn \projlib_language_set_linespacing_latin:n
  {
    \tl_gset:Nn \g_projlib_language_linespacing_latin_tl { #1 }
  }
\cs_new:Nn \projlib_language_set_linespacing_cjk:n
  {
    \tl_gset:Nn \g_projlib_language_linespacing_cjk_tl { #1 }
  }

\tl_new:N  \g_projlib_language_parindent_latin_tl
\tl_new:N  \g_projlib_language_parindent_cjk_tl

\@ifclassloaded{beamer}
  {
    \tl_gset:Nn \g_projlib_language_parindent_latin_tl
      {
        \dim_set:Nn \parindent { 0em }
      }
    \tl_gset:Nn \g_projlib_language_parindent_cjk_tl
      {
        \dim_set:Nn \parindent { 0em }
      }
  }
  {
    \tl_gset:Nn \g_projlib_language_parindent_latin_tl
      {
        \dim_set:Nn \parindent { 1.5em }
      }
    \tl_gset:Nn \g_projlib_language_parindent_cjk_tl
      {
        \dim_set:Nn \parindent { 2em }
      }
  }

\hook_gput_code:nnn { begindocument } { projlib-language }
  {
    \@ifpackageloaded{parskip}
      {
        \tl_gset:Nn \g_projlib_language_parindent_latin_tl
          {
            \dim_set:Nn \parindent { 0em }
          }
        \tl_gset:Nn \g_projlib_language_parindent_cjk_tl
          {
            \dim_set:Nn \parindent { 0em }
          }
      } {}
  }

\cs_new:Nn \projlib_language_set_parindent_latin:n
  {
    \tl_gset:Nn \g_projlib_language_parindent_latin_tl { #1 }
  }
\cs_new:Nn \projlib_language_set_parindent_cjk:n
  {
    \tl_gset:Nn \g_projlib_language_parindent_cjk_tl { #1 }
  }

\NewDocumentCommand \ProjLibLanguageSet { m m m }
  % #1 = the thing to set
  % #2 = language or type
  % #3 = the setting
  {
    \use:c { projlib_language_set_ #1 _ #2 :n } { #3 }
  }


\cs_new:Nn \projlib_language_use_language_pure:n
  {
    \tl_use:c { g_projlib_language_settings_ \projlib_language_str_to_languagename:n { #1 } _tl }
  }
\cs_generate_variant:Nn \projlib_language_use_language_pure:n { e }

\cs_new:Nn \projlib_language_use_language:n
  {
    \projlib_language_use_language_pure:n { #1 }
    \tl_use:c { g_projlib_language_linespacing_ \projlib_language_str_to_languagetype:n { #1 } _tl }
    \tl_use:c { g_projlib_language_parindent_ \projlib_language_str_to_languagetype:n { #1 } _tl }
  }
\cs_generate_variant:Nn \projlib_language_use_language:n { e }

\NewDocumentCommand \UseLanguage { m }
  {
    \hook_gput_code:nnn { begindocument } { projlib-language }
      {
        \projlib_language_use_language:e { #1 }
      }
  }
\NewDocumentCommand \UseOtherLanguage { m m }
  {
    \group_begin:
      \projlib_language_use_language_pure:e { #1 }
      #2
    \group_end:
  }

\UseLanguage { \g__projlib_language_main_str }


\cs_new:Nn \projlib_langauge_define_multilingual_text:Nn
  { % #1 = command name (with backslash)
    % #2 = key-value name configuration
    \keyval_parse:nnn
      {}
      { \__projlib_langauge_define_multilingual_text_do:nnn { \cs_to_str:N #1 } }
      { #2 }
    \tl_gset:Nn #1
      {
        \tl_use:c { \cs_to_str:N #1 _projlib_language_text_ \languagename }
      }
  }
\cs_generate_variant:Nn \projlib_langauge_define_multilingual_text:Nn { cn }

\cs_new:Nn \__projlib_langauge_define_multilingual_text_do:nnn
  { % #1 = command name
    % #2 = language name
    % #3 = the text
    \exp_args:Ne \tl_gset:cn { #1 _projlib_language_text_ \projlib_language_str_to_languagename:n { #2 } } { #3 }
  }

\NewDocumentCommand \DefineMultilingualText { m m }
  % #1 = command name
  % #2 = key-value name configuration
  {
    \projlib_langauge_define_multilingual_text:Nn #1 { #2 }
  }

\endinput
%%
%% End of file `projlib-language.sty'.
