%%
%% This is file `projlib-datetime.sty',
%% generated with the docstrip utility.
%%
%% Copyright (C) 2021-2023 by Jinwen XU
%% 
%% This is part of the ProjLib Toolkit.
%% 
%% This work may be distributed and/or modified under the conditions of the
%% LaTeX Project Public License, either version 1.3c of this license or (at
%% your option) any later version. The latest version of this license is in
%% 
%%     http://www.latex-project.org/lppl.txt
%% 
%% and version 1.3c or later is part of all distributions of LaTeX version
%% 2005/12/01 or later.
%% 
\NeedsTeXFormat{LaTeX2e}[2022-06-01]
\ProvidesExplPackage
  {projlib-datetime}
  {2023/11/05} {}
  {Convert numeric date-time string to natural language}

\tl_new:N   \g__projlib_datetime_input_format_tl
\tl_gset:Nn \g__projlib_datetime_input_format_tl { year-month-day }

\keys_define:nn { projlib-datetime }
  {
    , plain           .bool_set:N   = \l__projlib_datetime_plain_bool
    , plain           .initial:n    = { false }
    , year-month-day  .code:n       = { \tl_gset:Nn \g__projlib_datetime_input_format_tl { year-month-day } }
    , month-day-year  .code:n       = { \tl_gset:Nn \g__projlib_datetime_input_format_tl { month-day-year } }
    , day-month-year  .code:n       = { \tl_gset:Nn \g__projlib_datetime_input_format_tl { day-month-year } }
    , year-month      .code:n       = { \tl_gset:Nn \g__projlib_datetime_input_format_tl { year-month-day } }
    , month-day       .code:n       = { \tl_gset:Nn \g__projlib_datetime_input_format_tl { year-month-day } }
    , month-year      .code:n       = { \tl_gset:Nn \g__projlib_datetime_input_format_tl { day-month-year } }
    , day-month       .code:n       = { \tl_gset:Nn \g__projlib_datetime_input_format_tl { day-month-year } }
    , unknown         .code:n       = {}
  }
\ProcessKeyOptions [ projlib-datetime ]

\RequirePackage { relsize }

\bool_if:NT \l__projlib_datetime_plain_bool
  {
    \hook_gput_code:nnn { begindocument/before } { projlib-datetime }
      {
        \cs_set:Nn \projlib_datetime_text_superscript:n { #1 }
      }
  }

\tl_new:N \l__projlib_datetime_output_format_tl
\keys_define:nn { projlib-datetime-command }
  {
    , year-month-day  .code:n       = { \tl_set:Nn \g__projlib_datetime_input_format_tl { year-month-day } }
    , month-day-year  .code:n       = { \tl_set:Nn \g__projlib_datetime_input_format_tl { month-day-year } }
    , day-month-year  .code:n       = { \tl_set:Nn \g__projlib_datetime_input_format_tl { day-month-year } }
    , year-month      .code:n       = { \tl_set:Nn \g__projlib_datetime_input_format_tl { year-month-day } }
    , month-day       .code:n       = { \tl_set:Nn \g__projlib_datetime_input_format_tl { year-month-day } }
    , month-year      .code:n       = { \tl_set:Nn \g__projlib_datetime_input_format_tl { day-month-year } }
    , day-month       .code:n       = { \tl_set:Nn \g__projlib_datetime_input_format_tl { day-month-year } }
    , only-year-month .code:n       = { \tl_set:Nn \l__projlib_datetime_output_format_tl { only-year-month } }
    , only~year~month .meta:n       = { only-year-month }
    , only year month .meta:n       = { only-year-month }
    , only-month-day  .code:n       = { \tl_set:Nn \l__projlib_datetime_output_format_tl { only-month-day } }
    , only~month~day  .meta:n       = { only-month-day }
    , only month day  .meta:n       = { only-month-day }
    , only-year       .code:n       = { \tl_set:Nn \l__projlib_datetime_output_format_tl { only-year } }
    , only~year       .meta:n       = { only-year }
    , only year       .meta:n       = { only-year }
    , only-month      .code:n       = { \tl_set:Nn \l__projlib_datetime_output_format_tl { only-month } }
    , only~month      .meta:n       = { only-month }
    , only month      .meta:n       = { only-month }
    , only-day        .code:n       = { \tl_set:Nn \l__projlib_datetime_output_format_tl { only-day } }
    , only~day        .meta:n       = { only-day }
    , only day        .meta:n       = { only-day }
    , unknown         .code:n       = {}
  }

\msg_new:nnnn { projlib-datetime }
  { non-supported-date-format }
  { The~date~format~"#1"~is~not~supported. }
  { The~only~formats~available~are~"year-month-day",~ "month-day-year"~and~"day-month-year". }

\cs_new:Nn \projlib_datetime_set_input_format:n
  {
    \str_case:nnF { #1 }
      {
        { year-month-day } { \tl_gset:Nn \g__projlib_datetime_input_format_tl { year-month-day } }
        { month-day-year } { \tl_gset:Nn \g__projlib_datetime_input_format_tl { month-day-year } }
        { day-month-year } { \tl_gset:Nn \g__projlib_datetime_input_format_tl { day-month-year } }
      }
      {
        \msg_error:nnn  { projlib-datetime } { non-supported-date-format } { #1 }
      }
  }

\NewDocumentCommand \ProjLibSetDatetimeInputFormat { m }
  {
    \tl_set:Nn \l_tmpa_tl { \exp_args:Ne \tl_trim_spaces:n { #1 } }
    \exp_args:Ne \projlib_datetime_set_input_format:n { \l_tmpa_tl }
  }
\ProvideDocumentCommand \SetDatetimeInputFormat {} { \ProjLibSetDatetimeInputFormat }

\seq_new:N \l__projlib_datetime_date_seq

\cs_new_protected:Nn \projlib_datetime_text_superscript:n
  {
    \group_begin:
      \smaller
      \textsuperscript { #1 }
    \group_end:
  }

\cs_new:Nn \__projlib_datetime_today:n
  {
    \str_case_e:nnF { \l__projlib_datetime_output_format_tl }
        {
          { only-year-month }
            {
              \cs_if_exist_use:c { projlib_datetime_display_year_month #1 _ \languagename :nn }
                { \int_use:N \c_sys_year_int }
                { \int_use:N \c_sys_month_int }
            }
          { only-month-day  }
            {
              \cs_if_exist_use:c { projlib_datetime_display_month_day #1 _ \languagename :nn }
                { \int_use:N \c_sys_month_int }
                { \int_use:N \c_sys_day_int }
            }
          { only-year       }
            {
              \cs_if_exist_use:cT { projlib_datetime_display_year #1 _ \languagename :n }
                {
                  { \int_use:N \c_sys_year_int }
                }
            }
          { only-month      }
            {
              \cs_if_exist_use:cT { projlib_datetime_display_month #1 _ \languagename :n }
                {
                  { \int_use:N \c_sys_month_int }
                }
            }
          { only-day        }
            {
              \cs_if_exist_use:cT { projlib_datetime_display_day #1 _ \languagename :n }
                {
                  { \int_use:N \c_sys_day_int }
                }
            }
        }
        {
          \cs_if_exist_use:c { projlib_datetime_display_year_month_day #1 _ \languagename :nnn }
            { \int_use:N \c_sys_year_int }
            { \int_use:N \c_sys_month_int }
            { \int_use:N \c_sys_day_int }
        }
  }

\NewDocumentCommand \ProjLibtoday { O{} }
  {
    \group_begin:
      \keys_set:nn { projlib-datetime-command } { #1 }
      \__projlib_datetime_today:n {}
    \group_end:
  }

\NewDocumentCommand \ProjLibToday { O{} }
  {
    \group_begin:
      \keys_set:nn { projlib-datetime-command } { #1 }
      \__projlib_datetime_today:n { _uppercase }
    \group_end:
  }

\cs_new_protected:Nn \projlib_datetime_display_year_month_day:n
  {
    \__projlib_datetime_display_year_month_day:en { #1 } {}
  }

\cs_new_protected:Nn \projlib_datetime_display_year_month_day_uppercase:n
  {
    \__projlib_datetime_display_year_month_day:en { #1 } { _uppercase }
  }

\cs_new_protected:Nn \__projlib_datetime_display_year_month_day:nn
  {
    \regex_match:nnTF { \A \d{4}-\d{1,2}-\d{1,2} \Z } { #1 }
      {
        \seq_set_split:Nnn \l__projlib_datetime_date_seq { - } { #1 }
        \cs_if_exist_use:c { projlib_datetime_display_year_month_day #2 _ \languagename :nnn }
          { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 1 } } } % year
          { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 2 } } } % month
          { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 3 } } } % day
      }
      {
        \regex_match:nnTF { \A \d{4}-\d{1,2} \Z } { #1 }
          {
            \seq_set_split:Nnn \l__projlib_datetime_date_seq { - } { #1 }
            \cs_if_exist_use:c { projlib_datetime_display_year_month #2 _ \languagename :nn }
              { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 1 } } } % year
              { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 2 } } } % month
          }
          {
            \regex_match:nnTF { \A \d{1,2}-\d{1,2} \Z } { #1 }
              {
                \seq_set_split:Nnn \l__projlib_datetime_date_seq { - } { #1 }
                \cs_if_exist_use:c { projlib_datetime_display_month_day #2 _ \languagename :nn }
                  { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 1 } } } % month
                  { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 2 } } } % day
              }
              {
                #1
              }
          }
      }
  }
\cs_generate_variant:Nn \__projlib_datetime_display_year_month_day:nn { en }

\cs_new_protected:Nn \projlib_datetime_display_month_day_year:n
  {
    \__projlib_datetime_display_month_day_year:en { #1 } {}
  }

\cs_new_protected:Nn \projlib_datetime_display_month_day_year_uppercase:n
  {
    \__projlib_datetime_display_month_day_year:en { #1 } { _uppercase }
  }

\cs_new_protected:Nn \__projlib_datetime_display_month_day_year:nn
  {
    \regex_match:nnTF { \A \d{1,2}-\d{1,2}-\d{4} \Z } { #1 }
      {
        \seq_set_split:Nnn \l__projlib_datetime_date_seq { - } { #1 }
        \cs_if_exist_use:c { projlib_datetime_display_year_month_day #2 _ \languagename :nnn }
          { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 3 } } } % year
          { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 1 } } } % month
          { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 2 } } } % day
      }
      {
        \regex_match:nnTF { \A \d{1,2}-\d{4} \Z } { #1 }
          {
            \seq_set_split:Nnn \l__projlib_datetime_date_seq { - } { #1 }
            \cs_if_exist_use:c { projlib_datetime_display_year_month #2 _ \languagename :nn }
              { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 2 } } } % year
              { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 1 } } } % month
          }
          {
            \regex_match:nnTF { \A \d{1,2}-\d{1,2} \Z } { #1 }
              {
                \seq_set_split:Nnn \l__projlib_datetime_date_seq { - } { #1 }
                \cs_if_exist_use:c { projlib_datetime_display_month_day #2 _ \languagename :nn }
                  { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 1 } } } % month
                  { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 2 } } } % day
              }
              {
                #1
              }
          }
      }
  }
\cs_generate_variant:Nn \__projlib_datetime_display_month_day_year:nn { en }

\cs_new_protected:Nn \projlib_datetime_display_day_month_year:n
  {
    \__projlib_datetime_display_day_month_year:en { #1 } {}
  }

\cs_new_protected:Nn \projlib_datetime_display_day_month_year_uppercase:n
  {
    \__projlib_datetime_display_day_month_year:en { #1 } { _uppercase }
  }

\cs_new_protected:Nn \__projlib_datetime_display_day_month_year:nn
  {
    \regex_match:nnTF { \A \d{1,2}-\d{1,2}-\d{4} \Z } { #1 }
      {
        \seq_set_split:Nnn \l__projlib_datetime_date_seq { - } { #1 }
        \cs_if_exist_use:c { projlib_datetime_display_year_month_day #2 _ \languagename :nnn }
          { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 3 } } } % year
          { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 2 } } } % month
          { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 1 } } } % day
      }
      {
        \regex_match:nnTF { \A \d{1,2}-\d{4} \Z } { #1 }
          {
            \seq_set_split:Nnn \l__projlib_datetime_date_seq { - } { #1 }
            \cs_if_exist_use:c { projlib_datetime_display_year_month #2 _ \languagename :nn }
              { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 2 } } } % year
              { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 1 } } } % month
          }
          {
            \regex_match:nnTF { \A \d{1,2}-\d{1,2} \Z } { #1 }
              {
                \seq_set_split:Nnn \l__projlib_datetime_date_seq { - } { #1 }
                \cs_if_exist_use:c { projlib_datetime_display_month_day #2 _ \languagename :nn }
                  { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 2 } } } % month
                  { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 1 } } } % day
              }
              {
                #1
              }
          }
      }
  }
\cs_generate_variant:Nn \__projlib_datetime_display_day_month_year:nn { en }

\cs_new_protected:Nn \__projlib_datetime_date_parse_year_month_day:n
  {
    \regex_match:nnTF { \A \d{4}-\d{1,2}(|-\d{1,2}) \Z } { #1 }
      {
        \seq_set_split:Nnn \l__projlib_datetime_date_seq { - } { #1 }
      }
      {
        \regex_match:nnT { \A \d{1,2}-\d{1,2} \Z } { #1 }
          {
            \seq_set_split:Nnn \l__projlib_datetime_date_seq { - } { #1 }
            \seq_put_left:Nn \l__projlib_datetime_date_seq {}
          }
      }
  }
\cs_generate_variant:Nn \__projlib_datetime_date_parse_year_month_day:n { e }

\cs_new_protected:Nn \__projlib_datetime_date_parse_month_day_year:n
  {
    \regex_match:nnTF { \A \d{1,2}(|-\d{1,2})-\d{4} \Z } { #1 }
      {
        \seq_set_split:Nnn \l__projlib_datetime_date_seq { - } { #1 }
        \seq_pop_right:NN \l__projlib_datetime_date_seq \l_tmpa_tl
        \seq_put_left:NV \l__projlib_datetime_date_seq \l_tmpa_tl
      }
      {
        \regex_match:nnT { \A \d{1,2}-\d{1,2} \Z } { #1 }
          {
            \seq_set_split:Nnn \l__projlib_datetime_date_seq { - } { #1 }
            \seq_put_left:Nn \l__projlib_datetime_date_seq {}
          }
      }
  }
\cs_generate_variant:Nn \__projlib_datetime_date_parse_month_day_year:n { e }

\cs_new_protected:Nn \__projlib_datetime_date_parse_day_month_year:n
  {
    \regex_match:nnTF { \A \d{1,2}(|-\d{1,2})-\d{4} \Z } { #1 }
      {
        \seq_set_split:Nnn \l__projlib_datetime_date_seq { - } { #1 }
        \seq_reverse:N \l__projlib_datetime_date_seq
      }
      {
        \regex_match:nnT { \A \d{1,2}-\d{1,2} \Z } { #1 }
          {
            \seq_set_split:Nnn \l__projlib_datetime_date_seq { - } { #1 }
            \seq_reverse:N \l__projlib_datetime_date_seq
            \seq_put_left:Nn \l__projlib_datetime_date_seq {}
          }
      }
  }
\cs_generate_variant:Nn \__projlib_datetime_date_parse_day_month_year:n { e }

\cs_new:Nn \__projlib_datetime_input_format_to_str:
  {
    \str_case_e:nn { \g__projlib_datetime_input_format_tl }
      {
        { year-month-day } { year_month_day }
        { month-day-year } { month_day_year }
        { day-month-year } { day_month_year }
      }
  }

\cs_new_protected:Nn \__projlib_datetime_display_date_according_to_format:nn
  {
    \tl_set:Nx \l_tmpa_tl { #1 }
    \regex_replace_all:nnN { \D } { - } \l_tmpa_tl
    \cs_if_exist_use:c { __projlib_datetime_date_parse_ \__projlib_datetime_input_format_to_str: :e } { \l_tmpa_tl }
    \str_case_e:nnF { \l__projlib_datetime_output_format_tl }
      {
        { only-year-month }
          {
            \cs_if_exist_use:c { projlib_datetime_display_year_month #2 _ \languagename :nn }
              { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 1 } } }
              { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 2 } } }
          }
        { only-month-day  }
          {
            \cs_if_exist_use:c { projlib_datetime_display_month_day #2 _ \languagename :nn }
              { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 2 } } }
              { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 3 } } }
          }
        { only-year       }
          {
            \cs_if_exist_use:c { projlib_datetime_display_year #2 _ \languagename :n }
              { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 1 } } }
          }
        { only-month      }
          {
            \cs_if_exist_use:c { projlib_datetime_display_month #2 _ \languagename :n }
              { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 2 } } }
          }
        { only-day        }
          {
            \cs_if_exist_use:c { projlib_datetime_display_day #2 _ \languagename :n }
              { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 3 } } }
          }
      }
      {
        \cs_if_exist_use:c { projlib_datetime_display_ \__projlib_datetime_input_format_to_str: #2 :n } { #1 }
      }
  }

\NewDocumentCommand \ProjLibdate { O{} m O{} }
  {
    \group_begin:
      \tl_if_blank:oF { #1 } { \keys_set:nn { projlib-datetime-command } { #1 } }
      \tl_if_blank:oF { #3 } { \keys_set:nn { projlib-datetime-command } { #3 } }
      \tl_set:Nx \l_tmpa_tl { \exp_args:Ne \tl_trim_spaces:n { #2 } }
      \regex_replace_all:nnN { \D } { - } \l_tmpa_tl
      \exp_args:Ne \__projlib_datetime_display_date_according_to_format:nn { \l_tmpa_tl } {}
    \group_end:
  }

\NewDocumentCommand \ProjLibDate { O{} m O{} }
  {
    \group_begin:
      \tl_if_blank:oF { #1 } { \keys_set:nn { projlib-datetime-command } { #1 } }
      \tl_if_blank:oF { #3 } { \keys_set:nn { projlib-datetime-command } { #3 } }
      \tl_set:Nx \l_tmpa_tl { \exp_args:Ne \tl_trim_spaces:n { #2 } }
      \regex_replace_all:nnN { \D } { - } \l_tmpa_tl
      \exp_args:Ne \__projlib_datetime_display_date_according_to_format:nn { \l_tmpa_tl } { _uppercase }
    \group_end:
  }

\ProvideDocumentCommand \Thedate {} { \ProjLibdate }
\ProvideDocumentCommand \TheDate {} { \ProjLibDate }

\int_new:N \l__projlib_datetime_day_of_week_day_int
\int_new:N \l__projlib_datetime_day_of_week_month_int
\int_new:N \l__projlib_datetime_day_of_week_year_int
\int_new:N \l__projlib_datetime_day_of_week_century_int
\int_new:N \l__projlib_datetime_day_of_week_result_int
\cs_new:Nn \__projlib_datetime_calculate_day_of_week_with_year_month_day:nnn
  {
    \int_set:Nn \l__projlib_datetime_day_of_week_day_int { #3 }
    \int_compare:nNnTF { #2 } < { 3 }
      {
        \int_set:Nn \l__projlib_datetime_day_of_week_year_int { \int_eval:n { #1 - 1 } }
      }
      {
        \int_set:Nn \l__projlib_datetime_day_of_week_year_int { #1 }
      }
    \int_set:Nn \l__projlib_datetime_day_of_week_century_int { \int_eval:n { \l__projlib_datetime_day_of_week_year_int / 100 } }
    \int_set:Nn \l__projlib_datetime_day_of_week_year_int { \int_mod:nn { \l__projlib_datetime_day_of_week_year_int } { 100 } }
    \int_set:Nn \l__projlib_datetime_day_of_week_month_int
      {
        \int_case:nnF { #2 }
          {
            {  1 } { 0 }
            {  2 } { 3 }
            {  3 } { 2 }
            {  4 } { 5 }
            {  5 } { 0 }
            {  6 } { 3 }
            {  7 } { 5 }
            {  8 } { 1 }
            {  9 } { 4 }
            { 10 } { 6 }
            { 11 } { 2 }
            { 12 } { 4 }
          }        { 0 }
      }
    \int_set:Nn \l__projlib_datetime_day_of_week_result_int
      {
        \int_eval:n
          {
              \l__projlib_datetime_day_of_week_day_int
            + \l__projlib_datetime_day_of_week_month_int
            +\l__projlib_datetime_day_of_week_year_int
            + \int_div_truncate:nn { \l__projlib_datetime_day_of_week_year_int } { 4 }
            + \int_div_truncate:nn { \l__projlib_datetime_day_of_week_century_int } { 4 }
            - 2 * \l__projlib_datetime_day_of_week_century_int
          }
      }
    \int_set:Nn \l__projlib_datetime_day_of_week_result_int
      {
        \int_mod:nn { \l__projlib_datetime_day_of_week_result_int } { 7 }
      }
    \int_compare:nNnT { \l__projlib_datetime_day_of_week_result_int } < { 1 }
      {
        \int_set:Nn \l__projlib_datetime_day_of_week_result_int
          {
            \int_eval:n { \l__projlib_datetime_day_of_week_result_int + 7 }
          }
      }
  }

\cs_new_protected:Nn \projlib_datetime_display_week:n
  {
    \__projlib_datetime_display_week_according_to_format:en { #1 } {}
  }

\cs_new_protected:Nn \projlib_datetime_display_week_uppercase:n
  {
    \__projlib_datetime_display_week_according_to_format:en { #1 } { _uppercase }
  }

\cs_new_protected:Nn \__projlib_datetime_display_week_according_to_format:nn
  {
    \projlib_datetime_calculate_week_according_to_format:n { #1 }
    \cs_if_exist_use:c { projlib_datetime_display_week #2 _ \languagename :n } { \l__projlib_datetime_day_of_week_result_int }
  }
\cs_generate_variant:Nn \__projlib_datetime_display_week_according_to_format:nn { en }

\cs_new_protected:Nn \projlib_datetime_calculate_week_according_to_format:n
  {
    \tl_set:Nx \l_tmpa_tl { #1 }
    \regex_replace_all:nnN { \D } { - } \l_tmpa_tl
    \cs_if_exist_use:c { __projlib_datetime_date_parse_ \__projlib_datetime_input_format_to_str: :e } { \l_tmpa_tl }
    \__projlib_datetime_calculate_day_of_week_with_year_month_day:nnn
      { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 1 } } }
      { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 2 } } }
      { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 3 } } }
  }


\cs_new:Nn \projlib_datetime_display_year_month_day_english:nnn
  {
    \projlib_datetime_display_month_day_english:nn { #2 } { #3 }
    ,\nobreakspace
    \projlib_datetime_display_year_english:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_english:nnn { VVV, eee }

\cs_new:Nn \projlib_datetime_display_year_month_day_uppercase_english:nnn
  {
    \projlib_datetime_display_month_day_uppercase_english:nn { #2 } { #3 }
    ,\nobreakspace
    \projlib_datetime_display_year_english:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_uppercase_english:nnn { VVV, eee }

\cs_new:Nn \projlib_datetime_display_year_month_english:nn
  {
    \projlib_datetime_display_month_english:n { #2 }
    \nobreakspace
    \projlib_datetime_display_year_english:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_english:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_year_month_uppercase_english:nn
  {
    \projlib_datetime_display_month_uppercase_english:n { #2 }
    \nobreakspace
    \projlib_datetime_display_year_english:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_uppercase_english:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_month_day_english:nn
  {
    \projlib_datetime_display_month_english:n { #1 }
    \nobreakspace
    \projlib_datetime_display_day_english:n { #2 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_month_day_english:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_month_day_uppercase_english:nn
  {
    \projlib_datetime_display_month_uppercase_english:n { #1 }
    \nobreakspace
    \projlib_datetime_display_day_english:n { #2 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_month_day_uppercase_english:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_year_english:n { #1 }
\cs_new:Nn \projlib_datetime_display_year_uppercase_english:n { #1 }

\cs_new:Nn \projlib_datetime_display_month_english:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { January   }
        { 2 }  { February  }
        { 3 }  { March     }
        { 4 }  { April     }
        { 5 }  { May       }
        { 6 }  { June      }
        { 7 }  { July      }
        { 8 }  { August    }
        { 9 }  { September }
        { 10 } { October   }
        { 11 } { November  }
        { 12 } { December  }
      } { #1 }
  }

\cs_new:Nn \projlib_datetime_display_month_uppercase_english:n
  {
    \projlib_datetime_display_month_english:n { #1 }
  }

\cs_new:Nn \projlib_datetime_display_day_english:n { #1 }
\cs_new:Nn \projlib_datetime_display_day_uppercase_english:n { #1 }

\cs_new:Nn \projlib_datetime_display_week_english:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { Monday    }
        { 2 }  { Tuesday   }
        { 3 }  { Wednesday }
        { 4 }  { Thursday  }
        { 5 }  { Friday    }
        { 6 }  { Saturday  }
        { 7 }  { Sunday    }
      } { ??? }
  }

\cs_new:Nn \projlib_datetime_display_week_uppercase_english:n
  {
    \projlib_datetime_display_week_english:n { #1 }
  }

\cs_new:Nn \projlib_datetime_display_year_month_day_french:nnn
  {
    \projlib_datetime_display_month_day_french:nn { #2 } { #3 }
    \nobreakspace
    \projlib_datetime_display_year_french:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_french:nnn { VVV, eee }

\cs_new:Nn \projlib_datetime_display_year_month_day_uppercase_french:nnn
  {
    \projlib_datetime_display_month_day_uppercase_french:nn { #2 } { #3 }
    \nobreakspace
    \projlib_datetime_display_year_french:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_uppercase_french:nnn { VVV, eee }

\cs_new:Nn \projlib_datetime_display_year_month_french:nn
  {
    \projlib_datetime_display_month_french:n { #2 }
    \nobreakspace
    \projlib_datetime_display_year_french:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_french:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_year_month_uppercase_french:nn
  {
    \projlib_datetime_display_month_uppercase_french:n { #2 }
    \nobreakspace
    \projlib_datetime_display_year_french:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_uppercase_french:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_month_day_french:nn
  {
    \projlib_datetime_display_day_french:n { #2 }
    \nobreakspace
    \projlib_datetime_display_month_french:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_month_day_french:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_month_day_uppercase_french:nn
  {
    \projlib_datetime_display_month_day_french:nn { #1 } { #2 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_month_day_uppercase_french:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_year_french:n { #1 }
\cs_new:Nn \projlib_datetime_display_year_uppercase_french:n { #1 }

\cs_new:Nn \projlib_datetime_display_month_french:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { janvier   }
        { 2 }  { février   }
        { 3 }  { mars      }
        { 4 }  { avril     }
        { 5 }  { mai       }
        { 6 }  { juin      }
        { 7 }  { juillet   }
        { 8 }  { août      }
        { 9 }  { septembre }
        { 10 } { octobre   }
        { 11 } { novembre  }
        { 12 } { décembre  }
      } { #1 }
  }

\cs_new:Nn \projlib_datetime_display_month_uppercase_french:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { Janvier   }
        { 2 }  { Février   }
        { 3 }  { Mars      }
        { 4 }  { Avril     }
        { 5 }  { Mai       }
        { 6 }  { Juin      }
        { 7 }  { Juillet   }
        { 8 }  { Août      }
        { 9 }  { Septembre }
        { 10 } { Octobre   }
        { 11 } { Novembre  }
        { 12 } { Décembre  }
      } { #1 }
  }

\cs_new:Nn \projlib_datetime_display_day_french:n
  {
    \int_case:nnF { #1 }
      {
        { 1 } { 1 \projlib_datetime_text_superscript:n { er } }
      } { #1 }
  }

\cs_new:Nn \projlib_datetime_display_day_uppercase_french:n
  {
    \int_case:nnF { #1 }
      {
        { 1 } { 1 \projlib_datetime_text_superscript:n { er } }
      } { #1 }
  }

\cs_new:Nn \projlib_datetime_display_week_french:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { lundi    }
        { 2 }  { mardi    }
        { 3 }  { mercredi }
        { 4 }  { jeudi    }
        { 5 }  { vendredi }
        { 6 }  { samedi   }
        { 7 }  { dimanche }
      } { ??? }
  }

\cs_new:Nn \projlib_datetime_display_week_uppercase_french:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { Lundi    }
        { 2 }  { Mardi    }
        { 3 }  { Mercredi }
        { 4 }  { Jeudi    }
        { 5 }  { Vendredi }
        { 6 }  { Samedi   }
        { 7 }  { Dimanche }
      } { ??? }
  }

\cs_new:Nn \projlib_datetime_display_year_month_day_ngerman:nnn
  {
    \projlib_datetime_display_month_day_ngerman:nn { #2 } { #3 }
    \nobreakspace
    \projlib_datetime_display_year_ngerman:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_ngerman:nnn { VVV, eee }

\cs_new:Nn \projlib_datetime_display_year_month_day_uppercase_ngerman:nnn
  {
    \projlib_datetime_display_month_day_uppercase_ngerman:nn { #2 } { #3 }
    \nobreakspace
    \projlib_datetime_display_year_ngerman:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_uppercase_ngerman:nnn { VVV, eee }

\cs_new:Nn \projlib_datetime_display_year_month_ngerman:nn
  {
    \projlib_datetime_display_month_ngerman:n { #2 }
    \nobreakspace
    \projlib_datetime_display_year_ngerman:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_ngerman:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_year_month_uppercase_ngerman:nn
  {
    \projlib_datetime_display_month_uppercase_ngerman:n { #2 }
    \nobreakspace
    \projlib_datetime_display_year_ngerman:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_uppercase_ngerman:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_month_day_ngerman:nn
  {
    \projlib_datetime_display_day_ngerman:n { #2 }
    .\nobreakspace
    \projlib_datetime_display_month_ngerman:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_month_day_ngerman:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_month_day_uppercase_ngerman:nn
  {
    \projlib_datetime_display_month_day_ngerman:nn { #1 } { #2 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_month_day_uppercase_ngerman:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_year_ngerman:n { #1 }
\cs_new:Nn \projlib_datetime_display_year_uppercase_ngerman:n { #1 }

\cs_new:Nn \projlib_datetime_display_month_ngerman:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { Januar    }
        { 2 }  { Februar   }
        { 3 }  { März      }
        { 4 }  { April     }
        { 5 }  { Mai       }
        { 6 }  { Juni      }
        { 7 }  { Juli      }
        { 8 }  { August    }
        { 9 }  { September }
        { 10 } { Oktober   }
        { 11 } { November  }
        { 12 } { Dezember  }
      } { #1 }
  }

\cs_new:Nn \projlib_datetime_display_month_uppercase_ngerman:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { Januar    }
        { 2 }  { Februar   }
        { 3 }  { März      }
        { 4 }  { April     }
        { 5 }  { Mai       }
        { 6 }  { Juni      }
        { 7 }  { Juli      }
        { 8 }  { August    }
        { 9 }  { September }
        { 10 } { Oktober   }
        { 11 } { November  }
        { 12 } { Dezember  }
      } { #1 }
  }

\cs_new:Nn \projlib_datetime_display_day_ngerman:n { #1 }
\cs_new:Nn \projlib_datetime_display_day_uppercase_ngerman:n { #1 }

\cs_new:Nn \projlib_datetime_display_week_ngerman:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { Montag     }
        { 2 }  { Dienstag   }
        { 3 }  { Mittwoch   }
        { 4 }  { Donnerstag }
        { 5 }  { Freitag    }
        { 6 }  { Samstag    }
        { 7 }  { Sonntag    }
      } { ??? }
  }

\cs_new:Nn \projlib_datetime_display_week_uppercase_ngerman:n
  {
    \projlib_datetime_display_week_ngerman:n { #1 }
  }

\cs_new:Nn \projlib_datetime_display_year_month_day_italian:nnn
  {
    \projlib_datetime_display_month_day_italian:nn { #2 } { #3 }
    \nobreakspace
    \projlib_datetime_display_year_italian:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_italian:nnn { VVV, eee }

\cs_new:Nn \projlib_datetime_display_year_month_day_uppercase_italian:nnn
  {
    \projlib_datetime_display_month_day_uppercase_italian:nn { #2 } { #3 }
    \nobreakspace
    \projlib_datetime_display_year_italian:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_uppercase_italian:nnn { VVV, eee }

\cs_new:Nn \projlib_datetime_display_year_month_italian:nn
  {
    \projlib_datetime_display_month_italian:n { #2 }
    \nobreakspace
    \projlib_datetime_display_year_italian:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_italian:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_year_month_uppercase_italian:nn
  {
    \projlib_datetime_display_month_uppercase_italian:n { #2 }
    \nobreakspace
    \projlib_datetime_display_year_italian:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_uppercase_italian:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_month_day_italian:nn
  {
    \projlib_datetime_display_day_italian:n { #2 }
    \nobreakspace
    \projlib_datetime_display_month_italian:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_month_day_italian:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_month_day_uppercase_italian:nn
  {
    \projlib_datetime_display_month_day_italian:nn { #1 } { #2 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_month_day_uppercase_italian:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_year_italian:n { #1 }
\cs_new:Nn \projlib_datetime_display_year_uppercase_italian:n { #1 }

\cs_new:Nn \projlib_datetime_display_month_italian:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { gennaio   }
        { 2 }  { febbraio  }
        { 3 }  { marzo     }
        { 4 }  { aprile    }
        { 5 }  { maggio    }
        { 6 }  { giugno    }
        { 7 }  { luglio    }
        { 8 }  { agosto    }
        { 9 }  { settembre }
        { 10 } { ottobre   }
        { 11 } { novembre  }
        { 12 } { dicembre  }
      } { #1 }
  }

\cs_new:Nn \projlib_datetime_display_month_uppercase_italian:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { Gennaio   }
        { 2 }  { Febbraio  }
        { 3 }  { Marzo     }
        { 4 }  { Aprile    }
        { 5 }  { Maggio    }
        { 6 }  { Giugno    }
        { 7 }  { Luglio    }
        { 8 }  { Agosto    }
        { 9 }  { Settembre }
        { 10 } { Ottobre   }
        { 11 } { Novembre  }
        { 12 } { Dicembre  }
      } { #1 }
  }

\cs_new:Nn \projlib_datetime_display_day_italian:n { #1 }
\cs_new:Nn \projlib_datetime_display_day_uppercase_italian:n { #1 }

\cs_new:Nn \projlib_datetime_display_week_italian:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { lunedì     }
        { 2 }  { martedì    }
        { 3 }  { mercoledì  }
        { 4 }  { giovedì    }
        { 5 }  { venerdì    }
        { 6 }  { sabato     }
        { 7 }  { domenica   }
      } { ??? }
  }

\cs_new:Nn \projlib_datetime_display_week_uppercase_italian:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { Lunedì     }
        { 2 }  { Martedì    }
        { 3 }  { Mercoledì  }
        { 4 }  { Giovedì    }
        { 5 }  { Venerdì    }
        { 6 }  { Sabato     }
        { 7 }  { Domenica   }
      } { ??? }
  }

\cs_new:Nn \projlib_datetime_display_year_month_day_portuguese:nnn
  {
    \projlib_datetime_display_month_day_portuguese:nn { #2 } { #3 }
    \nobreakspace de \nobreakspace
    \projlib_datetime_display_year_portuguese:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_portuguese:nnn { VVV, eee }

\cs_new:Nn \projlib_datetime_display_year_month_day_uppercase_portuguese:nnn
  {
    \projlib_datetime_display_month_day_uppercase_portuguese:nn { #2 } { #3 }
    \nobreakspace de \nobreakspace
    \projlib_datetime_display_year_portuguese:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_uppercase_portuguese:nnn { VVV, eee }

\cs_new:Nn \projlib_datetime_display_year_month_portuguese:nn
  {
    \projlib_datetime_display_month_portuguese:n { #2 }
    \nobreakspace
    \projlib_datetime_display_year_portuguese:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_portuguese:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_year_month_uppercase_portuguese:nn
  {
    \projlib_datetime_display_month_uppercase_portuguese:n { #2 }
    \nobreakspace
    \projlib_datetime_display_year_portuguese:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_uppercase_portuguese:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_month_day_portuguese:nn
  {
    \projlib_datetime_display_day_portuguese:n { #2 }
    \nobreakspace de \nobreakspace
    \projlib_datetime_display_month_uppercase_portuguese:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_month_day_portuguese:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_month_day_uppercase_portuguese:nn
  {
    \projlib_datetime_display_month_day_portuguese:nn { #1 } { #2 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_month_day_uppercase_portuguese:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_year_portuguese:n { #1 }
\cs_new:Nn \projlib_datetime_display_year_uppercase_portuguese:n { #1 }

\cs_new:Nn \projlib_datetime_display_month_portuguese:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { janeiro   }
        { 2 }  { fevereiro }
        { 3 }  { março     }
        { 4 }  { abril     }
        { 5 }  { maio      }
        { 6 }  { junho     }
        { 7 }  { julho     }
        { 8 }  { agosto    }
        { 9 }  { setembro  }
        { 10 } { outubro   }
        { 11 } { novembro  }
        { 12 } { dezembro  }
      } { #1 }
  }

\cs_new:Nn \projlib_datetime_display_month_uppercase_portuguese:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { Janeiro   }
        { 2 }  { Fevereiro }
        { 3 }  { Março     }
        { 4 }  { Abril     }
        { 5 }  { Maio      }
        { 6 }  { Junho     }
        { 7 }  { Julho     }
        { 8 }  { Agosto    }
        { 9 }  { Setembro  }
        { 10 } { Outubro   }
        { 11 } { Novembro  }
        { 12 } { Dezembro  }
      } { #1 }
  }

\cs_new:Nn \projlib_datetime_display_day_portuguese:n { #1 }
\cs_new:Nn \projlib_datetime_display_day_uppercase_portuguese:n { #1 }

\cs_new:Nn \projlib_datetime_display_week_portuguese:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { segunda-feira }
        { 2 }  { terça-feira   }
        { 3 }  { quarta-feira  }
        { 4 }  { quinta-feira  }
        { 5 }  { sexta-feira   }
        { 6 }  { sábado        }
        { 7 }  { domingo       }
      } { ??? }
  }

\cs_new:Nn \projlib_datetime_display_week_uppercase_portuguese:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { Segunda-feira }
        { 2 }  { Terça-feira   }
        { 3 }  { Quarta-feira  }
        { 4 }  { Quinta-feira  }
        { 5 }  { Sexta-feira   }
        { 6 }  { Sábado        }
        { 7 }  { Domingo       }
      } { ??? }
  }

\cs_new:Nn \projlib_datetime_display_year_month_day_brazilian:nnn
  {
    \projlib_datetime_display_month_day_brazilian:nn { #2 } { #3 }
    \nobreakspace de \nobreakspace
    \projlib_datetime_display_year_brazilian:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_brazilian:nnn { VVV, eee }

\cs_new:Nn \projlib_datetime_display_year_month_day_uppercase_brazilian:nnn
  {
    \projlib_datetime_display_month_day_uppercase_brazilian:nn { #2 } { #3 }
    \nobreakspace de \nobreakspace
    \projlib_datetime_display_year_brazilian:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_uppercase_brazilian:nnn { VVV, eee }

\cs_new:Nn \projlib_datetime_display_year_month_brazilian:nn
  {
    \projlib_datetime_display_month_brazilian:n { #2 }
    \nobreakspace
    \projlib_datetime_display_year_brazilian:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_brazilian:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_year_month_uppercase_brazilian:nn
  {
    \projlib_datetime_display_month_uppercase_brazilian:n { #2 }
    \nobreakspace
    \projlib_datetime_display_year_brazilian:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_uppercase_brazilian:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_month_day_brazilian:nn
  {
    \projlib_datetime_display_day_brazilian:n { #2 }
    \nobreakspace de \nobreakspace
    \projlib_datetime_display_month_uppercase_brazilian:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_month_day_brazilian:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_month_day_uppercase_brazilian:nn
  {
    \projlib_datetime_display_month_day_brazilian:nn { #1 } { #2 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_month_day_uppercase_brazilian:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_year_brazilian:n { #1 }
\cs_new:Nn \projlib_datetime_display_year_uppercase_brazilian:n { #1 }

\cs_new:Nn \projlib_datetime_display_month_brazilian:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { janeiro   }
        { 2 }  { fevereiro }
        { 3 }  { março     }
        { 4 }  { abril     }
        { 5 }  { maio      }
        { 6 }  { junho     }
        { 7 }  { julho     }
        { 8 }  { agosto    }
        { 9 }  { setembro  }
        { 10 } { outubro   }
        { 11 } { novembro  }
        { 12 } { dezembro  }
      } { #1 }
  }

\cs_new:Nn \projlib_datetime_display_month_uppercase_brazilian:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { Janeiro   }
        { 2 }  { Fevereiro }
        { 3 }  { Março     }
        { 4 }  { Abril     }
        { 5 }  { Maio      }
        { 6 }  { Junho     }
        { 7 }  { Julho     }
        { 8 }  { Agosto    }
        { 9 }  { Setembro  }
        { 10 } { Outubro   }
        { 11 } { Novembro  }
        { 12 } { Dezembro  }
      } { #1 }
  }

\cs_new:Nn \projlib_datetime_display_day_brazilian:n { #1 }
\cs_new:Nn \projlib_datetime_display_day_uppercase_brazilian:n { #1 }

\cs_new:Nn \projlib_datetime_display_week_brazilian:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { segunda-feira }
        { 2 }  { terça-feira   }
        { 3 }  { quarta-feira  }
        { 4 }  { quinta-feira  }
        { 5 }  { sexta-feira   }
        { 6 }  { sábado        }
        { 7 }  { domingo       }
      } { ??? }
  }

\cs_new:Nn \projlib_datetime_display_week_uppercase_brazilian:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { Segunda-feira }
        { 2 }  { Terça-feira   }
        { 3 }  { Quarta-feira  }
        { 4 }  { Quinta-feira  }
        { 5 }  { Sexta-feira   }
        { 6 }  { Sábado        }
        { 7 }  { Domingo       }
      } { ??? }
  }

\cs_new:Nn \projlib_datetime_display_year_month_day_spanish:nnn
  {
    \projlib_datetime_display_month_day_spanish:nn { #2 } { #3 }
    \nobreakspace de \nobreakspace
    \projlib_datetime_display_year_spanish:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_spanish:nnn { VVV, eee }

\cs_new:Nn \projlib_datetime_display_year_month_day_uppercase_spanish:nnn
  {
    \projlib_datetime_display_month_day_uppercase_spanish:nn { #2 } { #3 }
    \nobreakspace de \nobreakspace
    \projlib_datetime_display_year_spanish:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_uppercase_spanish:nnn { VVV, eee }

\cs_new:Nn \projlib_datetime_display_year_month_spanish:nn
  {
    \projlib_datetime_display_month_spanish:n { #2 }
    \nobreakspace de \nobreakspace
    \projlib_datetime_display_year_spanish:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_spanish:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_year_month_uppercase_spanish:nn
  {
    \projlib_datetime_display_month_uppercase_spanish:n { #2 }
    \nobreakspace de \nobreakspace
    \projlib_datetime_display_year_spanish:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_uppercase_spanish:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_month_day_spanish:nn
  {
    \projlib_datetime_display_day_spanish:n { #2 }
    \nobreakspace de \nobreakspace
    \projlib_datetime_display_month_spanish:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_month_day_spanish:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_month_day_uppercase_spanish:nn
  {
    \projlib_datetime_display_month_day_spanish:nn { #1 } { #2 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_month_day_uppercase_spanish:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_year_spanish:n { #1 }
\cs_new:Nn \projlib_datetime_display_year_uppercase_spanish:n { #1 }

\cs_new:Nn \projlib_datetime_display_month_spanish:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { enero      }
        { 2 }  { febrero    }
        { 3 }  { marzo      }
        { 4 }  { abril      }
        { 5 }  { mayo       }
        { 6 }  { junio      }
        { 7 }  { julio      }
        { 8 }  { agosto     }
        { 9 }  { septiembre }
        { 10 } { octubre    }
        { 11 } { noviembre  }
        { 12 } { diciembre  }
      } { #1 }
  }

\cs_new:Nn \projlib_datetime_display_month_uppercase_spanish:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { Enero      }
        { 2 }  { Febrero    }
        { 3 }  { Marzo      }
        { 4 }  { Abril      }
        { 5 }  { Mayo       }
        { 6 }  { Junio      }
        { 7 }  { Julio      }
        { 8 }  { Agosto     }
        { 9 }  { Septiembre }
        { 10 } { Octubre    }
        { 11 } { Noviembre  }
        { 12 } { Diciembre  }
      } { #1 }
  }

\cs_new:Nn \projlib_datetime_display_day_spanish:n { #1 }
\cs_new:Nn \projlib_datetime_display_day_uppercase_spanish:n { #1 }

\cs_new:Nn \projlib_datetime_display_week_spanish:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { lunes      }
        { 2 }  { martes     }
        { 3 }  { miércoles  }
        { 4 }  { jueves     }
        { 5 }  { viernes    }
        { 6 }  { sábado     }
        { 7 }  { domingo    }
      } { ??? }
  }

\cs_new:Nn \projlib_datetime_display_week_uppercase_spanish:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { Lunes      }
        { 2 }  { Martes     }
        { 3 }  { Miércoles  }
        { 4 }  { Jueves     }
        { 5 }  { Viernes    }
        { 6 }  { Sábado     }
        { 7 }  { Domingo    }
      } { ??? }
  }

\cs_new:Nn \projlib_datetime_display_year_month_day_schinese:nnn
  {
    #1 年 #2 月 #3 日
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_schinese:nnn { VVV, eee }

\cs_new:Nn \projlib_datetime_display_year_month_day_uppercase_schinese:nnn
  {
    #1 年 #2 月 #3 日
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_uppercase_schinese:nnn { VVV, eee }

\cs_new:Nn \projlib_datetime_display_year_month_schinese:nn
  {
    #1 年 #2 月
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_schinese:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_year_month_uppercase_schinese:nn
  {
    #1 年 #2 月
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_uppercase_schinese:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_month_day_schinese:nn
  {
    #1 月 #2 日
  }
\cs_generate_variant:Nn \projlib_datetime_display_month_day_schinese:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_month_day_uppercase_schinese:nn
  {
    #1 月 #2 日
  }
\cs_generate_variant:Nn \projlib_datetime_display_month_day_uppercase_schinese:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_year_schinese:n { #1 年 }
\cs_new:Nn \projlib_datetime_display_year_uppercase_schinese:n { #1 年 }
\cs_new:Nn \projlib_datetime_display_month_schinese:n { #1 月 }
\cs_new:Nn \projlib_datetime_display_month_uppercase_schinese:n { #1 月 }
\cs_new:Nn \projlib_datetime_display_day_schinese:n { #1 }
\cs_new:Nn \projlib_datetime_display_day_uppercase_schinese:n { #1 }

\cs_new:Nn \projlib_datetime_display_week_schinese:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { 星期一    }
        { 2 }  { 星期二    }
        { 3 }  { 星期三    }
        { 4 }  { 星期四    }
        { 5 }  { 星期五    }
        { 6 }  { 星期六    }
        { 7 }  { 星期日    }
      } { ??? }
  }

\cs_new:Nn \projlib_datetime_display_week_uppercase_schinese:n
  {
    \projlib_datetime_display_week_schinese:n { #1 }
  }

\cs_new:Nn \projlib_datetime_display_year_month_day_tchinese:nnn
  {
    #1 年 #2 月 #3 日
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_tchinese:nnn { VVV, eee }

\cs_new:Nn \projlib_datetime_display_year_month_day_uppercase_tchinese:nnn
  {
    #1 年 #2 月 #3 日
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_uppercase_tchinese:nnn { VVV, eee }

\cs_new:Nn \projlib_datetime_display_year_month_tchinese:nn
  {
    #1 年 #2 月
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_tchinese:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_year_month_uppercase_tchinese:nn
  {
    #1 年 #2 月
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_uppercase_tchinese:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_month_day_tchinese:nn
  {
    #1 月 #2 日
  }
\cs_generate_variant:Nn \projlib_datetime_display_month_day_tchinese:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_month_day_uppercase_tchinese:nn
  {
    #1 月 #2 日
  }
\cs_generate_variant:Nn \projlib_datetime_display_month_day_uppercase_tchinese:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_year_tchinese:n { #1 年 }
\cs_new:Nn \projlib_datetime_display_year_uppercase_tchinese:n { #1 年 }
\cs_new:Nn \projlib_datetime_display_month_tchinese:n { #1 月 }
\cs_new:Nn \projlib_datetime_display_month_uppercase_tchinese:n { #1 月 }
\cs_new:Nn \projlib_datetime_display_day_tchinese:n { #1 }
\cs_new:Nn \projlib_datetime_display_day_uppercase_tchinese:n { #1 }

\cs_new:Nn \projlib_datetime_display_week_tchinese:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { 星期一    }
        { 2 }  { 星期二    }
        { 3 }  { 星期三    }
        { 4 }  { 星期四    }
        { 5 }  { 星期五    }
        { 6 }  { 星期六    }
        { 7 }  { 星期日    }
      } { ??? }
  }

\cs_new:Nn \projlib_datetime_display_week_uppercase_tchinese:n
  {
    \projlib_datetime_display_week_tchinese:n { #1 }
  }

\cs_new:Nn \projlib_datetime_display_year_month_day_japanese:nnn
  {
    #1 年 #2 月 #3 日
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_japanese:nnn { VVV, eee }

\cs_new:Nn \projlib_datetime_display_year_month_day_uppercase_japanese:nnn
  {
    #1 年 #2 月 #3 日
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_uppercase_japanese:nnn { VVV, eee }

\cs_new:Nn \projlib_datetime_display_year_month_japanese:nn
  {
    #1 年 #2 月
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_japanese:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_year_month_uppercase_japanese:nn
  {
    #1 年 #2 月
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_uppercase_japanese:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_month_day_japanese:nn
  {
    #1 月 #2 日
  }
\cs_generate_variant:Nn \projlib_datetime_display_month_day_japanese:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_month_day_uppercase_japanese:nn
  {
    #1 月 #2 日
  }
\cs_generate_variant:Nn \projlib_datetime_display_month_day_uppercase_japanese:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_year_japanese:n { #1 年 }
\cs_new:Nn \projlib_datetime_display_year_uppercase_japanese:n { #1 年 }
\cs_new:Nn \projlib_datetime_display_month_japanese:n { #1 月 }
\cs_new:Nn \projlib_datetime_display_month_uppercase_japanese:n { #1 月 }
\cs_new:Nn \projlib_datetime_display_day_japanese:n { #1 }
\cs_new:Nn \projlib_datetime_display_day_uppercase_japanese:n { #1 }

\cs_new:Nn \projlib_datetime_display_week_japanese:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { 月曜日    }
        { 2 }  { 火曜日    }
        { 3 }  { 水曜日    }
        { 4 }  { 木曜日    }
        { 5 }  { 金曜日    }
        { 6 }  { 土曜日    }
        { 7 }  { 日曜日    }
      } { ??? }
  }

\cs_new:Nn \projlib_datetime_display_week_uppercase_japanese:n
  {
    \projlib_datetime_display_week_japanese:n { #1 }
  }

\cs_new:Nn \projlib_datetime_display_year_month_day_russian:nnn
  {
    \projlib_datetime_display_month_day_russian:nn { #2 } { #3 }
    \nobreakspace
    \projlib_datetime_display_year_russian:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_russian:nnn { VVV, eee }

\cs_new:Nn \projlib_datetime_display_year_month_day_uppercase_russian:nnn
  {
    \projlib_datetime_display_month_day_uppercase_russian:nn { #2 } { #3 }
    \nobreakspace
    \projlib_datetime_display_year_russian:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_uppercase_russian:nnn { VVV, eee }

\cs_new:Nn \projlib_datetime_display_year_month_russian:nn
  {
    \projlib_datetime_display_month_russian:n { #2 }
    \nobreakspace
    \projlib_datetime_display_year_russian:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_russian:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_year_month_uppercase_russian:nn
  {
    \projlib_datetime_display_month_uppercase_russian:n { #2 }
    \nobreakspace
    \projlib_datetime_display_year_russian:n { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_year_month_uppercase_russian:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_month_day_russian:nn
  {
    \projlib_datetime_display_day_russian:n { #2 }
    \nobreakspace
    \int_case:nnF { #1 }
      {
        { 1 }  { января    }
        { 2 }  { февраля   }
        { 3 }  { марта     }
        { 4 }  { апреля    }
        { 5 }  { мая       }
        { 6 }  { июня      }
        { 7 }  { июля      }
        { 8 }  { августа   }
        { 9 }  { сентября  }
        { 10 } { октября   }
        { 11 } { ноября    }
        { 12 } { декабря   }
      } { #1 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_month_day_russian:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_month_day_uppercase_russian:nn
  {
    \projlib_datetime_display_month_day_russian:nn { #1 } { #2 }
  }
\cs_generate_variant:Nn \projlib_datetime_display_month_day_uppercase_russian:nn { VV, ee }

\cs_new:Nn \projlib_datetime_display_year_russian:n { #1 ~ г. }
\cs_new:Nn \projlib_datetime_display_year_uppercase_russian:n { #1 ~ г. }

\cs_new:Nn \projlib_datetime_display_month_russian:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { январь    }
        { 2 }  { февраль   }
        { 3 }  { март      }
        { 4 }  { апрель    }
        { 5 }  { май       }
        { 6 }  { июнь      }
        { 7 }  { июль      }
        { 8 }  { август    }
        { 9 }  { сентябрь  }
        { 10 } { октябрь   }
        { 11 } { ноябрь    }
        { 12 } { декабрь   }
      } { #1 }
  }

\cs_new:Nn \projlib_datetime_display_month_uppercase_russian:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { Январь    }
        { 2 }  { Февраль   }
        { 3 }  { Март      }
        { 4 }  { Апрель    }
        { 5 }  { Май       }
        { 6 }  { Июнь      }
        { 7 }  { Июль      }
        { 8 }  { Август    }
        { 9 }  { Сентябрь  }
        { 10 } { Октябрь   }
        { 11 } { Ноябрь    }
        { 12 } { Декабрь   }
      } { #1 }
  }

\cs_new:Nn \projlib_datetime_display_day_russian:n { #1 }
\cs_new:Nn \projlib_datetime_display_day_uppercase_russian:n { #1 }

\cs_new:Nn \projlib_datetime_display_week_russian:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { понедельник }
        { 2 }  { вторник     }
        { 3 }  { среда       }
        { 4 }  { четверг     }
        { 5 }  { пятница     }
        { 6 }  { суббота     }
        { 7 }  { воскресенье }
      } { ??? }
  }
\cs_new:Nn \projlib_datetime_display_week_uppercase_russian:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { Понедельник }
        { 2 }  { Вторник     }
        { 3 }  { Среда       }
        { 4 }  { Четверг     }
        { 5 }  { Пятница     }
        { 6 }  { Суббота     }
        { 7 }  { Воскресенье }
      } { ??? }
  }

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