--- loncom/interface/statistics/lonproblemstatistics.pm 2012/05/12 03:17:43 1.122.2.1 +++ loncom/interface/statistics/lonproblemstatistics.pm 2014/02/03 18:52:30 1.125 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: lonproblemstatistics.pm,v 1.122.2.1 2012/05/12 03:17:43 raeburn Exp $ +# $Id: lonproblemstatistics.pm,v 1.125 2014/02/03 18:52:30 bisitz Exp $ # # Copyright Michigan State University Board of Trustees # @@ -52,6 +52,7 @@ package Apache::lonproblemstatistics; use strict; use Apache::lonnet; use Apache::loncommon(); +use Apache::lonquickgrades(); use Apache::lonhtmlcommon; use Apache::loncoursedata; use Apache::lonstatistics; @@ -73,6 +74,14 @@ my %SeqStat; # keys are symbs, values ## header for plots created with Graph.pm, both of which more than likely do ## not support localization. ## +## Additional Notes: +## Localization can be done and is done before passing the phrases +## to the output. +## This might conflict with special characters, e.g. German Umlaute or +## chinese characters. Do not use such characters in this case. +## If this failed, consider that the sequence and folder names +## are also passed to the output and would fail the same way. +## # # ## @@ -84,7 +93,7 @@ my %SeqStat; # keys are symbs, values ## title yes any scalar This is what the user sees to identify ## the field. Passed through &mt(). ## long_title yes any scalar Used as graph heading and in excel -## output. NOT translated +## output. Passed through &mt(). ## align no (left|right|center) HTML cell contents alignment ## color yes html color HTML cell background color ## used to visually group statistics @@ -274,7 +283,7 @@ my @Fields = ( sortable => 'yes', graphable => 'yes', long_title => 'Degree of Difficulty'. - '[ 1 - ((#YES+#yes) / Tries) ]', + ' ~[ 1 - ((#YES+#yes) / Tries) ~]', selectable => 'yes', defaultselected => 'yes', }, @@ -578,14 +587,14 @@ sub parse_field_selection { sub field_selection_input { my $Str = '<select name="fieldselections" multiple="multiple" size="5">'."\n"; - $Str .= '<option value="all">all</option>'."\n"; + $Str .= '<option value="all">'.&mt('all').'</option>'."\n"; foreach my $field (@Fields) { next if ($field->{'selectable'} ne 'yes'); $Str .= ' <option value="'.$field->{'name'}.'" '; if ($field->{'selected'} eq 'yes') { - $Str .= 'selected '; + $Str .= 'selected="selected" '; } - $Str .= '>'.$field->{'title'}.'</option>'."\n"; + $Str .= '>'.&mt($field->{'title'}).'</option>'."\n"; } $Str .= "</select>\n"; } @@ -610,7 +619,6 @@ sub CreateInterface { &parse_field_selection(); # my $Str = ''; - $Str .= '<p>'; $Str .= &Apache::loncommon::start_data_table(); $Str .= &Apache::loncommon::start_data_table_header_row(); $Str .= '<th>'.&mt('Sections').'</th>'; @@ -636,14 +644,13 @@ sub CreateInterface { $Str .= &field_selection_input(); $Str .= '</td><td align="center" valign="top">'; $Str .= &plot_dropdown(); - $Str .= '</td>'."\n"; + $Str .= "\n"; $Str .= '</td><td align="center" valign="top">'; $Str .= &Apache::lonstathelpers::limit_by_time_form(); $Str .= '</td>'."\n"; $Str .= &Apache::loncommon::end_data_table_row(); $Str .= &Apache::loncommon::end_data_table(); # - $Str .= '</p>'; $Str .= '<input type="submit" name="GenerateStatistics" value="'. &mt('Generate Statistics').'" />'; $Str .= (' 'x10); @@ -698,6 +705,7 @@ sub BuildProblemStatisticsPage { # Finally let the user know we are here $r->print(&Apache::lonhtmlcommon::breadcrumbs('Overall Problem Statistics', 'Statistics_Overall_Key')); + &Apache::lonquickgrades::startGradeScreen($r,'statistics'); my $interface = &CreateInterface($r); $r->print($interface); @@ -757,11 +765,11 @@ sub BuildProblemStatisticsPage { $count += scalar(@resources); } if ($count > 10) { - $r->print('<h2>'. - &mt('Compiling statistics for [_1] problems',$count). - '</h2>'); + $r->print('<p>'. + &mt('Compiling statistics for [quant,_1,problem]',$count). + '</p>'); if ($count > 30) { - $r->print('<h3>'.&mt('This will take some time.').'</h3>'); + $r->print('<p class="LC_info">'.&mt('This will take some time.').'</p>'); } $r->rflush(); } @@ -793,9 +801,8 @@ sub output_sequence_statistics { $r->print('<h2>'.&mt('Sequence Statistics'). &Apache::loncommon::help_open_topic('Statistics_Sequence'). '</h2>'); - $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row()); + $r->print(&Apache::loncommon::start_data_table()); $r->print(&sequence_html_header()); - $r->print(&Apache::loncommon::end_data_table_header_row()); foreach my $seq (@sequences) { last if ($c->aborted); &compute_sequence_statistics($seq); @@ -817,7 +824,7 @@ sub output_sequence_statistics { sub output_html_by_sequence { my ($r) = @_; my $c = $r->connection(); - $r->print('<br>'.&html_preamble()); + $r->print('<br />'.&html_preamble()); # foreach my $seq (@sequences) { last if ($c->aborted); @@ -921,14 +928,16 @@ sub statistics_table_header { next if ($options =~ /no $field->{'name'}/); next if ($field->{'selected'} ne 'yes'); $header_row .= '<th>'; + my $header_row_text = &mt($field->{'title'}); if (exists($field->{'sortable'}) && $field->{'sortable'} eq 'yes') { - $header_row .= '<a href="javascript:'. + $header_row .= + '<a href="javascript:'. 'document.Statistics.sortby.value='."'".$field->{'name'}."'". - ';document.Statistics.submit();">'; - } - $header_row .= &mt($field->{'title'}); - if ($options =~ /sortable/) { - $header_row.= '</a>'; + ';document.Statistics.submit();">'. + $header_row_text. + '</a>'; + } else { + $header_row .= $header_row_text; } if ($options !~ /no plots/ && exists($field->{'graphable'}) && @@ -945,13 +954,13 @@ sub statistics_table_header { } sub sequence_html_header { - my $Str .= '<tr>'; + my $Str .= &Apache::loncommon::start_data_table_header_row(); foreach my $field (@SeqFields) { # next if ($field->{'selected'} ne 'yes'); $Str .= '<th bgcolor="'.$field->{'color'}.'"'; - $Str .= '>'.$field->{'title'}.'</th>'; + $Str .= '>'.&mt($field->{'title'}).'</th>'; } - $Str .= '</tr>'; + $Str .= &Apache::loncommon::end_data_table_header_row(); return $Str; } @@ -959,7 +968,7 @@ sub sequence_html_header { sub sequence_html_output { my ($seq) = @_; my $data = $SeqStat{$seq->symb}; - my $row = '<tr>'; + my $row = &Apache::loncommon::start_data_table_row(); foreach my $field (@SeqFields) { next if ($field->{'selected'} ne 'yes'); $row .= '<td bgcolor="'.$field->{'color'}.'"'; @@ -974,7 +983,7 @@ sub sequence_html_output { } $row .= '</td>'; } - $row .= '</tr>'."\n"; + $row .= &Apache::loncommon::end_data_table_row()."\n"; return $row; } @@ -1005,15 +1014,15 @@ sub make_single_stat_plot { my $title; my $yaxis; foreach my $field (@Fields) { next if ($field->{'name'} ne $datafield); - $title = $field->{'long_title'}; - $yaxis = $field->{'title'}; + $title = &mt($field->{'long_title'}); + $yaxis = &mt($field->{'title'}); last; } if ($title eq '' || $yaxis eq '') { # datafield is something we do not know enough about to plot - $r->print('<h3>'. + $r->print('<p class="LC_warning">'. &mt('Unable to plot the requested statistic.'). - '</h3>'); + '</p>'); return; } # @@ -1040,7 +1049,7 @@ sub make_single_stat_plot { } # $r->print("<p>".&Apache::loncommon::DrawBarGraph($title, - 'Problem Number', + &mt('Problem Number'), $yaxis, $max, undef, # colors @@ -1105,10 +1114,14 @@ sub degrees_plot { my $diffdata .= '<data>'.join(',',@Labels).'</data>'.$/. '<data>'.join(',',@Diff).'</data>'.$/; # - my $title = 'Degree of Discrimination\nand Degree of Difficulty'; + my $title = &mt('Degree of Discrimination[_1]and Degree of Difficulty','\n'); if ($xmax > 50) { - $title = 'Degree of Discrimination and Degree of Difficulty'; + $title = &mt('Degree of Discrimination and Degree of Difficulty'); } + my %lt = &Apache::lonlocal::texthash( + 'alttag' => 'Degree of Discrimination and Degree of Difficulty Plot', + 'xlabel' => 'Problem Number', + ); # $plot=<<"END"; <gnuplot @@ -1120,7 +1133,7 @@ sub degrees_plot { align="center" border="on" transparent="on" - alttag="Degree of Discrimination and Degree of Difficulty Plot" + alttag="$lt{'alttag'}" samples="100" bgcolor="xffffff" height="$height" @@ -1131,7 +1144,7 @@ sub degrees_plot { box="off" /> <title>$title</title> <axis xmin="0" ymin="$ymin" xmax="$xmax" ymax="$ymax" color="x000000" /> - <xlabel>Problem Number</xlabel> + <xlabel>$lt{'xlabel'}</xlabel> <curve linestyle="linespoints" name="DoDisc" @@ -1193,11 +1206,16 @@ sub tries_data_plot { '<data>'.join(',',@Mean).'</data>'.$/. '<data>'.join(',',@STD).'</data>'.$/; # - my $title = 'Mean and S.D. of Tries'; - if ($xmax > 25) { - $title = 'Mean and Standard Deviation of Tries'; + my $title = &mt('Mean and S.D. of Tries'); + if ($xmax > 30) { + $title = &mt('Mean and Standard Deviation of Tries'); } # + my %lt = &Apache::lonlocal::texthash( + 'alttag' => 'Mean and S.D of Tries Plot', + 'xlabel' => 'Problem Number', + 'ylabel' => 'Number of Tries', + ); $plot=<<"END"; <gnuplot texfont="10" @@ -1208,15 +1226,15 @@ sub tries_data_plot { align="center" border="on" transparent="on" - alttag="Mean and S.D of Tries Plot" + alttag="$lt{'alttag'}" samples="100" bgcolor="xffffff" height="$height" width="$width"> <title>$title</title> <axis xmin="0" ymin="0" xmax="$xmax" ymax="$ymax" color="x000000" /> - <xlabel>Problem Number</xlabel> - <ylabel>Number of Tries</ylabel> + <xlabel>$lt{'xlabel'}</xlabel> + <ylabel>$lt{'ylabel'}</ylabel> <curve linestyle="yerrorbars" name="S.D. Tries" @@ -1241,6 +1259,7 @@ END sub plot_dropdown { my $current = ''; + my $title; # if (defined($env{'form.plot'})) { $current = $env{'form.plot'}; @@ -1256,7 +1275,7 @@ sub plot_dropdown { # my $Str= "\n".'<select name="plot" size="1">'; $Str .= '<option name="none"></option>'."\n"; - $Str .= '<option name="none2">none</option>'."\n"; + $Str .= '<option name="none2">'.&mt('none').'</option>'."\n"; foreach my $field (@Additional_Plots,@Fields) { if (! exists($field->{'graphable'}) || $field->{'graphable'} ne 'yes') { @@ -1264,9 +1283,11 @@ sub plot_dropdown { } $Str .= '<option value="'.$field->{'name'}.'"'; if ($field->{'name'} eq $current) { - $Str .= ' selected '; + $Str .= ' selected="selected"'; } - $Str.= '>'.&mt($field->{'title'}).'</option>'."\n"; + $title = &mt($field->{'long_title'}); + $title = &mt($field->{'title'}) if (!$title); + $Str.= '>'.$title.'</option>'."\n"; } $Str .= '</select>'."\n"; return $Str; @@ -1324,16 +1345,17 @@ sub Excel_output { # Time restrictions my $time_string; if (defined($starttime)) { - # call localtime but not lonlocal:locallocaltime because excel probably - # cannot handle localized text. Probably. - $time_string .= 'Data collected from '.localtime($time_string); if (defined($endtime)) { - $time_string .= ' to '.localtime($endtime); + $time_string .= &mt('Data collected from [_1] to [_2]', + &Apache::lonlocal::locallocaltime($starttime), + &Apache::lonlocal::locallocaltime($endtime)); + } else { + $time_string .= &mt('Data collected from [_1]', + &Apache::lonlocal::locallocaltime($starttime)); } - $time_string .= '.'; } elsif (defined($endtime)) { - # See note above about lonlocal:locallocaltime - $time_string .= 'Data collected before '.localtime($endtime).'.'; + $time_string .= &mt('Data collected before [_1]', + &Apache::lonlocal::locallocaltime($endtime)); } if (defined($time_string)) { $excel_sheet->write($rows_output,$cols_output++,$time_string); @@ -1342,7 +1364,7 @@ sub Excel_output { # # Put the date in there too $excel_sheet->write($rows_output,$cols_output++, - 'Compiled on '.localtime(time)); + &mt('Compiled on [_1]',&Apache::lonlocal::locallocaltime(time))); # $rows_output++; $cols_output=0;