From 809458e82a41b20cbc028c93346aafe203a099ef Mon Sep 17 00:00:00 2001 From: iliajie Date: Sun, 5 Feb 2023 00:40:10 +0200 Subject: [PATCH] Add support to select locale in Change Language and Theme Webmin module --- acl/acl-lib.pl | 6 ++++++ change-user/acl_security.pl | 3 +++ change-user/change.cgi | 24 ++++++++++++++++++++++++ change-user/defaultacl | 1 + change-user/index.cgi | 31 +++++++++++++++++++++++++++++++ change-user/safeacl | 1 + web-lib-funcs.pl | 4 ++-- 7 files changed, 68 insertions(+), 2 deletions(-) diff --git a/acl/acl-lib.pl b/acl/acl-lib.pl index 4992dafee..fbcd69a74 100755 --- a/acl/acl-lib.pl +++ b/acl/acl-lib.pl @@ -88,6 +88,8 @@ while(my $l = <$fh>) { $user{'modules'} = $acl{$user[0]}; $user{'lang'} = $gconfig{"lang_$user[0]"}; $user{'langauto'} = $gconfig{"langauto_$user[0]"}; + $user{'locale'} = $gconfig{"locale_$user[0]"}; + $user{'dateformat'} = $gconfig{"dateformat_$user[0]"}; $user{'notabs'} = $gconfig{"notabs_$user[0]"}; $user{'rbacdeny'} = $gconfig{"rbacdeny_$user[0]"}; if ($gconfig{"theme_$user[0]"}) { @@ -702,6 +704,10 @@ else { $gconfig{"lang_".$user->{'name'}} = $user->{'lang'} if ($user->{'lang'}); delete($gconfig{"langauto_".$username}); $gconfig{"langauto_".$user->{'name'}} = $user->{'langauto'} if (defined($user->{'langauto'})); + delete($gconfig{"locale_".$username}); + $gconfig{"locale_".$user->{'name'}} = $user->{'locale'} if (defined($user->{'locale'})); + delete($gconfig{"dateformat_".$username}); + $gconfig{"dateformat_".$user->{'name'}} = $user->{'dateformat'} if (defined($user->{'dateformat'})); delete($gconfig{"notabs_".$username}); $gconfig{"notabs_".$user->{'name'}} = $user->{'notabs'} if ($user->{'notabs'}); diff --git a/change-user/acl_security.pl b/change-user/acl_security.pl index 8c7cbe8f0..e226165c6 100755 --- a/change-user/acl_security.pl +++ b/change-user/acl_security.pl @@ -14,6 +14,9 @@ my ($o) = @_; print &ui_table_row($text{'acl_lang'}, &ui_yesno_radio("lang", $o->{'lang'})); +print &ui_table_row($text{'acl_locale'}, + &ui_yesno_radio("locale", $o->{'locale'})); + print &ui_table_row($text{'acl_theme'}, &ui_yesno_radio("theme", $o->{'theme'})); diff --git a/change-user/change.cgi b/change-user/change.cgi index abc4b6992..49128a5c9 100755 --- a/change-user/change.cgi +++ b/change-user/change.cgi @@ -42,6 +42,30 @@ if ($access{'lang'}) { } } +# Parse custom locale +if ($access{'locale'}) { + # Parse new locale + if ($in{'locale_def'} || + $in{'locale'}) { + if ($in{'locale_def'}) { + $user->{'locale'} = undef; + } + else { + $user->{'locale'} = $in{'locale'}; + } + } + # Parse old dateformat + if ($in{'dateformat_def'} || + $in{'dateformat'}) { + if ($in{'dateformat_def'}) { + $user->{'dateformat'} = undef; + } + else { + $user->{'dateformat'} = $in{'dateformat'}; + } + } + } + # Parse custom theme and possibly overlay my ($newoverlay, $newtheme); if ($access{'theme'}) { diff --git a/change-user/defaultacl b/change-user/defaultacl index fe0acbfaa..ffd437bf8 100644 --- a/change-user/defaultacl +++ b/change-user/defaultacl @@ -1,3 +1,4 @@ lang=1 +locale=1 theme=1 pass=1 diff --git a/change-user/index.cgi b/change-user/index.cgi index d1857e0ef..df4a6f223 100755 --- a/change-user/index.cgi +++ b/change-user/index.cgi @@ -56,6 +56,37 @@ if ($access{'lang'}) { undef, [ "valign=top","valign=top" ]); } +# Old datetime format or a new locale +if ($access{'locale'}) { + my $locale; + eval "use DateTime; use DateTime::Locale; use DateTime::TimeZone;"; + &foreign_require('webmin'); + if (!$@) { + $locale++; + my $locales = &webmin::list_locales(); + my %localesrev = reverse %{$locales}; + print &ui_table_row($text{'index_locale'}, + &ui_radio("locale_def", defined($user->{'locale'}) ? 0 : 1, + [ [ 1, &text('index_localeglobal2', $locales->{$gconfig{'locale'}}, $gconfig{'locale'})."
" ], + [ 0, $text{'index_localeset'} ] ])." ". + &ui_select("locale", $user->{'locale'}, + [ map { [ $localesrev{$_}, $_ ] } sort values %{$locales} ] ), + undef, [ "valign=top","valign=top" ]); + } + + if (!$locale) { + my %wtext = &load_language('webmin'); + print &ui_table_row($text{'index_locale2'}, + &ui_radio("dateformat_def", defined($user->{'dateformat'}) ? 0 : 1, + [ [ 1, &text('index_dateformatglobal2', $gconfig{'dateformat'} || "dd/mon/yyyy")."
" ], + [ 0, $text{'index_dateformatset'} ] ])." ". + &ui_select("dateformat", $user->{'dateformat'} || "dd/mon/yyyy", + [ map { [ $_, $wtext{'lang_dateformat_'.$_} ] } + @webmin::webmin_date_formats ] ), + undef, [ "valign=top","valign=top" ]); + } + } + if ($access{'theme'}) { # Show personal theme my $tname; diff --git a/change-user/safeacl b/change-user/safeacl index fe0acbfaa..ffd437bf8 100644 --- a/change-user/safeacl +++ b/change-user/safeacl @@ -1,3 +1,4 @@ lang=1 +locale=1 theme=1 pass=1 diff --git a/web-lib-funcs.pl b/web-lib-funcs.pl index f75dfcd13..159c116cb 100755 --- a/web-lib-funcs.pl +++ b/web-lib-funcs.pl @@ -1990,7 +1990,7 @@ my ($secs, $only, $fmt) = @_; eval "use DateTime; use DateTime::Locale; use DateTime::TimeZone;"; if (!$@) { my $opts = ref($only) ? $only : {}; -my $locale_name = $opts->{'locale'} || $gconfig{'locale'} || 'en-US'; +my $locale_name = $opts->{'locale'} || $gconfig{'locale_'.$remote_user} || $gconfig{'locale'} || 'en-US'; my $tz = $opts->{'tz'} || DateTime::TimeZone->new( name => 'local' )->name(); # Asia/Nicosia my $locale = DateTime::Locale->load($locale_name); @@ -2074,7 +2074,7 @@ else { my @tm = localtime($secs); my $date; if (!$fmt) { - $fmt = $gconfig{'dateformat'} || 'dd/mon/yyyy'; + $fmt = $gconfig{'dateformat_'.$remote_user} || $gconfig{'dateformat'} || 'dd/mon/yyyy'; } if ($fmt eq 'dd/mon/yyyy') { $date = sprintf "%2.2d/%s/%4.4d",