diff options
author | Jonas Smedegaard <dr@jones.dk> | 2024-08-31 12:24:59 +0200 |
---|---|---|
committer | Jonas Smedegaard <dr@jones.dk> | 2024-09-01 09:18:49 +0200 |
commit | 0f9cda3eb8afd89a9a2470d9a4c19a5c1c69b092 (patch) | |
tree | b1526d09e39a1d12fbd7b25bd0483f458a51fe05 /lib/Object/Groupware/Event.pm | |
parent | 30e1a34d6f69f514c6c1c908c0f77a651074a175 (diff) |
streamline locale and timezone handling
Diffstat (limited to 'lib/Object/Groupware/Event.pm')
-rw-r--r-- | lib/Object/Groupware/Event.pm | 57 |
1 files changed, 39 insertions, 18 deletions
diff --git a/lib/Object/Groupware/Event.pm b/lib/Object/Groupware/Event.pm index 52fa143..c5ccb6e 100644 --- a/lib/Object/Groupware/Event.pm +++ b/lib/Object/Groupware/Event.pm @@ -3,50 +3,71 @@ use Feature::Compat::Class 0.07; package Object::Groupware::Event 0.01; -class Object::Groupware::Event; +class Object::Groupware::Event : isa(Object::Groupware); use utf8; use Log::Any qw( ); use Feature::Compat::Try; +use DateTime::Locale; field $log = Log::Any->get_logger; field $entry : param; +field $dt_locale; -field $begin : reader = $entry->start; -field $date_begin : reader = $begin->strftime('%A %e. %B'); -field $time_begin : reader = $begin->strftime('%k.%M'); -field $end : reader = $entry->end; -field $date_end : reader; -field $time_end : reader; +field $begin : reader = $entry->start; +field $end : reader = $entry->end; field $datespan : reader; field $timespan : reader; field $time_brief : reader; field $summary : reader = $entry->summary; -field $description : reader = $entry->description; +field $description : reader = $entry->description || ''; field $location : reader = $entry->_simple_property('location'); field $price : reader; field @attendees; field @attachments; ADJUST { - if ( defined $end ) { - $date_end = $end->strftime('%A %e. %B'); - $time_end = $end->strftime('%k.%M'); + if ( $self->dt_locale ) { + $dt_locale = $self->dt_locale; + $begin->set_locale($dt_locale); + $end->set_locale($dt_locale) if defined $end; + } + else { + + # we need the object regardless, to fetch CLDR patterns + $dt_locale = DateTime::Locale->load('en_US'); + } + + $begin->set_locale( $self->dt_locale ); + + for ( $self->dt_time_zone || () ) { + $begin->set_time_zone($_); + $end->set_time_zone($_) if defined $end; } $datespan - = ( defined $end and $date_end ne $date_begin ) - ? ucfirst("$date_begin - $date_end") - : ucfirst("$date_begin"); - $timespan - = ( defined $end and not $entry->all_day ) - ? ucfirst("$date_begin kl. $time_begin-$time_end") + = ( defined $end + and $end->clone->truncate( to => 'day' ) ne + $begin->clone->truncate( to => 'day' ) ) + ? ucfirst( + sprintf '%s - %s', + $begin->format_cldr( $dt_locale->date_format_medium() ), + $end->format_cldr( $dt_locale->date_format_medium() ) + ) + : ucfirst( $begin->format_cldr( $dt_locale->date_format_medium() ) ); + $timespan = ( defined $end and not $entry->all_day ) + ? ucfirst( + sprintf '%s-%s', + $begin->format_cldr( $dt_locale->datetime_format_medium() ), + $end->format_cldr( $dt_locale->time_format_medium() ) + ) : undef; $time_brief = $entry->all_day ? $datespan - : ucfirst("$date_begin kl. $time_begin"); + : ucfirst( + $begin->format_cldr( $dt_locale->datetime_format_medium() ) ); $description =~ s/\n\n[Pp]ris:\s*((?!\n).+)\s*\z//m; $price = $1; |