Fix to correctly cache cloned locale with military time

This commit is contained in:
Ilia Ross 2023-09-26 21:22:44 +03:00
parent 73b2322597
commit 4e54ce3f85
No known key found for this signature in database
GPG Key ID: 121E166DD9C821AB

View File

@ -2091,6 +2091,7 @@ code or preserve the original, old logic
sub make_date
{
my ($secs, $only, $fmt) = @_;
state $locale_military_name;
$secs ||= 0;
eval "use DateTime; use DateTime::Locale; use DateTime::TimeZone;";
if (!$@ && $] > 5.011) {
@ -2115,18 +2116,24 @@ if (!$@ && $] > 5.011) {
}
}
}
# Allow forcing military time
my $force_military_time;
# Pre-process time locale
my $locale_military_status = sub {
return ($locale_military_name && $locale_military_name =~ /[a-z]/i) ? 2 :
($locale_military_name == 1) ? 1 : 0;
};
# Allow locales with military time (in 24h format)
my $locale_name_loaded = &$locale_military_status() == 2 ?
$locale_military_name : $locale_name;
my $locale_name_initial = $locale_name;
if ($locale_name =~ /[a-z]{2}24$/i) {
if ($locale_name =~ /[a-z]{2}24$/i && &$locale_military_status() == 0) {
$locale_name =~ s/^(.*?)24$/$1/;
$force_military_time++;
}
# Load standard locale
my $locale = DateTime::Locale->load($locale_name);
$locale_name_loaded = $locale_name;
$locale_military_name = 1;
}
# Load given locale
my $locale = DateTime::Locale->load($locale_name_loaded);
# Create a new locale out of base locale
if ($force_military_time) {
if (&$locale_military_status() == 1) {
my %locale_data = $locale->locale_data;
$locale_data{'code'} = $locale_name_initial;
# Force 24h time
@ -2134,9 +2141,11 @@ if (!$@ && $] > 5.011) {
$locale_data{'glibc_datetime_format'} = '%a %d %b %Y %T %Z';
$locale_data{'glibc_time_format'} = '%T';
DateTime::Locale->register_from_data(%locale_data);
# Load new locale
$locale = DateTime::Locale->load($locale_name_initial);
}
# Load newly cloned locale in 24h time format
$locale_military_name = $locale_name_loaded = $locale_name_initial;
$locale = DateTime::Locale->load($locale_name_loaded);
}
my $locale_format_full_tz = $locale->glibc_date_1_format; # Sat 20 Nov 2286 17:46:39 UTC
my $locale_format_full = $locale->glibc_datetime_format; # Sat 20 Nov 2286 17:46:39
my $locale_format_short = $locale->glibc_date_format; # 20/11/86
@ -2171,15 +2180,15 @@ if (!$@ && $] > 5.011) {
# my $xxxx = $locale->full_date_format;
my $data = {
# Wed Feb 8 05:09:39 PM UTC 2023
'full-tz-utc' => DateTime->from_epoch(locale => $locale_name, epoch => $secs)->strftime($locale_format_full_tz),
'full-tz-utc' => DateTime->from_epoch(locale => $locale_name_loaded, epoch => $secs)->strftime($locale_format_full_tz),
# Wed Feb 8 07:10:01 PM EET 2023
'full-tz' => DateTime->from_epoch(locale => $locale_name, epoch => $secs, time_zone => $tz)->strftime($locale_format_full_tz),
'full-tz' => DateTime->from_epoch(locale => $locale_name_loaded, epoch => $secs, time_zone => $tz)->strftime($locale_format_full_tz),
# Wed 08 Feb 2023 07:11:26 PM EET
'full' => DateTime->from_epoch(locale => $locale_name, epoch => $secs, time_zone => $tz)->strftime($locale_format_full),
'full' => DateTime->from_epoch(locale => $locale_name_loaded, epoch => $secs, time_zone => $tz)->strftime($locale_format_full),
# 02/08/2023
'short' => DateTime->from_epoch(locale => $locale_name, epoch => $secs, time_zone => $tz)->strftime($locale_format_short),
'short' => DateTime->from_epoch(locale => $locale_name_loaded, epoch => $secs, time_zone => $tz)->strftime($locale_format_short),
# 07:12:07 PM
'time' => DateTime->from_epoch(locale => $locale_name, epoch => $secs, time_zone => $tz)->strftime($locale_format_time),
'time' => DateTime->from_epoch(locale => $locale_name_loaded, epoch => $secs, time_zone => $tz)->strftime($locale_format_time),
'ago' => $ago,
'tz' => $tz,
'delimiter' => $locale_format_delimiter,
@ -2192,8 +2201,8 @@ if (!$@ && $] > 5.011) {
# %c alternative with full week and month and no seconds in time (complete)
# Wednesday, February 8, 2023, 8:18 PM or 星期三, 2023年2月8日 20:18 or miércoles, 8 febrero 2023, 20:28
$data->{'monthfull'} = DateTime->from_epoch(locale => $locale_name, epoch => $secs, time_zone => $tz)->strftime("%B");
foreach (split(/\s+/, DateTime->from_epoch(locale => $locale_name, epoch => $secs, time_zone => $tz)->strftime("%A, %c"))) {
$data->{'monthfull'} = DateTime->from_epoch(locale => $locale_name_loaded, epoch => $secs, time_zone => $tz)->strftime("%B");
foreach (split(/\s+/, DateTime->from_epoch(locale => $locale_name_loaded, epoch => $secs, time_zone => $tz)->strftime("%A, %c"))) {
if ($data->{'monthfull'} =~ /^$_/) {
$data->{'complete'} .= "$data->{'monthfull'} "
}
@ -2228,12 +2237,12 @@ if (!$@ && $] > 5.011) {
@date = grep { /\%/ } @date;
$locale_format_short = join($locale_format_delimiter, @date);
}
my $date_format_short = DateTime->from_epoch(locale => $locale_name, epoch => $secs, time_zone => $tz)->strftime($locale_format_short);
my $date_format_short = DateTime->from_epoch(locale => $locale_name_loaded, epoch => $secs, time_zone => $tz)->strftime($locale_format_short);
if (!ref($only) && $only) {
return $date_format_short;
}
else {
my $date_format_time = DateTime->from_epoch(locale => $locale_name, epoch => $secs, time_zone => $tz)->strftime($locale_format_time);
my $date_format_time = DateTime->from_epoch(locale => $locale_name_loaded, epoch => $secs, time_zone => $tz)->strftime($locale_format_time);
$date_format_time = $date_format_time;
$date_format_time =~ s/(\d+):(\d+):(\d+)(.*?)/$1:$2$4/;
if ($main::webmin_script_type eq 'web') {