From 9d2a29bde6c3fd2e4534c35e9e3928fdd908553f Mon Sep 17 00:00:00 2001 From: Jaimos Skriletz Date: Mon, 12 Jun 2023 19:26:49 -0600 Subject: [PATCH 001/549] Round initial point value to match step size in SingleProblemGrader. --- templates/HTML/SingleProblemGrader/grader.html.ep | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/templates/HTML/SingleProblemGrader/grader.html.ep b/templates/HTML/SingleProblemGrader/grader.html.ep index bf5907a3e2..4a3282bea0 100644 --- a/templates/HTML/SingleProblemGrader/grader.html.ep +++ b/templates/HTML/SingleProblemGrader/grader.html.ep @@ -80,6 +80,11 @@ % } else { % $stepSize = int(($grader->{problem_value} - 1) / 100) + 1; % } + % # Round point score to the nearest $stepSize. + % param( + % 'grader-problem-points', + % wwRound(2, wwRound(0, $grader->{recorded_score} * $grader->{problem_value} / $stepSize) * $stepSize) + % );
<%= label_for "score_problem$grader->{problem_id}_points", class => 'col-fixed col-form-label', @@ -112,7 +117,6 @@ <% end =%> <% end =%>
- % param('grader-problem-points', wwRound(1, $grader->{recorded_score} * $grader->{problem_value})); <%= number_field 'grader-problem-points' => '', min => 0, max => $grader->{problem_value}, From f0b3c4d58cfed3f1e556fb87e4d410f2c148f6fe Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Fri, 16 Jun 2023 13:18:42 -0400 Subject: [PATCH 002/549] Fix the PG Problem Editor for files that have spaces in the filename. The glob in the `getBackupTimes` method needs special quoting to handle spaces in filenames. To test this try to edit a pg problem with spaces in the filename. On develop the editor won't open, and you get an exception screen. With this pull request it will work of course. --- lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm b/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm index 151d8255ed..0a7f6e0178 100644 --- a/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm +++ b/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm @@ -566,7 +566,7 @@ sub getFilePaths ($c) { sub getBackupTimes ($c) { my $backupBasePath = $c->{backupBasePath}; - my @files = glob("$backupBasePath*"); + my @files = glob(qq("$backupBasePath*")); return unless @files; return reverse(map { $_ =~ s/$backupBasePath//r } @files); } From 1fcec7cc4e1bcec228673304378e362aa1855b7d Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Thu, 15 Jun 2023 10:20:13 -0500 Subject: [PATCH 003/549] Fix proctor login after incorrect password This is a new bug caused by a very old typo. The grep that is now in templates/ContentGenerator/LoginProctor.html.ep should be filtering out the proctor_passwd input, but instead is skipping the non-existent proctor_password input, and adding a hidden input for the proctor_passwd input. The typo traces back to 2007. What happens as a result is that if you incorrectly type the proctor password on the first attempt, then all successive attemps are using the incorrect password in the hidden field instead of the newly entered password in the input shown on the screen. Thus once you have a typo in entering the password, you can not sign in again without leaving the proctor authentication page and coming back. I have not locked down how it somehow worked before, but I tested with webwork 2.17 and you can authenticate with the proctor user after a first incorrect attempt. So this is probably something to do with Mojolicous autofilling input values or the rework of the params method. --- templates/ContentGenerator/LoginProctor.html.ep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/ContentGenerator/LoginProctor.html.ep b/templates/ContentGenerator/LoginProctor.html.ep index b575c7a674..bca4805257 100644 --- a/templates/ContentGenerator/LoginProctor.html.ep +++ b/templates/ContentGenerator/LoginProctor.html.ep @@ -42,7 +42,7 @@ %= form_for current_route, method => 'POST', begin % # Add the form data posted to the requested URI in hidden fields. % my @fields_to_print = - % grep { !/^(user|effectiveUser|passwd|key|force_password_authen|proctor_user|proctor_key|proctor_password)$/ } + % grep { !/^(user|effectiveUser|passwd|key|force_password_authen|proctor_user|proctor_key|proctor_passwd)$/ } % param; % if (@fields_to_print) { <%= $c->hidden_fields(@fields_to_print) %> From a2f7131e3b9f615eb340e259eb040dd46698abfe Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Thu, 15 Jun 2023 19:45:35 -0400 Subject: [PATCH 004/549] Tweak the attempts table preview fallback when $pg{options}{showEvaluatedAnswers} is false. It is possible in certain situations that an answer preview can be 0. If that is the case, then the preview should not fallback to showing the entered answer. The only case that I know of that this can happen for the MathJax or images display modes is if a student enters 0 for an essay answer. Note that for standard answers an answer of 0 would either be wrapped in a script math/tex tag, or turned into an image. So this can't happen for those. So that brings us to the only other case I know of at all that this can happen. That is when the plainText display mode is used and the answer is 0. When would an essay answer be litterally 0? Who uses the plainText display mode? Okay, so this isn't a serious issue, but for correctness. --- lib/WeBWorK/HTML/AttemptsTable.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/WeBWorK/HTML/AttemptsTable.pm b/lib/WeBWorK/HTML/AttemptsTable.pm index 07bf158911..f1c15c8fbf 100644 --- a/lib/WeBWorK/HTML/AttemptsTable.pm +++ b/lib/WeBWorK/HTML/AttemptsTable.pm @@ -257,7 +257,7 @@ sub formatAnswerRow ($self, $rh_answer, $ans_id, $answerNumber) { $self->showAnswerNumbers ? $c->tag('td', $answerNumber) : '', $self->showAttemptAnswers ? $c->tag('td', dir => 'auto', $self->nbsp($answerString)) : '', $self->showAttemptPreviews - ? ($answerPreview || $self->showAttemptAnswers + ? (((defined $answerPreview && $answerPreview ne '') || $self->showAttemptAnswers) ? $self->formatToolTip($answerString, $answerPreview) : $c->tag('td', dir => 'auto', $self->nbsp($answerString))) : '', From c4ec23b5a84f18613ae1adc68581f1facd5b2c9c Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Sun, 18 Jun 2023 16:02:46 -0700 Subject: [PATCH 005/549] refactor hardcopy themes --- conf/defaults.config | 22 +++- conf/localOverrides.conf.dist | 8 +- conf/snippets/ASimpleCombinedHeaderFile.pg | 120 ------------------ conf/snippets/defaultSetHeader.pg | 78 ++++++++++++ conf/snippets/hardcopySetFooter.pg | 1 - conf/snippets/hardcopySetFooter.tex | 1 + conf/snippets/hardcopySetHeader.pg | 1 - conf/snippets/hardcopySetHeader.tex | 1 + .../hardcopyPreamble.tex | 10 +- .../hardcopySetFooter.pg | 25 ---- .../hardcopySetFooter.tex | 1 + .../hardcopySetHeader.tex | 0 .../hardcopyPreamble.tex | 8 +- .../hardcopySetFooter.pg | 25 ---- .../hardcopySetFooter.tex | 2 + .../hardcopySetHeader.tex | 1 + .../XeLaTeX-oneColumn/hardcopyPreamble.tex | 9 +- .../XeLaTeX-oneColumn/hardcopySetFooter.pg | 19 --- .../XeLaTeX-oneColumn/hardcopySetFooter.tex | 1 + .../XeLaTeX-oneColumn/hardcopySetHeader.tex | 0 .../XeLaTeX-twoColumn/hardcopyPreamble.tex | 7 +- .../XeLaTeX-twoColumn/hardcopySetFooter.pg | 17 --- .../XeLaTeX-twoColumn/hardcopySetFooter.tex | 2 + .../XeLaTeX-twoColumn/hardcopySetHeader.tex | 1 + .../hardcopyThemes/common/copyright.tex | 1 + .../hardcopyThemes/common/headandfoot.tex | 11 ++ .../hardcopyThemes/common/packages.tex | 1 + .../hardcopyThemes/common/webwork_logo.png | Bin 0 -> 9451 bytes .../oneColumn/hardcopyPreamble.tex | 9 +- .../oneColumn/hardcopySetFooter.pg | 17 --- .../oneColumn/hardcopySetFooter.tex | 1 + .../oneColumn/hardcopySetHeader.tex | 0 .../twoColumn/hardcopyPreamble.tex | 7 +- .../twoColumn/hardcopySetFooter.pg | 17 --- .../twoColumn/hardcopySetFooter.tex | 2 + .../twoColumn/hardcopySetHeader.tex | 1 + conf/snippets/screenSetHeader.pg | 33 ----- conf/snippets/setHeader.pg | 88 ------------- .../templates/ASimpleCombinedHeaderFile.pg | 120 ------------------ .../templates/ASimpleHardCopyHeaderFile.pg | 68 ---------- .../templates/ASimpleScreenHeaderFile.pg | 27 ---- .../modelCourse/templates/defaultSetHeader.pg | 78 ++++++++++++ doc/devel/headers-footers | 32 ----- lib/WeBWorK/ContentGenerator/Hardcopy.pm | 69 ++++++++-- lib/WeBWorK/Utils/Rendering.pm | 1 + 45 files changed, 284 insertions(+), 659 deletions(-) delete mode 100644 conf/snippets/ASimpleCombinedHeaderFile.pg create mode 100644 conf/snippets/defaultSetHeader.pg delete mode 120000 conf/snippets/hardcopySetFooter.pg create mode 120000 conf/snippets/hardcopySetFooter.tex delete mode 120000 conf/snippets/hardcopySetHeader.pg create mode 120000 conf/snippets/hardcopySetHeader.tex delete mode 100644 conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-oneColumn/hardcopySetFooter.pg create mode 100644 conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-oneColumn/hardcopySetFooter.tex create mode 100644 conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-oneColumn/hardcopySetHeader.tex delete mode 100644 conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-twoColumn/hardcopySetFooter.pg create mode 100644 conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-twoColumn/hardcopySetFooter.tex create mode 100644 conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-twoColumn/hardcopySetHeader.tex delete mode 100644 conf/snippets/hardcopyThemes/XeLaTeX-oneColumn/hardcopySetFooter.pg create mode 100644 conf/snippets/hardcopyThemes/XeLaTeX-oneColumn/hardcopySetFooter.tex create mode 100644 conf/snippets/hardcopyThemes/XeLaTeX-oneColumn/hardcopySetHeader.tex delete mode 100644 conf/snippets/hardcopyThemes/XeLaTeX-twoColumn/hardcopySetFooter.pg create mode 100644 conf/snippets/hardcopyThemes/XeLaTeX-twoColumn/hardcopySetFooter.tex create mode 100644 conf/snippets/hardcopyThemes/XeLaTeX-twoColumn/hardcopySetHeader.tex create mode 100644 conf/snippets/hardcopyThemes/common/copyright.tex create mode 100644 conf/snippets/hardcopyThemes/common/headandfoot.tex create mode 100644 conf/snippets/hardcopyThemes/common/webwork_logo.png delete mode 100644 conf/snippets/hardcopyThemes/oneColumn/hardcopySetFooter.pg create mode 100644 conf/snippets/hardcopyThemes/oneColumn/hardcopySetFooter.tex create mode 100644 conf/snippets/hardcopyThemes/oneColumn/hardcopySetHeader.tex delete mode 100644 conf/snippets/hardcopyThemes/twoColumn/hardcopySetFooter.pg create mode 100644 conf/snippets/hardcopyThemes/twoColumn/hardcopySetFooter.tex create mode 100644 conf/snippets/hardcopyThemes/twoColumn/hardcopySetHeader.tex delete mode 100644 conf/snippets/screenSetHeader.pg delete mode 100644 conf/snippets/setHeader.pg delete mode 100644 courses.dist/modelCourse/templates/ASimpleCombinedHeaderFile.pg delete mode 100644 courses.dist/modelCourse/templates/ASimpleHardCopyHeaderFile.pg delete mode 100644 courses.dist/modelCourse/templates/ASimpleScreenHeaderFile.pg create mode 100644 courses.dist/modelCourse/templates/defaultSetHeader.pg delete mode 100644 doc/devel/headers-footers diff --git a/conf/defaults.config b/conf/defaults.config index 6fb47d8394..d184ac6bac 100644 --- a/conf/defaults.config +++ b/conf/defaults.config @@ -425,22 +425,30 @@ $webworkFiles{equationCacheDB} = ""; # "$webworkDirs{DATA}/equa # The setHeader precedes each set in hardcopy output. It is a PG file. # This is the default file which is used if a specific files is not selected -$webworkFiles{hardcopySnippets}{setHeader} = "$webworkDirs{conf}/snippets/ASimpleCombinedHeaderFile.pg"; +$webworkFiles{hardcopySnippets}{setHeader} = "$webworkDirs{conf}/snippets/defaultSetHeader.pg"; ################################################################################ # In general the following files are determined by which hardcopy theme you # are using however you can set these variables to override the theme settings. -# Note: These overrides are perminant across all themes. +# Note: These will override all themes. ################################################################################ -# The preamble is the first thing in the TeX file. +# The preamble is the first thing in the TeX file. There is one preamble for the +# entire tex file, even when multiple sets for multiple users are in one PDF #$webworkFiles{hardcopySnippets}{preamble} = "$webworkDirs{conf}/snippets/hardcopyPreamble.tex"; +# The PG file for setHeader is used, and is followed by this hardcopySetHeader.tex +# file. This happens for each set-user combination in a hardcopy that with multiple +# set-user combinations. This file can contain tex-specific header settings that +# should not need to be in a set's PG header file. For example, if the theme uses +# two columns, that should be set here. +#$webworkFiles{hardcopySnippets}{setTexHeader} = "$webworkDirs{conf}/snippets/hardcopySetHeader.tex"; + # The problem divider goes between problems. #$webworkFiles{hardcopySnippets}{problemDivider} = "$webworkDirs{conf}/snippets/hardcopyProblemDivider.tex"; -# The set footer goes after each set. Is is a PG file. -#$webworkFiles{hardcopySnippets}{setFooter} = "$webworkDirs{conf}/snippets/hardcopySetFooter.pg"; +# The set footer is a tex file that goes after each set-user combination. +#$webworkFiles{hardcopySnippets}{setFooter} = "$webworkDirs{conf}/snippets/hardcopySetFooter.tex"; # The set divider goes between sets (in multiset output). #$webworkFiles{hardcopySnippets}{setDivider} = "$webworkDirs{conf}/snippets/hardcopySetDivider.tex"; @@ -457,10 +465,10 @@ $webworkFiles{hardcopySnippets}{setHeader} = "$webworkDirs{conf}/snippets/AS # The set header is displayed on the problem set page. It is a PG file. # This is the default file which is used if a specific files is not selected -$webworkFiles{screenSnippets}{setHeader} = "$webworkDirs{conf}/snippets/ASimpleCombinedHeaderFile.pg"; +$webworkFiles{screenSnippets}{setHeader} = "$webworkDirs{conf}/snippets/defaultSetHeader.pg"; # A PG template for creation of new problems. -$webworkFiles{screenSnippets}{blankProblem} = "$webworkDirs{conf}/snippets/blankProblem2.pg"; # screenSetHeader.pg" +$webworkFiles{screenSnippets}{blankProblem} = "$webworkDirs{conf}/snippets/blankProblem2.pg"; # A site info "message of the day" file $webworkFiles{site_info} = "$webworkDirs{htdocs}/site_info.txt"; diff --git a/conf/localOverrides.conf.dist b/conf/localOverrides.conf.dist index 60d12b55b8..87dd3a7fb3 100644 --- a/conf/localOverrides.conf.dist +++ b/conf/localOverrides.conf.dist @@ -105,16 +105,16 @@ $mail{feedbackRecipients} = [ # Uncomment one of these to use a file from within the course templates directory # rather than a centrally-stored file shared by all courses. -#$webworkFiles{hardcopySnippets}{setHeader} = "$courseDirs{templates}/ASimpleCombinedHeaderFile.pg"; -#$webworkFiles{hardcopySnippets}{setHeader} = "$courseDirs{templates}/ASimpleHardCopyHeaderFile.pg"; +#$webworkFiles{hardcopySnippets}{setHeader} = "$courseDirs{templates}/defaultSetHeader.pg"; +#$webworkFiles{hardcopySnippets}{setHeader} = "$courseDirs{templates}/myHardCopyHeaderFile.pg"; # The set header is displayed on the problem set page. It is a PG file. # One of these default files which is used if a specific files is not selected # Uncomment one of these to use a file from within the course templates directory # rather than a centrally-stored file shared by all courses. -#$webworkFiles{screenSnippets}{setHeader} = "$courseDirs{templates}/ASimpleCombinedHeaderFile.pg"; -#$webworkFiles{screenSnippets}{setHeader} = "$courseDirs{templates}/ASimpleScreenHeaderFile.pg"; +#$webworkFiles{screenSnippets}{setHeader} = "$courseDirs{templates}/defaultSetHeader.pg"; +#$webworkFiles{screenSnippets}{setHeader} = "$courseDirs{templates}/myScreenHeaderFile.pg"; ################################################################################ # Settings for the admin course diff --git a/conf/snippets/ASimpleCombinedHeaderFile.pg b/conf/snippets/ASimpleCombinedHeaderFile.pg deleted file mode 100644 index 1affc23b53..0000000000 --- a/conf/snippets/ASimpleCombinedHeaderFile.pg +++ /dev/null @@ -1,120 +0,0 @@ -# ASimpleCombinedHeaderFile.pg -# This header file can be used for both the screen and hardcopy output - - -DOCUMENT(); - -loadMacros( - "PG.pl", - "PGbasicmacros.pl", - #"source.pl", #uncommenting this will display "show source" button if that is permitted - "PGcourse.pl", - "PGML.pl" -); - -TEXT($BEGIN_ONE_COLUMN); - -#################################################### -# -# The item below is printed out only when a hardcopy is made. -# -#################################################### - -TEXT(MODES(TeX =>EV3(<<'EOT'),HTML=>"")); - -% This is a TeX comment -% Use this space to add header text to pdf hardcopies -% Text added here will not be displayed in the browser - -EOT - -#################################################### -# -# End of hardcopy only output. -# -#################################################### - - -#################################################### -# -# The items below are printed out only when set is displayed on screen -# -#################################################### -TEXT(MODES(TeX =>"",HTML=>EV3(<<'EOT'))); - -$BBOLD WeBWorK Assignment \{ protect_underbar($setNumber) \} is due : $formattedDueDate. $EBOLD -$PAR -Here's the list of -\{ htmlLink(qq!http://webwork.maa.org/wiki/Available_Functions!,"functions and symbols") \} - which WeBWorK understands. -$BR -EOT - -#################################################### -# Uncomment and edit the lines below if this course has a web page. Note that this is comment in Perl mode. -# IMPORTANT: Make sure the EOT at the bottom is at the beginning of a line with no spaces preceding it. -#TEXT(MODES(TeX =>"",HTML=>EV3(<<'EOT'))); -#See the course web page for information \{ htmlLink(qq!http://yoururl/yourcourse!,"your course name") \} -#EOT -#################################################### - -#################################################### -# -# End of screen only output. -# -#################################################### - -#################################################### -# -# Anything between the BEGIN_PGML AND END_PGML lines -# will be printed in both screen and hardcopy output -# -#################################################### - -BEGIN_PGML - -END_PGML - -TEXT($END_ONE_COLUMN); - -#################################################### -# -# The following lines can be used to customize the PDF output -# by following the documentation for the LaTeX exam class -# http://mirrors.ctan.org/macros/latex/contrib/exam/examdoc.pdf -# -#################################################### - -TEXT(MODES(TeX => EV3(<<'EOT'),HTML=>"")); - -% match current hardcopy format -\pagestyle{headandfoot} -\firstpageheader{ - {\large \bf $studentName} \\ -% Uncomment the line below if this course has sections. -% {\large \bf Section: \{protect_underbar($sectionName)\}} \\ - {\large \bf Assignment \{protect_underbar($setNumber)\} due $formattedDueDate} -}{}{ - {\large \bf \{protect_underbar($courseName)\} \\ {} } -} -\ifdefined\nocolumns\firstpageheadrule\fi -\runningheader{}{}{} -\firstpagefooter{}{\thepage}{} -\runningfooter{}{\thepage}{} - -EOT - -# The following must be processed separately because of its use of the @-symbol - -TEXT(MODES(TeX => EV3P({processVariables => 0}, <<'EOT'), HTML => '')); -%==================================================================================% -% Uncomment the lines below to modify the formatting of problem numbers and points % -%==================================================================================% -%\pointpoints{pt.}{pts.} -%\makeatletter -%\qformat{{\bf Problem \thequestiontitle.} \dotfill \if@placepoints{\bf\footnotesize(\thepoints)}\fi} -%\makeatother - -EOT - -ENDDOCUMENT(); # This should be the last executable line in the problem. diff --git a/conf/snippets/defaultSetHeader.pg b/conf/snippets/defaultSetHeader.pg new file mode 100644 index 0000000000..bef3d9f7cb --- /dev/null +++ b/conf/snippets/defaultSetHeader.pg @@ -0,0 +1,78 @@ +# defaultSetHeader.pg +# This header file can be used for both the screen and hardcopy output + +DOCUMENT(); + +loadMacros( + "PGstandard.pl", + "PGML.pl", + "PGcourse.pl", +); + +# Content to print only in LaTeX PDF hardcopy output +# Use PGML markup + +$TeX = <<'TEX'; +This PDF is available for convenience. Assignments must be submitted +within *WeBWorK* for credit. +TEX + +# Content to print only in HTML output +# Use PGML markup + +$HTML = <<"HTML"; +This assignment will close on *$formattedDueDate*. +HTML + +# The first line of PGML below prints the items from above. +# Other content will appear in all output forms. + +BEGIN_PGML +[@ MODES(TeX => $TeX, HTML => $HTML) @]** + +[$setDescription] +[% You can replace this comment with information that + would appear in both screen and hardcopy set headers. %] +END_PGML + +# The hardcopy theme defines headers and footers. If you would like to customize +# those without changing the theme, they can be overrided here by following the +# documentation for the LaTeX exam class. However the footer on the last page +# displays a copyright claim that cannot be overridden here. +# http://mirrors.ctan.org/macros/latex/contrib/exam/examdoc.pdf +# Note the following is tex code, not PGML markup +# Available environment macros are: +# \webworkFirstName, \webworkLastName, \webworkUserId, \webworkStudentId, \webworkEmailAddress, +# \webworkOpenDate, \webworkReducedScoringDate, \webworkDueDate, \webworkAnswerDate, +# \webworkSetId, \webworkPrettySetId, \webworkDescription, +# \webworkCourseName, \webworkCourseTitle, \webworkCourseURL +# \webworkSection, \webworkRecitation, + +#TEXT(MODES(TeX => EV3(<<'EOT'),HTML=>"")); +# +#\pagestyle{headandfoot} +#\firstpageheader% +#{{\large\bfseries Assignment \href{\webworkCourseURL/\webworkSetId}{\webworkPrettySetId{}}\\}\ifx\webworkReducedScoringDate\empty\else{full credit by \webworkReducedScoringDate, }\fi closes \webworkDueDate\\\href{\webworkCourseURL}{\scshape\webworkCourseTitle}}% +#{}% +#{{\large\bfseries\webworkFirstName{} \webworkLastName{} (\webworkUserId)\\}% +#\ifx\webworkSection\empty{\ \\}\else{Section: \webworkSection\\}\fi% +#\ifx\webworkRecitation\empty{\ }\else{Recitation: \webworkRecitation}\fi% +#}% +#\runningheader{}{}{} +#\footer{}{}{Page \thepage} +# +#EOT + +# The following must be processed separately because of its use of the @-symbol +# Uncomment the lines below to modify the formatting of problem numbers and points + +#TEXT(MODES(TeX => EV3P({processVariables => 0}, <<'EOT'), HTML => '')); +# +#%\pointpoints{pt.}{pts.} +#%\makeatletter +#%\qformat{{\bf Problem \thequestiontitle.} \dotfill \if@placepoints{\bf\footnotesize(\thepoints)}\fi} +#%\makeatother +# +#EOT + +ENDDOCUMENT(); diff --git a/conf/snippets/hardcopySetFooter.pg b/conf/snippets/hardcopySetFooter.pg deleted file mode 120000 index 2e03481a11..0000000000 --- a/conf/snippets/hardcopySetFooter.pg +++ /dev/null @@ -1 +0,0 @@ -hardcopyThemes/twoColumn/./hardcopySetFooter.pg \ No newline at end of file diff --git a/conf/snippets/hardcopySetFooter.tex b/conf/snippets/hardcopySetFooter.tex new file mode 120000 index 0000000000..ce410efe66 --- /dev/null +++ b/conf/snippets/hardcopySetFooter.tex @@ -0,0 +1 @@ +hardcopyThemes/twoColumn/./hardcopySetFooter.tex \ No newline at end of file diff --git a/conf/snippets/hardcopySetHeader.pg b/conf/snippets/hardcopySetHeader.pg deleted file mode 120000 index 9434062862..0000000000 --- a/conf/snippets/hardcopySetHeader.pg +++ /dev/null @@ -1 +0,0 @@ -hardcopyThemes/twoColumn/./hardcopySetHeader.pg \ No newline at end of file diff --git a/conf/snippets/hardcopySetHeader.tex b/conf/snippets/hardcopySetHeader.tex new file mode 120000 index 0000000000..c970303121 --- /dev/null +++ b/conf/snippets/hardcopySetHeader.tex @@ -0,0 +1 @@ +hardcopyThemes/twoColumn/./hardcopySetHeader.tex \ No newline at end of file diff --git a/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-oneColumn/hardcopyPreamble.tex b/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-oneColumn/hardcopyPreamble.tex index 1b9b453d01..1783c79b2b 100644 --- a/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-oneColumn/hardcopyPreamble.tex +++ b/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-oneColumn/hardcopyPreamble.tex @@ -30,18 +30,18 @@ % WeBWorK used Control+_ = ^_ for verbatim... so we change its charcode \catcode`\=12 -% This is used to signal PG that we are not using multicols -\newcommand{\nocolumns}{} - % This removes the margin for questions from the exam class. At this point we only use questions and not parts or -% supparts, but if those are used a similar thing will be needed for those as well. +% subparts, but if those are used a similar thing will be needed for those as well. \renewcommand{\questionshook}{\leftmargin=0pt\labelwidth=-\labelsep} \makeatletter -\qformat{{\bf שאלה \thequestiontitle.} \if@placepoints{\textenglish{\bf\footnotesize(\thepoints)}}\fi \hfill} +\qformat{{\bfseries שאלה \thequestiontitle.} \if@placepoints{\textenglish{\bfseries\footnotesize(\thepoints)}}\fi \hfill} \makeatother \input{CAPA.tex} \input{PGML.tex} +% This needs a Hebrew specific replacement +\input{headandfoot.tex} + \begin{document} diff --git a/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-oneColumn/hardcopySetFooter.pg b/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-oneColumn/hardcopySetFooter.pg deleted file mode 100644 index 59bbce43d6..0000000000 --- a/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-oneColumn/hardcopySetFooter.pg +++ /dev/null @@ -1,25 +0,0 @@ -# -# hardcopySetFooter.pg - generic hardcopy set footer file -# - -DOCUMENT(); -loadMacros( - "PG.pl", - "PGbasicmacros.pl" -); - -BEGIN_TEXT - -\newfontfamily\libertine{Linux Libertine O} - -\begin{english} -\noindent {\tiny Generated by WeBWorK {\libertine \copyright}} -\end{english} - -\begin{hebrew} -\noindent{\tiny נוצר על ידי \textenglish{WeBWorK} {\libertine \copyright}} -\end{hebrew} - -END_TEXT - -ENDDOCUMENT(); diff --git a/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-oneColumn/hardcopySetFooter.tex b/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-oneColumn/hardcopySetFooter.tex new file mode 100644 index 0000000000..c8716a38ba --- /dev/null +++ b/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-oneColumn/hardcopySetFooter.tex @@ -0,0 +1 @@ +\input{copyright.tex} diff --git a/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-oneColumn/hardcopySetHeader.tex b/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-oneColumn/hardcopySetHeader.tex new file mode 100644 index 0000000000..e69de29bb2 diff --git a/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-twoColumn/hardcopyPreamble.tex b/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-twoColumn/hardcopyPreamble.tex index 53fe215257..add6e818a2 100644 --- a/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-twoColumn/hardcopyPreamble.tex +++ b/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-twoColumn/hardcopyPreamble.tex @@ -34,16 +34,18 @@ \setlength{\columnseprule}{.4pt} % This removes the margin for questions from the exam class. At this point we only use questions and not parts or -% supparts, but if those are used a similar thing will be needed for those as well. +% subparts, but if those are used a similar thing will be needed for those as well. \renewcommand{\questionshook}{\leftmargin=0pt\labelwidth=-\labelsep} \makeatletter -\qformat{{\bf שאלה \thequestiontitle.} \if@placepoints{\textenglish{\bf\footnotesize(\thepoints)}}\fi \hfill} +\qformat{{\bfseries שאלה \thequestiontitle.} \if@placepoints{\textenglish{\bfseries\footnotesize(\thepoints)}}\fi \hfill} \makeatother \input{CAPA.tex} \input{PGML.tex} +% This needs a Hebrew specific replacement +\input{headandfoot.tex} + \begin{document} \voffset=-0.8in -\twocolumn diff --git a/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-twoColumn/hardcopySetFooter.pg b/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-twoColumn/hardcopySetFooter.pg deleted file mode 100644 index 59bbce43d6..0000000000 --- a/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-twoColumn/hardcopySetFooter.pg +++ /dev/null @@ -1,25 +0,0 @@ -# -# hardcopySetFooter.pg - generic hardcopy set footer file -# - -DOCUMENT(); -loadMacros( - "PG.pl", - "PGbasicmacros.pl" -); - -BEGIN_TEXT - -\newfontfamily\libertine{Linux Libertine O} - -\begin{english} -\noindent {\tiny Generated by WeBWorK {\libertine \copyright}} -\end{english} - -\begin{hebrew} -\noindent{\tiny נוצר על ידי \textenglish{WeBWorK} {\libertine \copyright}} -\end{hebrew} - -END_TEXT - -ENDDOCUMENT(); diff --git a/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-twoColumn/hardcopySetFooter.tex b/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-twoColumn/hardcopySetFooter.tex new file mode 100644 index 0000000000..d5c2b3c4da --- /dev/null +++ b/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-twoColumn/hardcopySetFooter.tex @@ -0,0 +1,2 @@ +\input{copyright.tex} +\end{multicols*} diff --git a/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-twoColumn/hardcopySetHeader.tex b/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-twoColumn/hardcopySetHeader.tex new file mode 100644 index 0000000000..18edf8e9bf --- /dev/null +++ b/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-twoColumn/hardcopySetHeader.tex @@ -0,0 +1 @@ +\begin{multicols*}{2} diff --git a/conf/snippets/hardcopyThemes/XeLaTeX-oneColumn/hardcopyPreamble.tex b/conf/snippets/hardcopyThemes/XeLaTeX-oneColumn/hardcopyPreamble.tex index f0caeee68e..40aaa1cd02 100644 --- a/conf/snippets/hardcopyThemes/XeLaTeX-oneColumn/hardcopyPreamble.tex +++ b/conf/snippets/hardcopyThemes/XeLaTeX-oneColumn/hardcopyPreamble.tex @@ -32,18 +32,17 @@ % WeBWorK used Control+_ = ^_ for verbatim... so we change its charcode \catcode`\=12 -% This is used to signal PG that we are not using multicols -\newcommand{\nocolumns}{} - % This removes the margin for questions from the exam class. At this point we only use questions and not parts or -% supparts, but if those are used a similar thing will be needed for those as well. +% subparts, but if those are used a similar thing will be needed for those as well. \renewcommand{\questionshook}{\leftmargin=0pt\labelwidth=-\labelsep} \makeatletter -\qformat{{\bf Problem \thequestiontitle.} \if@placepoints{\bf\footnotesize(\thepoints)}\fi \hfill} +\qformat{{\bfseries Problem \thequestiontitle.} \if@placepoints{\bfseries\footnotesize(\thepoints)}\fi \hfill} \makeatother \input{CAPA.tex} \input{PGML.tex} +\input{headandfoot.tex} + \begin{document} diff --git a/conf/snippets/hardcopyThemes/XeLaTeX-oneColumn/hardcopySetFooter.pg b/conf/snippets/hardcopyThemes/XeLaTeX-oneColumn/hardcopySetFooter.pg deleted file mode 100644 index 97a6abe9b7..0000000000 --- a/conf/snippets/hardcopyThemes/XeLaTeX-oneColumn/hardcopySetFooter.pg +++ /dev/null @@ -1,19 +0,0 @@ -# -# hardcopySetFooter.pg - generic hardcopy set footer file -# - -DOCUMENT(); -loadMacros( - "PG.pl", - "PGbasicmacros.pl" -); - -BEGIN_TEXT - -\begin{english} -\noindent {\tiny Generated by WeBWorK \copyright} -\end{english} - -END_TEXT - -ENDDOCUMENT(); diff --git a/conf/snippets/hardcopyThemes/XeLaTeX-oneColumn/hardcopySetFooter.tex b/conf/snippets/hardcopyThemes/XeLaTeX-oneColumn/hardcopySetFooter.tex new file mode 100644 index 0000000000..c8716a38ba --- /dev/null +++ b/conf/snippets/hardcopyThemes/XeLaTeX-oneColumn/hardcopySetFooter.tex @@ -0,0 +1 @@ +\input{copyright.tex} diff --git a/conf/snippets/hardcopyThemes/XeLaTeX-oneColumn/hardcopySetHeader.tex b/conf/snippets/hardcopyThemes/XeLaTeX-oneColumn/hardcopySetHeader.tex new file mode 100644 index 0000000000..e69de29bb2 diff --git a/conf/snippets/hardcopyThemes/XeLaTeX-twoColumn/hardcopyPreamble.tex b/conf/snippets/hardcopyThemes/XeLaTeX-twoColumn/hardcopyPreamble.tex index 47dff1da1f..e4a2c0df0f 100644 --- a/conf/snippets/hardcopyThemes/XeLaTeX-twoColumn/hardcopyPreamble.tex +++ b/conf/snippets/hardcopyThemes/XeLaTeX-twoColumn/hardcopyPreamble.tex @@ -36,15 +36,16 @@ \setlength{\columnseprule}{.4pt} % This removes the margin for questions from the exam class. At this point we only use questions and not parts or -% supparts, but if those are used a similar thing will be needed for those as well. +% subparts, but if those are used a similar thing will be needed for those as well. \renewcommand{\questionshook}{\leftmargin=0pt\labelwidth=-\labelsep} \makeatletter -\qformat{{\bf Problem \thequestiontitle.} \if@placepoints{\bf\footnotesize(\thepoints)}\fi \hfill} +\qformat{{\bfseries Problem \thequestiontitle.} \if@placepoints{\bfseries\footnotesize(\thepoints)}\fi \hfill} \makeatother \input{CAPA.tex} \input{PGML.tex} +\input{headandfoot.tex} + \begin{document} -\twocolumn diff --git a/conf/snippets/hardcopyThemes/XeLaTeX-twoColumn/hardcopySetFooter.pg b/conf/snippets/hardcopyThemes/XeLaTeX-twoColumn/hardcopySetFooter.pg deleted file mode 100644 index 190920fda6..0000000000 --- a/conf/snippets/hardcopyThemes/XeLaTeX-twoColumn/hardcopySetFooter.pg +++ /dev/null @@ -1,17 +0,0 @@ -# -# hardcopySetFooter.pg - generic hardcopy set footer file -# - -DOCUMENT(); -loadMacros( - "PG.pl", - "PGbasicmacros.pl" -); - -BEGIN_TEXT - -\noindent {\tiny Generated by \copyright WeBWorK, http://webwork.maa.org, Mathematical Association of America} - -END_TEXT - -ENDDOCUMENT(); diff --git a/conf/snippets/hardcopyThemes/XeLaTeX-twoColumn/hardcopySetFooter.tex b/conf/snippets/hardcopyThemes/XeLaTeX-twoColumn/hardcopySetFooter.tex new file mode 100644 index 0000000000..d5c2b3c4da --- /dev/null +++ b/conf/snippets/hardcopyThemes/XeLaTeX-twoColumn/hardcopySetFooter.tex @@ -0,0 +1,2 @@ +\input{copyright.tex} +\end{multicols*} diff --git a/conf/snippets/hardcopyThemes/XeLaTeX-twoColumn/hardcopySetHeader.tex b/conf/snippets/hardcopyThemes/XeLaTeX-twoColumn/hardcopySetHeader.tex new file mode 100644 index 0000000000..18edf8e9bf --- /dev/null +++ b/conf/snippets/hardcopyThemes/XeLaTeX-twoColumn/hardcopySetHeader.tex @@ -0,0 +1 @@ +\begin{multicols*}{2} diff --git a/conf/snippets/hardcopyThemes/common/copyright.tex b/conf/snippets/hardcopyThemes/common/copyright.tex new file mode 100644 index 0000000000..1b28fd8c61 --- /dev/null +++ b/conf/snippets/hardcopyThemes/common/copyright.tex @@ -0,0 +1 @@ +\footer{\raisebox{-0.325cm}{\includegraphics[width=3cm]{webwork_logo.png}}}{\small\sffamily Generated by WeBWorK, \copyright The WeBWorK Project, \url{https://openwebwork.org}.}{Page \thepage} diff --git a/conf/snippets/hardcopyThemes/common/headandfoot.tex b/conf/snippets/hardcopyThemes/common/headandfoot.tex new file mode 100644 index 0000000000..4647ed0c20 --- /dev/null +++ b/conf/snippets/hardcopyThemes/common/headandfoot.tex @@ -0,0 +1,11 @@ +\pagestyle{headandfoot} +\firstpageheader% +{{\large\bfseries Assignment \href{\webworkCourseURL/\webworkSetId}{\webworkPrettySetId{}}\\}\ifx\webworkReducedScoringDate\empty\else{full credit by \webworkReducedScoringDate, }\fi closes \webworkDueDate\\\href{\webworkCourseURL}{\scshape\webworkCourseTitle}}% +{}% +{{\large\bfseries\webworkFirstName{} \webworkLastName{} (\webworkUserId)\\}% +\ifx\webworkSection\empty{\ \\}\else{Section: \webworkSection\\}\fi% +\ifx\webworkRecitation\empty{\ }\else{Recitation: \webworkRecitation}\fi% +}% +\runningheader{}{}{} +\footer{}{}{Page \thepage} + diff --git a/conf/snippets/hardcopyThemes/common/packages.tex b/conf/snippets/hardcopyThemes/common/packages.tex index 79162cf3fa..3942af17cf 100644 --- a/conf/snippets/hardcopyThemes/common/packages.tex +++ b/conf/snippets/hardcopyThemes/common/packages.tex @@ -19,6 +19,7 @@ \usepackage{pslatex} \usepackage{listings} \lstset{basicstyle=\ttfamily,breaklines=true,aboveskip=0pt,belowskip=0pt} +\usepackage{hyperref} \pagestyle{plain} diff --git a/conf/snippets/hardcopyThemes/common/webwork_logo.png b/conf/snippets/hardcopyThemes/common/webwork_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4790e1c4d60979757762f5f52546e4ce59198f2f GIT binary patch literal 9451 zcmZ{q2RxN=xX0gvNLeLWA))NO_XtV$$eu;^-s?oj%3dMLCL?Ik^A# zxc7cO_ukL_o^&|p{LlNo|NrxUp5OC4ZR^K%Q&L*Nvr@V{yMxtK4|P)2sR0(oUd%~>sNVlnC_7#GBNjsw`e-{Qbm0lz8+yX zGwq#ON~}+1WK8M)UGGWX6QNk=xl42v3*%+hSV7k2HTXA4Rq7kqI_OvV?&6h8!oOK( z^^naTZOt?VTo_GNp$A9`bwwiH@!L&&wi<%mHz&WkEGfH<%E6xw49Eu`7jT%a_d26! z9)=;A?SC&5N1P>s(3kHmq8rHdQOh8ktb-HgopaSD2|Fc>*ggRhz8nHb1RdMOfZAbylYH104 z>Rlqwd!f-X)_;4#aq((y?Io}aYBjIl_RmCpY zmnji&juLAA(-uL>p@+o@{y5qDTUe(JpNDD^w>gqUvq1HIi^OL8Pr$&9=I-upn=K<` zYNbUl#R}xOiTb)n$&bOR|HXE^BTx zFqxTwPecJAxw5@cJ>&nofm_y*=dp&-)(*1@yGcsG-(Jpm}k-drrh1GN^T38T^?B&G;Qnd6eiOcl+3{yj!u62Wz8c znLMF1mS$#VAIb=4t7jaV>O>@+ot<|pEult0C?Udib*ymyXeQhA*U**ns;Vj~Tb%xn zx|J3`)8;$%HHc?7epfrpG`8)<$0IhU>O8hKsgRwNu>$w#5Zv56-~oBNZVjCM-h#04 zsd;N`o+8=wt8Lv<18v6i^eT?3pZ$nq`2FR*hOQokq>hfx*c&QnzWohlotcoor)F8{ ze_hUtghbm%*>~iGBJUtL$Lz}u>kc9F_DFK`=WPL78#fH589D*zHg{{5LI z;4rD@iE-U})nGRSAsflOd4 zG0)x{LC^lZuAZxc?Bd`-V6qd}rWisHe>Mf1uL@22;MqJOuV$s?yxw*!onYWcZ6*H` z-rOnJ{;7nwH%9M)4f?N_3Ye&6@BYrWs=1BdU*{MqDk>{nDo(B%!22RMNWBUB$(&#z zhq`f2-iN!Pg@x-*Y*JNS zL;^Nwf;cozSRcLbcy3!SkMw-L`QEG&xX(jSNb1V~LfV`ydm{=_`q>7WU?!-H+o zpCuJk>yaE_qz(8&hPaM}Ayt_Di((dbKB(gxCVP25)A;RLp5e8wFVYwnYnSK^7iWL# z`XOcc(P_Tlr$(8ov8ueh+|l)W)yS(?WdSswF(j-8a}-#fVtlq9E=v5w)eL*$H&n&P zsPxJ7$$C+wL*vQcv;g5uT-eJ$)3C?i^xoOb48<+}>d}S&m*e)OzX-uieM3t+{J%qtB2gWEoF%iiCxN>FA zLBOGF=KTD0tLgNV$HLy;e)_|enI<@r4dwIjgT>q#8SxDOuWuf#MV_3Vp89xl@;m+c z9u|bnHB#%gHqs8ZEMR4oTf5qRsz;v6xkUeYxBL&2_77-&o!$DSQn(Y?h<>LUg3ZddlL(RkczEC)4Gd}cibn|! zKznECvvQ^vwj3YdxnVt&r<6uP@hAC172nM51oR;;s7-c3d=wKy_+OkI%{a_plL*gtVbA`7xmTRQK4G}c;C?w3k<%$c@mpn=^XOUU2cK@hMMJHPK8ETMDe|8G z$zrmx|4Hztf5HcDt5!T{X_O`~?@$zZi_7-)CwMB1nv4#Q7Q2%`w-t z4e-*HnjF!a@_O%FZS3sqlz2#skbz8*rk>*$y*ip@y=0GrinhGE=53-3K!^hzUzODp zcTcZa3UlYkxOL$38H6ss(?hNhjh=c@-ug&GAg=x$tgSY##mR^1W42o(;7}J;Ezrz6 zYE{bK3*{?k3U5^2mX9>7Wi&Pd0ZT{omL$+8t81eLCc`CZ>rO6zftIttD}8C$h_}5w zkS*VrNs1Cjot>Qp1tGkTHm7`6HJ_Z%F1$Jw6Fq)gRzc_K^}@!=X1Fk7da}$opvpq+ zb$u*m)GN(Jv=%d32++9mr38j;Cg5Zjp22wvU;EPCMRR!$5f>9H7+lq_&Wl}%EX7-1 zw*@XEve@}di7wr#hd{OMFT!!ICHOiidseh^zVd3R z-H+_=WV7&Me1F)p^gEYFQs;%va_U`V+JHdz(J3ZS9Jz|WzjP%h!?G$htXKQujKiI^ z(&7i9MiHz~DfqT!DY&srV6R7bNA=wMmfXTRVDZWkVsTYDjE#}QAp4k%rhFZ*q_jtA1z5e|B79^ow{gkWTheqSRygl6VF;1R zq~YB^(2hT5gYkz*6|DUK9mFe1C|qoJsgLnVJ|5+94SWDqI0 z*^c!Xqb46SFXS@ITAPIJj%+faNeT7YF&if&vi8^=x$iI!q7NXj`g)?uMrFXoIS46x zGgj^IVWH@~KWntvox}$8yzaL$mc>gUkJZd%+i1bTS8oU;=!dQ+&%JWT@HqWwPtYKE z9Y*SPhw=(?@3>sQ%g@fg*>8$u(#U^8Wx>%z7lXs3tCTM2^e3DI)fRK#P!+2UQzeDd zG%yPPUBGtMx)TVeqMn;~gx^1T7paUxK;Rp$tD&K>H}l6?f$SBYr<9f1ukQt>GI$Y> zA2Uzzvs?u$4JNpH-T!$${g0DSVaGsW6W|2^zedgv_0L6wJQxF~Wv*q@7GTCEu`r;g z05=PrPF1y%ClzXNDGuiyoyH;W+Yh;?WN`3O%ht>kPR0>x8rW+>@5!gfP=0|R+AUam zo)u$d6HoktnT~#Rj6PzKvejS*63No}MTG~h}8yn#1e~!V~+{Ny7;p9k)HnRIpCU{jj zS{xGe^z_fxwA+PY>$dwHILad^DCjwKza9RTe}^Y}C556+XexTCV1cHs9p0D81xst5 zW3PhkU{lktUr~anil<^IS)(&-f;%8YNuDg_=D~316~nOjhQUXrd0J}l)tSNLZMGw)0Gf8kEIJ8Mweh3Z zn@w=MJSVqMP_~&vb0uJ_OGMTJxf2ob3Eux>pMtoE&56zF=-OH9^xXNjkkdVs0)IXQ zbJfs@`yLaK{~)ubHxDhyZXE+&FZp~Mlfplo<8<%@R=$2KHz|J2nzY-4&>_M}G(U(s zBX7;YiOc||{VJN!J?8J<<)2R*gwN;q*E)1S($JpB65K?HC-G-`uqa8!sUMagAImQI zj7b)oW3kOsGIjXRRbt)`T zGWT-11L;n;KX>K;2L&+ik?&{2)(?WvkR;RbHETv+mN`N`f&5+6Yxkj(Q1~<*ck?n{ zM;V>i8@%mH{aJ=`yKK#WsA-><@1*nA5Nd}_ zd4qeT+_W_WNYP=i!$R`z2RNa1tA$eg{=orAWG(UHc{xLHH%}gUFN3m+&w*Lb;NW0| zpU=9^>aRI{4}hiRE#?|m+)M>2yd9v%_3O7f? zKV7Ei28T3HjY8jOxL0&!$GutKp~s@dPotG#A_VRnFuvAFjGaZGX`Lm9c9}1RGq2<7 zKf>37{k(uf=`pH|?YopIU4g2m|L?QQYEYaQ^?Zp|0DFP?UHxe!0uvjLEbG{}5Ru15 z{#Yyah}sUVNH!wp^!R5uGRWVv3G42VtGu)>utk~!1!F&D*3&lL=C!V4TTrB>Hc)6L zTY6O%`(~>xnGHPB;%ALiWkp5B>R|Av8+3A!%fCqztwIQ%*ti zMv+wQ|nsouBW8F=i8igZt8cRJKDZP7YUecQX! zCpw4b?Y`;j>0bu4O5R3ZYD6s7n*7cC7`1G!`ZbQU=J*u6FS4>*Qw}88UQV%+*ZBf< zHC4AW_JOD(rW&7+kZ`6Ujnebxm(HG^9#qo>i|+|SJj%dh+B+&s;0Y8x)vEjX}<3JOh;FhKol>Y+c6GQ*V9E*-P;rdnTV7;L8NohK$P$ zOX5x5`K^~-A{C>t*W&BpQ|L~v=olY^>EtjLK6s+x0LO*Y)X4WkQLDc%vpc0P;>!$d zP2#c**pbTSk?)U~%?niN^~FOFiJ9)n%H%^7{-(Ncl_*y+F_ZRg4mMds>vbbSSsLg4 zZ-GWLsQSwg|2m+#e}_!M@R)FDH>As`|CYsEL%R>isu*>47I2&UO=Uur93PhTyRAXO zZtK4We&Ei+!in9G*}L#NY$yT(ILGtR66b=>uky*!B8y3*pR$V6>602DEDS==aqg9V zpx)b~D1J~|zIgFsteh57W-u3Zk%XeR>|jA3OUJd+vO3Jz9Q&48pP-k>@!K0X&>B@> z-R0om*lNXTJ7`PAqPBQRWjY|{p!I$`O)iRp@86P3e8|gwAKFA}`Z6`y+1JwUO}|96 zwP56@cb=OdP9Z2*on|MULrvTmNi+{+>f8@cuN}# z;v_p+QFj@A{c=*?!Z?@tTZs(14II7P$}bnaR>#cDu~nh`zBQ%@PAILlN?*mL zq@;K*5j6i{h)DiufIC|^?Qs@1e@rOm&MK)2@bny*f=Y4swliUevNeP=-+y1Jg)>Gz zT9ZQngyQ2>t)7r)R)r|9oRxJTlf_)_L&{LHnO|VB$3&Y zx(`?#?eJ_Z(I+t`9j!&&hU-2po=92yh{@YM9JNaZsyS4KpoHh_%nkMCKo8N5s@vVO z%l-Q=TGbAfNAog^Z2`IV&{nf>5Ss`^$D{*mgeb~xpb<-V7BQJ~A7o~IJ ze9an}8xzwRPQs#HQ#0GSf9#Zy^=nic1@fMgTFw>~XkHTe1zf}Q0q&(+(UqPA~@t>@Kgk}AKYBMv($A=w4P>?OocyA^lr_ac`ZsVHQ zNLGt!+n`2LD=0j|dw zHc&treKk3M;cV_gUtSe10wl6vuEXWlisullSmW<^Dd*lM4gVaNJJG~@Fb)cB*!UET z0aPmq^thk;ab9c2h9#usbUjwjp<~@Y=Rn<}9FFc{veIy;XQh=LcW2tzP?l!FYA4Um zLnSB0Bm`H~-r&8L)M%M|#kve#X!shxl~4FMuE-Zw+AWOdiCW=?;c-U3c-Nsv^%u_xCxeCX2LEmJObg#;f(bZHrgz#GFsw z@f8tCctgpfcTiZ`5;*-9Vq9)M(!gQOxTooUZCCN=cXsIduSr-{mm0DZ3+8^@&*GI5 z@h;xwxCoRU&Hu+t5lbR4c!Qai@5wHs&4#kgh-PU~Ry@fe$G30361gt)xZQ)-{yHQL zugm4LLHqxndaxmYUAihT)pS>S1%9&gV|s z1vOB|$k5O~&hwy%@`n1kEhvo@=c_C^eP6(jic5%mf1fw{Y2JK}ez?3`P=rzSa1mDs z4aVeJjDPf-H*dr}RsGK%rF;jPsWy!vPaicG`p4m^ms851ozy%9?k<6rE7kJ`KBkYk zpos(oOyWU^+=F|IYfEU6ORG-<;yR#hDPZH_>as5#OS7a=Sy9Mb!if6=2RB#YM10B? zRA+cMZJFt>$fOd&1CQ_+Z>e}^9jOz&tsBZ`F0`apC;7^t5W1@Qt((IpK@jtaDzZ_R zvXZ|<->-LcEwYKEohTI4DD7w7*dK<37{oFI?S1sm4R5rl-YAkjp4Z6Lzm~@Au%Ud?xu~EPw|%vW=f1-1&XD>yl8M{e;T1U) zCV?#zIg4w{Fx%VJyUJmF%~)33akPg(4!sqp3SfzpS_7?~vaQDX7E*dCreOCnSz?4bqpQgXltn>A7n@8|5(h~^gr90nzbbMH1hM_ zj2V^su%|RvCWAq+TN>2+@(RZVoWu2HCYL?QS-(AcPmSW>z-F<`*g*QuXE(T{;I2L8 zm{{fh;5qAH0sHda9UhCG6fX1QtNOZ+(-8MLb;H)(9${3~YnbgKx-pwlAn8`=R`#=y zh_ig<_a26>uHU+4-{Y}v9XmB1!UeLaDi&{*_O_jJ+VpF30;kQAJ=X@Cnoy{gwkvIv zLuWA>q*EOrFOX-~du5|Hl%GvJ8iWHSw{nDTjUkB0h{zm|Ih)~xh~0>l(qBzeb?j;h z{$r+PimU{5|89yx^3nniJ)Vz3i&DL>7Ji0*IEHScNugF(j3`@C^Hcqb3*iew;bYw@ zdru8i`6;`wA3CKke18>48lI7~pr$=Rh5tZKW3n!E;I_T}q*r8pF%xV2X4=R@rs>o_ zg)21`1idw#UnGJnO?R)kjjH>-h+)w7kWB~{4zU957{hcg3Yl;m?b|nNUcl)%0+Vwx z$3iL6fl`#r1g?!^V3cF()!v$)YD_4o&ylgBh`uA_OizzBAAg1tU%F8mY^q2n2ibxe zq@u~)knzt}nA<}t5@(-198Ojk;f6vDlN)x5q~$%xj?Jz_B@-Gs{D4A3;ZNyHm+6HHKZe?y|k%7g`SdTVp8ZG5@*y$zpo!_*6-(-+~tO8c;@%7wk zi1<3Fm2h6T?7sZ0srfPWfTN2A-O5=Z7B)Uu53{LU>iuCXV%T7PP?Q;fJ@&=#_aSkI z8m`rr_&)!aFWN^_pqB zVt}6?5*H+fI$v*^9KD!P6SMo6xzaZ^s2!a?~Wp!MinYum~Hg|pwo*-^cZXPyHel{*aO)eo} zP9b4FA<$_T=H#^WrcwSM1MD20Sy_1f{{wD6$lnD682|eSu2y!>U0hA=9RJrCF7WkS Wmj}VgEV3(<<'EOT'),HTML=>"")); - -\noindent {\large \bf $studentName} -\hfill -{\large \bf {\{protect_underbar($courseName)\}}} -% Uncomment the line below if this course has sections. Note that this is a comment in TeX mode since this is only processed by LaTeX -% {\large \bf { Section: \{protect_underbar($sectionName)\} } } -\par -\noindent{\large \bf {Assignment \{protect_underbar($setNumber)\} due $formattedDueDate}} -\par\noindent -% Uncomment and edit the line below if this course has a web page. Note that this is a comment in TeX mode. -%See the course web page for information http://yoururl/yourcourse - -EOT - -#################################################### -# -# End of hardcopy only output. -# -#################################################### - - -#################################################### -# -# The items below are printed out only when set is displayed on screen -# -#################################################### -TEXT(MODES(TeX =>"",HTML=>EV3(<<'EOT'))); - -$BBOLD WeBWorK Assignment \{ protect_underbar($setNumber) \} is due : $formattedDueDate. $EBOLD -$PAR -Here's the list of -\{ htmlLink(qq!http://webwork.maa.org/wiki/Available_Functions!,"functions and symbols") \} - which WeBWorK understands. -$BR -EOT - -#################################################### -# Uncomment and edit the lines below if this course has a web page. Note that this is comment in Perl mode. -# IMPORTANT: Make sure the EOT at the bottom is at the beginning of a line with no spaces preceding it. -#TEXT(MODES(TeX =>"",HTML=>EV3(<<'EOT'))); -#See the course web page for information \{ htmlLink(qq!http://yoururl/yourcourse!,"your course name") \} -#EOT -#################################################### - -#################################################### -# -# End of screen only output. -# -#################################################### - -#################################################### -# -# Anything between the BEGIN_TEXT AND END_TEXT lines -# will be printed in both screen and hardcopy output -# -#################################################### - -BEGIN_TEXT - -END_TEXT - - -TEXT($END_ONE_COLUMN); - -ENDDOCUMENT(); # This should be the last executable line in the problem. diff --git a/courses.dist/modelCourse/templates/ASimpleCombinedHeaderFile.pg b/courses.dist/modelCourse/templates/ASimpleCombinedHeaderFile.pg deleted file mode 100644 index 1affc23b53..0000000000 --- a/courses.dist/modelCourse/templates/ASimpleCombinedHeaderFile.pg +++ /dev/null @@ -1,120 +0,0 @@ -# ASimpleCombinedHeaderFile.pg -# This header file can be used for both the screen and hardcopy output - - -DOCUMENT(); - -loadMacros( - "PG.pl", - "PGbasicmacros.pl", - #"source.pl", #uncommenting this will display "show source" button if that is permitted - "PGcourse.pl", - "PGML.pl" -); - -TEXT($BEGIN_ONE_COLUMN); - -#################################################### -# -# The item below is printed out only when a hardcopy is made. -# -#################################################### - -TEXT(MODES(TeX =>EV3(<<'EOT'),HTML=>"")); - -% This is a TeX comment -% Use this space to add header text to pdf hardcopies -% Text added here will not be displayed in the browser - -EOT - -#################################################### -# -# End of hardcopy only output. -# -#################################################### - - -#################################################### -# -# The items below are printed out only when set is displayed on screen -# -#################################################### -TEXT(MODES(TeX =>"",HTML=>EV3(<<'EOT'))); - -$BBOLD WeBWorK Assignment \{ protect_underbar($setNumber) \} is due : $formattedDueDate. $EBOLD -$PAR -Here's the list of -\{ htmlLink(qq!http://webwork.maa.org/wiki/Available_Functions!,"functions and symbols") \} - which WeBWorK understands. -$BR -EOT - -#################################################### -# Uncomment and edit the lines below if this course has a web page. Note that this is comment in Perl mode. -# IMPORTANT: Make sure the EOT at the bottom is at the beginning of a line with no spaces preceding it. -#TEXT(MODES(TeX =>"",HTML=>EV3(<<'EOT'))); -#See the course web page for information \{ htmlLink(qq!http://yoururl/yourcourse!,"your course name") \} -#EOT -#################################################### - -#################################################### -# -# End of screen only output. -# -#################################################### - -#################################################### -# -# Anything between the BEGIN_PGML AND END_PGML lines -# will be printed in both screen and hardcopy output -# -#################################################### - -BEGIN_PGML - -END_PGML - -TEXT($END_ONE_COLUMN); - -#################################################### -# -# The following lines can be used to customize the PDF output -# by following the documentation for the LaTeX exam class -# http://mirrors.ctan.org/macros/latex/contrib/exam/examdoc.pdf -# -#################################################### - -TEXT(MODES(TeX => EV3(<<'EOT'),HTML=>"")); - -% match current hardcopy format -\pagestyle{headandfoot} -\firstpageheader{ - {\large \bf $studentName} \\ -% Uncomment the line below if this course has sections. -% {\large \bf Section: \{protect_underbar($sectionName)\}} \\ - {\large \bf Assignment \{protect_underbar($setNumber)\} due $formattedDueDate} -}{}{ - {\large \bf \{protect_underbar($courseName)\} \\ {} } -} -\ifdefined\nocolumns\firstpageheadrule\fi -\runningheader{}{}{} -\firstpagefooter{}{\thepage}{} -\runningfooter{}{\thepage}{} - -EOT - -# The following must be processed separately because of its use of the @-symbol - -TEXT(MODES(TeX => EV3P({processVariables => 0}, <<'EOT'), HTML => '')); -%==================================================================================% -% Uncomment the lines below to modify the formatting of problem numbers and points % -%==================================================================================% -%\pointpoints{pt.}{pts.} -%\makeatletter -%\qformat{{\bf Problem \thequestiontitle.} \dotfill \if@placepoints{\bf\footnotesize(\thepoints)}\fi} -%\makeatother - -EOT - -ENDDOCUMENT(); # This should be the last executable line in the problem. diff --git a/courses.dist/modelCourse/templates/ASimpleHardCopyHeaderFile.pg b/courses.dist/modelCourse/templates/ASimpleHardCopyHeaderFile.pg deleted file mode 100644 index cb478028ca..0000000000 --- a/courses.dist/modelCourse/templates/ASimpleHardCopyHeaderFile.pg +++ /dev/null @@ -1,68 +0,0 @@ -# ASimpleHardCopyHeaderFile.pg -# This file can be used as a simple Hard Copy Header file which is processed by LaTeX. -# Do not use it as a Screen Header file which is processed by html - - -DOCUMENT(); - -loadMacros( -"PG.pl", -"PGbasicmacros.pl", - -); - -#################################################### -# This section is for adding text to be displayed before the set of problems -#################################################### - -BEGIN_TEXT -$BEGIN_ONE_COLUMN - -% Use this space to add header text to pdf hardcopies - -$END_ONE_COLUMN -END_TEXT - -#################################################### -# This section configures the headers and footers according -# to the documentation for the LaTeX exam class -#################################################### - -BEGIN_TEXT -% match current hardcopy format -\pagestyle{headandfoot} -\firstpageheader{ - {\large \bf $studentName} \\ -% Uncomment the line below if this course has sections. -% {\large \bf Section: \{protect_underbar($sectionName)\}} \\ - {\large \bf Assignment \{protect_underbar($setNumber)\} due $formattedDueDate} -}{}{ - {\large \bf \{protect_underbar($courseName)\} \\ {} } -} -\ifdefined\nocolumns\firstpageheadrule\fi -\runningheader{}{}{} -\firstpagefooter{}{\thepage}{} -\runningfooter{}{\thepage}{} - -END_TEXT - -#################################################### -# The final section must be processed separately because of its use of the @-symbol -#################################################### - -TEXT(MODES(TeX => EV3P({processVariables => 0}, <<'EOT'), HTML => '')); -%==================================================================================% -% Uncomment the lines below to modify the formatting of problem numbers and points % -%==================================================================================% -%\pointpoints{pt.}{pts.} -%\makeatletter -%\qformat{{\bf Problem \thequestiontitle.} \dotfill \if@placepoints{\bf\footnotesize(\thepoints)}\fi} -%\makeatother - -EOT - -ENDDOCUMENT(); - - - - diff --git a/courses.dist/modelCourse/templates/ASimpleScreenHeaderFile.pg b/courses.dist/modelCourse/templates/ASimpleScreenHeaderFile.pg deleted file mode 100644 index 8e8178f4d1..0000000000 --- a/courses.dist/modelCourse/templates/ASimpleScreenHeaderFile.pg +++ /dev/null @@ -1,27 +0,0 @@ -##ASimpleScreenHeaderFile.pg - -DOCUMENT(); - -loadMacros( -"PG.pl", -"PGbasicmacros.pl", - -); - -BEGIN_TEXT -$BBOLD WeBWorK Assignment \{ protect_underbar($setNumber) \} closes : $formattedDueDate. $EBOLD -$PAR -Here's the list of -\{ htmlLink(qq!http://webwork.maa.org/wiki/Available_Functions!,"functions and symbols") \} - that WeBWorK understands. -END_TEXT - - -# Uncomment and edit the lines below if this course has a web page. Note that this is comment in Perl mode. -#BEGIN_TEXT -#$PAR -#See the course web page for information \{ htmlLink(qq!http://yoururl/yourcourse!,"your course name") \} -#END_TEXT - -ENDDOCUMENT(); - diff --git a/courses.dist/modelCourse/templates/defaultSetHeader.pg b/courses.dist/modelCourse/templates/defaultSetHeader.pg new file mode 100644 index 0000000000..bef3d9f7cb --- /dev/null +++ b/courses.dist/modelCourse/templates/defaultSetHeader.pg @@ -0,0 +1,78 @@ +# defaultSetHeader.pg +# This header file can be used for both the screen and hardcopy output + +DOCUMENT(); + +loadMacros( + "PGstandard.pl", + "PGML.pl", + "PGcourse.pl", +); + +# Content to print only in LaTeX PDF hardcopy output +# Use PGML markup + +$TeX = <<'TEX'; +This PDF is available for convenience. Assignments must be submitted +within *WeBWorK* for credit. +TEX + +# Content to print only in HTML output +# Use PGML markup + +$HTML = <<"HTML"; +This assignment will close on *$formattedDueDate*. +HTML + +# The first line of PGML below prints the items from above. +# Other content will appear in all output forms. + +BEGIN_PGML +[@ MODES(TeX => $TeX, HTML => $HTML) @]** + +[$setDescription] +[% You can replace this comment with information that + would appear in both screen and hardcopy set headers. %] +END_PGML + +# The hardcopy theme defines headers and footers. If you would like to customize +# those without changing the theme, they can be overrided here by following the +# documentation for the LaTeX exam class. However the footer on the last page +# displays a copyright claim that cannot be overridden here. +# http://mirrors.ctan.org/macros/latex/contrib/exam/examdoc.pdf +# Note the following is tex code, not PGML markup +# Available environment macros are: +# \webworkFirstName, \webworkLastName, \webworkUserId, \webworkStudentId, \webworkEmailAddress, +# \webworkOpenDate, \webworkReducedScoringDate, \webworkDueDate, \webworkAnswerDate, +# \webworkSetId, \webworkPrettySetId, \webworkDescription, +# \webworkCourseName, \webworkCourseTitle, \webworkCourseURL +# \webworkSection, \webworkRecitation, + +#TEXT(MODES(TeX => EV3(<<'EOT'),HTML=>"")); +# +#\pagestyle{headandfoot} +#\firstpageheader% +#{{\large\bfseries Assignment \href{\webworkCourseURL/\webworkSetId}{\webworkPrettySetId{}}\\}\ifx\webworkReducedScoringDate\empty\else{full credit by \webworkReducedScoringDate, }\fi closes \webworkDueDate\\\href{\webworkCourseURL}{\scshape\webworkCourseTitle}}% +#{}% +#{{\large\bfseries\webworkFirstName{} \webworkLastName{} (\webworkUserId)\\}% +#\ifx\webworkSection\empty{\ \\}\else{Section: \webworkSection\\}\fi% +#\ifx\webworkRecitation\empty{\ }\else{Recitation: \webworkRecitation}\fi% +#}% +#\runningheader{}{}{} +#\footer{}{}{Page \thepage} +# +#EOT + +# The following must be processed separately because of its use of the @-symbol +# Uncomment the lines below to modify the formatting of problem numbers and points + +#TEXT(MODES(TeX => EV3P({processVariables => 0}, <<'EOT'), HTML => '')); +# +#%\pointpoints{pt.}{pts.} +#%\makeatletter +#%\qformat{{\bf Problem \thequestiontitle.} \dotfill \if@placepoints{\bf\footnotesize(\thepoints)}\fi} +#%\makeatother +# +#EOT + +ENDDOCUMENT(); diff --git a/doc/devel/headers-footers b/doc/devel/headers-footers deleted file mode 100644 index 8cea32c548..0000000000 --- a/doc/devel/headers-footers +++ /dev/null @@ -1,32 +0,0 @@ -OLD VARIABLE OLD FILE NEW FILE USE - -$SET_HEADER paperSetHeader.pg paperSetHeader.pg hardcopy generation (see below) -$PROB_HEADER screenSetHeader.pg screenSetHeader.pg displayed on ProblemSet page, instructions for problem set -$TEX_PROB_FOOTER texProbFooter.tex screenProblemPostamble.tex -$TEX_PROB_PREAMBLE texProbPreamble.tex screenProblemPreamble.tex -$TEX_SET_FOOTER texSetFooter.tex paperSetPostamble.tex hardcopy generation (see below) -$TEX_SET_PREAMBLE texSetPreamble.tex paperSetPreamble.tex hardcopy generation (see below) - - - $set->set_header is paperSetHeader -$set->problem_header is screenSetHeader - ---> THIS SHOULD BE CHANGED! - - --------------------------------------------------------------------------------- - - -Hardcopy Snippets - - TeX(hardcopyPreamble) - PG(hardcopySetHeader) - PG(problem) - TeX(hardcopyProblemDivider) unless last problem - PG(hardcopySetFooter) - TeX(hardcopySetDivider) unless last set - TeX(hardcopyPostamble) - - -Interactive Snippets - - PG(screenSetHeader) diff --git a/lib/WeBWorK/ContentGenerator/Hardcopy.pm b/lib/WeBWorK/ContentGenerator/Hardcopy.pm index d49e339397..8420584fdc 100644 --- a/lib/WeBWorK/ContentGenerator/Hardcopy.pm +++ b/lib/WeBWorK/ContentGenerator/Hardcopy.pm @@ -30,7 +30,7 @@ use Archive::Zip qw(:ERROR_CODES); use WeBWorK::DB::Utils qw/user2global/; use WeBWorK::PG; -use WeBWorK::Utils qw/readFile decodeAnswers jitar_id_to_seq is_restricted after x format_set_name_display/; +use WeBWorK::Utils qw/readFile decodeAnswers jitar_id_to_seq is_restricted after x/; use WeBWorK::Utils::Rendering qw(renderPG); use PGrandom; @@ -656,7 +656,7 @@ sub generate_hardcopy_tex ($c, $temp_dir_path, $final_file_basename) { # Copy the common tex files into the bundle directory my $ce = $c->ce; - for (qw{packages.tex CAPA.tex PGML.tex}) { + for (qw{packages.tex CAPA.tex PGML.tex headandfoot.tex copyright.tex webwork_logo.png}) { my $cp_cmd = "2>&1 $ce->{externalPrograms}{cp} " . shell_quote("$ce->{webworkDirs}{texinputs_common}/$_", $bundle_path); my $cp_out = readpipe $cp_cmd; @@ -813,13 +813,17 @@ async sub write_multiuser_tex ($c, $FH, $userIDsRef, $setIDsRef) { # get snippets my $theme = $c->param('hardcopy_theme') // $ce->{hardcopyTheme}; - my $themeDir = $ce->{webworkDirs}->{conf} . '/snippets/hardcopyThemes/' . $theme; - my $preamble = $ce->{webworkFiles}->{hardcopySnippets}->{preamble} // "$themeDir/hardcopyPreamble.tex"; - my $postamble = $ce->{webworkFiles}->{hardcopySnippets}->{postamble} // "$themeDir/hardcopyPostamble.tex"; - my $divider = $ce->{webworkFiles}->{hardcopySnippets}->{userDivider} // "$themeDir/hardcopyUserDivider.tex"; + my $themeDir = $ce->{webworkDirs}{conf} . '/snippets/hardcopyThemes/' . $theme; + my $preamble = $ce->{webworkFiles}{hardcopySnippets}{preamble} // "$themeDir/hardcopyPreamble.tex"; + my $postamble = $ce->{webworkFiles}{hardcopySnippets}{postamble} // "$themeDir/hardcopyPostamble.tex"; + my $divider = $ce->{webworkFiles}{hardcopySnippets}{userDivider} // "$themeDir/hardcopyUserDivider.tex"; # write preamble $c->write_tex_file($FH, $preamble); + print $FH '\\def\\webworkCourseName{' . handle_underbar($ce->{courseName}) . "}\n"; + print $FH '\\def\\webworkCourseTitle{' . handle_underbar($c->db->getSettingValue('courseTitle')) . "}\n"; + print $FH '\\def\\webworkCourseURL{' + . handle_underbar($ce->{server_root_url} . $ce->{webwork_url} . '/' . $ce->{courseName}) . "}\n"; # write section for each user while (defined(my $userID = shift @userIDs)) { @@ -924,14 +928,13 @@ async sub write_set_tex ($c, $FH, $TargetUser, $setID) { # get snippets my $theme = $c->param('hardcopy_theme') // $ce->{hardcopyTheme}; - my $themeDir = $ce->{webworkDirs}->{conf} . '/snippets/hardcopyThemes/' . $theme; + my $themeDir = $ce->{webworkDirs}{conf} . '/snippets/hardcopyThemes/' . $theme; my $header = - $MergedSet->hardcopy_header - ? $MergedSet->hardcopy_header - : $ce->{webworkFiles}->{hardcopySnippets}->{setHeader}; - if ($header eq 'defaultHeader') { $header = $ce->{webworkFiles}->{hardcopySnippets}->{setHeader}; } - my $footer = $ce->{webworkFiles}->{hardcopySnippets}->{setFooter} // "$themeDir/hardcopySetFooter.pg"; - my $divider = $ce->{webworkFiles}->{hardcopySnippets}->{problemDivider} // "$themeDir/hardcopyProblemDivider.tex"; + $MergedSet->hardcopy_header ? $MergedSet->hardcopy_header : $ce->{webworkFiles}{hardcopySnippets}{setHeader}; + if ($header eq 'defaultHeader') { $header = $ce->{webworkFiles}{hardcopySnippets}{setHeader}; } + my $texheader = $ce->{webworkFiles}{hardcopySnippets}{setTexHeader} // "$themeDir/hardcopySetHeader.tex"; + my $footer = $ce->{webworkFiles}{hardcopySnippets}{setFooter} // "$themeDir/hardcopySetFooter.tex"; + my $divider = $ce->{webworkFiles}{hardcopySnippets}{problemDivider} // "$themeDir/hardcopyProblemDivider.tex"; # get list of problem IDs my @problemIDs = map { $_->[2] } @@ -957,9 +960,29 @@ async sub write_set_tex ($c, $FH, $TargetUser, $setID) { @problemIDs = @newOrder; } + # write environment variables as LaTeX macros + for (qw(user_id student_id first_name last_name email_address section recitation)) { + print $FH '\\def\\webwork' . underscore_to_camel($_) . '{' . handle_underbar($TargetUser->{$_}) . "}\n"; + } + for (qw(set_id description)) { + print $FH '\\def\\webwork' . underscore_to_camel($_) . '{' . handle_underbar($MergedSet->{$_}) . "}\n"; + } + print $FH '\\def\\webworkPrettySetId{' . handle_underbar($MergedSet->{set_id}, 1) . "}\n"; + for (qw(open_date reduced_scoring_date due_date answer_date)) { + if (!ref($MergedSet->{$_}) && $MergedSet->{$_} =~ /^\d{10}$/) { + print $FH '\\def\\webwork' + . underscore_to_camel($_) . '{' + . WeBWorK::Utils::formatDateTime($MergedSet->{$_}, $ce->{siteDefaults}{timezone}) . "}\n"; + } else { + print $FH '\\def\\webwork' . underscore_to_camel($_) . "{}\n"; + } + } + # write set header await $c->write_problem_tex($FH, $TargetUser, $MergedSet, 0, $header); # 0 => pg file specified directly + $c->write_tex_file($FH, $texheader); + print $FH "\\medskip\\hrule\\nobreak\\smallskip\n\\begin{questions}\n"; # write each problem @@ -976,11 +999,29 @@ async sub write_set_tex ($c, $FH, $TargetUser, $setID) { print $FH "\\end{questions}\n"; # write footer - await $c->write_problem_tex($FH, $TargetUser, $MergedSet, 0, $footer); # 0 => pg file specified directly + $c->write_tex_file($FH, $footer); return; } +sub underscore_to_camel { + my $key = shift; + $key = ucfirst($key); + $key =~ s/_(\w)/uc($1)/ge; + return $key; +} + +sub handle_underbar { + my $string = shift; + my $make_space = shift // 0; + if ($make_space) { + $string =~ s/_/~/g; + } else { + $string =~ s/_/\\_/g; + } + return $string; +} + async sub write_problem_tex ($c, $FH, $TargetUser, $MergedSet, $problemID = 0, $pgFile = undef) { my $ce = $c->ce; my $db = $c->db; diff --git a/lib/WeBWorK/Utils/Rendering.pm b/lib/WeBWorK/Utils/Rendering.pm index 0271995d9d..f4255bc561 100644 --- a/lib/WeBWorK/Utils/Rendering.pm +++ b/lib/WeBWorK/Utils/Rendering.pm @@ -133,6 +133,7 @@ sub constructPGOptions ($ce, $user, $set, $problem, $psvn, $formFields, $transla $options{sectionNumber} = $options{sectionName}; $options{recitationName} = $user->recitation; $options{recitationNumber} = $options{recitationName}; + $options{setDescription} = $set->description; $options{setNumber} = $set->set_id; $options{studentLogin} = $user->user_id; $options{studentName} = $user->first_name . ' ' . $user->last_name; From ba61cf561abcefc77d024a45a6cc033d70a330cf Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Sun, 18 Jun 2023 16:03:09 -0700 Subject: [PATCH 006/549] wrap hyphenated keys in quotes --- conf/defaults.config | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/defaults.config b/conf/defaults.config index d184ac6bac..957946c275 100644 --- a/conf/defaults.config +++ b/conf/defaults.config @@ -146,10 +146,10 @@ $institutionName = 'MAA (Mathematical Association of America)'; $hardcopyThemeNames = { oneColumn => 'One Column', twoColumn => 'Two Columns', - #XeLaTeX-oneColumn => 'English - one Column', - #XeLaTeX-twoColumn => 'English - two Columns', - #XeLaTeX-Hebrew-oneColumn => 'Hebrew/English - one Column', - #XeLaTeX-Hebrew-twoColumn => 'Hebrew/English - two Columns', + #'XeLaTeX-oneColumn' => 'English - one Column', + #'XeLaTeX-twoColumn' => 'English - two Columns', + #'XeLaTeX-Hebrew-oneColumn' => 'Hebrew/English - one Column', + #'XeLaTeX-Hebrew-twoColumn' => 'Hebrew/English - two Columns', }; # This is needed to enforce an order that the options are presented when making a hardcopy From 29e659690cef96ef4ffdf105d56748cf024360bb Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Thu, 15 Jun 2023 15:08:21 -0500 Subject: [PATCH 007/549] Fix the LTI config tab. The LTIConfigvalues.config inclusion is moved to to the end of defaults.config, instead of the end of authen_LTI.conf. This means that file is always included. However, the config variables it defines are only added to the `$ConfigValues` array if there are uncommented entries in the `@LTIConfigVariables` array that is still defined in authen_LTI.conf. So the behavior is the same as before. --- conf/authen_LTI.conf.dist | 2 -- conf/defaults.config | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/authen_LTI.conf.dist b/conf/authen_LTI.conf.dist index d31b9d9bb4..869553dbca 100644 --- a/conf/authen_LTI.conf.dist +++ b/conf/authen_LTI.conf.dist @@ -164,6 +164,4 @@ $LTIMassUpdateInterval = 86400; #in seconds #'debug_lti_parameters' ); -include('conf/LTIConfigValues.config'); - 1; # final line of the file to reassure perl that it was read properly. diff --git a/conf/defaults.config b/conf/defaults.config index 957946c275..80ae409239 100644 --- a/conf/defaults.config +++ b/conf/defaults.config @@ -2078,4 +2078,6 @@ $ConfigValues = [ ], ]; +include('conf/LTIConfigValues.config'); + 1; #final line of the file to reassure perl that it was read properly. From 0f7760469484133812a8481485b989fbcd7c990b Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Tue, 20 Jun 2023 17:49:01 -0500 Subject: [PATCH 008/549] Reset the user information form fields after adding a user. Currently when you add a user these form fields are automatically filled in when the page reloads after you click "Add Students". This clears out those fields to avoid confusion. --- templates/ContentGenerator/Instructor/AddUsers.html.ep | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/templates/ContentGenerator/Instructor/AddUsers.html.ep b/templates/ContentGenerator/Instructor/AddUsers.html.ep index d613e94b9d..f0206a7098 100644 --- a/templates/ContentGenerator/Instructor/AddUsers.html.ep +++ b/templates/ContentGenerator/Instructor/AddUsers.html.ep @@ -50,33 +50,41 @@ % for (1 .. $numberOfStudents) { + % param("last_name_$_", undef); <%= text_field "last_name_$_" => '', size => '10', class => 'form-control form-control-sm w-auto' =%> + % param("first_name_$_", undef); <%= text_field "first_name_$_" => '', size => '10', class => 'form-control form-control-sm w-auto' =%> + % param("student_id_$_", undef); <%= text_field "student_id_$_" => '', size => '16', class => 'form-control form-control-sm w-auto' =%> + % param("new_user_id_$_", undef); <%= text_field "new_user_id_$_" => '', size => '10', class => 'form-control form-control-sm w-auto' =%> + % param("email_address_$_", undef); <%= text_field "email_address_$_" => '', class => 'form-control form-control-sm w-auto' =%> + % param("section_$_", undef); <%= text_field "section_$_" => '', size => '4', class => 'form-control form-control-sm w-auto' =%> + % param("recitation_$_", undef); <%= text_field "recitation_$_" => '', size => '4', class => 'form-control form-control-sm w-auto' =%> + % param("comment_$_", undef); <%= text_field "comment_$_" => '', class => 'form-control form-control-sm w-auto' =%> @@ -84,6 +92,7 @@

<%= maketext('Select sets below to assign them to the newly-created users.') %>

+ % param('assignSets', undef); <%= select_field assignSets => [ map { [ format_set_name_display($_) => $_ ] } $db->listGlobalSets ], size => 10, multiple => undef, class => 'form-select w-auto mb-2' =%>

<%= submit_button maketext('Add Students'), name => 'addStudents', class => 'btn btn-primary' =%>

From 069821e41d108272b27143286e7ee043edd9ab23 Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Wed, 21 Jun 2023 08:38:52 -0700 Subject: [PATCH 009/549] remove a tex comment when it has nothing to say --- lib/WeBWorK/ContentGenerator/Hardcopy.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/WeBWorK/ContentGenerator/Hardcopy.pm b/lib/WeBWorK/ContentGenerator/Hardcopy.pm index 8420584fdc..c30310cd81 100644 --- a/lib/WeBWorK/ContentGenerator/Hardcopy.pm +++ b/lib/WeBWorK/ContentGenerator/Hardcopy.pm @@ -1111,7 +1111,7 @@ async sub write_problem_tex ($c, $FH, $TargetUser, $MergedSet, $problemID = 0, $ if ($showCorrectAnswers || $printStudentAnswers) { my %oldAnswers = decodeAnswers($MergedProblem->last_answer); $formFields->{$_} = $oldAnswers{$_} foreach (keys %oldAnswers); - print $FH "%% decoded old answers, saved. (keys = " . join(',', keys(%oldAnswers)) . "\n"; + print $FH "%% decoded old answers, saved. (keys = " . join(',', keys(%oldAnswers)) . ")\n" if %oldAnswers; } my $pg = await renderPG( From 8cf9a58eaeb2b791934dec9def346e4b001759f0 Mon Sep 17 00:00:00 2001 From: Peter Staab Date: Thu, 15 Jun 2023 09:56:07 -0400 Subject: [PATCH 010/549] add css to pod To improve the looks of the POD, a css file has been added. --- bin/dev_scripts/PODtoHTML.pm | 10 +++++----- bin/dev_scripts/generate-ww-pg-pod.pl | 12 +++++++++--- bin/dev_scripts/pod.css | 5 +++++ 3 files changed, 19 insertions(+), 8 deletions(-) create mode 100644 bin/dev_scripts/pod.css diff --git a/bin/dev_scripts/PODtoHTML.pm b/bin/dev_scripts/PODtoHTML.pm index cf34ec50e4..c18e128c7c 100644 --- a/bin/dev_scripts/PODtoHTML.pm +++ b/bin/dev_scripts/PODtoHTML.pm @@ -182,25 +182,25 @@ sub write_index { my $date = strftime "%a %b %e %H:%M:%S %Z %Y", localtime; my $fh = new IO::File($out_path, '>') or die "Failed to open index '$out_path' for writing: $!\n"; - print $fh (get_header($title), $content_start, $content, "

Generated $date

", get_footer()); + print $fh (get_header($title, $self->{dest_url}), $content_start, $content, "

Generated $date

", get_footer()); } sub do_pod2html { my $self = shift; my %o = @_; - my $psx = new PODParser; + my $psx = PODParser->new; $psx->{source_root} = $self->{source_root}; $psx->{verbose} = $self->{verbose}; $psx->{base_url} = ($self->{dest_url} // "") . "/" . (($self->{source_root} // "") =~ s|^.*/||r); $psx->output_string(\my $html); - $psx->html_header(get_header($o{pod_name})); + $psx->html_header(get_header($o{pod_name}, $psx->{base_url})); $psx->html_footer(get_footer()); $psx->parse_file($o{pod_path}); return $html; } sub get_header { - my $title = shift; + my ($title, $base_url) = @_; return < @@ -208,6 +208,7 @@ sub get_header { $title +

$title

@@ -236,4 +237,3 @@ EOF } 1; - diff --git a/bin/dev_scripts/generate-ww-pg-pod.pl b/bin/dev_scripts/generate-ww-pg-pod.pl index a13d36555a..da236a417b 100755 --- a/bin/dev_scripts/generate-ww-pg-pod.pl +++ b/bin/dev_scripts/generate-ww-pg-pod.pl @@ -62,6 +62,7 @@ =head1 DESCRIPTION $base_url = "/" if !$base_url; use IO::File; +use File::Copy; use File::Path qw(make_path remove_tree); use File::Basename qw(dirname); use Cwd qw(abs_path); @@ -77,9 +78,13 @@ =head1 DESCRIPTION process_dir($dir); } +make_path("$output_dir/css"); +copy("$webwork_root/bin/dev_scripts/pod.css", "$output_dir/css/pod.css"); +print "copying $webwork_root/bin/dev_scripts/pod.css to $output_dir/css/pod.css\n" if $verbose; + my $index_fh = new IO::File("$output_dir/index.html", '>') or die "failed to open '$output_dir/index.html' for writing: $!\n"; -write_index($index_fh); +write_index($index_fh, $base_url); sub process_dir { my $source_dir = shift; @@ -92,7 +97,7 @@ sub process_dir { remove_tree($dest_dir); make_path($dest_dir); - my $htmldocs = new PODtoHTML( + my $htmldocs = PODtoHTML->new( source_root => $source_dir, dest_root => $dest_dir, dest_url => $base_url, @@ -102,13 +107,14 @@ sub process_dir { } sub write_index { - my $fh = shift; + my ($fh, $base_url) = @_; print $fh < + WeBWorK/PG POD diff --git a/bin/dev_scripts/pod.css b/bin/dev_scripts/pod.css new file mode 100644 index 0000000000..6f83fec15a --- /dev/null +++ b/bin/dev_scripts/pod.css @@ -0,0 +1,5 @@ +body { + font-family: Arial, Helvetica, sans-serif; + padding-left: 10%; + padding-right: 10%; +} \ No newline at end of file From bcacfff3da468f403dcbe0da83f2fe0a0b97876d Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Fri, 16 Jun 2023 07:36:23 -0400 Subject: [PATCH 011/549] Update the POD generation scripts and add POD routes. Add bootstrap and the pod css to the pages generated by the generate-ww-pg-pod.pl script. Remove POD::Find usage and use POD::Simple::Search instead. POD::Find is deprecated, and recommends using POD::Simple::Search instead. --- bin/check_modules.pl | 2 + bin/dev_scripts/PODtoHTML.pm | 135 ++++++++---------- bin/dev_scripts/generate-ww-pg-pod.pl | 23 ++- bin/dev_scripts/pod.css | 5 - htdocs/js/PODViewer/podviewer.css | 6 + lib/WeBWorK/ContentGenerator/PODViewer.pm | 66 +++++++++ .../WeBWorK/Utils}/PODParser.pm | 42 +++--- lib/WeBWorK/Utils/Routes.pm | 30 +++- .../Instructor/PGProblemEditor.html.ep | 8 +- templates/ContentGenerator/PODViewer.html.ep | 47 ++++++ .../ContentGenerator/PODViewer/POD.html.ep | 35 +++++ 11 files changed, 286 insertions(+), 113 deletions(-) delete mode 100644 bin/dev_scripts/pod.css create mode 100644 htdocs/js/PODViewer/podviewer.css create mode 100644 lib/WeBWorK/ContentGenerator/PODViewer.pm rename {bin/dev_scripts => lib/WeBWorK/Utils}/PODParser.pm (71%) create mode 100644 templates/ContentGenerator/PODViewer.html.ep create mode 100644 templates/ContentGenerator/PODViewer/POD.html.ep diff --git a/bin/check_modules.pl b/bin/check_modules.pl index 125481dc5c..41e07e0f63 100755 --- a/bin/check_modules.pl +++ b/bin/check_modules.pl @@ -128,6 +128,8 @@ =head1 DESCRIPTION PadWalker Path::Class PHP::Serialization + Pod::Simple::Search + Pod::Simple::XHTML Pod::Usage Pod::WSDL Safe diff --git a/bin/dev_scripts/PODtoHTML.pm b/bin/dev_scripts/PODtoHTML.pm index c18e128c7c..073832f2f7 100644 --- a/bin/dev_scripts/PODtoHTML.pm +++ b/bin/dev_scripts/PODtoHTML.pm @@ -13,26 +13,24 @@ # Artistic License for more details. ################################################################################ +package PODtoHTML; + use strict; use warnings; -package PODtoHTML; - -use File::Find qw(find); +use Pod::Simple::Search; use File::Path qw(make_path); use IO::File; -use Pod::Find qw(contains_pod); use POSIX qw(strftime); -use PODParser; + +use WeBWorK::Utils::PODParser; our @sections = ( - '/' => "(root)", - bin => "Scripts", - conf => "Config Files", - doc => "Documentation", - lib => "Libraries", - macros => "Macros", - clients => "Clients" + bin => "Scripts", + conf => "Config Files", + doc => "Documentation", + lib => "Libraries", + macros => "Macros" ); sub new { @@ -58,38 +56,17 @@ sub convert_pods { my $source_root = $self->{source_root}; my $dest_root = $self->{dest_root}; - find({ wanted => $self->gen_pod_wanted, no_chdir => 1 }, $source_root); - $self->write_index("$dest_root/index.html"); -} - -sub gen_pod_wanted { - my $self = shift; - return sub { - my $path = $File::Find::name; - my $dir = $File::Find::dir; - my ($name) = $path =~ m|^$dir(?:/(.*))?$|; - $name = '' unless defined $name; - - if ($name =~ /^\./) { - $File::Find::prune = 1; - return; - } - unless (-f $path or -d $path) { - $File::Find::prune = 1; - return; - } - if (-d _ and $name =~ /^(\.git|\.github|t|htdocs)$/) { - $File::Find::prune = 1; - return; - } + my $regex = join('|', map {"^$_"} @{ $self->{section_order} }); - return if -d _; - return unless contains_pod($path); + (undef, my $podFiles) = Pod::Simple::Search->new->inc(0)->limit_re(qr!$regex!)->survey($self->{source_root}); + for (keys %$podFiles) { + print "Processing file: $_\n" if $self->{verbose} > 1; + $self->process_pod($_); + } - print "Processing file: $path\n" if $self->{verbose} > 1; + $self->write_index("$dest_root/index.html"); - $self->process_pod($path); - }; + return; } sub process_pod { @@ -135,13 +112,16 @@ sub process_pod { pod_path => $pod_path, pod_name => $pod_name ); - my $fh = new IO::File($html_path, '>') + my $fh = IO::File->new($html_path, '>') or die "Failed to open file '$html_path' for writing: $!\n"; print $fh $html; + + return; } sub update_index { my ($self, $subdir, $html_rel_path, $pod_name) = @_; + $subdir =~ s|/.*$||; my $idx = $self->{idx}; my $sections = $self->{section_hash}; @@ -150,50 +130,47 @@ sub update_index { } else { warn "no section for subdir '$subdir'\n"; } + + return; } sub write_index { my ($self, $out_path) = @_; - my $idx = $self->{idx}; - my $sections = $self->{section_hash}; - my $section_order = $self->{section_order}; - my $source_root = $self->{source_root}; - $source_root =~ s|^.*/||; - - my $title = "Index for $source_root"; - my $content_start = "
    "; - my $content = ""; - - for my $section (@$section_order) { - next unless defined $idx->{$section}; - my $section_name = $sections->{$section}; - $content_start .= qq{
  • $section_name
  • }; - my @files = sort @{ $idx->{$section} }; - $content .= qq{}; - $content .= qq{

    $section_name

      }; - for my $file (sort { $a->[1] cmp $b->[1] } @files) { - my ($path, $name) = @$file; - $content .= qq{
    • $name
    • }; + + my $source_root = $self->{source_root} =~ s|^.*/||r; + my $title = "Index for $source_root"; + + my $content_start = '
        '; + my $content = ''; + + for my $section (@{ $self->{section_order} }) { + next unless defined $self->{idx}{$section}; + $content_start .= qq{
      • $self->{section_hash}{$section}
      • }; + $content .= qq{

        $self->{section_hash}{$section}

          }; + for my $file (sort { $a->[1] cmp $b->[1] } @{ $self->{idx}{$section} }) { + $content .= qq{
        • $file->[1]
        • }; } - $content .= "
        "; + $content .= '
      '; } - $content_start .= "
    "; - my $date = strftime "%a %b %e %H:%M:%S %Z %Y", localtime; + $content_start .= '
'; + my $date = strftime '%a %b %e %H:%M:%S %Z %Y', localtime; - my $fh = new IO::File($out_path, '>') or die "Failed to open index '$out_path' for writing: $!\n"; + my $fh = IO::File->new($out_path, '>') or die "Failed to open index '$out_path' for writing: $!\n"; print $fh (get_header($title, $self->{dest_url}), $content_start, $content, "

Generated $date

", get_footer()); + + return; } sub do_pod2html { - my $self = shift; - my %o = @_; - my $psx = PODParser->new; - $psx->{source_root} = $self->{source_root}; - $psx->{verbose} = $self->{verbose}; - $psx->{base_url} = ($self->{dest_url} // "") . "/" . (($self->{source_root} // "") =~ s|^.*/||r); + my ($self, %o) = @_; + my $psx = WeBWorK::Utils::PODParser->new; + $psx->{source_root} = $self->{source_root}; + $psx->{verbose} = $self->{verbose}; + $psx->{assert_html_ext} = 1; + $psx->{base_url} = ($self->{dest_url} // "") . "/" . (($self->{source_root} // "") =~ s|^.*/||r); $psx->output_string(\my $html); - $psx->html_header(get_header($o{pod_name}, $psx->{base_url})); + $psx->html_header(get_header($o{pod_name}, "$psx->{base_url}/..")); $psx->html_footer(get_footer()); $psx->parse_file($o{pod_path}); return $html; @@ -201,25 +178,28 @@ sub do_pod2html { sub get_header { my ($title, $base_url) = @_; - return < $title - + + +

$title

- +
+
EOF } sub get_footer { - return <<'EOF'; + return << 'EOF';

@@ -231,6 +211,7 @@ sub get_footer {
+
EOF diff --git a/bin/dev_scripts/generate-ww-pg-pod.pl b/bin/dev_scripts/generate-ww-pg-pod.pl index da236a417b..54961b7b90 100755 --- a/bin/dev_scripts/generate-ww-pg-pod.pl +++ b/bin/dev_scripts/generate-ww-pg-pod.pl @@ -43,6 +43,7 @@ =head1 DESCRIPTION use strict; use warnings; + use Getopt::Long qw(:config bundling); use Pod::Usage; @@ -67,7 +68,9 @@ =head1 DESCRIPTION use File::Basename qw(dirname); use Cwd qw(abs_path); +use lib dirname(dirname(dirname(__FILE__))) . '/lib'; use lib dirname(__FILE__); + use PODtoHTML; my $webwork_root = abs_path(dirname(dirname(dirname(__FILE__)))); @@ -78,14 +81,14 @@ =head1 DESCRIPTION process_dir($dir); } -make_path("$output_dir/css"); -copy("$webwork_root/bin/dev_scripts/pod.css", "$output_dir/css/pod.css"); -print "copying $webwork_root/bin/dev_scripts/pod.css to $output_dir/css/pod.css\n" if $verbose; - -my $index_fh = new IO::File("$output_dir/index.html", '>') +my $index_fh = IO::File->new("$output_dir/index.html", '>') or die "failed to open '$output_dir/index.html' for writing: $!\n"; write_index($index_fh, $base_url); +make_path("$output_dir/css"); +copy("$webwork_root/htdocs/js/PODViewer/podviewer.css", "$output_dir/css/pod.css"); +print "copying $webwork_root/htdocs/js/PODViewer/podviewer.css to $output_dir/css/pod.css\n" if $verbose; + sub process_dir { my $source_dir = shift; return unless $source_dir =~ /\/webwork2$/ || $source_dir =~ /\/pg$/; @@ -104,20 +107,24 @@ sub process_dir { verbose => $verbose ); $htmldocs->convert_pods; + + return; } sub write_index { my ($fh, $base_url) = @_; - print $fh < + WeBWorK/PG POD +

WeBWorK/PG POD

(Plain Old Documentation)

@@ -127,7 +134,9 @@ sub write_index { print $fh q{
  • PG
  • } if $pg_root; print $fh q{
  • WeBWorK
  • } if $webwork_root; - print $fh "
    "; + print $fh "
    "; + + return; } 1; diff --git a/bin/dev_scripts/pod.css b/bin/dev_scripts/pod.css deleted file mode 100644 index 6f83fec15a..0000000000 --- a/bin/dev_scripts/pod.css +++ /dev/null @@ -1,5 +0,0 @@ -body { - font-family: Arial, Helvetica, sans-serif; - padding-left: 10%; - padding-right: 10%; -} \ No newline at end of file diff --git a/htdocs/js/PODViewer/podviewer.css b/htdocs/js/PODViewer/podviewer.css new file mode 100644 index 0000000000..a920f383a8 --- /dev/null +++ b/htdocs/js/PODViewer/podviewer.css @@ -0,0 +1,6 @@ +#_podtop_ pre { + border: 1px solid #ccc; + border-radius: 5px; + background: #f6f6f6; + padding: 0.75rem; +} diff --git a/lib/WeBWorK/ContentGenerator/PODViewer.pm b/lib/WeBWorK/ContentGenerator/PODViewer.pm new file mode 100644 index 0000000000..1975a09137 --- /dev/null +++ b/lib/WeBWorK/ContentGenerator/PODViewer.pm @@ -0,0 +1,66 @@ +################################################################################ +# WeBWorK Online Homework Delivery System +# Copyright © 2000-2023 The WeBWorK Project, https://github.com/openwebwork +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of either: (a) the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version, or (b) the "Artistic License" which comes with this package. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the +# Artistic License for more details. +################################################################################ + +package WeBWorK::ContentGenerator::PODViewer; +use Mojo::Base 'WeBWorK::ContentGenerator', -signatures; + +=head1 NAME + +WeBWorK::ContentGenerator::PODViewer - display POD for PG macros. + +=cut + +use Pod::Simple::Search; + +use WeBWorK::Utils::PODParser; + +sub PODindex ($c) { + my $pgRoot = $c->ce->{pg_dir}; + + my $podFiles = Pod::Simple::Search->new->inc(0)->limit_re(qr/^doc|^lib|^macros/)->survey($pgRoot); + + my $sections = {}; + for (sort keys %$podFiles) { + my $section = $_ =~ s/::.*$//r; + push(@{ $sections->{$section} }, $podFiles->{$_} =~ s!^$pgRoot/$section/!!r); + } + + return $c->render('ContentGenerator/PODViewer', sections => $sections); +} + +sub renderPOD ($c) { + my $macroFile = $c->ce->{pg_dir} . '/' . $c->stash->{filePath}; + + if (-e $macroFile) { + my $parser = WeBWorK::Utils::PODParser->new; + $parser->{verbose} = 0; + $parser->{source_root} = $c->ce->{pg_dir}; + $parser->{base_url} = $c->url_for('pod_index')->to_string; + $parser->html_header(''); + $parser->html_footer(''); + $parser->output_string(\my $html); + + eval { $parser->parse_file($macroFile) }; + if ($@) { + $c->stash->{podError} = $@; + } else { + $c->stash->{podHTML} = $html; + } + } + + return $c->render('ContentGenerator/PODViewer/POD'); +} + +1; diff --git a/bin/dev_scripts/PODParser.pm b/lib/WeBWorK/Utils/PODParser.pm similarity index 71% rename from bin/dev_scripts/PODParser.pm rename to lib/WeBWorK/Utils/PODParser.pm index 350225861b..87e0963714 100644 --- a/bin/dev_scripts/PODParser.pm +++ b/lib/WeBWorK/Utils/PODParser.pm @@ -13,14 +13,13 @@ # Artistic License for more details. ################################################################################ +package WeBWorK::Utils::PODParser; +use parent qw(Pod::Simple::XHTML); + use strict; use warnings; use Pod::Simple::XHTML; - -package PODParser; -our @ISA = qw(Pod::Simple::XHTML); - use File::Find; sub new { @@ -35,18 +34,24 @@ sub new { # Attempt to resolve links to local files. If a local file is not found, then # let Pod::Simple::XHTML resolve to a cpan link. +# Really this is a workaround for invalid `L<...>` usage in the PG POD. sub resolve_pod_page_link { my ($self, $to, $section) = @_; + unless (defined $to) { + print "Using internal page link.\n" if $self->{verbose} > 2; + return $self->SUPER::resolve_pod_page_link($to, $section); + } + # This ignores $to if $section is set. It would probably be better # to check for "$to/$section" if both are set. $self->{pod_search} = $section // $to; find({ wanted => $self->pod_wanted }, $self->{source_root}); - undef $self->{pod_search}; + delete $self->{pod_search}; if ($self->{pod_found}) { my $pod_url = $self->{pod_found} =~ s/^$self->{source_root}/$self->{base_url}/r; - undef $self->{pod_found}; + delete $self->{pod_found}; print "Resolved local pod link $to" . ($section ? "/$section" : "") . " to $pod_url\n" if $self->{verbose} > 2; return $self->encode_entities($pod_url); } @@ -63,7 +68,10 @@ sub pod_wanted { my $path = $File::Find::name; my $dir = $File::Find::dir; - $File::Find::prune = 1, return if ($self->{pod_found}); + if ($self->{pod_found}) { + $File::Find::prune = 1; + return; + } if (-d $path && $filename =~ /^(\.git|\.github|t|htdocs)$/) { $File::Find::prune = 1; @@ -71,22 +79,22 @@ sub pod_wanted { } if ($filename eq $self->{pod_search}) { - $self->{pod_found} = $path =~ s/\.(pm|pl)$/.html/r; + $self->{pod_found} = $self->{assert_html_ext} ? ($path =~ s/\.(pm|pl)$/.html/r) : $path; $File::Find::prune = 1; return; } }; } -# Don't output anything for a malformed =head[1-4] with no header text. -# This is done in pg/lib/Matrix.pm, for example. -sub _end_head { - my $self = shift; - if ($self->{scratch}) { - return $self->SUPER::_end_head(@_); - } - delete $self->{in_head}; - return ""; +# Trim spaces from the beginning of each line in code blocks. This attempts to +# trim spaces from all lines in the code block in the same amount as there are +# spaces at the beginning of the first line. Note that Pod::Simple::XHTML has +# already converted tab characters into 8 spaces. +sub handle_code { + my ($self, $code) = @_; + my $start_spaces = length(($code =~ /^( *)/)[0]) || ''; + $self->SUPER::handle_code($code =~ s/^( {1,$start_spaces})//gmr); + return; } 1; diff --git a/lib/WeBWorK/Utils/Routes.pm b/lib/WeBWorK/Utils/Routes.pm index dc33326e02..a68689b24d 100644 --- a/lib/WeBWorK/Utils/Routes.pm +++ b/lib/WeBWorK/Utils/Routes.pm @@ -36,6 +36,9 @@ PLEASE FOR THE LOVE OF GOD UPDATE THIS IF YOU CHANGE THE ROUTES BELOW!!! ltiadvantage_launch /ltiadvantage/launch ltiadvantage_keys /ltiadvantage/keys + pod_index /pod + pod_viewer /pod/$filePath + set_list /$courseID logout /$courseID/logout @@ -133,8 +136,16 @@ my %routeParameters = ( root => { title => 'WeBWorK', # 'course_admin' is also a child of 'root' but that is a special case that is setup separately. - children => - [qw(render_rpc html2xml instructor_rpc ltiadvantage_login ltiadvantage_launch ltiadvantage_keys set_list)], + children => [ qw( + render_rpc + html2xml + instructor_rpc + ltiadvantage_login + ltiadvantage_launch + ltiadvantage_keys + pod_index + set_list + ) ], module => 'Home', path => '/' }, @@ -185,6 +196,21 @@ my %routeParameters = ( action => 'keys' }, + pod_index => { + title => x('POD Index'), + children => [qw(pod_viewer)], + module => 'PODViewer', + path => '/pod', + action => 'PODindex' + }, + + pod_viewer => { + title => x('POD Viewer'), + module => 'PODViewer', + path => '/*filePath', + action => 'renderPOD' + }, + set_list => { title => '[_4]', children => [ diff --git a/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep b/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep index a3f2fdc019..4056d5cecb 100644 --- a/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep +++ b/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep @@ -87,12 +87,10 @@ title => maketext('Wiki summary page for MathObjects'), class => 'reference-link btn btn-sm btn-info', data => { bs_toggle => 'tooltip', bs_placement => 'top' } =%> - % # http://webwork.maa.org/pod/pg_TRUNK/ - <%= link_to maketext('POD') => $ce->{webworkURLs}{PODHelpURL}, + % # PG POD served locally + <%= link_to maketext('POD') => url_for('pod_index'), target => 'pod_docs', - title => maketext( - 'Documentation from source code for PG modules and macro files. Often the most up-to-date information.' - ), + title => maketext('Documentation from source code for PG modules and macro files.'), class => 'reference-link btn btn-sm btn-info', data => { bs_toggle => 'tooltip', bs_placement => 'top' } =%> % # PGML lab problem rendered as an unattached problem in a new window. diff --git a/templates/ContentGenerator/PODViewer.html.ep b/templates/ContentGenerator/PODViewer.html.ep new file mode 100644 index 0000000000..ea6a3c67cf --- /dev/null +++ b/templates/ContentGenerator/PODViewer.html.ep @@ -0,0 +1,47 @@ +% title maketext('PG POD'); +% + + +% + + + + <%= title %> + <%= stylesheet $c->url({ type => 'webwork', name => 'theme', file => 'bootstrap.css' }) =%> + + +% +% my %section_names = ( + % doc => 'Documentation', + % lib => 'Libraries', + % macros => 'Macros' +% ); +% + +
    +

    <%= title %>

    +
    + % for my $section (sort keys %$sections) { + % content_for toc => begin +
  • <%= $section_names{$section} %>
  • + % end + % content_for subjects => begin +

    <%= $section_names{$section} %>

    +
      + % for (@{ $sections->{$section} }) { +
    • + % my $link_name = $_; + % $link_name = $1 =~ s!/!::!gr if $link_name =~ m/^(.*)\.pm$/; + <%= link_to $link_name => url_for('pod_viewer', filePath => "$section/$_") =%> +
    • + % } +
    + % end + % } +
      <%= content 'toc' %>
    + <%= content 'subjects' =%> +
    + +% + diff --git a/templates/ContentGenerator/PODViewer/POD.html.ep b/templates/ContentGenerator/PODViewer/POD.html.ep new file mode 100644 index 0000000000..9060445835 --- /dev/null +++ b/templates/ContentGenerator/PODViewer/POD.html.ep @@ -0,0 +1,35 @@ +% my $title = $filePath =~ s!^[^/]*/!!r; +% $title = $1 =~ s!/!::!gr if $title =~ m/^(.*)\.pm$/; +% + + +% + + + + <%= $title %> + <%= stylesheet $c->url({ type => 'webwork', name => 'theme', file => 'bootstrap.css' }) =%> + <%= stylesheet $c->url({ type => 'webwork', name => 'htdocs', file => 'js/PODViewer/podviewer.css' }) =%> + + +% + +
    +

    <%= $title %>

    +
    +
    <%= link_to "PG POD Home" => 'pod_index' %>
    +
    +
    + % if (stash('podHTML')) { + <%== stash('podHTML') =%> + % } elsif (stash('podError')) { + <%= maketext('Error generating POD for file [_1]: [_2]', $filePath, stash('podError')) =%> + % } else { + <%= maketext('Macro file [_1] not found.', $filePath) =%> + % } +
    +
    + +% + From e783cfc3a2819ca18ce1a7a54c86193cb78d5df7 Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Wed, 21 Jun 2023 16:43:21 -0500 Subject: [PATCH 012/549] Fix the OverrideSiteURL in the code. Somehow, when I changed the variable in the config file, I didn't also change the variable in the code. --- lib/WeBWorK/Authen/LTIAdvanced.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/WeBWorK/Authen/LTIAdvanced.pm b/lib/WeBWorK/Authen/LTIAdvanced.pm index e64c111167..64ff141764 100644 --- a/lib/WeBWorK/Authen/LTIAdvanced.pm +++ b/lib/WeBWorK/Authen/LTIAdvanced.pm @@ -455,7 +455,7 @@ sub authenticate { # We need to provide the request URL when verifying the OAuth request. # We use the url request by default, but also allow it to be overriden - my $path = $ce->{LTI}{v1p1}{BasicToThisSiteURL} || ($c->url_for->to_abs =~ s|/?$|/|r); + my $path = $ce->{LTI}{v1p1}{OverrideSiteURL} || ($c->url_for->to_abs =~ s|/?$|/|r); if ($ce->{debug_lti_parameters}) { warn "The following path was reconstructed by WeBWorK. It should match the path in the LMS:\n"; From 6f149cc43454493779018f1ba887e127d3596d1d Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Tue, 20 Jun 2023 23:08:23 -0700 Subject: [PATCH 013/549] webwork.sty file for WeBWorK-specific LaTeX macros --- .../hardcopyPreamble.tex | 14 +++++- .../hardcopyPreamble.tex | 14 +++++- .../XeLaTeX-oneColumn/hardcopyPreamble.tex | 5 +- .../XeLaTeX-twoColumn/hardcopyPreamble.tex | 5 +- .../hardcopyThemes/common/headandfoot.tex | 11 ----- .../hardcopyThemes/common/packages.tex | 1 + .../hardcopyThemes/common/webwork.sty | 49 +++++++++++++++++++ .../oneColumn/hardcopyPreamble.tex | 5 +- .../twoColumn/hardcopyPreamble.tex | 5 +- lib/HardcopyRenderedProblem.pm | 2 +- lib/WeBWorK/ContentGenerator/Hardcopy.pm | 2 +- 11 files changed, 92 insertions(+), 21 deletions(-) delete mode 100644 conf/snippets/hardcopyThemes/common/headandfoot.tex create mode 100644 conf/snippets/hardcopyThemes/common/webwork.sty diff --git a/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-oneColumn/hardcopyPreamble.tex b/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-oneColumn/hardcopyPreamble.tex index 1783c79b2b..a6ee049787 100644 --- a/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-oneColumn/hardcopyPreamble.tex +++ b/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-oneColumn/hardcopyPreamble.tex @@ -41,7 +41,17 @@ \input{CAPA.tex} \input{PGML.tex} -% This needs a Hebrew specific replacement -\input{headandfoot.tex} +% This needs a Hebrew localizations for +\def\webworkLocalizeAssignment{Assignment} +\def\webworkLocalizeFullCreditBy{full credit by} +\def\webworkLocalizeCloses{closes} +\def\webworkLocalizeSection{Section} +\def\webworkLocalizeRecitation{Recitation} +\def\webworkLocalizePage{Page} + +\pagestyle{headandfoot} +\firstpageheader{\webworkAssignmentCourseInfo}{}{\webworkUserInfo} +\runningheader{}{}{} +\footer{}{}{\webworkPageNumber} \begin{document} diff --git a/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-twoColumn/hardcopyPreamble.tex b/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-twoColumn/hardcopyPreamble.tex index add6e818a2..648e0f0ee4 100644 --- a/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-twoColumn/hardcopyPreamble.tex +++ b/conf/snippets/hardcopyThemes/XeLaTeX-Hebrew-twoColumn/hardcopyPreamble.tex @@ -44,8 +44,18 @@ \input{CAPA.tex} \input{PGML.tex} -% This needs a Hebrew specific replacement -\input{headandfoot.tex} +% This needs a Hebrew localizations for +\def\webworkLocalizeAssignment{Assignment} +\def\webworkLocalizeFullCreditBy{full credit by} +\def\webworkLocalizeCloses{closes} +\def\webworkLocalizeSection{Section} +\def\webworkLocalizeRecitation{Recitation} +\def\webworkLocalizePage{Page} + +\pagestyle{headandfoot} +\firstpageheader{\webworkAssignmentCourseInfo}{}{\webworkUserInfo} +\runningheader{}{}{} +\footer{}{}{\webworkPageNumber} \begin{document} \voffset=-0.8in diff --git a/conf/snippets/hardcopyThemes/XeLaTeX-oneColumn/hardcopyPreamble.tex b/conf/snippets/hardcopyThemes/XeLaTeX-oneColumn/hardcopyPreamble.tex index 40aaa1cd02..e8ce0a4832 100644 --- a/conf/snippets/hardcopyThemes/XeLaTeX-oneColumn/hardcopyPreamble.tex +++ b/conf/snippets/hardcopyThemes/XeLaTeX-oneColumn/hardcopyPreamble.tex @@ -43,6 +43,9 @@ \input{CAPA.tex} \input{PGML.tex} -\input{headandfoot.tex} +\pagestyle{headandfoot} +\firstpageheader{\webworkAssignmentCourseInfo}{}{\webworkUserInfo} +\runningheader{}{}{} +\footer{}{}{\webworkPageNumber} \begin{document} diff --git a/conf/snippets/hardcopyThemes/XeLaTeX-twoColumn/hardcopyPreamble.tex b/conf/snippets/hardcopyThemes/XeLaTeX-twoColumn/hardcopyPreamble.tex index e4a2c0df0f..f8f2bc6b90 100644 --- a/conf/snippets/hardcopyThemes/XeLaTeX-twoColumn/hardcopyPreamble.tex +++ b/conf/snippets/hardcopyThemes/XeLaTeX-twoColumn/hardcopyPreamble.tex @@ -46,6 +46,9 @@ \input{CAPA.tex} \input{PGML.tex} -\input{headandfoot.tex} +\pagestyle{headandfoot} +\firstpageheader{\webworkAssignmentCourseInfo}{}{\webworkUserInfo} +\runningheader{}{}{} +\footer{}{}{\webworkPageNumber} \begin{document} diff --git a/conf/snippets/hardcopyThemes/common/headandfoot.tex b/conf/snippets/hardcopyThemes/common/headandfoot.tex deleted file mode 100644 index 4647ed0c20..0000000000 --- a/conf/snippets/hardcopyThemes/common/headandfoot.tex +++ /dev/null @@ -1,11 +0,0 @@ -\pagestyle{headandfoot} -\firstpageheader% -{{\large\bfseries Assignment \href{\webworkCourseURL/\webworkSetId}{\webworkPrettySetId{}}\\}\ifx\webworkReducedScoringDate\empty\else{full credit by \webworkReducedScoringDate, }\fi closes \webworkDueDate\\\href{\webworkCourseURL}{\scshape\webworkCourseTitle}}% -{}% -{{\large\bfseries\webworkFirstName{} \webworkLastName{} (\webworkUserId)\\}% -\ifx\webworkSection\empty{\ \\}\else{Section: \webworkSection\\}\fi% -\ifx\webworkRecitation\empty{\ }\else{Recitation: \webworkRecitation}\fi% -}% -\runningheader{}{}{} -\footer{}{}{Page \thepage} - diff --git a/conf/snippets/hardcopyThemes/common/packages.tex b/conf/snippets/hardcopyThemes/common/packages.tex index 3942af17cf..af21d6b1ca 100644 --- a/conf/snippets/hardcopyThemes/common/packages.tex +++ b/conf/snippets/hardcopyThemes/common/packages.tex @@ -20,6 +20,7 @@ \usepackage{listings} \lstset{basicstyle=\ttfamily,breaklines=true,aboveskip=0pt,belowskip=0pt} \usepackage{hyperref} +\usepackage{webwork} \pagestyle{plain} diff --git a/conf/snippets/hardcopyThemes/common/webwork.sty b/conf/snippets/hardcopyThemes/common/webwork.sty new file mode 100644 index 0000000000..00be2540b5 --- /dev/null +++ b/conf/snippets/hardcopyThemes/common/webwork.sty @@ -0,0 +1,49 @@ +\ProvidesFile{webwork} + +% These macros may be overrided with WeBWorK environment variables +\def\webworkCourseName{} +\def\webworkCourseTitle{} +\def\webworkCourseURL{} +\def\webworkUserId{} +\def\webworkStudentId{} +\def\webworkFirstName{} +\def\webworkLastName{} +\def\webworkEmailAddress{} +\def\webworkSection{} +\def\webworkRecitation{} +\def\webworkSetId{} +\def\webworkDescription{} +\def\webworkOpenDate{} +\def\webworkReducedScoringDate{} +\def\webworkDueDate{} +\def\webworkAnswerDate{} +\def\webworkPrettySetId{} + +% These words/phrases may be overrided for localization +% They are used in subsequent macros +\def\webworkLocalizeAssignment{Assignment} +\def\webworkLocalizeFullCreditBy{full credit by} +\def\webworkLocalizeCloses{closes} +\def\webworkLocalizeSection{Section} +\def\webworkLocalizeRecitation{Recitation} +\def\webworkLocalizePage{Page} + +% These would typically be used in a header or footer +\newcommand{\webworkAssignmentCourseInfo} +{% +\ifx\webworkSetId\empty\else{% +{\large\bfseries \webworkLocalizeAssignment~\href{\webworkCourseURL/\webworkSetId}{\webworkPrettySetId}\\}% +\ifx\webworkReducedScoringDate\empty\else{\webworkLocalizeFullCreditBy~\webworkReducedScoringDate, }\fi\webworkLocalizeCloses~\webworkDueDate\\}\fi% +\ifx\webworkCourseTitle\empty\else{\href{\webworkCourseURL}{\scshape\webworkCourseTitle}}\fi% +} + +\newcommand{\webworkUserInfo} +{% +\ifx\webworkUserId\empty\else{% +{\large\bfseries\webworkFirstName{} \webworkLastName{} (\webworkUserId)\\}}\fi% +\ifx\webworkSection\empty{\ \\}\else{\webworkLocalizeSection: \webworkSection\\}\fi% +\ifx\webworkRecitation\empty{\ }\else{\webworkLocalizeRecitation: \webworkRecitation}\fi% +} + +\newcommand{\webworkPageNumber}{\webworkLocalizePage~\thepage} + diff --git a/conf/snippets/hardcopyThemes/oneColumn/hardcopyPreamble.tex b/conf/snippets/hardcopyThemes/oneColumn/hardcopyPreamble.tex index 3e7838678a..fcf2ff0faf 100644 --- a/conf/snippets/hardcopyThemes/oneColumn/hardcopyPreamble.tex +++ b/conf/snippets/hardcopyThemes/oneColumn/hardcopyPreamble.tex @@ -15,6 +15,9 @@ \input{CAPA.tex} \input{PGML.tex} -\input{headandfoot.tex} +\pagestyle{headandfoot} +\firstpageheader{\webworkAssignmentCourseInfo}{}{\webworkUserInfo} +\runningheader{}{}{} +\footer{}{}{\webworkPageNumber} \begin{document} diff --git a/conf/snippets/hardcopyThemes/twoColumn/hardcopyPreamble.tex b/conf/snippets/hardcopyThemes/twoColumn/hardcopyPreamble.tex index 13bf99dbfd..d7d6f02fde 100644 --- a/conf/snippets/hardcopyThemes/twoColumn/hardcopyPreamble.tex +++ b/conf/snippets/hardcopyThemes/twoColumn/hardcopyPreamble.tex @@ -17,6 +17,9 @@ \input{CAPA.tex} \input{PGML.tex} -\input{headandfoot.tex} +\pagestyle{headandfoot} +\firstpageheader{\webworkAssignmentCourseInfo}{}{\webworkUserInfo} +\runningheader{}{}{} +\footer{}{}{\webworkPageNumber} \begin{document} diff --git a/lib/HardcopyRenderedProblem.pm b/lib/HardcopyRenderedProblem.pm index dc6b412a33..511d3d5cd4 100644 --- a/lib/HardcopyRenderedProblem.pm +++ b/lib/HardcopyRenderedProblem.pm @@ -128,7 +128,7 @@ sub generate_hardcopy_tex { # Copy the common tex files into the working directory my $ce = $ws->c->ce; my $common_dir = path($ce->{webworkDirs}{texinputs_common}); - for (qw{packages.tex CAPA.tex PGML.tex}) { + for (qw{packages.tex webwork.sty CAPA.tex PGML.tex}) { eval { $common_dir->child($_)->copy_to($working_dir) }; push(@$errors, qq{Failed to copy "$ce->{webworkDirs}{texinputs_common}/$_" into directory "$working_dir": $@}) if $@; diff --git a/lib/WeBWorK/ContentGenerator/Hardcopy.pm b/lib/WeBWorK/ContentGenerator/Hardcopy.pm index c30310cd81..0e4761b43f 100644 --- a/lib/WeBWorK/ContentGenerator/Hardcopy.pm +++ b/lib/WeBWorK/ContentGenerator/Hardcopy.pm @@ -656,7 +656,7 @@ sub generate_hardcopy_tex ($c, $temp_dir_path, $final_file_basename) { # Copy the common tex files into the bundle directory my $ce = $c->ce; - for (qw{packages.tex CAPA.tex PGML.tex headandfoot.tex copyright.tex webwork_logo.png}) { + for (qw{packages.tex webwork.sty CAPA.tex PGML.tex copyright.tex webwork_logo.png}) { my $cp_cmd = "2>&1 $ce->{externalPrograms}{cp} " . shell_quote("$ce->{webworkDirs}{texinputs_common}/$_", $bundle_path); my $cp_out = readpipe $cp_cmd; From 00ea3fb27b2abe86aeb70e9e42b5a71071cedd73 Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Wed, 21 Jun 2023 00:03:25 -0700 Subject: [PATCH 014/549] add theme header and footer tex files to HardcopyRenderedProblem production --- lib/HardcopyRenderedProblem.pm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/HardcopyRenderedProblem.pm b/lib/HardcopyRenderedProblem.pm index 511d3d5cd4..edd57f0cbb 100644 --- a/lib/HardcopyRenderedProblem.pm +++ b/lib/HardcopyRenderedProblem.pm @@ -128,7 +128,7 @@ sub generate_hardcopy_tex { # Copy the common tex files into the working directory my $ce = $ws->c->ce; my $common_dir = path($ce->{webworkDirs}{texinputs_common}); - for (qw{packages.tex webwork.sty CAPA.tex PGML.tex}) { + for (qw{packages.tex webwork.sty CAPA.tex PGML.tex copyright.tex webwork_logo.png}) { eval { $common_dir->child($_)->copy_to($working_dir) }; push(@$errors, qq{Failed to copy "$ce->{webworkDirs}{texinputs_common}/$_" into directory "$working_dir": $@}) if $@; @@ -210,7 +210,10 @@ sub write_tex { . ($ws->{inputs_ref}{hardcopy_theme} // $ce->{hardcopyTheme}); write_tex_file($FH, $ce->{webworkFiles}{hardcopySnippets}{preamble} // "$themeDir/hardcopyPreamble.tex", $errors); + write_tex_file($FH, $ce->{webworkFiles}{hardcopySnippets}{setTexHeader} // "$themeDir/hardcopySetHeader.tex", + $errors); write_problem_tex($ws, $FH); + write_tex_file($FH, $ce->{webworkFiles}{hardcopySnippets}{setFooter} // "$themeDir/hardcopySetFooter.tex", $errors); write_tex_file($FH, $ce->{webworkFiles}{hardcopySnippets}{postamble} // "$themeDir/hardcopyPostamble.tex", $errors); return; From 965cdadbfb3ff155a71fd72bc9d32984da834d7e Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Wed, 21 Jun 2023 00:05:23 -0700 Subject: [PATCH 015/549] add space after copyright symbol --- conf/snippets/hardcopyThemes/common/copyright.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/snippets/hardcopyThemes/common/copyright.tex b/conf/snippets/hardcopyThemes/common/copyright.tex index 1b28fd8c61..5464bd3017 100644 --- a/conf/snippets/hardcopyThemes/common/copyright.tex +++ b/conf/snippets/hardcopyThemes/common/copyright.tex @@ -1 +1 @@ -\footer{\raisebox{-0.325cm}{\includegraphics[width=3cm]{webwork_logo.png}}}{\small\sffamily Generated by WeBWorK, \copyright The WeBWorK Project, \url{https://openwebwork.org}.}{Page \thepage} +\footer{\raisebox{-0.325cm}{\includegraphics[width=3cm]{webwork_logo.png}}}{\small\sffamily Generated by WeBWorK, \copyright~The~WeBWorK~Project, \url{https://openwebwork.org}.}{Page \thepage} From 7bbddc5c79350250e3ea6e0f4d40a8cec56e9026 Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Wed, 21 Jun 2023 16:39:15 -0700 Subject: [PATCH 016/549] grammar/typo --- conf/snippets/defaultSetHeader.pg | 2 +- conf/snippets/hardcopyThemes/common/webwork.sty | 4 ++-- courses.dist/modelCourse/templates/defaultSetHeader.pg | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/snippets/defaultSetHeader.pg b/conf/snippets/defaultSetHeader.pg index bef3d9f7cb..03bbbeefec 100644 --- a/conf/snippets/defaultSetHeader.pg +++ b/conf/snippets/defaultSetHeader.pg @@ -36,7 +36,7 @@ BEGIN_PGML END_PGML # The hardcopy theme defines headers and footers. If you would like to customize -# those without changing the theme, they can be overrided here by following the +# those without changing the theme, they can be overriddden here by following the # documentation for the LaTeX exam class. However the footer on the last page # displays a copyright claim that cannot be overridden here. # http://mirrors.ctan.org/macros/latex/contrib/exam/examdoc.pdf diff --git a/conf/snippets/hardcopyThemes/common/webwork.sty b/conf/snippets/hardcopyThemes/common/webwork.sty index 00be2540b5..78ec566994 100644 --- a/conf/snippets/hardcopyThemes/common/webwork.sty +++ b/conf/snippets/hardcopyThemes/common/webwork.sty @@ -1,6 +1,6 @@ \ProvidesFile{webwork} -% These macros may be overrided with WeBWorK environment variables +% These macros may be overridden with WeBWorK environment variables \def\webworkCourseName{} \def\webworkCourseTitle{} \def\webworkCourseURL{} @@ -19,7 +19,7 @@ \def\webworkAnswerDate{} \def\webworkPrettySetId{} -% These words/phrases may be overrided for localization +% These words/phrases may be overridden for localization % They are used in subsequent macros \def\webworkLocalizeAssignment{Assignment} \def\webworkLocalizeFullCreditBy{full credit by} diff --git a/courses.dist/modelCourse/templates/defaultSetHeader.pg b/courses.dist/modelCourse/templates/defaultSetHeader.pg index bef3d9f7cb..61e20bb76f 100644 --- a/courses.dist/modelCourse/templates/defaultSetHeader.pg +++ b/courses.dist/modelCourse/templates/defaultSetHeader.pg @@ -36,7 +36,7 @@ BEGIN_PGML END_PGML # The hardcopy theme defines headers and footers. If you would like to customize -# those without changing the theme, they can be overrided here by following the +# those without changing the theme, they can be overridden here by following the # documentation for the LaTeX exam class. However the footer on the last page # displays a copyright claim that cannot be overridden here. # http://mirrors.ctan.org/macros/latex/contrib/exam/examdoc.pdf From 8587111331dd6580739fb919ca5376a0f1a7c893 Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Wed, 21 Jun 2023 16:41:35 -0700 Subject: [PATCH 017/549] change webwork.sty to webwork2.sty --- conf/snippets/hardcopyThemes/common/packages.tex | 2 +- .../hardcopyThemes/common/{webwork.sty => webwork2.sty} | 2 +- lib/HardcopyRenderedProblem.pm | 2 +- lib/WeBWorK/ContentGenerator/Hardcopy.pm | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename conf/snippets/hardcopyThemes/common/{webwork.sty => webwork2.sty} (98%) diff --git a/conf/snippets/hardcopyThemes/common/packages.tex b/conf/snippets/hardcopyThemes/common/packages.tex index af21d6b1ca..e8beaa5259 100644 --- a/conf/snippets/hardcopyThemes/common/packages.tex +++ b/conf/snippets/hardcopyThemes/common/packages.tex @@ -20,7 +20,7 @@ \usepackage{listings} \lstset{basicstyle=\ttfamily,breaklines=true,aboveskip=0pt,belowskip=0pt} \usepackage{hyperref} -\usepackage{webwork} +\usepackage{webwork2} \pagestyle{plain} diff --git a/conf/snippets/hardcopyThemes/common/webwork.sty b/conf/snippets/hardcopyThemes/common/webwork2.sty similarity index 98% rename from conf/snippets/hardcopyThemes/common/webwork.sty rename to conf/snippets/hardcopyThemes/common/webwork2.sty index 78ec566994..8ec76237f3 100644 --- a/conf/snippets/hardcopyThemes/common/webwork.sty +++ b/conf/snippets/hardcopyThemes/common/webwork2.sty @@ -1,4 +1,4 @@ -\ProvidesFile{webwork} +\ProvidesFile{webwork2} % These macros may be overridden with WeBWorK environment variables \def\webworkCourseName{} diff --git a/lib/HardcopyRenderedProblem.pm b/lib/HardcopyRenderedProblem.pm index edd57f0cbb..c4776bae41 100644 --- a/lib/HardcopyRenderedProblem.pm +++ b/lib/HardcopyRenderedProblem.pm @@ -128,7 +128,7 @@ sub generate_hardcopy_tex { # Copy the common tex files into the working directory my $ce = $ws->c->ce; my $common_dir = path($ce->{webworkDirs}{texinputs_common}); - for (qw{packages.tex webwork.sty CAPA.tex PGML.tex copyright.tex webwork_logo.png}) { + for (qw{packages.tex webwork2.sty CAPA.tex PGML.tex copyright.tex webwork_logo.png}) { eval { $common_dir->child($_)->copy_to($working_dir) }; push(@$errors, qq{Failed to copy "$ce->{webworkDirs}{texinputs_common}/$_" into directory "$working_dir": $@}) if $@; diff --git a/lib/WeBWorK/ContentGenerator/Hardcopy.pm b/lib/WeBWorK/ContentGenerator/Hardcopy.pm index 0e4761b43f..80e90e0278 100644 --- a/lib/WeBWorK/ContentGenerator/Hardcopy.pm +++ b/lib/WeBWorK/ContentGenerator/Hardcopy.pm @@ -656,7 +656,7 @@ sub generate_hardcopy_tex ($c, $temp_dir_path, $final_file_basename) { # Copy the common tex files into the bundle directory my $ce = $c->ce; - for (qw{packages.tex webwork.sty CAPA.tex PGML.tex copyright.tex webwork_logo.png}) { + for (qw{packages.tex webwork2.sty CAPA.tex PGML.tex copyright.tex webwork_logo.png}) { my $cp_cmd = "2>&1 $ce->{externalPrograms}{cp} " . shell_quote("$ce->{webworkDirs}{texinputs_common}/$_", $bundle_path); my $cp_out = readpipe $cp_cmd; From 72e13925a60991d833251393f30d09c2a335f441 Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Wed, 7 Jun 2023 12:51:27 -0700 Subject: [PATCH 018/549] Add Problem Editor to sidebar nav --- conf/defaults.config | 2 +- conf/snippets/blankProblem3.pg | 53 +++++++++++++++++++ .../Instructor/PGProblemEditor.pm | 14 ++--- templates/ContentGenerator/Base/links.html.ep | 30 ++++++----- .../PGProblemEditor/add_problem_form.html.ep | 2 +- .../InstructorProblemSetDetail.html.ep | 6 +-- 6 files changed, 78 insertions(+), 29 deletions(-) create mode 100644 conf/snippets/blankProblem3.pg diff --git a/conf/defaults.config b/conf/defaults.config index 80ae409239..33f37b59cd 100644 --- a/conf/defaults.config +++ b/conf/defaults.config @@ -468,7 +468,7 @@ $webworkFiles{hardcopySnippets}{setHeader} = "$webworkDirs{conf}/snippets/de $webworkFiles{screenSnippets}{setHeader} = "$webworkDirs{conf}/snippets/defaultSetHeader.pg"; # A PG template for creation of new problems. -$webworkFiles{screenSnippets}{blankProblem} = "$webworkDirs{conf}/snippets/blankProblem2.pg"; +$webworkFiles{screenSnippets}{blankProblem} = "$webworkDirs{conf}/snippets/blankProblem3.pg"; # A site info "message of the day" file $webworkFiles{site_info} = "$webworkDirs{htdocs}/site_info.txt"; diff --git a/conf/snippets/blankProblem3.pg b/conf/snippets/blankProblem3.pg new file mode 100644 index 0000000000..248c010451 --- /dev/null +++ b/conf/snippets/blankProblem3.pg @@ -0,0 +1,53 @@ +############################################################ +##DESCRIPTION +## Arithemetic problem: give the value of pi +##ENDDESCRIPTION + +##KEYWORDS('template', 'pi') + +## DBsubject('Algebra') +## DBchapter('Fundamentals') +## DBsection('Real Numbers') +## Date('') +## Author('') +## Institution('') +############################################################ + +DOCUMENT(); + +loadMacros( + "PGstandard.pl", # Standard macros for PG language + "PGML.pl", # PGML markup and Math Objects + "PGcourse.pl", # Customization file for the course +); + +# Show which answers are correct and which are incorrect +$showPartialCorrectAnswers = 1; + +############################################################ +# Setup + +Context("Numeric"); + +$pi = Real("pi"); + +############################################################ +# Statement + +BEGIN_PGML +Enter a value for [`\pi`]. + +[_]{$pi}{5} + +END_PGML + +############################################################ +# Solution + +BEGIN_PGML_SOLUTION +You could type [|pi|]* or [|3.14|]*, or [|22/7|]*, +among other options. + +END_PGML_SOLUTION + +ENDDOCUMENT(); diff --git a/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm b/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm index 0a7f6e0178..0df516e037 100644 --- a/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm +++ b/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm @@ -248,16 +248,14 @@ sub initialize ($c) { $c->addbadmessage($c->maketext('The file "[_1]" cannot be found.', $c->shortPath($c->{inputFilePath}))); } elsif (!-w $c->{inputFilePath} && $file_type ne 'blank_problem') { $c->addbadmessage($c->maketext( - 'The file "[_1]" is protected! ' - . 'To edit this text you must first make a copy of this file using the "New Version" action below.', + 'The file "[_1]" is protected. You may use "Save As" to create a new file.', $c->shortPath($c->{inputFilePath}) )); } if ($c->{inputFilePath} =~ /$BLANKPROBLEM$/ && $file_type ne 'blank_problem') { $c->addbadmessage($c->maketext( - 'The file "[_1]" is a blank problem!' - . 'To edit this text you must use the "New Version" action below to save it to another file.', + 'The file "[_1]" is a template. You may use "Save As" to create a new file.', $c->shortPath($c->{inputFilePath}) )); } @@ -334,7 +332,7 @@ sub page_title ($c) { } } - return $c->maketext('Problem [_1]', $problemID); + return $c->maketext((defined $setID ? "$setID " : '') . 'Problem [_1]', $problemID); } # Convert initial path component to [TMPL], [COURSE], or [WW]. @@ -384,7 +382,7 @@ sub determineLocalFilePath ($c, $path) { # $path should be an absolute path to the original file. sub determineTempEditFilePath ($c, $path) { my $user = $c->param('user'); - my $setID = $c->{setID}; + my $setID = $c->{setID} // 'undefined_Set'; my $templatesDirectory = $c->ce->{courseDirs}{templates}; my $tmpEditFileDirectory = $c->getTempEditFileDirectory(); @@ -479,10 +477,6 @@ sub getFilePaths ($c) { $editFilePath = "$ce->{courseDirs}{templates}/$ce->{courseFiles}{course_info}"; } elsif ($c->{file_type} eq 'blank_problem') { $editFilePath = $ce->{webworkFiles}{screenSnippets}{blankProblem}; - $c->addbadmessage($c->maketext( - 'This is a blank problem template file and can not be edited directly. Use the "New Version" ' - . 'action below to create a local copy of the file and add it to the current problem set.' - )); } elsif ($c->{file_type} eq 'set_header' || $c->{file_type} eq 'hardcopy_header') { my $set_record = $db->getGlobalSet($c->{setID}); diff --git a/templates/ContentGenerator/Base/links.html.ep b/templates/ContentGenerator/Base/links.html.ep index 4a66d6ea06..6e623de3aa 100644 --- a/templates/ContentGenerator/Base/links.html.ep +++ b/templates/ContentGenerator/Base/links.html.ep @@ -130,26 +130,28 @@ link_attrs => { dir => 'ltr' } ); %> - % if (defined $problemID) { - - % } % } % # Set assigner + % # Problem Editor + + % if (defined $problemID) { + + % } % # Library Browser % # Statistics diff --git a/templates/ContentGenerator/Instructor/PGProblemEditor/add_problem_form.html.ep b/templates/ContentGenerator/Instructor/PGProblemEditor/add_problem_form.html.ep index 562d594bd3..bab0395889 100644 --- a/templates/ContentGenerator/Instructor/PGProblemEditor/add_problem_form.html.ep +++ b/templates/ContentGenerator/Instructor/PGProblemEditor/add_problem_form.html.ep @@ -9,7 +9,7 @@
    <%= select_field 'action.add_problem.target_set' => [ map { [ - format_set_name_display($_) => $_, $_ eq $c->{setID} ? (selected => undef) : () + format_set_name_display($_) => $_, $_ eq ($c->{setID} // 'undefined_Set') ? (selected => undef) : () ] } @$allSetNames ], id => 'action_add_problem_target_set_id', class => 'form-select form-select-sm d-inline w-auto', diff --git a/templates/HelpFiles/InstructorProblemSetDetail.html.ep b/templates/HelpFiles/InstructorProblemSetDetail.html.ep index 8a80a274d8..bf1ba3cdfd 100644 --- a/templates/HelpFiles/InstructorProblemSetDetail.html.ep +++ b/templates/HelpFiles/InstructorProblemSetDetail.html.ep @@ -107,9 +107,9 @@
    <%= maketext('Add n blank problem template(s) to the end of homework set.') %>
    - <%= maketext('Adds new, essentially blank, problems to the set when the set is saved. You can modify this ' - . 'problem to create your own problem, by clicking on the "Edit Problem" link and saving the ' - . '"blankProblem.pg" to some new file, e.g. "myNewProblem.pg".') =%> + <%= maketext('Adds new template problems to the set when the set is saved. You can modify the template ' + . 'to create your own problem, by clicking on the "Edit Problem" link and saving to some new ' + . 'file, e.g. "myNewProblem.pg".') =%>
    From 7299923030c3c107ba34f6dbb5c8b665427bc480 Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Wed, 7 Jun 2023 14:29:42 -0700 Subject: [PATCH 019/549] remove context declaration from new blank problem --- conf/snippets/blankProblem3.pg | 2 -- 1 file changed, 2 deletions(-) diff --git a/conf/snippets/blankProblem3.pg b/conf/snippets/blankProblem3.pg index 248c010451..d9b455a43b 100644 --- a/conf/snippets/blankProblem3.pg +++ b/conf/snippets/blankProblem3.pg @@ -27,8 +27,6 @@ $showPartialCorrectAnswers = 1; ############################################################ # Setup -Context("Numeric"); - $pi = Real("pi"); ############################################################ From cf920bde70b5e3ce469307313efb6c1289ff50ba Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Wed, 7 Jun 2023 17:26:10 -0700 Subject: [PATCH 020/549] more changes to new blank problem --- conf/snippets/blankProblem3.pg | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/conf/snippets/blankProblem3.pg b/conf/snippets/blankProblem3.pg index d9b455a43b..bd3512f9ae 100644 --- a/conf/snippets/blankProblem3.pg +++ b/conf/snippets/blankProblem3.pg @@ -1,9 +1,8 @@ -############################################################ -##DESCRIPTION -## Arithemetic problem: give the value of pi -##ENDDESCRIPTION +## DESCRIPTION +## Give a value for pi +## ENDDESCRIPTION -##KEYWORDS('template', 'pi') +## KEYWORDS('template', 'pi') ## DBsubject('Algebra') ## DBchapter('Fundamentals') @@ -11,7 +10,6 @@ ## Date('') ## Author('') ## Institution('') -############################################################ DOCUMENT(); @@ -21,31 +19,20 @@ loadMacros( "PGcourse.pl", # Customization file for the course ); -# Show which answers are correct and which are incorrect -$showPartialCorrectAnswers = 1; - -############################################################ -# Setup +# Uncomment the following if you don't want to show which +# answers are correct and which are incorrect +#$showPartialCorrectAnswers = 0; $pi = Real("pi"); -############################################################ -# Statement - BEGIN_PGML -Enter a value for [`\pi`]. - +Enter a value for [`\pi`]. [_]{$pi}{5} - END_PGML -############################################################ -# Solution - BEGIN_PGML_SOLUTION You could type [|pi|]* or [|3.14|]*, or [|22/7|]*, among other options. - END_PGML_SOLUTION ENDDOCUMENT(); From 0bbfd72f82483727fa3fd4e82af5b3eda3bd5fd2 Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Wed, 7 Jun 2023 17:30:02 -0700 Subject: [PATCH 021/549] move set assigner up between classlist editor and set editor --- templates/ContentGenerator/Base/links.html.ep | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/ContentGenerator/Base/links.html.ep b/templates/ContentGenerator/Base/links.html.ep index 6e623de3aa..f504d5b8bc 100644 --- a/templates/ContentGenerator/Base/links.html.ep +++ b/templates/ContentGenerator/Base/links.html.ep @@ -116,6 +116,8 @@ % } + % # Set assigner + % # Homework Set Editor % # Editor link. Only shown for non-versioned sets @@ -134,8 +136,6 @@ % } - % # Set assigner - % # Problem Editor % if (defined $problemID) { From 287d8ec1f8a6e0df0c6bff446883528d47d38304 Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Wed, 7 Jun 2023 17:55:02 -0700 Subject: [PATCH 022/549] update Instructor Links and Problem Editor help pages --- .../HelpFiles/InstructorPGProblemEditor.html.ep | 8 ++++---- templates/HelpFiles/instructor_links.html.ep | 14 +++++++++----- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/templates/HelpFiles/InstructorPGProblemEditor.html.ep b/templates/HelpFiles/InstructorPGProblemEditor.html.ep index aebf3d502f..d7c625f792 100644 --- a/templates/HelpFiles/InstructorPGProblemEditor.html.ep +++ b/templates/HelpFiles/InstructorPGProblemEditor.html.ep @@ -21,9 +21,9 @@ . 'as set headers and other files.') =%>

    <%= maketext('Features:') %>

    -
    +
    <%= maketext('Links to pages that give information about writing problems:') %>
    -
    +
    @@ -73,12 +73,12 @@
    <%= maketext('The large text window') %>
    -
    +
    <%= maketext('This is where you edit the text of the problem template. Type Ctrl-Enter while this ' . 'window has focus to re-render the problem.') =%>
    <%= maketext('Text Editor Options') %>
    -
    +
    <%= maketext('Theme') %>
    <%= maketext('Select your favorite theme for the large text window.') %>
    diff --git a/templates/HelpFiles/instructor_links.html.ep b/templates/HelpFiles/instructor_links.html.ep index 21ad7a0b9d..3f48c814ac 100644 --- a/templates/HelpFiles/instructor_links.html.ep +++ b/templates/HelpFiles/instructor_links.html.ep @@ -16,8 +16,8 @@ % layout 'help_macro'; % title maketext('Instructor Links Help'); % -<%== maketext('Click the icon [_1] for page and item specific help.', - '
    ') =%> +<%== maketext('Click the [_1] icon for page and item specific help.', + '') =%>
    <%== maketext('The main page for WeBWorK documentation is the webwork wiki while specific help for ' . q{instructors setting up a course are in the instructors' section.}, @@ -34,17 +34,21 @@ . 'Assign individual sets ' . 'and Edit individual due dates.') =%>
    -
    <%= maketext('Class List Editor') %>
    +
    <%= maketext('Classlist Editor') %>
    <%= maketext('Edit class roster data. Add students, edit student data, drop students from class, import ' . 'students from a classlist, and give user professor privileges. Access to individual homework sets.') =%>
    +
    <%= maketext('Set Assigner') %>
    +
    <%= maketext('Assign and unassign selected exercise sets to selected users.') %>
    <%= maketext('Hmwk Sets Editor') %>
    <%= maketext('Edit homework sets for entire class. Change homework set due dates, create new sets from a set ' . 'definition file, create new homework sets, make sets visible/invisible, score homework sets. Assign ' . 'homework sets to the class.') =%>
    +
    <%= maketext('Problem Editor') %>
    +
    <%= maketext('Write a new PG problem file or edit an existing one.') %>
    <%= maketext('Library Browser') %>
    <%= maketext('Choose problems from a library and add them to a homework set.') %>
    <%= maketext('Statistics') %>
    @@ -80,5 +84,5 @@
    -<%== maketext('Click the icon [_1] for page and item specific help.', - '') %> +<%== maketext('Click the [_1] icon for page and item specific help.', + '') %> From ce00b794b25b1594cd2ffae0684326f987054900 Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Wed, 7 Jun 2023 18:47:11 -0700 Subject: [PATCH 023/549] Suggestions from PR#2038 --- .../ContentGenerator/Instructor/PGProblemEditor.pm | 7 ++++--- templates/ContentGenerator/Base/links.html.ep | 8 ++++++-- .../Instructor/PGProblemEditor/add_problem_form.html.ep | 2 +- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm b/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm index 0df516e037..ca37a715d9 100644 --- a/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm +++ b/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm @@ -109,7 +109,7 @@ not exist. The path to the actual file being edited is stored in inputFilePath. use File::Copy; use WeBWorK::Utils qw(jitar_id_to_seq not_blank path_is_subdir seq_to_jitar_id x - surePathToFile readDirectory readFile max); + surePathToFile readDirectory readFile max format_set_name_display); use WeBWorK::Utils::Instructor qw(assignProblemToAllSetUsers addProblemToSet); use constant DEFAULT_SEED => 123456; @@ -332,7 +332,8 @@ sub page_title ($c) { } } - return $c->maketext((defined $setID ? "$setID " : '') . 'Problem [_1]', $problemID); + return (defined $setID ? $c->tag('span', dir => 'ltr', format_set_name_display($setID)) . ': ' : '') + . (defined $problemID ? $c->maketext('Problem [_1]', $problemID) : $c->maketext('Problem Template')); } # Convert initial path component to [TMPL], [COURSE], or [WW]. @@ -382,7 +383,7 @@ sub determineLocalFilePath ($c, $path) { # $path should be an absolute path to the original file. sub determineTempEditFilePath ($c, $path) { my $user = $c->param('user'); - my $setID = $c->{setID} // 'undefined_Set'; + my $setID = $c->{setID} // 'Undefined_Set'; my $templatesDirectory = $c->ce->{courseDirs}{templates}; my $tmpEditFileDirectory = $c->getTempEditFileDirectory(); diff --git a/templates/ContentGenerator/Base/links.html.ep b/templates/ContentGenerator/Base/links.html.ep index f504d5b8bc..35bf85db76 100644 --- a/templates/ContentGenerator/Base/links.html.ep +++ b/templates/ContentGenerator/Base/links.html.ep @@ -138,13 +138,17 @@ % # Problem Editor - % if (defined $problemID) { + % if (defined $prettySetID && defined $problemID) {
    " +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:55 +msgid "Sets the order in which achievements are listed and evaluated." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1421 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:625 msgid "Sets were selected for export." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Config.pm:725 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Config.html.ep:36 msgid "Setting" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1300 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/import_form.html.ep:39 msgid "Shift dates so that the earliest is" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/Hardcopy.html.ep:32 +msgid "Show" +msgstr "" + #. ($numchild) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:1330 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:1331 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/problem_row.html.ep:31 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/problem_row.html.ep:32 msgid "Show %1 more like this" msgstr "" -#: /opt/webwork/webwork2/lib/FormatRenderedProblem.pm:318 +#: /opt/webwork/webwork2/templates/RPCRenderFormats/default.html.ep:107 +#: /opt/webwork/webwork2/templates/RPCRenderFormats/default.json.ep:39 msgid "Show Correct Answers" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:330 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:22 msgid "Show Date & Size" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:488 +#: /opt/webwork/webwork2/conf/LTIConfigValues.config:86 msgid "Show LTI parameters (for debugging)" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/URLPath.pm:612 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:480 +#: /opt/webwork/webwork2/templates/ContentGenerator/Problem/submit_buttons.html.ep:34 msgid "Show Me Another" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:2452 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:2383 +#. ($exhausted) +#: /opt/webwork/webwork2/templates/ContentGenerator/Problem/submit_buttons.html.ep:69 +msgid "Show Me Another %1" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1642 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:711 msgid "Show Past Answers" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:634 +#: /opt/webwork/webwork2/templates/HelpFiles/Hardcopy.html.ep:41 +msgid "Show Problem Source File" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Hardcopy/form.html.ep:132 msgid "Show Problem Source File:" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:279 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:296 msgid "Show Problems on Finished Tests" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:272 -msgid "Show Scores on Finished Assignments?" +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:282 +msgid "Show Scores on Finished Tests" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:2372 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:630 msgid "Show Solutions" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:183 +#: /opt/webwork/webwork2/conf/defaults.config:1538 msgid "Show Total Homework Grade on Grades Page" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1249 +#: /opt/webwork/webwork2/templates/ContentGenerator/Problem/student_nav.html.ep:77 msgid "Show all students" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1381 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz/nav.html.ep:91 msgid "Show all tests" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:2360 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:621 msgid "Show correct answers" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:1329 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:403 +msgid "Show hints after" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/problem_row.html.ep:30 msgid "Show less like this" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:338 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1870 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:387 msgid "Show me another" msgstr "" -#. ($exhausted) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1897 -msgid "Show me another %1" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorShowAnswers.html.ep:20 +msgid "" +"Show past answers. Students can only see their past answers, and they will " +"not be able to see which parts are correct. Instructors can use the form to " +"select any combination of users, sets, and problems to view. The table " +"below will list the past answers colored according to correctness (green is " +"correct). Use control + click to select multiple users, sets, or problems." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:2384 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:639 msgid "Show problem graders" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Options.pm:360 +#: /opt/webwork/webwork2/templates/ContentGenerator/Options.html.ep:105 msgid "Show saved answers?" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:297 +#: /opt/webwork/webwork2/conf/defaults.config:1762 msgid "Show the correct answer to the current problem before re-randomization." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:298 +#: /opt/webwork/webwork2/conf/defaults.config:1764 msgid "" "Show the correct answer to the current problem on the last attempt before a " "new version is requested." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:640 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/filter_form.html.ep:3 msgid "Show which sets?" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:673 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/filter_form.html.ep:3 msgid "Show which users?" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:282 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:451 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ShowAnswers.pm:382 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:475 -msgid "Show/Hide Site Description" -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:553 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1642 +#: /opt/webwork/webwork2/templates/ContentGenerator/Hardcopy/form.html.ep:75 +#: /opt/webwork/webwork2/templates/ContentGenerator/Problem/checkboxes.html.ep:11 msgid "Show:" msgstr "" -#. (scalar @{ $self->{visibleSetIDs} }, scalar @{ $self->{allSetIDs} }) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:578 +#. (scalar @{ $c->{visibleSetIDs} }, scalar @{ $c->{allSetIDs} }) +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList.html.ep:115 msgid "Showing %1 out of %2 sets." msgstr "" -#. (scalar @Users, scalar @{ $self->{allUserIDs} }) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:593 +#. (scalar(keys %{ $c->{visibleUserIDs} }) +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList.html.ep:80 msgid "Showing %1 out of %2 users" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1227 +#: /opt/webwork/webwork2/templates/ContentGenerator/Problem/student_nav.html.ep:70 msgid "Showing all students" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1356 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz/nav.html.ep:81 msgid "Showing all tests" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:423 -msgid "Simple" +#. ($c->{merge_file}, $ur->user_id) +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/preview.html.ep:5 +msgid "Showing data from merge file %1 for user %2:" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Home.pm:61 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Login.pm:104 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Login.pm:107 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/LoginProctor.pm:67 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/LoginProctor.pm:70 -msgid "Site Information" +#. ($c->{merge_file}) +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:147 +msgid "Showing data from merge file: %1" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2179 -msgid "Skip archiving this course" +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:61 +msgid "Showing problem for:" msgstr "" -#: /opt/webwork/pg/macros/PGbasicmacros.pl:1556 -#: /opt/webwork/pg/macros/PGbasicmacros.pl:1557 -msgid "Solution:" +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:8 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:7 +msgid "Showing statistics for:" msgstr "" -#: /opt/webwork/pg/macros/PGbasicmacros.pl:1555 -msgid "Solution: " +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:33 +msgid "" +"Shows how many instructors and students have been assigned this problem set, " +"out of the total number in the class. Clicking on this link allows you to " +"assign the set to users, unassign this set from users, and to individually " +"edit the assignment for specific users. For changing dates for individual " +"users there are also shortcuts from the \"Instructor Tools\" link." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Home.pm:43 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Login.pm:63 +msgid "Site Information" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_confirm.html.ep:88 +msgid "Skip archiving this course" +msgstr "" + +#: /opt/webwork/webwork2/conf/defaults.config:1981 +msgid "Skip explanation essay answer fields" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:81 +msgid "Snippets of PG code illustrating specific techniques" +msgstr "" + +#: /opt/webwork/pg/macros/core/PGbasicmacros.pl:1514 +#: /opt/webwork/pg/macros/core/PGbasicmacros.pl:1515 +msgid "Solution:" +msgstr "" + +#: /opt/webwork/pg/macros/core/PGbasicmacros.pl:1513 +msgid "Solution: " msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:599 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:430 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1762 +#: /opt/webwork/webwork2/templates/ContentGenerator/Hardcopy/form.html.ep:105 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/view_problems_line.html.ep:57 msgid "Solutions" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:1380 +#: /opt/webwork/webwork2/templates/HelpFiles/Levels.html.ep:20 +msgid "" +"Some OPL problems have been rated for difficulty/educational objective. The " +"levels are loosely inspired by Bloom's taxonomy. They are assigned numbers " +"from 1 to 6 as follows." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/problem_row.html.ep:185 msgid "" "Some WeBWorK problems are programmed using what are called Math Objects. These problems are preferred by some people because they provide a more " @@ -5493,18 +7733,30 @@ msgid "" "for answers which are way off base." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/AttemptsTable.pm:386 +#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:379 msgid "Some answers will be graded later." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:848 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/delete.html.ep:60 msgid "" "Some of these files are directories. Only delete directories if you really " "know what you are doing. You can seriously damage your course if you delete " "the wrong thing." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:2208 +#: /opt/webwork/webwork2/conf/defaults.config:1983 +msgid "" +"Some problems have an explanation essay answer field, typically following a " +"simpler answer field. For example, find a certain derivative using the " +"definition. An answer blank would be present for the derivative to be " +"automatically checked, and then there would be a separate essay answer field " +"to show the steps of actually using the definition of the derivative, to be " +"scored manually. With this setting, the essay explanation fields are " +"supperessed. Instructors may use the exercise without incurring the manual " +"grading." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker.html.ep:83 msgid "" "Some problems shown above represent multiple similar problems from the " "database. If the (top) information line for a problem has a letter M for " @@ -5514,301 +7766,396 @@ msgid "" "again." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:164 -msgid "" -"Some servers handle courses taking place in different timezones. If this " -"course is not showing the correct timezone, enter the correct value here. " -"The format consists of unix times, such as \"America/New_York\",\"America/" -"Chicago\", \"America/Denver\", \"America/Phoenix\" or \"America/Los_Angeles" -"\". Complete list: TimeZoneFiles" -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIBasic.pm:538 -msgid "" -"Something was wrong with your LTI parameters. If this recurs, please speak " -"with your instructor" -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:101 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:85 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:99 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:79 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:50 msgid "Sort" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:730 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:797 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/sort_form.html.ep:3 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/sort_form.html.ep:4 msgid "Sort by" msgstr "" #. ($names{$primary}, $names{$secondary}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:796 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:324 msgid "Sort by %1 and then by %2" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/HTML/DropdownList.pm:171 -#: /opt/webwork/webwork2/lib/WeBWorK/HTML/ScrollingRecordList.pm:115 +#: /opt/webwork/webwork2/templates/HTML/ScrollingRecordList/scrollingRecordList.html.ep:3 msgid "Sort:" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:314 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:51 +msgid "Sorts the lists displayed by due date, name, etc." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:363 msgid "Source File" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1570 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1596 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1630 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1527 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1555 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1593 msgid "" "Source file paths cannot include .. or start with /: your source file path " "was modified." msgstr "" #. ($ce->{maxCourseIdLength}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:464 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:11 msgid "" "Specify an ID, title, and institution for the new course. The course ID may " "contain only letters, numbers, hyphens, and underscores, and may have at " "most %1 characters." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:424 -msgid "Standard" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:94 +msgid "" +"Spell check the text of the file that your are editing. Note that there will " +"be many spelling errors in the code parts of your file." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:35 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:116 +msgid "Standard Deviation" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:637 +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:162 +msgid "Start" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/LTIUpdate.html.ep:47 +msgid "Start LTI Grade Update" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:130 msgid "Start New Test" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:403 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:482 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Stats.pm:105 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Stats.pm:84 -#: /opt/webwork/webwork2/lib/WeBWorK/URLPath.pm:501 -#: /opt/webwork/webwork2/lib/WeBWorK/URLPath.pm:510 -#: /opt/webwork/webwork2/lib/WeBWorK/URLPath.pm:519 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Stats.pm:100 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Stats.pm:95 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:406 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:139 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:84 +#: /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:54 msgid "Statistics" msgstr "" -#. ($self->{ce}->{courseName}, $self->{setName}, $self->formatDateTime($self->{set_due_date}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Stats.pm:80 -msgid "Statistics for %1 set %2. Closes %3" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorStats.html.ep:17 +msgid "Statistics Help" +msgstr "" + +#. ($c->tag('span', dir => 'ltr', format_set_name_display($setID) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Stats.pm:86 +msgid "Statistics for %1" msgstr "" -#. ($self->{ce}->{courseName}, $self->{studentName}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Stats.pm:75 -msgid "Statistics for %1 student %2" +#. ($c->tag('span', dir => 'ltr', format_set_name_display($setID) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Stats.pm:90 +msgid "Statistics for %1 problem %2" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:2075 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:369 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:1472 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:1554 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:1963 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:296 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:813 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:184 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:185 +#. ($c->{studentID}) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Stats.pm:84 +msgid "Statistics for student %1" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:442 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:289 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/problem_row.html.ep:151 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/problem_row.html.ep:91 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:16 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/user_list.html.ep:34 +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/problem_list.html.ep:16 +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:160 +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSets.html.ep:34 +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSets.html.ep:36 msgid "Status" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator.pm:1070 +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/login_status.html.ep:29 msgid "Stop Acting" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2172 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_confirm.html.ep:85 msgid "Stop Archiving" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2339 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1153 msgid "Stop archiving courses" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AddUsers.pm:233 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:796 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:1962 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:295 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:812 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:841 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:870 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:899 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:127 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers.html.ep:43 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:106 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/user_list.html.ep:30 msgid "Student ID" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementUserEditor.pm:188 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UsersAssignedToSet.pm:156 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers/student_entry_report.html.ep:9 +msgid "Student ID:" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementUserEditor.html.ep:33 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UsersAssignedToSet.html.ep:37 msgid "Student Name" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:111 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:89 -#: /opt/webwork/webwork2/lib/WeBWorK/URLPath.pm:564 -#: /opt/webwork/webwork2/lib/WeBWorK/URLPath.pm:573 -#: /opt/webwork/webwork2/lib/WeBWorK/URLPath.pm:582 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:80 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:85 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:428 +#: /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:56 msgid "Student Progress" msgstr "" -#. ($self->{ce}->{courseName}, $self->{setName}, $self->formatDateTime($self->{set_due_date}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:85 -msgid "Student Progress for %1 set %2. Closes %3" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorStudentProgress.html.ep:17 +msgid "Student Progress Help" msgstr "" -#. ($self->{ce}->{courseName}, $self->{studentName}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:80 -msgid "Student Progress for %1 student %2" +#. ($c->{studentID}) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:72 +msgid "Student Progress for %1" +msgstr "" + +#. ($c->tag('span', dir => 'ltr', format_set_name_display($c->stash('setID') +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:76 +msgid "Student Progress for set %1" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:559 +#: /opt/webwork/webwork2/templates/ContentGenerator/Hardcopy/form.html.ep:80 msgid "Student answers" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:653 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:832 -msgid "Subject:" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:80 +msgid "" +"Student scores for the sets selected below will be calculated. This and " +"other scoring operations can also be done using the \"Scoring Tools\" link." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:87 +msgid "Student:" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:693 -msgid "Subject: " +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:124 +msgid "Students" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/LoginProctor.pm:225 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:50 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/browse_library_panel_advanced.html.ep:11 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/browse_library_panel_simple.html.ep:8 +msgid "Subject:" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/LoginProctor.html.ep:30 msgid "Submission time:" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Achievements.pm:279 +#: /opt/webwork/webwork2/templates/ContentGenerator/Achievements/achievement_items.html.ep:41 msgid "Submit" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1839 +#: /opt/webwork/webwork2/templates/ContentGenerator/Problem/submit_buttons.html.ep:26 msgid "Submit Answers" msgstr "" #. ($effectiveUser) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1832 +#: /opt/webwork/webwork2/templates/ContentGenerator/Problem/submit_buttons.html.ep:23 msgid "Submit Answers for %1" msgstr "" -#: /opt/webwork/pg/macros/compoundProblem.pl:502 +#: /opt/webwork/pg/macros/core/compoundProblem.pl:525 msgid "Submit your answers again to go on to the next part." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Stats.pm:766 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:39 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:70 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:136 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:183 msgid "Success Index" msgstr "" +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:42 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:106 +msgid "" +"Success index is the square of the average score divided by the average " +"number of attempts." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:73 +msgid "" +"Success index is the square of the score divided by the number of attempts." +msgstr "" + #. ($archive_courseID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2277 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1086 msgid "Successfully archived the course %1." msgstr "" #. ($newAchievementID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:830 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:422 msgid "Successfully created new achievement %1" msgstr "" -#. ($newSetID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1223 +#. ($c->tag('span', dir => 'ltr', format_set_name_display($newSetID) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:581 msgid "Successfully created new set %1" msgstr "" #. ($add_courseID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:907 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:465 msgid "Successfully created the course %1" msgstr "" #. ($delete_courseID) #. ($archive_courseID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1781 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2322 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1131 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:900 msgid "Successfully deleted the course %1." msgstr "" -#. ($rename_oldCourseID, $rename_newCourseID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1492 +#. ($rename_oldCourseID, $rename_newCourseID) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:772 msgid "Successfully renamed the course %1 to %2" msgstr "" #. ($unarchive_courseID, $new_courseID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2573 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1286 msgid "Successfully unarchived %1 to the course %2" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1157 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2059 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:4165 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:89 +msgid "TA:" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2274 msgid "Table defined in database but missing in schema" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1156 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2058 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:4164 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2269 msgid "Table defined in schema but missing in database" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1158 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2060 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:4166 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2265 msgid "Table is ok" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:3113 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:3403 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm:287 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:363 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:696 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:562 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:586 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/edit_location_form.html.ep:59 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/manage_location_form.html.ep:106 msgid "Take Action!" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:1071 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/top_row.html.ep:9 msgid "Target Set:" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:63 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:55 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor/hardcopy_form.html.ep:42 msgid "TeX Source" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:729 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:258 +msgid "Test %2" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/AddNewTestGW.pm:54 +#: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/ExtendDueDateGW.pm:52 +#: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/ResurrectGW.pm:55 +msgid "Test Name" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:156 msgid "Test Time" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:214 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:224 msgid "Test Time Limit (min; 0=Close Date)" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:2027 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:238 msgid "Test Time Notification" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:682 +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:156 msgid "Test Versions" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:439 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:244 msgid "Test not yet submitted." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:322 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:323 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:920 +msgid "Test parameters" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:148 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:149 msgid "Test/quiz with time limit." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:412 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:79 msgid "Text" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:902 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:80 +msgid "Text Editor Options" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/browse_library_panel_advanced.html.ep:55 msgid "Text chapter:" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:921 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/browse_library_panel_advanced.html.ep:66 msgid "Text section:" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:883 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/browse_library_panel_advanced.html.ep:44 msgid "Textbook:" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:1433 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorSetMaker.html.ep:58 +msgid "" +"The \"Edit Target Set\" button at the top of the page will take you to the " +"Problem Set Editor which will allow you to edit dates, assign users and " +"other information about the problem set." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:115 +msgid "" +"The \"Score\" tab will export achievement data to a CSV file that can be " +"downloaded. The export contains the global data including number of " +"achievement points and current level of each student. In addition for each " +"selected achievement, a column for if the achievement was earned (1) or not " +"earned (0) will be added to the CSV." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:194 +msgid "" +"The Assigned sets column (x/y) indicates that x sets out of " +"y sets avaiable have been assigned to this student. Click this link to " +"assign or unassign sets to this student, to adjust due dates, or to adjust " +"the grades on a homework set for a student." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:20 +msgid "" +"The Set Detail page can be viewed in one of two distinct " +"modes:" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:189 +msgid "" +"The login name column links allow you to \"act as\" a " +"student." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:191 +msgid "" +"The pencil in the login column allows you to edit that " +"student's data." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/problem_row.html.ep:64 msgid "" "The Attempts figure is the global average of the number of attempts (both " "correct and incorrect) individuals take on this problem. A high figure may " @@ -5817,7 +8164,7 @@ msgid "" "each part before continuing and each such submittal counts as an attempt." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:1515 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/problem_row.html.ep:124 msgid "" "The Attempts figure is the local average of the number of attempts (both " "correct and incorrect) individuals at your institution take on this problem. " @@ -5827,14 +8174,14 @@ msgid "" "counts as an attempt." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:275 +#: /opt/webwork/webwork2/conf/defaults.config:1721 msgid "" "The Maximum number of times Show me Another can be used per problem by a " "student. If set to -1 then there is no limit to the number of times that " "Show Me Another can be used." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:265 +#: /opt/webwork/webwork2/conf/defaults.config:1689 msgid "" "The Reduced Scoring Period is the default period before the due date during " "which all additional work done by the student counts at a reduced rate. When " @@ -5847,7 +8194,7 @@ msgid "" "work done counts 50% of the original.\" will be displayed." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:1454 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/problem_row.html.ep:78 msgid "" "The Status figure is the global average of the Status individuals have " "earned on this problem. The Status is the percentage correct (from 0% to " @@ -5856,7 +8203,7 @@ msgid "" "a problem until they get it correct or nearly so." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:1536 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/problem_row.html.ep:138 msgid "" "The Status figure is the local average of the Status individuals at your " "institution have earned on this problem. The Status is the percentage " @@ -5865,47 +8212,61 @@ msgid "" "students will work on a problem until they get it correct or nearly so." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator.pm:1187 +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/footer.html.ep:11 msgid "The WeBWorK Project" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:828 +#: /opt/webwork/webwork2/templates/HelpFiles/AdminAddCourse.html.ep:25 +msgid "" +"The WeBWorK administrators need to be added to the course in order for them " +"to access the course. Unchecking this option will make it so WeBWorK " +"administrators cannot directly login to the course." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:129 +msgid "" +"The achievement evaluator is the perl code that is run after each submit to " +"determine if an achievement is earned or not. Click on the \"Edit " +"Evaluator\" link to edit the evaluator." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/problem_list.html.ep:26 msgid "" "The adjusted status of a problem is the larger of the problem's status " "andthe weighted average of the status of those problems which count towards " "the parent grade." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:207 +#: /opt/webwork/webwork2/conf/defaults.config:1579 msgid "" "The amount of time (in minutes) after the due date that the Answers are " "available to student to view. You can change this for individual homework, " "but WeBWorK will use this value when a set is created." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:201 +#: /opt/webwork/webwork2/conf/defaults.config:1569 msgid "" "The amount of time (in minutes) before the due date when the assignment is " "opened. You can change this for individual homework, but WeBWorK will use " -"this value when a set is created. " +"this value when a set is created." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/AttemptsTable.pm:389 +#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:386 msgid "The answer above is NOT correct." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/AttemptsTable.pm:384 +#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:375 msgid "The answer above is correct." msgstr "" #. ($filename, $ce->{mail}{maxAttachmentSize}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Feedback.pm:300 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Feedback.pm:230 msgid "" "The attached file \"%1\" exceeds the allowed attachment size of %quant(%2," "megabyte)." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:422 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:496 msgid "" "The child problems for this problem will become visible to the student when " "they either have more incorrect attempts than is specified here, or when " @@ -5914,171 +8275,252 @@ msgid "" "attempts." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Config.pm:704 +#. ('href="http://webwork.maa.org/wiki/Classlist_Files#Format_of_classlist_files" target="Webworkdocs"', 'demoCourse.lst','.csv','.lst') +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:59 +msgid "" +"The classlist files are stored in the templates directory and provide a " +"convenient way to enter a large number of students into your class. To view " +"the format for ClassList files see the ClassList " +"specification or download the %2 file and use it as a model. ClassList " +"files can be prepared using a spreadsheet and then saved as %3 (comma " +"separated values) text files. However, to access as a classlist file, the " +"file suffix needs to be changed to %4, which can be done with the \"Rename\" " +"button." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Config.html.ep:16 msgid "" "The configuration module did not find the data it needs to function. Have " -"your site administrator check that Constants.pm is up to date." +"your site administrator check that site configuration files are up to date." +msgstr "" + +#. ($archive_courseID, $archive_path) +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_confirm.html.ep:80 +msgid "" +"The course \"%1\" has already been archived at \"%2\". This earlier archive " +"will be erased. This cannot be undone." msgstr "" -#. (CGI::b($courseID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Logout.pm:151 +#. (tag('strong', stash('courseID') +#: /opt/webwork/webwork2/templates/ContentGenerator/Logout.html.ep:8 msgid "" "The course %1 uses an external authentication system (%2). Please go there " "to log in again." msgstr "" -#. (CGI::strong($course) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Login.pm:189 +#. (tag('strong', $course) +#: /opt/webwork/webwork2/templates/ContentGenerator/Login.html.ep:17 msgid "" "The course %1 uses an external authentication system (%2). Please return to " "that system to access this course." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:104 +#. (tag('strong', $course) +#: /opt/webwork/webwork2/templates/ContentGenerator/Login.html.ep:23 msgid "" "The course %1 uses an external authentication system (%2). You've " "authenticated through that system, but aren't allowed to log in to this " "course." msgstr "" -#. ($archive_courseID, $archive_path) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2165 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_confirm.html.ep:30 +msgid "The course database must be upgraded before archiving this course." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/rename_course_confirm.html.ep:30 +msgid "The course database must be upgraded before renaming this course." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:26 msgid "" -"The course '%1' has already been archived at '%2'. This earlier archive will " -"be erased. This cannot be undone." +"The current mode should be made clear by the information at the top of the " +"page." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementEditor.html.ep:46 +msgid "" +"The current value of the achievement counter. Changes to this variable will " +"be saved." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:369 +#: /opt/webwork/webwork2/conf/defaults.config:1897 msgid "The default display mode" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:293 +#: /opt/webwork/webwork2/conf/defaults.config:1757 msgid "" "The default number of attempts before the problem is re-randomized. ( 0 => " "never )" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:292 +#: /opt/webwork/webwork2/conf/defaults.config:1756 msgid "" "The default number of attempts between re-randomization of the problems ( 0 " "=> never)" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:251 -msgid "The directory you specified doesn't exist" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:73 +msgid "" +"The description shown to students which states what action is needed to earn " +"the achievement." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:1853 -msgid "The display was already cleared." +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:5 +msgid "The directory you specified doesn't exist" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:422 +#: /opt/webwork/webwork2/conf/defaults.config:2032 msgid "" "The e-mail verbosity level controls how much information is automatically " -"added to feedback e-mails. Levels are
    1. Simple: send " -"only the feedback comment and context link
    2. Standard: " -"as in Simple, plus user, set, problem, and PG data
    3. " -"Debug: as in Standard, plus the problem environment (debugging data)
    " +"added to feedback e-mails. Levels are
    1. Simple: send only the " +"feedback comment and context link
    2. Standard: as in Simple, plus " +"user, set, problem, and PG data
    3. Debug: as in Standard, plus the " +"problem environment (debugging data)
    " msgstr "" -#. ($achievementName, $self->shortPath($outputFilePath) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm:624 -msgid "The evaluator for %1 has been renamed to '%2'." +#. ($achievementName, $c->shortPath($outputFilePath) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm:293 +msgid "The evaluator for %1 has been renamed to \"%2\"." msgstr "" -#. ($emailDirectory, $openfilename) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:372 -msgid "" -"The file %1/%2 already exists and cannot be overwritten. The message was not " -"saved" +#. ($c->shortPath($c->{inputFilePath}) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:246 +msgid "The file \"%1\" cannot be found." msgstr "" -#. ($emailDirectory, $openfilename) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:195 -msgid "The file %1/%2 cannot be found." +#. ($c->shortPath($editFilePath) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:526 +msgid "The file \"%1\" cannot be read!" msgstr "" -#. ($emailDirectory, $openfilename) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:186 -msgid "The file %1/%2 is not readable by the webserver." +#. ($c->shortPath($editFilePath) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:522 +msgid "The file \"%1\" is a directory!" msgstr "" -#. ($self->shortPath($inputFilePath) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:372 -msgid "The file '%1' cannot be found." +#. ($c->shortPath($c->{inputFilePath}) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:259 +msgid "" +"The file \"%1\" is a template. You may use \"Save As\" to create a new file." msgstr "" -#. ($self->shortPath($editFilePath) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1005 -msgid "The file '%1' cannot be read!" +#. ($c->shortPath($c->{inputFilePath}) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:250 +msgid "" +"The file \"%1\" is protected. You may use \"Save As\" to create a new file." msgstr "" -#. ($self->shortPath($inputFilePath) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:379 -msgid "The file '%1' is a blank problem!" +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/view.html.ep:19 +msgid "The file $file does not appear to be a text or image file." msgstr "" -#. ($self->shortPath($editFilePath) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:999 -msgid "The file '%1' is a directory!" +#. ("$emailDirectory/$output_file") +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:277 +msgid "" +"The file %1 already exists and cannot be overwritten. The message was not " +"saved." msgstr "" -#. ($self->shortPath($inputFilePath) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:374 -msgid "The file '%1' is protected!" +#. ("$emailDirectory/$openfilename", $emailDirectory) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:156 +msgid "" +"The file %1 cannot be found. Check whether it exists and whether the " +"directory %2 can be read by the webserver. " +msgstr "" + +#. ($outputFilePath) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:594 +msgid "" +"The file %1 is not contained in the course templates directory and can not " +"be modified." +msgstr "" + +#. ("$emailDirectory/$openfilename") +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:148 +msgid "" +"The file %1 is not readable by the webserver. Check that it's permissions " +"are set correctly." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:596 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:203 msgid "The file does not appear to be a text file" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:95 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:88 msgid "The file you are trying to download doesn't exist" msgstr "" #. ($filename) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Feedback.pm:288 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Feedback.pm:221 msgid "The filetype of the attached file \"%1\" is not allowed." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:3756 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2149 msgid "The following courses were successfully hidden:" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:3821 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2218 msgid "The following courses were successfully unhidden:" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:4056 -msgid "The following upgrades are available for your WeBWorK system:" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorScoring.html.ep:34 +msgid "The following describes how the checkboxes alter the scoring output" msgstr "" -#. (CGI::b(join(", ", @unassignedUsers) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:2065 +#. (tag('b', join(', ', @$unassignedUsers) +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:66 msgid "" "The following users are NOT assigned to this set and will be ignored: %1" msgstr "" -#. (join('.', @{$problemSeqs[$children_counts_indexs[0]]}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:2033 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:288 +msgid "The given file path is not a valid location." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementEditor.html.ep:49 +msgid "The goal value of the achievement counter." +msgstr "" + +#. (join('.', @{ $problemSeqs[ $children_counts_indexs[0] ] }) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1334 msgid "" "The grade for this problem is the larger of the score for this problem, or " "the score of problem %1." msgstr "" -#. (join(', ', map({join('.', @{$problemSeqs[$_]}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:2035 +#. (join(', ', map({ join('.', @{ $problemSeqs[$_] }) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1344 msgid "" "The grade for this problem is the larger of the score for this problem, or " "the weighted average of the problems: %1." msgstr "" -#. ($setName, $self->shortPath($outputFilePath) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1924 -msgid "The hardcopy header for set %1 has been renamed to '%2'." +#. ($c->{setID}, $c->shortPath($outputFilePath) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1078 +msgid "The hardcopy header for set %1 has been renamed to \"%2\"." +msgstr "" + +#. ($showHintsAfter) +#: /opt/webwork/webwork2/templates/ContentGenerator/Problem/messages.html.ep:36 +msgid "" +"The hint shown is an instructor preview and will be shown to students after " +"%quant(%1,attempt)." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Problem/messages.html.ep:32 +msgid "" +"The hint shown is an instructor preview and will not be shown to students." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/ProblemSets.html.ep:22 +msgid "" +"The information box on the right displays information about the course. This " +"is useful for leaving course wide messages for students. It contains text " +"from the file templates/course_info.txt. Instructors can edit this file from " +"the web (click on the \"Edit\" link)." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SingleProblemGrader.pm:111 +#: /opt/webwork/webwork2/templates/HTML/SingleProblemGrader/grader.html.ep:30 msgid "" "The initial value is the answer sub score for the answer that is currently " "shown. If this is modified, it will be used to compute the total problem " @@ -6086,189 +8528,349 @@ msgid "" "shown answer if the page is reloaded." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SingleProblemGrader.pm:161 +#: /opt/webwork/webwork2/templates/HTML/SingleProblemGrader/grader.html.ep:97 +msgid "" +"The initial value is the currently saved score as a point value computed " +"using the percent score. This point value is used to compute the percent " +"score (rounded to a whole percent) that can be saved." +msgstr "" + +#: /opt/webwork/webwork2/templates/HTML/SingleProblemGrader/grader.html.ep:145 msgid "The initial value is the currently saved score for this student." msgstr "" #. ($rename_oldCourseID, $rename_oldCourseInstitution, $rename_newCourseInstitution) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1408 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:696 msgid "" "The institution associated with the course %1 has been changed from %2 to %3" msgstr "" -#. ($rename_newCourseID, $rename_newCourseInstitution) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1461 +#. ($rename_newCourseID, $optional_arguments{courseInstitution}) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:729 msgid "The institution associated with the course %1 is now %2" msgstr "" #. ($userID) -#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:607 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvantage.pm:599 +msgid "" +"The instructor account with user id %1 does not exist. Instructor accounts " +"must be created manually." +msgstr "" + +#. ($userID) +#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:635 msgid "" "The instructor account with user id %1 does not exist. Please create the " "account manually via WeBWorK." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:4047 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:87 +msgid "" +"The key maps that are available are \"default\", \"emacs\", \"sublime\", and " +"\"vim\". The \"default\" key map has the standard behavior of a browser text " +"area. You can use Ctrl-C to copy, Ctrl-V to paste, Ctrl-F to search, etc. If " +"you are more comfortable with the \"emacs\", \"sublime\", or \"vim\" text " +"editors then you may choose to use one of those key maps instead." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:75 +msgid "The large text window" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:27 +msgid "" +"The list of files include regular files, directories (ending in a \"/\") and " +"links (ending in a \"@\")." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:52 +msgid "" +"The login name cannot be changed. (It is the primary key for the student's " +"data.) If you make a mistake in the login name at the beginning of the " +"course (before any work has been done) then it is best to simply add a new " +"student with the correct entry and drop the student with the bad login name. " +"(See drop and delete students below.) If the login name must be changed " +"after a user has started working assignments, then contact your system " +"administrator, who can use the webwork2 \"bin/change_user_id\" script to " +"change the user id." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorStats.html.ep:20 +msgid "" +"The main page allows access to set and student statistics. When selecting a " +"student, their grades page is shown, which lists set totals and per problem " +"grades for each set assigned to the student. When selecting a set, various " +"statistics and histograms are shown for the overall grades of students who " +"are currently enrolled or auditing the course." +msgstr "" + +#. ('href="http://webwork.maa.org/wiki" target="ww_wiki"', 'href="http://webwork.maa.org/wiki/Instructors" target="ww_wiki"') +#: /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:24 msgid "" -"The library index is older than the library, you need to run OPL-update." +"The main page for WeBWorK documentation is the webwork wiki while " +"specific help for instructors setting up a course are in the instructors' section." msgstr "" -#. ($r->param('new_set_name') -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:1923 +#. ($c->param('new_set_name') +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:569 msgid "" -"The name '%1' is not a valid set name. Use only letters, digits, -, _, and ." +"The name \"%1\" is not a valid set name. Use only letters, digits, dashes, " +"underscores, periods, and spaces." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:132 +#: /opt/webwork/webwork2/conf/defaults.config:1432 msgid "" "The name of course information file (located in the templates directory). " "Its contents are displayed in the right panel next to the list of homework " "sets." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:455 +#: /opt/webwork/webwork2/conf/LTIConfigValues.config:26 msgid "The name of the LMS" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:456 +#: /opt/webwork/webwork2/conf/LTIConfigValues.config:28 msgid "" "The name of the LMS. This is used in messages to users that direct them to " "go back to the LMS to access something in the WeBWorK course." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:63 +msgid "The number of points earned for earning the achievement." +msgstr "" + #. ($openDate, $dueDate, $answerDate) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1935 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1104 msgid "" "The open date: %1, close date: %2, and answer date: %3 must be defined and " "in chronological order." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:702 +#. ($path) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:393 +msgid "The original path is not in a valid location. Using failsafe %1" +msgstr "" + +#. ($forcedSourceFile) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:510 +msgid "The original path to the file is %1." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:262 msgid "The password and password confirmation for the instructor must match." msgstr "" -#. (CGI::b($r->maketext("[_1]'s Current Password", $user_name) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Options.pm:133 +#: /opt/webwork/webwork2/templates/HelpFiles/Options.html.ep:27 +msgid "" +"The password can be any combination of letters, numbers and special symbols. " +"Students are encouraged to use all three, and stay away from dictionary " +"words. The password should not be the same as any password used elsewhere, " +"such as for an email account. The password will only be present on the page " +"if the user has permission to change the password." +msgstr "" + +#. ($c->tag( 'b', $c->maketext( "[_1]'s Current Password", $c->{user}->first_name . ' ' . $c->{user}->last_name) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Options.pm:95 msgid "" "The password you entered in the %1 field does not match your current " "password. Please retype your current password and try again." msgstr "" -#. (CGI::b($r->maketext("[_1]'s New Password", $e_user_name) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Options.pm:117 +#. ($c->tag('b', $c->maketext("[_1]'s New Password", $e_user_name) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Options.pm:82 msgid "" "The passwords you entered in the %1 and %2 fields don't match. Please retype " "your new password and try again." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:790 -msgid "The path to the original file should be absolute" +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:374 +msgid "The path can not be the temporary edit directory." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Stats.pm:686 -msgid "The percentage of active students with correct answers for each problem" +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:370 +msgid "The path to the original file should be absolute." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Stats.pm:746 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:131 msgid "" "The percentage of students receiving at least these scores. The median score " "is in the 50% column." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1888 -msgid "The problem set is not yet open" +#. ($setName) +#: /opt/webwork/webwork2/lib/WeBWorK/Authz.pm:458 +msgid "The prerequisite conditions have not been met for set '%1'." msgstr "" -#. ($recScore, $totPossible) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1998 -msgid "The recorded score for this version is %1/%2." +#. (q(down menu to change which student's seed and answers are shown. Use the "Mark Correct" checkbox to set) +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemGrader.html.ep:26 +msgid "" +"The problem is shown at the top with the seed and answers of the selected " +"student. Use the drop " msgstr "" -#. ($recScore, $totPossible) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:2007 -msgid "The recorded score for this version is %1/%2." +#: /opt/webwork/webwork2/templates/ContentGenerator/Problem/submit_buttons.html.ep:62 +msgid "The problem set is not yet open" msgstr "" #. ($origReducedScoringDate) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1948 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1121 msgid "" "The reduced credit date %1 in the file probably was generated from the Unix " "epoch 0 value and is being treated as if it was Unix epoch 0." msgstr "" #. ($openDate, $dueDate) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1959 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1135 msgid "" "The reduced credit date should be between the open date %1 and close date %2" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1201 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1220 msgid "" "The reduced scoring date should be between the open date and close date." msgstr "" -#. (join('.',@seq) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:2056 +#. ($tempFile) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:298 +msgid "The requested file \"%1\" does not exist on the server." +msgstr "" + +#. (join('.', @seq) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1389 msgid "The score for this problem can count towards score of problem %1." msgstr "" -#. ($setName, $effectiveUser) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:327 -msgid "The selected problem set (%1) is not a valid set for %2" +#. ('courseName_totals.csv') +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:69 +msgid "" +"The scoring files are stored in the scoring directory and are produced using " +"the \"Scoring Tools\" page or the scoring command in the \"Instructor " +"Tools\" module. These files can be downloaded, modified in a spreadsheet " +"(for example, to add midterm scores) and then uploaded again to the scoring " +"directory to be merged with email messages. (Use a new file name, other than " +"%1, when uploading to prevent the scoring module from overwriting an " +"uploaded file.)" msgstr "" -#. ($urlpath->arg("setID") -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1468 -msgid "The selected problem set (%1) is not a valid set for %2%3:" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorSetMaker.html.ep:52 +msgid "" +"The second row of the problem collection area is for browsing directories. " +"The OPL will be there as well as any other directories that you may set up " +"(for example Contrib). If this is selected, all subdirectories containing " +"problems will be listed." msgstr "" -#. ($setName, $self->shortPath($outputFilePath) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1916 -msgid "The set header for set %1 has been renamed to '%2'." +#. (stash('setID') +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet.html.ep:13 +msgid "The selected problem set (%1) is not a valid set for %2." +msgstr "" + +#. ($setID, $effectiveUserID, $c->{invalidVersionCreation} ? " (acted as by $userID) +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:77 +msgid "The selected problem set (%1) is not a valid set for %2: %3" +msgstr "" + +#. ($c->{setID}, $c->shortPath($outputFilePath) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1066 +msgid "The set header for set %1 has been renamed to \"%2\"." msgstr "" -#. ($newSetName) #. ($newSetID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1141 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:1935 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:491 +msgid "" +"The set name \"%1\" is already in use. Pick a different name if you would " +"like to start a new set. No set created." +msgstr "" + +#. ($newSetName) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:584 msgid "" "The set name '%1' is already in use. Pick a different name if you would " "like to start a new set." msgstr "" -#. ($setID, $editingSetVersion, $editForUser[0]) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:2093 -msgid "The set-version (%1, version %2) is not assigned to user %3." +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:58 +msgid "" +"The sets checked below will be visible to students or hidden from students. " +"Useful for preparing sets ahead of time, but not showing them to students; " +"or for temporarily hiding a set which has a mistake in it while it is being " +"fixed." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:54 +msgid "" +"The sets checked below will become available for editing the due dates and " +"visibility." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:73 +msgid "" +"The sets checked below will written to set definition files, to be saved for " +"future use, or to be transferred to another course. The set definition files " +"can be uploaded/downloaded using the \"File Manager\"." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/AdminAddCourse.html.ep:29 +msgid "" +"The simple configuration file is the name of the configuration file created " +"when using the \"Course Configuration\" page to configure course options. " +"This option sets if this configuration file is copied from the old course or " +"not and instead use the server defaults." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:551 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:521 msgid "The solution has been removed." msgstr "" -#. ($fullSetName, $prettyProblemNumber, $self->shortPath($sourceFilePath) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1945 +#: /opt/webwork/webwork2/templates/ContentGenerator/Problem/messages.html.ep:45 +#: /opt/webwork/webwork2/templates/ContentGenerator/ShowMeAnother/messages.html.ep:33 +msgid "" +"The solution shown is an instructor preview and will only be shown to " +"students after the due date." +msgstr "" + +#. ($c->{fullSetID}, $c->{prettyProblemNumber}, $c->shortPath($c->{sourceFilePath}) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1103 +msgid "" +"The source file for \"set %1 / problem %2\" has been changed from \"%3\" to " +"\"%4\"." +msgstr "" + +#. ($c->{tempFilePath}) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1209 +msgid "" +"The temporary file %1 is not contained in the course templates directory and " +"can not be deleted." +msgstr "" + +#. ($c->{tempFilePath}) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:689 msgid "" -"The source file for 'set %1 / problem %2 has been changed from '%3' to '%4'" +"The temporary file %1 is not in the course templates directory and can not " +"be deleted!" msgstr "" -#. ($versionNumber) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:2119 +#. ($setVersionID) +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:349 msgid "The test (which is version %1) may no longer be submitted for a grade." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1897 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1042 msgid "" "The text box now contains the source of the original problem. You can " "recover lost edits by using the Back button on your browser." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/LoginProctor.pm:217 +#. ( % . 'but the result will not be counted.') +#: /opt/webwork/webwork2/templates/ContentGenerator/LoginProctor.html.ep:23 msgid "" "The time limit on this assignment was exceeded. The assignment may be " -"checked, but the result will not be counted." +"checked, " msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:195 +#: /opt/webwork/webwork2/conf/defaults.config:1559 msgid "" "The time of the day that the assignment is due. This can be changed on an " "individual basis, but WeBWorK will use this value for default when a set is " @@ -6276,24 +8878,39 @@ msgid "" msgstr "" #. ($rename_oldCourseID, $rename_oldCourseTitle, $rename_newCourseTitle) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1406 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:689 msgid "The title of the course %1 has been changed from %2 to %3" msgstr "" -#. ($rename_newCourseID, $rename_newCourseTitle) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1454 +#. ($rename_newCourseID, $optional_arguments{courseTitle}) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:722 msgid "The title of the course %1 is now %2" msgstr "" +#: /opt/webwork/webwork2/templates/ContentGenerator/Grades/student_stats.html.ep:16 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:167 +msgid "" +"The top number is the percent score on the problem. A period (.) indicates " +"a problem has not been attempted. The bottom number is the number of " +"incorrect attempts." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/Grades.html.ep:25 +msgid "" +"The total grade row at the bottom shows the total score and percent average " +"over all open assignments. The total grade row can be shown/hidden under " +"general course configuration settings." +msgstr "" + #. ($enableReducedScoring) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1973 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1151 msgid "" "The value %1 for enableReducedScoring is not valid; it will be replaced with " "'N'." msgstr "" #. ($timeCap) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:2009 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1209 msgid "" "The value %1 for the capTimeLimit option is not valid; it will be replaced " "with '0'." @@ -6301,165 +8918,168 @@ msgstr "" #. ($hideScore) #. ($hideScoreByProblem) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1995 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:2000 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1178 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1189 msgid "" "The value %1 for the hideScore option is not valid; it will be replaced with " "'N'." msgstr "" #. ($hideWork) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:2005 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1200 msgid "" "The value %1 for the hideWork option is not valid; it will be replaced with " "'N'." msgstr "" #. ($relaxRestrictIP) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:2022 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1235 msgid "" "The value %1 for the relaxRestrictIP option is not valid; it will be " "replaced with 'No'." msgstr "" #. ($restrictIP) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:2014 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1221 msgid "" "The value %1 for the restrictIP option is not valid; it will be replaced " "with 'No'." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:413 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:46 +msgid "The visible name/title of the achievement." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin.html.ep:36 msgid "" "The webwork server must be able to write to these directories. Please " "correct the permssion errors." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:137 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:83 +msgid "Theme" +msgstr "" + +#: /opt/webwork/webwork2/conf/defaults.config:1439 msgid "Theme (refresh page after saving changes to reveal new theme.)" msgstr "" +#: /opt/webwork/webwork2/templates/HTML/CodeMirrorEditor/controls.html.ep:5 +msgid "Theme:" +msgstr "" + # Context is "Sort by ____ Then by _____" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:754 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:826 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:855 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/sort_form.html.ep:17 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/sort_form.html.ep:17 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/sort_form.html.ep:30 msgid "Then by" msgstr "" -#. ($count_line) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:639 +#. ($listingsCount) +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/browse_library_panel_advanced.html.ep:116 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/browse_library_panel_simple.html.ep:52 msgid "There are %1 matching WeBWorK problems" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:171 +#: /opt/webwork/webwork2/conf/defaults.config:1527 msgid "" "There are currently two hardcopy themes to choose from: One Column and Two " "Columns. The Two Columns theme is the traditional hardcopy format. The One " "Column theme uses the full page width for each column" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1217 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2119 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2781 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2895 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1519 msgid "" -"There are extra database fields which are not defined in the schema for at " -"least one table. They can only be removed manually from the database." +"There are extra database fields which are not defined in the schema for at " +"least one table." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2116 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2778 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2892 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_confirm.html.ep:23 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/rename_course_confirm.html.ep:23 msgid "" -"There are extra database tables which are not defined in the schema. They " -"can only be removed manually from the database." +"There are extra database fields which are not defined in the schema for at " +"least one table. They can be removed when upgrading the course." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1214 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1404 msgid "" -"There are extra database tables which are not defined in the schema. They " -"can only be removed manually from the database. They will not be renamed." +"There are extra database fields which are not defined in the schema for at " +"least one table. Check the checkbox by the field to delete it when upgrading " +"the course. Warning: Deletion destroys all data contained in the field and " +"is not undoable!" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:637 -msgid "There are no matching WeBWorK problems" +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1508 +msgid "There are extra database tables which are not defined in the schema." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:1009 -msgid "There are no set definition files in this course to look at." +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1389 +msgid "There are extra database tables which are not defined in the schema. " msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2125 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_confirm.html.ep:15 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/rename_course_confirm.html.ep:15 msgid "" -"There are tables or fields missing from the database. The database must be " -"upgraded before archiving this course." +"There are extra database tables which are not defined in the schema. These " +"can be deleted when upgrading the course." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:4021 -msgid "There are upgrades available for the Open Problem Library." +#: /opt/webwork/webwork2/templates/HelpFiles/Hardcopy.html.ep:29 +msgid "There are many options available at the bottom:" msgstr "" -#. ($PGBranch, $PGRemote) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:3985 -msgid "" -"There are upgrades available for your current branch of PG from branch %1 in " -"remote %2." +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:49 +msgid "There are no completed versions of this test." msgstr "" -#. ($WeBWorKBranch, $WeBWorKRemote) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:3923 -msgid "" -"There are upgrades available for your current branch of WeBWorK from branch " -"%1 in remote %2." +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/browse_library_panel_advanced.html.ep:115 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/browse_library_panel_simple.html.ep:51 +msgid "There are no matching WeBWorK problems" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/browse_setdef_panel.html.ep:8 +msgid "There are no set definition files in this course to look at." msgstr "" #. ($achievementID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementUserEditor.pm:271 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementUserEditor.html.ep:87 msgid "" "There is NO undo for this function. Do not use it unless you know what you " "are doing! When you unassign a student using this button, or by unchecking " "their name, you destroy all of the data for achievement %1 for this student." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UsersAssignedToSet.pm:233 +#. (tag('span', dir => 'ltr', format_set_name_display($setID) +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UsersAssignedToSet.html.ep:91 msgid "" "There is NO undo for this function. Do not use it unless you know what you " "are doing! When you unassign a student using this button, or by unchecking " -"their name, you destroy all of the data for homework set $setID for this " -"student." +"their name, you destroy all of the data for homework set %1 for this student." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetsAssignedToUser.pm:207 -msgid "" -"There is NO undo for this function. Do not use it unless you know what you " -"are doing! When you unassign sets using this button, or by unchecking their " -"set names, you destroy all of the data for those sets for this student." +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserDetail.html.ep:68 +msgid "There is NO undo for unassigning a set." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserDetail.pm:234 -msgid "There is NO undo for unassigning a set." +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserDetail.html.ep:125 +msgid "" +"There is NO undo for unassigning sets. Do not do so unless you know what you " +"are doing! When you unassign sets by unchecking set names and clicking " +"save, you destroy all of the data for those sets for this student." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementUserEditor.pm:174 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Assigner.pm:172 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UsersAssignedToSet.pm:138 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementUserEditor.html.ep:16 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Assigner.html.ep:58 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UsersAssignedToSet.html.ep:21 msgid "There is NO undo for unassigning students." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:3982 -msgid "There is a new version of PG available." -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:3920 -msgid "There is a new version of WeBWorK available." -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:529 -msgid "There is a written solution available." +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:490 +msgid "There is a written solution available." msgstr "" #. ($message_file, $merge_file) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Grades.pm:103 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Grades.pm:50 msgid "" "There is no additional grade information. A message about additional grades " "can go in [TMPL]/email/%1. It is merged with the file [Scoring]/%2. These " @@ -6467,183 +9087,324 @@ msgid "" "in the left margin." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:4037 -msgid "" -"There is no library tree file for the library, you will need to run OPL-" -"update." -msgstr "" - #. ($continueTimeLeft) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:512 +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:25 msgid "" "There is no time remaining on the currently open test. Click continue below " "and then click \"Grade Test\" within %1 seconds to submit the test for a " "grade." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:854 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/delete.html.ep:65 msgid "There is no undo for deleting files or directories!" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:534 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:495 msgid "" "There is no written solution available for this problem, but you can still " "view the correct answers." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:537 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:498 msgid "There is no written solution available for this problem." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:138 -msgid "" -"There is one main theme to choose from: math4. It has two variants, math4-" -"green and math4-red. The theme specifies a unified look and feel for the " -"WeBWorK course web pages." -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator.pm:2236 +#: /opt/webwork/webwork2/conf/defaults.config:1441 msgid "" -"There may be something wrong with this question. Please inform your " -"instructor including the warning messages below." +"There is one main theme to choose from: math4. It has three variants: math4-" +"green, math4-red, and math4-yellow. The theme specifies a unified look and " +"feel for the WeBWorK course web pages." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:429 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:441 msgid "" "There was an error during the login process. Please speak to your " "instructor or system administrator if this recurs." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:182 -#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:290 -#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:313 -#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:342 -#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:481 -#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:490 -#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:517 -#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:549 -#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIBasic.pm:228 -#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIBasic.pm:345 -#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIBasic.pm:397 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:174 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:294 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:318 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:354 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:492 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:502 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:536 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:575 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvantage.pm:172 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvantage.pm:189 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvantage.pm:201 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvantage.pm:212 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvantage.pm:227 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvantage.pm:238 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvantage.pm:331 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvantage.pm:355 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvantage.pm:365 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvantage.pm:402 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvantage.pm:447 msgid "" "There was an error during the login process. Please speak to your " "instructor or system administrator." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:338 +#. ('href="https://webwork.maa.org/wiki/Set_Definition_Files" target="Webworkdocs"') +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:48 +msgid "" +"These are stored in the templates directory. The format of Set " +"Definition files is described in the Set Definition " +"specification. Set definition files are mainly useful for transferring " +"set assignments from one course to another and are created when exporting a " +"problem set from the \"Hmwk Sets Editor\". Each set defintion file contains " +"a list of problems used and the dates and times. These definitions can be " +"imported into the current course." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:77 +msgid "" +"These are the files from which problems are generated and are located in the " +"templates directory or in subdirectories. They can be edited directly using " +"the \"Edit\" link on each problem page or from the \"Hmwk Sets Editor\". The " +"File Manager allows you to upload or download these files. \tDirectories " +"that start with \"set\" contain pg files and are generated when exporting a " +"problem set in which there are local versions of a problem." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/Options.html.ep:40 +msgid "" +"These options will only be shown if the user has the permission to change " +"display settings used in pg problems." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/Levels.html.ep:44 +msgid "" +"These problems require some application of algorithms, but do not rise to " +"the level of a full word problem. For example, \"Identify the local extrema " +"for f(x) = ...\". One has to apply algorithms and interpret results." +msgstr "" + +#: /opt/webwork/webwork2/conf/defaults.config:1837 msgid "" "These users and higher get the \"Show Past Answers\" button on the problem " "page." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UsersAssignedToSet.pm:132 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UsersAssignedToSet.html.ep:17 msgid "This action can take a long time if there are many students." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementUserEditor.pm:168 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementUserEditor.html.ep:12 msgid "This action will not overwrite existing users." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:102 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:20 +msgid "" +"This allows for the viewing, downloading, uploading and other management of " +"files in the course. Select a file or set of files (using CTRL or SHIFT) " +"and click the desired button on the right. Many actions can only be done " +"with a single file (like view). Selecting a directory or set of files and " +"clicking \"Make Archive\" creates a compressed tar file with the name " +"COURSE_NAME.tgz" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorSetMaker.html.ep:34 +msgid "" +"This browses the Open Problem Library (OPL) in category (Subject/Chapter/" +"Section) form. Select the desired categories (all three do not need to be " +"selected) and click \"View Problems\". If the \"Include Contrib\" box is " +"selected then those problems in the Contrib section of the OPL that have the " +"categories defined are also included. Contrib problems are problem that " +"haven't been vetted as thoroughly as OPL problems. If you want hints or " +"solutions included while browsing select the appropriate box." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:49 +msgid "" +"This button is also present both at top and the bottom of the page. Discards " +"all changes, reloading the page by re-reading the database information for " +"this set." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:39 +msgid "" +"This button is present both at top and the bottom of the page. Any and all " +"changes made to any part of the set will be saved with one important " +"exception: When editing the set for one or more students, you can choose to " +"override the default value (defined for the set in general) by clicking on " +"the checkbox and providing a value (or possibly leaving blank) and checking " +"the override checkbox. If you do NOT check the checkbox, " +"the override value will be discarded and the default value for the set will " +"be used for the users currently being edited." +msgstr "" + +#: /opt/webwork/webwork2/templates/HTML/SingleProblemGrader/grader.html.ep:105 +msgid "" +"This can computed from the answer sub scores above using the weights shown " +"if they are modified. Alternatively, enter the point score you want saved " +"here (the above sub scores will be ignored)." +msgstr "" + +#: /opt/webwork/webwork2/conf/defaults.config:2005 +msgid "" +"This configures if the single problem manual grader has inputs to enter " +"problem scores as a percent, a point value, or both. Note, the problem score " +"is always saved as a percent, so when using a point value, the problem score " +"will be rounded to the nearest whole percent." +msgstr "" + +#. (tag('b', maketext('Guest Login') +#: /opt/webwork/webwork2/templates/ContentGenerator/Login.html.ep:72 msgid "" "This course supports guest logins. Click %1 to log into this course as a " "guest." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:861 -msgid "This homework set contains no problems." +#: /opt/webwork/webwork2/templates/HelpFiles/Options.html.ep:58 +msgid "" +"This determines if MathQuill answer blanks are enable for the user. This " +"option is only present if MathQuill is enabled for the course." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1959 -msgid "This homework set is closed." +#: /opt/webwork/webwork2/templates/HelpFiles/Options.html.ep:63 +msgid "" +"This determines if the MathView equation editor button will be appended to " +"text answer blanks. his option is only present if MathView is enabled for " +"the course." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1957 -msgid "This homework set is not yet open." +#: /opt/webwork/webwork2/templates/HelpFiles/Options.html.ep:52 +msgid "" +"This determines whether or not saved past answers are automatically filled " +"in to the problem form when a student returns to a problem after having left " +"the problem. This option is only visible if the user has the permission to " +"show old answers." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:933 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:85 msgid "" -"This is a blank problem template file and can not be edited directly. Use " -"the 'NewVersion' action below to create a local copy of the file and add it " -"to the current problem set." +"This directory is accessible from the web. You can use it to store html " +"documents or image documents that are used by the course. Do not store " +"private information in this directory or in any subdirectory thereof. These " +"documents can be linked to from within problems using the htmlLink macro." msgstr "" -#: /opt/webwork/pg/macros/problemRandomize.pl:407 -msgid "This is a new (re-randomized) version of the problem." +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:255 +msgid "This file is a template. You may use \"Save As\" to create a new file." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:106 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementUserEditor.html.ep:20 msgid "" -"This is a table showing the current Homework sets for this class. The " -"fields from left to right are: Edit Set Data, Edit Problems, Edit Assigned " -"Users, Visibility to students, Reduced Credit Enabled, Date it was opened, " -"Date it is due, and the Date during which the answers are posted. The Edit " -"Set Data field contains checkboxes for selection and a link to the set data " -"editing page. The cells in the Edit Problems fields contain links which " -"take you to a page where you can edit the containing problems, and the cells " -"in the edit assigned users field contains links which take you to a page " -"where you can edit what students the set is assigned to." +"This form can assign, unassign, and edit user data for a single " +"achievement. You can assign the achievement to all current users or select " +"which users to assign the achievement to and click Save. You can unassign " +"the achievement by unchecking a student's name (note all data will be " +"deleted). To unassign the achievement from all users, first select \"Allow " +"unassign\" and then click the \"Unassign from All Users\" button. You can " +"also toggle the earned status with the checkbox in the \"Earned\" column and " +"edit the achievement counter for counting achievements." msgstr "" -#. ($hours, $minutes) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:609 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:19 +msgid "" +"This gives the status and dates of the main set. Indvidual students may have " +"different settings." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/problem_list.html.ep:51 +msgid "This homework set contains no problems." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1231 +msgid "This homework set is closed." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1229 +msgid "This homework set is not yet open." +msgstr "" + +#: /opt/webwork/pg/macros/deprecated/problemRandomize.pl:423 +msgid "This is a new (re-randomized) version of the problem." +msgstr "" + +#. ($hours, $minutes) +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:109 msgid "" "This is a timed test. You will have %quant(%1,hour) and %quant(%2,minute) to " "complete the test." msgstr "" -#. ($hours, $minutes) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:620 +#. ($hours, $minutes) +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:119 msgid "" "This is a timed test. You will have %quant(%1,hour,hours,)%quant(%2,minute," "minutes,) to complete the test." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:100 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:81 +msgid "" +"This is done by first entering the user as a student and then changing the " +"permission level of the user. First edit the user by clicking on the pencil " +"next to their name (or using the technique above for several users), then " +"change their permssion level -- an entry blank at the far right of the " +"screen, you may have to scroll to see it. The permission levels are" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:156 +msgid "" +"This is done from the \"Hmwk Sets Editor\" or from the \"Instructor Tools\" " +"page if you wish to assign a homework set to all students or a large group " +"of students (e.g. a section)." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:161 +msgid "" +"This is done from the \"Hmwk Sets Editor\" or from the \"Instructor Tools\" " +"page." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:171 +msgid "" +"This is done from the \"Hmwk Sets Editor\" page or the \"Instructor tools\" " +"page." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:71 +msgid "" +"This is most easily done by importing a class list. The class list can be " +"uploaded from your workstation to the server using the File Manager page. " +"The class list must be a file ending in .lst and must have a specific format. Once the file has " +"been uploaded to the server the file will appear in the import action pop-up " +"list (5th action). demoCourse.lst is available for most courses and adds the " +"\"practice users\" which activate guest logins to the class list." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:23 msgid "" -"This is the Achievement Editor. It is used to edit the achievements " -"available to students. Please keep in mind the following facts: Achievments " -"are displayed, and evaluated, in the order they are listed. The \"secret\" " -"category creates achievements which are not visible to students until they " -"are earned. The \"level\" category is used for the achievements associated " -"to a users level." +"This is the administration course which is used to manage courses on this " +"server. Use the \"Admin Menu\" to select the desired action." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:98 +#: /opt/webwork/webwork2/conf/defaults.config:1996 msgid "" -"This is the classlist editor page, where you can view and edit the records " -"of all the students currently enrolled in this course. The top of the page " -"contains forms which allow you to filter which students to view, sort your " -"students in a chosen order, edit student records, give new passwords to " -"students, import/export student records from/to external files, or add/" -"delete students. To use, please select the action you would like to " -"perform, enter in the relevant information in the fields below, and hit the " -"\"Take Action!\" button at the bottom of the form. The bottom of the page " -"contains a table containing the student usernames and their information." +"This is the default number of attempts a student must make before hints will " +"be shown to the student. Set this to -1 to hide hints. Note that this can " +"be overridden with a per problem setting." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:96 +#: /opt/webwork/webwork2/conf/defaults.config:1712 msgid "" -"This is the homework sets editor page where you can view and edit the " -"homework sets that exist in this course and the problems that they contain. " -"The top of the page contains forms which allow you to filter which sets to " -"display in the table, sort the sets in a chosen order, edit homework sets, " -"publish homework sets, import/export sets from/to an external file, score " -"sets, or create/delete sets. To use, please select the action you would " -"like to perform, enter in the relevant information in the fields below, and " -"hit the \"Take Action!\" button at the bottom of the form. The bottom of " -"the page contains a table displaying the sets and several pieces of relevant " -"information." +"This is the default number of attempts before show me another becomes " +"available to students. It can be set to -1 to disable show me another by " +"default." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:220 +#: /opt/webwork/webwork2/conf/defaults.config:1601 msgid "" "This is the number of achievement points given to each user for completing a " "problem." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SingleProblemGrader.pm:166 +#: /opt/webwork/webwork2/templates/HTML/SingleProblemGrader/grader.html.ep:150 msgid "" "This is the only part of the score that is actually saved. This is computed " "from the answer sub scores above using the weights shown if they are " @@ -6651,135 +9412,313 @@ msgid "" "scores will be ignored)." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:110 +#: /opt/webwork/webwork2/templates/HelpFiles/ProblemSets.html.ep:19 +msgid "This is the standard entry point for the course." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:92 +msgid "" +"This is where email messages and templates are saved. You can upload or " +"download files in this directory if you wish to save the files for later." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:77 +msgid "" +"This is where you edit the text of the problem template. Type Ctrl-Enter " +"while this window has focus to re-render the problem." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:669 +msgid "" +"This is your last submission. If you say yes, then your answers will be " +"final, and you will not be able to continue to work this test version." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:673 msgid "" -"This is the past answer viewer. Students can only see their answers, and " -"they will not be able to see which parts are correct. Instructors can view " -"any users answers using the form below and the answers will be colored " -"according to correctness." +"This is your only submission. If you say yes, then your answers will be " +"final, and you will not be able to continue to work this test version." msgstr "" -#: /opt/webwork/pg/macros/PGbasicmacros.pl:3038 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:42 +msgid "" +"This link gives details for many macros. It links to documentation embedded " +"in the macro files themselves." +msgstr "" + +#. ('PGMLLab/PGML-lab.pg') +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:63 +msgid "" +"This links to a WeBWorK \"problem\" which allows you to try out fragments of " +"PGML code. This link will not be available if the file %1 is not located in " +"the templates directory of the course." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:33 +msgid "This links to a list of problem authoring techniques." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:39 +msgid "This links to a page describing Math Object usage." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:72 +msgid "This links to problem authoring information on the WeBWorK wiki." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/Options.html.ep:46 +msgid "" +"This may be Mathjax, images, or plainText. Only the options that are enabled " +"for the course will be available to select. This option is only visible if " +"there is more than one display mode enabled for the course." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorSetMaker.html.ep:42 +msgid "This option shows all pg problems in the course directory structure." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorSetMaker.html.ep:47 +msgid "" +"This option shows all problems in set definition files that are located in " +"the course directory." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorSetMaker.html.ep:44 +msgid "" +"This option shows all problems in sets that have been created in the course." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:20 +msgid "" +"This page allows one to edit the contents of PG problem files as well as set " +"headers and other files." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/Options.html.ep:20 +msgid "" +"This page allows users to change their password, email address, and display " +"settings used in problems. Note that you can hide this page entirely for " +"students by setting permission levels to login_proctor or higher for the " +"permissions to change password, change e-mail address, and change display " +"settings used in pg problems." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorConfig.html.ep:20 +msgid "" +"This page allows you to configure course settings such as permission levels, " +"display modes allowed, default display mode, email feedback behavior, and " +"much more." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/Achievements.html.ep:20 +msgid "" +"This page displays a student's current achievement level and progress toward " +"the next level, and lists the rewards and badges that the student has " +"earned. If rewards have been earned, then the student may also redeem those " +"rewards." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:26 +msgid "" +"This page gives access to information about the student, independent of the " +"homework sets assigned to them." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorLTIUpdate.html.ep:20 +msgid "" +"This page gives information about mass LTI grade updates, and allows you to " +"trigger a grade update for all users and all sets, all sets for one user, " +"all users for one set, or one user for one set. When a user is selected, " +"the sets drop down menu is updated to only allow selecting sets assigned the " +"selected user. Similarly when a set is selected, the user menu is updated " +"to only allow selecting valid users." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorIndex.html.ep:20 +msgid "" +"This page is a collection of tools to modify users and sets. These tools " +"are short cuts for common actions that allow selecting multiple users or " +"sets to act on at once. Because multiple users and sets can be acted on at " +"the same time, it is often more efficient to use this page when modifying " +"multiple items. For example, after selecting several users and a set you " +"can change the close date for all selected users for that set. This page " +"also gives access to \"View/Edit all sets for one user\", which can be used " +"to access settings for all sets including test versions for that user." +msgstr "" + +#. (q(table to save any changes. Each student's name links to that student's problem and opens up the) +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemGrader.html.ep:20 +msgid "" +"This page is for manually grading a problem for all assigned students. The " +"table of students shows their last answers, percent score, and feedback " +"comment. The \"Save\" button is located below the " +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorSetMaker.html.ep:20 +msgid "" +"This page is used to browse problems that will be used to fill problem sets. " +"The first step is to choose which set you are working on. If you need to " +"create a new problem set fill in the blank next to the \"Create a New Set in " +"This Course\" button and then press the button. Then choose which set you " +"want to work on in the drop down menu." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorStudentProgress.html.ep:20 +msgid "" +"This page is useful for monitoring student progress on assignments. Student " +"progress can either be viewed for a single set or for a single student." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:20 +msgid "" +"This page manages all of the homework sets (including quizzes/tests). The " +"following allow editing directly of a single problem set." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/Grades.html.ep:20 +msgid "" +"This page shows the student's current grades for all sets they are assigned " +"to. Only visible sets are shown to the student, while invisible set names " +"are italic when viewed as an instructor. Students can only see the per " +"problem grades on open assignments." +msgstr "" + +#: /opt/webwork/pg/macros/core/PGbasicmacros.pl:3169 msgid "This problem contains a video which must be viewed online." msgstr "" -#: /opt/webwork/pg/macros/compoundProblem.pl:602 +#: /opt/webwork/pg/macros/core/compoundProblem.pl:631 msgid "This problem has more than one part." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:2030 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:2264 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1323 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1576 msgid "" "This problem has open subproblems. You can visit them by using the links to " "the left or visiting the set page." msgstr "" +#: /opt/webwork/webwork2/templates/ContentGenerator/Problem.html.ep:66 +msgid "This problem is not valid." +msgstr "" + #. ($prettyID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:2575 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:399 msgid "This problem uses the same source file as number %1." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:537 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:418 msgid "This problem will not count towards your grade." msgstr "" -#. ($EMAIL) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:1120 +#. ($ur->email_address) +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/preview.html.ep:1 msgid "This sample mail would be sent to %1" msgstr "" -#. (join('.',@seq) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:2059 +#. (join('.', @seq) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1399 msgid "" "This score for this problem does not count for the score of problem %1 or " "for the set." msgstr "" -#. ($message_file, $merge_file) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Grades.pm:172 +#. ($message_file, $merge_file) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Grades.pm:127 msgid "" "This scoring message is generated from [TMPL]/email/%1. It is merged with " "the file [Scoring]/%2. These files can be edited using the \"Email\" link " "and the \"File Manager\" link in the left margin." msgstr "" -#. (CGI::strong($setID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:2196 +#. (tag('strong', dir => 'ltr', format_set_name_display($setID) +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:155 msgid "This set %1 is assigned to %2." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:2877 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:678 msgid "This set doesn't contain any problems yet." msgstr "" -#. ($beginReducedScoringPeriod, $dueDate, $reducedScoringPerCent) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:368 +#. ($c->formatDateTime($reduced_scoring_date) +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/set_status.html.ep:44 msgid "" "This set had a reduced scoring period that started on %1 and ended on %2. " "During that period all work counted for %3% of its value." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/LoginProctor.pm:269 +#: /opt/webwork/webwork2/templates/ContentGenerator/LoginProctor.html.ep:78 msgid "" "This set has a set-level proctor password to authorize logins. Enter the " "password below." msgstr "" -# Context is "This set is visible" or "This set is hidden" -#. (CGI::span({class=>$visiblityStateClass}, $visiblityStateText) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:531 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:69 -msgid "This set is %1" +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:411 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:59 +msgid "This set is hidden from students." msgstr "" #. ($reducedScoringPerCent) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:364 +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/set_status.html.ep:40 msgid "" "This set is in its reduced scoring period. All work counts for %1% of its " "value." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemGrader.pm:190 -msgid "This set needs to be assigned to you before you can grade it." +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:51 +msgid "This set is not assigned to any students." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:159 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:410 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:57 +msgid "This set is visible to students." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:42 +msgid "This set or problem is not valid." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:164 msgid "" "This set will be unavailable to students until they have earned a certain " -"score on the sets specified in this field. The sets should be written as a " -"comma separated list. The minimum score required on the sets is specified " -"in the following field." +"score on the sets specified in this field. The sets should be written as a " +"comma separated list. The minimum score required on the sets is specified in " +"the following field." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:235 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:111 msgid "" -"This sets whether the Reduced Scoring system will be enabled. If enabled " -"you will need to set the default length of the reduced scoring period and " -"the value of work done in the reduced scoring period below.

    To use " -"this, you also have to enable Reduced Scoring for individual assignments and " -"set their Reduced Scoring Dates by editing the set data.

    This works with " -"the avg_problem_grader (which is the the default grader) and the " -"std_problem_grader (the all or nothing grader). It will work with custom " -"graders if they are written appropriately." +"This should be done cautiously. Once a student is deleted from a course " +"their data is lost forever and cannot be recovered. They can be added to the " +"course as a new student, but all of their homework set assignments and " +"homework has been permanently deleted." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1991 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1962 msgid "This source file does not exist!" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1990 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1961 msgid "This source file is a directory!" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1992 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1963 msgid "This source file is not a plain file!" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1989 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1960 msgid "This source file is not readable!" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:359 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:413 +msgid "" +"This specifies the number of attempts before hints are shown to students. " +"The value of -2 uses the default from course configuration. The value of -1 " +"disables hints. Note that this will only have an effect if the problem has a " +"hint." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:430 msgid "" "This specifies the rerandomization period: the number of attempts before a " "new version of the problem is generated by changing the Seed value. The " @@ -6787,360 +9726,515 @@ msgid "" "disables rerandomization." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:204 -msgid "" -"This table lists the available homework sets for this class, along with " -"their current status. Click on the name of the homework set to view the " -"problems in that homework set. You can also select sets to download in PDF " -"or TeX format by checking the checkboxes next to the problem set names, and " -"then click on the \"Generate Hardcopy for Selected Sets\" button at the end " -"of the table. There is also a clear button and an Email Instructor button " -"at the end of the table." -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:677 -msgid "" -"This table lists the current attempts for this test/quiz, along with its " -"status, score, start date, and close date. Click on the version link to " -"access that version. " -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:802 -msgid "" -"This table shows the problems that are in this problem set. The columns " -"from left to right are: name of the problem, current number of attempts " -"made, number of attempts remaining, the point worth, and the completion " -"status. Click on the link on the name of the problem to take you to the " -"problem page." -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:655 -msgid "This test is closed." -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:571 +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:81 msgid "This test requires a proctor password to continue." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:628 +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:126 msgid "This test requires a proctor password to start." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator.pm:2214 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator.pm:2289 +#: /opt/webwork/webwork2/templates/HelpFiles/Hardcopy.html.ep:45 +msgid "This will determine if the output is in one or two columns." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/error_output.html.ep:21 +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/warning_output.html.ep:21 msgid "Time" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:238 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:249 msgid "Time Interval for New Test Versions (min; 0=infty)" msgstr "" -#. ($elapsedTime,$allowed) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:2104 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:159 +msgid "Time Remaining" +msgstr "" + +#. ($c->{elapsedTime}, sprintf('%.0f', 10 * ($c->{set}->due_date - $c->{set}->open_date) +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:336 msgid "Time taken on test: %1 min (%2 min allowed)." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ShowAnswers.pm:222 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ShowAnswers.pm:220 msgid "Timestamp" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:163 +#: /opt/webwork/webwork2/conf/defaults.config:1512 msgid "Timezone for the course" msgstr "" -#. (sprintf("%.0f",$restriction) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:504 +#. (sprintf('%.0f', $restriction) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:330 msgid "To access this set you must score at least %1% on set %2." msgstr "" -#. (sprintf("%.0f",$restriction) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:506 +#. (sprintf('%.0f', $restriction) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:336 msgid "" "To access this set you must score at least %1% on the following sets: %2." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:539 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:53 msgid "" "To add an additional instructor to the new course, specify user information " "below. The user ID may contain only numbers, letters, hyphens, periods " "(dots), commas,and underscores." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:512 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:42 msgid "" "To add the WeBWorK administrators to the new course (as administrators) " "check the box below." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserDetail.pm:239 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:118 +msgid "" +"To assign one or more sets to an individual student click in the column " +"\"Assigned Sets\" in the student's row. This will take you to a page where " +"you can assign and unassign homework sets and change the due dates for " +"homework on an individual basis." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserDetail.html.ep:79 msgid "" "To change status (scores or grades) for this student for one set, click on " "the individual set link." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:621 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:106 +msgid "" +"To copy the templates and html folders from an existing course, select the " +"course below." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:102 msgid "" -"To copy problem templates from an existing course, select the course below." +"To drop a student or students, select them for editing as described above " +"and then set the pop-up list to enrolled,drop, or audit. Dropped students " +"cannot log in to the course, are not assigned new homework sets and are not " +"sent e-mail. They can be re-enrolled simply by changing their status back to " +"enrolled. No data is lost, any homework sets assigned before they were " +"dropped are restored unchanged." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:2161 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:143 msgid "" "To edit a specific student version of this set, edit (all of) her/his " "assigned sets." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:375 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:29 msgid "" -"To edit this text you must first make a copy of this file using the " -"'NewVersion' action below." +"To perform an action select the desired action tab and click the submit " +"button." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/DuplicateProb.pm:90 +msgid "To this Problem" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:380 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorScoring.html.ep:69 msgid "" -"To edit this text you must use the 'NewVersion' action below to save it to " -"another file." +"To use the Email merge feature, upload a CSV with calculated grades to the " +"scoring directory using the \"File Manager\"." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems.pm:1296 -msgid "To this Problem" +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:767 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/import_form.html.ep:48 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/set_list_field.html.ep:14 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserDetail/set_date_table.html.ep:58 +msgid "Today" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Scoring.pm:252 +#: /opt/webwork/webwork2/templates/HelpFiles/Hardcopy.html.ep:33 +msgid "Toggle each of the options to include or not include in the output." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Stats.pm:522 +msgid "Top Score" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:118 +msgid "Top level of author information on the wiki." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:114 +msgid "Total Points" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Achievements/cheevobigbox.html.ep:18 +msgid "Total Points:" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Scoring.html.ep:90 msgid "Totals" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:276 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:290 msgid "Totals only (not problem scores)" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:276 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:291 msgid "Totals only, only after answer date" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:584 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:236 msgid "Transfer" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Config.pm:213 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Config.pm:234 +#: /opt/webwork/pg/macros/parsers/parserPopUp.pl:284 +#: /opt/webwork/webwork2/lib/WeBWorK/ConfigObject/boolean.pm:22 +#: /opt/webwork/webwork2/lib/WeBWorK/ConfigObject/boolean.pm:35 msgid "True" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:1309 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/problem_row.html.ep:245 msgid "Try it" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems.pm:226 +#: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/ExtendDueDate.pm:26 msgid "Tunic of Extension" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:114 +#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:86 msgid "Two Columns" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:1461 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/edit_table.html.ep:30 msgid "Type" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator.pm:2216 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator.pm:2291 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:84 +msgid "Type:" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/error_output.html.ep:29 +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/warning_output.html.ep:23 msgid "URI" msgstr "" #. ($achievementName) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm:626 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm:297 msgid "Unable to change the evaluator for set %1. Unknown error." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:818 +#. ($c->{setID}) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1084 +msgid "Unable to change the hardcopy header for set %1. Unknown error." +msgstr "" + +#. ($c->{setID}) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1070 +msgid "Unable to change the set header for set %1. Unknown error." +msgstr "" + +#. ($c->{fullSetID}, $c->{prettyProblemNumber}) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1110 +msgid "" +"Unable to change the source file path for set %1, problem %2. Unknown error." +msgstr "" + +#. ($c->shortPath($delFilePath) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1246 +msgid "Unable to delete backup file \"%1\"." +msgstr "" + +#. ($formatBackupTime) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:571 +msgid "Unable to delete backup from %1." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:888 +msgid "Unable to make \"%1\" the hardcopy header for %2." +msgstr "" + +#. ($c->shortPath($sourceFilePath) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:860 +msgid "Unable to make \"%1\" the set header for %2." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:693 msgid "Unable to obtain error messages from within the PG question." msgstr "" -#. ($self->shortPath($outputFilePath) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm:395 -msgid "Unable to write to '%1': %2" +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:275 +msgid "Unable to open a temporary file at the given location." +msgstr "" + +#. ($c->shortPath($backupFilePath) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1233 +msgid "Unable to read backup file \"%1\"." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2533 +#. ($c->shortPath($outputFilePath) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm:193 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:636 +msgid "Unable to write to \"%1\": %2" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/unarchive_course_confirm.html.ep:15 msgid "Unarchive" msgstr "" #. ($unarchive_courseID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2516 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/unarchive_course_confirm.html.ep:4 msgid "Unarchive %1 to course:" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2371 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2451 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2501 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:381 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/unarchive_course_confirm.html.ep:1 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/unarchive_course_form.html.ep:3 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/unarchive_course_form.html.ep:46 +#: /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:40 msgid "Unarchive Course" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2595 -msgid "Unarchive Next Course" +#: /opt/webwork/webwork2/templates/HelpFiles/AdminUnarchiveCourse.html.ep:17 +msgid "Unarchive Course Help" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/admin_links.html.ep:25 +msgid "Unarchive Courses" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetsAssignedToUser.pm:216 -msgid "Unassign All Sets" +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1306 +msgid "Unarchive Next Course" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementUserEditor.pm:279 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UsersAssignedToSet.pm:241 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementUserEditor.html.ep:92 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UsersAssignedToSet.html.ep:97 msgid "Unassign from All Users" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Assigner.pm:178 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Assigner.html.ep:61 msgid "Unassign selected sets from selected users" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Assigner.pm:58 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Assigner.pm:57 msgid "" -"Unassignments were not done. You need to both click to \"Allow unassign\" " -"and click on the Unassign button." +"Unassignments were not done. You need to select \"Allow unassign\" and then " +"click on the Unassign button." msgstr "" #. ($unattempted, $num_of_problems) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1030 +#: /opt/webwork/webwork2/templates/ContentGenerator/Problem/siblings.html.ep:44 msgid "Unattempted: %1/%2" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:53 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:37 msgid "Unclassified Problems" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/AttemptsTable.pm:262 +#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:242 msgid "Ungraded" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:3636 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:3678 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/hide_inactive_course_form.html.ep:39 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/hide_inactive_course_form.html.ep:58 msgid "Unhide Courses" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems.pm:1418 +#. ($saveMode) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1151 +msgid "Unkown saveMode: %1." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/AddNewTestGW.pm:28 msgid "" -"Unlock an additional version of a Gateway Test. If used before the close " -"date of the Gateway Test this will allow you to generate a new version of " -"the test." +"Unlock an additional version of a test. If used before the close date of " +"the test this will allow you to generate a new version of the test." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:164 -msgid "Unpack" +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager.html.ep:45 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:47 +msgid "Unpack Archive" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:456 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:113 msgid "Unpack archives automatically" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2634 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/upgrade_course_form.html.ep:15 msgid "Unselect all courses" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:129 -msgid "Update" +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:63 +msgid "Update Display" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:616 -msgid "Update Display" +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/LTIUpdate.html.ep:84 +msgid "Update Grades" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:964 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/LTIUpdate.html.ep:27 +msgid "Update Interval" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/browse_library_panel_advanced.html.ep:102 msgid "Update Menus" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:724 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:761 -msgid "Update settings and refresh page" +#. ($prettySetID) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/LTIUpdate.pm:51 +msgid "Update aborted. Invalid set %1." +msgstr "" + +#. ($userID) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/LTIUpdate.pm:47 +msgid "Update aborted. Invalid user %1." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2614 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/LTIUpdate.html.ep:67 +msgid "Update set:" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/upgrade_course_form.html.ep:8 msgid "Update the checked directories?" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:3457 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/LTIUpdate.html.ep:50 +msgid "Update user:" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1908 msgid "Updated location description." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2668 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2760 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2820 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/upgrade_course_confirm.html.ep:47 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/upgrade_course_form.html.ep:40 msgid "Upgrade" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1290 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2199 +#. ($upgrade_courseID) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1373 +msgid "Upgrade %1" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_confirm.html.ep:97 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/rename_course_confirm.html.ep:79 msgid "Upgrade Course Tables" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2612 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2690 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:382 +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/admin_links.html.ep:26 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/upgrade_course_confirm.html.ep:1 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/upgrade_course_form.html.ep:59 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/upgrade_course_form.html.ep:7 +#: /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:42 msgid "Upgrade Courses" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2923 +#: /opt/webwork/webwork2/templates/HelpFiles/AdminUpgradeCourses.html.ep:17 +msgid "Upgrade Courses Help" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:43 +msgid "Upgrade courses from a previous version of WeBWorK." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1582 msgid "Upgrade process completed" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:167 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:386 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager.html.ep:37 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:65 msgid "Upload" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:178 -msgid "Use Date Picker" +#: /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:72 +msgid "" +"Upload, download and delete text files, including scoring spread sheets, set " +"definition files, class list spread sheets, and \"PG\" problems." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:2408 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:292 msgid "Use Default Header File" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Options.pm:386 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Options.pm:413 +#: /opt/webwork/webwork2/templates/ContentGenerator/Options.html.ep:127 msgid "Use Equation Editor?" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Achievements.pm:257 -msgid "Use Item" +#: /opt/webwork/webwork2/templates/ContentGenerator/Achievements/achievement_items.html.ep:20 +msgid "Use Reward" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:2666 -msgid "Use System Default" -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:556 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/preview.html.ep:27 msgid "Use browser back button to return from preview mode." msgstr "" -#. (CGI::b("$achievementID") -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm:510 +#. (tag('b', $c->{achievementID}) +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementEditor/save_as_form.html.ep:16 msgid "Use in achievement %1" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm:526 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementEditor/save_as_form.html.ep:23 msgid "Use in new achievement:" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Options.pm:440 +#: /opt/webwork/webwork2/templates/ContentGenerator/Options.html.ep:149 msgid "Use live equation rendering?" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:386 +#: /opt/webwork/webwork2/conf/defaults.config:1929 msgid "Use log base 10 instead of base e" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:392 +#: /opt/webwork/webwork2/conf/defaults.config:1935 msgid "Use older answer checkers" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:302 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:123 +msgid "" +"Use the \"Create\" and \"Delete\" actions to create or delete achievements. " +"Note that deleting an achievement will delete all data associated to the " +"achievement and cannot be undone." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorSendMail.html.ep:35 +msgid "" +"Use the \"Merge file\" drop down menu to select which merge file to use, or " +"select \"None\" to not use any merge file. When a merge file is selected, " +"the data for active students will be displayed above the \"Email Body\". " +"This will show you the structure of the merge file and the column variables " +"associated with each column. Data that is longer than 7 characters will be " +"truncated, and the data can be scrolled up and down to see all rows." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorIndex.html.ep:28 +msgid "" +"Use the \"Users\" and \"Sets\" forms to select which users and sets to act " +"on. Multiple items can be selected using ctrl-click or shift-click. The " +"action buttons are grouped into three categories. The first is a set of " +"actions that act on the selected users, the second is a set of actions that " +"act on the selected sets, and the third is a set of actions for acting on a " +"combination of sets and users. If an invalid number of users or sets are " +"selected, the action will not be preformed, and an error message will be " +"placed on the page." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementEditor.html.ep:25 +msgid "" +"Use the editor to edit the evaluator and the action form at the bottom to " +"save the evaluator. You can either overwrite the current evaluator file or " +"save as a new evaluator file." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:15 msgid "" "Use the interface below to quickly access commonly-used instructor tools, or " "select a tool from the list to the left." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Feedback.pm:369 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorSetMaker.html.ep:26 +msgid "" +"Use the options in the second box to pick a collection of problems decribed " +"below. In each case, clicking \"View Problems\" will render a fixed number " +"of problems (default of 20). After problems are shown, there will be options " +"to show the next/previous batch of problems, add all problems to the target " +"set (set at the top of the page) or clear the curent batch of problems." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Feedback.html.ep:27 msgid "" "Use this form to ask your instructor a question, to report a problem with " "the WeBWorK system, or to report an error in a problem you are attempting. " @@ -7148,98 +10242,136 @@ msgid "" "system will be included." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:29 +msgid "Use this page to change your password." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorSendMail.html.ep:20 +msgid "" +"Use this page to send emails to active (enrolled or auditing) students. " +"Emails can be sent to all active students or selected students. Use the " +"\"Students\" form to sort, filter, or format how the user name is " +"displayed. Click \"Change Display Settings\" to apply any changes. Use " +"control-click or shift-click to select multiple students to email." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:67 +msgid "" +"Used for \"counting\" achievements, which sets the value a counter must " +"reach in order to earn the achievement. For example this is used counting " +"the number of completed problems." +msgstr "" + +#. (param('user') +#. (param('effectiveUser') +#: /opt/webwork/webwork2/templates/ContentGenerator/Options.html.ep:2 +#: /opt/webwork/webwork2/templates/ContentGenerator/Options.html.ep:7 +msgid "User \"%1\" not found." +msgstr "" + #. ($userID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:781 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:324 msgid "" -"User '%1' will not be copied from admin course as it is the initial " +"User \"%1\" will not be copied from admin course as it is the initial " "instructor." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:557 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ShowAnswers.pm:219 -msgid "User ID" +#. ($userID) +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserDetail.html.ep:34 +msgid "User %1 not found." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/URLPath.pm:291 -msgid "User Settings" +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ShowAnswers.pm:217 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:64 +msgid "User ID" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:490 -msgid "User Values" +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:230 +#: /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:28 +msgid "User Settings" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetsAssignedToUser.pm:52 -msgid "User has been assigned to all current sets." +#: /opt/webwork/webwork2/templates/HelpFiles/Options.html.ep:17 +msgid "User Settings Help" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetsAssignedToUser.pm:58 -msgid "User has been unassigned from all sets." +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:576 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserDetail/set_date_table.html.ep:13 +msgid "User overrides" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/LoginProctor.pm:250 +#: /opt/webwork/webwork2/templates/ContentGenerator/LoginProctor.html.ep:62 msgid "User's name is:" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetsAssignedToUser.pm:68 -msgid "User's sets have been reassigned." -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/LoginProctor.pm:249 +#: /opt/webwork/webwork2/templates/ContentGenerator/LoginProctor.html.ep:60 msgid "User's username is:" msgstr "" #. ($user, $setID, $j) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1045 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1074 msgid "" "UserProblem missing for user=%1 set=%2 problem=%3. This may indicate " "database corruption." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Login.pm:222 +#: /opt/webwork/webwork2/templates/ContentGenerator/Login.html.ep:51 msgid "Username" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:435 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:1471 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Assigner.pm:126 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:336 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ShowAnswers.pm:401 +#: /opt/webwork/webwork2/templates/ContentGenerator/Hardcopy/form.html.ep:18 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Assigner.html.ep:23 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:27 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ShowAnswers/instructor-selectors.html.ep:9 msgid "Users" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/URLPath.pm:376 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:339 msgid "Users Assigned to Set %2" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:1992 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUsersAssignedToSet.html.ep:17 +msgid "Users Assigned to Set Help" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/user_list.html.ep:65 msgid "Users List" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:333 +#: /opt/webwork/webwork2/conf/defaults.config:1827 +msgid "" +"Users at this level and higher are allowed to change display settings used " +"in pg problems.Note that if it is expected that there will be students that " +"have vision impairments and MathQuill is enabled to assist with answer " +"entry, then you should not set this permission to a level above student as " +"those students may need to disable MathQuill." +msgstr "" + +#: /opt/webwork/webwork2/conf/defaults.config:1817 msgid "" "Users at this level and higher are allowed to change their e-mail address. " "Normally guest users are not allowed to change the e-mail address since it " "does not make sense to send e-mail to anonymous accounts." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:309 +#: /opt/webwork/webwork2/conf/defaults.config:1781 msgid "" "Users at this level and higher are allowed to change their password. " "Normally guest users are not allowed to change their password." msgstr "" -#. ($names{$primary}, $names{$secondary}, $names{$ternary}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:907 +#. ($c->maketext(FIELD_PROPERTIES() +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:316 msgid "Users sorted by %1, then by %2, then by %3" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:328 +#: /opt/webwork/webwork2/conf/defaults.config:1808 msgid "" "Users with at least this permission level get a link in the left panel for " -"reporting bugs to the bug tracking system in Rochester" +"reporting bugs to the bug tracking system at bugs.webwork.maa.org." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:437 +#: /opt/webwork/webwork2/conf/defaults.config:2051 msgid "" "Users with this permssion level or greater will automatically be sent " "feedback from students (generated when they use the \"Contact instructor\" " @@ -7248,147 +10380,222 @@ msgid "" "permission level to \"nobody\"." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:1378 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:1394 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/problem_row.html.ep:183 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/problem_row.html.ep:193 msgid "Uses Math Objects" msgstr "" -#. ($default_msg_file) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:202 -msgid "Using contents of the default message %1 instead." -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1231 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor/view_form.html.ep:18 msgid "Using what display mode?" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1215 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor/hardcopy_form.html.ep:5 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor/view_form.html.ep:6 msgid "Using what seed?" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:239 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor/hardcopy_form.html.ep:19 +msgid "Using which hardcopy format?" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor/hardcopy_form.html.ep:49 +msgid "Using which hardcopy theme?" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/Levels.html.ep:31 +msgid "" +"Usually means students must demonstrate understanding of facts. This is more " +"than regurgitating the fact. We use this category for simple and direct " +"applications of algorithms the student has studied. There should be no " +"judgement involved in choosing the method. This would include a simple " +"application of a rule for differentiation (e.g., can combine rules for sums " +"and constant multiples with one more advanced rule) or for integrals." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:103 +msgid "Value" +msgstr "" + +#: /opt/webwork/webwork2/conf/defaults.config:1649 msgid "Value of work done in Reduced Scoring Period" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Config.pm:687 -msgid "Variable Documentation:" +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Config/config_help.html.ep:20 +msgid "Variable Documentation" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:115 +msgid "Version" msgstr "" #. ($ver->{version}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:706 +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:173 msgid "Version %1" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:2043 +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:159 +msgid "Versions" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:43 msgid "Versions of a set can only be edited for one user at a time." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:157 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:361 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:127 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:2394 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:2702 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager.html.ep:29 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:38 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:275 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:528 msgid "View" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:1032 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:484 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:516 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:592 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:713 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:982 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/view_problems_line.html.ep:6 msgid "View Problems" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Options.pm:337 +#: /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:57 +msgid "View details of student perofrmance either by individual or by set." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Options.html.ep:86 msgid "View equations as" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Stats.pm:239 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats.html.ep:18 msgid "View statistics by set" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Stats.pm:244 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats.html.ep:19 msgid "View statistics by student" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:245 +#: /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:55 +msgid "" +"View statistics of students' performance on homework either by individual or " +"by set." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress.html.ep:14 msgid "View student progress by set" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:250 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress.html.ep:15 msgid "View student progress by student" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:379 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:448 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:115 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:65 msgid "View/Edit" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:2335 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:245 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:90 -msgid "Viewing temporary file:" +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:120 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:104 +msgid "View/Reload" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:745 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:769 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:792 +#: /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:31 +msgid "View/access current and archived courses." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:146 +msgid "Viewing Problems in a New Window" +msgstr "" + +#. ($c->{problem}->source_file) +#. ($screenSetHeader) +#. ($course_info_path) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1611 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:81 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:109 +msgid "Viewing temporary file: %1" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:318 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/sort_form.html.ep:11 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/sort_form.html.ep:25 msgid "Visibility" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:427 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:893 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/publish_form.html.ep:21 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/set_list_table.html.ep:7 msgid "Visible" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1418 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:622 msgid "Visible sets were selected for export." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:129 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:133 msgid "Visible to Students" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator.pm:2235 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:842 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/delete.html.ep:7 msgid "Warning" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator.pm:2285 +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/warning_output.html.ep:13 +#: /opt/webwork/webwork2/templates/RPCRenderFormats/default.html.ep:117 msgid "Warning messages" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1017 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:1018 +#: /opt/webwork/webwork2/lib/HardcopyRenderedProblem.pm:259 +msgid "Warning messages:" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/delete_form.html.ep:3 +msgid "Warning: Deletion destroys all set-related data and is not undoable!" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/delete_form.html.ep:3 msgid "Warning: Deletion destroys all user-related data and is not undoable!" msgstr "" -#. ($problem_desc , CGI::br() -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1340 +#. ($problem_desc, $c->tag('br') +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1194 msgid "Warnings encountered while processing %1. Error text: %2" msgstr "" -#. ($copyright_years,$theme, $ww_version, $pg_version) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator.pm:1185 -msgid "WeBWorK © %1| theme: %2 | ww_version: %3 | pg_version %4|" +#: /opt/webwork/webwork2/templates/HelpFiles/Levels.html.ep:39 +msgid "" +"We use this for carrying out more complicated algorithms, such as " +"derivatives using both the product and chain rule or integrals which involve " +"say both a substitution and parts." +msgstr "" + +#. ($ce->{WW_COPYRIGHT_YEARS} || '1996-2023', $ce->{defaultTheme} || 'unknown -- set defaultTheme in localOverides.conf', $ce->{WW_VERSION} || 'unknown -- set WW_VERSION in VERSION', $ce->{PG_VERSION} || 'unknown -- set PG_VERSION in ../pg/VERSION') +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/footer.html.ep:9 +msgid "WeBWorK © %1 | theme: %2 | ww_version: %3 | pg_version %4" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator.pm:2198 +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/error_output.html.ep:3 msgid "WeBWorK Error" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator.pm:2283 +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/warning_output.html.ep:3 msgid "WeBWorK Warnings" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:145 +#: /opt/webwork/webwork2/conf/defaults.config:1451 +msgid "" +"WeBWorK currently has translations for the languages listed in the course " +"configuration." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorScoring.html.ep:20 +msgid "" +"WeBWorK does not have a full featured scoring ability. We leave that to your " +"favorite spreadsheet application." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:38 msgid "" -"WeBWorK currently has translations for four languages: \"English en\", " -"\"Turkish tr\", \"Spanish es\", and \"French fr\" " +"WeBWorK expects many files to be in certain locations. The following " +"describe this. Note that by default the File Manager shows the \"templates\" " +"directory. Other directories mentioned below are at the same level and need " +"to be accessed by going up a directory by clicking the \"^\" button above " +"the file list." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:92 +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/error_output.html.ep:6 msgid "" "WeBWorK has encountered a software error while attempting to process this " "problem. It is likely that there is an error in the problem itself. If you " @@ -7397,7 +10604,7 @@ msgid "" "more information." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator.pm:2284 +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/warning_output.html.ep:6 msgid "" "WeBWorK has encountered warnings while processing your request. If this " "occured when viewing a problem, it was likely caused by an error or " @@ -7407,19 +10614,19 @@ msgid "" "warning output below for more information." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:577 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:558 msgid "" "WeBWorK was unable to generate a different version of this problem. Close " "this tab, and return to the original problem." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:313 +#: /opt/webwork/webwork2/templates/ContentGenerator/Hardcopy.html.ep:29 msgid "" "WeBWorK was unable to generate a paper copy of this homework set. Please " -"inform your instructor. " +"inform your instructor." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:483 +#: /opt/webwork/webwork2/conf/LTIConfigValues.config:76 msgid "" "WeBWorK will automatically create users when logging in via the LMS for the " "first time. If this flag is enabled then it will also keep the user account " @@ -7429,77 +10636,145 @@ msgid "" "next time the user logs in." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:321 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:370 msgid "Weight" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Home.pm:85 +#: /opt/webwork/webwork2/templates/ContentGenerator/Home.html.ep:6 msgid "Welcome to WeBWorK!" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems.pm:1366 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorScoring.html.ep:24 +msgid "" +"What WeBWorK does have is good support for summarizing the scores on WeBWorK " +"homework sets and tests and exporting them in a form (.csv) which any " +"spreadsheet can use. WeBWorK reports all of the homework grades with options " +"shown below." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/Surprise.pm:27 msgid "What could be inside?" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:698 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/filter_form.html.ep:17 msgid "What field should filtered users match on?" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:347 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:397 msgid "" "When a student has more attempts than is specified here they will be able to " "view another version of this problem. If set to -1 the feature is disabled " "and if set to -2 the course default is used." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:323 +#: /opt/webwork/webwork2/conf/defaults.config:1801 msgid "" "When acting as a student, this permission level and higher can submit " "answers for that student." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:416 +#: /opt/webwork/webwork2/conf/defaults.config:1972 +msgid "" +"When numerical answers are checked, most test if the student's answer is " +"close enough to the programmed answer be computing the error as a percentage " +"of the correct answer. This value controls the default for how close the " +"student answer has to be in order to be marked correct.

    A value such as " +"0.1 means 0.1 percent error is allowed.

    " +msgstr "" + +#: /opt/webwork/webwork2/conf/defaults.config:2019 msgid "" "When students click the Email Instructor button to send feedback, " "WeBWorK fills in the subject line. Here you can set the subject line. In " "it, you can have various bits of information filled in with the following " -"escape sequences.

    • %c = course ID
    • %u = user ID
    • %s = set " -"ID
    • %p = problem ID
    • %x = section
    • %r = recitation
    • %% = literal " -"percent sign
    " +"escape sequences.

    • %c = course ID
    • %u = user ID
    • %s = " +"set ID
    • %p = problem ID
    • %x = section
    • %r = recitation
    • %% = literal percent sign
    " +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:35 +msgid "" +"When the class is very large not all students will be displayed. Using the " +"first action on this page you can show only the students from a given " +"recitation or from a given section, or only students whose login or last " +"name fits a pattern match. The second action will sort the students " +"currently being displayed. You can also sort the displayed students by " +"clicking on the active links at the top of each column." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorSendMail.html.ep:56 +msgid "" +"When the message is ready to send, click \"Send Email\". This will queue the " +"email to be sent, which can take several minutes depending on the number of " +"students selected. You will be notified by email once all the emails have " +"been sent." +msgstr "" + +#: /opt/webwork/webwork2/conf/defaults.config:1540 +msgid "" +"When this is on students will see a line on the Grades page which has their " +"total cumulative homework score. This score includes all sets assigned to " +"the student." +msgstr "" + +#: /opt/webwork/webwork2/conf/LTIConfigValues.config:88 +msgid "" +"When this is true, then when a user enters WeBWorK from an external tool " +"link in the LMS, the bottom of the screen will display the data that the LMS " +"passed to WeBWorK. This may be useful to debug LTI, especially because " +"different LMS systems have different parameters." +msgstr "" + +#: /opt/webwork/webwork2/conf/defaults.config:1859 +msgid "" +"When viewing a problem, WeBWorK usually puts the previously submitted answer " +"in the answer blank. Below this level, old answers are never shown. " +"Typically, that is the desired behaviour for guest accounts." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorStudentProgress.html.ep:30 +msgid "" +"When viewing progress for a single student, their grades page is shown which " +"lists set totals and per problem grades for each set assigned to the " +"student. This shows the same information as the statistics page for the " +"student." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:184 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorStats.html.ep:26 msgid "" -"When this is on students will see a line on the Grades page which has their " -"total cumulative homework score. This score includes all sets assigned to " -"the student." +"When viewing set statistics, the drop down menus can be used to show stats " +"for individual sections, recitations, or problems. The overall results " +"include all students who are assigned to the set, while the individual " +"problem results only include active (have attempted the problem) students." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:489 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorStudentProgress.html.ep:24 msgid "" -"When this is true, then when a user enters WeBWorK from an external tool " -"link in the LMS, the bottom of the screen will display the data that the LMS " -"passed to WeBWorK. This may be useful to debug LTI, especially because " -"different LMS systems have different parameters." +"When viewing student progress for a set, the score for the set and the " +"status for problems in the set are listed for all students. The table can " +"be sorted by clicking the links in the table header. Click the student's " +"name to access the student's set. When viewing progress for a test, " +"additional columns can be shown/hidden by updating the display at the top" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:355 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Assigner.html.ep:74 msgid "" -"When viewing a problem, WeBWorK usually puts the previously submitted answer " -"in the answer blank. Below this level, old answers are never shown. " -"Typically, that is the desired behaviour for guest accounts." +"When you unassign a set from students, you destroy all of the data for the " +"set for those students. If the set is re-assigned to these students, then " +"they will receive new versions of problems in the set. Make sure this is " +"what you want to do before unassigning sets from students." msgstr "" -#. (CGI::b($achievementID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementUserEditor.pm:178 +#. (tag('b', $achievementID) +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementUserEditor.html.ep:21 msgid "" "When you unassign by unchecking a student's name, you destroy all of the " "data for achievement %1 for this student. Make sure this is what you want to " "do." msgstr "" -#. (CGI::b($setID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UsersAssignedToSet.pm:145 +#. (tag('b', dir => 'ltr', format_set_name_display($setID) +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UsersAssignedToSet.html.ep:26 msgid "" "When you unassign by unchecking a student's name, you destroy all of the " "data for homework set %1 for this student. You will then need to reassign " @@ -7507,7 +10782,7 @@ msgid "" "problems. Make sure this is what you want to do before unchecking students." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserDetail.pm:244 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserDetail.html.ep:72 msgid "" "When you uncheck a homework set (and save the changes), you destroy all of " "the data for that set for this student. If you reassign the set, the " @@ -7515,1588 +10790,1678 @@ msgid "" "you want to do before unchecking sets." msgstr "" -#. ($self->formatDateTime($set->open_date,undef,$ce->{studentDateDisplayFormat}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:348 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:87 +msgid "Wiki summary page for MathObjects" +msgstr "" + +#. ($c->formatDateTime($set->open_date, undef, $ce->{studentDateDisplayFormat}) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Grades.pm:266 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Grades.pm:444 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:167 msgid "Will open on %1." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:812 +#: /opt/webwork/webwork2/templates/HelpFiles/Levels.html.ep:49 +msgid "Word problems" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/problem_list.html.ep:15 msgid "Worth" msgstr "" -#. ($self->shortPath($outputFilePath) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm:393 +#: /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:51 +msgid "Write a new PG problem file or edit an existing one." +msgstr "" + +#. ($c->shortPath($outputFilePath) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm:188 msgid "" -"Write permissions have not been enabled for '%1'. Changes must be saved to " +"Write permissions have not been enabled for \"%1\". Changes must be saved " +"to another file for viewing." +msgstr "" + +#. ($c->shortPath($outputFilePath) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:630 +msgid "" +"Write permissions have not been enabled for \"%1\". Changes must be saved to " "another file for viewing." msgstr "" -#. ($self->shortPath($currentDirectory) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm:391 +#. ($c->shortPath($currentDirectory) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm:182 +msgid "" +"Write permissions have not been enabled in \"%1\". Changes must be saved to " +"a different directory for viewing." +msgstr "" + +#. ($c->shortPath($currentDirectory) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:624 msgid "" -"Write permissions have not been enabled in '%1'. Changes must be saved to a " +"Write permissions have not been enabled in \"%1\".Changes must be saved to a " "different directory for viewing." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm:389 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm:178 msgid "" "Write permissions have not been enabled in the templates directory. No " "changes can be made." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:641 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:1378 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:134 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:144 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:381 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:409 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:2606 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:2607 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:2608 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Options.pm:374 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Options.pm:400 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Options.pm:427 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Options.pm:454 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:981 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:620 +msgid "" +"Write permissions have not been enabled in the templates directory. No " +"changes can be made." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:138 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:148 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:238 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:271 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:287 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:301 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:330 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:345 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:454 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:482 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:509 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:82 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:657 +#: /opt/webwork/webwork2/templates/ContentGenerator/Hardcopy/form.html.ep:137 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/default_table.html.ep:47 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/set_list_field.html.ep:39 +#: /opt/webwork/webwork2/templates/ContentGenerator/Options.html.ep:111 +#: /opt/webwork/webwork2/templates/ContentGenerator/Options.html.ep:133 +#: /opt/webwork/webwork2/templates/ContentGenerator/Options.html.ep:155 +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/problem_list_row.html.ep:67 msgid "Yes" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:500 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:454 msgid "" "You are currently checking answers to a different version of your problem - " "these will not be recorded, and you should remember to return to your " "original problem once you are done here." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:511 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:470 msgid "" "You are currently previewing answers to a different version of your problem " "- these will not be recorded, and you should remember to return to your " "original problem once you are done here." msgstr "" -#. ($userSet->set_id, $r->connection->remote_ip) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:257 +#. ($ce->{pg}{ansEvalDefaults}{reducedScoringValue} * 100) +#: /opt/webwork/webwork2/templates/ContentGenerator/Problem/messages.html.ep:18 +msgid "" +"You are in the Reduced Scoring Period. All work counts for %1% of the " +"original." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:183 +msgid "You are not allowed to act as a student." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:188 +msgid "You are not allowed to assign homework sets." +msgstr "" + +#. ($userID) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:383 +msgid "You are not allowed to delete %1." +msgstr "" + +#. ($userSet->set_id, $c->tx->remote_address) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:261 msgid "" "You are not allowed to generate a hardcopy for %1 from your IP address, %2." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Config.pm:673 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:2033 -msgid "You are not authorized to access the Instructor tools." +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:185 +msgid "You are not allowed to modify homework sets." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:191 +msgid "You are not allowed to modify student data." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Feedback.html.ep:4 +msgid "You are not allowed to send e-mail." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail.html.ep:8 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats.html.ep:4 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress.html.ep:2 +msgid "You are not authorized to access instructor tools" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers.html.ep:5 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Assigner.html.ep:4 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:9 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:13 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:31 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:30 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList.html.ep:28 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Scoring.html.ep:5 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker.html.ep:15 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList.html.ep:11 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UsersAssignedToSet.html.ep:4 +msgid "You are not authorized to access instructor tools." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:388 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:271 -msgid "You are not authorized to access the instructor tools." +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Assigner.html.ep:9 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UsersAssignedToSet.html.ep:9 +msgid "You are not authorized to assign homework sets." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:392 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin.html.ep:10 +msgid "You are not authorized to create or delete courses." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementEditor.html.ep:11 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList.html.ep:10 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementUserEditor.html.ep:2 +msgid "You are not authorized to edit achievements." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserDetail.html.ep:28 +msgid "You are not authorized to edit user specific information." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:37 +msgid "You are not authorized to grade homework sets." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager.html.ep:8 +msgid "You are not authorized to manage course files" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList.html.ep:33 msgid "You are not authorized to modify homework sets." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:2037 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:18 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:35 msgid "You are not authorized to modify problems." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:396 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList.html.ep:39 msgid "You are not authorized to modify set definition files." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:338 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:345 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList.html.ep:15 msgid "You are not authorized to modify student data" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:367 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:395 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers.html.ep:11 +msgid "You are not authorized to modify student data." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Config.html.ep:3 +msgid "You are not authorized to modify the course configuration." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:239 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:230 msgid "You are not authorized to perform this action." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:250 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Scoring.html.ep:11 +msgid "You are not authorized to score sets." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail.html.ep:13 +msgid "You are not authorized to send mail to students" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/LTIUpdate.html.ep:11 +msgid "You are not authorized to update lti scores" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ShowAnswers.html.ep:8 +msgid "You are not authorized to view past answers" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:251 msgid "" "You are not permitted to generate a hardcopy for a set with hidden work." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:238 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:236 msgid "You are not permitted to generate a hardcopy for an unopened set." msgstr "" -#. ($showMeAnother{MaxReps}, $solutionShown) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:559 +#. ($showMeAnother{MaxReps}, $solutionShown) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:532 msgid "" "You are only allowed to click on Show Me Another %quant(%1,time,times) per " "problem. %2 Close this tab, and return to the original problem." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:2037 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:2056 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:246 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:265 msgid "You are out of time!" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:320 +#: /opt/webwork/webwork2/templates/ContentGenerator/Hardcopy.html.ep:36 msgid "You can also examine the following temporary files: " msgstr "" -#: /opt/webwork/pg/macros/PGanswermacros.pl:1693 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:108 +msgid "" +"You can assign selected achievements to all users by using the \"Assign\" " +"action action and selecting which achievements to assign. You can select " +"which users to assign/unassign to an achievement by clicking on the link in " +"the \"Edit Users\" column." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1039 +msgid "" +"You can change the file path for this problem manually from the \"Hmwk Sets " +"Editor\" page" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/ProblemSets.html.ep:27 +msgid "" +"You can check the boxes to the right of the sets and click \"Generate " +"Hardcopy for Selected Sets\" to generate a PDF hardcopy of the selected " +"sets. You can generate hardcopies for multiple users including their answers " +"as well. Note that students will only be able to generate hardcopies of a " +"single set at a time. Students will only be able to include answers in the " +"hardcopy after the answer date." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:127 +msgid "" +"You can delete problems by clicking the \"Delete it?\" check box and saving. " +"If the set is already active it is recommended that you instead use the " +"\"Mark Correct?\" problem to mark a particular problem correct for all " +"students." +msgstr "" + +#: /opt/webwork/pg/macros/core/PGanswermacros.pl:1616 msgid "You can earn partial credit on this problem." msgstr "" -#: /opt/webwork/pg/macros/problemRandomize.pl:383 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:142 +msgid "" +"You can edit a problem by clicking the \"Edit Problem\" icon to the right of " +"the problem number. This will open the problem in the PG problem editor in a " +"new tab or window." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:92 +msgid "" +"You can edit a single achievement by clicking on the pencil icon next to the " +"achievement ID. You can edit multiple achievements by selecting which " +"achievements to edit, then click the \"Edit\" button. You can edit all of " +"the achievements by changing which achievements to edit form \"selected " +"achievements\" to \"all achievements\", or click the checkbox next to the " +"Achievement ID to select all achievements." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:44 +msgid "" +"You can edit the class list data for a single student by clicking on the " +"pencil icon next to their login name. To edit several students at once click " +"on the \"Select\" checkbox next to their names, click on the radio button " +"for editing selected users and then click the \"Edit\" button. You can also " +"edit all visible users (those students currently being displayed) or even " +"all users in the course although this last option might take a long time to " +"load for a large class." +msgstr "" + +#: /opt/webwork/pg/macros/deprecated/problemRandomize.pl:397 msgid "You can get a new version of this problem after the due date." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:1366 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:101 +msgid "" +"You can import/export from their respective action tab. Exporting saves " +"information about the achievement as a .axp file which is a CSV that lists " +"each achievements information. You can import .axp files that have been " +"previously exported." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:769 msgid "You can not specify an absolute path" msgstr "" #. ($action) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:1119 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:549 msgid "You can only %1 one file at a time." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:99 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:92 msgid "You can only download regular files." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:589 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:197 msgid "You can only edit text files" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:906 -msgid "You can only unpack files ending in '.tgz', '.tar' or '.tar.gz'" +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:374 +msgid "You can only unpack files ending in \".tgz\", \".tar\" or \".tar.gz\"" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:134 +msgid "" +"You can render a problem by clicking the \"Render Problem\" icon to the " +"right of the problem number. The display mode used to render the problem is " +"chosen using the drop down menu. You can render all problems using the " +"\"Render All\" button. \"Hide All\" will hide all rendered problems. It is " +"also useful to collapse problem details when doing this, as it makes it " +"easier to drag problems around." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:120 +msgid "" +"You can reorder problems by clicking on the arrow icon and dragging the " +"problem. You will see a box showing you where the problem will be placed. " +"When problems are reordered any holes in the numbering will be filled in." msgstr "" #. ($showMeAnother{MaxReps} >= $showMeAnother{Count} ? ($showMeAnother{MaxReps} - $showMeAnother{Count}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1866 +#: /opt/webwork/webwork2/templates/ContentGenerator/Problem/submit_buttons.html.ep:44 msgid "" "You can use this feature %quant(%1,more time,more times,as many times as you " "want) on this problem" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:986 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:439 msgid "You can't download directories" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:987 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:440 msgid "You can't download files of that type" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:582 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:192 msgid "You can't edit a directory" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:526 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:160 msgid "You can't view files of that type" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1991 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:985 msgid "You cannot archive the course you are currently using." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1675 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:850 msgid "You cannot delete the course you are currently using." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:1064 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:378 msgid "You cannot delete yourself!" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:1933 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:579 msgid "You did not specify a new set name." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:267 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:232 msgid "You didn't enter any message." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Options.pm:222 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Options.pm:263 -msgid "You do not have permission to change email addresses." +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:303 +msgid "You do not have permission to access the requested file \"%1\"." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:167 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:159 msgid "You do not have permission to change the hardcopy theme." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Options.pm:140 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Options.pm:195 -msgid "You do not have permission to change your password." -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:576 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:186 msgid "You do not have permission to edit this file." msgstr "" #. ($hardcopy_format) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:160 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:151 msgid "You do not have permission to generate hardcopy in %1 format." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1610 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1161 msgid "You do not have permission to view the details of this error." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Achievements.pm:157 +#: /opt/webwork/webwork2/templates/ContentGenerator/Achievements.html.ep:13 msgid "You don't have any Achievement data associated to you!" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Achievements.pm:290 -msgid "You don't have any items!" +#: /opt/webwork/webwork2/templates/ContentGenerator/Achievements/achievement_items.html.ep:51 +msgid "You don't have any rewards!" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:2095 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:325 msgid "You exceeded the allowed time." msgstr "" -#. ($numLeft) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:2068 +#. ($c->{numAttemptsLeft}) +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:277 msgid "You have %1 attempt(s) remaining on this test." msgstr "" -#. ($attemptsLeft) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1983 +#. ($c->{numAttemptsLeft}, $c->{numAttemptsLeft} - 1) +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:664 +msgid "" +"You have %1 submissions remaining for this test. If you say yes, then you " +"will have %quant(%2,submission) remaining. Once all submissions have been " +"used, your answers will be final and you will not be able to continue to " +"work this test version." +msgstr "" + +#. ($problem->max_attempts - $attempts) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1270 msgid "You have %negquant(%1,unlimited attempts,attempt,attempts) remaining." msgstr "" #. ($attempts_before_rr) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1940 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1217 msgid "" "You have %quant(%1,attempt,attempts) left before new version will be " "requested." msgstr "" -#. ($hours, $minutes) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:531 +#. ($hours, $minutes) +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:44 msgid "" "You have %quant(%1,hour) and %quant(%2,minute) remaining to complete the " "currently open test." msgstr "" -#. ($hours, $minutes) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:542 +#. ($hours, $minutes) +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:54 msgid "" "You have %quant(%1,hour,hours,)%quant(%2,minute,minutes,) remaining to " "complete the currently open test." msgstr "" -#. ($minutes, $seconds) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:552 +#. ($minutes, $seconds) +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:64 msgid "" "You have %quant(%1,minute) and %quant(%2,second) remaining to complete the " "currently open test." msgstr "" #. ($seconds) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:562 +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:72 msgid "" "You have %quant(%1,second) remaining to complete the currently open test." msgstr "" #. ($attempts) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1977 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1243 msgid "You have attempted this problem %quant(%1,time,times)." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Logout.pm:144 +#: /opt/webwork/webwork2/templates/ContentGenerator/Logout.html.ep:1 msgid "You have been logged out of WeBWorK." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:2051 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:260 msgid "You have less than 1 minute to complete this test." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:2032 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:241 msgid "You have less than 45 seconds left!" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:2029 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:240 msgid "" "You have less than 90 seconds left to complete this assignment. You should " "finish it soon!" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:1002 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:452 msgid "You have not chosen a file to upload." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:843 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/delete.html.ep:7 msgid "You have requested that the following items be deleted" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:1135 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:565 msgid "You have specified an illegal file" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:1365 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:766 msgid "You have specified an illegal path" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:520 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager.html.ep:13 +msgid "You have specified an illegal working directory!" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:481 msgid "" "You may check your answers to this problem without affecting the maximum " "number of tries to your original problem." msgstr "" -#. ($perm_multiuser ? "to privileged users or" : "") -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:544 +#. ($multiuser ? 'to privileged users or' : '') +#: /opt/webwork/webwork2/templates/ContentGenerator/Hardcopy/form.html.ep:69 msgid "" "You may choose to show any of the following data. Correct answers, hints, " "and solutions are only available %1 after the answer date of the homework " "set." msgstr "" -#: /opt/webwork/pg/macros/compoundProblem.pl:610 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/user_row.html.ep:63 +msgid "You may not change this user's password!" +msgstr "" + +#: /opt/webwork/pg/macros/core/compoundProblem.pl:646 msgid "You may not change your answers when going on to the next part!" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:1811 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/user_row.html.ep:58 msgid "You may not change your own password here!" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:1130 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:513 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:149 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:560 msgid "You may not follow symbolic links" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:2120 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:350 msgid "You may still check your answers." msgstr "" -#. ($showMeAnother{TriesNeeded}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:568 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:143 msgid "" -"You must attempt this problem %quant(%1,time,times) before Show Me Another " -"is available." +"You may want to create an unattached problem if you are using the current " +"problem as a model for a new problem. You can add the new file to a homework " +"set from the Library Browser or via the set detail page of the Hmwk Sets " +"Editor." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:165 +msgid "" +"You might want to do this if you want to give full credit to everyone on a " +"particular problem that was not worded correctly, or wasn't working " +"properly. This is done from the \"Hmwk Sets Editor\" page or the " +"\"Instructor Tools\" page." +msgstr "" + +#. ($ce->{LTI}{ $ce->{LTIVersion} }{LMS_url} ? link_to($ce->{LTI}{ $ce->{LTIVersion} }{LMS_name} => $ce->{LTI}{ $ce->{LTIVersion} }{LMS_url}) +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSets.html.ep:8 +msgid "You must access assignments from your Course Management System (%1)." msgstr "" #. ($showMeAnother{TriesNeeded}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1894 +#: /opt/webwork/webwork2/templates/ContentGenerator/Problem/submit_buttons.html.ep:67 msgid "" -"You must attempt this problem %quant(%1,time,times) before this feature is " +"You must attempt this problem %quant(%1,time) before this feature is " "available" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:699 +#. ($showMeAnother{TriesNeeded}) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:545 +msgid "" +"You must attempt this problem %quant(%1,time,times) before Show Me Another " +"is available." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:259 msgid "You must confirm the password for the initial instructor." msgstr "" -#. ($ce->{LMS_name}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:370 +#. ($ce->{LTI}{ $ce->{LTIVersion} }{LMS_url} ? $c->link_to( $ce->{LTI}{ $ce->{LTIVersion} }{LMS_name} => $ce->{LTI}{ $ce->{LTIVersion} }{LMS_url}) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:195 msgid "You must log into this set via your Learning Management System (%1)." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ShowAnswers.pm:76 -msgid "You must provide a student ID, a set ID, and a problem number." +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:979 +msgid "You must select a course to archive" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1324 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:585 msgid "You must select a course to rename." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:879 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:351 msgid "You must select at least one file for the archive" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:775 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:312 msgid "You must select at least one file to delete" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Scoring.pm:114 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Scoring.pm:106 msgid "You must select one or more sets for scoring!" msgstr "" #. ($object) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:1344 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:749 msgid "You must specify a %1 name" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:682 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:242 msgid "You must specify a course ID." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1673 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1989 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2481 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2711 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:3700 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:3778 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1213 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1255 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1326 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2086 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2160 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:848 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:983 msgid "You must specify a course name." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:1368 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:775 msgid "You must specify a file name" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:705 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:586 +msgid "You must specify a file name in order to save a new file." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:265 msgid "You must specify a first name for the initial instructor." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:708 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:268 msgid "You must specify a last name for the initial instructor." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1345 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:606 msgid "You must specify a new institution for the course." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1327 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:588 msgid "You must specify a new name for the course." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1342 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:603 msgid "You must specify a new title for the course." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:696 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:256 msgid "You must specify a password for the initial instructor." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Authen.pm:458 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen.pm:440 msgid "You must specify a user ID." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:711 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:271 msgid "You must specify an email address for the initial instructor." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm:342 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1052 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm:138 msgid "You must specify an file name in order to save a new file." msgstr "" #. ($LMS) -#: /opt/webwork/webwork2/lib/WeBWorK/Authz.pm:491 +#: /opt/webwork/webwork2/lib/WeBWorK/Authz.pm:505 msgid "" -"You must use your Learning Managment System (%1) to access this set. Try " -"logging in to the Learning Managment System and visiting the set from there." +"You must use your Learning Management System (%1) to access this set. Try " +"logging in to the Learning Management System and visiting the set from there." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:1754 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:422 msgid "You need to select a \"Target Set\" before you can edit it." msgstr "" #. ($action) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:1124 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:554 msgid "You need to select a file to %1." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:1905 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:555 msgid "You need to select a set definition file to view." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:1880 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:537 msgid "You need to select a set from this course to view." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:1861 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:524 msgid "You need to select a set to view." msgstr "" -#. (wwRound(0, $problemResult->{score} * 100) -#. (wwRound(0, $pg->{result}->{score} * 100) -#: /opt/webwork/webwork2/lib/FormatRenderedProblem.pm:281 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1978 +#. (wwRound(0, compute_reduced_score($ce, $problem, $set, $pg->{result}{score}, $c->submitTime) +#. (% wwRound(0, $rh_result->{problem_result}{score} * 100) +#. (wwRound(0, $rh_result->{problem_result}{score} * 100) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1251 +#: /opt/webwork/webwork2/templates/RPCRenderFormats/default.html.ep:48 +#: /opt/webwork/webwork2/templates/RPCRenderFormats/default.json.ep:29 msgid "You received a score of %1 for this attempt." msgstr "" -#. (join('.',@{$problemSeqs[$next_id]}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:2046 +#. (join('.', @{ $problemSeqs[$next_id] }) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1363 msgid "" "You will not be able to proceed to problem %1 until you have completed, or " "run out of attempts, for this problem and its graded subproblems." msgstr "" -#. (join('.',@{$problemSeqs[$next_id]}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:2049 +#. (join('.', @{ $problemSeqs[$next_id] }) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1375 msgid "" "You will not be able to proceed to problem %1 until you have completed, or " "run out of attempts, for this problem." msgstr "" #. ($object) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:1341 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:740 msgid "Your %1 name contains illegal characters" msgstr "" #. ($object) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:1342 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:743 msgid "Your %1 name may not begin with a dot" msgstr "" #. ($object) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:1343 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:746 msgid "Your %1 name may not contain a path component" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIBasic.pm:549 -msgid "" -"Your LTI OAuth verification failed. If this recurs, please speak with your " -"instructor" -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIBasic.pm:537 -#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIBasic.pm:548 -msgid "Your authentication failed. Please return to Oncourse and login again." -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/Authen.pm:240 -msgid "" -"Your authentication failed. Please try again. Please speak with your " -"instructor if you need help." -msgstr "" - -#: /opt/webwork/pg/macros/PGbasicmacros.pl:3033 +#: /opt/webwork/pg/macros/core/PGbasicmacros.pl:3162 msgid "Your browser does not support the video tag." msgstr "" -#. ($PGBranch, $PGRemote) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:3991 -msgid "Your current branch of PG is up to date with branch %1 in remote %2." -msgstr "" - -#. ($WeBWorKBranch, $WeBWorKRemote) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:3929 -msgid "" -"Your current branch of WeBWorK is up to date with branch %1 in remote %2." -msgstr "" - -#. ($LibraryBranch, $LibraryRemote) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:4026 -msgid "Your current branch of the Open Problem Library is up to date." -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Options.pm:293 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Options.pm:322 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Options.pm:134 msgid "Your display options have been saved." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Options.pm:215 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Options.pm:113 msgid "Your email address has been changed." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:1367 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:772 msgid "Your file name contains illegal characters" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Scoring.pm:117 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ScoringDownload.pm:43 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Scoring.pm:109 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ScoringDownload.pm:40 msgid "Your file name is not valid! " msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Feedback.pm:322 +#: /opt/webwork/webwork2/templates/ContentGenerator/Feedback.html.ep:16 msgid "Your message was sent successfully." msgstr "" -#. ($lastScore,$notCountedMessage) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1981 +#. (wwRound(0, $problem->status * 100) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1261 msgid "Your overall recorded score is %1. %2" msgstr "" -#. ($versionNumber, wwRound(2,$recordedScore) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:2093 -msgid "Your recorded score on this test (version %1) is %2/%3." +#. ('' . wwRound(2, $c->{recordedScore}) +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:179 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:197 +msgid "Your recorded score for this version is %1/%2 (%3%)." +msgstr "" + +#. ($setVersionID, '' . wwRound(2, $c->{recordedScore}) +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:317 +msgid "Your recorded score on this test (version %1) is %2/%3 (%4%)." msgstr "" -#: /opt/webwork/pg/macros/compoundProblem.pl:603 +#: /opt/webwork/pg/macros/core/compoundProblem.pl:634 msgid "Your score for this attempt is for this part only;" msgstr "" # $testNounNum is either "test (#)" or "submission (#)" #. ($testNounNum) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1963 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:142 msgid "Your score on this %1 WAS recorded." msgstr "" # $testNoun is either "test" or "submission" -#. ($testNoun,$attemptScore,$totPossible) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1968 +#. ($testNoun, $c->{attemptScore}, $c->{totalPossible}) +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:148 msgid "Your score on this %1 is %2/%3." msgstr "" # $testNounNum is either "test (#)" or "submission (#) #. ($testNounNum) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1959 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:138 msgid "Your score on this %1 was NOT recorded." msgstr "" -#. ($attemptScore,$totPossible) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:2005 +#. ($c->{attemptScore}, $c->{totalPossible}) +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:192 msgid "Your score on this (checked, not recorded) submission is %1/%2." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1618 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1949 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:2249 -msgid "Your score on this problem was recorded." -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1620 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemUtil/ProblemUtil.pm:168 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1027 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/ProblemProcessing.pm:172 msgid "" "Your score was not recorded because there was a failure in storing the " "problem record to the database." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemUtil/ProblemUtil.pm:269 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/ProblemProcessing.pm:276 msgid "Your score was not recorded because this homework set is closed." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemUtil/ProblemUtil.pm:275 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/ProblemProcessing.pm:283 msgid "" "Your score was not recorded because this problem has not been assigned to " "you." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1644 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1049 msgid "" "Your score was not recorded because this problem set version is not open." msgstr "" -#. ($elapsed, $allowed) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1659 +#. ($elapsed, # Assume the allowed time is an even number of minutes. ($set->due_date - $set->open_date) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1063 msgid "" "Your score was not recorded because you have exceeded the time limit for " "this test. (Time taken: %1 min; allowed: %2 min.)" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1647 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1052 msgid "" "Your score was not recorded because you have no attempts remaining on this " "set version." msgstr "" -#: /opt/webwork/webwork2/lib/FormatRenderedProblem.pm:284 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1662 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemUtil/ProblemUtil.pm:271 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1067 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/ProblemProcessing.pm:278 +#: /opt/webwork/webwork2/templates/RPCRenderFormats/default.html.ep:53 +#: /opt/webwork/webwork2/templates/RPCRenderFormats/default.json.ep:31 msgid "Your score was not recorded." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1984 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemUtil/ProblemUtil.pm:256 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemUtil/ProblemUtil.pm:262 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/ProblemProcessing.pm:266 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:163 msgid "Your score was not successfully sent to the LMS." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemUtil/ProblemUtil.pm:166 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/ProblemProcessing.pm:170 msgid "Your score was recorded." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1983 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemUtil/ProblemUtil.pm:254 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemUtil/ProblemUtil.pm:260 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/ProblemProcessing.pm:269 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:162 msgid "Your score was successfully sent to the LMS." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Authen.pm:558 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen.pm:540 msgid "Your session has timed out due to inactivity. Please log in again." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:4061 -msgid "Your systems are up to date!" -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1339 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1346 -msgid "[Edit]" -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:288 -msgid "_ACHIEVEMENTS_EDITOR_DESCRIPTION" -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ShowAnswers.pm:387 -msgid "_ANSWER_LOG_DESCRIPTION" -msgstr "" - -# -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:478 -msgid "_CLASSLIST_EDITOR_DESCRIPTION" -msgstr "" - -#. (CGI::strong($course) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Login.pm:192 -msgid "_EXTERNAL_AUTH_MESSAGE" -msgstr "" - -# -#. (CGI::b($r->maketext("Guest Login") -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Login.pm:268 -msgid "_GUEST_LOGIN_MESSAGE" -msgstr "" - -# -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:454 -msgid "_HMWKSETS_EDITOR_DESCRIPTION" -msgstr "" - -#. (CGI::b($r->maketext("Remember Me") -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Login.pm:197 -msgid "_LOGIN_MESSAGE" -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:2696 -msgid "_PROBLEM_SET_SUMMARY" -msgstr "" - -# -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator.pm:2199 -msgid "_REQUEST_ERROR" -msgstr "" - -# -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:1989 -msgid "_USER_TABLE_SUMMARY" +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/create_form.html.ep:17 +msgid "a duplicate of the first selected achievement" msgstr "" # Context is "Create set ______ as a duplicate of the first selected set" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:771 -msgid "a duplicate of the first selected achievement." -msgstr "" - -# Context is "Create set ______ as a duplicate of the first selected set" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1115 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/create_form.html.ep:17 msgid "a duplicate of the first selected set" msgstr "" -# Context is "Create set ______ as a new empty set" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:770 -msgid "a new empty achievement." +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/create_form.html.ep:16 +msgid "a new empty achievement" msgstr "" # Context is "Create set ______ as a new empty set" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1114 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/create_form.html.ep:16 msgid "a new empty set" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1251 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/import_form.html.ep:9 msgid "a single set" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:470 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:130 msgid "add problems" msgstr "" #. ($setName, $@) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1728 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:891 msgid "addGlobalSet %1 in ProblemSetList: %2" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:456 -msgid "added missing permission level for user" -msgstr "" - # #short for administrator -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:116 +#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:90 msgid "admin" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:739 -msgid "all" -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:434 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:474 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:573 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:972 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/assign_form.html.ep:7 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/edit_form.html.ep:6 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/export_form.html.ep:6 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/score_form.html.ep:7 msgid "all achievements" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:858 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1338 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/import_form.html.ep:19 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/import_form.html.ep:66 msgid "all current users" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:384 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:70 msgid "all set dates for one user" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor.pm:623 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1397 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:651 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:819 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:871 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:968 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1995 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/edit_form.html.ep:5 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/export_form.html.ep:6 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/filter_form.html.ep:7 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/publish_form.html.ep:8 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/score_form.html.ep:7 msgid "all sets" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor.pm:603 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1981 msgid "all students" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:1238 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:684 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:929 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:980 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/edit_form.html.ep:5 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/export_form.html.ep:9 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/filter_form.html.ep:7 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/password_form.html.ep:6 msgid "all users" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:453 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:120 msgid "all users for one set" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1601 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1898 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:3618 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:16 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/delete_course_form.html.ep:16 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/hide_inactive_course_form.html.ep:23 msgid "alphabetically" msgstr "" -#. ($count,$numSets) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor.pm:627 +#. ($count, $numSets) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1999 msgid "an impossible number of sets: %1 out of %2" msgstr "" -#. ($count,$numUsers) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor.pm:607 +#. ($count, $numUsers) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1985 msgid "an impossible number of users: %1 out of %2" msgstr "" -#: /opt/webwork/pg/macros/PGbasicmacros.pl:647 -#: /opt/webwork/pg/macros/PGbasicmacros.pl:658 +#: /opt/webwork/pg/macros/core/PGbasicmacros.pl:610 +#: /opt/webwork/pg/macros/core/PGbasicmacros.pl:621 msgid "answer" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:1148 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:1171 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/import_form.html.ep:17 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/import_form.html.ep:30 msgid "any users" msgstr "" -# Context is "Create _____ as a new empty set" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:763 -msgid "as" -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Stats.pm:703 -msgid "avg attempts" -msgstr "" - # Context is "Append ____ blank problem template(s) to end of homework set" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:2900 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:689 msgid "blank problem template(s) to end of homework set" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1601 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1898 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:3618 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:17 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/delete_course_form.html.ep:17 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/hide_inactive_course_form.html.ep:24 msgid "by last login date" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:1086 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1515 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:598 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:688 msgid "changes abandoned" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:1136 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1614 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:633 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:795 msgid "changes saved" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:396 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:80 msgid "class list data for selected users" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Achievements.pm:264 +#: /opt/webwork/webwork2/templates/ContentGenerator/Achievements/achievement_items.html.ep:31 msgid "close" msgstr "" -#: /opt/webwork/pg/macros/PGbasicmacros.pl:671 +#: /opt/webwork/pg/macros/core/PGbasicmacros.pl:633 msgid "column" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/AttemptsTable.pm:259 +#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:239 msgid "correct" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:589 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:239 msgid "course files" msgstr "" #. ($num) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1073 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:458 msgid "deleted %1 sets" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:450 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:152 msgid "editing all achievements" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:836 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:333 msgid "editing all sets" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:946 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:328 msgid "editing all users" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:452 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:336 +msgid "editing listed sets" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:154 msgid "editing selected achievements" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:842 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:339 msgid "editing selected sets" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:952 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:334 msgid "editing selected users" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:839 -msgid "editing visible sets" -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:949 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:331 msgid "editing visible users" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:307 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:90 msgid "email address" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AddUsers.pm:76 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AddUsers.pm:87 -msgid "email:" -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ShowAnswers.pm:550 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ShowAnswers/past-answers-table.html.ep:42 msgid "empty" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:656 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/filter_form.html.ep:10 msgid "enter matching set IDs below" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AddUsers.pm:220 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers.html.ep:31 msgid "entry rows." msgstr "" #. ($restrictLoc, $setName, $@) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1738 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:904 msgid "error adding set location %1 for set %2: %3" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:1012 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1450 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:542 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:643 msgid "export abandoned" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:988 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:527 msgid "exporting all achievements" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:991 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:530 msgid "exporting selected achievements" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:306 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:89 msgid "first name" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:775 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:72 msgid "for" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:493 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:149 msgid "for one set" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:414 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:426 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:103 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:94 msgid "for one user" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:997 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:349 msgid "giving new passwords to all users" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:1003 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:355 msgid "giving new passwords to selected users" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:1000 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:352 msgid "giving new passwords to visible users" msgstr "" #. ($j, $setID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1042 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1069 msgid "global %1 for set %2 not found." msgstr "" -#. ($setID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1114 -msgid "global set %1 not found." -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:116 +#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:89 msgid "grade_proctor" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:116 +#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:89 msgid "guest" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1552 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1849 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:3559 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2060 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:818 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:949 msgid "hidden" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:912 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:355 msgid "hidden from" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:530 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:67 -msgid "hidden from students" +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:217 +msgid "homework" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:655 -msgid "hidden sets" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:83 +msgid "html directory" msgstr "" # doe snot need to be translated -#. ('j','k','_0') -#. ('j','k') -#: /opt/webwork/pg/lib/Parser/List/Vector.pm:35 -#: /opt/webwork/pg/lib/Value/Vector.pm:278 -#: /opt/webwork/pg/macros/contextLimitedVector.pl:94 +#. ('j', 'k', '_0') +#. ('j', 'k') +#: /opt/webwork/pg/lib/Parser/List/Vector.pm:39 +#: /opt/webwork/pg/lib/Value/Vector.pm:303 +#: /opt/webwork/pg/macros/contexts/contextLimitedVector.pl:95 msgid "i" msgstr "" # does not need to be translated -#: /opt/webwork/pg/macros/contextPiecewiseFunction.pl:774 +#: /opt/webwork/pg/macros/contexts/contextPiecewiseFunction.pl:840 msgid "if" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:1513 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:1608 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:622 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:721 msgid "illegal character in input: '/'" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/AttemptsTable.pm:266 +#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:246 msgid "incorrect" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Scoring.pm:595 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Scoring.pm:441 msgid "index" msgstr "" #. ($restrictLoc, $setName) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1741 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:911 msgid "input set location %1 already exists for set %2." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:305 +#. ($userID) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:501 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:551 +msgid "insufficient permission to edit %1" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:220 +msgid "just-in-time" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:88 msgid "last name" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:3082 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/edit_form.html.ep:6 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/export_form.html.ep:7 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/publish_form.html.ep:9 +msgid "listed sets" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/manage_location_form.html.ep:87 msgid "locations selected below" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:610 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:59 msgid "login" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Scoring.pm:33 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Scoring.pm:30 msgid "login ID" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:311 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:94 msgid "login name" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AddUsers.pm:75 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AddUsers.pm:86 -msgid "login/studentID:" -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:116 +#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:89 msgid "login_proctor" msgstr "" # Context is "Set _____ made visibile for _____ users" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:912 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:355 msgid "made visible for" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:420 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:493 msgid "max" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1252 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/import_form.html.ep:10 msgid "multiple sets" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:461 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:482 -msgid "n/a" -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:515 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:171 msgid "new set:" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:438 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:109 msgid "new users" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:572 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/delete_form.html.ep:10 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/score_form.html.ep:6 msgid "no achievements" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:704 -msgid "no achievements." -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:464 -msgid "no attempt recorded" -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:3083 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/manage_location_form.html.ep:86 msgid "no location" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor.pm:621 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1034 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:652 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:870 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:967 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1993 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/delete_form.html.ep:10 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/filter_form.html.ep:8 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/publish_form.html.ep:7 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/score_form.html.ep:6 msgid "no sets" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor.pm:601 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1979 msgid "no students" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:859 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:1035 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:1151 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:1172 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:685 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/import_form.html.ep:20 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/delete_form.html.ep:10 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/filter_form.html.ep:8 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/import_form.html.ep:20 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/import_form.html.ep:31 msgid "no users" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Config.pm:254 -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:116 +#: /opt/webwork/webwork2/lib/WeBWorK/ConfigObject/permission.pm:26 +#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:90 msgid "nobody" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:466 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:467 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:487 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:488 -msgid "none" -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:804 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:114 msgid "nth colum of merge file" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:225 -msgid "number of students not defined" -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:2199 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker.html.ep:70 msgid "of" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:465 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:128 msgid "one set" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:563 -msgid "one set for users" +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:225 +msgid "one set for users" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:551 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:211 msgid "one user (on one set)" msgstr "" # Context is Assign this set to which users? "only ____" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1339 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/import_form.html.ep:67 msgid "only" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:544 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:17 msgid "only best scores" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:3385 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:406 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:467 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:485 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/edit_location_form.html.ep:47 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:129 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:143 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:88 msgid "or" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:1164 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/top_row.html.ep:59 msgid "or Problems from" msgstr "" -#: /opt/webwork/pg/macros/contextPiecewiseFunction.pl:777 +#: /opt/webwork/pg/macros/contexts/contextPiecewiseFunction.pl:843 msgid "otherwise" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:484 -msgid "overwrite all data" +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/assign_form.html.ep:19 +msgid "overwrite" msgstr "" -#: /opt/webwork/pg/macros/PGbasicmacros.pl:664 +#: /opt/webwork/pg/macros/core/PGbasicmacros.pl:627 msgid "part" msgstr "" #. ($userID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:1365 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:499 msgid "permissions for %1 not defined" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:2290 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1369 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1406 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:387 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:370 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:539 msgid "point" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:2290 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1369 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1406 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:387 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:370 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:539 msgid "points" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:485 -msgid "preserve existing data" +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/assign_form.html.ep:20 +msgid "preserve" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:2316 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:576 msgid "preview answers" msgstr "" -#: /opt/webwork/pg/macros/PGbasicmacros.pl:653 +#: /opt/webwork/pg/macros/core/PGbasicmacros.pl:616 msgid "problem" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:577 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:41 msgid "problems" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:116 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:219 +msgid "proctored test" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:90 msgid "professor" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:409 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:488 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:144 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:89 msgid "progress" msgstr "" #. ($line) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1925 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:2189 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1095 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1409 msgid "readSetDef error, can't read the line: ||%1||" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:310 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:93 msgid "recitation" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:599 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:53 msgid "recitation #" msgstr "" #. ($userID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:1363 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:1436 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:497 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:549 msgid "record for visible user %1 not found" msgstr "" #. ($restrictLoc) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1744 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:918 msgid "" "restriction location %1 does not exist. IP restrictions have been ignored." msgstr "" -#: /opt/webwork/pg/macros/PGbasicmacros.pl:670 +#: /opt/webwork/pg/macros/core/PGbasicmacros.pl:633 msgid "row" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:308 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:91 msgid "score" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:309 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:92 msgid "section" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:588 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:47 msgid "section #" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AddUsers.pm:77 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AddUsers.pm:88 -msgid "section:" -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:740 -msgid "selected" -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:505 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:159 msgid "selected sets" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:539 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:197 msgid "selected users to selected sets" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:435 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:475 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:574 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:973 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/assign_form.html.ep:8 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/delete_form.html.ep:11 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/edit_form.html.ep:7 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/export_form.html.ep:7 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/score_form.html.ep:8 msgid "selected achievements" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:705 -msgid "selected achievements." -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1035 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1399 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:653 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:821 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:872 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:969 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/delete_form.html.ep:11 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/edit_form.html.ep:7 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/export_form.html.ep:8 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/filter_form.html.ep:9 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/publish_form.html.ep:10 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/score_form.html.ep:8 msgid "selected sets" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:1036 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:1150 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:1240 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:686 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:931 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:982 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/delete_form.html.ep:11 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/edit_form.html.ep:7 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/export_form.html.ep:11 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/filter_form.html.ep:9 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/import_form.html.ep:19 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/password_form.html.ep:8 msgid "selected users" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor.pm:625 -msgid "set" +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/filter_form.html.ep:12 +msgid "sets hidden from students" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor.pm:629 -msgid "sets" +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/filter_form.html.ep:11 +msgid "sets visible to students" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:699 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:281 msgid "showing all sets" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:746 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:277 msgid "showing all users" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:714 -msgid "showing hidden sets" -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:708 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:290 msgid "showing matching sets" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:755 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:286 msgid "showing matching users" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:702 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:284 msgid "showing no sets" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:749 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:280 msgid "showing no users" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:705 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:287 msgid "showing selected sets" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:752 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:283 msgid "showing selected users" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:711 -msgid "showing visible sets" +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:299 +msgid "showing sets that are hidden from students" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:296 +msgid "showing sets that are visible to students" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:2201 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker.html.ep:72 msgid "shown" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:405 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:162 msgid "still open" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:116 +#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:89 msgid "student" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:748 -msgid "students" -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1936 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:130 msgid "submission" msgstr "" -#. ($versionNumber) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1938 +#. ($setVersionID) +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:133 msgid "submission (version %1)" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Scoring.pm:655 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Scoring.pm:499 msgid "summary" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:116 +#: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:90 msgid "ta" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1936 -msgid "test" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:90 +msgid "templates/email directory" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:555 -msgid "test date" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:95 +msgid "templates/macros directory" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:566 -msgid "test time" +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:218 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:130 +msgid "test" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:848 -msgid "the following file" +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:23 +msgid "test date" msgstr "" -#. ($forcedSourceFile) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:988 -msgid "the original path to the file is %1" +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:29 +msgid "test time" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:467 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:119 msgid "then delete them" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1931 -msgid "time" -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:407 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:165 msgid "time limit exceeded" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1931 -msgid "times" +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:35 +msgid "time remaining" msgstr "" # Context is Assign ____ to _____ -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:863 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:183 msgid "to" msgstr "" #. ($ce->{institutionName}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator.pm:569 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator.pm:399 msgid "to %1 main web site" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator.pm:547 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator.pm:381 msgid "to courses page" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:475 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:135 msgid "to one set" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Stats.pm:751 -msgid "top score" -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Scoring.pm:587 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Scoring.pm:432 msgid "total" msgstr "" #. ($ce->{webworkDirs}{logs}) #. ($ce->{webworkDirs}{tmp}) #. ($ce->{webworkDirs}{DATA}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:408 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:409 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:410 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin.html.ep:41 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin.html.ep:44 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin.html.ep:47 msgid "unable to write to directory %1" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:334 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:958 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:383 +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/problem_list_row.html.ep:49 msgid "unlimited" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Achievements.pm:244 +#: /opt/webwork/webwork2/templates/ContentGenerator/Achievements/achievement_items.html.ep:14 msgid "unlimited reusability" msgstr "" -#. ($userID) -#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIBasic.pm:618 -msgid "userID: %1 --" -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:620 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:259 msgid "" "username, last name, first name, section, achievement level, achievement " "score," msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:687 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/filter_form.html.ep:10 msgid "users who match on selected field" msgstr "" -#. ($versionNumber) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1938 -msgid "version (%1)" -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1554 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1851 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:3561 -msgid "visible" +#. ($set->version_id) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Grades.pm:295 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Grades.pm:296 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Grades.pm:407 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Grades.pm:408 +msgid "version %1" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1398 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:654 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:820 -msgid "visible sets" +#. ($setVersionID) +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:134 +msgid "version (%1)" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:530 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:67 -msgid "visible to students" +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2062 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:820 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:951 +msgid "visible" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:1149 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:1239 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:930 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:981 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/edit_form.html.ep:6 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/export_form.html.ep:10 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/import_form.html.ep:18 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/password_form.html.ep:7 msgid "visible users" msgstr "" -#: /opt/webwork/pg/macros/compoundProblem.pl:470 -#: /opt/webwork/pg/macros/compoundProblem.pl:480 +#: /opt/webwork/pg/macros/core/compoundProblem.pl:485 +#: /opt/webwork/pg/macros/core/compoundProblem.pl:500 msgid "when you submit your answers" msgstr "" #. ($dir, $fileName) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1650 -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:1514 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:813 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:623 msgid "won't be able to read from file %1/%2: does it exist? is it readable?" msgstr "" -#: /opt/webwork/pg/macros/compoundProblem.pl:604 +#: /opt/webwork/pg/macros/core/compoundProblem.pl:638 msgid "your overall score is for all the parts combined." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm:575 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:231 msgid "your students" msgstr "" diff --git a/lib/WeBWorK/Localize/webwork2.pot b/lib/WeBWorK/Localize/webwork2.pot index db1e8142c4..5ebfef0605 100644 --- a/lib/WeBWorK/Localize/webwork2.pot +++ b/lib/WeBWorK/Localize/webwork2.pot @@ -15,20 +15,32 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" #. ($_->{problem}->version_id) -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:55 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:69 msgid " (version %1)" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:298 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:317 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:265 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:284 msgid " Answers Available." msgstr "" #. ($c->{setID}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1172 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1148 msgid " No changes have been made to set %1" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:188 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:130 +msgid "\"Act as\" a student" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:31 +msgid "\"Edit Assigned Users\" column" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:24 +msgid "\"Edit Problems\" column" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:187 msgid "# of Active Students" msgstr "" @@ -44,7 +56,7 @@ msgstr "" msgid "#incorr" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:175 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:174 msgid "% Average with Review" msgstr "" @@ -57,7 +69,7 @@ msgid "% Score:" msgstr "" #. ($achievement->{points}) -#: /opt/webwork/webwork2/templates/ContentGenerator/Achievements/achievement_badges.html.ep:25 +#: /opt/webwork/webwork2/templates/ContentGenerator/Achievements/achievement_badges.html.ep:24 msgid "%1 Points:" msgstr "" @@ -77,12 +89,12 @@ msgid "%1 sets" msgstr "" #. ($numAdded, $numSkipped, join(', ', @$skipped) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:599 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:608 msgid "%1 sets added, %2 sets skipped. Skipped sets: (%3)" msgstr "" #. ($numExported, $numSkipped, $numSkipped ? $c->tag('ul', $c->c(map { $c->tag('li', $_) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:664 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:673 msgid "%1 sets exported, %2 sets skipped. Skipped sets: (%3)" msgstr "" @@ -92,23 +104,23 @@ msgid "%1 students out of %2" msgstr "" #. ($rename_oldCourseID, $rename_oldCourseTitle, $rename_newCourseTitle, $rename_oldCourseInstitution, $rename_newCourseInstitution) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:682 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:675 msgid "%1 title and institution changed from %2 to %3 and from %4 to %5" msgstr "" #. (scalar @userIDsToExport, "$dir/$fileName") -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:479 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:477 msgid "%1 users exported to file %2" msgstr "" #. ($numReplaced, $numAdded, $numSkipped, join(', ', @$skipped) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:445 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:443 msgid "%1 users replaced, %2 users added, %3 users skipped. Skipped users: (%4)" msgstr "" #. ($percentage) #. ($level_percentage) -#: /opt/webwork/webwork2/templates/ContentGenerator/Achievements/achievement_badges.html.ep:30 /opt/webwork/webwork2/templates/ContentGenerator/Achievements/achievement_badges.html.ep:31 /opt/webwork/webwork2/templates/ContentGenerator/Achievements/cheevobigbox.html.ep:11 /opt/webwork/webwork2/templates/ContentGenerator/Achievements/cheevobigbox.html.ep:12 +#: /opt/webwork/webwork2/templates/ContentGenerator/Achievements/achievement_badges.html.ep:29 /opt/webwork/webwork2/templates/ContentGenerator/Achievements/achievement_badges.html.ep:30 /opt/webwork/webwork2/templates/ContentGenerator/Achievements/cheevobigbox.html.ep:11 /opt/webwork/webwork2/templates/ContentGenerator/Achievements/cheevobigbox.html.ep:12 msgid "%1% Complete" msgstr "" @@ -143,7 +155,8 @@ msgid "%1's password has been changed." msgstr "" #. ($c->tag('span', dir => 'ltr', format_set_name_display($setID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Login.pm:40 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1074 +#. ($c->tag('span', dir => 'ltr', $prettySetID) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Login.pm:40 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1069 /opt/webwork/webwork2/templates/ContentGenerator/Base/links.html.ep:149 msgid "%1: Problem %2" msgstr "" @@ -170,12 +183,12 @@ msgstr "" #. ($minutes) #. (sprintf('%3.1f', $testTime) #. ($timeLeft) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/LTIUpdate.pm:89 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:152 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:170 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/LTIUpdate.pm:89 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:150 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:168 msgid "%quant(%1,minute)" msgstr "" #. ($numBlanks) -#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:426 +#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:430 msgid "%quant(%1,of the questions remains,of the questions remain) unanswered." msgstr "" @@ -199,7 +212,7 @@ msgid "(%quant(%1,item))" msgstr "" #. ($problemValue) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1086 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1081 msgid "(%quant(%1,point))" msgstr "" @@ -207,7 +220,11 @@ msgstr "" msgid "(Any unsaved changes will be lost.)" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1267 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:102 +msgid "(If an action cannot be executed it will not appear.)" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1262 msgid "(This problem will not count towards your grade.)" msgstr "" @@ -227,7 +244,7 @@ msgstr "" msgid "(Your score on this %1 is not available.)" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1215 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1225 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1257 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1267 msgid "(correct)" msgstr "" @@ -235,13 +252,13 @@ msgstr "" msgid "(in target set)" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1217 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1227 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1259 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1269 msgid "(incorrect)" msgstr "" #. ($pgScore) #. ($recScore) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1219 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1229 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1261 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1271 msgid "(score %1)" msgstr "" @@ -250,17 +267,17 @@ msgid "(test) After version answer date" msgstr "" #. ($versionID) -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:150 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:164 msgid "(version %1)" msgstr "" #. ($display_sort_method_name{$secondary_sort_method}) #. ($display_sort_method_name{$ternary_sort_method}) -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:106 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:109 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:100 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:103 msgid ", then by %1" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:701 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:702 msgid ". If this is a class roster, rename it to have extension \".lst\"" msgstr "" @@ -281,36 +298,44 @@ msgstr "" msgid "Weight: %1%" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1647 +#: /opt/webwork/webwork2/conf/defaults.config:1651 msgid "

    After the Reduced Scoring Date all additional work done by the student counts at a reduced rate. Here is where you set the reduced rate which must be a percentage. For example if this value is 50% and a student views a problem during the Reduced Scoring Period, they will see the message \"You are in the Reduced Scoring Period: All additional work done counts 50% of the original.\"

    To use this, you also have to enable Reduced Scoring and set the Reduced Scoring Date for individual assignments by editing the set data using the Hmwk Sets Editor.

    This works with the avg_problem_grader (which is the the default grader) and the std_problem_grader (the all or nothing grader). It will work with custom graders if they are written appropriately.

    " msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1933 +#: /opt/webwork/webwork2/conf/defaults.config:1937 msgid "

    During summer 2005, a newer version of the answer checkers was implemented for answers which are functions and numbers. The newer checkers allow more functions in student answers, and behave better in certain cases. Some problems are specifically coded to use new (or old) answer checkers. However, for the bulk of the problems, you can choose what the default will be here.

    Choosing false here means that the newer answer checkers will be used by default, and choosing true means that the old answer checkers will be used by default.

    " msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1904 +#: /opt/webwork/webwork2/conf/defaults.config:1908 msgid "

    MathQuill renders students answers in real-time as they type on the keyboard.

    MathView allows students to choose from a variety of common math structures (such as fractions and square roots) as they attempt to input their answers.

    " msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1634 +#: /opt/webwork/webwork2/conf/defaults.config:1459 +msgid "

    Mode in which the LANG and DIR settings for a single problem are determined.

    The system will set the LANGuage attribute to either a value determined from the problem, a course-wide default, or the system default, depending on the mode selected. The tag will only be added to the DIV enclosing the problem if it is different than the value which should be set in the main HTML tag set for the entire course based on the course language.

    There are two options for the DIRection attribute: \"ltr\" for left-to-write scripts, and \"rtl\" for right-to-left scripts like Arabic and Hebrew.

    The DIRection attribute is needed to trigger proper display of the question text when the problem text-direction is different than that used by the current language of the course. For example, English problems from the library browser would display improperly in RTL mode for a Hebrew course, unless the problen Direction is set to LTR.

    The feature to set a problem language and direction was only added in 2018 to the PG language, so most problems will not declare their language, and the system needs to fall back to determining the language and direction in a different manner. The OPL itself is all English, so the system wide fallback is to en-US in LTR mode.

    Since the defaults fall back to the LTR direction, most sites should be fine with the \"auto::\" mode, but may want to select the one which matches their course language. The mode \"force::ltr\" would also be an option for a course which runs into trouble with the \"auto\" modes.

    Modes:

    • \"none\" prevents any additional LANG and/or DIR tag being added. The browser will use the main setting which was applied to the entire HTML page. This is likely to cause trouble when a problem of the other direction is displayed.
    • \"auto::\" allows the system to make the settings based on the language and direction reported by the problem (a new feature, so not set in almost all existing problems) and falling back to the expected default of en-US in LTR mode.
    • \"auto:LangCode:Dir\" allows the system to make the settings based on the language and direction reported by the problem (a new feature, so not set in almost all existing problems) but falling back to the language with the given LangCode and the direction Dir when problem settings are not available from PG.
    • \"auto::Dir\" for problems without PG settings, this will use the default en=english language, but force the direction to Dir. Problems with PG settings will get those settings.
    • \"auto:LangCode:\" for problems without PG settings, this will use the default LTR direction, but will set the language to LangCode.Problems with PG settings will get those settings.
    • \"force:LangCode:Dir\" will ignore any setting made by the PG code of the problem, and will force the system to set the language with the given LangCode and the direction to Dir for all problems.
    • \"force::Dir\" will ignore any setting made by the PG code of the problem, and will force the system to set the direction to Dir for all problems, but will avoid setting any language attribute for individual problem.
    " +msgstr "" + +#: /opt/webwork/webwork2/conf/defaults.config:1514 +msgid "

    Some servers handle courses taking place in different timezones. If this course is not showing the correct timezone, enter the correct value here. The format consists of unix times, such as \"America/New_York\", \"America/Chicago\", \"America/Denver\", \"America/Phoenix\" or \"America/Los_Angeles\".

    Complete list: TimeZoneFiles" +msgstr "" + +#: /opt/webwork/webwork2/conf/defaults.config:1638 msgid "

    This sets whether the Reduced Scoring system will be enabled. If enabled you will need to set the default length of the reduced scoring period and the value of work done in the reduced scoring period below.

    To use this, you also have to enable Reduced Scoring for individual assignments and set their Reduced Scoring Dates by editing the set data.

    This works with the avg_problem_grader (which is the the default grader) and the std_problem_grader (the all or nothing grader). It will work with custom graders if they are written appropriately.

    " msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1877 -msgid "

    When viewing a problem, users may choose different methods of rendering formulas via an options box in the left panel. Here, you can adjust what display modes are listed.

    Some display modes require other software to be installed on the server. Be sure to check that all display modes selected here work from your server.

    The display modes are

    • plainText: shows the raw LaTeX strings for formulas.
    • images: produces images using the external programs LaTeX and dvipng.
    • MathJax: a successor to jsMath, uses javascript to place render mathematics.

    You must use at least one display mode. If you select only one, then the options box will not give a choice of modes (since there will only be one active).

    " +#: /opt/webwork/webwork2/conf/defaults.config:1881 +msgid "

    When viewing a problem, users may choose different methods of rendering formulas via an options box in the left panel. Here, you can adjust what display modes are listed.

    Some display modes require other software to be installed on the server. Be sure to check that all display modes selected here work from your server.

    The display modes are

    • plainText: shows the raw LaTeX strings for formulas.
    • images: produces images using the external programs LaTeX and dvipng.
    • MathJax: a successor to jsMath, uses javascript to place render mathematics.

    You must use at least one display mode. If you select only one, then the options box will not give a choice of modes (since there will only be one active).

    " msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1411 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1476 msgid "Warning: There may be something wrong with a question in this test. Please inform your instructor including the warning messages below." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator.pm:1235 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator.pm:1236 msgid "Warning: There may be something wrong with this question. Please inform your instructor including the warning messages below." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1726 -msgid "
    • SMAcheckAnswers: enables the Check Answers button for the new problem when Show Me Another is clicked
    • SMAshowSolutions: shows walk-through solution for the new problem when Show Me Another is clicked; a check is done first to make sure that a solution exists
    • SMAshowCorrect: correct answers for the new problem can be viewed when Show Me Another is clicked; note that SMAcheckAnswersneeds to be enabled at the same time
    • SMAshowHints: show hints for the new problem (assuming they exist)
    Note: there is very little point enabling the button unless you check at least one of these options - the students would simply see a new version that they can not attempt or learn from.

    " +#: /opt/webwork/webwork2/conf/defaults.config:1730 +msgid "
    • SMAcheckAnswers: enables the Check Answers button for the new problem when Show Me Another is clicked
    • SMAshowSolutions: shows walk-through solution for the new problem when Show Me Another is clicked; a check is done first to make sure that a solution exists
    • SMAshowCorrect: correct answers for the new problem can be viewed when Show Me Another is clicked; note that SMAcheckAnswersneeds to be enabled at the same time
    • SMAshowHints: show hints for the new problem (assuming they exist)
    Note: there is very little point enabling the button unless you check at least one of these options - the students would simply see a new version that they can not attempt or learn from." msgstr "" #: /opt/webwork/webwork2/conf/LTIConfigValues.config:35 @@ -319,12 +344,12 @@ msgstr "" #. ($add_courseID) #. ($rename_newCourseID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:248 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:607 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:248 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:600 msgid "A course with ID %1 already exists." msgstr "" #. ($courseID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1232 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1220 msgid "A directory already exists with the name %1. You must first delete this existing course before you can unarchive." msgstr "" @@ -332,7 +357,7 @@ msgstr "" msgid "A file name cannot begin with a dot, it cannot be empty, it cannot contain a directory path component and only the characters -_.a-zA-Z0-9 and space are allowed." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:737 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:763 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:738 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:764 msgid "A file with that name already exists" msgstr "" @@ -340,8 +365,32 @@ msgstr "" msgid "A hardcopy file was generated, but it may not be complete or correct. Please check that no problems are missing and that they are all legible. If not, please inform your instructor." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementEditor.html.ep:56 +msgid "A hash reference in which the keys are the achievement_id's assigned to the current user and the values are 0 or 1 which stores if the user has earned the associated achievement or not." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementEditor.html.ep:52 +msgid "A hash reference which contains a problems metadata, such as DBsubject, DBchapter, DBsection, and so on." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementEditor.html.ep:37 +msgid "A hash reference which contains the problem data." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementEditor.html.ep:40 +msgid "A hash reference which contains the set data." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementEditor.html.ep:60 +msgid "A hash reference which saves data for this user and this achievement. This hash is persistent between evaluations and changes to this variable will be saved in the database." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementEditor.html.ep:64 +msgid "A hash reference which saves global data for this user. This hash is persistent between evaluations and changes to this variable will be saved in the database." +msgstr "" + #. ($locationID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1703 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1695 msgid "A location with the name %1 already exists in the database. Did you mean to edit that location instead?" msgstr "" @@ -356,19 +405,31 @@ msgid "A new file has been created at \"%1\"" msgstr "" #. ($c->shortPath($outputFilePath) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1170 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1146 msgid "A new file has been created at \"%1\" with the contents below." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:72 -msgid "A period (.) indicates a problem has not been attempted, and a number from 0 to 100 indicates the grade earned. The number on the second line gives the number of incorrect attempts." +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:154 +msgid "A new problem whose path ends in newProblem.pg should be given a new name, for example, \"myNewProblem.pg\"." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserDetail.html.ep:20 +msgid "A student must be assigned a homework set in order for it to appear on their WeBWorK home page. Check the box in the left column to assign a student to that homework set. Uncheck the box to unassign a student. If a student is unassigned from a homework set, all of the student's data for that homework set is deleted and cannot be recovered. Use this action cautiously!" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUsersAssignedToSet.html.ep:20 +msgid "A student needs to be assigned a set in order for them to work it. Once a student is unassigned a set, all the data for them is lost and there is no way to undo it. When unassigning be sure to change the option to \"Allow unassign\"." msgstr "" # Leave symbol codes in place -#: /opt/webwork/webwork2/conf/defaults.config:1545 +#: /opt/webwork/webwork2/conf/defaults.config:1549 msgid "A switch to govern the use of a Progress Bar for the student; this also enables/disables the highlighting of the current problem in the side bar, and whether it is correct (✓), in progress (…), incorrect (✗), or unattempted (no symbol)." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:42 +msgid "A unique key identifying the achievement." +msgstr "" + # Short for ADJUSTED STATUS #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Scoring.pm:326 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Scoring.pm:535 msgid "ADJ STATUS" @@ -379,11 +440,11 @@ msgstr "" msgid "ANSWERS NOT RECORDED -- %1" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1510 /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:515 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1505 /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:515 msgid "ANSWERS ONLY CHECKED -- ANSWERS NOT RECORDED" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1532 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1527 msgid "ATTEMPT NOT ACCEPTED -- Please submit answers again (or request new version if neccessary)." msgstr "" @@ -395,7 +456,7 @@ msgstr "" msgid "Abandon export" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:510 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:523 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvantage.pm:520 msgid "Account creation is currently disabled in this course. Please speak to your instructor or system administrator." msgstr "" @@ -409,10 +470,18 @@ msgstr "" msgid "Achievement %1 exists. No achievement created" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:392 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:444 /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:63 msgid "Achievement Editor" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:17 +msgid "Achievement Editor Help" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementEditor.html.ep:17 +msgid "Achievement Evaluator Editor Help" +msgstr "" + #. ($c->stash('achievementID') #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm:109 msgid "Achievement Evaluator for achievement %1" @@ -426,18 +495,26 @@ msgstr "" msgid "Achievement ID exists! No new achievement created. File not saved." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:41 +msgid "Achievement ID:" +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/default_table.html.ep:3 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/edit_table.html.ep:6 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/export_table.html.ep:3 msgid "Achievement List" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1596 +#: /opt/webwork/webwork2/conf/defaults.config:1600 msgid "Achievement Points Per Problem" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:403 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:455 msgid "Achievement User Editor" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementUserEditor.html.ep:17 +msgid "Achievement User Editor Help" +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementUserEditor.pm:48 msgid "Achievement has been assigned to all users." msgstr "" @@ -450,15 +527,31 @@ msgstr "" msgid "Achievement has been unassigned to all students." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:38 +msgid "Achievement options" +msgstr "" + #. ($c->link_to( $scoreFileName => $c->systemLink( $c->url_for('instructor_file_manager') #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:318 msgid "Achievement scores saved to %1" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:189 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:241 msgid "Achievements" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/Achievements.html.ep:17 +msgid "Achievements Help" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:26 +msgid "Achievements are evaluated in the order shown below, with the exception of \"level\" achievements. Achievements in the \"level\" category are evaluated first and control the XP thresholds and rewards (achievement items) for reaching each level. Achievements in the \"secret\" category are not shown to students until they earn the achievement, and is used for fun/surprise achievements." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:32 +msgid "Achievements in the same category, with sequential numbers, and whose ID starts with the same \"prefix_\" (up to the last underscore), are treated as achievement chains. Achievement chains are a sequence of achievements which build upon themselves, such as complete one problem, complete 10 problems, complete 25 problems, and so on. Students will only see the achievements in the chain they have completed or are currently working on." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:201 msgid "Act as" msgstr "" @@ -468,7 +561,7 @@ msgid "Act as:" msgstr "" #. ($effectiveUserName) -#: /opt/webwork/webwork2/templates/ContentGenerator/Base/login_status.html.ep:31 +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/login_status.html.ep:26 msgid "Acting as %1." msgstr "" @@ -477,7 +570,11 @@ msgstr "" msgid "Action %1 not found" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1604 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:101 +msgid "Actions:" +msgstr "" + +#: /opt/webwork/webwork2/conf/defaults.config:1608 msgid "Activating this will enable achievement rewards. This feature allows students to earn rewards by completing achievements that allow them to affect their homework in a limited way." msgstr "" @@ -494,7 +591,7 @@ msgstr "" msgid "Active Students Problem %1 Grades" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1589 +#: /opt/webwork/webwork2/conf/defaults.config:1593 msgid "Activiating this will enable Mathchievements for webwork. Mathchievements can be managed by using the Achievement Editor link." msgstr "" @@ -506,24 +603,44 @@ msgstr "" msgid "Add All" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin.html.ep:19 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:130 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:3 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:132 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:3 /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:32 msgid "Add Course" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers.html.ep:89 +#: /opt/webwork/webwork2/templates/HelpFiles/AdminAddCourse.html.ep:17 +msgid "Add Course Help" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/admin_links.html.ep:14 +msgid "Add Courses" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers.html.ep:98 msgid "Add Students" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:297 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:349 msgid "Add Users" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAddUsers.html.ep:17 +msgid "Add Users Help" +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:47 msgid "Add WeBWorK administrators to new course" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:79 +msgid "Add a TA or an instructor (change permission level of user)" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:60 +msgid "Add a few students to the course." +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/AddNewTestGW.pm:50 -msgid "Add a new test for which Gateway?" +msgid "Add a new version for which test?" msgstr "" #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor/add_problem_form.html.ep:20 @@ -534,6 +651,14 @@ msgstr "" msgid "Add how many users?" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:69 +msgid "Add many students to a course from a class list." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:108 +msgid "Add n blank problem template(s) to the end of homework set." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/problem_row.html.ep:164 msgid "Add problem to target set" msgstr "" @@ -542,21 +667,29 @@ msgstr "" msgid "Add problems to" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:161 +msgid "Add this problem as the last problem of an existing set, either as a problem or as the set header (the text that appears on the home page of a homework set). You can rearrange the order of the problems later using the \"Hmwk Sets Editor\"." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor/add_problem_form.html.ep:7 msgid "Add to what set?" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAddUsers.html.ep:20 +msgid "Add users to the course. Select the number of students/users to add and then add any desired information. The only mandatory information is the \"Login Name\". Any other fields may be left blank. The \"Student ID\" will be the initial password for the user if provided." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/import_form.html.ep:26 msgid "Add which new users?" msgstr "" #. ($c->shortPath($sourceFilePath) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:909 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:883 msgid "Added \"%1\" to %2 as new hardcopy header" msgstr "" #. ($c->shortPath($sourceFilePath) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:880 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:854 msgid "Added \"%1\" to %2 as new set header" msgstr "" @@ -567,17 +700,17 @@ msgstr "" #. ($new_file_path, $setID, $targetProblemNumber) #. ($sourceFilePath, $targetSetName, ( $set->assignment_type eq 'jitar' ? join('.', jitar_id_to_seq($targetProblemNumber) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:851 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1837 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:825 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1837 msgid "Added %1 to %2 as problem %3" msgstr "" #. ($new_file_name, $c->{setID}, ( $set->assignment_type eq 'jitar' ? join('.', jitar_id_to_seq($targetProblemNumber) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1163 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1139 msgid "Added %1 to %2 as problem %3." msgstr "" #. (join(', ', @toAdd) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1982 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1974 msgid "Added addresses %1 to location %2." msgstr "" @@ -595,36 +728,41 @@ msgstr "" msgid "Added user:" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:2066 +#. ('[Scoring]/report_grades_data.csv', '[TMPL]/email/report_grades.msg',) +#: /opt/webwork/webwork2/templates/HelpFiles/Grades.html.ep:33 +msgid "Additional (external) grades can be shown on this page by placing them in the CSV file %1. The first six columns must be (in order): Student ID, Username, Last Name, First Name, Section, Recitation. The remaining columns can list any external grades. To display the grades, the CSV file is merged with the \"Email\" message %2, which will be rendered and displayed below the grade table. The message can be created on the \"Email\" page and the CSV file can be created/uploaded using the \"File Manager\". External grades can only be displayed here and are not included in any totals or statistics." +msgstr "" + +#: /opt/webwork/webwork2/conf/defaults.config:2060 msgid "Additional addresses for receiving feedback e-mail" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:268 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:235 msgid "Additional submissions available." msgstr "" #. ($badLocAddr) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1716 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1708 msgid "Address(es) %1 already exist in the database. THIS SHOULD NOT HAPPEN! Please double check the integrity of the WeBWorK database before continuing." msgstr "" #. (join(', ', @noAdd) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1994 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1986 msgid "Address(es) %1 in the add list is(are) already in the location %2, and so were skipped." msgstr "" #. (join(', ', @noDel) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2016 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2008 msgid "Address(es) %1 in the delete list is(are) not in the location %2, and so were skipped." msgstr "" #. ($badAddr) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1691 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1683 msgid "Address(es) %1 is(are) not in a recognized form. Please check your data entry and resubmit." msgstr "" #. ($badAddr) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2006 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1998 msgid "Address(es) %1 is(are) not in a recognized form. Please check your data entry and try again." msgstr "" @@ -648,6 +786,10 @@ msgstr "" msgid "Adds 48 hours to the close date of a homework." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:110 +msgid "Adds new template problems to the set when the set is saved. You can modify the template to create your own problem, by clicking on the \"Edit Problem\" link and saving to some new file, e.g. \"myNewProblem.pg\"." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/problem_list.html.ep:19 msgid "Adjusted Status" msgstr "" @@ -664,13 +806,13 @@ msgstr "" msgid "After set answer date" msgstr "" -#. ($reducedScoringPerCent) -#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet.html.ep:36 -msgid "After the reduced scoring period begins all work counts for %1% of its value." +#. ($c->formatDateTime($set->due_date) +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/set_status.html.ep:33 +msgid "After the due date this set enters a reduced scoring period until it closes on %1. All work completed during the reduced scoring period counts for %2% of its value." msgstr "" #. ($c->formatDateTime($set->due_date() -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:300 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:304 msgid "Afterward reduced credit can be earned until %1." msgstr "" @@ -714,14 +856,18 @@ msgstr "" msgid "All listed sets were made visible for all the students" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:403 +#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:407 msgid "All of the answers above are correct." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:394 +#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:398 msgid "All of the gradeable answers above are correct." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:162 +msgid "All of the paths for problem files are relative to the templates directory of the current course. You can access this directory \"directly\" using the File Manager page." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Scoring.html.ep:68 msgid "All of these files will also be made available for mail merge." msgstr "" @@ -734,11 +880,11 @@ msgstr "" msgid "All sections" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2153 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2145 msgid "All selected courses are already hidden." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2222 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2214 msgid "All selected courses are already unhidden." msgstr "" @@ -758,7 +904,7 @@ msgstr "" msgid "All sets made visible for all students" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:610 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:619 msgid "All sets were selected for export." msgstr "" @@ -766,7 +912,7 @@ msgstr "" msgid "All unassignments were made successfully." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1944 +#: /opt/webwork/webwork2/conf/defaults.config:1948 msgid "Allow Unicode alternatives in student answers" msgstr "" @@ -778,73 +924,89 @@ msgstr "" msgid "Allow unassign" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1966 +#: /opt/webwork/webwork2/conf/defaults.config:1970 msgid "Allowed error, as a percentage, for numerical comparisons" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1784 +#: /opt/webwork/webwork2/conf/defaults.config:1788 msgid "Allowed to act as another user" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1821 +#: /opt/webwork/webwork2/conf/defaults.config:1825 msgid "Allowed to change display settings used in pg problems" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1811 +#: /opt/webwork/webwork2/conf/defaults.config:1815 msgid "Allowed to change their e-mail address" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1775 +#: /opt/webwork/webwork2/conf/defaults.config:1779 msgid "Allowed to change their password" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1770 +#: /opt/webwork/webwork2/conf/defaults.config:1774 msgid "Allowed to login to the course" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1848 +#: /opt/webwork/webwork2/conf/defaults.config:1852 msgid "Allowed to see solutions before the answer date" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1843 +#: /opt/webwork/webwork2/conf/defaults.config:1847 msgid "Allowed to see the correct answers before the answer date" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1832 +#: /opt/webwork/webwork2/conf/defaults.config:1836 msgid "Allowed to view past answers" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1838 +#: /opt/webwork/webwork2/conf/defaults.config:1842 msgid "Allowed to view problems in sets which are not open yet" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:82 +msgid "Allows configuration of certain parameters, such as permission levels, default display mode for equations, and email feedback behavior, on a course by course basis." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:126 +msgid "Also copy simple configuration file" +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/ExtendDueDateGW.pm:26 msgid "Amulet of Extension" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementEditor.html.ep:20 +msgid "An achievement evaluator is a perl script that is run after each problem is submitted which returns a truth value of 0 (didn't earn) or 1 (earn). The evaluator is given access to different variables which contain data about the problem and set that is used to determine if the achievement is earned or not." +msgstr "" + #: /opt/webwork/webwork2/conf/LTIConfigValues.config:37 msgid "An address that can be used to log in to the LMS. This is used in messages to users that direct them to go back to the LMS to access something in the WeBWorK course." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementEditor.html.ep:43 +msgid "An array which lists the hash reference of all the problems in the current set." +msgstr "" + #. ($archive_courseID) #. ($unarchive_courseID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1086 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1282 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1074 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1274 msgid "An error occured while archiving the course %1:" msgstr "" #. ($rename_oldCourseID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:665 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:658 msgid "An error occured while changing the title of the course %1." msgstr "" #. ($delete_courseID) #. ($archive_courseID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1116 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:889 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1104 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:878 msgid "An error occured while deleting the course %1:" msgstr "" #. ($rename_oldCourseID, $rename_newCourseID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:760 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:751 msgid "An error occured while renaming the course %1 to %2:" msgstr "" @@ -853,7 +1015,7 @@ msgstr "" msgid "Answer %1 Score (%):" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:317 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/set_list_table.html.ep:12 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/sort_form.html.ep:10 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/sort_form.html.ep:24 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:80 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:317 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/set_list_table.html.ep:12 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/sort_form.html.ep:10 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/sort_form.html.ep:24 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:79 msgid "Answer Date" msgstr "" @@ -865,19 +1027,23 @@ msgstr "" msgid "Answer Hash Info" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:240 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:292 msgid "Answer Log" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:281 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorShowAnswers.html.ep:17 +msgid "Answer Log Help" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:285 msgid "Answer Preview" msgstr "" #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:48 -msgid "Answer availability for gateway quizzes depends on multiple gateway quiz settings. This only indicates the template answer date has passed. See set editor for actual availability." +msgid "Answer availability for tests depends on multiple settings. This only indicates the template answer date has passed. See set editor for actual availability." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1234 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1276 msgid "Answer(s) submitted:" msgstr "" @@ -901,11 +1067,11 @@ msgstr "" msgid "Answers cannot be made available until on or after the close date!" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList.html.ep:35 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList.html.ep:21 msgid "Any changes made below will be reflected in the achievement for ALL students." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:175 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList.html.ep:90 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:175 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList.html.ep:69 msgid "Any changes made below will be reflected in the set for ALL students." msgstr "" @@ -913,15 +1079,19 @@ msgstr "" msgid "Any changes made below will be reflected in the set for ONLY the student(s) listed above." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:122 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:122 /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:159 msgid "Append" msgstr "" #. (tag('strong', dir => 'ltr', format_set_name_display($c->{fullSetID}) -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor/save_as_form.html.ep:70 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor/save_as_form.html.ep:71 msgid "Append to end of %1 set" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/Levels.html.ep:51 +msgid "Applying definitions theoretically and proof writing" +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_confirm.html.ep:91 msgid "Archive" msgstr "" @@ -936,23 +1106,23 @@ msgstr "" msgid "Archive \"%1\" deleted" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin.html.ep:29 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_confirm.html.ep:1 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:1 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:55 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_confirm.html.ep:1 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:1 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager.html.ep:46 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:51 /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:38 msgid "Archive Course" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:40 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:71 -msgid "Archive Courses" +#: /opt/webwork/webwork2/templates/HelpFiles/AdminArchiveCourse.html.ep:17 +msgid "Archive Course Help" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1170 -msgid "Archive next course" +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/admin_links.html.ep:24 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:32 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:63 +msgid "Archive Courses" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Base/links.html.ep:278 -msgid "Archive this Course" +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1158 +msgid "Archive next course" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin.html.ep:92 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin.html.ep:61 msgid "Archived Courses" msgstr "" @@ -961,6 +1131,14 @@ msgstr "" msgid "Archived course as %1.tar.gz." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/AdminArchiveCourse.html.ep:25 +msgid "Archived courses are located inside the \"archives\" directory of the \"admin\" course. Use the \"File Manager\" to access the .tar.gz files." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/AdminUnarchiveCourse.html.ep:26 +msgid "Archived courses are located inside the \"archives\" directory of the \"admin\" course. Use the \"File Manager\" to upload additional .tar.gz files to be unarchived." +msgstr "" + #. (tag('b', $archive_courseID) #: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_confirm.html.ep:57 msgid "Are you sure that you want to delete the course %1 after archiving? This cannot be undone!" @@ -971,6 +1149,10 @@ msgstr "" msgid "Are you sure you want to delete the course %1? All course files and data will be destroyed. There is no undo available." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorScoring.html.ep:64 +msgid "As the checkbox says, this includes a percentage grade column for each set." +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:63 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:184 msgid "Assign" msgstr "" @@ -979,10 +1161,26 @@ msgstr "" msgid "Assign All Sets to Current User" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:106 +msgid "Assign achievements" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:43 +msgid "Assign and unassign selected exercise sets to selected users." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Assigner.html.ep:54 msgid "Assign selected sets to selected users" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:154 +msgid "Assign sets to many students" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:116 +msgid "Assign sets to one student" +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/import_form.html.ep:15 msgid "Assign this achievement to which users?" msgstr "" @@ -1020,11 +1218,11 @@ msgstr "" msgid "Assignment type" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1902 +#: /opt/webwork/webwork2/conf/defaults.config:1906 msgid "Assist with the student answer entry process." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:413 +#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:417 msgid "At least one of the answers above is NOT correct." msgstr "" @@ -1053,52 +1251,59 @@ msgstr "" msgid "Audit" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:347 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:353 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:360 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:366 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvantage.pm:460 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvantage.pm:466 msgid "Authentication failed. Please speak to your instructor." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:108 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/InstructorRPCHandler.pm:44 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/RenderViaRPC.pm:43 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/RenderViaRPC.pm:44 +msgid "Authentication failed. Log in again to continue." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:116 /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:69 msgid "Author Info" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:84 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:87 msgid "Automatic" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1955 +#: /opt/webwork/webwork2/conf/defaults.config:1959 msgid "Automatically convert Full Width Unicode characters to their ASCII equivalents" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:97 +msgid "Automatically render all problems in the set on this page when \"Save Changes\" or \"Reset Form\" is clicked." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:667 msgid "Automatically render problems on page load" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:95 +msgid "Automatically render problems on page load." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Problem/checkboxes.html.ep:49 msgid "Auxiliary Resources" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:36 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:180 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:36 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:179 msgid "Average Attempts" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:119 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:118 msgid "Average Attempts Per Problem" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:34 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:116 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:34 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:115 msgid "Average Percent" msgstr "" #. ($c->formatDateTime($backupTime, undef, $ce->{studentDateDisplayFormat}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:584 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:558 msgid "Backup created on %1" msgstr "" -#. ("$emailDirectory/$old_default_msg_file") -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:314 -msgid "Backup file %1 created." -msgstr "" - #: /opt/webwork/webwork2/templates/ContentGenerator/Achievements/achievement_badges.html.ep:1 msgid "Badges" msgstr "" @@ -1111,6 +1316,14 @@ msgstr "" msgid "Before Open Date" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:31 +msgid "Below the file list is a button and options for uploading files. Click the \"Choose File\" button, select the file, then click \"Upload\". A single file or a compressed tar (.tgz) file can be uploaded and if the option is selected, the archive is automatically unpacked and deleted. Generally the \"automatic\" option on Format will correctly pick the correct type of file." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:83 +msgid "Binary" +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:313 msgid "Both Start and Grade" msgstr "" @@ -1127,11 +1340,11 @@ msgstr "" msgid "Browse from:" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:2078 +#: /opt/webwork/webwork2/conf/defaults.config:2072 msgid "By default, feedback is always sent to all users specified to recieve feedback. This variable sets the system to only email feedback to users who have the same section as the user initiating the feedback. I.e., feedback will only be sent to section leaders." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:2068 +#: /opt/webwork/webwork2/conf/defaults.config:2062 msgid "By default, feedback is sent to all users above who have permission to receive feedback. Feedback is also sent to any addresses specified in this blank. Separate email address entries by commas." msgstr "" @@ -1147,19 +1360,19 @@ msgstr "" msgid "Cake of Enlargement" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1789 +#: /opt/webwork/webwork2/conf/defaults.config:1793 msgid "Can e-mail instructor" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1802 +#: /opt/webwork/webwork2/conf/defaults.config:1806 msgid "Can report bugs" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1853 +#: /opt/webwork/webwork2/conf/defaults.config:1857 msgid "Can show old answers" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1795 +#: /opt/webwork/webwork2/conf/defaults.config:1799 msgid "Can submit answers for a student" msgstr "" @@ -1199,22 +1412,22 @@ msgid "Can't delete archive \"%1\": %2" msgstr "" #. ($setID, $TargetUser->user_id,) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:921 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:925 msgid "Can't generate hardcopy for set \"%1\" for user \"%2\". The set is not visible to students." msgstr "" #. ($filePath) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:463 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:445 msgid "Can't open %1" msgstr "" #. ($filePath) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1417 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1426 msgid "Can't open file %1" msgstr "" #. ($merge_file) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:358 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:343 msgid "Can't read merge file %1. No message sent" msgstr "" @@ -1223,7 +1436,7 @@ msgstr "" msgid "Can't rename file: %1" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:598 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:591 msgid "Can't rename to the same name." msgstr "" @@ -1262,11 +1475,11 @@ msgstr "" msgid "Cancel Password" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:542 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:516 msgid "Cannot find a file path to save to." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:527 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:501 msgid "Cannot find a problem record for set $c->{setID} / problem $c->{problemID}" msgstr "" @@ -1283,6 +1496,10 @@ msgstr "" msgid "Category" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:49 +msgid "Category:" +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/DoubleSet.pm:27 msgid "Cause the selected homework set to count for twice as many points as it normally would." msgstr "" @@ -1303,7 +1520,7 @@ msgstr "" msgid "Change CourseID to:" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Options.html.ep:76 /opt/webwork/webwork2/templates/HTML/ScrollingRecordList/scrollingRecordList.html.ep:25 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:134 /opt/webwork/webwork2/templates/ContentGenerator/Options.html.ep:76 /opt/webwork/webwork2/templates/HTML/ScrollingRecordList/scrollingRecordList.html.ep:25 msgid "Change Display Settings" msgstr "" @@ -1323,28 +1540,60 @@ msgstr "" msgid "Change User Settings" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:35 +msgid "Change a course's ID, Title, or Institution." +msgstr "" + #. ($rename_oldCourseInstitution, $rename_newCourseInstitution) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:519 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:512 msgid "Change course institution from %1 to %2" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:160 +msgid "Change dates for a homework set for the whole class." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:123 +msgid "Change the due date for one student" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserDetail.html.ep:26 +msgid "Change the due dates for an individual student on this page. Check the checkbox and enter the new date in order to override the date. (You can copy the date format from the date in the right hand column which indicates the date when the homework set is due for the whole class.) Note that you should ensure that the close date is before the answer date. If the close date for a student is extended until after the class answer date for the set, then the answer date for the student must also be set to a later date. " +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:141 +msgid "Change the grades on a homework set for one student." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:163 +msgid "Change the grading on a homework set for an entire class." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:170 +msgid "Change the number of atttempts allowed on a problem." +msgstr "" + #. ($rename_oldCourseTitle, $rename_newCourseTitle) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:515 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:508 msgid "Change title from %1 to %2" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:490 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:542 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:488 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:540 msgid "Changes abandoned" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:244 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:242 msgid "Changes in this file have not yet been permanently saved." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Config.pm:176 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:531 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Config.pm:191 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:529 msgid "Changes saved" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:38 +msgid "Changing dates" +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:514 msgid "Changing the problem seed for display, but there are no problems showing." msgstr "" @@ -1357,10 +1606,14 @@ msgstr "" msgid "Check Answers" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:678 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:682 msgid "Check Test" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:53 +msgid "Choose problems from a library and add them to a homework set." +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/DoubleSet.pm:40 msgid "Choose the set which you would like to be worth twice as much." msgstr "" @@ -1389,11 +1642,15 @@ msgstr "" msgid "Choose which sets to be affected" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:577 -msgid "Class value" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:17 +msgid "Class List Editor Help" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:55 +msgid "Class list (\".lst\") files" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:264 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:316 /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:48 /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:37 msgid "Classlist Editor" msgstr "" @@ -1401,24 +1658,70 @@ msgstr "" msgid "Clear Problem Display" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:88 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:82 msgid "Click a student's name to see the student's homework set. Click a heading to sort the table." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:80 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:74 msgid "Click a student's name to see the student's test summary page. Click a test's version number to see the corresponding test version. Click a heading to sort the table." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList.html.ep:112 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:150 +msgid "Click first in the \"Assigned Sets\" column in the student's row. This will take you to a new page where you will click on the link to the homework set where the grade change is to be made." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:143 +msgid "Click first in the \"Assigned Sets\" column in the student's row. This will take you to a new page where you will click on the link to the homework set where the grade change is to be made. (The grade for each problem is listed as \"status\" on this third page)." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorConfig.html.ep:24 +msgid "Click on each of the tabs to view the configuration items. The question mark icon provides access to information about the behavior of the configuration settings." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:125 +msgid "Click on the column \"Assigned Sets\" in the student's row. This will take you to a page where you can assign and unassign homework sets and change the due dates for homework on an individual basis." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserDetail.html.ep:33 +msgid "Click on the homework set links to edit the grades for this individual student on the homework set. (The grade of each problem is called the \"status\".) You can also change the number of allowed attempts and further modify the individual student's homework set.) You will also be able to change a student's seed which determines the individual values used in the individual version of the student's problem and the weight (how much a problem counts towards the grade.)" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList.html.ep:90 msgid "Click on the login name to edit individual problem set data, (e.g. due dates) for these students." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:62 +msgid "Click the \"Add x student(s)\" radio button and then click \"Take action\". This will take you to a new page where the data can be entered for one or more students. It is also possible to assign the student to one or more problem sets as they are being entered: simply select the homework sets from the list below the data entry table. Use \"command\" or \"control\" click to select more than one homework set." +msgstr "" + +#. ('') +#: /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:20 /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:88 +msgid "Click the %1 icon for page and item specific help." +msgstr "" + +#. ('') +#: /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:20 +msgid "Click the icon %1 for page and item specific help." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:185 +msgid "Clicking on any active link at the top of the column sorts the page by that column. You can do lexigraphic sorts: click on \"First name\" then \"Last name\" to sort by last name, sorting those with the same last name by their first name." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:132 +msgid "Clicking on the login name link in a student's row allows you to view the student's version of the homework (rather than your own) so that you can more easily answer student questions about homework problems. (A \"acting as xxx\" alert will appear in the upper right corner of each window while you are acting as a student.) You can submit the answers (which will NOT be recorded) to check that the computer is grading the problem correctly. You will also be able to view past answers submitted by the student for each problem. To stop acting in the student's role click the \"Stop acting\" link in the upper right corner of the window." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:199 +msgid "Clicking the e-mail address link will bring up your standard email application so that you can send email to the student. This works even if the student has been dropped from the course. To send email to an entire class or to merge grades with the email message use the \"Email\" page link in the left margin." +msgstr "" + #. ($clientIP->ip() -#: /opt/webwork/webwork2/lib/WeBWorK/Authz.pm:536 +#: /opt/webwork/webwork2/lib/WeBWorK/Authz.pm:547 msgid "Client ip address %1 is not allowed to work this assignment, because the assignment has ip address restrictions and there are no allowed locations associated with the restriction. Contact your professor to have this problem resolved." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:316 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/set_list_table.html.ep:11 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/sort_form.html.ep:23 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/sort_form.html.ep:9 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:76 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UsersAssignedToSet.html.ep:39 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:316 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/set_list_table.html.ep:11 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/sort_form.html.ep:23 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/sort_form.html.ep:9 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:75 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UsersAssignedToSet.html.ep:39 msgid "Close Date" msgstr "" @@ -1426,20 +1729,20 @@ msgstr "" msgid "Closed" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:204 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:208 msgid "Closed, answers available." msgstr "" #. ($c->formatDateTime($set->answer_date, undef, $ce->{studentDateDisplayFormat}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:200 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:204 msgid "Closed, answers on %1." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:202 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:206 msgid "Closed, answers recently available." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:315 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:282 msgid "Closed." msgstr "" @@ -1447,13 +1750,8 @@ msgstr "" msgid "Closes" msgstr "" -#. ($c->formatDateTime($set->due_date, undef, $ce->{studentDateDisplayFormat}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:145 -msgid "Closes %1" -msgstr "" - #. ($c->formatDateTime($verSet->due_date, undef, $ce->{studentDateDisplayFormat}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:260 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:227 msgid "Closes on %1" msgstr "" @@ -1461,11 +1759,11 @@ msgstr "" msgid "Closes:" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:357 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:357 /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:71 msgid "Collapse All Details" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:367 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:367 /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:85 msgid "Collapse All Nesting" msgstr "" @@ -1477,15 +1775,19 @@ msgstr "" msgid "Collapse Problem Details" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1613 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:73 +msgid "Collapse problem details to the top row of information about a problem. Note that the details of a single problem can be collapsed by clicking on the up arrow to the right of the problem source file." +msgstr "" + +#: /opt/webwork/webwork2/conf/defaults.config:1617 msgid "Comma separated list of set names that are excluded from all achievements. No achievement points and badges can be earned for submitting problems in these sets. Note that underscores (_) must be used for spaces in set names." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ShowAnswers.pm:223 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:131 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers.html.ep:48 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:112 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ShowAnswers/past-answers-table.html.ep:49 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/user_list.html.ep:46 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ShowAnswers.pm:223 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:131 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers.html.ep:48 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:126 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ShowAnswers/past-answers-table.html.ep:49 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/user_list.html.ep:46 msgid "Comment" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers/student_entry_report.html.ep:25 /opt/webwork/webwork2/templates/HTML/SingleProblemGrader/grader.html.ep:177 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers/student_entry_report.html.ep:25 /opt/webwork/webwork2/templates/HTML/SingleProblemGrader/grader.html.ep:181 msgid "Comment:" msgstr "" @@ -1502,7 +1804,7 @@ msgstr "" msgid "Completed results for this assignment are not available." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:297 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:313 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:264 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:280 msgid "Completed." msgstr "" @@ -1510,6 +1812,14 @@ msgstr "" msgid "Compose Email Message" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:47 +msgid "Configure ip ranges (locations) that can be used to restrict set access." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:45 +msgid "Configure which course links appear on the site landing page." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/manage_location_form.html.ep:97 msgid "Confirm" msgstr "" @@ -1520,7 +1830,7 @@ msgstr "" msgid "Confirm %1's New Password" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:84 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:78 msgid "Confirm Password" msgstr "" @@ -1532,7 +1842,7 @@ msgstr "" msgid "Congratulations, you earned a new level!" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2258 /opt/webwork/webwork2/templates/ContentGenerator/Login.html.ep:62 /opt/webwork/webwork2/templates/ContentGenerator/LoginProctor.html.ep:95 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2250 /opt/webwork/webwork2/templates/ContentGenerator/Login.html.ep:64 /opt/webwork/webwork2/templates/ContentGenerator/LoginProctor.html.ep:95 msgid "Continue" msgstr "" @@ -1540,8 +1850,12 @@ msgstr "" msgid "Continue Open Test" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:59 +msgid "Controls if an achievement is evaluated or not." +msgstr "" + #. ($sourceDirectory, $outputDirectory) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:697 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:671 msgid "Copied auxiliary files from %1 to new location at %2." msgstr "" @@ -1553,12 +1867,8 @@ msgstr "" msgid "Copy file as:" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:53 -msgid "Copy simple configuration file to new course" -msgstr "" - -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:118 -msgid "Copy templates from:" +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:112 +msgid "Copy from:" msgstr "" #: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/DuplicateProb.pm:82 @@ -1573,7 +1883,7 @@ msgstr "" msgid "Correct Adjusted Status" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:283 +#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:287 msgid "Correct Answer" msgstr "" @@ -1581,7 +1891,7 @@ msgstr "" msgid "Correct Answers" msgstr "" -#: /opt/webwork/webwork2/lib/HardcopyRenderedProblem.pm:236 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1275 +#: /opt/webwork/webwork2/lib/HardcopyRenderedProblem.pm:239 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1317 msgid "Correct Answers:" msgstr "" @@ -1622,28 +1932,44 @@ msgstr "" msgid "Counter" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:66 +msgid "Counter:" +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:503 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/problem_list.html.ep:35 msgid "Counts for Parent" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:138 /opt/webwork/webwork2/templates/ContentGenerator/Base/links.html.ep:19 /opt/webwork/webwork2/templates/ContentGenerator/Home.html.ep:9 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:154 /opt/webwork/webwork2/templates/ContentGenerator/Home.html.ep:9 msgid "Course Administration" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:317 +#: /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:17 +msgid "Course Administration Help" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:369 /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:80 msgid "Course Configuration" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorConfig.html.ep:17 +msgid "Course Configuration Help" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/ProblemSets.html.ep:17 +msgid "Course Home Help" +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:21 msgid "Course ID" msgstr "" #. ($ce->{maxCourseIdLength}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1235 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:251 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:601 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1223 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:251 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:594 msgid "Course ID cannot exceed %1 characters." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:245 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:604 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1227 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:245 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:597 msgid "Course ID may only contain letters, numbers, hyphens, and underscores." msgstr "" @@ -1656,11 +1982,15 @@ msgid "Course Info" msgstr "" #. ($c->stash('courseID') -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:327 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:325 msgid "Course Information for course %1" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:46 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/delete_course_form.html.ep:38 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/hide_inactive_course_form.html.ep:46 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/unarchive_course_form.html.ep:24 +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/admin_links.html.ep:7 /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:30 +msgid "Course Listings" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:38 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/delete_course_form.html.ep:38 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/hide_inactive_course_form.html.ep:46 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/unarchive_course_form.html.ep:17 msgid "Course Name:" msgstr "" @@ -1668,11 +1998,11 @@ msgstr "" msgid "Course Title" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Base/links.html.ep:7 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin.html.ep:83 /opt/webwork/webwork2/templates/ContentGenerator/Home.html.ep:12 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin.html.ep:52 /opt/webwork/webwork2/templates/ContentGenerator/Home.html.ep:12 msgid "Courses" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:14 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/hide_inactive_course_form.html.ep:13 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:6 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/hide_inactive_course_form.html.ep:13 msgid "Courses are listed either alphabetically or in order by the time of most recent login activity, oldest first. To change the listing order check the mode you want and click \"Refresh Listing\". The listing format is: Course_Name (status :: date/time of most recent login) where status is \"hidden\" or \"visible\"." msgstr "" @@ -1680,11 +2010,11 @@ msgstr "" msgid "Courses are listed either alphabetically or in order by the time of most recent login activity, oldest first. To change the listing order check the mode you want and click \"Refresh Listing\". The listing format is: Course_Name (status :: date/time of most recent login) where status is \"hidden\" or \"visible\"." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:67 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:105 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers.html.ep:29 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:163 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:67 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:105 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers.html.ep:29 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:163 /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:84 msgid "Create" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ShowAnswers/instructor-selectors.html.ep:52 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ShowAnswers/instructor-selectors.html.ep:41 msgid "Create CSV" msgstr "" @@ -1692,6 +2022,10 @@ msgstr "" msgid "Create Location:" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:39 +msgid "Create a .tar.gz archive which includes the course's database and all course files." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/top_row.html.ep:33 msgid "Create a New Set in This Course:" msgstr "" @@ -1700,6 +2034,18 @@ msgstr "" msgid "Create a new achievement with ID" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:33 +msgid "Create a new course on this server." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/AdminAddCourse.html.ep:20 +msgid "Create a new course. The \"Course ID\" is used as the course name and is used in course links. Underscores appear as spaces when displaying the course name. The \"Course Title\" is used as the title on the course home page." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:86 +msgid "Create a new set with a given name. This can either create an empty set or a duplicate of an existing set." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/create_form.html.ep:12 msgid "Create as what type of achievement?" msgstr "" @@ -1712,19 +2058,19 @@ msgstr "" msgid "Create backup" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor/save_as_form.html.ep:80 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor/save_as_form.html.ep:81 msgid "Create unattached problem" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:4 -msgid "Creates a gzipped tar archive (.tar.gz) of a course in the WeBWorK courses directory. Before archiving, the course database is dumped into a subdirectory of the course's DATA directory. Currently the archive facility is only available for mysql databases. It depends on the mysqldump application." +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:121 +msgid "Create/Delete achievements" msgstr "" #: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/DoubleProb.pm:26 msgid "Cupcake of Enlargement" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Config.html.ep:51 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Config.html.ep:38 msgid "Current" msgstr "" @@ -1732,7 +2078,7 @@ msgstr "" msgid "Currently defined locations are listed below." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2373 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2365 msgid "Database tables are ok" msgstr "" @@ -1744,11 +2090,11 @@ msgstr "" msgid "Database tables ok" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1387 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1507 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1379 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1499 msgid "Database:" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:159 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:153 msgid "Date" msgstr "" @@ -1756,42 +2102,62 @@ msgstr "" msgid "Dates" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:394 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:409 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:426 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Config.html.ep:50 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:40 +msgid "Dates for problem sets can be edited by clicking the pencil icon in the \"Edit Set Data\" column next to the set name. To change dates for several sets at once, click the check box in the \"Select\" column and choose \"Edit selected\" from the tasks above." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:394 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:409 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:426 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Config.html.ep:37 msgid "Default" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1573 +#: /opt/webwork/webwork2/conf/defaults.config:1577 msgid "Default Amount of Time (in minutes) after Due Date that Answers are Open" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1563 +#: /opt/webwork/webwork2/conf/defaults.config:1567 msgid "Default Amount of Time (in minutes) before Due Date that the Assignment is Open" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1683 +#: /opt/webwork/webwork2/conf/defaults.config:1687 msgid "Default Length of Reduced Scoring Period in minutes" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1553 +#: /opt/webwork/webwork2/conf/defaults.config:1557 msgid "Default Time that the Assignment is Due" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1706 +#: /opt/webwork/webwork2/conf/defaults.config:1710 msgid "Default number of attempts before Show Me Another can be used (-1 => Never)" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1990 +#: /opt/webwork/webwork2/conf/defaults.config:1994 msgid "Default number of attempts before hints are shown in a problem (-1 => hide hints)" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:68 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:106 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:85 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/delete_course_confirm.html.ep:16 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager.html.ep:34 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/delete.html.ep:70 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:43 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:68 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:106 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:85 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/delete_course_confirm.html.ep:16 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager.html.ep:34 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/delete.html.ep:70 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:43 /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:89 msgid "Delete" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin.html.ep:28 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/delete_course_confirm.html.ep:1 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/delete_course_form.html.ep:1 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/delete_course_form.html.ep:32 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/delete_course_form.html.ep:49 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/delete_course_confirm.html.ep:1 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/delete_course_form.html.ep:1 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/delete_course_form.html.ep:32 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/delete_course_form.html.ep:49 /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:36 msgid "Delete Course" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/AdminDeleteCourse.html.ep:17 +msgid "Delete Course Help" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/admin_links.html.ep:23 +msgid "Delete Courses" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:37 +msgid "Delete a course and all associated data." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:109 +msgid "Delete a student from a course" +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/edit_location_form.html.ep:52 msgid "Delete all existing addresses" msgstr "" @@ -1805,15 +2171,15 @@ msgstr "" msgid "Delete backup from %1" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:62 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:54 msgid "Delete course after archiving. Caution there is no undo!" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:57 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:49 msgid "Delete course:" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2356 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2348 msgid "Delete field when upgrading" msgstr "" @@ -1829,10 +2195,14 @@ msgstr "" msgid "Delete oldest backup" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2329 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2321 msgid "Delete table when upgrading" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:90 +msgid "Delete the sets checked below. Be careful, this cannot be undone." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/delete_form.html.ep:6 msgid "Delete which achievements?" msgstr "" @@ -1846,7 +2216,7 @@ msgid "Delete which users?" msgstr "" #. ($num) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:372 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:396 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:370 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:394 msgid "Deleted %1 users." msgstr "" @@ -1856,31 +2226,35 @@ msgid "Deleted %quant(%1,achievement)" msgstr "" #. (join(', ', @delLocations) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1818 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1810 msgid "Deleted Location(s): %1" msgstr "" #. (join(', ', @toDel) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1974 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1966 msgid "Deleted addresses %1 from location." msgstr "" #. ($formatBackupTime) #. ($c->formatDateTime($delTime, undef, $ce->{studentDateDisplayFormat}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1267 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:595 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1243 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:569 msgid "Deleted backup from %1." msgstr "" #. ($c->shortPath($c->{tempFilePath}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:705 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:679 msgid "Deleted temp file at %1" msgstr "" #. ($c->shortPath($c->{tempFilePath}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1243 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1219 msgid "Deleted temporary file \"%1\"." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:125 +msgid "Deleting Problems" +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/manage_location_form.html.ep:68 msgid "Deletion deletes all location data and related addresses, and is not undoable!" msgstr "" @@ -1897,15 +2271,19 @@ msgstr "" msgid "Description" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSets.html.ep:67 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:71 +msgid "Description:" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSets.html.ep:69 msgid "Deselect All Sets" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:231 +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:229 msgid "Deselect All Test Versions" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:385 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:366 msgid "Didn't recognize action" msgstr "" @@ -1923,15 +2301,15 @@ msgstr "" msgid "Directory \"%1\" removed (items deleted: %2)" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin.html.ep:64 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin.html.ep:33 msgid "Directory permission errors" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1447 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1583 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_confirm.html.ep:49 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/rename_course_confirm.html.ep:44 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1439 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1575 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_confirm.html.ep:49 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/rename_course_confirm.html.ep:44 msgid "Directory structure is missing directories or the webserver lacks sufficient privileges." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1442 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1578 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_confirm.html.ep:46 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/rename_course_confirm.html.ep:41 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1434 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1570 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_confirm.html.ep:46 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/rename_course_confirm.html.ep:41 msgid "Directory structure is ok" msgstr "" @@ -1947,30 +2325,47 @@ msgstr "" msgid "Directory structure or permissions need to be repaired." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1422 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1548 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1414 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1540 msgid "Directory structure:" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:76 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:372 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/view_problems_line.html.ep:9 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:104 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:92 +msgid "Display Mode" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:90 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:372 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/view_problems_line.html.ep:9 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:104 msgid "Display Mode:" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ShowAnswers/instructor-selectors.html.ep:48 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ShowAnswers/instructor-selectors.html.ep:37 msgid "Display Past Answers" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/Options.html.ep:44 +msgid "Display mode for equations" +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Grades.pm:311 msgid "Display of scores for this test is not allowed." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:10 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:12 msgid "Display options: Show" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1914 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:48 +msgid "Display sets matching a selected criteria. Useful if there are many sets." +msgstr "" + +#: /opt/webwork/webwork2/conf/defaults.config:1918 msgid "Display the evaluated student answer" msgstr "" +#. ('COURSENAME_totals.csv', 'COURSENAME_totals_bak1.csv') +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorScoring.html.ep:74 +msgid "Do NOT use the file name %1, since you might accidentally overwrite that if you again export your WeBWorK homework scores. (Actually the earlier file is moved to %2 -- so you can recover using the File Manager.)" +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Assigner.html.ep:57 msgid "Do not unassign students unless you know what you are doing." msgstr "" @@ -1983,12 +2378,12 @@ msgstr "" msgid "Do not uncheck students, unless you know what you are doing." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:652 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:656 msgid "Do you want to grade this test?" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:94 -msgid "Documentation from source code for PG modules and macro files. Often the most up-to-date information." +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:93 +msgid "Documentation from source code for PG modules and macro files." msgstr "" #: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_confirm.html.ep:105 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_confirm.html.ep:95 @@ -1999,7 +2394,7 @@ msgstr "" msgid "Don't Unarchive" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/upgrade_course_confirm.html.ep:45 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/upgrade_course_confirm.html.ep:46 msgid "Don't Upgrade" msgstr "" @@ -2024,7 +2419,7 @@ msgstr "" msgid "Don't use in an achievement" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1603 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:766 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/import_form.html.ep:47 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/set_list_field.html.ep:13 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserDetail/set_date_table.html.ep:49 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1595 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:766 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/import_form.html.ep:47 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/set_list_field.html.ep:13 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserDetail/set_date_table.html.ep:57 msgid "Done" msgstr "" @@ -2034,7 +2429,7 @@ msgstr "" #. ($c->tag('span', dir => 'ltr', format_set_name_display($set->set_id) #. ($ver->{id} =~ s/_/ /gr) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:222 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:227 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:205 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:206 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:226 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:231 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:203 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:204 msgid "Download %1" msgstr "" @@ -2046,7 +2441,7 @@ msgstr "" msgid "Download PDF or TeX Hardcopy for Current Set" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:235 +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:233 msgid "Download PDF or TeX Hardcopy for Selected Tests" msgstr "" @@ -2055,7 +2450,11 @@ msgstr "" msgid "Download hardcopy of set %1 for %2?" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ShowAnswers/instructor-selectors.html.ep:57 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin.html.ep:63 +msgid "Download/upload archived courses" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ShowAnswers/instructor-selectors.html.ep:46 msgid "Download:" msgstr "" @@ -2063,17 +2462,16 @@ msgstr "" msgid "Drop" msgstr "" -#. ($c->formatDateTime($set->reduced_scoring_date, undef, $ce->{studentDateDisplayFormat}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:139 -msgid "Due %1, after which reduced scoring is available until %2" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:100 +msgid "Drop student from the course" msgstr "" #. ($beginReducedScoringPeriod) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:306 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:310 msgid "Due date %1 has passed." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:2010 +#: /opt/webwork/webwork2/conf/defaults.config:2014 msgid "E-Mail" msgstr "" @@ -2081,15 +2479,11 @@ msgstr "" msgid "E-mail Instructor" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:2045 -msgid "E-mail addresses which can receive e-mail from a pg problem" -msgstr "" - -#: /opt/webwork/webwork2/conf/defaults.config:2055 +#: /opt/webwork/webwork2/conf/defaults.config:2049 msgid "E-mail feedback from students automatically sent to this permission level and higher" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:2026 +#: /opt/webwork/webwork2/conf/defaults.config:2030 msgid "E-mail verbosity level" msgstr "" @@ -2101,7 +2495,7 @@ msgstr "" msgid "Earned" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1143 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1160 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:62 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:100 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:80 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1106 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager.html.ep:30 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:39 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:124 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:215 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:74 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:257 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:479 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/info.html.ep:4 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSets/info.html.ep:6 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1186 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1203 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:62 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:100 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:80 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1101 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager.html.ep:30 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:39 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:124 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:215 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:74 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:257 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:479 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/info.html.ep:4 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSets/info.html.ep:6 /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:53 msgid "Edit" msgstr "" @@ -2110,9 +2504,9 @@ msgstr "" msgid "Edit %1 for %2 (%3) who has been assigned %4 sets." msgstr "" -#. (link_to(maketext('individual versions') +#. (link_to(maketext('individual user settings') #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:162 -msgid "Edit %1 of set %2." +msgid "Edit %1 for set %2." msgstr "" #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/set_list_table.html.ep:6 @@ -2151,7 +2545,7 @@ msgstr "" msgid "Edit Set Data" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1134 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/problem_row.html.ep:171 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1129 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/problem_row.html.ep:171 msgid "Edit Tags" msgstr "" @@ -2163,11 +2557,35 @@ msgstr "" msgid "Edit Users" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:127 +msgid "Edit achievement evaluator" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:90 +msgid "Edit achievement information" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:65 +msgid "Edit achivements for the course. This link is only present if achievements are enabled for the course." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:42 +msgid "Edit class list data" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:39 +msgid "Edit class roster data. Add students, edit student data, drop students from class, import students from a classlist, and give user professor privileges. Access to individual homework sets." +msgstr "" + #. ($userID) #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UsersAssignedToSet.html.ep:70 msgid "Edit data for %1" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:46 +msgid "Edit homework sets for entire class. Change homework set due dates, create new sets from a set definition file, create new homework sets, make sets visible/invisible, score homework sets. Assign homework sets to the class." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/problem_row.html.ep:219 msgid "Edit it" msgstr "" @@ -2203,10 +2621,6 @@ msgstr "" msgid "Edit which users?" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:28 -msgid "Editing blank problem in file \"%1\"." -msgstr "" - #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:31 msgid "Editing course information file \"%1\"." msgstr "" @@ -2215,6 +2629,10 @@ msgstr "" msgid "Editing hardcopy header file \"%1\"." msgstr "" +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:28 +msgid "Editing new problem template." +msgstr "" + #. ($c->{prettyProblemNumber}, tag('span', dir => 'ltr', format_set_name_display($fullSetName) #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:45 msgid "Editing problem %1 of set %2 in file \"%3\"." @@ -2232,11 +2650,27 @@ msgstr "" msgid "Editing unknown file type in file \"%1\"." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:19 +msgid "Editing Modes" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:140 +msgid "Editing Problems" +msgstr "" + #. ($c->shortPath($c->{sourceFilePath}) #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementEditor.html.ep:16 msgid "Editing achievement in file \"%1\"" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:22 +msgid "Editing for all students" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:23 +msgid "Editing for one student or a proper subset of all students" +msgstr "" + #. ($locationID) #: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/edit_location_form.html.ep:1 msgid "Editing location %1" @@ -2247,19 +2681,15 @@ msgstr "" msgid "Editing problem set %1 for these students: %2" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:317 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:315 msgid "Editor" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:66 -msgid "Editor rows:" -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:349 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:229 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:149 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/user_list_field.html.ep:13 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:401 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:229 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:143 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/user_list_field.html.ep:13 /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:53 /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:68 msgid "Email" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:126 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:107 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers.html.ep:45 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:126 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:101 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers.html.ep:45 /opt/webwork/webwork2/templates/HelpFiles/Options.html.ep:32 msgid "Email Address" msgstr "" @@ -2267,6 +2697,10 @@ msgstr "" msgid "Email Body:" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorSendMail.html.ep:17 +msgid "Email Help" +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:339 msgid "Email Instructor On Failed Attempt" msgstr "" @@ -2275,16 +2709,20 @@ msgstr "" msgid "Email Link" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:139 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:112 msgid "Email address" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator.pm:995 /opt/webwork/webwork2/templates/ContentGenerator/Base/feedback_macro_email.html.ep:10 /opt/webwork/webwork2/templates/ContentGenerator/Base/feedback_macro_form.html.ep:24 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:311 +msgid "Email body is empty. No message sent. " +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator.pm:994 /opt/webwork/webwork2/templates/ContentGenerator/Base/feedback_macro_email.html.ep:10 /opt/webwork/webwork2/templates/ContentGenerator/Base/feedback_macro_form.html.ep:24 msgid "Email instructor" msgstr "" #. (scalar(@{ $c->{ra_send_to} }) -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail.html.ep:21 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail.html.ep:27 msgid "Email is being sent to %quant(%1,recipient). You will be notified by email when the task is completed. This may take several minutes if the class is large." msgstr "" @@ -2292,39 +2730,43 @@ msgstr "" msgid "Email:" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/preview.html.ep:6 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorSendMail.html.ep:26 +msgid "Emails can contain personalized data, such as name, section, or status. Click \"List of insertable macros\" for a full list available variables. Additional personal data can be included by using a merge file. A merge file is a CSV file located in the [Scoring] directory in which the first column is the student id, followed by additional data (such as student grades). This data is identified by which column it is in, for instance if the scores where in the 4th column of the merge file, insert them into an email using the variable $COL[4]. The \"Scoring Tools\" page can export grades into a CSV that can be used as a merge file. Upload customized merge files with the \"File Manager\"." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/preview.html.ep:11 msgid "Emails to be sent to the following:" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1602 +#: /opt/webwork/webwork2/conf/defaults.config:1606 msgid "Enable Achievement Rewards" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1621 +#: /opt/webwork/webwork2/conf/defaults.config:1625 msgid "Enable Conditional Release" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1587 +#: /opt/webwork/webwork2/conf/defaults.config:1591 msgid "Enable Course Achievements" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1543 +#: /opt/webwork/webwork2/conf/defaults.config:1547 msgid "Enable Progress Bar and current problem highlighting" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1632 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/set_list_table.html.ep:8 +#: /opt/webwork/webwork2/conf/defaults.config:1636 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/set_list_table.html.ep:8 msgid "Enable Reduced Scoring" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1697 +#: /opt/webwork/webwork2/conf/defaults.config:1701 msgid "Enable Show Me Another button" msgstr "" -#: /opt/webwork/webwork2/templates/HTML/CodeMirrorEditor/controls.html.ep:24 +#: /opt/webwork/webwork2/templates/HTML/CodeMirrorEditor/controls.html.ep:24 /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:92 msgid "Enable Spell Checking" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1742 +#: /opt/webwork/webwork2/conf/defaults.config:1746 msgid "Enable periodic re-randomization of problems" msgstr "" @@ -2336,19 +2778,23 @@ msgstr "" msgid "Enabled" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1744 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:58 +msgid "Enabled:" +msgstr "" + +#: /opt/webwork/webwork2/conf/defaults.config:1748 msgid "Enables periodic re-randomization of problems after a given number of attempts. Student would have to click Request New Version to obtain new version of the problem and to continue working on the problem" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1623 +#: /opt/webwork/webwork2/conf/defaults.config:1627 msgid "Enables the use of the conditional release system. To use conditional release you need to specify a list of set names on the Problem Set Detail Page, along with a minimum score. Students will not be able to access that homework set until they have achieved the minimum score on all of the listed sets." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1699 +#: /opt/webwork/webwork2/conf/defaults.config:1703 msgid "Enables use of the Show Me Another button, which offers the student a newly-seeded version of the current problem, complete with solution (if it exists for that problem)." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:165 +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:163 msgid "End" msgstr "" @@ -2356,7 +2802,7 @@ msgstr "" msgid "Enrolled" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:138 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:111 msgid "Enrolled, Drop, etc." msgstr "" @@ -2376,30 +2822,38 @@ msgstr "" msgid "Enter information below for students you wish to add. Each student's password will initially be set to their student ID." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1895 +#: /opt/webwork/webwork2/conf/defaults.config:1899 msgid "Enter one of the allowed display mode types above. See 'display modes entry' for descriptions." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:280 +#: /opt/webwork/webwork2/templates/HelpFiles/AdminAddCourse.html.ep:34 +msgid "Enter the details of the course instructor to be added when the course is created. This user will also be added to the admin course with the username \"userID_courseID\" so you can manage and email the instructors of the courses on the server." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:284 msgid "Entered" msgstr "" #. ($display_sort_method_name{$primary_sort_method}) -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:104 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:98 msgid "Entries are sorted by %1" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:195 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:247 msgid "Equation Display" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/Options.html.ep:61 +msgid "Equation Editor" +msgstr "" + #. ($@) #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1460 msgid "Error adding set-level proctor: %1" msgstr "" #. ($fromPath, $toPath) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:690 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:664 msgid "Error copying %1 to %2." msgstr "" @@ -2407,6 +2861,11 @@ msgstr "" msgid "Error details" msgstr "" +#. ($filePath, stash('podError') +#: /opt/webwork/webwork2/templates/ContentGenerator/PODViewer/POD.html.ep:27 +msgid "Error generating POD for file %1: %2" +msgstr "" + #. ($@) #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1437 msgid "Error getting old set-proctor password from the database: %1. No update to the password was done." @@ -2421,17 +2880,17 @@ msgid "Error messages" msgstr "" #. ($setID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:745 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:754 msgid "Error: Answer date must come after close date in set %1" msgstr "" #. ($setID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:738 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:747 msgid "Error: Close date must come after open date in set %1" msgstr "" #. ($setID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:769 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:778 msgid "Error: Reduced scoring date must come between the open date and close date in set %1" msgstr "" @@ -2441,12 +2900,12 @@ msgid "Error: The original file %1 cannot be read." msgstr "" #. ($setID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1240 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:729 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1240 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:738 msgid "Error: answer date cannot be more than 10 years from now in set %1" msgstr "" #. ($setID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1235 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:724 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1235 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:733 msgid "Error: close date cannot be more than 10 years from now in set %1" msgstr "" @@ -2455,12 +2914,12 @@ msgid "Error: no file data was submitted!" msgstr "" #. ($setID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1230 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:719 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1230 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:728 msgid "Error: open date cannot be more than 10 years from now in set %1" msgstr "" #. ($problem_desc, $problem_name, $c->tag('br') -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1167 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1210 msgid "Errors encountered while processing %1. This %2 has been omitted from the hardcopy. Error text: %3" msgstr "" @@ -2469,12 +2928,12 @@ msgid "Errors occured while generating hardcopy:" msgstr "" #. ("$ce->{webworkDirs}{courses}/$failed_courses[0]/") -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2136 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2128 msgid "Errors occured while hiding the courses listed below when attempting to create the file hide_directory in the course's directory. Check the ownership and permissions of the course's directory, e.g \"%1\"." msgstr "" #. ("$ce->{webworkDirs}{courses}/$failed_courses[0]/") -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2205 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2197 msgid "Errors occured while unhiding the courses listed below when attempting delete the file hide_directory in the course's directory. Check the ownership and permissions of the course's directory, e.g \"%1\"." msgstr "" @@ -2482,11 +2941,19 @@ msgstr "" msgid "Evaluator File" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2151 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:76 +msgid "Evaluator File:" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementEditor.html.ep:28 +msgid "Evaluator Variables" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2143 msgid "Except for the errors listed above, all selected courses are already hidden." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2220 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2212 msgid "Except for the errors listed above, all selected courses are already unhidden." msgstr "" @@ -2495,15 +2962,15 @@ msgid "Existing addresses for the location are given in the scrolling list below msgstr "" #. ($filePath) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1451 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1460 msgid "Existing file %1 could not be backed up and was lost." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:354 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:354 /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:65 msgid "Expand All Details" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:364 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:364 /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:78 msgid "Expand All Nesting" msgstr "" @@ -2515,10 +2982,18 @@ msgstr "" msgid "Expand Problem Details" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:65 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:103 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:83 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:67 +msgid "Expand problem details that have been collapsed. Note that the details of a single problem can be expanded by clicking on the down arrow to the right of the problem source file." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:65 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:103 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:83 /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:71 msgid "Export" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:113 +msgid "Export achievement data" +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/save_export_form.html.ep:1 msgid "Export selected achievements" msgstr "" @@ -2541,11 +3016,15 @@ msgid "Exported achievements to %1" msgstr "" #: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/ExtendDueDateGW.pm:48 -msgid "Extend the close date for which Gateway?" +msgid "Extend the close date for which test?" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:148 +msgid "Extend the number of attempts allowed a student on a given problem." msgstr "" #: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/ExtendDueDateGW.pm:28 -msgid "Extends the close date of a gateway test by 24 hours. Note: The test must still be open for this to work." +msgid "Extends the close date of a test by 24 hours. Note: The test must still be open for this to work." msgstr "" #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Scoring.pm:30 @@ -2566,23 +3045,28 @@ msgid "Failed to create new achievement: no achievement ID specified!" msgstr "" #. ($@) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:564 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:573 msgid "Failed to create new set: %1" msgstr "" +#. ($newSetID =~ s/_/ /gr) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:482 +msgid "Failed to create new set: Invalid characters in set name \"%1\". A set name may only contain letters, numbers, hyphens, periods, and spaces." +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:474 -msgid "Failed to create new set: no set name specified!" +msgid "Failed to create new set: No set name specified." msgstr "" #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:469 -msgid "Failed to create new set: set name cannot exceed 100 characters." +msgid "Failed to create new set: Set name cannot exceed 100 characters." msgstr "" #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:396 msgid "Failed to duplicate achievement: no achievement selected for duplication!" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:521 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:530 msgid "Failed to duplicate set: no set selected for duplication!" msgstr "" @@ -2594,7 +3078,7 @@ msgstr "" #. ($scoreFilePath) #. ($filePath) #. ($FilePath) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:255 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:440 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:567 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1575 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:255 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:440 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:567 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1584 msgid "Failed to open %1" msgstr "" @@ -2608,7 +3092,7 @@ msgstr "" msgid "Failed to send message: %1" msgstr "" -#: /opt/webwork/pg/macros/parsers/parserPopUp.pl:286 /opt/webwork/webwork2/lib/WeBWorK/ConfigObject/boolean.pm:23 /opt/webwork/webwork2/lib/WeBWorK/ConfigObject/boolean.pm:36 +#: /opt/webwork/pg/macros/parsers/parserPopUp.pl:285 /opt/webwork/webwork2/lib/WeBWorK/ConfigObject/boolean.pm:23 /opt/webwork/webwork2/lib/WeBWorK/ConfigObject/boolean.pm:36 msgid "False" msgstr "" @@ -2616,11 +3100,15 @@ msgstr "" msgid "Feature exhausted for this problem" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:200 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:23 +msgid "Features:" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:252 msgid "Feedback" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:2076 +#: /opt/webwork/webwork2/conf/defaults.config:2070 msgid "Feedback by Section." msgstr "" @@ -2628,15 +3116,15 @@ msgstr "" msgid "FeedbackMessage" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2292 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2284 msgid "Field is ok" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2294 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2286 msgid "Field missing in database" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2296 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2288 msgid "Field missing in schema" msgstr "" @@ -2646,8 +3134,8 @@ msgid "File \"%1\" exists. File not saved. No changes have been made." msgstr "" #. ($c->shortPath($outputFilePath) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1062 -msgid "File \"%1\" exists. File not saved. No changes have been made. You can change the file path for this problem manually from the \"Hmwk Sets Editor\" page" +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1036 +msgid "File \"%1\" exists. File not saved. No changes have been made." msgstr "" #. ($file, $!) @@ -2670,21 +3158,25 @@ msgstr "" msgid "File %1 already exists. Overwrite it, or rename it as:" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:312 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:364 /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:55 /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:70 msgid "File Manager" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:17 +msgid "File Manager Help" +msgstr "" + #. ($outputFilePath) -#: /opt/webwork/webwork2/lib/WebworkWebservice/CourseActions.pm:544 +#: /opt/webwork/webwork2/lib/WebworkWebservice/CourseActions.pm:541 msgid "File not saved. Failed to open \"%1\" for writing." msgstr "" #. ($outputFilePath) -#: /opt/webwork/webwork2/lib/WebworkWebservice/CourseActions.pm:531 +#: /opt/webwork/webwork2/lib/WebworkWebservice/CourseActions.pm:528 msgid "File not saved. The file \"%1\" is not contained in the templates directory!" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:947 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:921 msgid "File not saved. The file name for this problem does not match the file name the editor was opened with. The problem set may have changed. Please reopen this file from the homework sets editor." msgstr "" @@ -2705,21 +3197,25 @@ msgid "Filename" msgstr "" #. ($extension, $location) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:698 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:699 msgid "Files with extension \".%1\" usually belong in \"%2\"" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:98 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:78 +#: /opt/webwork/webwork2/templates/HelpFiles/AdminManageLocations.html.ep:20 +msgid "Fill out the form below to add, edit, or delete locations. Locations are used to restrict access to sets based on ip address. Locations are configured here in the administration course, then used in a normal course. When configuring a set to use a restricted ip address, the instructor can choose to either restrict access to the location or deny access from a location, which are identified by their name. Instructors can select multiple locations to restrict access to." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:98 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:78 /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:47 msgid "Filter" msgstr "" #. ($recitation) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1355 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:918 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1420 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:913 msgid "Filter by recitation %1" msgstr "" #. ($section) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1351 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:915 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1416 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:910 msgid "Filter by section %1" msgstr "" @@ -2731,19 +3227,19 @@ msgstr "" msgid "Filter:" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:143 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:137 msgid "First" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:124 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:93 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers.html.ep:42 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/user_list.html.ep:21 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:124 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:87 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers.html.ep:42 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/user_list.html.ep:21 msgid "First Name" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:134 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:107 msgid "First name" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:196 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:178 msgid "For security reasons, you cannot specify a message file from a directory higher than the email directory (you can't use ../blah/blah for example). Please specify a different file or move the needed file to the email directory." msgstr "" @@ -2751,15 +3247,19 @@ msgstr "" msgid "Force editor to RTL" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:674 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:674 /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:101 msgid "Force problems to be numbered consecutively from one" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:72 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:35 +msgid "Form Elements Present on the Page" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:75 msgid "Format" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:2013 +#: /opt/webwork/webwork2/conf/defaults.config:2017 msgid "Format for the subject line in feedback e-mails" msgstr "" @@ -2771,15 +3271,19 @@ msgstr "" msgid "Found no directories containing problems" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/top_row.html.ep:48 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/top_row.html.ep:48 /opt/webwork/webwork2/templates/HelpFiles/InstructorSetMaker.html.ep:43 msgid "From This Course" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:333 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:318 msgid "From field must contain one valid email address." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Feedback.html.ep:33 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:42 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:20 +msgid "From this page you can add new students, edit class list data (name, email address, recitation, section, permission level, and enrollment status), change passwords, and export (save) class lists for back-up or use in another course. You can also delete students from the class roster, but this cannot be undone." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Feedback.html.ep:33 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:34 msgid "From:" msgstr "" @@ -2787,31 +3291,39 @@ msgstr "" msgid "GLOBAL Usage" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/AddNewTestGW.pm:54 /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/ExtendDueDateGW.pm:52 /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/ResurrectGW.pm:55 -msgid "Gateway Name" -msgstr "" - -#: /opt/webwork/webwork2/conf/defaults.config:1423 +#: /opt/webwork/webwork2/conf/defaults.config:1427 msgid "General" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:201 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:201 /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:30 msgid "General Information" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:121 /opt/webwork/webwork2/templates/ContentGenerator/Hardcopy/form.html.ep:171 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:168 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:169 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSets.html.ep:40 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSets.html.ep:41 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:116 +msgid "General Page Information" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:121 /opt/webwork/webwork2/templates/ContentGenerator/Hardcopy/form.html.ep:171 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:166 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:167 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSets.html.ep:42 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSets.html.ep:43 /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:113 msgid "Generate Hardcopy" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSets.html.ep:71 +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSets.html.ep:73 msgid "Generate Hardcopy for Selected Sets" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:115 +msgid "Generate a hardcopy of the problem being edited. This does not change the permanent file on the disk. You can generate a hardcopy for different versions of the same problem by changing the seed. You can also change the format to \"PDF\" or \"TeX Source\". If \"PDF\" is selected, then a PDF file will be generated for download, unless there are errors. If errors occur or \"TeX Source\" is selected, then a zip file will be generated for download that contains the TeX source file and resources needed for generating the PDF file using pdflatex." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/Hardcopy.html.ep:20 +msgid "Generate hardcopies of assignments in PDF or latex format. To produce a hardcopy, one selects the users on the left and the sets on the right. All users and sets are listed." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Hardcopy/form.html.ep:170 msgid "Generate hardcopy for selected sets and selected users" msgstr "" -#: /opt/webwork/pg/macros/core/problemRandomize.pl:186 /opt/webwork/pg/macros/core/problemRandomize.pl:187 +#: /opt/webwork/pg/macros/deprecated/problemRandomize.pl:186 /opt/webwork/pg/macros/deprecated/problemRandomize.pl:187 msgid "Get a new version of this problem" msgstr "" @@ -2890,11 +3402,11 @@ msgstr "" msgid "Grade Problem" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:647 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:651 msgid "Grade Test" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:149 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:148 msgid "Grade of Active Students" msgstr "" @@ -2906,10 +3418,14 @@ msgstr "" msgid "Grader" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:184 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:236 msgid "Grades" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/Grades.html.ep:17 +msgid "Grades Help" +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemGrader.pm:115 msgid "Grades have been saved for all current users." msgstr "" @@ -2918,6 +3434,10 @@ msgstr "" msgid "Grading Assignment" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:152 +msgid "Grading Problems" +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/FullCreditProb.pm:26 msgid "Greater Rod of Revelation" msgstr "" @@ -2926,19 +3446,31 @@ msgstr "" msgid "Greater Tome of Enlightenment" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Login.html.ep:72 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:50 +msgid "Groups types of achievements. The \"level\" and \"secret\" categories are special (described above), and categories can be used to create achievement chains." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Login.html.ep:74 msgid "Guest Login" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:86 +msgid "Guest:" +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Base/error_output.html.ep:33 msgid "HTTP Headers" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/Hardcopy.html.ep:35 +msgid "Hardcopy Format" +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Hardcopy/form.html.ep:115 msgid "Hardcopy Format:" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:227 /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:233 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:279 /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:285 msgid "Hardcopy Generator" msgstr "" @@ -2947,30 +3479,38 @@ msgid "Hardcopy Header" msgstr "" #. ($setID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:326 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:324 msgid "Hardcopy Header for set %1" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1521 /opt/webwork/webwork2/templates/ContentGenerator/Hardcopy/form.html.ep:153 +#: /opt/webwork/webwork2/templates/HelpFiles/Hardcopy.html.ep:17 +msgid "Hardcopy Help" +msgstr "" + +#: /opt/webwork/webwork2/conf/defaults.config:1525 /opt/webwork/webwork2/templates/ContentGenerator/Hardcopy/form.html.ep:153 /opt/webwork/webwork2/templates/HelpFiles/Hardcopy.html.ep:44 msgid "Hardcopy Theme" msgstr "" -#: /opt/webwork/pg/macros/core/problemRandomize.pl:427 +#: /opt/webwork/pg/macros/deprecated/problemRandomize.pl:427 msgid "Hardcopy will always print the original version of the problem." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:229 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:229 /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:31 msgid "Headers" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Base/links.html.ep:265 +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/admin_links.html.ep:49 /opt/webwork/webwork2/templates/ContentGenerator/Base/links.html.ep:296 msgid "Help" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:868 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor/hardcopy_form.html.ep:35 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail/restricted_login_proctor_password_row.html.ep:20 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:44 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:74 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:108 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:22 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:52 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:868 /opt/webwork/webwork2/templates/ContentGenerator/Grades/student_stats.html.ep:19 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor/hardcopy_form.html.ep:35 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail/restricted_login_proctor_password_row.html.ep:20 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:44 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:74 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:107 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:22 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:51 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:170 msgid "Help Icon" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementEditor.html.ep:30 +msgid "Here is a list of the variables the evaluator has access to. Unless indicated, changes to the variables will not be saved. Evaluators are run in the same order they are listed on the achievement editor page and are only run if the achievement has not been earned. Keep this in mind when using persistent global data." +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:507 msgid "Here is a new version of your problem." msgstr "" @@ -2979,11 +3519,15 @@ msgstr "" msgid "Hidden" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:347 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:347 /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:62 msgid "Hide All" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin.html.ep:33 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/hide_inactive_course_form.html.ep:1 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/hide_inactive_course_form.html.ep:38 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/hide_inactive_course_form.html.ep:57 +#: /opt/webwork/webwork2/templates/HelpFiles/AdminHideCourses.html.ep:17 +msgid "Hide Course Help" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/admin_links.html.ep:27 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/hide_inactive_course_form.html.ep:1 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/hide_inactive_course_form.html.ep:38 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/hide_inactive_course_form.html.ep:57 /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:44 msgid "Hide Courses" msgstr "" @@ -2991,15 +3535,19 @@ msgstr "" msgid "Hide Hints from Students" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:63 +msgid "Hide all rendered problems on the page." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/problem_row.html.ep:252 msgid "Hide this problem" msgstr "" -#: /opt/webwork/pg/macros/core/PGbasicmacros.pl:1519 /opt/webwork/pg/macros/core/PGbasicmacros.pl:1520 +#: /opt/webwork/pg/macros/core/PGbasicmacros.pl:1523 /opt/webwork/pg/macros/core/PGbasicmacros.pl:1524 msgid "Hint:" msgstr "" -#: /opt/webwork/pg/macros/core/PGbasicmacros.pl:1518 +#: /opt/webwork/pg/macros/core/PGbasicmacros.pl:1522 msgid "Hint: " msgstr "" @@ -3008,18 +3556,26 @@ msgid "Hints" msgstr "" # Hmwk is short for Homework -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:275 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:327 /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:44 msgid "Hmwk Sets Editor" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:106 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:108 /opt/webwork/webwork2/templates/ContentGenerator/Base/links.html.ep:14 /opt/webwork/webwork2/templates/ContentGenerator/Base/links.html.ep:20 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSets.html.ep:17 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:106 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:108 /opt/webwork/webwork2/templates/ContentGenerator/Base/links.html.ep:12 /opt/webwork/webwork2/templates/ContentGenerator/Base/links.html.ep:14 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSets.html.ep:19 msgid "Homework Sets" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Grades/student_stats.html.ep:26 +#: /opt/webwork/webwork2/templates/ContentGenerator/Grades/student_stats.html.ep:38 msgid "Homework Totals" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:17 +msgid "Homwork Sets Editor Help" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:88 /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:31 +msgid "How to:" +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/Surprise.pm:36 msgid "I couldn't find the file [ACHIEVEMENT_DIR]/surprise_message.txt!" msgstr "" @@ -3032,14 +3588,34 @@ msgstr "" msgid "Icon File" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:80 +msgid "Icon File:" +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor/hardcopy_form.html.ep:24 msgid "If \"PDF\" is selected, then a PDF file will be generated for download, unless there are errors. If errors occur generating a PDF file or \"TeX Source\" is selected then a zip file will be generated for download that contains the TeX source file and resources needed for generating the PDF file using pdflatex." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList.html.ep:106 +#: /opt/webwork/webwork2/templates/HelpFiles/Hardcopy.html.ep:37 +msgid "If \"TeX Source\" is selected, a zip file containing a TeX file and other files needed to generate a PDF hardcopy will be produced. If \"Adobe PDF\" is selected then only a PDF file will be produced." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList.html.ep:84 msgid "If a password field is left blank, the student's current password will be maintained." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/Hardcopy.html.ep:42 +msgid "If selected, the file path of the problem source will be printed in the output." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorScoring.html.ep:38 +msgid "If selected, this adds spaces between the fields to align the commas, which makes the columns easy to read when in text form but it can confuse some spreadsheet applications since the extra spaces violate the csv standard (although Excel handles them with no problem). This will give a visual form of the CSV file that is easy to read on the page. If you want a reliable .csv file for use in any spreadsheet application unclick the \"Pad Fields\" option. You can download the .csv file immediately by clicking on the link with the filename chosen above, or you can download it using the \"File Manager\" from the scoring directory." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:148 +msgid "If the original problem can not be edited than the path name must be changed in order to be allowed to save the problem. Adding \"local/\" to the beginning of the original path is the default solution. All locally created and edited files will then appear in a subdirectory named \"local\"." +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:513 msgid "If this flag is set then this problem will count towards the grade of its parent problem. In general the adjusted status on a problem is the larger of the problem's status and the weighted average of the status of its child problems which have this flag enabled." msgstr "" @@ -3052,32 +3628,53 @@ msgstr "" msgid "If this is enabled then students will be unable to attempt a problem until they have completed all of the previous problems, and their child problems if necessary." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorScoring.html.ep:57 +msgid "If this is selected, a success index is listed in each csv file. The success index is a number assigned on the basis of the number of incorrect attempts (roughly equivalent to 1/the number of attempts) which seems to correlate with the relative difficulty the student had with the problem." +msgstr "" + #: /opt/webwork/webwork2/conf/LTIConfigValues.config:47 msgid "If this is set, all users (including the instructor) must enter the WeBWorK course through the LMS. If a user reaches the regular WeBWorK login screen, they receive a message directing them back to the LMS." msgstr "" #. (tag('strong', maketext('Remember Me') -#: /opt/webwork/webwork2/templates/ContentGenerator/Login.html.ep:31 +#: /opt/webwork/webwork2/templates/ContentGenerator/Login.html.ep:33 msgid "If you check %1 your login information will be remembered by the browser you are using, allowing you to visit WeBWorK pages without typing your user name and password (until your session expires). This feature is not safe for public workstations, untrusted machines, and machines over which you do not have direct control." msgstr "" -#: /opt/webwork/pg/macros/core/problemRandomize.pl:425 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:154 +msgid "If you click on the \"Grade Problem\" icon to the right of the problem number, then the problem will open in the manual problem grader. This page shows the rendered problem and lists all students assigned to the set and the last answer the students entered for the problem. You can then change the recorded scores for students on this problem and provide instructor feedback comments." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:148 +msgid "If you click on the \"Open in New Window\" icon to the right of the problem number, then the problem will open in the actual homework set in a new tab or window." +msgstr "" + +#: /opt/webwork/pg/macros/deprecated/problemRandomize.pl:425 msgid "If you come back to it later, it may revert to its original version." msgstr "" +#. ('report_grades_data.csv', 'report_grade.msg', '$COL') +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorScoring.html.ep:80 +msgid "If you upload your file on the web with the name: %1 and also create an email message with the name %2 with the approriate %3 variables then not only can you email the message with the embedded grades to the students, but files with those exact names are automatically appended to the \"Grades\" page seen by the students." +msgstr "" + #. ($file) #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:337 msgid "Illegal file \"%1\" specified" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1436 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1445 msgid "Illegal filename contains '..'" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:64 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:102 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:82 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:64 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:102 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:82 /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:63 msgid "Import" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:65 +msgid "Import a single set or multiple sets from a set definition file. (Use the \"File Manager\" to upload/download set definition files.) The \"Shift Dates...\" option is useful for problem sets that were used from other courses and will shift all of the dates." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/import_form.html.ep:3 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/import_form.html.ep:16 msgid "Import from where?" msgstr "" @@ -3094,11 +3691,19 @@ msgstr "" msgid "Import users from what file?" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:99 +msgid "Import/export achievements" +msgstr "" + #. ($count) #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:516 msgid "Imported %quant(%1,achievement)" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/Hardcopy.html.ep:25 +msgid "In both cases, one can select the sort field, the format of the display list, and the filter. \"Change Display Settings\" must be clicked to update the list." +msgstr "" + #. ($total_inprogress, $num_of_problems) #: /opt/webwork/webwork2/templates/ContentGenerator/Problem/siblings.html.ep:28 msgid "In progress: %1/%2" @@ -3112,7 +3717,7 @@ msgstr "" msgid "Inactive Students" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1499 +#: /opt/webwork/webwork2/conf/defaults.config:1503 msgid "Inactivity time before a user is required to login again" msgstr "" @@ -3124,11 +3729,11 @@ msgstr "" msgid "Include OPL" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Scoring.html.ep:32 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Scoring.html.ep:32 /opt/webwork/webwork2/templates/HelpFiles/InstructorScoring.html.ep:55 msgid "Include Success Index" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Scoring.html.ep:52 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Scoring.html.ep:52 /opt/webwork/webwork2/templates/HelpFiles/InstructorScoring.html.ep:62 msgid "Include percentage grades columns for all sets" msgstr "" @@ -3141,7 +3746,11 @@ msgstr "" msgid "Incorrect: %1/%2" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:142 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:26 +msgid "Indicates the number of problems in the set. Clicking on the link opens the set detail page which allows you to modify set parameters, edit set headers, and change parameters of problems in the set such as the number of allowed attempts or the weight (credit value). You can also add, remove, view, edit, and reorder the problems in the set." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:141 msgid "Individual Problem Results" msgstr "" @@ -3158,20 +3767,32 @@ msgstr "" msgid "Instructor Comment:" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1264 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1306 msgid "Instructor Feedback:" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:246 +#: /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:17 +msgid "Instructor Links Help" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:298 /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:29 msgid "Instructor Tools" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:341 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorIndex.html.ep:17 +msgid "Instructor Tools Help" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:90 +msgid "Instructor:" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:326 msgid "Invalid Reply-to address." msgstr "" #. ($output_file) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:205 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:187 msgid "Invalid file name \"%1\". All email file names must end with the \".msg\" extension. Choose a file name with the \".msg\" extension. The message was not saved." msgstr "" @@ -3184,6 +3805,14 @@ msgstr "" msgid "Invalid user ID or password." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/Options.html.ep:34 +msgid "It is important that students enter an email address or they will not recieve any of the important emails sent by the instructor. The email address will only be present on the page if the user has permission to change the email address." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/ProblemSets.html.ep:20 +msgid "It lists the homework problem sets available for the students." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:461 /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:472 msgid "Jump to Problem:" msgstr "" @@ -3192,6 +3821,10 @@ msgstr "" msgid "Just-In-Time parameters" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:85 +msgid "Key Map" +msgstr "" + #: /opt/webwork/webwork2/templates/HTML/CodeMirrorEditor/controls.html.ep:14 msgid "Key Map:" msgstr "" @@ -3208,7 +3841,7 @@ msgstr "" msgid "LOCAL Usage" msgstr "" -#: /opt/webwork/webwork2/conf/LTIConfigValues.config:98 +#: /opt/webwork/webwork2/conf/LTIConfigValues.config:103 msgid "LTI" msgstr "" @@ -3216,10 +3849,14 @@ msgstr "" msgid "LTI Grade Mode" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:408 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:460 /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:75 msgid "LTI Grade Update" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorLTIUpdate.html.ep:17 +msgid "LTI Grade Update Help" +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/LTIUpdate.html.ep:16 msgid "LTI grade passback is not enabled for this course" msgstr "" @@ -3247,11 +3884,11 @@ msgstr "" msgid "LTI update of user %1 queued." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1446 +#: /opt/webwork/webwork2/conf/defaults.config:1450 msgid "Language (refresh page after saving changes to reveal new language.)" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:146 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:140 msgid "Last" msgstr "" @@ -3263,24 +3900,24 @@ msgstr "" msgid "Last Full Update" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:125 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:100 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers.html.ep:41 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/user_list.html.ep:25 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:125 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:94 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers.html.ep:41 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/user_list.html.ep:25 msgid "Last Name" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:142 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:115 msgid "Last column of merge file" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:135 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:108 msgid "Last name" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:104 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:222 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:118 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:237 msgid "Latest Answers" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1501 -msgid "Length of time, in seconds, a user has to be inactive before he is required to login again.

    This value should be entered as a number, so as 3600 instead of 60*60 for one hour" +#: /opt/webwork/webwork2/conf/defaults.config:1505 +msgid "Length of time, in seconds, a user has to be inactive before he is required to login again. This value should be entered as a number, so as 3600 instead of 60*60 for one hour." msgstr "" #: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/HalfCreditProb.pm:26 @@ -3299,7 +3936,11 @@ msgstr "" msgid "Level:" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:307 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorSetMaker.html.ep:17 +msgid "Library Broswer Help" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:359 /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:52 msgid "Library Browser" msgstr "" @@ -3308,27 +3949,31 @@ msgstr "" msgid "Link to Edit Page for %1" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1875 -msgid "List of display modes made available to students" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:25 +msgid "Links to pages that give information about writing problems:" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:2047 -msgid "List of e-mail addresses to which e-mail can be sent by a problem. Professors need to be added to this list if questionaires are used, or other WeBWorK problems which send e-mail as part of their answer mechanism." +#: /opt/webwork/webwork2/conf/defaults.config:1879 +msgid "List of display modes made available to students" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:118 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:124 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:89 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:96 msgid "List of insertable macros" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1724 +#: /opt/webwork/webwork2/conf/defaults.config:1728 msgid "List of options for Show Me Another button" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1611 +#: /opt/webwork/webwork2/conf/defaults.config:1615 msgid "List of sets excluded from achievements" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:136 +#: /opt/webwork/webwork2/templates/HelpFiles/Options.html.ep:56 +msgid "Live equation rendering" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:144 msgid "Loading..." msgstr "" @@ -3336,7 +3981,7 @@ msgstr "" msgid "Local Attempts" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/top_row.html.ep:45 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/top_row.html.ep:45 /opt/webwork/webwork2/templates/HelpFiles/InstructorSetMaker.html.ep:41 msgid "Local Problems" msgstr "" @@ -3361,16 +4006,16 @@ msgid "Location" msgstr "" #. ($locationID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1862 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1898 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1854 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1890 msgid "Location %1 does not exist in the WeBWorK database. Please check your input (perhaps you need to reload the location management page?)." msgstr "" #. ($locationID, join(', ', @addresses) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1750 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1742 msgid "Location %1 has been created, with addresses %2." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1806 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1798 msgid "Location deletion requires confirmation." msgstr "" @@ -3382,11 +4027,23 @@ msgstr "" msgid "Location name:" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/AdminManageLocations.html.ep:27 +msgid "Locations are a list of ip addresses. Ip addresses can be a single address (e.g. 192.168.1.101), a range of ip address (e.g. 192.168.1.101-192.168.1.150), or an ip address mask (e.g. 192.168.1.0/24). Enter one ip address per line, using as many lines as needed for each location." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/AdminManageLocations.html.ep:32 +msgid "Locations are edited by adding new ip addresses to the location, or deleting existing address. You must select the confirm checkbox when deleting a location, and this cannot be undone." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:43 +msgid "Locations of files:" +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Logout.html.ep:18 msgid "Log In Again" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Base/login_status.html.ep:12 /opt/webwork/webwork2/templates/ContentGenerator/Base/login_status.html.ep:28 +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/login_status.html.ep:11 msgid "Log Out" msgstr "" @@ -3394,16 +4051,16 @@ msgstr "" #. ($rename_oldCourseID) #. ($rename_newCourseID) #. ($new_courseID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1300 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:481 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:711 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:789 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1292 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:474 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:704 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:780 msgid "Log into %1" msgstr "" #. ($userName) -#: /opt/webwork/webwork2/templates/ContentGenerator/Base/login_status.html.ep:10 /opt/webwork/webwork2/templates/ContentGenerator/Base/login_status.html.ep:26 +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/login_status.html.ep:9 msgid "Logged in as %1." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:140 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:181 /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:187 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:113 msgid "Login" msgstr "" @@ -3411,7 +4068,7 @@ msgstr "" msgid "Login Info" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:123 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementUserEditor.html.ep:32 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers.html.ep:44 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:184 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/user_list.html.ep:15 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UsersAssignedToSet.html.ep:36 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:123 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementUserEditor.html.ep:32 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers.html.ep:44 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:190 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/user_list.html.ep:15 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UsersAssignedToSet.html.ep:36 msgid "Login Name" msgstr "" @@ -3423,16 +4080,21 @@ msgstr "" msgid "Login:" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:173 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:225 msgid "Logout" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:130 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:103 msgid "Macro" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Base/links.html.ep:3 -msgid "Main Menu" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:97 +msgid "Macro (\".pl\") files containing additional functionality for your course can be stored here." +msgstr "" + +#. ($filePath) +#: /opt/webwork/webwork2/templates/ContentGenerator/PODViewer/POD.html.ep:29 +msgid "Macro file %1 not found." msgstr "" #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager.html.ep:44 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:44 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:46 @@ -3448,20 +4110,52 @@ msgstr "" msgid "Make these changes in course: %1" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin.html.ep:32 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/manage_location_form.html.ep:1 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:137 +msgid "Makes a new copy of the file you are editing at the location relative to the course's templates ([TMPL]) directory. You may choose to replace the current problem in the current set, append to the end to then end of the current set as a new problem, or create a problem that is not attached to a problem set." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/admin_links.html.ep:28 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/manage_location_form.html.ep:1 /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:46 msgid "Manage Locations" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:292 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:193 +#: /opt/webwork/webwork2/templates/HelpFiles/AdminManageLocations.html.ep:17 +msgid "Manage Locations Help" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:20 +msgid "Manage achievements for the course. The actions allow one to edit, assign, import, export, score, create, or delete achievements. The action form is at the top to select the desired action and options to perform when the submit button is pressed. Below the action form is the list of all the achievements, ordered by their achievement \"Number\"." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:56 +msgid "Manage administration course files." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:50 +msgid "Manage instructors. When instructors are added to a newly created course, they are also added to the admin course with username \"userID_courseID\"." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:344 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:192 msgid "Manual Grader" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemGrader.html.ep:17 +msgid "Manual Grader Help" +msgstr "" + #. ($c->tag('span', dir => 'ltr', format_set_name_display($c->stash->{set}->set_id) #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemGrader.pm:205 msgid "Manual Grader for %1: Problem %2" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:106 +#: /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:77 +msgid "Manually initiate an LTI grade passback for selected sets or users. This link is only visible if LTI grade passback is enabled for the course." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:175 +msgid "Many of these editing activities can also be done more quickly from the \"Instructor Tools\" page where students and homework sets can be selected simultaneously. The \"Instructor Tools\" page is useful for quick editing of one or two students. The initial setup of the class can be done best from this page. Importing and exporting class lists can only be done from this page. Deleting students can only be done from this page." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:120 msgid "Mark Correct" msgstr "" @@ -3473,7 +4167,7 @@ msgstr "" msgid "Match on what? (separate multiple IDs with commas)" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:85 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:85 /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:36 msgid "Math Objects" msgstr "" @@ -3485,28 +4179,28 @@ msgstr "" msgid "Max. Shown:" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1715 +#: /opt/webwork/webwork2/conf/defaults.config:1719 msgid "Maximum times Show me Another can be used per problem (-1 => unlimited)" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/preview.html.ep:3 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/preview.html.ep:4 msgid "Merge file data:" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:33 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:24 msgid "Merge file:" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:284 +#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:288 msgid "Message" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:15 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:13 msgid "Message file:" msgstr "" #. ("$emailDirectory/$output_file") -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:321 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:300 msgid "Message saved to file %1." msgstr "" @@ -3519,26 +4213,26 @@ msgstr "" msgid "Message was blank." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorSendMail.html.ep:48 +msgid "Messages can be saved to a message file (which must end in the \".msg\" extension). Use the \"Message file\" drop down menu to select which message file to load, or \"None\" to use a blank message. To save a new message, use the \"Save as\" button after entering in a valid filename. The \"Save as\" button will not overwrite currently saved messages. To edit a currently saved message first select it using the drop down menu, then click the \"Save\" button to save any changes. Use the \"File Manager\" to delete messages, located in the \"[TMPL]/email\" directory." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Base/error_output.html.ep:25 /opt/webwork/webwork2/templates/ContentGenerator/Base/warning_output.html.ep:22 msgid "Method" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1999 +#: /opt/webwork/webwork2/conf/defaults.config:2003 msgid "Method to enter problem scores in the single problem manual grader" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1676 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1668 msgid "Missing required input data. Please check that you have filled in all of the create location fields and resubmit." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1453 +#: /opt/webwork/webwork2/conf/defaults.config:1457 msgid "Mode in which the LANG and DIR settings for a single problem are determined." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1455 -msgid "Mode in which the LANG and DIR settings for a single problem are determined.

    The system will set the LANGuage attribute to either a value determined from the problem, a course-wide default, or the system default, depending on the mode selected. The tag will only be added to the DIV enclosing the problem if it is different than the value which should be set in the main HTML tag set for the entire course based on the course language.

    There are two options for the DIRection attribute: \"ltr\" for left-to-write sripts, and \"rtl\" for right-to-left scripts like Arabic and Hebrew.

    The DIRection attribute is needed to trigger proper display of the question text when the problem text-direction is different than that used by the current language of the course. For example, English problems from the library browser would display improperly in RTL mode for a Hebrew course, unless the problen Direction is set to LTR.

    The feature to set a problem language and direction was only added in 2018 to the PG language, so most problems will not declare their language, and the system needs to fall back to determining the language and direction in a different manner. The OPL itself is all English, so the system wide fallback is to en-US in LTR mode.

    Since the defaults fall back to the LTR direction, most sites should be fine with the \"auto::\" mode, but may want to select the one which matches their course language. The mode \"force::ltr\" would also be an option for a course which runs into trouble with the \"auto\" modes.

    Modes:

    • \"none\" prevents any additional LANG and/or DIR tag being added. The browser will use the main setting which was applied to the entire HTML page. This is likely to cause trouble when a problem of the other direction is displayed.
    • \"auto::\" allows the system to make the settings based on the language and direction reported by the problem (a new feature, so not set in almost all existing problems) and falling back to the expected default of en-US in LTR mode.
    • \"auto:LangCode:Dir\" allows the system to make the settings based on the language and direction reported by the problem (a new feature, so not set in almost all existing problems) but falling back to the language with the given LangCode and the direction Dir when problem settings are not available from PG.
    • \"auto::Dir\" for problems without PG settings, this will use the default en=english language, but force the direction to Dir. Problems with PG settings will get those settings.
    • \"auto:LangCode:\" for problems without PG settings, this will use the default LTR direction, but will set the language to LangCode.Problems with PG settings will get those settings.
    • \"force:LangCode:Dir\" will ignore any setting made by the PG code of the problem, and will force the system to set the language with the given LangCode and the direction to Dir for all problems.
    • \"force::Dir\" will ignore any setting made by the PG code of the problem, and will force the system to set the direction to Dir for all problems, but will avoid setting any language attribute for individual problem.
    " -msgstr "" - #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:443 msgid "Move" msgstr "" @@ -3551,6 +4245,14 @@ msgstr "" msgid "Move to Problem:" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAddUsers.html.ep:26 +msgid "Multiple sets may be assigned to the users by holding down the shift key or the ctrl key while selecting from the list." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAssigner.html.ep:27 +msgid "Multiple users or sets may be selected by holding down the shift key or the ctrl key while selecting from the list." +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:36 msgid "My Problems" msgstr "" @@ -3564,7 +4266,7 @@ msgstr "" msgid "NO OF FIELDS" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/default_table.html.ep:15 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/edit_table.html.ep:13 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/export_table.html.ep:14 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:216 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:99 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:141 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/problem_list.html.ep:12 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSets.html.ep:25 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSets.html.ep:27 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/default_table.html.ep:15 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/edit_table.html.ep:13 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/export_table.html.ep:14 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:113 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:231 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:135 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/problem_list.html.ep:12 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSets.html.ep:27 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSets.html.ep:29 msgid "Name" msgstr "" @@ -3572,14 +4274,26 @@ msgstr "" msgid "Name for new set here" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1426 +#: /opt/webwork/webwork2/conf/defaults.config:1430 msgid "Name of course information file" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:77 +msgid "Name of the evaluator file used to evaluate the achievement." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:81 +msgid "Name of the image used for the achievement icon." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/create_form.html.ep:4 msgid "Name the new set" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:45 +msgid "Name:" +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/ResurrectGW.pm:29 msgid "Necromancers Charm" msgstr "" @@ -3588,15 +4302,15 @@ msgstr "" msgid "Never" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:411 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager.html.ep:36 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:51 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:411 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager.html.ep:36 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:54 msgid "New File" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:428 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager.html.ep:35 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:52 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:428 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager.html.ep:35 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:55 msgid "New Folder" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/unarchive_course_form.html.ep:37 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/unarchive_course_form.html.ep:30 msgid "New Name:" msgstr "" @@ -3604,6 +4318,10 @@ msgstr "" msgid "New Password" msgstr "" +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:336 +msgid "New Problem" +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:411 msgid "New file name:" msgstr "" @@ -3612,7 +4330,7 @@ msgstr "" msgid "New folder name:" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:579 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:577 msgid "New passwords saved" msgstr "" @@ -3620,7 +4338,7 @@ msgstr "" msgid "New set name" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1011 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1013 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1015 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1006 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1008 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1010 msgid "Next Problem" msgstr "" @@ -3637,11 +4355,11 @@ msgstr "" msgid "Next test will be available by %1." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:139 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:149 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:193 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:237 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:270 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:288 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:302 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:331 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:346 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:455 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:483 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:510 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:83 /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:654 /opt/webwork/webwork2/templates/ContentGenerator/Hardcopy/form.html.ep:142 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/default_table.html.ep:47 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/set_list_field.html.ep:39 /opt/webwork/webwork2/templates/ContentGenerator/Options.html.ep:111 /opt/webwork/webwork2/templates/ContentGenerator/Options.html.ep:133 /opt/webwork/webwork2/templates/ContentGenerator/Options.html.ep:155 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/problem_list_row.html.ep:68 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:139 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:149 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:193 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:237 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:270 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:288 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:302 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:331 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:346 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:455 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:483 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:510 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:83 /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:658 /opt/webwork/webwork2/templates/ContentGenerator/Hardcopy/form.html.ep:142 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/default_table.html.ep:47 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/set_list_field.html.ep:39 /opt/webwork/webwork2/templates/ContentGenerator/Options.html.ep:111 /opt/webwork/webwork2/templates/ContentGenerator/Options.html.ep:133 /opt/webwork/webwork2/templates/ContentGenerator/Options.html.ep:155 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/problem_list_row.html.ep:68 msgid "No" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:122 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:116 msgid "No Course" msgstr "" @@ -3657,7 +4375,7 @@ msgstr "" msgid "No Target Set Selected" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Achievements/achievement_badges.html.ep:39 +#: /opt/webwork/webwork2/templates/ContentGenerator/Achievements/achievement_badges.html.ep:38 msgid "No achievement badges have been assigned yet." msgstr "" @@ -3681,7 +4399,7 @@ msgstr "" msgid "No change made to any set" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:622 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:615 msgid "No changes specified. You must mark the checkbox of the item(s) to be changed and enter the change data." msgstr "" @@ -3689,15 +4407,15 @@ msgstr "" msgid "No changes were saved!" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/unarchive_course_form.html.ep:57 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/unarchive_course_form.html.ep:50 msgid "No course archives found." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/upgrade_course_confirm.html.ep:31 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/upgrade_course_confirm.html.ep:32 msgid "No course id defined" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:75 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/delete_course_form.html.ep:53 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/rename_course_form.html.ep:76 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:67 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/delete_course_form.html.ep:53 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/rename_course_form.html.ep:76 msgid "No courses found" msgstr "" @@ -3710,20 +4428,20 @@ msgstr "" msgid "No e-mail recipients are listed for this course." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:187 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:169 msgid "No filename was specified for saving! The message was not saved." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Authen.pm:353 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen.pm:340 msgid "No guest logins are available. Please try again in a few minutes." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1885 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1877 msgid "No location specified to edit. Please check your input data." msgstr "" #. ($badID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1796 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1788 msgid "No location with name %1 exists in the database" msgstr "" @@ -3731,10 +4449,22 @@ msgstr "" msgid "No locations are currently defined." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:357 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:342 msgid "No merge data file" msgstr "" +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/preview.html.ep:18 +msgid "No merge data found" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:164 +msgid "No merge data found." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/preview.html.ep:8 +msgid "No merge file selected." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:135 msgid "No more tests available." msgstr "" @@ -3747,11 +4477,11 @@ msgstr "" msgid "No problems matched the given parameters." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/preview.html.ep:15 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/preview.html.ep:25 msgid "No recipients selected." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:349 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:334 msgid "No recipients selected. Please select one or more recipients from the list below." msgstr "" @@ -3760,14 +4490,10 @@ msgstr "" msgid "No record for global set %1." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1443 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1452 msgid "No record found." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:483 -msgid "No set created." -msgstr "" - #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/browse_course_sets_panel.html.ep:9 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/top_row.html.ep:12 msgid "No sets in this course yet" msgstr "" @@ -3784,7 +4510,7 @@ msgstr "" msgid "No source filePath specified" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1318 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1327 msgid "No source_file for problem in .def file" msgstr "" @@ -3792,11 +4518,11 @@ msgstr "" msgid "No students shown. Choose one of the options above to list the students in the course." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:279 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:246 msgid "No submissions. Over time." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:272 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:278 msgid "No tests taken." msgstr "" @@ -3806,19 +4532,19 @@ msgid "No user specific data exists for user %1" msgstr "" #. ($locationID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2039 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2031 msgid "No valid changes submitted for location %1." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Grades.pm:263 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:243 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Grades.pm:263 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:241 msgid "No versions of this test have been taken." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:254 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/view_problems_line.html.ep:17 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:252 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/view_problems_line.html.ep:17 msgid "None" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:763 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/set_list_field.html.ep:8 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserDetail/set_date_table.html.ep:44 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:763 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/set_list_field.html.ep:8 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserDetail/set_date_table.html.ep:52 msgid "None Specified" msgstr "" @@ -3827,7 +4553,7 @@ msgstr "" msgid "None of the selected users are assigned to this set: %1" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Base/login_status.html.ep:38 +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/login_status.html.ep:33 msgid "Not logged in." msgstr "" @@ -3835,7 +4561,19 @@ msgstr "" msgid "Note" msgstr "" -#: /opt/webwork/pg/macros/core/problemRandomize.pl:396 /opt/webwork/pg/macros/core/problemRandomize.pl:422 +#: /opt/webwork/webwork2/templates/HelpFiles/Hardcopy.html.ep:55 +msgid "Note that if there are errors, they will be shown at the top of the page. In some cases, a hard copy is still generated and a link called \"Download Hardcopy\" appears. In addition, the latex file, log and error files are generated which can be used in troubleshooting." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:93 +msgid "Note that if you set the permission level of a user to something other than \"Student\", you may also want to set the status of the user to \"Observer\". Users with the \"Observer\" status are not included in statistics, scoring, or instructor emails." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorConfig.html.ep:28 +msgid "Note that some settings require an additional page load after \"Save Changes\" is clicked in order to take effect. This is true for a theme change for example." +msgstr "" + +#: /opt/webwork/pg/macros/deprecated/problemRandomize.pl:396 /opt/webwork/pg/macros/deprecated/problemRandomize.pl:422 msgid "Note:" msgstr "" @@ -3845,11 +4583,11 @@ msgstr "" msgid "Note: %1" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:682 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:686 msgid "Note: grading the test grades all problems, not just those on this page." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:768 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/import_form.html.ep:49 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/set_list_field.html.ep:15 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserDetail/set_date_table.html.ep:51 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:768 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/import_form.html.ep:49 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/set_list_field.html.ep:15 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserDetail/set_date_table.html.ep:59 msgid "Now" msgstr "" @@ -3865,7 +4603,7 @@ msgstr "" msgid "Number of Problems per Page (0=all)" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:21 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:60 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:96 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:21 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:59 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:95 msgid "Number of Students" msgstr "" @@ -3873,14 +4611,27 @@ msgstr "" msgid "Number of Tests per Time Interval (0=infty)" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1193 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:923 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:54 +msgid "Number:" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1181 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:912 msgid "OK" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/Levels.html.ep:17 +msgid "OPL Problem Levels Help" +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/AddNewTestGW.pm:26 msgid "Oil of Cleansing" msgstr "" +#. ('pdflatex', 'hardcopy.tex') +#: /opt/webwork/webwork2/templates/HelpFiles/Hardcopy.html.ep:49 +msgid "Once \"Generate Hardcopy for selected sets and selected users\" is clicked a file in the selected hardcopy format will be generated and offered for download. If PDF output was selected, a single PDF file is generated. If TeX output is selected, a zip file is generated that contains all files needed to generated the hardcopy PDF file via %1. The main TeX file is called %2." +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:84 msgid "One Column" msgstr "" @@ -3893,19 +4644,27 @@ msgstr "" msgid "Only after set answer date" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1790 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:87 +msgid "Only present for JITAR sets. Collapse JITAR nesting problem groups to the top row of information about a problem. Note that the nesting of a single problem group can be collapsed by clicking on the down arrow to the right of the problem number." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:80 +msgid "Only present for JITAR sets. Expand JITAR nested problem groups that have been collapsed. Note that the nesting of a single problem group can be expanded by clicking on the right arrow to the right of the problem number." +msgstr "" + +#: /opt/webwork/webwork2/conf/defaults.config:1794 msgid "Only this permission level and higher get buttons for sending e-mail to the instructor." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:20 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:39 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:39 msgid "Open" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:315 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/set_list_table.html.ep:9 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/sort_form.html.ep:22 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/sort_form.html.ep:8 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:63 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:315 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/set_list_table.html.ep:9 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/sort_form.html.ep:22 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/sort_form.html.ep:8 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:62 msgid "Open Date" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/top_row.html.ep:42 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/top_row.html.ep:42 /opt/webwork/webwork2/templates/HelpFiles/InstructorSetMaker.html.ep:32 msgid "Open Problem Library" msgstr "" @@ -3918,20 +4677,20 @@ msgid "Open in new window" msgstr "" #. ($c->formatDateTime($set->due_date() -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:316 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:320 msgid "Open, closes %1." msgstr "" #. ($beginReducedScoringPeriod) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:296 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:300 msgid "Open, due %1." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:303 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:270 msgid "Open." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:301 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:268 msgid "Open. Submitted." msgstr "" @@ -3947,7 +4706,7 @@ msgstr "" msgid "Opens any homework set for 24 hours." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1584 +#: /opt/webwork/webwork2/conf/defaults.config:1588 msgid "Optional Modules" msgstr "" @@ -3955,20 +4714,24 @@ msgstr "" msgid "Order Problems Randomly" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorSetMaker.html.ep:50 +msgid "Other Options" +msgstr "" + # Context is "7 Out Of 10" -#: /opt/webwork/webwork2/templates/ContentGenerator/Grades/student_stats.html.ep:10 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:156 +#: /opt/webwork/webwork2/templates/ContentGenerator/Grades/student_stats.html.ep:10 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:150 msgid "Out Of" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:86 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:85 msgid "Overall Results" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:94 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:93 msgid "Overall Set Grades" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:123 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:122 msgid "Overall Success Index" msgstr "" @@ -3976,7 +4739,7 @@ msgstr "" msgid "Overwrite" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:97 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:100 msgid "Overwrite existing files silently" msgstr "" @@ -3988,16 +4751,24 @@ msgstr "" msgid "PG Info" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:709 +#: /opt/webwork/webwork2/templates/ContentGenerator/PODViewer.html.ep:1 +msgid "PG POD" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:17 +msgid "PG Problem Editor Help" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:708 msgid "PG debug messages" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:720 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:716 msgid "PG internal errors" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:102 -msgid "PG mark down syntax used to format WeBWorK questions. This interactive lab can help you to learn the techniques." +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:109 +msgid "PG markdown syntax used to format WeBWorK questions. This interactive lab can help you to learn the techniques." msgstr "" #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:692 @@ -4008,21 +4779,29 @@ msgstr "" msgid "PG question processing error messages" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:714 /opt/webwork/webwork2/templates/RPCRenderFormats/default.html.ep:128 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:712 /opt/webwork/webwork2/templates/RPCRenderFormats/default.html.ep:128 msgid "PG warning messages" msgstr "" # Doesn't need to be translated -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:99 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:98 /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:47 /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:58 msgid "PGML" msgstr "" # Doesn't need to be translated -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:91 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:91 /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:40 msgid "POD" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1520 /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:526 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:200 +msgid "POD Index" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:208 +msgid "POD Viewer" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1515 /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:526 msgid "PREVIEW ONLY -- ANSWERS NOT RECORDED" msgstr "" @@ -4036,16 +4815,20 @@ msgstr "" msgid "PROB VALUE" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Scoring.html.ep:45 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Scoring.html.ep:45 /opt/webwork/webwork2/templates/HelpFiles/InstructorScoring.html.ep:36 msgid "Pad Fields" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:28 +msgid "Page Contents" +msgstr "" + #. ($c->timestamp) #: /opt/webwork/webwork2/templates/ContentGenerator/Base/footer.html.ep:1 msgid "Page generated at %1" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:81 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:77 /opt/webwork/webwork2/templates/ContentGenerator/Login.html.ep:54 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:81 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:71 /opt/webwork/webwork2/templates/ContentGenerator/Login.html.ep:56 /opt/webwork/webwork2/templates/HelpFiles/Options.html.ep:25 msgid "Password" msgstr "" @@ -4062,11 +4845,11 @@ msgstr "" msgid "Percent" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:20 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:95 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:20 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:94 msgid "Percent Ranges" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:63 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:137 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:63 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:136 msgid "Percent Score" msgstr "" @@ -4074,7 +4857,7 @@ msgstr "" msgid "Percent of Students" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:83 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:207 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:83 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:206 msgid "Percentile cutoffs for number of attempts. The 50% column shows the median number of attempts." msgstr "" @@ -4086,7 +4869,7 @@ msgstr "" msgid "Permission Level" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1767 +#: /opt/webwork/webwork2/conf/defaults.config:1771 msgid "Permissions" msgstr "" @@ -4098,7 +4881,7 @@ msgstr "" msgid "Pick date and time" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2112 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2104 msgid "Place a file named \"hide_directory\" in a course or other directory and it will not show up in the courses list on the WeBWorK home page. It will still appear in the Course Administration listing." msgstr "" @@ -4130,7 +4913,7 @@ msgstr "" msgid "Please choose the set, the problem you would like to copy, and the problem you would like to copy it to." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin.html.ep:50 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin.html.ep:19 msgid "Please correct the following errors and try again:" msgstr "" @@ -4139,11 +4922,11 @@ msgid "Please enter in a value to match in the filter field." msgstr "" #. (tag('b', $course) -#: /opt/webwork/webwork2/templates/ContentGenerator/Login.html.ep:26 +#: /opt/webwork/webwork2/templates/ContentGenerator/Login.html.ep:28 msgid "Please enter your username and password for %1 below:" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1786 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1778 msgid "Please provide a location name to delete." msgstr "" @@ -4179,7 +4962,7 @@ msgstr "" msgid "Please select exactly one user." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm:248 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1042 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm:248 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1016 msgid "Please specify a file to save to." msgstr "" @@ -4192,16 +4975,16 @@ msgid "Please use only letters, digits, dashes, underscores, and periods in your msgstr "" #. ($saveMode) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1208 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1184 msgid "Please use radio buttons to choose the method for saving this file. Uknown saveMode: %1." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:33 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:166 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:170 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:33 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:165 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:169 msgid "Point Value" msgstr "" #. ($grader->{problem_value}) -#: /opt/webwork/webwork2/templates/HTML/SingleProblemGrader/grader.html.ep:87 +#: /opt/webwork/webwork2/templates/HTML/SingleProblemGrader/grader.html.ep:92 msgid "Point Value (0 - %1):" msgstr "" @@ -4209,6 +4992,10 @@ msgstr "" msgid "Points" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:62 +msgid "Points:" +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/ResetIncorrectAttempts.pm:26 msgid "Potion of Forgetfulness" msgstr "" @@ -4225,15 +5012,7 @@ msgstr "" msgid "Press \"Grade Test\" soon!" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:205 -msgid "Preview" -msgstr "" - -#: /opt/webwork/webwork2/templates/HTML/SingleProblemGrader/grader.html.ep:187 -msgid "Preview Comment" -msgstr "" - -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:104 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:69 msgid "Preview Message" msgstr "" @@ -4241,11 +5020,15 @@ msgstr "" msgid "Preview My Answers" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:642 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:646 msgid "Preview Test" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1000 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:996 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:998 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorSendMail.html.ep:41 +msgid "Preview the message before sending using the \"Preview Message\" button. The preview shows the email that would be sent to the first selected student or the instructor if no students were selected. The preview will also list all of the students that would receive their own personalized message. If a merge file was selected, the preview will also indicate which (if any) recipient's merge file data could not be found." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:991 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:993 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:995 msgid "Previous Problem" msgstr "" @@ -4253,6 +5036,10 @@ msgstr "" msgid "Previous page" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:45 +msgid "Primary Actions" +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:355 msgid "Print Test" msgstr "" @@ -4271,22 +5058,28 @@ msgstr "" #. ($c->{setRecord}->assignment_type eq 'jitar' ? join('.', jitar_id_to_seq($_) #. ($set->assignment_type eq 'jitar' ? join('.', jitar_id_to_seq($_) #. ($prettyProblemID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:337 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:836 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:847 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:858 /opt/webwork/webwork2/templates/ContentGenerator/Base/links.html.ep:121 /opt/webwork/webwork2/templates/ContentGenerator/Base/links.html.ep:174 /opt/webwork/webwork2/templates/ContentGenerator/Base/links.html.ep:64 /opt/webwork/webwork2/templates/ContentGenerator/Base/links.html.ep:68 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader/siblings.html.ep:19 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_menu.html.ep:21 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_menu.html.ep:4 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:212 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/siblings.html.ep:42 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/problem_list_row.html.ep:36 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/problem_list_row.html.ep:40 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:336 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:831 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:842 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:853 /opt/webwork/webwork2/templates/ContentGenerator/Base/links.html.ep:203 /opt/webwork/webwork2/templates/ContentGenerator/Base/links.html.ep:57 /opt/webwork/webwork2/templates/ContentGenerator/Base/links.html.ep:61 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader/siblings.html.ep:19 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_menu.html.ep:21 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_menu.html.ep:4 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:211 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/siblings.html.ep:42 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/problem_list_row.html.ep:36 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/problem_list_row.html.ep:40 msgid "Problem %1" msgstr "" -#. ($prettyID) -#. ($versioned ? $versioned : $MergedProblem->problem_id) #. ($i + 1) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1184 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1187 /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:535 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:535 msgid "Problem %1." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1872 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:75 +msgid "Problem (\".pg\") files" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/Options.html.ep:38 +msgid "Problem Display Settings" +msgstr "" + +#: /opt/webwork/webwork2/conf/defaults.config:1876 msgid "Problem Display/Answer Checking" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:322 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:374 /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:50 msgid "Problem Editor" msgstr "" @@ -4294,27 +5087,31 @@ msgstr "" msgid "Problem Grader" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1004 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1005 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1007 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1000 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1002 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:999 msgid "Problem List" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/DoubleProb.pm:73 /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/FullCreditProb.pm:73 /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/HalfCreditProb.pm:74 /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/ResetIncorrectAttempts.pm:75 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ShowAnswers.pm:219 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:150 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:160 +#: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/DoubleProb.pm:73 /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/FullCreditProb.pm:73 /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/HalfCreditProb.pm:74 /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/ResetIncorrectAttempts.pm:75 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ShowAnswers.pm:219 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:149 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:159 msgid "Problem Number" msgstr "" -#: /opt/webwork/webwork2/templates/HTML/SingleProblemGrader/grader.html.ep:136 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:160 +msgid "Problem Paths" +msgstr "" + +#: /opt/webwork/webwork2/templates/HTML/SingleProblemGrader/grader.html.ep:140 msgid "Problem Score (%):" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:79 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:79 /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:30 msgid "Problem Techniques" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:224 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:239 msgid "Problem has a different source file than the currently rendered problem." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:218 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:233 msgid "Problem has an essay answer that needs to be graded." msgstr "" @@ -4326,7 +5123,7 @@ msgstr "" msgid "Problem source is drawn from a grouping set and can not be directly rendered or edited." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Grades/student_stats.html.ep:11 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader/siblings.html.ep:11 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:336 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ShowAnswers/instructor-selectors.html.ep:41 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:168 /opt/webwork/webwork2/templates/ContentGenerator/Problem/siblings.html.ep:2 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/problem_list.html.ep:9 +#: /opt/webwork/webwork2/templates/ContentGenerator/Grades/student_stats.html.ep:12 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader/siblings.html.ep:11 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:336 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ShowAnswers/instructor-selectors.html.ep:30 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:163 /opt/webwork/webwork2/templates/ContentGenerator/Problem/siblings.html.ep:2 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/problem_list.html.ep:9 /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:32 msgid "Problems" msgstr "" @@ -4346,6 +5143,10 @@ msgstr "" msgid "Problems have been assigned to all current users." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/Levels.html.ep:25 +msgid "Problems with this rating should only require direct memory of a fact. Examples might be a specific value of a function, or the statement of a definition. Very few WeBWorK problems fall into this category." +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/Localize.pm:93 msgid "Proctor" msgstr "" @@ -4366,14 +5167,18 @@ msgstr "" msgid "Proctor authorization required." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:220 -msgid "Proctored Gateway Quiz %2 Proctor Login" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:88 +msgid "Proctor:" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:213 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:265 msgid "Proctored Test %2" msgstr "" +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:272 +msgid "Proctored Test %2 Proctor Login" +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:318 msgid "Proctored tests always require authorization to start the test. \"Both Start and Grade\" will require login proctor authorization to start and grade proctor authorization to grade. \"Only Start\" requires grade proctor authorization to start and no authorization to grade." msgstr "" @@ -4382,10 +5187,14 @@ msgstr "" msgid "Provide a password to have a single password for all students to start a proctored test." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:101 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:101 /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:56 msgid "Publish" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:31 +msgid "Quick access to many instructor tools, including Reset passwords, Act as student, Assign individual sets and Edit individual due dates." +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Scoring.pm:30 msgid "RECITATION" msgstr "" @@ -4406,7 +5215,7 @@ msgstr "" msgid "Really delete the items listed above?" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:130 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers.html.ep:47 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:137 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/student_stats.html.ep:22 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:178 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/user_list.html.ep:42 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:130 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers.html.ep:47 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:110 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/student_stats.html.ep:22 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:184 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/user_list.html.ep:42 msgid "Recitation" msgstr "" @@ -4419,7 +5228,7 @@ msgstr "" msgid "Recitation:" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Scoring.html.ep:38 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Scoring.html.ep:38 /opt/webwork/webwork2/templates/HelpFiles/InstructorScoring.html.ep:46 msgid "Record Scores for Single Sets" msgstr "" @@ -4433,7 +5242,7 @@ msgstr "" msgid "Reduced Scoring" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:153 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/set_list_table.html.ep:10 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:68 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:153 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/set_list_table.html.ep:10 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:67 msgid "Reduced Scoring Date" msgstr "" @@ -4446,7 +5255,7 @@ msgid "Reduced Scoring Period" msgstr "" #. ($c->formatDateTime($set->due_date() -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:310 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:314 msgid "Reduced credit can still be earned until %1." msgstr "" @@ -4455,11 +5264,11 @@ msgstr "" msgid "Reduced:" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager.html.ep:25 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:53 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager.html.ep:25 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:56 msgid "Refresh" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:38 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:69 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/delete_course_form.html.ep:30 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/delete_course_form.html.ep:47 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/hide_inactive_course_form.html.ep:37 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/hide_inactive_course_form.html.ep:56 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:30 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:61 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/delete_course_form.html.ep:30 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/delete_course_form.html.ep:47 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/hide_inactive_course_form.html.ep:37 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/hide_inactive_course_form.html.ep:56 msgid "Refresh Listing" msgstr "" @@ -4481,7 +5290,7 @@ msgstr "" msgid "Remaining time: %1" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Login.html.ep:59 +#: /opt/webwork/webwork2/templates/ContentGenerator/Login.html.ep:61 msgid "Remember Me" msgstr "" @@ -4498,10 +5307,18 @@ msgstr "" msgid "Rename %1 to %2" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin.html.ep:27 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/rename_course_confirm.html.ep:1 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/rename_course_confirm_short.html.ep:1 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/rename_course_form.html.ep:3 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/rename_course_form.html.ep:73 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/rename_course_confirm.html.ep:1 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/rename_course_confirm_short.html.ep:1 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/rename_course_form.html.ep:3 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/rename_course_form.html.ep:73 /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:34 msgid "Rename Course" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/AdminRenameCourse.html.ep:17 +msgid "Rename Course Help" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/admin_links.html.ep:22 +msgid "Rename Courses" +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:303 msgid "Rename file as:" msgstr "" @@ -4510,7 +5327,7 @@ msgstr "" msgid "Render" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:344 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:344 /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:59 msgid "Render All" msgstr "" @@ -4518,16 +5335,40 @@ msgstr "" msgid "Render Problem" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:341 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:60 +msgid "Render all problems on the page. This does not reload the page or save or reset changes." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:106 +msgid "Render or re-render the problem, course info file, or set header being edited. This does not change the permanent file on the disk. You can view different versions of the same problem by changing the seed. You can also change the manner in which the mathematics is typeset. If \"Open in new window\" is checked, then the problem will open in a new tab or window showing the problem as it will be rendered for students in the set." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:132 +msgid "Rendering Problems" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:341 /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:53 msgid "Renumber Problems" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:55 +msgid "Renumber problems consecutively starting from 1. This renumbering is not saved until \"Save Changes\" is clicked." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:103 +msgid "Renumber problems in the set consecutively starting from one. In the process of deleting problems, the numbering can be made non-consecutive. This is useful to clean up the problem numbering." +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/ResurrectGW.pm:31 -msgid "Reopens any gateway test for an additional 24 hours. This allows you to take a test even if the close date has past. This item does not allow you to take additional versions of the test." +msgid "Reopens any test for an additional 24 hours. This allows you to take a test even if the close date has past. This item does not allow you to take additional versions of the test." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:118 +msgid "Reordering Problems" msgstr "" #. (tag( 'strong', c( tag('span', dir => 'ltr', format_set_name_display($c->{fullSetID}) -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor/save_as_form.html.ep:57 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor/save_as_form.html.ep:58 msgid "Replace current problem: %1" msgstr "" @@ -4536,28 +5377,28 @@ msgid "Replace which users?" msgstr "" #. ($composite_id, $oldUser->status) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:455 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:448 msgid "Replacing old data for %1: status: %2" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:50 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:42 msgid "Reply-To:" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:115 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:123 msgid "Report Bugs in this Problem" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Base/links.html.ep:293 +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/admin_links.html.ep:52 /opt/webwork/webwork2/templates/ContentGenerator/Base/links.html.ep:305 msgid "Report bugs" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:120 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:128 msgid "Report bugs in a WeBWorK question/problem using this link. The very first time you do this you will need to register with an email address so that information on the bug fix can be reported back to you." msgstr "" #. ($upgrade_courseID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1386 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1538 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1378 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1530 msgid "Report for course %1:" msgstr "" @@ -4575,52 +5416,52 @@ msgstr "" msgid "Request information" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1225 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1220 msgid "Request new version now." msgstr "" #. ($setName) -#: /opt/webwork/webwork2/lib/WeBWorK/Authz.pm:478 +#: /opt/webwork/webwork2/lib/WeBWorK/Authz.pm:486 msgid "Requested set \"%1\" is a proctored test, but no valid proctor authorization has been obtained." msgstr "" #. ($setName, $effectiveUserName) -#: /opt/webwork/webwork2/lib/WeBWorK/Authz.pm:394 /opt/webwork/webwork2/lib/WeBWorK/Authz.pm:417 +#: /opt/webwork/webwork2/lib/WeBWorK/Authz.pm:402 /opt/webwork/webwork2/lib/WeBWorK/Authz.pm:425 msgid "Requested set '%1' could not be found in the database for user %2." msgstr "" #. ($setName, $node_name) -#: /opt/webwork/webwork2/lib/WeBWorK/Authz.pm:464 -msgid "Requested set '%1' is a homework assignment but the gateway/quiz content generator %2 was called. Try re-entering the set from the problem sets listing page." +#: /opt/webwork/webwork2/lib/WeBWorK/Authz.pm:472 +msgid "Requested set '%1' is a homework assignment but the test content generator %2 was called. Try re-entering the set from the problem sets listing page." msgstr "" #. ($setName, $node_name) -#: /opt/webwork/webwork2/lib/WeBWorK/Authz.pm:458 -msgid "Requested set '%1' is a test/quiz assignment but the regular homework assignment content generator %2 was called. Try re-entering the set from the problem sets listing page." +#: /opt/webwork/webwork2/lib/WeBWorK/Authz.pm:466 +msgid "Requested set '%1' is a test but the regular homework assignment content generator %2 was called. Try re-entering the set from the problem sets listing page." msgstr "" #. ($setName, $effectiveUserName) -#: /opt/webwork/webwork2/lib/WeBWorK/Authz.pm:412 +#: /opt/webwork/webwork2/lib/WeBWorK/Authz.pm:420 msgid "Requested set '%1' is not assigned to user %2." msgstr "" #. ($setName) -#: /opt/webwork/webwork2/lib/WeBWorK/Authz.pm:442 +#: /opt/webwork/webwork2/lib/WeBWorK/Authz.pm:450 msgid "Requested set '%1' is not available yet." msgstr "" #. ($setName) -#: /opt/webwork/webwork2/lib/WeBWorK/Authz.pm:436 +#: /opt/webwork/webwork2/lib/WeBWorK/Authz.pm:444 msgid "Requested set '%1' is not yet open." msgstr "" #. ($verNum, $setName) -#: /opt/webwork/webwork2/lib/WeBWorK/Authz.pm:399 +#: /opt/webwork/webwork2/lib/WeBWorK/Authz.pm:407 msgid "Requested version (%1) of set '%2' can not be directly accessed." msgstr "" #. ($verNum, $setName, $effectiveUserName) -#: /opt/webwork/webwork2/lib/WeBWorK/Authz.pm:389 +#: /opt/webwork/webwork2/lib/WeBWorK/Authz.pm:397 msgid "Requested version (%1) of set '%2' is not assigned to user %3." msgstr "" @@ -4640,7 +5481,7 @@ msgstr "" msgid "Reset" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:195 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:696 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:195 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:696 /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:47 msgid "Reset Form" msgstr "" @@ -4648,6 +5489,10 @@ msgstr "" msgid "Resets the number of incorrect attempts on a single homework problem." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:41 +msgid "Restore a .tar.gz archive." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor/revert_form.html.ep:40 msgid "Restore backup from" msgstr "" @@ -4658,14 +5503,10 @@ msgid "Restore backup from %1" msgstr "" #. ($c->formatDateTime($backupTime, undef, $ce->{studentDateDisplayFormat}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1254 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1230 msgid "Restored backup from %1." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/unarchive_course_form.html.ep:6 -msgid "Restores a course from a gzipped tar archive (.tar.gz). After unarchiving, the course database is restored from a subdirectory of the course's DATA directory. Currently the archive facility is only available for mysql databases. It depends on the mysqldump application." -msgstr "" - #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:188 msgid "Restrict Access by IP" msgstr "" @@ -4682,11 +5523,15 @@ msgstr "" msgid "Restrict To" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:33 +msgid "Restrict or sort the students displayed" +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:159 msgid "Restrict release by set(s)" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:282 /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:291 +#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:286 /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:291 msgid "Result" msgstr "" @@ -4695,7 +5540,7 @@ msgstr "" msgid "Result of last action performed: %1" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:296 +#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:300 msgid "Results for this submission" msgstr "" @@ -4708,10 +5553,10 @@ msgid "Results of last action performed: " msgstr "" #: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/ResurrectGW.pm:51 -msgid "Resurrect which Gateway?" +msgid "Resurrect which test?" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:676 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:669 msgid "Retitled" msgstr "" @@ -4719,7 +5564,7 @@ msgstr "" msgid "Return to your work" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:125 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager.html.ep:38 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh_edit.html.ep:16 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:125 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager.html.ep:38 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh_edit.html.ep:16 /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:166 msgid "Revert" msgstr "" @@ -4729,10 +5574,18 @@ msgid "Revert to %1" msgstr "" #. ($c->shortPath($c->{editFilePath}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1244 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1220 msgid "Reverted to original file \"%1\"." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:168 +msgid "Reverts to the copy of the file saved on the disk or to a backup file. All unsaved editing changes will be lost. This option is only active when a temporary file or a backup file exists. You may also delete backups that have been made with this tab." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:182 +msgid "Review of column functions:" +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/problem_row.html.ep:145 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/problem_row.html.ep:85 msgid "Reviewing a problem and looking at both the average Attempts and average Status should give instructors valuable information about the difficulty of the problem." msgstr "" @@ -4769,7 +5622,7 @@ msgstr "" msgid "STUDENT ID" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm:32 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:123 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementUserEditor.html.ep:78 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager.html.ep:40 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh_edit.html.ep:17 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:228 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:185 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UsersAssignedToSet.html.ep:85 /opt/webwork/webwork2/templates/HTML/SingleProblemGrader/grader.html.ep:204 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm:32 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:123 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementUserEditor.html.ep:78 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager.html.ep:40 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh_edit.html.ep:17 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:243 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:181 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UsersAssignedToSet.html.ep:85 /opt/webwork/webwork2/templates/HTML/SingleProblemGrader/grader.html.ep:207 /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:123 msgid "Save" msgstr "" @@ -4778,11 +5631,11 @@ msgstr "" msgid "Save %1" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm:33 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:124 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager.html.ep:39 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh_edit.html.ep:20 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm:33 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:124 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager.html.ep:39 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh_edit.html.ep:20 /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:134 msgid "Save As" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Config.html.ep:66 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:194 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:695 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Config.html.ep:53 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:194 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:695 /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:37 msgid "Save Changes" msgstr "" @@ -4798,14 +5651,10 @@ msgstr "" msgid "Save Password" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:189 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:188 msgid "Save as" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:195 -msgid "Save as Default" -msgstr "" - #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementEditor/save_as_form.html.ep:5 msgid "Save as:" msgstr "" @@ -4814,37 +5663,49 @@ msgstr "" msgid "Save changes" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor/save_as_form.html.ep:32 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:28 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor/save_as_form.html.ep:33 msgid "Save file to:" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:125 +msgid "Save the contents of the editor window to the file on disk and re-render the problem. If \"Open in new window\" is checked, then the problem will open in a new tab or window showing the problem as it will be rendered for students in the set. If \"Create backup\" is checked then a backup of the current file on disk will be created before overwriting it with the contents of the editor window. If a backup already exists, then a \"Delete oldest backup\" check box will be present. If that is checked, then the oldest backup will be deleted when \"Save\" is clicked. These backups can be reverted to and managed on the \"Revert\" tab." +msgstr "" + #. (tag('b', dir => 'ltr', $c->shortPath($c->{editFilePath}) #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor/save_form.html.ep:6 msgid "Save to %1 and View" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/Options.html.ep:50 +msgid "Saved answers" +msgstr "" + #. ($c->shortPath($outputFilePath) #. ($outputFilePath =~ s/$ce->{courseDirs}{templates}/[TMPL]/r) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm:201 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:721 /opt/webwork/webwork2/lib/WebworkWebservice/CourseActions.pm:552 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm:201 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:695 /opt/webwork/webwork2/lib/WebworkWebservice/CourseActions.pm:549 msgid "Saved to file \"%1\"" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2300 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2292 msgid "Schema and database field definitions do not agree" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2287 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2279 msgid "Schema and database table definitions do not agree" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:66 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:104 /opt/webwork/webwork2/templates/ContentGenerator/Grades/student_stats.html.ep:9 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:153 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:153 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:163 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:66 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:104 /opt/webwork/webwork2/templates/ContentGenerator/Grades/student_stats.html.ep:9 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:153 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:147 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:161 /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:78 msgid "Score" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:111 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:125 msgid "Score (%)" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:60 +msgid "Score one or more sets. This can also be done from the \"Hmwk Sets Editor\" or from the \"Instructor Tools\", but the \"Scoring Tools\" page allows control over parameters." +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:170 msgid "Score required for release" msgstr "" @@ -4869,7 +5730,11 @@ msgstr "" msgid "Scores" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:344 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:66 +msgid "Scoring (\".csv\") files" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:396 msgid "Scoring Download" msgstr "" @@ -4877,10 +5742,14 @@ msgstr "" msgid "Scoring Message" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:339 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:391 /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:58 msgid "Scoring Tools" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorScoring.html.ep:17 +msgid "Scoring Tools Help" +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:327 msgid "Screen and Hardcopy set header information can not be overridden for individual students." msgstr "" @@ -4889,7 +5758,7 @@ msgstr "" msgid "Scroll of Resurrection" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:129 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementUserEditor.html.ep:34 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers.html.ep:46 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:96 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:136 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/student_stats.html.ep:18 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:172 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/user_list.html.ep:38 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UsersAssignedToSet.html.ep:38 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:129 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementUserEditor.html.ep:34 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers.html.ep:46 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:110 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:109 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/student_stats.html.ep:18 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:178 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/user_list.html.ep:38 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UsersAssignedToSet.html.ep:38 msgid "Section" msgstr "" @@ -4910,6 +5779,10 @@ msgstr "" msgid "Select" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAssigner.html.ep:20 +msgid "Select Users from the left column and sets from the right column and assign or unassign the given sets. The list of users or the list of sets can be reordered under the \"sort\" option or the format of the user or set list. Additionally, the set lists can be filtered (by section number or recitation). The displayed user and set lists will only be updated upon clicking \"Change Display Settings\"." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/browse_course_sets_panel.html.ep:11 msgid "Select a Homework Set" msgstr "" @@ -4926,19 +5799,27 @@ msgstr "" msgid "Select a Set from this Course" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/AdminArchiveCourse.html.ep:20 +msgid "Select a course to create a .tar.gz archive of, which contains a dump of the database and all course files (templates, configuration files, etc). Each course can only have a single archive. Creating an archive of a previously archived course will delete the old archive." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/delete_course_form.html.ep:36 msgid "Select a course to delete." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/AdminDeleteCourse.html.ep:20 +msgid "Select a course to delete. Warning, all data will be deleted and this cannot be undone. This will not delete any course archives." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/rename_course_form.html.ep:14 msgid "Select a course to rename. The courseID is used in the url and can only contain alphanumeric characters and underscores. The course title appears on the course home page and can be any string." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/unarchive_course_form.html.ep:20 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/unarchive_course_form.html.ep:13 msgid "Select a course to unarchive." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:22 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/delete_course_form.html.ep:14 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/hide_inactive_course_form.html.ep:21 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:14 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/delete_course_form.html.ep:14 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/hide_inactive_course_form.html.ep:21 msgid "Select a listing format:" msgstr "" @@ -4966,7 +5847,11 @@ msgstr "" msgid "Select an action to perform:" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:44 +#: /opt/webwork/webwork2/templates/HelpFiles/AdminUnarchiveCourse.html.ep:20 +msgid "Select an archive to restore. You cannot restore an archive into an existing course. Instead, either rename or delete the old course, or restore the archive with a new name. When restoring a course with a new name, the name is used as the course ID, and must contain only letters, numbers, hyphens, and underscores, and may have at most 40 characters." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:36 msgid "Select course(s) to archive." msgstr "" @@ -4982,27 +5867,61 @@ msgstr "" msgid "Select one or more sets and one or more users below to assign/unassign each selected set to/from all selected users." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers.html.ep:86 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers.html.ep:94 msgid "Select sets below to assign them to the newly-created users." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/AdminRenameCourse.html.ep:20 +msgid "Select the course to change its Course ID, Course Title, or Institution. Note that changing a course's ID will change the URL of all links to the course, and could break links from external sites such as an LMS." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/hide_inactive_course_form.html.ep:4 msgid "Select the course(s) you want to hide (or unhide) and then click \"Hide Courses\" (or \"Unhide Courses\"). Hiding a course that is already hidden does no harm (the action is skipped). Likewise unhiding a course that is already visible does no harm (the action is skipped). Hidden courses are still active but are not listed in the list of WeBWorK courses on the opening page. To access the course, an instructor or student must know the full URL address for the course." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/AdminHideCourses.html.ep:20 +msgid "Select the course(s) you want to hide (or unhide) and then click \"Hide Courses\" (or \"Unhide Courses\"). Hiding a course that is already hidden does no harm (the action is skipped). Likewise unhiding a course that is already visible does no harm (the action is skipped). Hidden courses are still active but are not listed in the list of WeBWorK courses on the opening page. To access the course, an instructor or student must know the full URL address for the course." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:93 +msgid "Select the display mode used to render the problems on this page." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Hardcopy/form.html.ep:11 msgid "Select the homework sets for which to generate hardcopy versions. You may also select multiple users from the users list. You will receive hardcopy for each (set, user) pair." msgstr "" +#. ('courseName_totals.csv') +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorScoring.html.ep:30 +msgid "Select the sets you want scored, choose the name of the export file you want to use (by default: %1), and then click the \"Score Selected Set(s) and save to\" button." +msgstr "" + +#. ('ful.csv','scr.csv') +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorScoring.html.ep:49 +msgid "Select this if you want to save the scores for each set in a separate file in addition to saving all scores to a cumulative file. After clicking the \"Score Selected Set(s) and save to\" button, you will get a pair of links for each selected set. The file that ends with %1 contains the number of correct and incorrect tries about each individual problem for each student. The file that ends with %2 is a summary of each problem." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:19 msgid "Select user(s) and/or set(s) below and click the action button of your choice." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/upgrade_course_confirm.html.ep:17 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:85 +msgid "Select which assignment types (homework, tests, just-in-time) the achievement is evaluated." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/AdminUpgradeCourses.html.ep:20 +msgid "Select which courses to upgrade from a previous version of WeBWorK. The upgrade process can add missing database columns, delete unused database columns, and check the course file structure. Be sure to read over the changes before confirming the upgrade. You may want to create an archive of the course before upgrading. Only courses that need upgraded will be selectable." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:84 +msgid "Select your favorite theme for the large text window." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/upgrade_course_confirm.html.ep:18 msgid "Select/unselect all fields missing in schema for deletion." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/upgrade_course_confirm.html.ep:8 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/upgrade_course_confirm.html.ep:9 msgid "Select/unselect all tables missing in schema for deletion." msgstr "" @@ -5014,16 +5933,24 @@ msgstr "" msgid "Send E-mail" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:181 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:83 msgid "Send Email" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:79 +#: /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:69 +msgid "Send email to students." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:54 +msgid "Send emails to selected instructors." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:59 msgid "Send to all students" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:84 -msgid "Send to the students selected below" +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:64 +msgid "Send to selected students" msgstr "" #: /opt/webwork/webwork2/templates/ContentGenerator/Grades/student_stats.html.ep:7 @@ -5041,15 +5968,19 @@ msgid "Set %1 was assigned to %2" msgstr "" #. ($c->tag('span', dir => 'ltr', format_set_name_display($newSetID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:558 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:567 msgid "Set %1 was assigned to %2." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:302 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:354 /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:42 msgid "Set Assigner" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/top_row.html.ep:51 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAssigner.html.ep:17 +msgid "Set Assigner Help" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/top_row.html.ep:51 /opt/webwork/webwork2/templates/HelpFiles/InstructorSetMaker.html.ep:45 msgid "Set Definition Files" msgstr "" @@ -5057,7 +5988,11 @@ msgstr "" msgid "Set Description" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:281 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:17 +msgid "Set Detail Help" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:333 msgid "Set Detail for set %2" msgstr "" @@ -5066,7 +6001,7 @@ msgid "Set Header" msgstr "" #. ($setID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:325 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:323 msgid "Set Header for set %1" msgstr "" @@ -5086,31 +6021,58 @@ msgstr "" msgid "Set Name" msgstr "" -#: /opt/webwork/pg/macros/core/problemRandomize.pl:188 +#. ($c->formatDateTime($set->due_date) +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/set_status.html.ep:18 +msgid "Set closes on %1." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:45 +msgid "Set definition (\".def\") files" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/set_status.html.ep:20 +msgid "Set is closed." +msgstr "" + +#. ($c->formatDateTime($set->reduced_scoring_date) +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/set_status.html.ep:16 +msgid "Set is due on %1." +msgstr "" + +#. ($c->formatDateTime($set->open_date) +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/set_status.html.ep:14 +msgid "Set opens on %1." +msgstr "" + +#: /opt/webwork/pg/macros/deprecated/problemRandomize.pl:188 msgid "Set random seed to:" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1926 +#: /opt/webwork/webwork2/conf/defaults.config:1930 msgid "Set to true for log to mean base 10 log and false for log to mean natural logarithm." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1946 +#: /opt/webwork/webwork2/conf/defaults.config:1950 msgid "Set to true to allow students to enter Unicode versions of some characters (like U+2212 for the minus sign) in their answers. One reason to allow this is that copying and pasting output from MathJax can introduce these characters, but it is also getting easier to enter these characters directory from the keyboard." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1916 +#: /opt/webwork/webwork2/conf/defaults.config:1920 msgid "Set to true to display the \"Entered\" column which automatically shows the evaluated student answer, e.g., 1 if student input is sin(pi/2). If this is set to false, e.g., to save space in the response area, the student can still see their evaluated answer by clicking on the typeset version of their answer." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1957 +#: /opt/webwork/webwork2/conf/defaults.config:1961 msgid "Set to true to have Full Width Unicode character (U+FF01 to U+FF5E) converted to their ASCII equivalents (U+0021 to U+007E) automatically in MathObjects. This may be valuable for Chinese keyboards, for example, that automatically use Full Width characters for parentheses and commas." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Hardcopy/form.html.ep:35 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Assigner.html.ep:38 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:44 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ShowAnswers/instructor-selectors.html.ep:35 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/siblings.html.ep:4 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:577 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserDetail/set_date_table.html.ep:16 +msgid "Set values" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Hardcopy/form.html.ep:35 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Assigner.html.ep:38 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:44 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ShowAnswers/instructor-selectors.html.ep:24 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/siblings.html.ep:4 msgid "Sets" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:270 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:322 msgid "Sets assigned to %1" msgstr "" @@ -5119,15 +6081,23 @@ msgstr "" msgid "Sets assigned to %1 (%2)" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserDetail.html.ep:17 +msgid "Sets assigned to student Help" +msgstr "" + #: /opt/webwork/webwork2/conf/LTIConfigValues.config:57 msgid "Sets how grades will be passed back from WeBWorK to the LMS.
    course
    Sends a single grade back to the LMS. This grade is calculated out of the total question set that has been assigned to a user and made open. Therefore it can appear low, since it counts problem sets with future due dates as zero.
    homework
    Sends back a score for each problem set (including for each quiz). To use this, the external links from the LMS must be problem set specific. For example, webwork.myschool.edu/webwork2/course-name/problem_set_name. If the problem set name has space characters, they should be underscores in these addresses. Also, to initialize the communication between WeBWorK and the LMS, the user must follow each of these external learning tools at least one time. Since there must be a separate external tool link for each problem set, this option requires more maintenance of the LMS course.
    " msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:616 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:55 +msgid "Sets the order in which achievements are listed and evaluated." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:625 msgid "Sets were selected for export." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Config.html.ep:49 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Config.html.ep:36 msgid "Setting" msgstr "" @@ -5135,6 +6105,10 @@ msgstr "" msgid "Shift dates so that the earliest is" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/Hardcopy.html.ep:32 +msgid "Show" +msgstr "" + #. ($numchild) #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/problem_row.html.ep:31 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/problem_row.html.ep:32 msgid "Show %1 more like this" @@ -5152,7 +6126,7 @@ msgstr "" msgid "Show LTI parameters (for debugging)" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:428 /opt/webwork/webwork2/templates/ContentGenerator/Problem/submit_buttons.html.ep:34 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:480 /opt/webwork/webwork2/templates/ContentGenerator/Problem/submit_buttons.html.ep:34 msgid "Show Me Another" msgstr "" @@ -5161,10 +6135,14 @@ msgstr "" msgid "Show Me Another %1" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1647 /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:707 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1642 /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:711 msgid "Show Past Answers" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/Hardcopy.html.ep:41 +msgid "Show Problem Source File" +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Hardcopy/form.html.ep:132 msgid "Show Problem Source File:" msgstr "" @@ -5177,11 +6155,11 @@ msgstr "" msgid "Show Scores on Finished Tests" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:626 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:630 msgid "Show Solutions" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1534 +#: /opt/webwork/webwork2/conf/defaults.config:1538 msgid "Show Total Homework Grade on Grades Page" msgstr "" @@ -5193,7 +6171,7 @@ msgstr "" msgid "Show all tests" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:617 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:621 msgid "Show correct answers" msgstr "" @@ -5209,7 +6187,11 @@ msgstr "" msgid "Show me another" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:635 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorShowAnswers.html.ep:20 +msgid "Show past answers. Students can only see their past answers, and they will not be able to see which parts are correct. Instructors can use the form to select any combination of users, sets, and problems to view. The table below will list the past answers colored according to correctness (green is correct). Use control + click to select multiple users, sets, or problems." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:639 msgid "Show problem graders" msgstr "" @@ -5217,11 +6199,11 @@ msgstr "" msgid "Show saved answers?" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1758 +#: /opt/webwork/webwork2/conf/defaults.config:1762 msgid "Show the correct answer to the current problem before re-randomization." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1760 +#: /opt/webwork/webwork2/conf/defaults.config:1764 msgid "Show the correct answer to the current problem on the last attempt before a new version is requested." msgstr "" @@ -5233,21 +6215,17 @@ msgstr "" msgid "Show which users?" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList.html.ep:15 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList.html.ep:45 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ShowAnswers/instructor-selectors.html.ep:4 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList.html.ep:20 -msgid "Show/Hide Site Description" -msgstr "" - #: /opt/webwork/webwork2/templates/ContentGenerator/Hardcopy/form.html.ep:75 /opt/webwork/webwork2/templates/ContentGenerator/Problem/checkboxes.html.ep:11 msgid "Show:" msgstr "" #. (scalar @{ $c->{visibleSetIDs} }, scalar @{ $c->{allSetIDs} }) -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList.html.ep:135 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList.html.ep:115 msgid "Showing %1 out of %2 sets." msgstr "" #. (scalar(keys %{ $c->{visibleUserIDs} }) -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList.html.ep:102 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList.html.ep:80 msgid "Showing %1 out of %2 users" msgstr "" @@ -5259,7 +6237,17 @@ msgstr "" msgid "Showing all tests" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:47 +#. ($c->{merge_file}, $ur->user_id) +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/preview.html.ep:5 +msgid "Showing data from merge file %1 for user %2:" +msgstr "" + +#. ($c->{merge_file}) +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:147 +msgid "Showing data from merge file: %1" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:61 msgid "Showing problem for:" msgstr "" @@ -5267,6 +6255,10 @@ msgstr "" msgid "Showing statistics for:" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:33 +msgid "Shows how many instructors and students have been assigned this problem set, out of the total number in the class. Clicking on this link allows you to assign the set to users, unassign this set from users, and to individually edit the assignment for specific users. For changing dates for individual users there are also shortcuts from the \"Instructor Tools\" link." +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Home.pm:43 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Login.pm:63 msgid "Site Information" msgstr "" @@ -5275,7 +6267,7 @@ msgstr "" msgid "Skip archiving this course" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1977 +#: /opt/webwork/webwork2/conf/defaults.config:1981 msgid "Skip explanation essay answer fields" msgstr "" @@ -5283,11 +6275,11 @@ msgstr "" msgid "Snippets of PG code illustrating specific techniques" msgstr "" -#: /opt/webwork/pg/macros/core/PGbasicmacros.pl:1510 /opt/webwork/pg/macros/core/PGbasicmacros.pl:1511 +#: /opt/webwork/pg/macros/core/PGbasicmacros.pl:1514 /opt/webwork/pg/macros/core/PGbasicmacros.pl:1515 msgid "Solution:" msgstr "" -#: /opt/webwork/pg/macros/core/PGbasicmacros.pl:1509 +#: /opt/webwork/pg/macros/core/PGbasicmacros.pl:1513 msgid "Solution: " msgstr "" @@ -5295,11 +6287,15 @@ msgstr "" msgid "Solutions" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/Levels.html.ep:20 +msgid "Some OPL problems have been rated for difficulty/educational objective. The levels are loosely inspired by Bloom's taxonomy. They are assigned numbers from 1 to 6 as follows." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/problem_row.html.ep:185 msgid "Some WeBWorK problems are programmed using what are called Math Objects. These problems are preferred by some people because they provide a more consistent collection of messages to faulty student answers, particularly for answers which are way off base." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:375 +#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:379 msgid "Some answers will be graded later." msgstr "" @@ -5307,7 +6303,7 @@ msgstr "" msgid "Some of these files are directories. Only delete directories if you really know what you are doing. You can seriously damage your course if you delete the wrong thing." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1979 +#: /opt/webwork/webwork2/conf/defaults.config:1983 msgid "Some problems have an explanation essay answer field, typically following a simpler answer field. For example, find a certain derivative using the definition. An answer blank would be present for the derivative to be automatically checked, and then there would be a separate essay answer field to show the steps of actually using the definition of the derivative, to be scored manually. With this setting, the essay explanation fields are supperessed. Instructors may use the exercise without incurring the manual grading." msgstr "" @@ -5315,15 +6311,7 @@ msgstr "" msgid "Some problems shown above represent multiple similar problems from the database. If the (top) information line for a problem has a letter M for \"More\", hover your mouse over the M to see how many similar problems are hidden, or click on the M to see the problems. If you click to view these problems, the M becomes an L, which can be clicked on to hide the problems again." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1510 -msgid "Some servers handle courses taking place in different timezones. If this course is not showing the correct timezone, enter the correct value here. The format consists of unix times, such as \"America/New_York\",\"America/Chicago\", \"America/Denver\", \"America/Phoenix\" or \"America/Los_Angeles\". Complete list: TimeZoneFiles" -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIBasic.pm:524 -msgid "Something was wrong with your LTI parameters. If this recurs, please speak with your instructor" -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:99 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:79 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:99 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:79 /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:50 msgid "Sort" msgstr "" @@ -5340,6 +6328,10 @@ msgstr "" msgid "Sort:" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:51 +msgid "Sorts the lists displayed by due date, name, etc." +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:363 msgid "Source File" msgstr "" @@ -5353,11 +6345,15 @@ msgstr "" msgid "Specify an ID, title, and institution for the new course. The course ID may contain only letters, numbers, hyphens, and underscores, and may have at most %1 characters." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:35 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:117 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:94 +msgid "Spell check the text of the file that your are editing. Note that there will be many spelling errors in the code parts of your file." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:35 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:116 msgid "Standard Deviation" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:164 +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:162 msgid "Start" msgstr "" @@ -5369,10 +6365,14 @@ msgstr "" msgid "Start New Test" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Stats.pm:100 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Stats.pm:95 /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:354 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:139 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:84 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Stats.pm:100 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Stats.pm:95 /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:406 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:139 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:84 /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:54 msgid "Statistics" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorStats.html.ep:17 +msgid "Statistics Help" +msgstr "" + #. ($c->tag('span', dir => 'ltr', format_set_name_display($setID) #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Stats.pm:86 msgid "Statistics for %1" @@ -5388,11 +6388,11 @@ msgstr "" msgid "Statistics for student %1" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:442 /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:289 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/problem_row.html.ep:151 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/problem_row.html.ep:91 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:16 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/user_list.html.ep:34 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/problem_list.html.ep:16 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:162 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSets.html.ep:32 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSets.html.ep:34 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:442 /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:289 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/problem_row.html.ep:151 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/problem_row.html.ep:91 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:16 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/user_list.html.ep:34 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/problem_list.html.ep:16 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:160 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSets.html.ep:34 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSets.html.ep:36 msgid "Status" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Base/login_status.html.ep:34 +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/login_status.html.ep:29 msgid "Stop Acting" msgstr "" @@ -5400,11 +6400,11 @@ msgstr "" msgid "Stop Archiving" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1165 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1153 msgid "Stop archiving courses" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:127 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers.html.ep:43 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:133 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/user_list.html.ep:30 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:127 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers.html.ep:43 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:106 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/user_list.html.ep:30 msgid "Student ID" msgstr "" @@ -5416,25 +6416,41 @@ msgstr "" msgid "Student Name" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:82 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:87 /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:376 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:80 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:85 /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:428 /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:56 msgid "Student Progress" msgstr "" -#. ($c->ce->{courseName}, $c->tag('span', dir => 'ltr', format_set_name_display($c->stash('setID') -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:77 -msgid "Student Progress for %1 set %2. Closes %3" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorStudentProgress.html.ep:17 +msgid "Student Progress Help" msgstr "" -#. ($c->ce->{courseName}, $c->{studentID}) +#. ($c->{studentID}) #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:72 -msgid "Student Progress for %1 student %2" +msgid "Student Progress for %1" +msgstr "" + +#. ($c->tag('span', dir => 'ltr', format_set_name_display($c->stash('setID') +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:76 +msgid "Student Progress for set %1" msgstr "" #: /opt/webwork/webwork2/templates/ContentGenerator/Hardcopy/form.html.ep:80 msgid "Student answers" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:58 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/browse_library_panel_advanced.html.ep:11 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/browse_library_panel_simple.html.ep:8 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:80 +msgid "Student scores for the sets selected below will be calculated. This and other scoring operations can also be done using the \"Scoring Tools\" link." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:87 +msgid "Student:" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:124 +msgid "Students" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:50 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/browse_library_panel_advanced.html.ep:11 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/browse_library_panel_simple.html.ep:8 msgid "Subject:" msgstr "" @@ -5459,11 +6475,11 @@ msgstr "" msgid "Submit your answers again to go on to the next part." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:39 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:70 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:137 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:184 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:39 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:70 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:136 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:183 msgid "Success Index" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:42 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:107 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/problem_stats.html.ep:42 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:106 msgid "Success index is the square of the average score divided by the average number of attempts." msgstr "" @@ -5472,7 +6488,7 @@ msgid "Success index is the square of the score divided by the number of attempt msgstr "" #. ($archive_courseID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1098 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1086 msgid "Successfully archived the course %1." msgstr "" @@ -5482,44 +6498,48 @@ msgid "Successfully created new achievement %1" msgstr "" #. ($c->tag('span', dir => 'ltr', format_set_name_display($newSetID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:572 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:581 msgid "Successfully created new set %1" msgstr "" #. ($add_courseID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:472 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:465 msgid "Successfully created the course %1" msgstr "" #. ($delete_courseID) #. ($archive_courseID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1143 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:911 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1131 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:900 msgid "Successfully deleted the course %1." msgstr "" #. ($rename_oldCourseID, $rename_newCourseID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:781 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:772 msgid "Successfully renamed the course %1 to %2" msgstr "" #. ($unarchive_courseID, $new_courseID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1294 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1286 msgid "Successfully unarchived %1 to the course %2" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2282 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:89 +msgid "TA:" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2274 msgid "Table defined in database but missing in schema" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2277 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2269 msgid "Table defined in schema but missing in database" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2273 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2265 msgid "Table is ok" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/edit_location_form.html.ep:59 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/manage_location_form.html.ep:106 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementEditor.html.ep:64 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList.html.ep:62 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:183 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList.html.ep:128 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList.html.ep:98 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/edit_location_form.html.ep:59 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/manage_location_form.html.ep:106 msgid "Take Action!" msgstr "" @@ -5531,11 +6551,15 @@ msgstr "" msgid "TeX Source" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:206 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:258 msgid "Test %2" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:162 +#: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/AddNewTestGW.pm:54 /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/ExtendDueDateGW.pm:52 /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/ResurrectGW.pm:55 +msgid "Test Name" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:156 msgid "Test Time" msgstr "" @@ -5547,11 +6571,11 @@ msgstr "" msgid "Test Time Notification" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:158 +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:156 msgid "Test Versions" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:277 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:244 msgid "Test not yet submitted." msgstr "" @@ -5563,10 +6587,14 @@ msgstr "" msgid "Test/quiz with time limit." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:76 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:80 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:79 msgid "Text" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:80 +msgid "Text Editor Options" +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/browse_library_panel_advanced.html.ep:55 msgid "Text chapter:" msgstr "" @@ -5579,6 +6607,30 @@ msgstr "" msgid "Textbook:" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorSetMaker.html.ep:58 +msgid "The \"Edit Target Set\" button at the top of the page will take you to the Problem Set Editor which will allow you to edit dates, assign users and other information about the problem set." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:115 +msgid "The \"Score\" tab will export achievement data to a CSV file that can be downloaded. The export contains the global data including number of achievement points and current level of each student. In addition for each selected achievement, a column for if the achievement was earned (1) or not earned (0) will be added to the CSV." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:194 +msgid "The Assigned sets column (x/y) indicates that x sets out of y sets avaiable have been assigned to this student. Click this link to assign or unassign sets to this student, to adjust due dates, or to adjust the grades on a homework set for a student." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:20 +msgid "The Set Detail page can be viewed in one of two distinct modes:" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:189 +msgid "The login name column links allow you to \"act as\" a student." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:191 +msgid "The pencil in the login column allows you to edit that student's data." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker/problem_row.html.ep:64 msgid "The Attempts figure is the global average of the number of attempts (both correct and incorrect) individuals take on this problem. A high figure may represent a difficult problem. Note that problems with multiple parts may have higher average attempts since many students will submit an answer to each part before continuing and each such submittal counts as an attempt." msgstr "" @@ -5587,11 +6639,11 @@ msgstr "" msgid "The Attempts figure is the local average of the number of attempts (both correct and incorrect) individuals at your institution take on this problem. A high figure may represent a difficult problem. Note that problems with multiple parts may have higher average attempts since many students will submit an answer to each part before continuing and each such submittal counts as an attempt." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1717 +#: /opt/webwork/webwork2/conf/defaults.config:1721 msgid "The Maximum number of times Show me Another can be used per problem by a student. If set to -1 then there is no limit to the number of times that Show Me Another can be used." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1685 +#: /opt/webwork/webwork2/conf/defaults.config:1689 msgid "The Reduced Scoring Period is the default period before the due date during which all additional work done by the student counts at a reduced rate. When enabling reduced scoring for a set the reduced scoring date will be set to the due date minus this number. The reduced scoring date can then be changed. If the Reduced Scoring is enabled and if it is after the reduced scoring date, but before the due date, a message like \"This assignment has a Reduced Scoring Period that begins 11/08/2009 at 06:17pm EST and ends on the due date, 11/10/2009 at 06:17pm EST. During this period all additional work done counts 50% of the original.\" will be displayed." msgstr "" @@ -5607,23 +6659,31 @@ msgstr "" msgid "The WeBWorK Project" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/AdminAddCourse.html.ep:25 +msgid "The WeBWorK administrators need to be added to the course in order for them to access the course. Unchecking this option will make it so WeBWorK administrators cannot directly login to the course." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:129 +msgid "The achievement evaluator is the perl code that is run after each submit to determine if an achievement is earned or not. Click on the \"Edit Evaluator\" link to edit the evaluator." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/problem_list.html.ep:26 msgid "The adjusted status of a problem is the larger of the problem's status andthe weighted average of the status of those problems which count towards the parent grade." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1575 +#: /opt/webwork/webwork2/conf/defaults.config:1579 msgid "The amount of time (in minutes) after the due date that the Answers are available to student to view. You can change this for individual homework, but WeBWorK will use this value when a set is created." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1565 +#: /opt/webwork/webwork2/conf/defaults.config:1569 msgid "The amount of time (in minutes) before the due date when the assignment is opened. You can change this for individual homework, but WeBWorK will use this value when a set is created." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:382 +#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:386 msgid "The answer above is NOT correct." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:371 +#: /opt/webwork/webwork2/lib/WeBWorK/HTML/AttemptsTable.pm:375 msgid "The answer above is correct." msgstr "" @@ -5636,7 +6696,12 @@ msgstr "" msgid "The child problems for this problem will become visible to the student when they either have more incorrect attempts than is specified here, or when they run out of attempts, whichever comes first. If \"max\" is specified here then child problems will only be available after a student runs out of attempts." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Config.html.ep:29 +#. ('href="http://webwork.maa.org/wiki/Classlist_Files#Format_of_classlist_files" target="Webworkdocs"', 'demoCourse.lst','.csv','.lst') +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:59 +msgid "The classlist files are stored in the templates directory and provide a convenient way to enter a large number of students into your class. To view the format for ClassList files see the ClassList specification or download the %2 file and use it as a model. ClassList files can be prepared using a spreadsheet and then saved as %3 (comma separated values) text files. However, to access as a classlist file, the file suffix needs to be changed to %4, which can be done with the \"Rename\" button." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Config.html.ep:16 msgid "The configuration module did not find the data it needs to function. Have your site administrator check that site configuration files are up to date." msgstr "" @@ -5646,17 +6711,17 @@ msgid "The course \"%1\" has already been archived at \"%2\". This earlier archi msgstr "" #. (tag('strong', stash('courseID') -#: /opt/webwork/webwork2/templates/ContentGenerator/Logout.html.ep:11 +#: /opt/webwork/webwork2/templates/ContentGenerator/Logout.html.ep:8 msgid "The course %1 uses an external authentication system (%2). Please go there to log in again." msgstr "" #. (tag('strong', $course) -#: /opt/webwork/webwork2/templates/ContentGenerator/Login.html.ep:15 +#: /opt/webwork/webwork2/templates/ContentGenerator/Login.html.ep:17 msgid "The course %1 uses an external authentication system (%2). Please return to that system to access this course." msgstr "" #. (tag('strong', $course) -#: /opt/webwork/webwork2/templates/ContentGenerator/Login.html.ep:21 +#: /opt/webwork/webwork2/templates/ContentGenerator/Login.html.ep:23 msgid "The course %1 uses an external authentication system (%2). You've authenticated through that system, but aren't allowed to log in to this course." msgstr "" @@ -5668,24 +6733,36 @@ msgstr "" msgid "The course database must be upgraded before renaming this course." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1893 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:26 +msgid "The current mode should be made clear by the information at the top of the page." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementEditor.html.ep:46 +msgid "The current value of the achievement counter. Changes to this variable will be saved." +msgstr "" + +#: /opt/webwork/webwork2/conf/defaults.config:1897 msgid "The default display mode" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1753 +#: /opt/webwork/webwork2/conf/defaults.config:1757 msgid "The default number of attempts before the problem is re-randomized. ( 0 => never )" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1752 +#: /opt/webwork/webwork2/conf/defaults.config:1756 msgid "The default number of attempts between re-randomization of the problems ( 0 => never)" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:73 +msgid "The description shown to students which states what action is needed to earn the achievement." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:5 msgid "The directory you specified doesn't exist" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:2028 -msgid "The e-mail verbosity level controls how much information is automatically added to feedback e-mails. Levels are
    1. Simple: send only the feedback comment and context link
    2. Standard: as in Simple, plus user, set, problem, and PG data
    3. Debug: as in Standard, plus the problem environment (debugging data)
    " +#: /opt/webwork/webwork2/conf/defaults.config:2032 +msgid "The e-mail verbosity level controls how much information is automatically added to feedback e-mails. Levels are
    1. Simple: send only the feedback comment and context link
    2. Standard: as in Simple, plus user, set, problem, and PG data
    3. Debug: as in Standard, plus the problem environment (debugging data)
    " msgstr "" #. ($achievementName, $c->shortPath($outputFilePath) @@ -5694,46 +6771,51 @@ msgid "The evaluator for %1 has been renamed to \"%2\"." msgstr "" #. ($c->shortPath($c->{inputFilePath}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:248 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:246 msgid "The file \"%1\" cannot be found." msgstr "" #. ($c->shortPath($editFilePath) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:552 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:526 msgid "The file \"%1\" cannot be read!" msgstr "" -#. ($c->shortPath($c->{inputFilePath}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:260 -msgid "The file \"%1\" is a blank problem!To edit this text you must use the \"New Version\" action below to save it to another file." -msgstr "" - #. ($c->shortPath($editFilePath) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:548 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:522 msgid "The file \"%1\" is a directory!" msgstr "" #. ($c->shortPath($c->{inputFilePath}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:252 -msgid "The file \"%1\" is protected! To edit this text you must first make a copy of this file using the \"New Version\" action below." +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:259 +msgid "The file \"%1\" is a template. You may use \"Save As\" to create a new file." +msgstr "" + +#. ($c->shortPath($c->{inputFilePath}) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:250 +msgid "The file \"%1\" is protected. You may use \"Save As\" to create a new file." msgstr "" #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/view.html.ep:19 msgid "The file $file does not appear to be a text or image file." msgstr "" -#. ("$emailDirectory/$openfilename") -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:305 +#. ("$emailDirectory/$output_file") +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:277 msgid "The file %1 already exists and cannot be overwritten. The message was not saved." msgstr "" #. ("$emailDirectory/$openfilename", $emailDirectory) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:170 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:156 msgid "The file %1 cannot be found. Check whether it exists and whether the directory %2 can be read by the webserver. " msgstr "" +#. ($outputFilePath) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:594 +msgid "The file %1 is not contained in the course templates directory and can not be modified." +msgstr "" + #. ("$emailDirectory/$openfilename") -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:161 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:148 msgid "The file %1 is not readable by the webserver. Check that it's permissions are set correctly." msgstr "" @@ -5750,71 +6832,122 @@ msgstr "" msgid "The filetype of the attached file \"%1\" is not allowed." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2157 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2149 msgid "The following courses were successfully hidden:" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2226 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2218 msgid "The following courses were successfully unhidden:" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorScoring.html.ep:34 +msgid "The following describes how the checkboxes alter the scoring output" +msgstr "" + #. (tag('b', join(', ', @$unassignedUsers) #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:66 msgid "The following users are NOT assigned to this set and will be ignored: %1" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:290 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:288 msgid "The given file path is not a valid location." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementEditor.html.ep:49 +msgid "The goal value of the achievement counter." +msgstr "" + #. (join('.', @{ $problemSeqs[ $children_counts_indexs[0] ] }) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1339 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1334 msgid "The grade for this problem is the larger of the score for this problem, or the score of problem %1." msgstr "" #. (join(', ', map({ join('.', @{ $problemSeqs[$_] }) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1349 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1344 msgid "The grade for this problem is the larger of the score for this problem, or the weighted average of the problems: %1." msgstr "" #. ($c->{setID}, $c->shortPath($outputFilePath) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1102 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1078 msgid "The hardcopy header for set %1 has been renamed to \"%2\"." msgstr "" +#. ($showHintsAfter) +#: /opt/webwork/webwork2/templates/ContentGenerator/Problem/messages.html.ep:36 +msgid "The hint shown is an instructor preview and will be shown to students after %quant(%1,attempt)." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Problem/messages.html.ep:32 +msgid "The hint shown is an instructor preview and will not be shown to students." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/ProblemSets.html.ep:22 +msgid "The information box on the right displays information about the course. This is useful for leaving course wide messages for students. It contains text from the file templates/course_info.txt. Instructors can edit this file from the web (click on the \"Edit\" link)." +msgstr "" + #: /opt/webwork/webwork2/templates/HTML/SingleProblemGrader/grader.html.ep:30 msgid "The initial value is the answer sub score for the answer that is currently shown. If this is modified, it will be used to compute the total problem score below. This score is not saved, and will reset to the score for the shown answer if the page is reloaded." msgstr "" -#: /opt/webwork/webwork2/templates/HTML/SingleProblemGrader/grader.html.ep:92 +#: /opt/webwork/webwork2/templates/HTML/SingleProblemGrader/grader.html.ep:97 msgid "The initial value is the currently saved score as a point value computed using the percent score. This point value is used to compute the percent score (rounded to a whole percent) that can be saved." msgstr "" -#: /opt/webwork/webwork2/templates/HTML/SingleProblemGrader/grader.html.ep:141 +#: /opt/webwork/webwork2/templates/HTML/SingleProblemGrader/grader.html.ep:145 msgid "The initial value is the currently saved score for this student." msgstr "" #. ($rename_oldCourseID, $rename_oldCourseInstitution, $rename_newCourseInstitution) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:703 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:696 msgid "The institution associated with the course %1 has been changed from %2 to %3" msgstr "" #. ($rename_newCourseID, $optional_arguments{courseInstitution}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:736 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:729 msgid "The institution associated with the course %1 is now %2" msgstr "" #. ($userID) -#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:621 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvantage.pm:599 +msgid "The instructor account with user id %1 does not exist. Instructor accounts must be created manually." +msgstr "" + +#. ($userID) +#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:635 msgid "The instructor account with user id %1 does not exist. Please create the account manually via WeBWorK." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:87 +msgid "The key maps that are available are \"default\", \"emacs\", \"sublime\", and \"vim\". The \"default\" key map has the standard behavior of a browser text area. You can use Ctrl-C to copy, Ctrl-V to paste, Ctrl-F to search, etc. If you are more comfortable with the \"emacs\", \"sublime\", or \"vim\" text editors then you may choose to use one of those key maps instead." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:75 +msgid "The large text window" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:27 +msgid "The list of files include regular files, directories (ending in a \"/\") and links (ending in a \"@\")." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:52 +msgid "The login name cannot be changed. (It is the primary key for the student's data.) If you make a mistake in the login name at the beginning of the course (before any work has been done) then it is best to simply add a new student with the correct entry and drop the student with the bad login name. (See drop and delete students below.) If the login name must be changed after a user has started working assignments, then contact your system administrator, who can use the webwork2 \"bin/change_user_id\" script to change the user id." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorStats.html.ep:20 +msgid "The main page allows access to set and student statistics. When selecting a student, their grades page is shown, which lists set totals and per problem grades for each set assigned to the student. When selecting a set, various statistics and histograms are shown for the overall grades of students who are currently enrolled or auditing the course." +msgstr "" + +#. ('href="http://webwork.maa.org/wiki" target="ww_wiki"', 'href="http://webwork.maa.org/wiki/Instructors" target="ww_wiki"') +#: /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:24 +msgid "The main page for WeBWorK documentation is the webwork wiki while specific help for instructors setting up a course are in the instructors' section." +msgstr "" + #. ($c->param('new_set_name') #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:569 msgid "The name \"%1\" is not a valid set name. Use only letters, digits, dashes, underscores, periods, and spaces." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1428 +#: /opt/webwork/webwork2/conf/defaults.config:1432 msgid "The name of course information file (located in the templates directory). Its contents are displayed in the right panel next to the list of homework sets." msgstr "" @@ -5826,18 +6959,22 @@ msgstr "" msgid "The name of the LMS. This is used in messages to users that direct them to go back to the LMS to access something in the WeBWorK course." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:63 +msgid "The number of points earned for earning the achievement." +msgstr "" + #. ($openDate, $dueDate, $answerDate) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1095 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1104 msgid "The open date: %1, close date: %2, and answer date: %3 must be defined and in chronological order." msgstr "" #. ($path) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:415 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:393 msgid "The original path is not in a valid location. Using failsafe %1" msgstr "" #. ($forcedSourceFile) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:536 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:510 msgid "The original path to the file is %1." msgstr "" @@ -5845,6 +6982,10 @@ msgstr "" msgid "The password and password confirmation for the instructor must match." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/Options.html.ep:27 +msgid "The password can be any combination of letters, numbers and special symbols. Students are encouraged to use all three, and stay away from dictionary words. The password should not be the same as any password used elsewhere, such as for an email account. The password will only be present on the page if the user has permission to change the password." +msgstr "" + #. ($c->tag( 'b', $c->maketext( "[_1]'s Current Password", $c->{user}->first_name . ' ' . $c->{user}->last_name) #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Options.pm:95 msgid "The password you entered in the %1 field does not match your current password. Please retype your current password and try again." @@ -5855,34 +6996,39 @@ msgstr "" msgid "The passwords you entered in the %1 and %2 fields don't match. Please retype your new password and try again." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:396 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:374 msgid "The path can not be the temporary edit directory." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:392 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:370 msgid "The path to the original file should be absolute." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:132 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:131 msgid "The percentage of students receiving at least these scores. The median score is in the 50% column." msgstr "" #. ($setName) -#: /opt/webwork/webwork2/lib/WeBWorK/Authz.pm:450 +#: /opt/webwork/webwork2/lib/WeBWorK/Authz.pm:458 msgid "The prerequisite conditions have not been met for set '%1'." msgstr "" +#. (q(down menu to change which student's seed and answers are shown. Use the "Mark Correct" checkbox to set) +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemGrader.html.ep:26 +msgid "The problem is shown at the top with the seed and answers of the selected student. Use the drop " +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Problem/submit_buttons.html.ep:62 msgid "The problem set is not yet open" msgstr "" #. ($origReducedScoringDate) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1112 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1121 msgid "The reduced credit date %1 in the file probably was generated from the Unix epoch 0 value and is being treated as if it was Unix epoch 0." msgstr "" #. ($openDate, $dueDate) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1126 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1135 msgid "The reduced credit date should be between the open date %1 and close date %2" msgstr "" @@ -5896,29 +7042,58 @@ msgid "The requested file \"%1\" does not exist on the server." msgstr "" #. (join('.', @seq) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1394 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1389 msgid "The score for this problem can count towards score of problem %1." msgstr "" -#. (stash('setID') -#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet.html.ep:13 -msgid "The selected problem set (%1) is not a valid set for %2." +#. ('courseName_totals.csv') +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:69 +msgid "The scoring files are stored in the scoring directory and are produced using the \"Scoring Tools\" page or the scoring command in the \"Instructor Tools\" module. These files can be downloaded, modified in a spreadsheet (for example, to add midterm scores) and then uploaded again to the scoring directory to be merged with email messages. (Use a new file name, other than %1, when uploading to prevent the scoring module from overwriting an uploaded file.)" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorSetMaker.html.ep:52 +msgid "The second row of the problem collection area is for browsing directories. The OPL will be there as well as any other directories that you may set up (for example Contrib). If this is selected, all subdirectories containing problems will be listed." +msgstr "" + +#. (stash('setID') +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet.html.ep:13 +msgid "The selected problem set (%1) is not a valid set for %2." +msgstr "" + +#. ($setID, $effectiveUserID, $c->{invalidVersionCreation} ? " (acted as by $userID) +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:77 +msgid "The selected problem set (%1) is not a valid set for %2: %3" +msgstr "" + +#. ($c->{setID}, $c->shortPath($outputFilePath) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1066 +msgid "The set header for set %1 has been renamed to \"%2\"." +msgstr "" + +#. ($newSetID) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:491 +msgid "The set name \"%1\" is already in use. Pick a different name if you would like to start a new set. No set created." +msgstr "" + +#. ($newSetName) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:584 +msgid "The set name '%1' is already in use. Pick a different name if you would like to start a new set." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:58 +msgid "The sets checked below will be visible to students or hidden from students. Useful for preparing sets ahead of time, but not showing them to students; or for temporarily hiding a set which has a mistake in it while it is being fixed." msgstr "" -#. ($setID, $effectiveUserID, $c->{invalidVersionCreation} ? " (acted as by $userID) -#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:77 -msgid "The selected problem set (%1) is not a valid set for %2: %3" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:54 +msgid "The sets checked below will become available for editing the due dates and visibility." msgstr "" -#. ($c->{setID}, $c->shortPath($outputFilePath) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1090 -msgid "The set header for set %1 has been renamed to \"%2\"." +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:73 +msgid "The sets checked below will written to set definition files, to be saved for future use, or to be transferred to another course. The set definition files can be uploaded/downloaded using the \"File Manager\"." msgstr "" -#. ($newSetName) -#. ($newSetID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:481 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SetMaker.pm:584 -msgid "The set name '%1' is already in use. Pick a different name if you would like to start a new set." +#: /opt/webwork/webwork2/templates/HelpFiles/AdminAddCourse.html.ep:29 +msgid "The simple configuration file is the name of the configuration file created when using the \"Course Configuration\" page to configure course options. This option sets if this configuration file is copied from the old course or not and instead use the server defaults." msgstr "" #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:521 @@ -5930,17 +7105,17 @@ msgid "The solution shown is an instructor preview and will only be shown to stu msgstr "" #. ($c->{fullSetID}, $c->{prettyProblemNumber}, $c->shortPath($c->{sourceFilePath}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1127 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1103 msgid "The source file for \"set %1 / problem %2\" has been changed from \"%3\" to \"%4\"." msgstr "" #. ($c->{tempFilePath}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1233 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1209 msgid "The temporary file %1 is not contained in the course templates directory and can not be deleted." msgstr "" #. ($c->{tempFilePath}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:715 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:689 msgid "The temporary file %1 is not in the course templates directory and can not be deleted!" msgstr "" @@ -5949,7 +7124,7 @@ msgstr "" msgid "The test (which is version %1) may no longer be submitted for a grade." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1066 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1042 msgid "The text box now contains the source of the original problem. You can recover lost edits by using the Back button on your browser." msgstr "" @@ -5958,56 +7133,72 @@ msgstr "" msgid "The time limit on this assignment was exceeded. The assignment may be checked, " msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1555 +#: /opt/webwork/webwork2/conf/defaults.config:1559 msgid "The time of the day that the assignment is due. This can be changed on an individual basis, but WeBWorK will use this value for default when a set is created." msgstr "" #. ($rename_oldCourseID, $rename_oldCourseTitle, $rename_newCourseTitle) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:696 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:689 msgid "The title of the course %1 has been changed from %2 to %3" msgstr "" #. ($rename_newCourseID, $optional_arguments{courseTitle}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:729 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:722 msgid "The title of the course %1 is now %2" msgstr "" +#: /opt/webwork/webwork2/templates/ContentGenerator/Grades/student_stats.html.ep:16 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:167 +msgid "The top number is the percent score on the problem. A period (.) indicates a problem has not been attempted. The bottom number is the number of incorrect attempts." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/Grades.html.ep:25 +msgid "The total grade row at the bottom shows the total score and percent average over all open assignments. The total grade row can be shown/hidden under general course configuration settings." +msgstr "" + #. ($enableReducedScoring) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1142 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1151 msgid "The value %1 for enableReducedScoring is not valid; it will be replaced with 'N'." msgstr "" #. ($timeCap) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1200 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1209 msgid "The value %1 for the capTimeLimit option is not valid; it will be replaced with '0'." msgstr "" #. ($hideScore) #. ($hideScoreByProblem) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1169 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1180 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1178 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1189 msgid "The value %1 for the hideScore option is not valid; it will be replaced with 'N'." msgstr "" #. ($hideWork) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1191 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1200 msgid "The value %1 for the hideWork option is not valid; it will be replaced with 'N'." msgstr "" #. ($relaxRestrictIP) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1226 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1235 msgid "The value %1 for the relaxRestrictIP option is not valid; it will be replaced with 'No'." msgstr "" #. ($restrictIP) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1212 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1221 msgid "The value %1 for the restrictIP option is not valid; it will be replaced with 'No'." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin.html.ep:67 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:46 +msgid "The visible name/title of the achievement." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin.html.ep:36 msgid "The webwork server must be able to write to these directories. Please correct the permssion errors." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1435 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:83 +msgid "Theme" +msgstr "" + +#: /opt/webwork/webwork2/conf/defaults.config:1439 msgid "Theme (refresh page after saving changes to reveal new theme.)" msgstr "" @@ -6025,11 +7216,11 @@ msgstr "" msgid "There are %1 matching WeBWorK problems" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1523 +#: /opt/webwork/webwork2/conf/defaults.config:1527 msgid "There are currently two hardcopy themes to choose from: One Column and Two Columns. The Two Columns theme is the traditional hardcopy format. The One Column theme uses the full page width for each column" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1527 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1519 msgid "There are extra database fields which are not defined in the schema for at least one table." msgstr "" @@ -6037,15 +7228,15 @@ msgstr "" msgid "There are extra database fields which are not defined in the schema for at least one table. They can be removed when upgrading the course." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1412 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1404 msgid "There are extra database fields which are not defined in the schema for at least one table. Check the checkbox by the field to delete it when upgrading the course. Warning: Deletion destroys all data contained in the field and is not undoable!" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1516 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1508 msgid "There are extra database tables which are not defined in the schema." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1397 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1389 msgid "There are extra database tables which are not defined in the schema. " msgstr "" @@ -6053,7 +7244,11 @@ msgstr "" msgid "There are extra database tables which are not defined in the schema. These can be deleted when upgrading the course." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:35 +#: /opt/webwork/webwork2/templates/HelpFiles/Hardcopy.html.ep:29 +msgid "There are many options available at the bottom:" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:49 msgid "There are no completed versions of this test." msgstr "" @@ -6113,19 +7308,36 @@ msgstr "" msgid "There is no written solution available for this problem." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1437 -msgid "There is one main theme to choose from: math4. It has three variants: math4-green, math4-red, andmath4-yellow. The theme specifies a unified look and feel for the WeBWorK course web pages." +#: /opt/webwork/webwork2/conf/defaults.config:1441 +msgid "There is one main theme to choose from: math4. It has three variants: math4-green, math4-red, and math4-yellow. The theme specifies a unified look and feel for the WeBWorK course web pages." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:428 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:441 msgid "There was an error during the login process. Please speak to your instructor or system administrator if this recurs." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:165 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:283 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:307 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:341 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:479 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:489 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:523 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:561 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIBasic.pm:206 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIBasic.pm:330 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIBasic.pm:387 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:174 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:294 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:318 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:354 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:492 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:502 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:536 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvanced.pm:575 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvantage.pm:172 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvantage.pm:189 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvantage.pm:201 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvantage.pm:212 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvantage.pm:227 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvantage.pm:238 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvantage.pm:331 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvantage.pm:355 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvantage.pm:365 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvantage.pm:402 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIAdvantage.pm:447 msgid "There was an error during the login process. Please speak to your instructor or system administrator." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1833 +#. ('href="https://webwork.maa.org/wiki/Set_Definition_Files" target="Webworkdocs"') +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:48 +msgid "These are stored in the templates directory. The format of Set Definition files is described in the Set Definition specification. Set definition files are mainly useful for transferring set assignments from one course to another and are created when exporting a problem set from the \"Hmwk Sets Editor\". Each set defintion file contains a list of problems used and the dates and times. These definitions can be imported into the current course." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:77 +msgid "These are the files from which problems are generated and are located in the templates directory or in subdirectories. They can be edited directly using the \"Edit\" link on each problem page or from the \"Hmwk Sets Editor\". The File Manager allows you to upload or download these files. \tDirectories that start with \"set\" contain pg files and are generated when exporting a problem set in which there are local versions of a problem." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/Options.html.ep:40 +msgid "These options will only be shown if the user has the permission to change display settings used in pg problems." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/Levels.html.ep:44 +msgid "These problems require some application of algorithms, but do not rise to the level of a full word problem. For example, \"Identify the local extrema for f(x) = ...\". One has to apply algorithms and interpret results." +msgstr "" + +#: /opt/webwork/webwork2/conf/defaults.config:1837 msgid "These users and higher get the \"Show Past Answers\" button on the problem page." msgstr "" @@ -6137,19 +7349,59 @@ msgstr "" msgid "This action will not overwrite existing users." msgstr "" -#: /opt/webwork/webwork2/templates/HTML/SingleProblemGrader/grader.html.ep:100 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:20 +msgid "This allows for the viewing, downloading, uploading and other management of files in the course. Select a file or set of files (using CTRL or SHIFT) and click the desired button on the right. Many actions can only be done with a single file (like view). Selecting a directory or set of files and clicking \"Make Archive\" creates a compressed tar file with the name COURSE_NAME.tgz" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorSetMaker.html.ep:34 +msgid "This browses the Open Problem Library (OPL) in category (Subject/Chapter/Section) form. Select the desired categories (all three do not need to be selected) and click \"View Problems\". If the \"Include Contrib\" box is selected then those problems in the Contrib section of the OPL that have the categories defined are also included. Contrib problems are problem that haven't been vetted as thoroughly as OPL problems. If you want hints or solutions included while browsing select the appropriate box." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:49 +msgid "This button is also present both at top and the bottom of the page. Discards all changes, reloading the page by re-reading the database information for this set." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:39 +msgid "This button is present both at top and the bottom of the page. Any and all changes made to any part of the set will be saved with one important exception: When editing the set for one or more students, you can choose to override the default value (defined for the set in general) by clicking on the checkbox and providing a value (or possibly leaving blank) and checking the override checkbox. If you do NOT check the checkbox, the override value will be discarded and the default value for the set will be used for the users currently being edited." +msgstr "" + +#: /opt/webwork/webwork2/templates/HTML/SingleProblemGrader/grader.html.ep:105 msgid "This can computed from the answer sub scores above using the weights shown if they are modified. Alternatively, enter the point score you want saved here (the above sub scores will be ignored)." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:2001 +#: /opt/webwork/webwork2/conf/defaults.config:2005 msgid "This configures if the single problem manual grader has inputs to enter problem scores as a percent, a point value, or both. Note, the problem score is always saved as a percent, so when using a point value, the problem score will be rounded to the nearest whole percent." msgstr "" #. (tag('b', maketext('Guest Login') -#: /opt/webwork/webwork2/templates/ContentGenerator/Login.html.ep:70 +#: /opt/webwork/webwork2/templates/ContentGenerator/Login.html.ep:72 msgid "This course supports guest logins. Click %1 to log into this course as a guest." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/Options.html.ep:58 +msgid "This determines if MathQuill answer blanks are enable for the user. This option is only present if MathQuill is enabled for the course." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/Options.html.ep:63 +msgid "This determines if the MathView equation editor button will be appended to text answer blanks. his option is only present if MathView is enabled for the course." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/Options.html.ep:52 +msgid "This determines whether or not saved past answers are automatically filled in to the problem form when a student returns to a problem after having left the problem. This option is only visible if the user has the permission to show old answers." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:85 +msgid "This directory is accessible from the web. You can use it to store html documents or image documents that are used by the course. Do not store private information in this directory or in any subdirectory thereof. These documents can be linked to from within problems using the htmlLink macro." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:255 +msgid "This file is a template. You may use \"Save As\" to create a new file." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementUserEditor.html.ep:20 +msgid "This form can assign, unassign, and edit user data for a single achievement. You can assign the achievement to all current users or select which users to assign the achievement to and click Save. You can unassign the achievement by unchecking a student's name (note all data will be deleted). To unassign the achievement from all users, first select \"Allow unassign\" and then click the \"Unassign from All Users\" button. You can also toggle the earned status with the checkbox in the \"Earned\" column and edit the achievement counter for counting achievements." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:19 msgid "This gives the status and dates of the main set. Indvidual students may have different settings." msgstr "" @@ -6158,19 +7410,15 @@ msgstr "" msgid "This homework set contains no problems." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1236 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1231 msgid "This homework set is closed." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1234 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1229 msgid "This homework set is not yet open." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:483 -msgid "This is a blank problem template file and can not be edited directly. Use the \"New Version\" action below to create a local copy of the file and add it to the current problem set." -msgstr "" - -#: /opt/webwork/pg/macros/core/problemRandomize.pl:423 +#: /opt/webwork/pg/macros/deprecated/problemRandomize.pl:423 msgid "This is a new (re-randomized) version of the problem." msgstr "" @@ -6184,47 +7432,153 @@ msgstr "" msgid "This is a timed test. You will have %quant(%1,hour,hours,)%quant(%2,minute,minutes,) to complete the test." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList.html.ep:20 -msgid "This is the Achievement Editor. It is used to edit the achievements available to students. Please keep in mind the following facts: Achievments are displayed, and evaluated, in the order they are listed. The \"secret\" category creates achievements which are not visible to students until they are earned. The \"level\" category is used for the achievements associated to a users level." +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:81 +msgid "This is done by first entering the user as a student and then changing the permission level of the user. First edit the user by clicking on the pencil next to their name (or using the technique above for several users), then change their permssion level -- an entry blank at the far right of the screen, you may have to scroll to see it. The permission levels are" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList.html.ep:24 -msgid "This is the classlist editor page, where you can view and edit the records of all the students currently enrolled in this course. The top of the page contains forms which allow you to filter which students to view, sort your students in a chosen order, edit student records, give new passwords to students, import/export student records from/to external files, or add/delete students. To use, please select the action you would like to perform, enter in the relevant information in the fields below, and hit the \"Take Action!\" button at the bottom of the form. The bottom of the page contains a table containing the student usernames and their information. Clicking on the links in the column headers of the table will sort the table by the field it corresponds to. The Login Name fields contain checkboxes for selecting the user. Clicking the link of the name itself will allow you to act as the selected user. There is also an edit link following the name which will take you to a page where you can edit the selected user's information. Clicking the emails will allow you to email the corresponding user. Clicking the links in the entries in the assigned sets columns will take you to a page where you can view and reassign the sets for the selected user. " +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:156 +msgid "This is done from the \"Hmwk Sets Editor\" or from the \"Instructor Tools\" page if you wish to assign a homework set to all students or a large group of students (e.g. a section)." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1992 -msgid "This is the default number of attempts a student must make before hints will be shown to the student. Set this to -1 to hide hints. Note that this can be overridden with a per problem setting." +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:161 +msgid "This is done from the \"Hmwk Sets Editor\" or from the \"Instructor Tools\" page." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1708 -msgid "This is the default number of attempts before show me another becomes available to students. It can be set to -1 to disable show me another by default." +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:171 +msgid "This is done from the \"Hmwk Sets Editor\" page or the \"Instructor tools\" page." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:71 +msgid "This is most easily done by importing a class list. The class list can be uploaded from your workstation to the server using the File Manager page. The class list must be a file ending in .lst and must have a specific format. Once the file has been uploaded to the server the file will appear in the import action pop-up list (5th action). demoCourse.lst is available for most courses and adds the \"practice users\" which activate guest logins to the class list." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:23 +msgid "This is the administration course which is used to manage courses on this server. Use the \"Admin Menu\" to select the desired action." +msgstr "" + +#: /opt/webwork/webwork2/conf/defaults.config:1996 +msgid "This is the default number of attempts a student must make before hints will be shown to the student. Set this to -1 to hide hints. Note that this can be overridden with a per problem setting." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList.html.ep:50 -msgid "This is the homework sets editor page where you can view and edit the homework sets that exist in this course and the problems that they contain. The top of the page contains forms which allow you to filter which sets to display in the table, sort the sets in a chosen order, edit homework sets, publish homework sets, import/export sets from/to an external file, score sets, or create/delete sets. To use, please select the action you would like to perform, enter in the relevant information in the fields below, and hit the \"Take Action!\" button at the bottom of the form. The bottom of the page contains a table displaying the sets and several pieces of relevant information. The Edit Set Data field in the table contains checkboxes for selection and a link to the set data editing page. The cells in the Edit Problems fields contain links which take you to a page where you can edit the containing problems, and the cells in the edit assigned users field contains links which take you to a page where you can edit what students the set is assigned to." +#: /opt/webwork/webwork2/conf/defaults.config:1712 +msgid "This is the default number of attempts before show me another becomes available to students. It can be set to -1 to disable show me another by default." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1597 +#: /opt/webwork/webwork2/conf/defaults.config:1601 msgid "This is the number of achievement points given to each user for completing a problem." msgstr "" -#: /opt/webwork/webwork2/templates/HTML/SingleProblemGrader/grader.html.ep:146 +#: /opt/webwork/webwork2/templates/HTML/SingleProblemGrader/grader.html.ep:150 msgid "This is the only part of the score that is actually saved. This is computed from the answer sub scores above using the weights shown if they are modified. Alternatively, enter the score you want saved here (the above sub scores will be ignored)." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ShowAnswers/instructor-selectors.html.ep:8 -msgid "This is the past answer viewer. Students can only see their answers, and they will not be able to see which parts are correct. Instructors can view any users answers using the form below and the answers will be colored according to correctness." +#: /opt/webwork/webwork2/templates/HelpFiles/ProblemSets.html.ep:19 +msgid "This is the standard entry point for the course." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:665 -msgid "This is your last submission. If you say yes, then your answers will be final, and you will not be able to continue to work this test version." +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:92 +msgid "This is where email messages and templates are saved. You can upload or download files in this directory if you wish to save the files for later." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:77 +msgid "This is where you edit the text of the problem template. Type Ctrl-Enter while this window has focus to re-render the problem." msgstr "" #: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:669 +msgid "This is your last submission. If you say yes, then your answers will be final, and you will not be able to continue to work this test version." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:673 msgid "This is your only submission. If you say yes, then your answers will be final, and you will not be able to continue to work this test version." msgstr "" -#: /opt/webwork/pg/macros/core/PGbasicmacros.pl:3148 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:42 +msgid "This link gives details for many macros. It links to documentation embedded in the macro files themselves." +msgstr "" + +#. ('PGMLLab/PGML-lab.pg') +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:63 +msgid "This links to a WeBWorK \"problem\" which allows you to try out fragments of PGML code. This link will not be available if the file %1 is not located in the templates directory of the course." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:33 +msgid "This links to a list of problem authoring techniques." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:39 +msgid "This links to a page describing Math Object usage." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:72 +msgid "This links to problem authoring information on the WeBWorK wiki." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/Options.html.ep:46 +msgid "This may be Mathjax, images, or plainText. Only the options that are enabled for the course will be available to select. This option is only visible if there is more than one display mode enabled for the course." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorSetMaker.html.ep:42 +msgid "This option shows all pg problems in the course directory structure." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorSetMaker.html.ep:47 +msgid "This option shows all problems in set definition files that are located in the course directory." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorSetMaker.html.ep:44 +msgid "This option shows all problems in sets that have been created in the course." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:20 +msgid "This page allows one to edit the contents of PG problem files as well as set headers and other files." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/Options.html.ep:20 +msgid "This page allows users to change their password, email address, and display settings used in problems. Note that you can hide this page entirely for students by setting permission levels to login_proctor or higher for the permissions to change password, change e-mail address, and change display settings used in pg problems." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorConfig.html.ep:20 +msgid "This page allows you to configure course settings such as permission levels, display modes allowed, default display mode, email feedback behavior, and much more." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/Achievements.html.ep:20 +msgid "This page displays a student's current achievement level and progress toward the next level, and lists the rewards and badges that the student has earned. If rewards have been earned, then the student may also redeem those rewards." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:26 +msgid "This page gives access to information about the student, independent of the homework sets assigned to them." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorLTIUpdate.html.ep:20 +msgid "This page gives information about mass LTI grade updates, and allows you to trigger a grade update for all users and all sets, all sets for one user, all users for one set, or one user for one set. When a user is selected, the sets drop down menu is updated to only allow selecting sets assigned the selected user. Similarly when a set is selected, the user menu is updated to only allow selecting valid users." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorIndex.html.ep:20 +msgid "This page is a collection of tools to modify users and sets. These tools are short cuts for common actions that allow selecting multiple users or sets to act on at once. Because multiple users and sets can be acted on at the same time, it is often more efficient to use this page when modifying multiple items. For example, after selecting several users and a set you can change the close date for all selected users for that set. This page also gives access to \"View/Edit all sets for one user\", which can be used to access settings for all sets including test versions for that user." +msgstr "" + +#. (q(table to save any changes. Each student's name links to that student's problem and opens up the) +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemGrader.html.ep:20 +msgid "This page is for manually grading a problem for all assigned students. The table of students shows their last answers, percent score, and feedback comment. The \"Save\" button is located below the " +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorSetMaker.html.ep:20 +msgid "This page is used to browse problems that will be used to fill problem sets. The first step is to choose which set you are working on. If you need to create a new problem set fill in the blank next to the \"Create a New Set in This Course\" button and then press the button. Then choose which set you want to work on in the drop down menu." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorStudentProgress.html.ep:20 +msgid "This page is useful for monitoring student progress on assignments. Student progress can either be viewed for a single set or for a single student." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetList.html.ep:20 +msgid "This page manages all of the homework sets (including quizzes/tests). The following allow editing directly of a single problem set." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/Grades.html.ep:20 +msgid "This page shows the student's current grades for all sets they are assigned to. Only visible sets are shown to the student, while invisible set names are italic when viewed as an instructor. Students can only see the per problem grades on open assignments." +msgstr "" + +#: /opt/webwork/pg/macros/core/PGbasicmacros.pl:3169 msgid "This problem contains a video which must be viewed online." msgstr "" @@ -6232,7 +7586,7 @@ msgstr "" msgid "This problem has more than one part." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1328 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1581 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1323 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1576 msgid "This problem has open subproblems. You can visit them by using the links to the left or visiting the set page." msgstr "" @@ -6255,7 +7609,7 @@ msgid "This sample mail would be sent to %1" msgstr "" #. (join('.', @seq) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1404 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1399 msgid "This score for this problem does not count for the score of problem %1 or for the set." msgstr "" @@ -6274,7 +7628,7 @@ msgid "This set doesn't contain any problems yet." msgstr "" #. ($c->formatDateTime($reduced_scoring_date) -#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet.html.ep:49 +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/set_status.html.ep:44 msgid "This set had a reduced scoring period that started on %1 and ended on %2. During that period all work counted for %3% of its value." msgstr "" @@ -6287,11 +7641,11 @@ msgid "This set is hidden from students." msgstr "" #. ($reducedScoringPerCent) -#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet.html.ep:43 +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/set_status.html.ep:40 msgid "This set is in its reduced scoring period. All work counts for %1% of its value." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:37 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:51 msgid "This set is not assigned to any students." msgstr "" @@ -6299,7 +7653,7 @@ msgstr "" msgid "This set is visible to students." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:28 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:42 msgid "This set or problem is not valid." msgstr "" @@ -6307,6 +7661,10 @@ msgstr "" msgid "This set will be unavailable to students until they have earned a certain score on the sets specified in this field. The sets should be written as a comma separated list. The minimum score required on the sets is specified in the following field." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:111 +msgid "This should be done cautiously. Once a student is deleted from a course their data is lost forever and cannot be recovered. They can be added to the course as a new student, but all of their homework set assignments and homework has been permanently deleted." +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:1962 msgid "This source file does not exist!" msgstr "" @@ -6331,10 +7689,6 @@ msgstr "" msgid "This specifies the rerandomization period: the number of attempts before a new version of the problem is generated by changing the Seed value. The value of -1 uses the default from course configuration. The value of 0 disables rerandomization." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:148 -msgid "This test is closed." -msgstr "" - #: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:81 msgid "This test requires a proctor password to continue." msgstr "" @@ -6343,6 +7697,10 @@ msgstr "" msgid "This test requires a proctor password to start." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/Hardcopy.html.ep:45 +msgid "This will determine if the output is in one or two columns." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Base/error_output.html.ep:21 /opt/webwork/webwork2/templates/ContentGenerator/Base/warning_output.html.ep:21 msgid "Time" msgstr "" @@ -6351,7 +7709,7 @@ msgstr "" msgid "Time Interval for New Test Versions (min; 0=infty)" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:165 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:159 msgid "Time Remaining" msgstr "" @@ -6364,21 +7722,21 @@ msgstr "" msgid "Timestamp" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1508 +#: /opt/webwork/webwork2/conf/defaults.config:1512 msgid "Timezone for the course" msgstr "" #. (sprintf('%.0f', $restriction) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:326 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:330 msgid "To access this set you must score at least %1% on set %2." msgstr "" #. (sprintf('%.0f', $restriction) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:332 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:336 msgid "To access this set you must score at least %1% on the following sets: %2." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:59 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:53 msgid "To add an additional instructor to the new course, specify user information below. The user ID may contain only numbers, letters, hyphens, periods (dots), commas,and underscores." msgstr "" @@ -6386,35 +7744,55 @@ msgstr "" msgid "To add the WeBWorK administrators to the new course (as administrators) check the box below." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:118 +msgid "To assign one or more sets to an individual student click in the column \"Assigned Sets\" in the student's row. This will take you to a page where you can assign and unassign homework sets and change the due dates for homework on an individual basis." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserDetail.html.ep:79 msgid "To change status (scores or grades) for this student for one set, click on the individual set link." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:112 -msgid "To copy problem templates from an existing course, select the course below." +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:106 +msgid "To copy the templates and html folders from an existing course, select the course below." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:102 +msgid "To drop a student or students, select them for editing as described above and then set the pop-up list to enrolled,drop, or audit. Dropped students cannot log in to the course, are not assigned new homework sets and are not sent e-mail. They can be re-enrolled simply by changing their status back to enrolled. No data is lost, any homework sets assigned before they were dropped are restored unchanged." msgstr "" #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:143 msgid "To edit a specific student version of this set, edit (all of) her/his assigned sets." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:29 +msgid "To perform an action select the desired action tab and click the submit button." +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/DuplicateProb.pm:90 msgid "To this Problem" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:767 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/import_form.html.ep:48 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/set_list_field.html.ep:14 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserDetail/set_date_table.html.ep:50 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorScoring.html.ep:69 +msgid "To use the Email merge feature, upload a CSV with calculated grades to the scoring directory using the \"File Manager\"." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:767 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/import_form.html.ep:48 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/set_list_field.html.ep:14 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserDetail/set_date_table.html.ep:58 msgid "Today" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/Hardcopy.html.ep:33 +msgid "Toggle each of the options to include or not include in the output." +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Stats.pm:522 msgid "Top Score" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:110 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:118 msgid "Top level of author information on the wiki." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:115 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep:114 msgid "Total Points" msgstr "" @@ -6438,7 +7816,7 @@ msgstr "" msgid "Transfer" msgstr "" -#: /opt/webwork/pg/macros/parsers/parserPopUp.pl:285 /opt/webwork/webwork2/lib/WeBWorK/ConfigObject/boolean.pm:22 /opt/webwork/webwork2/lib/WeBWorK/ConfigObject/boolean.pm:35 +#: /opt/webwork/pg/macros/parsers/parserPopUp.pl:284 /opt/webwork/webwork2/lib/WeBWorK/ConfigObject/boolean.pm:22 /opt/webwork/webwork2/lib/WeBWorK/ConfigObject/boolean.pm:35 msgid "True" msgstr "" @@ -6458,6 +7836,10 @@ msgstr "" msgid "Type" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:84 +msgid "Type:" +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Base/error_output.html.ep:29 /opt/webwork/webwork2/templates/ContentGenerator/Base/warning_output.html.ep:23 msgid "URI" msgstr "" @@ -6468,36 +7850,36 @@ msgid "Unable to change the evaluator for set %1. Unknown error." msgstr "" #. ($c->{setID}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1108 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1084 msgid "Unable to change the hardcopy header for set %1. Unknown error." msgstr "" #. ($c->{setID}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1094 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1070 msgid "Unable to change the set header for set %1. Unknown error." msgstr "" #. ($c->{fullSetID}, $c->{prettyProblemNumber}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1134 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1110 msgid "Unable to change the source file path for set %1, problem %2. Unknown error." msgstr "" #. ($c->shortPath($delFilePath) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1270 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1246 msgid "Unable to delete backup file \"%1\"." msgstr "" #. ($formatBackupTime) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:597 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:571 msgid "Unable to delete backup from %1." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:914 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:888 msgid "Unable to make \"%1\" the hardcopy header for %2." msgstr "" #. ($c->shortPath($sourceFilePath) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:886 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:860 msgid "Unable to make \"%1\" the set header for %2." msgstr "" @@ -6505,17 +7887,17 @@ msgstr "" msgid "Unable to obtain error messages from within the PG question." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:277 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:275 msgid "Unable to open a temporary file at the given location." msgstr "" #. ($c->shortPath($backupFilePath) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1257 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1233 msgid "Unable to read backup file \"%1\"." msgstr "" #. ($c->shortPath($outputFilePath) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm:193 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:662 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm:193 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:636 msgid "Unable to write to \"%1\": %2" msgstr "" @@ -6528,11 +7910,19 @@ msgstr "" msgid "Unarchive %1 to course:" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin.html.ep:30 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/unarchive_course_confirm.html.ep:1 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/unarchive_course_form.html.ep:3 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/unarchive_course_form.html.ep:53 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/unarchive_course_confirm.html.ep:1 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/unarchive_course_form.html.ep:3 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/unarchive_course_form.html.ep:46 /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:40 msgid "Unarchive Course" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1314 +#: /opt/webwork/webwork2/templates/HelpFiles/AdminUnarchiveCourse.html.ep:17 +msgid "Unarchive Course Help" +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/admin_links.html.ep:25 +msgid "Unarchive Courses" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1306 msgid "Unarchive Next Course" msgstr "" @@ -6566,19 +7956,19 @@ msgid "Unhide Courses" msgstr "" #. ($saveMode) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1175 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1151 msgid "Unkown saveMode: %1." msgstr "" #: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/AddNewTestGW.pm:28 -msgid "Unlock an additional version of a Gateway Test. If used before the close date of the Gateway Test this will allow you to generate a new version of the test." +msgid "Unlock an additional version of a test. If used before the close date of the test this will allow you to generate a new version of the test." msgstr "" #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager.html.ep:45 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:47 msgid "Unpack Archive" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:110 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:113 msgid "Unpack archives automatically" msgstr "" @@ -6586,7 +7976,7 @@ msgstr "" msgid "Unselect all courses" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:61 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:63 msgid "Update Display" msgstr "" @@ -6616,10 +8006,6 @@ msgstr "" msgid "Update set:" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:73 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:95 -msgid "Update settings and refresh page" -msgstr "" - #: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/upgrade_course_form.html.ep:8 msgid "Update the checked directories?" msgstr "" @@ -6628,16 +8014,16 @@ msgstr "" msgid "Update user:" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1916 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1908 msgid "Updated location description." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/upgrade_course_confirm.html.ep:46 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/upgrade_course_form.html.ep:40 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/upgrade_course_confirm.html.ep:47 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/upgrade_course_form.html.ep:40 msgid "Upgrade" msgstr "" #. ($upgrade_courseID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1381 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1373 msgid "Upgrade %1" msgstr "" @@ -6645,18 +8031,30 @@ msgstr "" msgid "Upgrade Course Tables" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin.html.ep:31 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/upgrade_course_form.html.ep:59 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/upgrade_course_form.html.ep:7 +#: /opt/webwork/webwork2/templates/ContentGenerator/Base/admin_links.html.ep:26 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/upgrade_course_confirm.html.ep:1 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/upgrade_course_form.html.ep:59 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/upgrade_course_form.html.ep:7 /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:42 msgid "Upgrade Courses" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1590 +#: /opt/webwork/webwork2/templates/HelpFiles/AdminUpgradeCourses.html.ep:17 +msgid "Upgrade Courses Help" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:43 +msgid "Upgrade courses from a previous version of WeBWorK." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1582 msgid "Upgrade process completed" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager.html.ep:37 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:62 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager.html.ep:37 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:65 msgid "Upload" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:72 +msgid "Upload, download and delete text files, including scoring spread sheets, set definition files, class list spread sheets, and \"PG\" problems." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:292 msgid "Use Default Header File" msgstr "" @@ -6669,7 +8067,7 @@ msgstr "" msgid "Use Reward" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/preview.html.ep:17 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/preview.html.ep:27 msgid "Use browser back button to return from preview mode." msgstr "" @@ -6686,22 +8084,54 @@ msgstr "" msgid "Use live equation rendering?" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1925 +#: /opt/webwork/webwork2/conf/defaults.config:1929 msgid "Use log base 10 instead of base e" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1931 +#: /opt/webwork/webwork2/conf/defaults.config:1935 msgid "Use older answer checkers" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:123 +msgid "Use the \"Create\" and \"Delete\" actions to create or delete achievements. Note that deleting an achievement will delete all data associated to the achievement and cannot be undone." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorSendMail.html.ep:35 +msgid "Use the \"Merge file\" drop down menu to select which merge file to use, or select \"None\" to not use any merge file. When a merge file is selected, the data for active students will be displayed above the \"Email Body\". This will show you the structure of the merge file and the column variables associated with each column. Data that is longer than 7 characters will be truncated, and the data can be scrolled up and down to see all rows." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorIndex.html.ep:28 +msgid "Use the \"Users\" and \"Sets\" forms to select which users and sets to act on. Multiple items can be selected using ctrl-click or shift-click. The action buttons are grouped into three categories. The first is a set of actions that act on the selected users, the second is a set of actions that act on the selected sets, and the third is a set of actions for acting on a combination of sets and users. If an invalid number of users or sets are selected, the action will not be preformed, and an error message will be placed on the page." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementEditor.html.ep:25 +msgid "Use the editor to edit the evaluator and the action form at the bottom to save the evaluator. You can either overwrite the current evaluator file or save as a new evaluator file." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:15 msgid "Use the interface below to quickly access commonly-used instructor tools, or select a tool from the list to the left." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorSetMaker.html.ep:26 +msgid "Use the options in the second box to pick a collection of problems decribed below. In each case, clicking \"View Problems\" will render a fixed number of problems (default of 20). After problems are shown, there will be options to show the next/previous batch of problems, add all problems to the target set (set at the top of the page) or clear the curent batch of problems." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Feedback.html.ep:27 msgid "Use this form to ask your instructor a question, to report a problem with the WeBWorK system, or to report an error in a problem you are attempting. Along with your message, additional information about the state of the system will be included." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:29 +msgid "Use this page to change your password." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorSendMail.html.ep:20 +msgid "Use this page to send emails to active (enrolled or auditing) students. Emails can be sent to all active students or selected students. Use the \"Students\" form to sort, filter, or format how the user name is displayed. Click \"Change Display Settings\" to apply any changes. Use control-click or shift-click to select multiple students to email." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:67 +msgid "Used for \"counting\" achievements, which sets the value a counter must reach in order to earn the achievement. For example this is used counting the number of completed problems." +msgstr "" + #. (param('user') #. (param('effectiveUser') #: /opt/webwork/webwork2/templates/ContentGenerator/Options.html.ep:2 /opt/webwork/webwork2/templates/ContentGenerator/Options.html.ep:7 @@ -6709,7 +8139,7 @@ msgid "User \"%1\" not found." msgstr "" #. ($userID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:330 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:324 msgid "User \"%1\" will not be copied from admin course as it is the initial instructor." msgstr "" @@ -6718,16 +8148,20 @@ msgstr "" msgid "User %1 not found." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ShowAnswers.pm:217 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:70 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ShowAnswers.pm:217 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/add_course_form.html.ep:64 msgid "User ID" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:178 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:230 /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:28 msgid "User Settings" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:576 -msgid "User Value" +#: /opt/webwork/webwork2/templates/HelpFiles/Options.html.ep:17 +msgid "User Settings Help" +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:576 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserDetail/set_date_table.html.ep:13 +msgid "User overrides" msgstr "" #: /opt/webwork/webwork2/templates/ContentGenerator/LoginProctor.html.ep:62 @@ -6743,44 +8177,48 @@ msgstr "" msgid "UserProblem missing for user=%1 set=%2 problem=%3. This may indicate database corruption." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Login.html.ep:49 +#: /opt/webwork/webwork2/templates/ContentGenerator/Login.html.ep:51 msgid "Username" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Hardcopy/form.html.ep:18 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Assigner.html.ep:23 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:27 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ShowAnswers/instructor-selectors.html.ep:20 +#: /opt/webwork/webwork2/templates/ContentGenerator/Hardcopy/form.html.ep:18 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Assigner.html.ep:23 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:27 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ShowAnswers/instructor-selectors.html.ep:9 msgid "Users" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:287 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/Routes.pm:339 msgid "Users Assigned to Set %2" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUsersAssignedToSet.html.ep:17 +msgid "Users Assigned to Set Help" +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList/user_list.html.ep:65 msgid "Users List" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1823 +#: /opt/webwork/webwork2/conf/defaults.config:1827 msgid "Users at this level and higher are allowed to change display settings used in pg problems.Note that if it is expected that there will be students that have vision impairments and MathQuill is enabled to assist with answer entry, then you should not set this permission to a level above student as those students may need to disable MathQuill." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1813 +#: /opt/webwork/webwork2/conf/defaults.config:1817 msgid "Users at this level and higher are allowed to change their e-mail address. Normally guest users are not allowed to change the e-mail address since it does not make sense to send e-mail to anonymous accounts." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1777 +#: /opt/webwork/webwork2/conf/defaults.config:1781 msgid "Users at this level and higher are allowed to change their password. Normally guest users are not allowed to change their password." msgstr "" #. ($c->maketext(FIELD_PROPERTIES() -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:318 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:316 msgid "Users sorted by %1, then by %2, then by %3" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1804 +#: /opt/webwork/webwork2/conf/defaults.config:1808 msgid "Users with at least this permission level get a link in the left panel for reporting bugs to the bug tracking system at bugs.webwork.maa.org." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:2057 +#: /opt/webwork/webwork2/conf/defaults.config:2051 msgid "Users with this permssion level or greater will automatically be sent feedback from students (generated when they use the \"Contact instructor\" button on any problem page). In addition the feedback message will be sent to addresses listed below. To send ONLY to addresses listed below set permission level to \"nobody\"." msgstr "" @@ -6788,11 +8226,6 @@ msgstr "" msgid "Uses Math Objects" msgstr "" -#. ($default_msg_file) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:172 -msgid "Using contents of the default message %1 instead." -msgstr "" - #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor/view_form.html.ep:18 msgid "Using what display mode?" msgstr "" @@ -6809,28 +8242,32 @@ msgstr "" msgid "Using which hardcopy theme?" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:130 +#: /opt/webwork/webwork2/templates/HelpFiles/Levels.html.ep:31 +msgid "Usually means students must demonstrate understanding of facts. This is more than regurgitating the fact. We use this category for simple and direct applications of algorithms the student has studied. There should be no judgement involved in choosing the method. This would include a simple application of a rule for differentiation (e.g., can combine rules for sums and constant multiples with one more advanced rule) or for integrals." +msgstr "" + +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:103 msgid "Value" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1645 +#: /opt/webwork/webwork2/conf/defaults.config:1649 msgid "Value of work done in Reduced Scoring Period" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Config.html.ep:20 -msgid "Variable Documentation:" +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Config/config_help.html.ep:20 +msgid "Variable Documentation" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:101 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:115 msgid "Version" msgstr "" #. ($ver->{version}) -#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:175 +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:173 msgid "Version %1" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:161 +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/version_list.html.ep:159 msgid "Versions" msgstr "" @@ -6846,6 +8283,10 @@ msgstr "" msgid "View Problems" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:57 +msgid "View details of student perofrmance either by individual or by set." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Options.html.ep:86 msgid "View equations as" msgstr "" @@ -6858,6 +8299,10 @@ msgstr "" msgid "View statistics by student" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:55 +msgid "View statistics of students' performance on homework either by individual or by set." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress.html.ep:14 msgid "View student progress by set" msgstr "" @@ -6870,14 +8315,22 @@ msgstr "" msgid "View/Edit" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:120 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:120 /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:104 msgid "View/Reload" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/admin_links.html.ep:31 +msgid "View/access current and archived courses." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:146 +msgid "Viewing Problems in a New Window" +msgstr "" + #. ($c->{problem}->source_file) #. ($screenSetHeader) #. ($course_info_path) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1616 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:81 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:109 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1611 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm:81 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:109 msgid "Viewing temporary file: %1" msgstr "" @@ -6889,7 +8342,7 @@ msgstr "" msgid "Visible" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:613 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:622 msgid "Visible sets were selected for export." msgstr "" @@ -6905,7 +8358,7 @@ msgstr "" msgid "Warning messages" msgstr "" -#: /opt/webwork/webwork2/lib/HardcopyRenderedProblem.pm:256 +#: /opt/webwork/webwork2/lib/HardcopyRenderedProblem.pm:259 msgid "Warning messages:" msgstr "" @@ -6918,11 +8371,15 @@ msgid "Warning: Deletion destroys all user-related data and is not undoable!" msgstr "" #. ($problem_desc, $c->tag('br') -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1151 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1194 msgid "Warnings encountered while processing %1. Error text: %2" msgstr "" -#. ($ce->{WW_COPYRIGHT_YEARS} || '1996-2022', $ce->{defaultTheme} || 'unknown -- set defaultTheme in localOverides.conf', $ce->{WW_VERSION} || 'unknown -- set WW_VERSION in VERSION', $ce->{PG_VERSION} || 'unknown -- set PG_VERSION in ../pg/VERSION') +#: /opt/webwork/webwork2/templates/HelpFiles/Levels.html.ep:39 +msgid "We use this for carrying out more complicated algorithms, such as derivatives using both the product and chain rule or integrals which involve say both a substitution and parts." +msgstr "" + +#. ($ce->{WW_COPYRIGHT_YEARS} || '1996-2023', $ce->{defaultTheme} || 'unknown -- set defaultTheme in localOverides.conf', $ce->{WW_VERSION} || 'unknown -- set WW_VERSION in VERSION', $ce->{PG_VERSION} || 'unknown -- set PG_VERSION in ../pg/VERSION') #: /opt/webwork/webwork2/templates/ContentGenerator/Base/footer.html.ep:9 msgid "WeBWorK © %1 | theme: %2 | ww_version: %3 | pg_version %4" msgstr "" @@ -6935,10 +8392,18 @@ msgstr "" msgid "WeBWorK Warnings" msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1447 +#: /opt/webwork/webwork2/conf/defaults.config:1451 msgid "WeBWorK currently has translations for the languages listed in the course configuration." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorScoring.html.ep:20 +msgid "WeBWorK does not have a full featured scoring ability. We leave that to your favorite spreadsheet application." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:38 +msgid "WeBWorK expects many files to be in certain locations. The following describe this. Note that by default the File Manager shows the \"templates\" directory. Other directories mentioned below are at the same level and need to be accessed by going up a directory by clicking the \"^\" button above the file list." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Base/error_output.html.ep:6 msgid "WeBWorK has encountered a software error while attempting to process this problem. It is likely that there is an error in the problem itself. If you are a student, report this error message to your professor to have it corrected. If you are a professor, please consult the error output below for more information." msgstr "" @@ -6967,6 +8432,10 @@ msgstr "" msgid "Welcome to WeBWorK!" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorScoring.html.ep:24 +msgid "What WeBWorK does have is good support for summarizing the scores on WeBWorK homework sets and tests and exporting them in a form (.csv) which any spreadsheet can use. WeBWorK reports all of the homework grades with options shown below." +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/AchievementItems/Surprise.pm:27 msgid "What could be inside?" msgstr "" @@ -6979,19 +8448,27 @@ msgstr "" msgid "When a student has more attempts than is specified here they will be able to view another version of this problem. If set to -1 the feature is disabled and if set to -2 the course default is used." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1797 +#: /opt/webwork/webwork2/conf/defaults.config:1801 msgid "When acting as a student, this permission level and higher can submit answers for that student." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1968 +#: /opt/webwork/webwork2/conf/defaults.config:1972 msgid "When numerical answers are checked, most test if the student's answer is close enough to the programmed answer be computing the error as a percentage of the correct answer. This value controls the default for how close the student answer has to be in order to be marked correct.

    A value such as 0.1 means 0.1 percent error is allowed.

    " msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:2015 +#: /opt/webwork/webwork2/conf/defaults.config:2019 msgid "When students click the Email Instructor button to send feedback, WeBWorK fills in the subject line. Here you can set the subject line. In it, you can have various bits of information filled in with the following escape sequences.

    • %c = course ID
    • %u = user ID
    • %s = set ID
    • %p = problem ID
    • %x = section
    • %r = recitation
    • %% = literal percent sign
    " msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1536 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:35 +msgid "When the class is very large not all students will be displayed. Using the first action on this page you can show only the students from a given recitation or from a given section, or only students whose login or last name fits a pattern match. The second action will sort the students currently being displayed. You can also sort the displayed students by clicking on the active links at the top of each column." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorSendMail.html.ep:56 +msgid "When the message is ready to send, click \"Send Email\". This will queue the email to be sent, which can take several minutes depending on the number of students selected. You will be notified by email once all the emails have been sent." +msgstr "" + +#: /opt/webwork/webwork2/conf/defaults.config:1540 msgid "When this is on students will see a line on the Grades page which has their total cumulative homework score. This score includes all sets assigned to the student." msgstr "" @@ -6999,10 +8476,22 @@ msgstr "" msgid "When this is true, then when a user enters WeBWorK from an external tool link in the LMS, the bottom of the screen will display the data that the LMS passed to WeBWorK. This may be useful to debug LTI, especially because different LMS systems have different parameters." msgstr "" -#: /opt/webwork/webwork2/conf/defaults.config:1855 +#: /opt/webwork/webwork2/conf/defaults.config:1859 msgid "When viewing a problem, WeBWorK usually puts the previously submitted answer in the answer blank. Below this level, old answers are never shown. Typically, that is the desired behaviour for guest accounts." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorStudentProgress.html.ep:30 +msgid "When viewing progress for a single student, their grades page is shown which lists set totals and per problem grades for each set assigned to the student. This shows the same information as the statistics page for the student." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorStats.html.ep:26 +msgid "When viewing set statistics, the drop down menus can be used to show stats for individual sections, recitations, or problems. The overall results include all students who are assigned to the set, while the individual problem results only include active (have attempted the problem) students." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorStudentProgress.html.ep:24 +msgid "When viewing student progress for a set, the score for the set and the status for problems in the set are listed for all students. The table can be sorted by clicking the links in the table header. Click the student's name to access the student's set. When viewing progress for a test, additional columns can be shown/hidden by updating the display at the top" +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Assigner.html.ep:74 msgid "When you unassign a set from students, you destroy all of the data for the set for those students. If the set is re-assigned to these students, then they will receive new versions of problems in the set. Make sure this is what you want to do before unassigning sets from students." msgstr "" @@ -7026,22 +8515,29 @@ msgid "Wiki summary page for MathObjects" msgstr "" #. ($c->formatDateTime($set->open_date, undef, $ce->{studentDateDisplayFormat}) -#. ($c->formatDateTime($set->open_date, undef, $ce->{studentDateDsiplayFormat}) #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Grades.pm:266 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Grades.pm:444 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:167 msgid "Will open on %1." msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/Levels.html.ep:49 +msgid "Word problems" +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/problem_list.html.ep:15 msgid "Worth" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/instructor_links.html.ep:51 +msgid "Write a new PG problem file or edit an existing one." +msgstr "" + #. ($c->shortPath($outputFilePath) #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm:188 msgid "Write permissions have not been enabled for \"%1\". Changes must be saved to another file for viewing." msgstr "" #. ($c->shortPath($outputFilePath) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:656 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:630 msgid "Write permissions have not been enabled for \"%1\". Changes must be saved to another file for viewing." msgstr "" @@ -7051,7 +8547,7 @@ msgid "Write permissions have not been enabled in \"%1\". Changes must be saved msgstr "" #. ($c->shortPath($currentDirectory) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:650 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:624 msgid "Write permissions have not been enabled in \"%1\".Changes must be saved to a different directory for viewing." msgstr "" @@ -7059,11 +8555,11 @@ msgstr "" msgid "Write permissions have not been enabled in the templates directory. No changes can be made." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:646 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:620 msgid "Write permissions have not been enabled in the templates directory. No changes can be made." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:138 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:148 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:238 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:271 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:287 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:301 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:330 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:345 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:454 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:482 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:509 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:82 /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:653 /opt/webwork/webwork2/templates/ContentGenerator/Hardcopy/form.html.ep:137 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/default_table.html.ep:47 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/set_list_field.html.ep:39 /opt/webwork/webwork2/templates/ContentGenerator/Options.html.ep:111 /opt/webwork/webwork2/templates/ContentGenerator/Options.html.ep:133 /opt/webwork/webwork2/templates/ContentGenerator/Options.html.ep:155 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/problem_list_row.html.ep:67 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:138 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:148 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:238 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:271 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:287 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:301 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:330 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:345 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:454 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:482 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:509 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:82 /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:657 /opt/webwork/webwork2/templates/ContentGenerator/Hardcopy/form.html.ep:137 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AchievementList/default_table.html.ep:47 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList/set_list_field.html.ep:39 /opt/webwork/webwork2/templates/ContentGenerator/Options.html.ep:111 /opt/webwork/webwork2/templates/ContentGenerator/Options.html.ep:133 /opt/webwork/webwork2/templates/ContentGenerator/Options.html.ep:155 /opt/webwork/webwork2/templates/ContentGenerator/ProblemSet/problem_list_row.html.ep:67 msgid "Yes" msgstr "" @@ -7089,7 +8585,7 @@ msgid "You are not allowed to assign homework sets." msgstr "" #. ($userID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:385 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:383 msgid "You are not allowed to delete %1." msgstr "" @@ -7110,11 +8606,11 @@ msgstr "" msgid "You are not allowed to send e-mail." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail.html.ep:2 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats.html.ep:4 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress.html.ep:2 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail.html.ep:8 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Stats.html.ep:4 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress.html.ep:2 msgid "You are not authorized to access instructor tools" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers.html.ep:5 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Assigner.html.ep:4 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:9 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:13 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:17 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:30 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList.html.ep:28 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Scoring.html.ep:5 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker.html.ep:15 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList.html.ep:11 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UsersAssignedToSet.html.ep:4 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/AddUsers.html.ep:5 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Assigner.html.ep:4 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Index.html.ep:9 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep:13 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:31 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetDetail.html.ep:30 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemSetList.html.ep:28 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/Scoring.html.ep:5 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SetMaker.html.ep:15 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UserList.html.ep:11 /opt/webwork/webwork2/templates/ContentGenerator/Instructor/UsersAssignedToSet.html.ep:4 msgid "You are not authorized to access instructor tools." msgstr "" @@ -7134,6 +8630,10 @@ msgstr "" msgid "You are not authorized to edit user specific information." msgstr "" +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/ProblemGrader.html.ep:37 +msgid "You are not authorized to grade homework sets." +msgstr "" + #: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager.html.ep:8 msgid "You are not authorized to manage course files" msgstr "" @@ -7170,7 +8670,7 @@ msgstr "" msgid "You are not authorized to score sets." msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail.html.ep:7 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail.html.ep:13 msgid "You are not authorized to send mail to students" msgstr "" @@ -7203,15 +8703,47 @@ msgstr "" msgid "You can also examine the following temporary files: " msgstr "" -#: /opt/webwork/pg/macros/core/PGanswermacros.pl:1612 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:108 +msgid "You can assign selected achievements to all users by using the \"Assign\" action action and selecting which achievements to assign. You can select which users to assign/unassign to an achievement by clicking on the link in the \"Edit Users\" column." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:1039 +msgid "You can change the file path for this problem manually from the \"Hmwk Sets Editor\" page" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/ProblemSets.html.ep:27 +msgid "You can check the boxes to the right of the sets and click \"Generate Hardcopy for Selected Sets\" to generate a PDF hardcopy of the selected sets. You can generate hardcopies for multiple users including their answers as well. Note that students will only be able to generate hardcopies of a single set at a time. Students will only be able to include answers in the hardcopy after the answer date." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:127 +msgid "You can delete problems by clicking the \"Delete it?\" check box and saving. If the set is already active it is recommended that you instead use the \"Mark Correct?\" problem to mark a particular problem correct for all students." +msgstr "" + +#: /opt/webwork/pg/macros/core/PGanswermacros.pl:1616 msgid "You can earn partial credit on this problem." msgstr "" -#: /opt/webwork/pg/macros/core/problemRandomize.pl:397 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:142 +msgid "You can edit a problem by clicking the \"Edit Problem\" icon to the right of the problem number. This will open the problem in the PG problem editor in a new tab or window." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:92 +msgid "You can edit a single achievement by clicking on the pencil icon next to the achievement ID. You can edit multiple achievements by selecting which achievements to edit, then click the \"Edit\" button. You can edit all of the achievements by changing which achievements to edit form \"selected achievements\" to \"all achievements\", or click the checkbox next to the Achievement ID to select all achievements." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:44 +msgid "You can edit the class list data for a single student by clicking on the pencil icon next to their login name. To edit several students at once click on the \"Select\" checkbox next to their names, click on the radio button for editing selected users and then click the \"Edit\" button. You can also edit all visible users (those students currently being displayed) or even all users in the course although this last option might take a long time to load for a large class." +msgstr "" + +#: /opt/webwork/pg/macros/deprecated/problemRandomize.pl:397 msgid "You can get a new version of this problem after the due date." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:768 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorAchievementList.html.ep:101 +msgid "You can import/export from their respective action tab. Exporting saves information about the achievement as a .axp file which is a CSV that lists each achievements information. You can import .axp files that have been previously exported." +msgstr "" + +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:769 msgid "You can not specify an absolute path" msgstr "" @@ -7232,6 +8764,14 @@ msgstr "" msgid "You can only unpack files ending in \".tgz\", \".tar\" or \".tar.gz\"" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:134 +msgid "You can render a problem by clicking the \"Render Problem\" icon to the right of the problem number. The display mode used to render the problem is chosen using the drop down menu. You can render all problems using the \"Render All\" button. \"Hide All\" will hide all rendered problems. It is also useful to collapse problem details when doing this, as it makes it easier to drag problems around." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorProblemSetDetail.html.ep:120 +msgid "You can reorder problems by clicking on the arrow icon and dragging the problem. You will see a box showing you where the problem will be placed. When problems are reordered any holes in the numbering will be filled in." +msgstr "" + #. ($showMeAnother{MaxReps} >= $showMeAnother{Count} ? ($showMeAnother{MaxReps} - $showMeAnother{Count}) #: /opt/webwork/webwork2/templates/ContentGenerator/Problem/submit_buttons.html.ep:44 msgid "You can use this feature %quant(%1,more time,more times,as many times as you want) on this problem" @@ -7253,15 +8793,15 @@ msgstr "" msgid "You can't view files of that type" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:996 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:985 msgid "You cannot archive the course you are currently using." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:859 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:850 msgid "You cannot delete the course you are currently using." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:380 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:378 msgid "You cannot delete yourself!" msgstr "" @@ -7269,7 +8809,7 @@ msgstr "" msgid "You did not specify a new set name." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:234 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/SendMail.pm:232 msgid "You didn't enter any message." msgstr "" @@ -7290,7 +8830,7 @@ msgstr "" msgid "You do not have permission to generate hardcopy in %1 format." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1166 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1161 msgid "You do not have permission to view the details of this error." msgstr "" @@ -7312,17 +8852,17 @@ msgid "You have %1 attempt(s) remaining on this test." msgstr "" #. ($c->{numAttemptsLeft}, $c->{numAttemptsLeft} - 1) -#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:660 +#: /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:664 msgid "You have %1 submissions remaining for this test. If you say yes, then you will have %quant(%2,submission) remaining. Once all submissions have been used, your answers will be final and you will not be able to continue to work this test version." msgstr "" #. ($problem->max_attempts - $attempts) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1275 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1270 msgid "You have %negquant(%1,unlimited attempts,attempt,attempts) remaining." msgstr "" #. ($attempts_before_rr) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1222 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1217 msgid "You have %quant(%1,attempt,attempts) left before new version will be requested." msgstr "" @@ -7347,7 +8887,7 @@ msgid "You have %quant(%1,second) remaining to complete the currently open test. msgstr "" #. ($attempts) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1248 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1243 msgid "You have attempted this problem %quant(%1,time,times)." msgstr "" @@ -7379,10 +8919,14 @@ msgstr "" msgid "You have specified an illegal file" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:765 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:766 msgid "You have specified an illegal path" msgstr "" +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager.html.ep:13 +msgid "You have specified an illegal working directory!" +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:481 msgid "You may check your answers to this problem without affecting the maximum number of tries to your original problem." msgstr "" @@ -7412,8 +8956,16 @@ msgstr "" msgid "You may still check your answers." msgstr "" -#. ($ce->{LMS_url} ? link_to($ce->{LMS_name} => $ce->{LMS_url}) -#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSets.html.ep:7 +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorPGProblemEditor.html.ep:143 +msgid "You may want to create an unattached problem if you are using the current problem as a model for a new problem. You can add the new file to a homework set from the Library Browser or via the set detail page of the Hmwk Sets Editor." +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorUserList.html.ep:165 +msgid "You might want to do this if you want to give full credit to everyone on a particular problem that was not worded correctly, or wasn't working properly. This is done from the \"Hmwk Sets Editor\" page or the \"Instructor Tools\" page." +msgstr "" + +#. ($ce->{LTI}{ $ce->{LTIVersion} }{LMS_url} ? link_to($ce->{LTI}{ $ce->{LTIVersion} }{LMS_name} => $ce->{LTI}{ $ce->{LTIVersion} }{LMS_url}) +#: /opt/webwork/webwork2/templates/ContentGenerator/ProblemSets.html.ep:8 msgid "You must access assignments from your Course Management System (%1)." msgstr "" @@ -7431,16 +8983,16 @@ msgstr "" msgid "You must confirm the password for the initial instructor." msgstr "" -#. ($ce->{LMS_url} ? $c->link_to($ce->{LMS_name} => $ce->{LMS_url}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:192 +#. ($ce->{LTI}{ $ce->{LTIVersion} }{LMS_url} ? $c->link_to( $ce->{LTI}{ $ce->{LTIVersion} }{LMS_name} => $ce->{LTI}{ $ce->{LTIVersion} }{LMS_url}) +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm:195 msgid "You must log into this set via your Learning Management System (%1)." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:990 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:979 msgid "You must select a course to archive" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:592 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:585 msgid "You must select a course to rename." msgstr "" @@ -7457,7 +9009,7 @@ msgid "You must select one or more sets for scoring!" msgstr "" #. ($object) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:748 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:749 msgid "You must specify a %1 name" msgstr "" @@ -7465,15 +9017,15 @@ msgstr "" msgid "You must specify a course ID." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1225 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1263 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1334 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2094 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2168 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:857 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:994 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1213 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1255 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:1326 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2086 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2160 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:848 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:983 msgid "You must specify a course name." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:774 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:775 msgid "You must specify a file name" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:612 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm:586 msgid "You must specify a file name in order to save a new file." msgstr "" @@ -7485,15 +9037,15 @@ msgstr "" msgid "You must specify a last name for the initial instructor." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:613 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:606 msgid "You must specify a new institution for the course." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:595 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:588 msgid "You must specify a new name for the course." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:610 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:603 msgid "You must specify a new title for the course." msgstr "" @@ -7501,7 +9053,7 @@ msgstr "" msgid "You must specify a password for the initial instructor." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Authen.pm:453 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen.pm:440 msgid "You must specify a user ID." msgstr "" @@ -7514,7 +9066,7 @@ msgid "You must specify an file name in order to save a new file." msgstr "" #. ($LMS) -#: /opt/webwork/webwork2/lib/WeBWorK/Authz.pm:494 +#: /opt/webwork/webwork2/lib/WeBWorK/Authz.pm:505 msgid "You must use your Learning Management System (%1) to access this set. Try logging in to the Learning Management System and visiting the set from there." msgstr "" @@ -7542,48 +9094,36 @@ msgstr "" #. (wwRound(0, compute_reduced_score($ce, $problem, $set, $pg->{result}{score}, $c->submitTime) #. (% wwRound(0, $rh_result->{problem_result}{score} * 100) #. (wwRound(0, $rh_result->{problem_result}{score} * 100) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1256 /opt/webwork/webwork2/templates/RPCRenderFormats/default.html.ep:48 /opt/webwork/webwork2/templates/RPCRenderFormats/default.json.ep:29 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1251 /opt/webwork/webwork2/templates/RPCRenderFormats/default.html.ep:48 /opt/webwork/webwork2/templates/RPCRenderFormats/default.json.ep:29 msgid "You received a score of %1 for this attempt." msgstr "" #. (join('.', @{ $problemSeqs[$next_id] }) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1368 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1363 msgid "You will not be able to proceed to problem %1 until you have completed, or run out of attempts, for this problem and its graded subproblems." msgstr "" #. (join('.', @{ $problemSeqs[$next_id] }) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1380 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1375 msgid "You will not be able to proceed to problem %1 until you have completed, or run out of attempts, for this problem." msgstr "" #. ($object) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:739 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:740 msgid "Your %1 name contains illegal characters" msgstr "" #. ($object) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:742 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:743 msgid "Your %1 name may not begin with a dot" msgstr "" #. ($object) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:745 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:746 msgid "Your %1 name may not contain a path component" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIBasic.pm:533 -msgid "Your LTI OAuth verification failed. If this recurs, please speak with your instructor" -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIBasic.pm:522 /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIBasic.pm:531 -msgid "Your authentication failed. Please return to Oncourse and login again." -msgstr "" - -#: /opt/webwork/webwork2/lib/WeBWorK/Authen.pm:226 -msgid "Your authentication failed. Please try again. Please speak with your instructor if you need help." -msgstr "" - -#: /opt/webwork/pg/macros/core/PGbasicmacros.pl:3141 +#: /opt/webwork/pg/macros/core/PGbasicmacros.pl:3162 msgid "Your browser does not support the video tag." msgstr "" @@ -7595,7 +9135,7 @@ msgstr "" msgid "Your email address has been changed." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:771 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm:772 msgid "Your file name contains illegal characters" msgstr "" @@ -7608,7 +9148,7 @@ msgid "Your message was sent successfully." msgstr "" #. (wwRound(0, $problem->status * 100) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1266 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm:1261 msgid "Your overall recorded score is %1. %2" msgstr "" @@ -7649,48 +9189,48 @@ msgstr "" msgid "Your score on this (checked, not recorded) submission is %1/%2." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1000 /opt/webwork/webwork2/lib/WeBWorK/Utils/ProblemProcessing.pm:151 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1027 /opt/webwork/webwork2/lib/WeBWorK/Utils/ProblemProcessing.pm:172 msgid "Your score was not recorded because there was a failure in storing the problem record to the database." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/ProblemProcessing.pm:256 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/ProblemProcessing.pm:276 msgid "Your score was not recorded because this homework set is closed." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/ProblemProcessing.pm:263 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/ProblemProcessing.pm:283 msgid "Your score was not recorded because this problem has not been assigned to you." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1022 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1049 msgid "Your score was not recorded because this problem set version is not open." msgstr "" #. ($elapsed, # Assume the allowed time is an even number of minutes. ($set->due_date - $set->open_date) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1036 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1063 msgid "Your score was not recorded because you have exceeded the time limit for this test. (Time taken: %1 min; allowed: %2 min.)" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1025 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1052 msgid "Your score was not recorded because you have no attempts remaining on this set version." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1040 /opt/webwork/webwork2/lib/WeBWorK/Utils/ProblemProcessing.pm:258 /opt/webwork/webwork2/templates/RPCRenderFormats/default.html.ep:53 /opt/webwork/webwork2/templates/RPCRenderFormats/default.json.ep:31 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm:1067 /opt/webwork/webwork2/lib/WeBWorK/Utils/ProblemProcessing.pm:278 /opt/webwork/webwork2/templates/RPCRenderFormats/default.html.ep:53 /opt/webwork/webwork2/templates/RPCRenderFormats/default.json.ep:31 msgid "Your score was not recorded." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/ProblemProcessing.pm:241 /opt/webwork/webwork2/lib/WeBWorK/Utils/ProblemProcessing.pm:249 /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:163 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/ProblemProcessing.pm:266 /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:163 msgid "Your score was not successfully sent to the LMS." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/ProblemProcessing.pm:149 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/ProblemProcessing.pm:170 msgid "Your score was recorded." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Utils/ProblemProcessing.pm:238 /opt/webwork/webwork2/lib/WeBWorK/Utils/ProblemProcessing.pm:246 /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:162 +#: /opt/webwork/webwork2/lib/WeBWorK/Utils/ProblemProcessing.pm:269 /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:162 msgid "Your score was successfully sent to the LMS." msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/Authen.pm:553 +#: /opt/webwork/webwork2/lib/WeBWorK/Authen.pm:540 msgid "Your session has timed out due to inactivity. Please log in again." msgstr "" @@ -7721,7 +9261,7 @@ msgid "add problems" msgstr "" #. ($setName, $@) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:882 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:891 msgid "addGlobalSet %1 in ProblemSetList: %2" msgstr "" @@ -7758,7 +9298,7 @@ msgstr "" msgid "all users for one set" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:24 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/delete_course_form.html.ep:16 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/hide_inactive_course_form.html.ep:23 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:16 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/delete_course_form.html.ep:16 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/hide_inactive_course_form.html.ep:23 msgid "alphabetically" msgstr "" @@ -7785,15 +9325,15 @@ msgstr "" msgid "blank problem template(s) to end of homework set" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:25 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/delete_course_form.html.ep:17 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/hide_inactive_course_form.html.ep:24 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/archive_course_form.html.ep:17 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/delete_course_form.html.ep:17 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin/hide_inactive_course_form.html.ep:24 msgid "by last login date" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:598 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:679 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:598 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:688 msgid "changes abandoned" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:633 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:786 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:633 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:795 msgid "changes saved" msgstr "" @@ -7830,7 +9370,7 @@ msgstr "" msgid "editing all sets" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:330 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:328 msgid "editing all users" msgstr "" @@ -7846,15 +9386,15 @@ msgstr "" msgid "editing selected sets" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:336 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:334 msgid "editing selected users" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:333 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:331 msgid "editing visible users" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:96 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:90 msgid "email address" msgstr "" @@ -7871,11 +9411,11 @@ msgid "entry rows." msgstr "" #. ($restrictLoc, $setName, $@) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:895 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:904 msgid "error adding set location %1 for set %2: %3" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:542 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:634 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:542 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:643 msgid "export abandoned" msgstr "" @@ -7887,11 +9427,11 @@ msgstr "" msgid "exporting selected achievements" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:95 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:89 msgid "first name" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:107 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:72 msgid "for" msgstr "" @@ -7903,15 +9443,15 @@ msgstr "" msgid "for one user" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:351 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:349 msgid "giving new passwords to all users" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:357 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:355 msgid "giving new passwords to selected users" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:354 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:352 msgid "giving new passwords to visible users" msgstr "" @@ -7928,7 +9468,7 @@ msgstr "" msgid "guest" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2068 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:827 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:960 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2060 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:818 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:949 msgid "hidden" msgstr "" @@ -7940,6 +9480,10 @@ msgstr "" msgid "homework" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:83 +msgid "html directory" +msgstr "" + # doe snot need to be translated #. ('j', 'k', '_0') #. ('j', 'k') @@ -7951,7 +9495,7 @@ msgstr "" msgid "if" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:624 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:723 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:622 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:721 msgid "illegal character in input: '/'" msgstr "" @@ -7964,12 +9508,12 @@ msgid "index" msgstr "" #. ($restrictLoc, $setName) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:902 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:911 msgid "input set location %1 already exists for set %2." msgstr "" #. ($userID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:503 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:553 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:501 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:551 msgid "insufficient permission to edit %1" msgstr "" @@ -7977,7 +9521,7 @@ msgstr "" msgid "just-in-time" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:94 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:88 msgid "last name" msgstr "" @@ -7989,7 +9533,7 @@ msgstr "" msgid "locations selected below" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:57 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:59 msgid "login" msgstr "" @@ -7997,7 +9541,7 @@ msgstr "" msgid "login ID" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:100 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:94 msgid "login name" msgstr "" @@ -8050,7 +9594,7 @@ msgstr "" msgid "nobody" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:141 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:114 msgid "nth colum of merge file" msgstr "" @@ -8075,7 +9619,7 @@ msgstr "" msgid "only" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:15 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:17 msgid "only best scores" msgstr "" @@ -8100,15 +9644,15 @@ msgid "part" msgstr "" #. ($userID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:501 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:499 msgid "permissions for %1 not defined" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1192 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:370 /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:539 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:370 /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:539 msgid "point" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Hardcopy.pm:1192 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:370 /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:539 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm:370 /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:539 msgid "points" msgstr "" @@ -8124,7 +9668,7 @@ msgstr "" msgid "problem" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:39 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:41 msgid "problems" msgstr "" @@ -8141,25 +9685,25 @@ msgid "progress" msgstr "" #. ($line) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1086 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1400 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1095 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:1409 msgid "readSetDef error, can't read the line: ||%1||" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:99 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:93 msgid "recitation" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:51 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:53 msgid "recitation #" msgstr "" #. ($userID) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:499 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:551 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:497 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:549 msgid "record for visible user %1 not found" msgstr "" #. ($restrictLoc) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:909 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:918 msgid "restriction location %1 does not exist. IP restrictions have been ignored." msgstr "" @@ -8167,15 +9711,15 @@ msgstr "" msgid "row" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:97 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:91 msgid "score" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:98 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:92 msgid "section" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:45 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:47 msgid "section #" msgstr "" @@ -8211,7 +9755,7 @@ msgstr "" msgid "showing all sets" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:279 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:277 msgid "showing all users" msgstr "" @@ -8219,7 +9763,7 @@ msgstr "" msgid "showing matching sets" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:288 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:286 msgid "showing matching users" msgstr "" @@ -8227,7 +9771,7 @@ msgstr "" msgid "showing no sets" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:282 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:280 msgid "showing no users" msgstr "" @@ -8235,7 +9779,7 @@ msgstr "" msgid "showing selected sets" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:285 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:283 msgid "showing selected users" msgstr "" @@ -8251,7 +9795,7 @@ msgstr "" msgid "shown" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:164 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:162 msgid "still open" msgstr "" @@ -8276,41 +9820,49 @@ msgstr "" msgid "ta" msgstr "" +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:90 +msgid "templates/email directory" +msgstr "" + +#: /opt/webwork/webwork2/templates/HelpFiles/InstructorFileManager.html.ep:95 +msgid "templates/macros directory" +msgstr "" + #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm:218 /opt/webwork/webwork2/templates/ContentGenerator/GatewayQuiz.html.ep:130 msgid "test" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:21 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:23 msgid "test date" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:27 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:29 msgid "test time" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:116 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/FileManager/refresh.html.ep:119 msgid "then delete them" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:167 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/StudentProgress.pm:165 msgid "time limit exceeded" msgstr "" -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:33 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/StudentProgress/set_progress.html.ep:35 msgid "time remaining" msgstr "" # Context is Assign ____ to _____ -#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:186 +#: /opt/webwork/webwork2/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep:183 msgid "to" msgstr "" #. ($ce->{institutionName}) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator.pm:400 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator.pm:399 msgid "to %1 main web site" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator.pm:382 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator.pm:381 msgid "to courses page" msgstr "" @@ -8325,7 +9877,7 @@ msgstr "" #. ($ce->{webworkDirs}{logs}) #. ($ce->{webworkDirs}{tmp}) #. ($ce->{webworkDirs}{DATA}) -#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin.html.ep:72 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin.html.ep:75 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin.html.ep:78 +#: /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin.html.ep:41 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin.html.ep:44 /opt/webwork/webwork2/templates/ContentGenerator/CourseAdmin.html.ep:47 msgid "unable to write to directory %1" msgstr "" @@ -8337,11 +9889,6 @@ msgstr "" msgid "unlimited reusability" msgstr "" -#. ($userID) -#: /opt/webwork/webwork2/lib/WeBWorK/Authen/LTIBasic.pm:598 -msgid "userID: %1 --" -msgstr "" - #: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm:259 msgid "username, last name, first name, section, achievement level, achievement score," msgstr "" @@ -8360,7 +9907,7 @@ msgstr "" msgid "version (%1)" msgstr "" -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2070 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:829 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:962 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:2062 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:820 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/CourseAdmin.pm:951 msgid "visible" msgstr "" @@ -8373,7 +9920,7 @@ msgid "when you submit your answers" msgstr "" #. ($dir, $fileName) -#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:804 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:625 +#: /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm:813 /opt/webwork/webwork2/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm:623 msgid "won't be able to read from file %1/%2: does it exist? is it readable?" msgstr "" From 47c8ba08881fab94332863ff630a0bc441cb6a44 Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Thu, 22 Jun 2023 22:27:01 -0700 Subject: [PATCH 035/549] give message if someone tries to visit an archived (and closed) course --- lib/WeBWorK.pm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/WeBWorK.pm b/lib/WeBWorK.pm index 065fc361d8..5430478da7 100644 --- a/lib/WeBWorK.pm +++ b/lib/WeBWorK.pm @@ -201,7 +201,10 @@ async sub dispatch ($c) { if ($routeCaptures{courseID}) { debug("We got a courseID from the route, now we can do some stuff:\n"); - return (0, 'This course does not exist.') unless -e $ce->{courseDirs}{root}; + return (0, 'This course does not exist.') + unless (-e $ce->{courseDirs}{root} + || -e "$ce->{webwork_courses_dir}/admin/archives/$routeCaptures{courseID}.tar.gz"); + return (0, 'This course has been archived and closed.') unless -e $ce->{courseDirs}{root}; debug("...we can create a database object...\n"); my $db = WeBWorK::DB->new($ce->{dbLayout}); From 8ec514f75425e763c796af6164bc339b7bef21d2 Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Fri, 23 Jun 2023 10:48:10 -0700 Subject: [PATCH 036/549] add mhchem package to latex packages --- conf/snippets/hardcopyThemes/common/packages.tex | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/snippets/hardcopyThemes/common/packages.tex b/conf/snippets/hardcopyThemes/common/packages.tex index e8beaa5259..e628365106 100644 --- a/conf/snippets/hardcopyThemes/common/packages.tex +++ b/conf/snippets/hardcopyThemes/common/packages.tex @@ -1,5 +1,6 @@ \usepackage{amsmath,amsfonts,amssymb,multicol} \usepackage{booktabs,tabularx,colortbl,caption,xcolor} +\usepackage[version=4]{mhchem} \usepackage{path} \discretionaries |~!@$%^&*()_+`-=#{"}[]:;'<>,.?\/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789| From f51264a8830003199d3c990a821f44231e7b0388 Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Mon, 26 Jun 2023 15:23:28 -0700 Subject: [PATCH 037/549] don't check student answers by default --- templates/ContentGenerator/Hardcopy/form.html.ep | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/templates/ContentGenerator/Hardcopy/form.html.ep b/templates/ContentGenerator/Hardcopy/form.html.ep index 807858b534..cd78a01eef 100644 --- a/templates/ContentGenerator/Hardcopy/form.html.ep +++ b/templates/ContentGenerator/Hardcopy/form.html.ep @@ -75,8 +75,7 @@ <%= maketext('Show:') %>
    From 15842487ea5fb0652c3a65ed1d832140b75b6cfc Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Mon, 26 Jun 2023 14:48:34 -0700 Subject: [PATCH 038/549] after upgrading courses, don't scan all courses again --- lib/WeBWorK/ContentGenerator/CourseAdmin.pm | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/WeBWorK/ContentGenerator/CourseAdmin.pm b/lib/WeBWorK/ContentGenerator/CourseAdmin.pm index e5fe215242..400c146621 100644 --- a/lib/WeBWorK/ContentGenerator/CourseAdmin.pm +++ b/lib/WeBWorK/ContentGenerator/CourseAdmin.pm @@ -1587,7 +1587,6 @@ sub do_upgrade_course ($c) { method => 'POST', $c->c( $c->hidden_authen_fields, - $c->hidden_fields('subDisplay'), $c->tag( 'p', class => 'text-center', From dd1c1b8ffeabd4be65fdeded7e096e27b6ff9c90 Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Mon, 26 Jun 2023 21:25:39 -0700 Subject: [PATCH 039/549] change \ProvidesFile to \ProvidesPackage --- conf/snippets/hardcopyThemes/common/webwork2.sty | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/conf/snippets/hardcopyThemes/common/webwork2.sty b/conf/snippets/hardcopyThemes/common/webwork2.sty index 8ec76237f3..000de8f4bf 100644 --- a/conf/snippets/hardcopyThemes/common/webwork2.sty +++ b/conf/snippets/hardcopyThemes/common/webwork2.sty @@ -1,4 +1,5 @@ -\ProvidesFile{webwork2} +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{webwork2}[2023/06/26 version 2.18] % These macros may be overridden with WeBWorK environment variables \def\webworkCourseName{} From 42a06b07b69bc97ba71ffad29400e423455e5a07 Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Mon, 26 Jun 2023 23:04:14 -0400 Subject: [PATCH 040/549] Fix scroll positioning issues. Making the masthead fixed has caused some issues with scroll positioning. First, if you click on a fragment link, the window scrolls the element that is referenced to the top of the page. Unfortunately, that makes it under the masthead. This adds a `scroll-margin-top` to all elements with ids in the main content of the page. One example of this is the "Skip to main content" accessibility link. If you load a page and hit the "tab" key immediately after the page loads this will appear. If you then hit "enter", the "page-title" should be focused and scrolled to the top. Without this pull request the page title will be under the masthead. With this pull request it will be right under it. This will also fix any other fragment links like this as well though. Also on the PG problem editor page to fix scrolling to the top of the problem when the "View/Reload" button is clicked, the masthead height needs to be taken into account. To test this open a problem in the editor, and scroll as far down as you can. Make the window shorter if needed to make sure that the top of the problem is above the top of the window. Then click "View/Reload". With this pull request the window should scroll so that the top of the problem is visible below the masthead. Withouth this pull request it will be obscured below the masthead. --- htdocs/js/PGProblemEditor/pgproblemeditor.js | 3 ++- htdocs/themes/math4/math4.scss | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/htdocs/js/PGProblemEditor/pgproblemeditor.js b/htdocs/js/PGProblemEditor/pgproblemeditor.js index 33095cabb6..18b6d36459 100644 --- a/htdocs/js/PGProblemEditor/pgproblemeditor.js +++ b/htdocs/js/PGProblemEditor/pgproblemeditor.js @@ -228,7 +228,8 @@ // Scroll to the top of the render window if the current scroll position is below that. const renderAreaRect = renderArea.getBoundingClientRect(); - if (renderAreaRect.top < 0) window.scrollBy(0, renderAreaRect.top); + const topBarHeight = document.querySelector('.webwork-logo')?.getBoundingClientRect().height ?? 0; + if (renderAreaRect.top < topBarHeight) window.scrollBy(0, renderAreaRect.top - topBarHeight); }); const render = () => new Promise((resolve) => { diff --git a/htdocs/themes/math4/math4.scss b/htdocs/themes/math4/math4.scss index 9e61d14699..c93771cced 100644 --- a/htdocs/themes/math4/math4.scss +++ b/htdocs/themes/math4/math4.scss @@ -247,6 +247,10 @@ $site-nav-width: 250px !default; margin-top: $masthead-height; width: calc(100% - $site-nav-width); + *[id] { + scroll-margin-top: $masthead-height; + } + &.toggle-width { width: 100%; margin-left: 0; @@ -256,6 +260,10 @@ $site-nav-width: 250px !default; width: 100%; margin-top: 0; margin-left: auto; + + *[id] { + scroll-margin-top: 0.75 * $masthead-height; + } } } From 619ab760ef8d652a5f0b65ec9df098845cea8565 Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Thu, 22 Jun 2023 17:04:04 -0700 Subject: [PATCH 041/549] remove all uses of BEGIN/ENDD_ONE_COLUMN --- courses.dist/modelCourse/templates/set0/paperHeaderFile0.pg | 2 -- .../modelCourse/templates/setDemo/paperHeaderFile1.pg | 2 -- .../templates/setMAAtutorial/MAAtutorialSetHeader.pg | 4 ---- .../templates/setMAAtutorial/hermitegraphexample.pg | 4 +--- .../modelCourse/templates/setMAAtutorial/paperHeader.pg | 2 -- .../staticgraphicsexample/staticgraphicsexample.pg | 4 +--- .../templates/setMAAtutorial/vectorfieldexample.pg | 2 -- .../modelCourse/templates/setOrientation/setHeader.pg | 3 +-- doc/parser/extensions/1-function.pg | 2 -- doc/parser/extensions/2-function.pg | 2 -- doc/parser/extensions/3-operator.pg | 2 -- doc/parser/extensions/4-list.pg | 2 -- doc/parser/extensions/5-operator.pg | 2 -- doc/parser/extensions/6-precedence.pg | 2 -- doc/parser/extensions/7-context.pg | 2 -- 15 files changed, 3 insertions(+), 34 deletions(-) diff --git a/courses.dist/modelCourse/templates/set0/paperHeaderFile0.pg b/courses.dist/modelCourse/templates/set0/paperHeaderFile0.pg index faf4987176..967cb43f50 100644 --- a/courses.dist/modelCourse/templates/set0/paperHeaderFile0.pg +++ b/courses.dist/modelCourse/templates/set0/paperHeaderFile0.pg @@ -12,7 +12,6 @@ loadMacros( $dateTime = $formatedDueDate; TEXT(EV2(<EV3(<<'EOT'), HTML=>"", Latex2HTML=>"" )); \noindent {\large \bf $studentName} \hfill @@ -94,8 +92,6 @@ $PAR You can use the Feedback button on each problem page to send e-mail to the professors. - -$END_ONE_COLUMN END_TEXT ENDDOCUMENT(); # This should be the last executable line in the problem. diff --git a/courses.dist/modelCourse/templates/setMAAtutorial/hermitegraphexample.pg b/courses.dist/modelCourse/templates/setMAAtutorial/hermitegraphexample.pg index 0556dec368..8da29ac397 100644 --- a/courses.dist/modelCourse/templates/setMAAtutorial/hermitegraphexample.pg +++ b/courses.dist/modelCourse/templates/setMAAtutorial/hermitegraphexample.pg @@ -5,7 +5,6 @@ loadMacros("PGbasicmacros.pl", "PGnumericalmacros.pl", "PGgraphmacros.pl" ); -TEXT($BEGIN_ONE_COLUMN); TEXT(beginproblem(), $BR,$BBOLD, "Hermite polynomial graph example", $EBOLD, $BR,$BR); $showPartialAnswers = 1; @@ -122,5 +121,4 @@ $PAR END_TEXT ANS(num_cmp([ @minimum_points ], tol => .3)); -TEXT($END_ONE_COLUMN); -ENDDOCUMENT(); \ No newline at end of file +ENDDOCUMENT(); diff --git a/courses.dist/modelCourse/templates/setMAAtutorial/paperHeader.pg b/courses.dist/modelCourse/templates/setMAAtutorial/paperHeader.pg index d26d1abcd3..fd1a6af434 100644 --- a/courses.dist/modelCourse/templates/setMAAtutorial/paperHeader.pg +++ b/courses.dist/modelCourse/templates/setMAAtutorial/paperHeader.pg @@ -11,10 +11,8 @@ loadMacros( BEGIN_TEXT -$BEGIN_ONE_COLUMN This set shows how to write simple WeBWorK problems and introduces you to the most common constructions. -$END_ONE_COLUMN END_TEXT diff --git a/courses.dist/modelCourse/templates/setMAAtutorial/staticgraphicsexample/staticgraphicsexample.pg b/courses.dist/modelCourse/templates/setMAAtutorial/staticgraphicsexample/staticgraphicsexample.pg index 97f15b6b25..c86fc18a45 100644 --- a/courses.dist/modelCourse/templates/setMAAtutorial/staticgraphicsexample/staticgraphicsexample.pg +++ b/courses.dist/modelCourse/templates/setMAAtutorial/staticgraphicsexample/staticgraphicsexample.pg @@ -3,7 +3,6 @@ loadMacros("PGbasicmacros.pl", "PGchoicemacros.pl", "PGanswermacros.pl" ); -TEXT($BEGIN_ONE_COLUMN); TEXT(beginproblem(), $BR,$BBOLD, "Static graphics Example", $EBOLD, $BR,$BR); $showPartialCorrectAnswers = 0; @@ -111,5 +110,4 @@ TEXT( ANS( str_cmp( $ml ->ra_correct_ans() ) ) ; -TEXT($END_ONE_COLUMN); -ENDDOCUMENT(); \ No newline at end of file +ENDDOCUMENT(); diff --git a/courses.dist/modelCourse/templates/setMAAtutorial/vectorfieldexample.pg b/courses.dist/modelCourse/templates/setMAAtutorial/vectorfieldexample.pg index 50214bd5b5..1763620ced 100644 --- a/courses.dist/modelCourse/templates/setMAAtutorial/vectorfieldexample.pg +++ b/courses.dist/modelCourse/templates/setMAAtutorial/vectorfieldexample.pg @@ -37,7 +37,6 @@ sub{my ($x,$y) = @_; $y + 2 ;}, $tf ->choose($numberOfQuestions); BEGIN_TEXT -$BEGIN_ONE_COLUMN Match the following equations with their direction field. Clicking on each picture will give you an @@ -86,7 +85,6 @@ $PAR [@ALPHABET[$numberOfQuestions/2..$numberOfQuestions-1]], height => 200, width => 200,tex_size=>300 ) \} -$END_ONE_COLUMN END_TEXT ANS( str_cmp( $tf->ra_correct_ans ) ) ; diff --git a/courses.dist/modelCourse/templates/setOrientation/setHeader.pg b/courses.dist/modelCourse/templates/setOrientation/setHeader.pg index e1f38aa6fa..ff9221ab30 100644 --- a/courses.dist/modelCourse/templates/setOrientation/setHeader.pg +++ b/courses.dist/modelCourse/templates/setOrientation/setHeader.pg @@ -10,7 +10,7 @@ $WW = "WeBWorK"; if ($displayMode eq 'TeX') { -TEXT($BEGIN_ONE_COLUMN, +TEXT( '\noindent{\large\bf '.$studentName.'}\hfill{\large\bf '.$course.'}', '\par\noindent', " @@ -24,7 +24,6 @@ entries. ", "WeBWorK assignment $setNumber closes on $formattedDueDate.", - $END_ONE_COLUMN ); } else { diff --git a/doc/parser/extensions/1-function.pg b/doc/parser/extensions/1-function.pg index 7e42c75e9f..8f734a4ff1 100644 --- a/doc/parser/extensions/1-function.pg +++ b/doc/parser/extensions/1-function.pg @@ -55,7 +55,6 @@ $x = Formula('x'); # The problem text # BEGIN_TEXT -$BEGIN_ONE_COLUMN In this problem, we have added a new function to the Parser: ${BTT}log2(x)${ETT}. (Edit the code to see how this is done.) @@ -75,7 +74,6 @@ $PAR 'log2(1,3)', )\} -$END_ONE_COLUMN END_TEXT ########################################################### diff --git a/doc/parser/extensions/2-function.pg b/doc/parser/extensions/2-function.pg index bcde6c059c..5ec149472e 100644 --- a/doc/parser/extensions/2-function.pg +++ b/doc/parser/extensions/2-function.pg @@ -55,7 +55,6 @@ $x = Formula('x'); # The problem text # BEGIN_TEXT -$BEGIN_ONE_COLUMN In this problem, we have added a new function to the Parser: ${BTT}C(n,r)${ETT}. (Edit the code to see how this is done). @@ -75,7 +74,6 @@ $PAR 'C(1,2,3)', )\} -$END_ONE_COLUMN END_TEXT ########################################################### diff --git a/doc/parser/extensions/3-operator.pg b/doc/parser/extensions/3-operator.pg index 7cbdfa50c6..b1098b400e 100644 --- a/doc/parser/extensions/3-operator.pg +++ b/doc/parser/extensions/3-operator.pg @@ -86,7 +86,6 @@ $CHOOSE = MODES(TeX => '\#', HTML => '#'); # The problem text # BEGIN_TEXT -$BEGIN_ONE_COLUMN In this problem, we have added a new operator to the Parser: ${BTT}n $CHOOSE r${ETT}, which returns \(n\choose r\). @@ -105,7 +104,6 @@ $PAR 'Formula("1 # ")', )\} -$END_ONE_COLUMN END_TEXT ########################################################### diff --git a/doc/parser/extensions/4-list.pg b/doc/parser/extensions/4-list.pg index 1056685ea7..781615b90b 100644 --- a/doc/parser/extensions/4-list.pg +++ b/doc/parser/extensions/4-list.pg @@ -80,7 +80,6 @@ Context()->parens->replace('[' => {close => ']', type => 'Choose'}); # The problem text # BEGIN_TEXT -$BEGIN_ONE_COLUMN In this problem, we have added a new list to the Parser: ${BTT}[n,r]${ETT}, which returns \(n\choose r\). @@ -98,7 +97,6 @@ $PAR 'Formula("[x,<1,2>]")', )\} -$END_ONE_COLUMN END_TEXT ########################################################### diff --git a/doc/parser/extensions/5-operator.pg b/doc/parser/extensions/5-operator.pg index 0ccd57b9aa..fc59695013 100644 --- a/doc/parser/extensions/5-operator.pg +++ b/doc/parser/extensions/5-operator.pg @@ -63,7 +63,6 @@ Context()->operators->add( # The problem text # BEGIN_TEXT -$BEGIN_ONE_COLUMN In this problem, we have added a new operator to the Parser: ${BTT} a = b${ETT}, for equality. @@ -81,7 +80,6 @@ $PAR 'Formula("x + y = 0, 3x-y = 4")', # you CAN get a list of equalities )\} -$END_ONE_COLUMN END_TEXT ########################################################### diff --git a/doc/parser/extensions/6-precedence.pg b/doc/parser/extensions/6-precedence.pg index a3e1f24155..eb770f84cc 100644 --- a/doc/parser/extensions/6-precedence.pg +++ b/doc/parser/extensions/6-precedence.pg @@ -61,7 +61,6 @@ $nonstandard = ParserTable( # The problem text # BEGIN_TEXT -$BEGIN_ONE_COLUMN In this problem, we compare the standard and non-standard precedences for multiplication. @@ -76,7 +75,6 @@ $PAR$BR $PAR $standard -$END_ONE_COLUMN END_TEXT ########################################################### diff --git a/doc/parser/extensions/7-context.pg b/doc/parser/extensions/7-context.pg index a43ae859c1..312f8224c3 100644 --- a/doc/parser/extensions/7-context.pg +++ b/doc/parser/extensions/7-context.pg @@ -15,7 +15,6 @@ loadMacros( TEXT(beginproblem()); BEGIN_TEXT -$BEGIN_ONE_COLUMN In this problem, we compare formulas in complex and vector contexts. Note the difference between how ${BTT}i${ETT} is treated in the two @@ -78,7 +77,6 @@ $PAR '3*i + 4*j - k', )\} -$END_ONE_COLUMN END_TEXT ########################################################### From dfaed860713a7b84741b237ae21f9d2f2e084cff Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Thu, 22 Jun 2023 17:27:42 -0700 Subject: [PATCH 042/549] remove all beginproblem() from distribution problems --- conf/snippets/blankProblem.pg | 1 - conf/snippets/blankProblem2.pg | 3 --- courses.dist/modelCourse/templates/set0/prob1.pg | 1 - courses.dist/modelCourse/templates/set0/prob1a.pg | 1 - courses.dist/modelCourse/templates/set0/prob1b.pg | 1 - courses.dist/modelCourse/templates/set0/prob2.pg | 3 +-- courses.dist/modelCourse/templates/set0/prob3.pg | 3 +-- courses.dist/modelCourse/templates/set0/prob4/prob4.pg | 1 - courses.dist/modelCourse/templates/set0/prob5.pg | 1 - courses.dist/modelCourse/templates/setDemo/c4s5p2.pg | 1 - courses.dist/modelCourse/templates/setDemo/josephus.pg | 4 +--- courses.dist/modelCourse/templates/setDemo/limits.pg | 3 +-- courses.dist/modelCourse/templates/setDemo/liteApplet1.pg | 3 +-- courses.dist/modelCourse/templates/setDemo/liteApplet2.pg | 4 +--- courses.dist/modelCourse/templates/setDemo/nsc2s10p2.pg | 1 - courses.dist/modelCourse/templates/setDemo/prob0837.pg | 2 -- courses.dist/modelCourse/templates/setDemo/prob5.pg | 2 -- courses.dist/modelCourse/templates/setDemo/prob6b.pg | 2 -- courses.dist/modelCourse/templates/setDemo/s2_2_1.pg | 1 - .../modelCourse/templates/setDemo/sample_myown_ans.pg | 3 +-- .../modelCourse/templates/setDemo/sample_units_ans.pg | 2 -- courses.dist/modelCourse/templates/setDemo/srw1_9_4.pg | 2 -- .../setMAAtutorial/conditionalquestionexample.pg | 2 +- .../templates/setMAAtutorial/hermitegraphexample.pg | 2 +- .../setMAAtutorial/htmllinksexample/htmllinksexample.pg | 4 ++-- .../templates/setMAAtutorial/javaappletexample.pg | 4 ++-- .../templates/setMAAtutorial/javascriptexample1.pg | 5 ++--- .../templates/setMAAtutorial/javascriptexample2.pg | 3 +-- .../modelCourse/templates/setMAAtutorial/liteApplet1.pg | 3 +-- .../modelCourse/templates/setMAAtutorial/liteApplet2.pg | 4 +--- .../templates/setMAAtutorial/matchinglistexample.pg | 4 ++-- .../templates/setMAAtutorial/multiplechoiceexample.pg | 4 ++-- .../templates/setMAAtutorial/ontheflygraphicsexample1.pg | 4 ++-- .../templates/setMAAtutorial/ontheflygraphicsexample2.pg | 4 ++-- .../templates/setMAAtutorial/popuplistexample.pg | 4 ++-- .../modelCourse/templates/setMAAtutorial/prob3.pg | 8 -------- .../modelCourse/templates/setMAAtutorial/prob4.pg | 1 - .../setMAAtutorial/simplemultiplechoiceexample.pg | 4 ++-- .../templates/setMAAtutorial/standardexample.pg | 3 +-- .../staticgraphicsexample/staticgraphicsexample.pg | 2 +- .../templates/setMAAtutorial/truefalseexample.pg | 4 ++-- .../templates/setMAAtutorial/vectorfieldexample.pg | 2 -- .../modelCourse/templates/setOrientation/prob01.pg | 2 -- .../modelCourse/templates/setOrientation/prob02.pg | 2 -- .../modelCourse/templates/setOrientation/prob03.pg | 1 - .../modelCourse/templates/setOrientation/prob04.pg | 1 - .../modelCourse/templates/setOrientation/prob05/prob05.pg | 2 -- .../modelCourse/templates/setOrientation/prob06.pg | 1 - .../modelCourse/templates/setOrientation/prob07.pg | 1 - .../modelCourse/templates/setOrientation/prob08.pg | 1 - .../modelCourse/templates/setOrientation/prob09.pg | 1 - .../modelCourse/templates/setOrientation/prob10.pg | 1 - .../modelCourse/templates/setOrientation/prob11.pg | 1 - .../modelCourse/templates/setOrientation/prob12.pg | 1 - .../modelCourse/templates/setOrientation/prob13.pg | 1 - .../modelCourse/templates/setOrientation/prob14/prob14.pg | 2 -- .../modelCourse/templates/setOrientation/prob15.pg | 2 -- doc/parser/extensions/1-function.pg | 2 -- doc/parser/extensions/2-function.pg | 2 -- doc/parser/extensions/3-operator.pg | 2 -- doc/parser/extensions/4-list.pg | 2 -- doc/parser/extensions/5-operator.pg | 2 -- doc/parser/extensions/6-precedence.pg | 2 -- doc/parser/extensions/7-context.pg | 2 -- doc/parser/extensions/8-answer.pg | 2 -- doc/parser/problems/sample01.pg | 4 +--- doc/parser/problems/sample02.pg | 2 -- doc/parser/problems/sample03.pg | 2 -- doc/parser/problems/sample04.pg | 2 -- doc/parser/problems/sample05.pg | 2 -- doc/parser/problems/sample06.pg | 2 -- doc/parser/problems/sample07.pg | 2 -- doc/parser/problems/sample08.pg | 2 -- doc/parser/problems/sample09.pg | 2 -- doc/parser/problems/sample10.pg | 2 -- doc/parser/problems/sample11.pg | 2 -- doc/parser/problems/sample12.pg | 2 -- doc/parser/problems/sample13.pg | 2 -- doc/parser/problems/sample14.pg | 2 -- doc/parser/problems/sample15.pg | 2 -- doc/parser/problems/sample16.pg | 2 -- doc/parser/problems/sample17.pg | 2 -- doc/parser/problems/sample18.pg | 2 -- doc/parser/problems/sample19.pg | 2 -- doc/parser/problems/sample20.pg | 2 -- doc/parser/problems/sample21.pg | 2 -- doc/parser/problems/sample22.pg | 4 +--- 87 files changed, 36 insertions(+), 164 deletions(-) diff --git a/conf/snippets/blankProblem.pg b/conf/snippets/blankProblem.pg index 205f7b7f56..474fbcc3c4 100644 --- a/conf/snippets/blankProblem.pg +++ b/conf/snippets/blankProblem.pg @@ -11,7 +11,6 @@ loadMacros("PG.pl", ## Do NOT show partial correct answers $showPartialCorrectAnswers = 0; -TEXT(beginproblem()); BEGIN_TEXT diff --git a/conf/snippets/blankProblem2.pg b/conf/snippets/blankProblem2.pg index 04958fd784..2194340b65 100644 --- a/conf/snippets/blankProblem2.pg +++ b/conf/snippets/blankProblem2.pg @@ -23,9 +23,6 @@ loadMacros( "PGcourse.pl", # Customization file for the course ); -# Print problem number and point value (weight) for the problem -TEXT(beginproblem()); - # Show which answers are correct and which ones are incorrect $showPartialCorrectAnswers = 1; diff --git a/courses.dist/modelCourse/templates/set0/prob1.pg b/courses.dist/modelCourse/templates/set0/prob1.pg index 894cf83040..64639f592d 100644 --- a/courses.dist/modelCourse/templates/set0/prob1.pg +++ b/courses.dist/modelCourse/templates/set0/prob1.pg @@ -16,7 +16,6 @@ loadMacros( "PGauxiliaryFunctions.pl" ); -TEXT(beginproblem()); $showPartialCorrectAnswers = 1; $a = random(-10,-1,1); diff --git a/courses.dist/modelCourse/templates/set0/prob1a.pg b/courses.dist/modelCourse/templates/set0/prob1a.pg index a862e59377..312b40820d 100644 --- a/courses.dist/modelCourse/templates/set0/prob1a.pg +++ b/courses.dist/modelCourse/templates/set0/prob1a.pg @@ -13,7 +13,6 @@ loadMacros( "PGauxiliaryFunctions.pl" ); -TEXT(beginproblem()); $showPartialCorrectAnswers = 1; diff --git a/courses.dist/modelCourse/templates/set0/prob1b.pg b/courses.dist/modelCourse/templates/set0/prob1b.pg index d1de6b1c09..853eba5136 100644 --- a/courses.dist/modelCourse/templates/set0/prob1b.pg +++ b/courses.dist/modelCourse/templates/set0/prob1b.pg @@ -14,7 +14,6 @@ loadMacros( "PGauxiliaryFunctions.pl" ); -TEXT(beginproblem()); $showPartialCorrectAnswers = 1; diff --git a/courses.dist/modelCourse/templates/set0/prob2.pg b/courses.dist/modelCourse/templates/set0/prob2.pg index 45346fbf96..e2b5fea4a5 100644 --- a/courses.dist/modelCourse/templates/set0/prob2.pg +++ b/courses.dist/modelCourse/templates/set0/prob2.pg @@ -14,7 +14,6 @@ loadMacros( "PGauxiliaryFunctions.pl" ); -TEXT(beginproblem()); $showPartialCorrectAnswers = 1; TEXT(EV2(< '', Latex2HTML => "\begin{rawhtml}
    diff --git a/templates/RPCRenderFormats/default.html.ep b/templates/RPCRenderFormats/default.html.ep index 4708eb7e90..48b494d041 100644 --- a/templates/RPCRenderFormats/default.html.ep +++ b/templates/RPCRenderFormats/default.html.ep @@ -41,7 +41,11 @@ <%= form_for $FORM_ACTION_URL, id => 'problemMainForm', class => 'problem-main-form', name => 'problemMainForm', method => 'POST', begin %>
    > - %== $problemText + % if ($displayMode eq 'PTX') { + + % } else { + %== $problemText + % }
    % if ($showScoreSummary) {

    <%= $lh->maketext('You received a score of [_1] for this attempt.', From f3758177dc7309d9e2bc6717bd9deedcc3477bea Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Mon, 26 Jun 2023 21:10:51 -0700 Subject: [PATCH 051/549] don't show submit buttons for PTX render; use pre not textarea --- .../PGProblemEditor/view_form.html.ep | 3 +- templates/RPCRenderFormats/default.html.ep | 34 ++++++++++--------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/templates/ContentGenerator/Instructor/PGProblemEditor/view_form.html.ep b/templates/ContentGenerator/Instructor/PGProblemEditor/view_form.html.ep index e5321fca25..0388e2bbc3 100644 --- a/templates/ContentGenerator/Instructor/PGProblemEditor/view_form.html.ep +++ b/templates/ContentGenerator/Instructor/PGProblemEditor/view_form.html.ep @@ -19,7 +19,8 @@ class => 'col-form-label col-auto' =%>

    <%= select_field 'action.view.displayMode' => [ - map { [ $_ => $_, $_ eq $c->{displayMode} ? (selected => undef) : () ] } @{ $ce->{pg}{displayModes}}, 'PTX' + map { [ $_ => $_, $_ eq $c->{displayMode} ? (selected => undef) : () ] } + @{ $ce->{pg}{displayModes}}, 'PTX' ], id => 'action_view_displayMode_id', class => 'form-select form-select-sm d-inline w-auto' =%>
    diff --git a/templates/RPCRenderFormats/default.html.ep b/templates/RPCRenderFormats/default.html.ep index 48b494d041..8bd57a2cfc 100644 --- a/templates/RPCRenderFormats/default.html.ep +++ b/templates/RPCRenderFormats/default.html.ep @@ -42,7 +42,7 @@ name => 'problemMainForm', method => 'POST', begin %>
    > % if ($displayMode eq 'PTX') { - +
    <%= "$problemText"%>
    % } else { %== $problemText % } @@ -97,21 +97,23 @@ %= hidden_field clientDebug => $ws->{inputs_ref}{clientDebug} % } % -
    - % # Submit buttons (all are shown by default) - % if ($showPreviewButton ne '0') { - <%= submit_button $lh->maketext('Preview My Answers'), - name => 'preview', id => 'previewAnswers_id', class => 'btn btn-primary mb-1' %> - % } - % if ($showCheckAnswersButton ne '0') { - <%= submit_button $lh->maketext('Check Answers'), - name => 'WWsubmit', class => 'btn btn-primary mb-1' %> - % } - % if ($showCorrectAnswersButton ne '0') { - <%= submit_button $lh->maketext('Show Correct Answers'), - name => 'WWcorrectAns', class => 'btn btn-primary mb-1' %> - % } -
    + % if ($displayMode ne 'PTX') { +
    + % # Submit buttons (all are shown by default) + % if ($showPreviewButton ne '0') { + <%= submit_button $lh->maketext('Preview My Answers'), + name => 'preview', id => 'previewAnswers_id', class => 'btn btn-primary mb-1' %> + % } + % if ($showCheckAnswersButton ne '0') { + <%= submit_button $lh->maketext('Check Answers'), + name => 'WWsubmit', class => 'btn btn-primary mb-1' %> + % } + % if ($showCorrectAnswersButton ne '0') { + <%= submit_button $lh->maketext('Show Correct Answers'), + name => 'WWcorrectAns', class => 'btn btn-primary mb-1' %> + % } +
    + % } % end
    From 137fd578c25c7f289d24e2ba6528c4b896de61a4 Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Tue, 27 Jun 2023 12:54:12 -0700 Subject: [PATCH 052/549] make PTX and tex be 'additionalPGEditorDisplayModes' --- conf/defaults.config | 18 ++++++++++++------ .../PGProblemEditor/view_form.html.ep | 2 +- templates/RPCRenderFormats/default.html.ep | 4 ++-- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/conf/defaults.config b/conf/defaults.config index 1dc348bcc5..e74579e39b 100644 --- a/conf/defaults.config +++ b/conf/defaults.config @@ -961,17 +961,23 @@ $CookieLifeTime = 604800; # PG subsystem options ################################################################################ -# List of enabled display modes. Comment out any modes you don't wish to make -# available for use. +# List of enabled screen display modes. Comment out any modes you don't wish to +# make available for use. # The first uncommented option is the default for instructors rendering problems # in the homework sets editor. $pg{displayModes} = [ - "MathJax", # render TeX math expressions on the client side using MathJax - # we strongly recommend people install and use MathJax, and it is required if you want to use mathview - "images", # display math expressions as images generated by dvipng -# "plainText", # display raw TeX for math expressions + "MathJax", # render TeX math expressions on the client side using + # MathJax; we strongly recommend people install and use + # MathJax, and it is required if you want to use MathView + "images", # display math expressions as images generated by dvipng +# "plainText", # display raw TeX for math expressions ]; +# List of additional display modes for the PG editor only. +$pg{additionalPGEditorDisplayModes} = [ + "tex", # display tex code for a rendered problem + "PTX", # display static PreTeXt XML for a rendered problem +]; ########################################################################################## #### Default settings for homework editor pages diff --git a/templates/ContentGenerator/Instructor/PGProblemEditor/view_form.html.ep b/templates/ContentGenerator/Instructor/PGProblemEditor/view_form.html.ep index 0388e2bbc3..becf981808 100644 --- a/templates/ContentGenerator/Instructor/PGProblemEditor/view_form.html.ep +++ b/templates/ContentGenerator/Instructor/PGProblemEditor/view_form.html.ep @@ -20,7 +20,7 @@
    <%= select_field 'action.view.displayMode' => [ map { [ $_ => $_, $_ eq $c->{displayMode} ? (selected => undef) : () ] } - @{ $ce->{pg}{displayModes}}, 'PTX' + @{ $ce->{pg}{displayModes}}, @{ $ce->{pg}{additionalPGEditorDisplayModes}} ], id => 'action_view_displayMode_id', class => 'form-select form-select-sm d-inline w-auto' =%>
    diff --git a/templates/RPCRenderFormats/default.html.ep b/templates/RPCRenderFormats/default.html.ep index 8bd57a2cfc..ae5e742b72 100644 --- a/templates/RPCRenderFormats/default.html.ep +++ b/templates/RPCRenderFormats/default.html.ep @@ -41,7 +41,7 @@ <%= form_for $FORM_ACTION_URL, id => 'problemMainForm', class => 'problem-main-form', name => 'problemMainForm', method => 'POST', begin %>
    > - % if ($displayMode eq 'PTX') { + % if ($displayMode eq 'PTX' || $displayMode eq 'tex') {
    <%= "$problemText"%>
    % } else { %== $problemText @@ -97,7 +97,7 @@ %= hidden_field clientDebug => $ws->{inputs_ref}{clientDebug} % } % - % if ($displayMode ne 'PTX') { + % if ($displayMode ne 'PTX' && $displayMode ne 'tex') {
    % # Submit buttons (all are shown by default) % if ($showPreviewButton ne '0') { From 6b8dcac6ec7b567a2e2798fb679c8b516ae0ad9a Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Mon, 19 Jun 2023 21:45:26 -0500 Subject: [PATCH 053/549] POD Viewer improvements First, improve the efficiency of the WeBWorK::Utils::PODPaser package. The $podFiles argument must be provided to the new method in order for the module to resolve POD links to local files. It should be the first return value of the POD::Simple::Search survey method if called in list context, or only return value if called in scalar context. This is opposed to the previous method of search the root directory for each link that was encountered in the POD. Now instead, the directory is searched for files containing POD only once, and the results are stored in a hash. This is done by the caller and passed to the WeBWorK::Utils::PODPaser object on construction, instead of the WeBWorK::Utils::PODPaser object handling it. The module now expects `L<...>` usage to be correct according to the documentation at https://perldoc.perl.org/perlpod#L-a-hyperlink. Note that it also now honors links to POD head sections in other local files. The module also honors the following special cases that fit into that scheme for local files: * For a link to a local package, use the package name (exactly as the rules for `L<...>` dictate). * For a link to a `.pod` file, just use the basename without the `.pod` extension. So for example for a link to doc/MathObjects/UsingMathObjects.pod, use L. * For a link to a macro file (or script), use the basename of the macro file with the `.pl` extension and no path. The generate-ww-pg-pod.pl script now uses Mojo::Template to make it easier to make html. The POD page layouts have been improved with a sidebar for indices. Mojo::DOM is used to parse the generate POD and pull the index out to place in the sidebar. Also add a layout template for the POD rendered by webwork2. --- bin/dev_scripts/PODtoHTML.pm | 133 +++++++----------- bin/dev_scripts/generate-ww-pg-pod.pl | 47 +++---- .../pod-templates/category-index.mt | 69 +++++++++ bin/dev_scripts/pod-templates/main-index.mt | 38 +++++ bin/dev_scripts/pod-templates/pod.mt | 55 ++++++++ htdocs/js/PODViewer/podviewer.css | 60 ++++++++ htdocs/js/PODViewer/podviewer.js | 8 ++ htdocs/themes/math4-yellow/_theme-colors.scss | 7 + lib/WeBWorK/ContentGenerator/PODViewer.pm | 24 +++- lib/WeBWorK/Utils/PODParser.pm | 73 ++++------ templates/ContentGenerator/PODViewer.html.ep | 68 ++++----- .../ContentGenerator/PODViewer/POD.html.ep | 49 +++---- templates/layouts/pod_viewer.html.ep | 49 +++++++ 13 files changed, 448 insertions(+), 232 deletions(-) create mode 100644 bin/dev_scripts/pod-templates/category-index.mt create mode 100644 bin/dev_scripts/pod-templates/main-index.mt create mode 100644 bin/dev_scripts/pod-templates/pod.mt create mode 100644 htdocs/js/PODViewer/podviewer.js create mode 100644 templates/layouts/pod_viewer.html.ep diff --git a/bin/dev_scripts/PODtoHTML.pm b/bin/dev_scripts/PODtoHTML.pm index 073832f2f7..006abcf346 100644 --- a/bin/dev_scripts/PODtoHTML.pm +++ b/bin/dev_scripts/PODtoHTML.pm @@ -17,20 +17,25 @@ package PODtoHTML; use strict; use warnings; +use utf8; use Pod::Simple::Search; +use Mojo::Template; +use Mojo::DOM; +use Mojo::Collection qw(c); use File::Path qw(make_path); +use File::Basename qw(dirname); use IO::File; use POSIX qw(strftime); use WeBWorK::Utils::PODParser; our @sections = ( - bin => "Scripts", - conf => "Config Files", - doc => "Documentation", - lib => "Libraries", - macros => "Macros" + bin => 'Scripts', + conf => 'Config Files', + doc => 'Documentation', + lib => 'Libraries', + macros => 'Macros' ); sub new { @@ -58,10 +63,10 @@ sub convert_pods { my $regex = join('|', map {"^$_"} @{ $self->{section_order} }); - (undef, my $podFiles) = Pod::Simple::Search->new->inc(0)->limit_re(qr!$regex!)->survey($self->{source_root}); - for (keys %$podFiles) { + my ($name2path, $path2name) = Pod::Simple::Search->new->inc(0)->limit_re(qr!$regex!)->survey($self->{source_root}); + for (keys %$path2name) { print "Processing file: $_\n" if $self->{verbose} > 1; - $self->process_pod($_); + $self->process_pod($_, $name2path); } $self->write_index("$dest_root/index.html"); @@ -70,7 +75,7 @@ sub convert_pods { } sub process_pod { - my ($self, $pod_path) = @_; + my ($self, $pod_path, $pod_files) = @_; my $pod_name; @@ -86,7 +91,7 @@ sub process_pod { } } - $pod_name = (defined $subdir_rest ? "$subdir_rest/" : "") . $filename; + $pod_name = (defined $subdir_rest ? "$subdir_rest/" : '') . $filename; if ($filename =~ /\.pl$/) { $filename =~ s/\.pl$/.html/; } elsif ($filename =~ /\.pod$/) { @@ -97,22 +102,23 @@ sub process_pod { $pod_name =~ s|/+|::|g; $filename =~ s/\.pm$/.html/; } elsif ($filename !~ /\.html$/) { - $filename .= ".html"; + $filename .= '.html'; } $pod_name =~ s/^(\/|::)//; - my $html_dir = $self->{dest_root} . (defined $subdir ? "/$subdir" : ""); + my $html_dir = $self->{dest_root} . (defined $subdir ? "/$subdir" : ''); my $html_path = "$html_dir/$filename"; my $html_rel_path = defined $subdir ? "$subdir/$filename" : $filename; $self->update_index($subdir, $html_rel_path, $pod_name); make_path($html_dir); my $html = $self->do_pod2html( - pod_path => $pod_path, - pod_name => $pod_name + pod_path => $pod_path, + pod_name => $pod_name, + pod_files => $pod_files ); - my $fh = IO::File->new($html_path, '>') + my $fh = IO::File->new($html_path, '>:encoding(UTF-8)') or die "Failed to open file '$html_path' for writing: $!\n"; print $fh $html; @@ -137,84 +143,53 @@ sub update_index { sub write_index { my ($self, $out_path) = @_; - my $source_root = $self->{source_root} =~ s|^.*/||r; - my $title = "Index for $source_root"; - - my $content_start = '
      '; - my $content = ''; - - for my $section (@{ $self->{section_order} }) { - next unless defined $self->{idx}{$section}; - $content_start .= qq{
    • $self->{section_hash}{$section}
    • }; - $content .= qq{

      $self->{section_hash}{$section}

        }; - for my $file (sort { $a->[1] cmp $b->[1] } @{ $self->{idx}{$section} }) { - $content .= qq{
      • $file->[1]
      • }; + my $fh = IO::File->new($out_path, '>:encoding(UTF-8)') or die "Failed to open index '$out_path' for writing: $!\n"; + print $fh Mojo::Template->new(vars => 1)->render_file( + "$self->{template_dir}/category-index.mt", + { + title => 'POD for ' . ($self->{source_root} =~ s|^.*/||r), + base_url => $self->{dest_url}, + pod_index => $self->{idx}, + sections => $self->{section_hash}, + section_order => $self->{section_order}, + date => strftime('%a %b %e %H:%M:%S %Z %Y', localtime) } - $content .= '
      '; - } - - $content_start .= '
    '; - my $date = strftime '%a %b %e %H:%M:%S %Z %Y', localtime; - - my $fh = IO::File->new($out_path, '>') or die "Failed to open index '$out_path' for writing: $!\n"; - print $fh (get_header($title, $self->{dest_url}), $content_start, $content, "

    Generated $date

    ", get_footer()); + ); return; } sub do_pod2html { my ($self, %o) = @_; - my $psx = WeBWorK::Utils::PODParser->new; + + my $psx = WeBWorK::Utils::PODParser->new($o{pod_files}); $psx->{source_root} = $self->{source_root}; $psx->{verbose} = $self->{verbose}; $psx->{assert_html_ext} = 1; - $psx->{base_url} = ($self->{dest_url} // "") . "/" . (($self->{source_root} // "") =~ s|^.*/||r); + $psx->{base_url} = ($self->{dest_url} // '') . '/' . (($self->{source_root} // '') =~ s|^.*/||r); $psx->output_string(\my $html); - $psx->html_header(get_header($o{pod_name}, "$psx->{base_url}/..")); - $psx->html_footer(get_footer()); + $psx->html_header(''); + $psx->html_footer(''); $psx->parse_file($o{pod_path}); - return $html; -} -sub get_header { - my ($title, $base_url) = @_; - return << "EOF"; - - - - - -$title - - - - -
    -

    $title

    -
    - -
    -
    -EOF -} + my $dom = Mojo::DOM->new($html); + my $podIndexUL = $dom->at('ul[id="index"]'); + my $podIndex = $podIndexUL ? $podIndexUL->find('ul[id="index"] > li') : c(); + for (@$podIndex) { + $_->attr({ class => 'nav-item' }); + $_->at('a')->attr({ class => 'nav-link p-0' }); + for (@{ $_->find('ul') }) { + $_->attr({ class => 'nav flex-column w-100' }); + } + for (@{ $_->find('li') }) { + $_->attr({ class => 'nav-item' }); + $_->at('a')->attr({ class => 'nav-link p-0' }); + } + } + my $podHTML = $podIndexUL ? $podIndexUL->remove : $html; -sub get_footer { - return << 'EOF'; -
    -
    -
    -
    Site Navigation
    - -
    -
    - - -EOF + return Mojo::Template->new(vars => 1)->render_file("$self->{template_dir}/pod.mt", + { title => $o{pod_name}, base_url => dirname($psx->{base_url}), index => $podIndex, content => $podHTML }); } 1; diff --git a/bin/dev_scripts/generate-ww-pg-pod.pl b/bin/dev_scripts/generate-ww-pg-pod.pl index 54961b7b90..02cfa3ecdf 100755 --- a/bin/dev_scripts/generate-ww-pg-pod.pl +++ b/bin/dev_scripts/generate-ww-pg-pod.pl @@ -62,6 +62,7 @@ =head1 DESCRIPTION $base_url = "/" if !$base_url; +use Mojo::Template; use IO::File; use File::Copy; use File::Path qw(make_path remove_tree); @@ -83,11 +84,13 @@ =head1 DESCRIPTION my $index_fh = IO::File->new("$output_dir/index.html", '>') or die "failed to open '$output_dir/index.html' for writing: $!\n"; -write_index($index_fh, $base_url); +write_index($index_fh); -make_path("$output_dir/css"); -copy("$webwork_root/htdocs/js/PODViewer/podviewer.css", "$output_dir/css/pod.css"); -print "copying $webwork_root/htdocs/js/PODViewer/podviewer.css to $output_dir/css/pod.css\n" if $verbose; +make_path("$output_dir/assets"); +copy("$webwork_root/htdocs/js/PODViewer/podviewer.css", "$output_dir/assets/podviewer.css"); +print "copying $webwork_root/htdocs/js/PODViewer/podviewer.css to $output_dir/assets/podviewer.css\n" if $verbose; +copy("$webwork_root/htdocs/js/PODViewer/podviewer.js", "$output_dir/assets/podviewer.js"); +print "copying $webwork_root/htdocs/js/PODViewer/podviewer.css to $output_dir/assets/podviewer.js\n" if $verbose; sub process_dir { my $source_dir = shift; @@ -101,10 +104,11 @@ sub process_dir { make_path($dest_dir); my $htmldocs = PODtoHTML->new( - source_root => $source_dir, - dest_root => $dest_dir, - dest_url => $base_url, - verbose => $verbose + source_root => $source_dir, + dest_root => $dest_dir, + template_dir => "$webwork_root/bin/dev_scripts/pod-templates", + dest_url => $base_url, + verbose => $verbose ); $htmldocs->convert_pods; @@ -112,29 +116,10 @@ sub process_dir { } sub write_index { - my ($fh, $base_url) = @_; - print $fh <<"EOF"; - - - - - - - -WeBWorK/PG POD - - -
    -

    WeBWorK/PG POD

    -

    (Plain Old Documentation)

    -
    -
      -EOF - - print $fh q{
    • PG
    • } if $pg_root; - print $fh q{
    • WeBWorK
    • } if $webwork_root; - - print $fh "
    "; + my $fh = shift; + + print $fh Mojo::Template->new(vars => 1)->render_file("$webwork_root/bin/dev_scripts/pod-templates/main-index.mt", + { base_url => $base_url, webwork_root => $webwork_root, pg_root => $pg_root }); return; } diff --git a/bin/dev_scripts/pod-templates/category-index.mt b/bin/dev_scripts/pod-templates/category-index.mt new file mode 100644 index 0000000000..78c9bb3724 --- /dev/null +++ b/bin/dev_scripts/pod-templates/category-index.mt @@ -0,0 +1,69 @@ + + +% + + + + <%= $title %> + + + + + + +% + + + % + % my ($index, $content) = ('', ''); + % for my $section (@$section_order) { + % next unless defined $pod_index->{$section}; + % my $new_index = begin + <%= $sections->{$section} %> + % end + % $index .= $new_index->(); + % my $new_content = begin +

    <%= $sections->{$section} %>

    +
    + % for my $file (sort { $a->[1] cmp $b->[1] } @{ $pod_index->{$section} }) { + <%= $file->[1] %> + % } +
    + % end + % $content .= $new_content->(); + % } + % + +
    +
    + <%= $content =%> +

    Generated <%= $date %>

    +
    +
    + +% + diff --git a/bin/dev_scripts/pod-templates/main-index.mt b/bin/dev_scripts/pod-templates/main-index.mt new file mode 100644 index 0000000000..d9bfe39e8d --- /dev/null +++ b/bin/dev_scripts/pod-templates/main-index.mt @@ -0,0 +1,38 @@ + + +% + + + + + + + WeBWorK/PG POD + +% + + +
    +
    +

    (Plain Old Documentation)

    + +
    +
    + +% + diff --git a/bin/dev_scripts/pod-templates/pod.mt b/bin/dev_scripts/pod-templates/pod.mt new file mode 100644 index 0000000000..0ea8e6c5b4 --- /dev/null +++ b/bin/dev_scripts/pod-templates/pod.mt @@ -0,0 +1,55 @@ + + +% + + + + <%= $title %> + + + + + + +% + + + +
    +
    + <%= $content =%> +
    +
    + +% + diff --git a/htdocs/js/PODViewer/podviewer.css b/htdocs/js/PODViewer/podviewer.css index a920f383a8..e4f17811d2 100644 --- a/htdocs/js/PODViewer/podviewer.css +++ b/htdocs/js/PODViewer/podviewer.css @@ -1,6 +1,66 @@ +.main-index-header, +.pod-header { + height: 65px; + top: 0; + left: 0; + right: 0; + z-index: 2; +} + +#sidebar { + --bs-offcanvas-width: 300px; + overflow-y: auto; +} + +#sidebar ul.nav ul.nav li { + border-left: 1px solid #e1e4e8; + padding-left: 10px; +} + +#sidebar ul.nav ul.nav li:hover { + border-left: 6px solid #e1e4e8; + padding-left: 5px; +} + +.main-index-container, +.pod-page-container { + margin-top: 65px; +} + +@media only screen and (min-width: 768px) { + #sidebar { + height: calc(100vh - 65px); + width: 300px; + } + + .pod-page-container { + margin-left: 300px; + } +} + #_podtop_ pre { border: 1px solid #ccc; border-radius: 5px; background: #f6f6f6; padding: 0.75rem; } + +#_podtop_, +#_podtop_ *[id] { + scroll-margin-top: calc(65px + 1rem); +} + +@media only screen and (max-width: 768px) { + .pod-header { + height: 100px; + } + + .pod-page-container { + margin-top: 100px; + } + + #_podtop_, + #_podtop_ *[id] { + scroll-margin-top: calc(100px + 1rem); + } +} diff --git a/htdocs/js/PODViewer/podviewer.js b/htdocs/js/PODViewer/podviewer.js new file mode 100644 index 0000000000..795093205a --- /dev/null +++ b/htdocs/js/PODViewer/podviewer.js @@ -0,0 +1,8 @@ +(() => { + const offcanvas = bootstrap.Offcanvas.getOrCreateInstance(document.getElementById('sidebar')); + for (const link of document.querySelectorAll('#sidebar .nav-link')) { + // The timeout is to workaround an issue in Chrome. If the offcanvas hides before the window scrolls to the + // fragment in the page, scrolling stops before it gets there. + link.addEventListener('click', () => setTimeout(() => offcanvas.hide(), 500)); + } +})(); diff --git a/htdocs/themes/math4-yellow/_theme-colors.scss b/htdocs/themes/math4-yellow/_theme-colors.scss index e2c3a1c7ee..9ef99947b9 100644 --- a/htdocs/themes/math4-yellow/_theme-colors.scss +++ b/htdocs/themes/math4-yellow/_theme-colors.scss @@ -35,3 +35,10 @@ $ww-achievement-level-color: darken($primary, 15%); // Make accordion buttons darker. $accordion-button-active-color: shade-color($primary, 50%); + +// Make the navbar colors dark. +$navbar-dark-color: rgba(#000, .55); +$navbar-dark-hover-color: rgba(#000, .75); +$navbar-dark-active-color: #000; +$navbar-dark-disabled-color: rgba(#000, .25); +$navbar-dark-toggler-border-color: rgba(#000, .1); diff --git a/lib/WeBWorK/ContentGenerator/PODViewer.pm b/lib/WeBWorK/ContentGenerator/PODViewer.pm index 1975a09137..58304ecb57 100644 --- a/lib/WeBWorK/ContentGenerator/PODViewer.pm +++ b/lib/WeBWorK/ContentGenerator/PODViewer.pm @@ -23,6 +23,7 @@ WeBWorK::ContentGenerator::PODViewer - display POD for PG macros. =cut use Pod::Simple::Search; +use Mojo::DOM; use WeBWorK::Utils::PODParser; @@ -37,14 +38,15 @@ sub PODindex ($c) { push(@{ $sections->{$section} }, $podFiles->{$_} =~ s!^$pgRoot/$section/!!r); } - return $c->render('ContentGenerator/PODViewer', sections => $sections); + return $c->render('ContentGenerator/PODViewer', sections => $sections, sidebar_title => $c->maketext('Categories')); } sub renderPOD ($c) { my $macroFile = $c->ce->{pg_dir} . '/' . $c->stash->{filePath}; if (-e $macroFile) { - my $parser = WeBWorK::Utils::PODParser->new; + my $parser = WeBWorK::Utils::PODParser->new( + Pod::Simple::Search->new->inc(0)->limit_re(qr/^doc|^lib|^macros/)->survey($c->ce->{pg_dir})); $parser->{verbose} = 0; $parser->{source_root} = $c->ce->{pg_dir}; $parser->{base_url} = $c->url_for('pod_index')->to_string; @@ -56,11 +58,25 @@ sub renderPOD ($c) { if ($@) { $c->stash->{podError} = $@; } else { - $c->stash->{podHTML} = $html; + my $dom = Mojo::DOM->new($html); + my $podIndex = $dom->at('ul[id="index"]'); + $c->stash->{podIndex} = $podIndex ? $podIndex->find('ul[id="index"] > li') : $c->c; + for (@{ $c->stash->{podIndex} }) { + $_->attr({ class => 'nav-item' }); + $_->at('a')->attr({ class => 'nav-link p-0' }); + for (@{ $_->find('ul') }) { + $_->attr({ class => 'nav flex-column w-100' }); + } + for (@{ $_->find('li') }) { + $_->attr({ class => 'nav-item' }); + $_->at('a')->attr({ class => 'nav-link p-0' }); + } + } + $c->stash->{podHTML} = $podIndex ? $podIndex->remove : $html; } } - return $c->render('ContentGenerator/PODViewer/POD'); + return $c->render('ContentGenerator/PODViewer/POD', sidebar_title => $c->maketext('Index')); } 1; diff --git a/lib/WeBWorK/Utils/PODParser.pm b/lib/WeBWorK/Utils/PODParser.pm index 87e0963714..b3a951e06a 100644 --- a/lib/WeBWorK/Utils/PODParser.pm +++ b/lib/WeBWorK/Utils/PODParser.pm @@ -20,70 +20,51 @@ use strict; use warnings; use Pod::Simple::XHTML; -use File::Find; +use File::Basename qw(basename); +# $podFiles must be provided in order for pod links to local files to work. It should be the +# first return value of the POD::Simple::Search survey method. sub new { - my $invocant = shift; - my $class = ref $invocant || $invocant; - my $self = $class->SUPER::new(@_); + my ($invocant, $podFiles) = @_; + my $class = ref $invocant || $invocant; + my $self = $class->SUPER::new(@_); $self->perldoc_url_prefix("https://metacpan.org/pod/"); $self->index(1); $self->backlink(1); + $self->html_charset('UTF-8'); + $self->{podFiles} = $podFiles // {}; return bless $self, $class; } # Attempt to resolve links to local files. If a local file is not found, then # let Pod::Simple::XHTML resolve to a cpan link. -# Really this is a workaround for invalid `L<...>` usage in the PG POD. sub resolve_pod_page_link { - my ($self, $to, $section) = @_; + my ($self, $target, $section) = @_; - unless (defined $to) { + unless (defined $target) { print "Using internal page link.\n" if $self->{verbose} > 2; - return $self->SUPER::resolve_pod_page_link($to, $section); + return $self->SUPER::resolve_pod_page_link($target, $section); } - # This ignores $to if $section is set. It would probably be better - # to check for "$to/$section" if both are set. - $self->{pod_search} = $section // $to; - find({ wanted => $self->pod_wanted }, $self->{source_root}); - delete $self->{pod_search}; - - if ($self->{pod_found}) { - my $pod_url = $self->{pod_found} =~ s/^$self->{source_root}/$self->{base_url}/r; - delete $self->{pod_found}; - print "Resolved local pod link $to" . ($section ? "/$section" : "") . " to $pod_url\n" if $self->{verbose} > 2; - return $self->encode_entities($pod_url); - } - - print "Using cpan pod link for $to" . ($section ? "/$section" : "") . "\n" if $self->{verbose} > 2; - return $self->SUPER::resolve_pod_page_link($to, $section); -} - -# This takes the first file found that matches. -sub pod_wanted { - my $self = shift; - return sub { - my $filename = $_; - my $path = $File::Find::name; - my $dir = $File::Find::dir; - - if ($self->{pod_found}) { - $File::Find::prune = 1; - return; + my $podFound; + for (keys %{ $self->{podFiles} }) { + if ($target eq $_ =~ s/lib:://r || $target eq basename($self->{podFiles}{$_}) =~ s/\.pod$//r) { + $podFound = + $self->{assert_html_ext} ? ($self->{podFiles}{$_} =~ s/\.(pm|pl|pod)$/.html/r) : $self->{podFiles}{$_}; + last; } + } - if (-d $path && $filename =~ /^(\.git|\.github|t|htdocs)$/) { - $File::Find::prune = 1; - return; - } + if ($podFound) { + my $pod_url = $self->encode_entities($podFound =~ s/^$self->{source_root}/$self->{base_url}/r) + . ($section ? '#' . $self->idify($self->encode_entities($section), 1) : ''); + print "Resolved local pod link for $target" . ($section ? "/$section" : '') . " to $pod_url\n" + if $self->{verbose} > 2; + return $pod_url; + } - if ($filename eq $self->{pod_search}) { - $self->{pod_found} = $self->{assert_html_ext} ? ($path =~ s/\.(pm|pl)$/.html/r) : $path; - $File::Find::prune = 1; - return; - } - }; + print "Using cpan pod link for $target" . ($section ? "/$section" : '') . "\n" if $self->{verbose} > 2; + return $self->SUPER::resolve_pod_page_link($target, $section); } # Trim spaces from the beginning of each line in code blocks. This attempts to diff --git a/templates/ContentGenerator/PODViewer.html.ep b/templates/ContentGenerator/PODViewer.html.ep index ea6a3c67cf..89804f5fa6 100644 --- a/templates/ContentGenerator/PODViewer.html.ep +++ b/templates/ContentGenerator/PODViewer.html.ep @@ -1,47 +1,31 @@ +% layout 'pod_viewer'; % title maketext('PG POD'); % - - -% - - - - <%= title %> - <%= stylesheet $c->url({ type => 'webwork', name => 'theme', file => 'bootstrap.css' }) =%> - - -% % my %section_names = ( - % doc => 'Documentation', - % lib => 'Libraries', - % macros => 'Macros' + % doc => maketext('Documentation'), + % lib => maketext('Libraries'), + % macros => maketext('Macros') % ); % - -
    -

    <%= title %>

    -
    - % for my $section (sort keys %$sections) { - % content_for toc => begin -
  • <%= $section_names{$section} %>
  • - % end - % content_for subjects => begin -

    <%= $section_names{$section} %>

    -
      - % for (@{ $sections->{$section} }) { -
    • - % my $link_name = $_; - % $link_name = $1 =~ s!/!::!gr if $link_name =~ m/^(.*)\.pm$/; - <%= link_to $link_name => url_for('pod_viewer', filePath => "$section/$_") =%> -
    • - % } -
    - % end - % } -
      <%= content 'toc' %>
    - <%= content 'subjects' =%> -
    - -% - +% for my $section (sort keys %$sections) { + % content_for toc => begin + <%= link_to $section_names{$section} => "#$section", class => 'nav-link' %> + % end + % content_for subjects => begin +

    <%= $section_names{$section} %>

    +
    + % for (@{ $sections->{$section} }) { + % my $link_name = $_; + % $link_name = $1 =~ s!/!::!gr if $link_name =~ m/^(.*)\.pm$/; + <%= link_to $link_name, 'pod_viewer', { filePath => "$section/$_" }, + class => 'list-group-item list-group-item-action' =%> + % } +
    + % end +% } +% content_for sidebar => begin + +% end +<%= content 'subjects' %> diff --git a/templates/ContentGenerator/PODViewer/POD.html.ep b/templates/ContentGenerator/PODViewer/POD.html.ep index 9060445835..dea890f00f 100644 --- a/templates/ContentGenerator/PODViewer/POD.html.ep +++ b/templates/ContentGenerator/PODViewer/POD.html.ep @@ -1,35 +1,24 @@ +% layout 'pod_viewer'; % my $title = $filePath =~ s!^[^/]*/!!r; % $title = $1 =~ s!/!::!gr if $title =~ m/^(.*)\.pm$/; +% title $title; % - - -% - - - - <%= $title %> - <%= stylesheet $c->url({ type => 'webwork', name => 'theme', file => 'bootstrap.css' }) =%> - <%= stylesheet $c->url({ type => 'webwork', name => 'htdocs', file => 'js/PODViewer/podviewer.css' }) =%> - - -% - -
    -

    <%= $title %>

    -
    -
    <%= link_to "PG POD Home" => 'pod_index' %>
    -
    -
    - % if (stash('podHTML')) { - <%== stash('podHTML') =%> - % } elsif (stash('podError')) { - <%= maketext('Error generating POD for file [_1]: [_2]', $filePath, stash('podError')) =%> - % } else { - <%= maketext('Macro file [_1] not found.', $filePath) =%> +% content_for sidebar => begin +
    -
    - + + +% end % - +% if (stash('podHTML')) { + <%== stash('podHTML') =%> +% } elsif (stash('podError')) { + <%= maketext('Error generating POD for file [_1]: [_2]', $filePath, stash('podError')) =%> +% } else { + <%= maketext('Macro file [_1] not found.', $filePath) =%> +% } diff --git a/templates/layouts/pod_viewer.html.ep b/templates/layouts/pod_viewer.html.ep new file mode 100644 index 0000000000..f308805333 --- /dev/null +++ b/templates/layouts/pod_viewer.html.ep @@ -0,0 +1,49 @@ + + +% + + + + <%= title %> + <%= stylesheet $c->url({ type => 'webwork', name => 'theme', file => 'bootstrap.css' }) =%> + <%= stylesheet $c->url({ type => 'webwork', name => 'htdocs', file => 'js/PODViewer/podviewer.css' }) =%> + <%= javascript $c->url({ + type => 'webwork', name => 'htdocs', + file => 'node_modules/bootstrap/dist/js/bootstrap.bundle.min.js' + }), defer => undef =%> + <%= javascript $c->url({ type => 'webwork', name => 'htdocs', file => 'js/PODViewer/podviewer.js' }), + defer => undef =%> + + +% + + + +
    +
    + <%= content =%> +
    +
    + +% + From 609ef2616efdcde5bbdd8799a1dcdccebb8cda4a Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Thu, 22 Jun 2023 23:02:27 -0700 Subject: [PATCH 054/549] LTI 1.1 override protocol and domain only for OAuth --- conf/authen_LTI_1_1.conf.dist | 6 ++++++ lib/WeBWorK/Authen/LTIAdvanced.pm | 9 ++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/conf/authen_LTI_1_1.conf.dist b/conf/authen_LTI_1_1.conf.dist index 89e6b0a7c0..2353b66a28 100644 --- a/conf/authen_LTI_1_1.conf.dist +++ b/conf/authen_LTI_1_1.conf.dist @@ -134,6 +134,12 @@ $LTI{v1p1}{NonceLifeTime} = 60; # in seconds # does not match the path that ends up in the webwork page. $LTI{v1p1}{OverrideSiteURL} = ''; +# This is like $LTI{v1p1}{OverrideSiteURL}, except that you only declare the protocol and domain +# to replace and leave the rest of a URL alone. If somehow both are set in the config chain, +# $LTI{v1p1}{OverrideSiteURL} is used, without being modified by the below. +$LTI{v1p1}{OverrideSiteProtocolDomain} = ''; +#$LTI{v1p1}{OverrideSiteProtocolDomain} = 'https://vmwebwork42.myschool.edu'; + ################################################################################################ # LTI 1.1 LMS Roles Mapped to WeBWorK Roles ################################################################################################ diff --git a/lib/WeBWorK/Authen/LTIAdvanced.pm b/lib/WeBWorK/Authen/LTIAdvanced.pm index 64ff141764..c7e7308c47 100644 --- a/lib/WeBWorK/Authen/LTIAdvanced.pm +++ b/lib/WeBWorK/Authen/LTIAdvanced.pm @@ -28,6 +28,7 @@ use warnings; use Carp; use DBI; +use URI; use URI::Escape; use Net::OAuth; @@ -455,7 +456,13 @@ sub authenticate { # We need to provide the request URL when verifying the OAuth request. # We use the url request by default, but also allow it to be overriden - my $path = $ce->{LTI}{v1p1}{OverrideSiteURL} || ($c->url_for->to_abs =~ s|/?$|/|r); + my $url = URI->new($c->url_for->to_abs); + if ($ce->{LTI}{v1p1}{OverrideSiteProtocolDomain}) { + my $override = URI->new($ce->{LTI}{v1p1}{OverrideSiteProtocolDomain}); + $url->scheme($override->scheme()); + $url->host($override->host()); + } + my $path = $ce->{LTI}{v1p1}{OverrideSiteURL} || ($url =~ s|/?$|/|r); if ($ce->{debug_lti_parameters}) { warn "The following path was reconstructed by WeBWorK. It should match the path in the LMS:\n"; From cff7d3e5a1e60d6924b9cffddc6b518bd7385a6e Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Sun, 25 Jun 2023 19:30:44 -0700 Subject: [PATCH 055/549] use Mojo::URL not URI module --- lib/WeBWorK/Authen/LTIAdvanced.pm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/WeBWorK/Authen/LTIAdvanced.pm b/lib/WeBWorK/Authen/LTIAdvanced.pm index c7e7308c47..025af3e574 100644 --- a/lib/WeBWorK/Authen/LTIAdvanced.pm +++ b/lib/WeBWorK/Authen/LTIAdvanced.pm @@ -28,7 +28,7 @@ use warnings; use Carp; use DBI; -use URI; +use Mojo::URL; use URI::Escape; use Net::OAuth; @@ -455,12 +455,12 @@ sub authenticate { my $requestHash = \%request_hash; # We need to provide the request URL when verifying the OAuth request. - # We use the url request by default, but also allow it to be overriden - my $url = URI->new($c->url_for->to_abs); + # We use the url request by default, but also allow it to be overridden + my $url = $c->url_for->to_abs; if ($ce->{LTI}{v1p1}{OverrideSiteProtocolDomain}) { - my $override = URI->new($ce->{LTI}{v1p1}{OverrideSiteProtocolDomain}); - $url->scheme($override->scheme()); - $url->host($override->host()); + my $override = Mojo::URL->new($ce->{LTI}{v1p1}{OverrideSiteProtocolDomain}); + $url->scheme($override->scheme); + $url->host($override->host); } my $path = $ce->{LTI}{v1p1}{OverrideSiteURL} || ($url =~ s|/?$|/|r); From 9fcf2932f9f14f80a14dfff86b84a56b3bb239ea Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Sun, 25 Jun 2023 19:34:43 -0700 Subject: [PATCH 056/549] typos --- lib/Mojolicious/WeBWorK.pm | 4 ++-- lib/WeBWorK/ContentGenerator.pm | 4 ++-- lib/WeBWorK/Utils.pm | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/Mojolicious/WeBWorK.pm b/lib/Mojolicious/WeBWorK.pm index 6697173f5d..9d09a51f7d 100644 --- a/lib/Mojolicious/WeBWorK.pm +++ b/lib/Mojolicious/WeBWorK.pm @@ -91,8 +91,8 @@ sub startup ($app) { # Helpers - # This replaces the previous Apache2::RequestUtil method that was overriden in the WeBWorK::Request module to return - # the empty string for '/'. + # This replaces the previous Apache2::RequestUtil method that was overridden in + # the WeBWorK::Request module to return the empty string for '/'. $app->helper(location => sub ($) { return $webwork_url eq '/' ? '' : $webwork_url }); $app->helper(server_root_url => sub ($) { return $server_root_url; }); diff --git a/lib/WeBWorK/ContentGenerator.pm b/lib/WeBWorK/ContentGenerator.pm index 651ddba354..0e356162e9 100644 --- a/lib/WeBWorK/ContentGenerator.pm +++ b/lib/WeBWorK/ContentGenerator.pm @@ -283,7 +283,7 @@ sub addbadmessage ($c, $message) { =item prepare_activity_entry() Prepare a string to be sent to the activity log, if it is turned on. -This can be overriden by different modules. +This can be overridden by different modules. =cut @@ -787,7 +787,7 @@ sub url ($c, $args) { =head2 Template conditions Template condition methods are called in the template. If a method is defined -here or overriden in the instantiated subclass, it is invoked. +here or overridden in the instantiated subclass, it is invoked. The following conditions are currently defined: diff --git a/lib/WeBWorK/Utils.pm b/lib/WeBWorK/Utils.pm index a97af1281c..610f97fa9d 100644 --- a/lib/WeBWorK/Utils.pm +++ b/lib/WeBWorK/Utils.pm @@ -619,7 +619,7 @@ sub parseDateTime($;$) { } else { #warn "\t\$zone=$zone is invalid according to DateTime::TimeZone, so we will attempt to treat the date/time as UTC and then apply an offset for the zone $zone.\n"; $tz_to_use = "UTC"; - # When the offset approach fails, we will overriden again and use $display_tz instead + # When the offset approach fails, we will override again and use $display_tz instead } } else { #warn "\t\$zone not supplied, using \$display_tz\n"; From d848349fe6db47508c91d4b4a1977aa044a547ba Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Mon, 26 Jun 2023 22:39:49 -0400 Subject: [PATCH 057/549] Make messages dismissible and PG editor tmp edits more clear Any message that is added by the ContentGenerator addgoodmessage or addbadmessage methods is now dismissible. There is a close button to the right that can be clicked to remove the message from the page. In additiona, a hidden button is also added to the end of the page. If there are any dismissible messages, then the button is shown by javascript, and if clicked all of the dismissible messages are removed from the page (and the button hidden again). This is a convenience for removing all of those messages at once if there are many of them. In the PG editor, when a temporary file is created by javascript the file name is changed to the temporary file name in the "Editing ..." statement and the `temporaryFile` class is added which gives the text the orange temporary file color. Furthermore, the "Editing ..." statement is now shown both above and below the codemirror editor in the page. This makes it more clear that a temporary file is being edited. Also fix a bug introduced by #1918. The PG editor revert form needs to be shown for course information files as well. Otherwise there is no way to revert to the original file once a temporary file is created other than saving the file. @somiaj: What was your rationale for doing this? Also add site nav sub links for set headers and the course information file. Now that the problem editor is directly in the site nav that link is shown as active when editing one of these files. That is confusing because if you click on that "active" link it does not open the page you are currently viewing that is editing one of these files. Instead it opens the editor with a new problem. --- htdocs/js/PGProblemEditor/pgproblemeditor.js | 17 +++++++- htdocs/themes/math4/math4.js | 10 +++++ htdocs/themes/math4/math4.scss | 1 - htdocs/themes/math4/system.html.ep | 3 ++ lib/WeBWorK/ContentGenerator.pm | 30 ++++++++++++- .../Instructor/PGProblemEditor.pm | 2 +- templates/ContentGenerator/Base/links.html.ep | 36 +++++++++++++++- .../Instructor/PGProblemEditor.html.ep | 42 ++++++++++++------- .../PGProblemEditor/revert_form.html.ep | 3 -- 9 files changed, 118 insertions(+), 26 deletions(-) diff --git a/htdocs/js/PGProblemEditor/pgproblemeditor.js b/htdocs/js/PGProblemEditor/pgproblemeditor.js index 18b6d36459..b0dedbf798 100644 --- a/htdocs/js/PGProblemEditor/pgproblemeditor.js +++ b/htdocs/js/PGProblemEditor/pgproblemeditor.js @@ -54,7 +54,16 @@ fetch(webserviceURL, { method: 'post', mode: 'same-origin', body: new URLSearchParams(request_object) }) .then((response) => response.json()) - .then((data) => showMessage(data.server_response, data.result_data)) + .then((data) => { + showMessage(data.server_response, data.result_data); + if (data.result_data) { + // Add the temporary file coloring and change the current file to the saved file. + document.querySelectorAll('.set-file-info').forEach((nfo) => nfo.classList.add('temporaryFile')); + for (const currentFile of document.querySelectorAll('.current-file')) { + currentFile.textContent = currentFile.dataset.tmpFile; + } + } + }) .catch((err) => showMessage(`Error saving temporary file: ${err?.message ?? err}`)); }; @@ -106,6 +115,12 @@ revertRadio.checked = true; } + // Add the temporary file coloring and change the current file to the saved file. + document.querySelectorAll('.set-file-info').forEach((nfo) => nfo.classList.add('temporaryFile')); + for (const currentFile of document.querySelectorAll('.current-file')) { + currentFile.textContent = currentFile.dataset.tmpFile; + } + if (editorForm) editorForm.target = 'WW_View'; } else { e.preventDefault(); diff --git a/htdocs/themes/math4/math4.js b/htdocs/themes/math4/math4.js index 48ea72a8b0..7789d12de3 100644 --- a/htdocs/themes/math4/math4.js +++ b/htdocs/themes/math4/math4.js @@ -120,6 +120,16 @@ const codeshards = document.querySelectorAll('.codeshard'); if (codeshards.length == 1) codeshards[0].setAttribute('aria-label', 'answer'); + const messages = document.querySelectorAll('#message .alert-dismissible, #message_bottom .alert-dismissible'); + if (messages.length) { + const dismissBtn = document.getElementById('dismiss-messages-btn'); + dismissBtn?.classList.remove('d-none'); + dismissBtn?.addEventListener('click', () => { + messages.forEach((message) => message.remove()); + dismissBtn.classList.add('d-none'); + }); + } + // Accessibility // Present the contents of the data-alt attribute as alternative content for screen reader users. // The icon should be formatted as diff --git a/htdocs/themes/math4/math4.scss b/htdocs/themes/math4/math4.scss index c93771cced..1dbb542ec1 100644 --- a/htdocs/themes/math4/math4.scss +++ b/htdocs/themes/math4/math4.scss @@ -447,7 +447,6 @@ h2.page-title { /* Message section */ .message:not(:empty) { - display: inline-block; margin-bottom: 0.5rem; } diff --git a/htdocs/themes/math4/system.html.ep b/htdocs/themes/math4/system.html.ep index fdb3b26dc4..cb792ef0fa 100644 --- a/htdocs/themes/math4/system.html.ep +++ b/htdocs/themes/math4/system.html.ep @@ -164,6 +164,9 @@ % } % if ($c->can('message')) {
    <%= $c->message %>
    + % } % % # Footer diff --git a/lib/WeBWorK/ContentGenerator.pm b/lib/WeBWorK/ContentGenerator.pm index 0e356162e9..6885677d4d 100644 --- a/lib/WeBWorK/ContentGenerator.pm +++ b/lib/WeBWorK/ContentGenerator.pm @@ -264,7 +264,20 @@ message() template escape handler. =cut sub addgoodmessage ($c, $message) { - $c->addmessage($c->tag('p', class => 'alert alert-success p-1 my-2', $c->b($message))); + $c->addmessage($c->tag( + 'p', + class => 'alert alert-success alert-dismissible ps-1 py-1 my-2', + $c->c( + $message, + $c->tag( + 'button', + type => 'button', + class => 'btn-close p-2', + data => { bs_dismiss => 'alert' }, + 'aria-label' => $c->maketext('Dismiss') + ) + )->join('') + )); return; } @@ -276,7 +289,20 @@ message() template escape handler. =cut sub addbadmessage ($c, $message) { - $c->addmessage($c->tag('p', class => 'alert alert-danger p-1 my-2', $c->b($message))); + $c->addmessage($c->tag( + 'p', + class => 'alert alert-danger alert-dismissible ps-1 py-1 my-2', + $c->c( + $message, + $c->tag( + 'button', + type => 'button', + class => 'btn-close p-2', + data => { bs_dismiss => 'alert' }, + 'aria-label' => $c->maketext('Dismiss') + ) + )->join('') + )); return; } diff --git a/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm b/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm index e8d8a2b62e..a6062f5fb4 100644 --- a/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm +++ b/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm @@ -1211,7 +1211,7 @@ sub revert_handler ($c) { } # Determine revert action - my $revertType = $c->param('action.revert.type') || 'do_not_revert'; + my $revertType = $c->param('action.revert.type') // ''; if ($revertType eq 'revert') { $c->{inputFilePath} = $c->{editFilePath}; diff --git a/templates/ContentGenerator/Base/links.html.ep b/templates/ContentGenerator/Base/links.html.ep index 35bf85db76..d0356369dc 100644 --- a/templates/ContentGenerator/Base/links.html.ep +++ b/templates/ContentGenerator/Base/links.html.ep @@ -135,9 +135,11 @@ % } - % # Problem Editor - + % if (defined $prettySetID && defined $problemID) { + % } elsif (defined $prettySetID && param('file_type') && param('file_type') =~ /^(set|hardcopy)_header$/) { + + % } elsif (param('file_type') && param('file_type') eq 'course_info') { + % } % # Library Browser diff --git a/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep b/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep index 780674f320..3819a4d645 100644 --- a/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep +++ b/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep @@ -25,7 +25,7 @@ % } % % my %titles = ( - % blank_problem => x('Editing new problem template.'), + % blank_problem => x('Editing new problem template "[_1]".'), % set_header => x('Editing set header file "[_1]".'), % hardcopy_header => x('Editing hardcopy header file "[_1]".'), % course_info => x('Editing course information file "[_1]".'), @@ -36,23 +36,32 @@ % my $setName = stash('setID') // ''; % my $fullSetName = $c->{fullSetID} // $setName; % -% my $header = begin - - <%== $c->{file_type} eq 'problem' - ? maketext( - 'Editing problem [_1] of set [_2] in file "[_3]".', - $c->{prettyProblemNumber}, - tag('span', dir => 'ltr', format_set_name_display($fullSetName)), - tag('span', dir => 'ltr', $c->shortPath($c->{inputFilePath})) - ) - : maketext($titles{ $c->{file_type} }, $c->shortPath($c->{inputFilePath})) =%> - +% my $fileInfo = begin +
    + <%= tag 'div', class => 'set-file-info' . ($c->isTempEditFilePath($c->{inputFilePath}) ? ' temporaryFile' : ''), + begin =%> + + <%== $c->{file_type} eq 'problem' + ? maketext( + 'Editing problem [_1] of set [_2] in file "[_3]".', + $c->{prettyProblemNumber}, + tag('span', dir => 'ltr', format_set_name_display($fullSetName)), + tag('span', dir => 'ltr', class => 'current-file', + data => { tmp_file => $c->shortPath($c->{tempFilePath}) }, + $c->shortPath($c->{inputFilePath})) + ) + : maketext( + $titles{ $c->{file_type} }, + tag('span', dir => 'ltr', class => 'current-file', + data => { tmp_file => $c->shortPath($c->{tempFilePath}) }, + $c->shortPath($c->{inputFilePath})) + ) =%> + + <% end =%> +
    % end -% $header = $c->isTempEditFilePath($c->{inputFilePath}) - % ? tag('div', class => 'temporaryFile', $header) # Use colors if this is a temporary file. - % : $header->(); +<%= $fileInfo->() %> % -
    <%= $header %>
    <%= form_for current_route, method => 'POST', id => 'editor', name => 'editor', enctype => 'application/x-www-form-urlencoded', class => 'col-12', begin =%> <%= $c->hidden_authen_fields =%> @@ -148,6 +157,7 @@
    <%= generate_codemirror_controls_html($c) =%> + <%= $fileInfo->() %> % % # Output action forms % my $default_choice; diff --git a/templates/ContentGenerator/Instructor/PGProblemEditor/revert_form.html.ep b/templates/ContentGenerator/Instructor/PGProblemEditor/revert_form.html.ep index 7e40822797..e96f1f7d89 100644 --- a/templates/ContentGenerator/Instructor/PGProblemEditor/revert_form.html.ep +++ b/templates/ContentGenerator/Instructor/PGProblemEditor/revert_form.html.ep @@ -1,6 +1,3 @@ -% # Don't show the revert form when editing an existing course info file. -% next if $c->{file_type} eq 'course_info'; -% % if (!-r $c->{editFilePath}) { <%== maketext( 'Error: The original file [_1] cannot be read.', From 793874709ac46420b49d0e178ccb87d02e1e3f3c Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Wed, 28 Jun 2023 16:04:37 -0400 Subject: [PATCH 058/549] Add the fade and show classes to the alerts to get animation when they are dismissed. Also make sure that the dismiss button is removed when all alerts have been dismissed. --- htdocs/themes/math4/math4.js | 16 ++++++++++++---- lib/WeBWorK/ContentGenerator.pm | 4 ++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/htdocs/themes/math4/math4.js b/htdocs/themes/math4/math4.js index 7789d12de3..b180770fc9 100644 --- a/htdocs/themes/math4/math4.js +++ b/htdocs/themes/math4/math4.js @@ -124,10 +124,18 @@ if (messages.length) { const dismissBtn = document.getElementById('dismiss-messages-btn'); dismissBtn?.classList.remove('d-none'); - dismissBtn?.addEventListener('click', () => { - messages.forEach((message) => message.remove()); - dismissBtn.classList.add('d-none'); - }); + + // Hide the dismiss button when the last alert is dismissed. + for (const message of messages) { + message.addEventListener('closed.bs.alert', () => { + if (!document.querySelector('#message .alert-dismissible, #message_bottom .alert-dismissible')) + dismissBtn.remove(); + }, { once: true }); + } + + dismissBtn?.addEventListener('click', () => + messages.forEach((message) => bootstrap.Alert.getOrCreateInstance(message)?.close()) + ); } // Accessibility diff --git a/lib/WeBWorK/ContentGenerator.pm b/lib/WeBWorK/ContentGenerator.pm index 6885677d4d..acf4218c20 100644 --- a/lib/WeBWorK/ContentGenerator.pm +++ b/lib/WeBWorK/ContentGenerator.pm @@ -266,7 +266,7 @@ message() template escape handler. sub addgoodmessage ($c, $message) { $c->addmessage($c->tag( 'p', - class => 'alert alert-success alert-dismissible ps-1 py-1 my-2', + class => 'alert alert-success alert-dismissible fade show ps-1 py-1 my-2', $c->c( $message, $c->tag( @@ -291,7 +291,7 @@ message() template escape handler. sub addbadmessage ($c, $message) { $c->addmessage($c->tag( 'p', - class => 'alert alert-danger alert-dismissible ps-1 py-1 my-2', + class => 'alert alert-danger alert-dismissible fade show ps-1 py-1 my-2', $c->c( $message, $c->tag( From f247722b8bdf82b5e34c8ee45673dee969bed5cf Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Wed, 28 Jun 2023 16:15:08 -0400 Subject: [PATCH 059/549] Tweak styles a bit. --- htdocs/themes/math4/math4.scss | 2 +- htdocs/themes/math4/system.html.ep | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/htdocs/themes/math4/math4.scss b/htdocs/themes/math4/math4.scss index 1dbb542ec1..648b8322bb 100644 --- a/htdocs/themes/math4/math4.scss +++ b/htdocs/themes/math4/math4.scss @@ -447,7 +447,7 @@ h2.page-title { /* Message section */ .message:not(:empty) { - margin-bottom: 0.5rem; + display: inline-block; } .font-visible { font-weight: bold; } diff --git a/htdocs/themes/math4/system.html.ep b/htdocs/themes/math4/system.html.ep index cb792ef0fa..e2e281d1b3 100644 --- a/htdocs/themes/math4/system.html.ep +++ b/htdocs/themes/math4/system.html.ep @@ -164,9 +164,11 @@ % } % if ($c->can('message')) {
    <%= $c->message %>
    - +
    + +
    % } % % # Footer From df5f1eb4ebc1c1bcf6386f9eed849654af1d0a31 Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Thu, 29 Jun 2023 17:51:24 -0500 Subject: [PATCH 060/549] Remove margins on all elements added in `addmessage` calls. The `.message` divs in the main layout (system.html.ep) now is display flex with a column flex direction and a 0.25rem gap. Margins are added to the bottom of that div (when it is non empty). Also remplace more of the `addmessage` calls with `addgooodmessage` or `addbadmessage` calls. --- htdocs/themes/math4/math4.scss | 9 +- htdocs/themes/math4/system.html.ep | 2 +- lib/WeBWorK/ContentGenerator.pm | 4 +- lib/WeBWorK/ContentGenerator/CourseAdmin.pm | 4 +- .../Instructor/AchievementList.pm | 88 +++----- .../Instructor/AchievementUserEditor.pm | 20 +- .../Instructor/ProblemGrader.pm | 6 +- .../Instructor/ProblemSetList.pm | 192 ++++++------------ lib/WeBWorK/ContentGenerator/Problem.pm | 6 +- lib/WeBWorK/ContentGenerator/ProblemSet.pm | 8 +- lib/WeBWorK/ContentGenerator/ProblemSets.pm | 4 +- .../Instructor/PGProblemEditor.html.ep | 2 +- 12 files changed, 117 insertions(+), 228 deletions(-) diff --git a/htdocs/themes/math4/math4.scss b/htdocs/themes/math4/math4.scss index 648b8322bb..70fd6de6f6 100644 --- a/htdocs/themes/math4/math4.scss +++ b/htdocs/themes/math4/math4.scss @@ -447,7 +447,14 @@ h2.page-title { /* Message section */ .message:not(:empty) { - display: inline-block; + display: inline-flex; + flex-direction: column; + gap: 0.25rem; + margin: 0 0 0.5rem; + + p { + margin: 0; + } } .font-visible { font-weight: bold; } diff --git a/htdocs/themes/math4/system.html.ep b/htdocs/themes/math4/system.html.ep index e2e281d1b3..8411ff82fa 100644 --- a/htdocs/themes/math4/system.html.ep +++ b/htdocs/themes/math4/system.html.ep @@ -164,7 +164,7 @@ % } % if ($c->can('message')) {
    <%= $c->message %>
    -
    diff --git a/templates/ContentGenerator/Instructor/AchievementList/default_table.html.ep b/templates/ContentGenerator/Instructor/AchievementList/default_table.html.ep index 99d5176735..c8729b5062 100644 --- a/templates/ContentGenerator/Instructor/AchievementList/default_table.html.ep +++ b/templates/ContentGenerator/Instructor/AchievementList/default_table.html.ep @@ -56,10 +56,13 @@ ) =%> - % my $templateText = $_->email_template ? maketext('Edit Email Template') : maketext('Enable Email Notification'); - <%= link_to $templateText => $c->systemLink( + <%= link_to $c->systemLink( url_for('instructor_achievement_notification', achievementID => $achievement_id), - ) =%> + ), begin =%> + <%= $_->email_template + ? maketext('Edit Email Template') + : maketext('Enable Email Notification') =%> + <% end =%> <%= link_to maketext('Edit Evaluator') => $c->systemLink( url_for('instructor_achievement_editor', achievementID => $achievement_id), diff --git a/templates/ContentGenerator/Instructor/AchievementNotificationEditor/disable_form.html.ep b/templates/ContentGenerator/Instructor/AchievementNotificationEditor/disable_form.html.ep index 15af3f5f15..bd89d07667 100644 --- a/templates/ContentGenerator/Instructor/AchievementNotificationEditor/disable_form.html.ep +++ b/templates/ContentGenerator/Instructor/AchievementNotificationEditor/disable_form.html.ep @@ -1,2 +1,2 @@ % last unless ($c->{achievement}->email_template); -<%== maketext('Disable email notifications for [_1]', tag('b', $c->{achievementID})) %> +<%== maketext('Disable email notifications for [_1]', tag('b', $achievementID)) %> diff --git a/templates/ContentGenerator/Instructor/AchievementNotificationEditor/save_as_form.html.ep b/templates/ContentGenerator/Instructor/AchievementNotificationEditor/save_as_form.html.ep index ae821d64eb..67dba2f394 100644 --- a/templates/ContentGenerator/Instructor/AchievementNotificationEditor/save_as_form.html.ep +++ b/templates/ContentGenerator/Instructor/AchievementNotificationEditor/save_as_form.html.ep @@ -1,5 +1,3 @@ -% # There are three things you can do with a new achievement editor. -% # You can replace the current achievement, use it in a new achievement, or not use it at all.
    <%= label_for 'action.save_as.target_file_id' => maketext('Save as:'), class => 'col-form-label col-auto' =%> @@ -13,7 +11,7 @@ <%= radio_button 'action.save_as.saveMode' => 'use_in_current', id => 'action.save_as.saveMode.use_in_current', class => 'form-check-input' =%> <%= label_for 'action.save_as.saveMode.use_in_current', class => 'form-check-label', begin =%> - <%== maketext('Use in achievement [_1]', tag('b', $c->{achievementID})) =%> + <%== maketext('Use in achievement [_1]', tag('b', $achievementID)) =%> <% end =%>
    From bd923234930eed153daf14080d44a353063f4fb5 Mon Sep 17 00:00:00 2001 From: "K. Andrew Parker" Date: Mon, 9 Oct 2023 15:45:34 -0400 Subject: [PATCH 163/549] check answers for determination of new version --- lib/WeBWorK/ContentGenerator/ShowMeAnother.pm | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm b/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm index b48e5b028d..a18e87dd09 100644 --- a/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm +++ b/lib/WeBWorK/ContentGenerator/ShowMeAnother.pm @@ -137,7 +137,7 @@ async sub pre_header_initialize ($c) { showHints => 0, showSolutions => 0, refreshMath2img => 0, - processAnswers => 0, + processAnswers => 1, permissionLevel => $db->getPermissionLevel($userName)->permission, effectivePermissionLevel => $db->getPermissionLevel($effectiveUserName)->permission, useMathQuill => $c->{will}{useMathQuill}, @@ -173,7 +173,7 @@ async sub pre_header_initialize ($c) { showHints => 0, showSolutions => 0, refreshMath2img => 0, - processAnswers => 0, + processAnswers => 1, permissionLevel => $db->getPermissionLevel($userName)->permission, effectivePermissionLevel => $db->getPermissionLevel($effectiveUserName)->permission, useMathQuill => $c->{will}{useMathQuill}, @@ -188,7 +188,9 @@ async sub pre_header_initialize ($c) { } # check to see if we've found a new version - if ($new_body_text ne $orig_body_text) { + if ($new_body_text ne $orig_body_text + || have_different_answers($showMeAnotherNewPG, $showMeAnotherOriginalPG)) + { # if we've found a new version, then # increment the counter detailing the number of times showMeAnother has been used # unless we're trying to check answers from the showMeAnother screen @@ -232,7 +234,7 @@ async sub pre_header_initialize ($c) { showHints => 0, showSolutions => 0, refreshMath2img => 0, - processAnswers => 0, + processAnswers => 1, permissionLevel => $db->getPermissionLevel($userName)->permission, effectivePermissionLevel => $db->getPermissionLevel($effectiveUserName)->permission, useMathQuill => $c->{will}{useMathQuill}, @@ -594,4 +596,12 @@ sub output_hidden_info ($c) { return ''; } +# Checks the PG object for two different seeds of the same pg file +sub have_different_answers ($pg1, $pg2) { + for (keys %{ $pg1->{answers} }) { + return 1 if ($pg1->{answers}{$_}{correct_ans} ne $pg2->{answers}{$_}{correct_ans}); + } + return 0; +} + 1; From 63f107ff75fbebc74f2257183e87076325d7eeb9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 7 Oct 2023 17:06:28 +0000 Subject: [PATCH 164/549] Bump postcss from 8.4.21 to 8.4.31 in /htdocs Bumps [postcss](https://github.com/postcss/postcss) from 8.4.21 to 8.4.31. - [Release notes](https://github.com/postcss/postcss/releases) - [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/postcss/postcss/compare/8.4.21...8.4.31) --- updated-dependencies: - dependency-name: postcss dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- htdocs/package-lock.json | 40 +++++++++++++++++++++++++--------------- htdocs/package.json | 2 +- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/htdocs/package-lock.json b/htdocs/package-lock.json index 8e81a4a6ea..3af2590330 100644 --- a/htdocs/package-lock.json +++ b/htdocs/package-lock.json @@ -23,7 +23,7 @@ "autoprefixer": "^10.4.13", "chokidar": "^3.5.3", "cssnano": "^6.0.0", - "postcss": "^8.4.21", + "postcss": "^8.4.31", "rtlcss": "^4.0.0", "sass": "^1.57.1", "terser": "^5.16.1", @@ -837,10 +837,16 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -903,9 +909,9 @@ } }, "node_modules/postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, "funding": [ { @@ -915,10 +921,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -2198,9 +2208,9 @@ "dev": true }, "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "dev": true }, "node-releases": { @@ -2243,12 +2253,12 @@ "dev": true }, "postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, "requires": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } diff --git a/htdocs/package.json b/htdocs/package.json index af460d4ef8..c5dd1673b3 100644 --- a/htdocs/package.json +++ b/htdocs/package.json @@ -27,7 +27,7 @@ "autoprefixer": "^10.4.13", "chokidar": "^3.5.3", "cssnano": "^6.0.0", - "postcss": "^8.4.21", + "postcss": "^8.4.31", "rtlcss": "^4.0.0", "sass": "^1.57.1", "terser": "^5.16.1", From 12cf32ba8fda228326e6b9ebf81a8b6b22731101 Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Wed, 11 Oct 2023 15:49:30 -0500 Subject: [PATCH 165/549] Update caniuse-lite to defer the browserslist-db update warning. --- htdocs/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/htdocs/package-lock.json b/htdocs/package-lock.json index 3af2590330..2f3dc8c4ba 100644 --- a/htdocs/package-lock.json +++ b/htdocs/package-lock.json @@ -290,9 +290,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001517", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz", - "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==", + "version": "1.0.30001547", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001547.tgz", + "integrity": "sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA==", "dev": true, "funding": [ { @@ -1823,9 +1823,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001517", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz", - "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==", + "version": "1.0.30001547", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001547.tgz", + "integrity": "sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA==", "dev": true }, "chokidar": { From 0e9c9f9a3b794af1d0868dc1f12b92511cf7bd53 Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Fri, 25 Aug 2023 21:21:30 -0500 Subject: [PATCH 166/549] Improved file manager button states. The buttons that can only act on one file are now disabled when multiple files are selected. Only the "Delete" and "Make Archive" buttons can act on multiples files. The type of file (regular, directory, or link) is stored in a data attribute for each option in the `files` select. The javascript also takes this into consideration and is disabled for a file type a button can not act on. The "View", "Edit", "Download", and "Copy" buttons can not act on symbolic links. The "Edit", "Download", and "Copy" buttons can not act on directories. --- htdocs/js/FileManager/filemanager.js | 36 ++++++++++++------- .../Instructor/FileManager.pm | 18 +++++++--- 2 files changed, 38 insertions(+), 16 deletions(-) diff --git a/htdocs/js/FileManager/filemanager.js b/htdocs/js/FileManager/filemanager.js index 02c3a50aa8..db19ed9537 100644 --- a/htdocs/js/FileManager/filemanager.js +++ b/htdocs/js/FileManager/filemanager.js @@ -18,25 +18,37 @@ form.querySelector('input[name="name"]')?.focus(); } - const fileActionButtons = ['View', 'Edit', 'Download', 'Rename', 'Copy', 'Delete', 'MakeArchive'].map((buttonId) => - document.getElementById(buttonId) - ); + // The bits for types from least to most significant digit are set in the directoryListing method of + // lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm to mean a file is a + // link, directory, regular file, text file, or image file. + const fileActionButtons = [ + { id: 'View', types: 0b11010, multiple: 0 }, + { id: 'Edit', types: 0b01000, multiple: 0 }, + { id: 'Download', types: 0b100, multiple: 0 }, + { id: 'Rename', types: 0b111, multiple: 0 }, + { id: 'Copy', types: 0b100, multiple: 0 }, + { id: 'Delete', types: 0b111, multiple: 1 }, + { id: 'MakeArchive', types: 0b111, multiple: 1 } + ]; + fileActionButtons.map((button) => (button.elt = document.getElementById(button.id))); const archiveButton = document.getElementById('MakeArchive'); const checkFiles = () => { - const state = files.selectedIndex < 0; + const selectedFiles = files.selectedOptions; for (const button of fileActionButtons) { - if (button) button.disabled = state; + if (!button.elt) continue; + if (selectedFiles.length) { + if (selectedFiles.length == 1 && !button.multiple) + button.elt.disabled = !(button.types & selectedFiles[0].dataset.type); + else button.elt.disabled = !button.multiple; + } else { + button.elt.disabled = true; + } } - if (archiveButton && !state) { - const numSelected = files.querySelectorAll('option:checked').length; - if ( - numSelected === 0 || - numSelected > 1 || - !/\.(tar|tar\.gz|tgz|zip)$/.test(files.children[files.selectedIndex].value) - ) + if (archiveButton && selectedFiles.length) { + if (selectedFiles.length > 1 || !/\.(tar|tar\.gz|tgz|zip)$/.test(selectedFiles[0].value)) archiveButton.value = archiveButton.dataset.archiveText; else archiveButton.value = archiveButton.dataset.unarchiveText; } diff --git a/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm b/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm index 83b5ccaa1c..c9145b11a8 100644 --- a/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm +++ b/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm @@ -777,12 +777,22 @@ sub directoryListing ($c, $pwd) { my @names = sortByName(undef, grep {/^[^.]/} readDirectory($dir)); for my $name (@names) { unless ($name eq 'DATA') { #FIXME don't view the DATA directory - my $file = "$dir/$name"; + my $file = "$dir/$name"; + + my $type = 0; + $type |= 1 if -l $file; # Symbolic link + $type |= 2 if !-l $file && -d $file; # Directory + $type |= 4 if -f $file; # Regular file + $type |= 8 if -T $file; # Text file + $type |= 16 if $file =~ m/\.(gif|jpg|png)$/i; # Image file + my $label = $name; - $label .= '@' if (-l $file); - $label .= '/' if (-d $file && !-l $file); + $label .= '@' if $type & 1; + $label .= '/' if $type & 2; + $len = length($label) if length($label) > $len; - push(@values, [ $label => $name ]); + + push(@values, [ $label => $name, data => { type => $type } ]); } } if ($c->getFlag('dates')) { From b3b92c3aa103898d0b0f924c4df1bf1f3070df5b Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Sat, 26 Aug 2023 16:12:49 -0500 Subject: [PATCH 167/549] Editing a pg file from the file manager opens in the pg problem editor. There is also an little cleanup of a long line in templates/ContentGenerator/Base/links.html.ep. --- .../Instructor/FileManager.pm | 27 ++++++++++++++----- templates/ContentGenerator/Base/links.html.ep | 9 +++++-- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm b/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm index c9145b11a8..d5d480b530 100644 --- a/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm +++ b/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm @@ -79,6 +79,22 @@ sub pre_header_initialize ($c) { $c->{courseRoot} = $c->ce->{courseDirs}{root}; $c->{courseName} = $c->stash('courseID'); + if ($c->{pwd} && $action && $action eq 'Edit') { + my @files = $c->param('files'); + if (@files == 1 && $files[0] =~ /\.pg$/) { + my $file = "$c->{courseRoot}/$c->{pwd}/$files[0]"; + if (-f $file && -T $file) { + return $c->reply_with_redirect($c->systemLink( + $c->url_for('instructor_problem_editor'), + params => { + file_type => 'source_path_for_problem_file', + sourceFilePath => $file + } + )); + } + } + } + return; } @@ -176,16 +192,13 @@ sub View ($c) { # Edit a file sub Edit ($c) { my $filename = $c->getFile('edit'); - return '' unless $filename; - my $file = "$c->{courseRoot}/$c->{pwd}/$filename"; - my $userID = $c->param('user'); - my $ce = $c->ce; - my $authz = $c->authz; + return $c->Refresh unless $filename; + my $file = "$c->{courseRoot}/$c->{pwd}/$filename"; # If its a restricted file, dont allow the web editor to edit it unless that option has been set for the course. - for my $restrictedFile (@{ $ce->{uneditableCourseFiles} }) { + for my $restrictedFile (@{ $c->ce->{uneditableCourseFiles} }) { if (File::Spec->canonpath($file) eq File::Spec->canonpath("$c->{courseRoot}/$restrictedFile") - && !$authz->hasPermissions($userID, 'edit_restricted_files')) + && !$c->authz->hasPermissions($c->param('user'), 'edit_restricted_files')) { $c->addbadmessage($c->maketext('You do not have permission to edit this file.')); return $c->Refresh; diff --git a/templates/ContentGenerator/Base/links.html.ep b/templates/ContentGenerator/Base/links.html.ep index add6effaa7..ee3d9857b6 100644 --- a/templates/ContentGenerator/Base/links.html.ep +++ b/templates/ContentGenerator/Base/links.html.ep @@ -138,8 +138,13 @@ % } % # Problem Editor % if (defined $prettySetID && defined $problemID) {
    +
    diff --git a/lib/WeBWorK/ContentGenerator.pm b/lib/WeBWorK/ContentGenerator.pm index acf4218c20..05db3bd121 100644 --- a/lib/WeBWorK/ContentGenerator.pm +++ b/lib/WeBWorK/ContentGenerator.pm @@ -266,7 +266,7 @@ message() template escape handler. sub addgoodmessage ($c, $message) { $c->addmessage($c->tag( 'p', - class => 'alert alert-success alert-dismissible fade show ps-1 py-1 my-2', + class => 'alert alert-success alert-dismissible fade show ps-1 py-1', $c->c( $message, $c->tag( @@ -291,7 +291,7 @@ message() template escape handler. sub addbadmessage ($c, $message) { $c->addmessage($c->tag( 'p', - class => 'alert alert-danger alert-dismissible fade show ps-1 py-1 my-2', + class => 'alert alert-danger alert-dismissible fade show ps-1 py-1', $c->c( $message, $c->tag( diff --git a/lib/WeBWorK/ContentGenerator/CourseAdmin.pm b/lib/WeBWorK/ContentGenerator/CourseAdmin.pm index 400c146621..fce05c04a7 100644 --- a/lib/WeBWorK/ContentGenerator/CourseAdmin.pm +++ b/lib/WeBWorK/ContentGenerator/CourseAdmin.pm @@ -44,8 +44,10 @@ sub pre_header_initialize ($c) { return unless $authz->hasPermissions($user, 'create_and_delete_courses'); # Get result and send to message + # FIXME: I am pretty sure this is not used anymore. All methods add their messages directly to the page except the + # table messages, and those are added below and not here. my $status_message = $c->param('status_message'); - $c->addmessage($c->tag('p', class => 'my-2', $c->b($status_message))) if $status_message; + $c->addmessage($c->tag('p', $c->b($status_message))) if $status_message; # Check that the non-native tables are present in the database. # These are the tables which are not course specific. diff --git a/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm b/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm index a4b1a8e574..d3a96274b8 100644 --- a/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm +++ b/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm @@ -122,8 +122,12 @@ sub initialize ($c) { } my $actionHandler = "${actionID}_handler"; - $c->addmessage($c->tag('p', class => 'mb-1', $c->maketext('Results of last action performed: '))); - $c->addmessage($c->$actionHandler); + my ($success, $action_result) = $c->$actionHandler; + if ($success) { + $c->addgoodmessage($c->b($c->maketext('Result of last action performed: [_1]', $action_result))); + } else { + $c->addbadmessage($c->b($c->maketext('Result of last action performed: [_1]', $action_result))); + } } else { $c->addgoodmessage($c->maketext('Please select action to be performed.')); } @@ -155,7 +159,7 @@ sub edit_handler ($c) { } $c->{editMode} = 1; - return $c->tag('div', class => 'alert alert-success p-1 mb-0', $result); + return (1, $result); } # Handler for assigning achievements to users @@ -215,7 +219,7 @@ sub assign_handler ($c) { } } - return $c->tag('div', class => 'alert alert-success p-1 mb-0', $c->maketext('Assigned achievements to users')); + return (1, $c->maketext('Assigned achievements to users')); } # Handler for scoring @@ -249,11 +253,7 @@ sub score_handler ($c) { $scoreFilePath = WeBWorK::Utils::surePathToFile($ce->{courseDirs}->{scoring}, $scoreFilePath); my $SCORE = Mojo::File->new($scoreFilePath)->open('>:encoding(UTF-8)') - or return $c->tag( - 'div', - class => 'alert alert-danger p-1 mb-0', - $c->maketext("Failed to open [_1]", $scoreFilePath) - ); + or return (0, $c->maketext("Failed to open [_1]", $scoreFilePath)); # Print out header info print $SCORE $c->maketext("username, last name, first name, section, achievement level, achievement score,"); @@ -308,9 +308,8 @@ sub score_handler ($c) { $SCORE->close; # Include a download link - return $c->tag( - 'div', - class => 'alert alert-success p-1 mb-0', + return ( + 1, $c->b($c->maketext( 'Achievement scores saved to [_1]', $c->link_to( @@ -352,11 +351,7 @@ sub delete_handler ($c) { $c->{selectedAchievementIDs} = [ keys %selectedAchievementIDs ]; my $num = @achievementIDsToDelete; - return $c->tag( - 'div', - class => 'alert alert-success p-1 mb-0', - $c->maketext('Deleted [quant,_1,achievement]', $num) - ); + return (1, $c->maketext('Deleted [quant,_1,achievement]', $num)); } # Handler for creating an ahcievement @@ -367,16 +362,10 @@ sub create_handler ($c) { # Create achievement my $newAchievementID = $c->param('action.create.id'); - return $c->tag( - 'div', - class => 'alert alert-danger p-1 mb-0', - $c->maketext("Failed to create new achievement: no achievement ID specified!") - ) unless $newAchievementID =~ /\S/; - return $c->tag( - 'div', - class => 'alert alert-danger p-1 mb-0', - $c->maketext("Achievement [_1] exists. No achievement created", $newAchievementID) - ) if $db->existsAchievement($newAchievementID); + return (0, $c->maketext("Failed to create new achievement: no achievement ID specified!")) + unless $newAchievementID =~ /\S/; + return (0, $c->maketext("Achievement [_1] exists. No achievement created", $newAchievementID)) + if $db->existsAchievement($newAchievementID); my $newAchievementRecord = $db->newAchievement; my $oldAchievementID = $c->{selectedAchievementIDs}->[0]; @@ -390,11 +379,8 @@ sub create_handler ($c) { $newAchievementRecord->test('blankachievement.at'); $db->addAchievement($newAchievementRecord); } elsif ($type eq "copy") { - return $c->tag( - 'div', - class => 'alert alert-danger p-1 mb-0', - $c->maketext("Failed to duplicate achievement: no achievement selected for duplication!") - ) unless $oldAchievementID =~ /\S/; + return (0, $c->maketext("Failed to duplicate achievement: no achievement selected for duplication!")) + unless $oldAchievementID =~ /\S/; $newAchievementRecord = $db->getAchievement($oldAchievementID); $newAchievementRecord->achievement_id($newAchievementID); $db->addAchievement($newAchievementRecord); @@ -410,17 +396,9 @@ sub create_handler ($c) { # Add to local list of achievements push @{ $c->{allAchievementIDs} }, $newAchievementID; - return $c->tag( - 'div', - class => 'alert alert-danger p-1 mb-0', - $c->maketext("Failed to create new achievement: [_1]", $@) - ) if $@; + return (0, $c->maketext("Failed to create new achievement: [_1]", $@)) if $@; - return $c->tag( - 'div', - class => 'alert alert-success p-1 mb-0', - $c->maketext('Successfully created new achievement [_1]', $newAchievementID) - ); + return (1, $c->maketext('Successfully created new achievement [_1]', $newAchievementID)); } # Handler for importing achievements @@ -436,8 +414,7 @@ sub import_handler ($c) { # Open file name my $fh = Mojo::File->new($filePath)->open('<:encoding(UTF-8)') - or - return $c->tag('div', class => 'alert alert-danger p-1 mb-0', $c->maketext("Failed to open [_1]", $filePath)); + or return (0, $c->maketext("Failed to open [_1]", $filePath)); # Read in lines from file my $count = 0; @@ -510,11 +487,7 @@ sub import_handler ($c) { $c->{allAchievementIDs} = [ keys %allAchievementIDs ]; - return $c->tag( - 'div', - class => 'alert alert-success p-1 mb-0', - $c->maketext('Imported [quant,_1,achievement]', $count) - ); + return (1, $c->maketext('Imported [quant,_1,achievement]', $count)); } # Export handler @@ -532,14 +505,14 @@ sub export_handler ($c) { } $c->{exportMode} = 1; - return $c->tag('div', class => 'alert alert-success p-1 mb-0', $result); + return (1, $result); } # Handler for leaving the export page. sub cancel_export_handler ($c) { $c->{exportMode} = 0; - return $c->tag('div', class => 'alert alert-danger p-1 mb-0', $c->maketext('export abandoned')); + return (0, $c->maketext('export abandoned')); } # Handler actually exporting achievements. @@ -563,8 +536,7 @@ sub save_export_handler ($c) { $FilePath = WeBWorK::Utils::surePathToFile($ce->{courseDirs}{achievements}, $FilePath); my $fh = Mojo::File->new($FilePath)->open('>:encoding(UTF-8)') - or - return $c->tag('div', class => 'alert alert-danger p-1 mb-0', $c->maketext('Failed to open [_1]', $FilePath)); + or return (0, $c->maketext('Failed to open [_1]', $FilePath)); my $csv = Text::CSV->new({ eol => "\n" }); @@ -585,17 +557,13 @@ sub save_export_handler ($c) { $c->{exportMode} = 0; - return $c->tag( - 'div', - class => 'alert alert-success p-1 mb-0', - $c->maketext('Exported achievements to [_1]', $FileName) - ); + return (1, $c->maketext('Exported achievements to [_1]', $FileName)); } # Handler for cancelling edits. sub cancel_edit_handler ($c) { $c->{editMode} = 0; - return $c->tag('div', class => 'alert alert-danger p-1 mb-0', $c->maketext('changes abandoned')); + return (1, $c->maketext('changes abandoned')); } # Handler for saving edits. @@ -630,7 +598,7 @@ sub save_edit_handler ($c) { $c->{editMode} = 0; - return $c->tag('div', class => 'alert alert-success p-1 mb-0', $c->maketext('changes saved')); + return (1, $c->maketext('changes saved')); } # Get list of files that can be imported. diff --git a/lib/WeBWorK/ContentGenerator/Instructor/AchievementUserEditor.pm b/lib/WeBWorK/ContentGenerator/Instructor/AchievementUserEditor.pm index c86cffede2..192bcf7848 100644 --- a/lib/WeBWorK/ContentGenerator/Instructor/AchievementUserEditor.pm +++ b/lib/WeBWorK/ContentGenerator/Instructor/AchievementUserEditor.pm @@ -42,11 +42,7 @@ sub initialize ($c) { #Check and see if we need to assign or unassign things if (defined $c->param('assignToAll')) { - $c->addmessage($c->tag( - 'p', - class => 'alert alert-success p-1 mb-0', - $c->maketext('Achievement has been assigned to all users.') - )); + $c->addgoodmessage($c->maketext('Achievement has been assigned to all users.')); %selectedUsers = map { $_ => 1 } @all_users; $doAssignToSelected = 1; } elsif (defined $c->param('unassignFromAll') @@ -54,22 +50,14 @@ sub initialize ($c) { && $c->param('unassignFromAllSafety') == 1) { %selectedUsers = (); - $c->addmessage($c->tag( - 'p', - class => 'alert alert-danger p-1 mb-0', - $c->maketext('Achievement has been unassigned to all students.') - )); + $c->addbadmessage($c->maketext('Achievement has been unassigned to all students.')); $doAssignToSelected = 1; } elsif (defined $c->param('assignToSelected')) { - $c->addmessage($c->tag( - 'p', - class => 'alert alert-success p-1 mb-0', - $c->maketext('Achievement has been assigned to selected users.') - )); + $c->addgoodmessage($c->maketext('Achievement has been assigned to selected users.')); $doAssignToSelected = 1; } elsif (defined $c->param('unassignFromAll')) { # no action taken - $c->addmessage($c->tag('p', class => 'alert alert-danger p-1 mb-0', $c->maketext('No action taken'))); + $c->addbadmessage($c->maketext('No action taken')); } #do actual assignment and unassignment diff --git a/lib/WeBWorK/ContentGenerator/Instructor/ProblemGrader.pm b/lib/WeBWorK/ContentGenerator/Instructor/ProblemGrader.pm index 5c9151e50b..4e069be81b 100644 --- a/lib/WeBWorK/ContentGenerator/Instructor/ProblemGrader.pm +++ b/lib/WeBWorK/ContentGenerator/Instructor/ProblemGrader.pm @@ -109,11 +109,7 @@ async sub initialize ($c) { # Update grades if saving. if ($c->param('assignGrades')) { - $c->addmessage($c->tag( - 'p', - class => 'alert alert-success p-1 my-2', - $c->maketext('Grades have been saved for all current users.') - )); + $c->addgoodmessage($c->maketext('Grades have been saved for all current users.')); for my $user (@{ $c->stash->{users} }) { my $userID = $user->user_id; diff --git a/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm b/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm index 0339214a0b..5d7a413b76 100644 --- a/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm +++ b/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm @@ -156,7 +156,7 @@ sub pre_header_initialize ($c) { my @setsToScore; if ($scope eq 'none') { - return $c->maketext('No sets selected for scoring'); + return; } elsif ($scope eq 'all') { @setsToScore = @{ $c->{allSetIDs} }; } elsif ($scope eq 'visible') { @@ -165,6 +165,8 @@ sub pre_header_initialize ($c) { @setsToScore = $c->param('selected_sets'); } + return unless @setsToScore; + $c->reply_with_redirect($c->systemLink( $c->url_for('instructor_scoring'), params => { scoreSelected => 'ScoreSelected', selectedSet => \@setsToScore } @@ -233,8 +235,12 @@ sub initialize ($c) { # Check permissions if (not FORM_PERMS()->{$actionID} or $authz->hasPermissions($user, FORM_PERMS()->{$actionID})) { my $actionHandler = "${actionID}_handler"; - $c->addmessage($c->tag('p', class => 'mb-1', $c->maketext("Results of last action performed") . ": ")); - $c->addmessage($c->$actionHandler); + my ($success, $action_result) = $c->$actionHandler; + if ($success) { + $c->addgoodmessage($c->b($c->maketext('Result of last action performed: [_1]', $action_result))); + } else { + $c->addbadmessage($c->b($c->maketext('Result of last action performed: [_1]', $action_result))); + } } else { $c->addbadmessage($c->maketext('You are not authorized to perform this action.')); } @@ -300,7 +306,7 @@ sub filter_handler ($c) { $c->{visibleSetIDs} = [ map { $_->[0] } $db->listGlobalSetsWhere({ visible => 0 }) ]; } - return $c->tag('div', class => 'alert alert-success p-1 mb-0', $result); + return (1, $result); } sub sort_handler ($c) { @@ -318,11 +324,7 @@ sub sort_handler ($c) { visible => $c->maketext("Visibility"), ); - return $c->tag( - 'div', - class => 'alert alert-success p-1 mb-0', - $c->maketext("Sort by [_1] and then by [_2]", $names{$primary}, $names{$secondary}) - ); + return (1, $c->maketext("Sort by [_1] and then by [_2]", $names{$primary}, $names{$secondary})); } sub edit_handler ($c) { @@ -341,91 +343,53 @@ sub edit_handler ($c) { } $c->{editMode} = 1; - return $c->tag('div', class => 'alert alert-success p-1 mb-0', $result); + return (1, $result); } sub publish_handler ($c) { my $db = $c->db; - my $result = ""; + my @result; my $scope = $c->param('action.publish.scope'); my $value = $c->param('action.publish.value'); - my $verb = $value ? $c->maketext("made visible for") : $c->maketext("hidden from"); - my @setIDs; if ($scope eq "none") { @setIDs = (); - $result = $c->tag('div', class => 'alert alert-danger p-1 mb-0', $c->maketext("No change made to any set")); + @result = (0, $c->maketext("No change made to any set")); } elsif ($scope eq "all") { @setIDs = @{ $c->{allSetIDs} }; - $result = $value - ? $c->tag( - 'div', - class => 'alert alert-success p-1 mb-0', - $c->maketext("All sets made visible for all students") - ) - : $c->tag( - 'div', - class => 'alert alert-success p-1 mb-0', - $c->maketext("All sets hidden from all students") - ); + @result = + $value + ? (1, $c->maketext("All sets made visible for all students")) + : (1, $c->maketext("All sets hidden from all students")); } elsif ($scope eq "visible") { @setIDs = @{ $c->{visibleSetIDs} }; - $result = $value - ? $c->tag( - 'div', - class => 'alert alert-success p-1 mb-0', - $c->maketext("All listed sets were made visible for all the students") - ) - : $c->tag( - 'div', - class => 'alert alert-success p-1 mb-0', - $c->maketext("All listed sets were hidden from all the students") - ); + @result = + $value + ? (1, $c->maketext("All listed sets were made visible for all the students")) + : (1, $c->maketext("All listed sets were hidden from all the students")); } elsif ($scope eq "selected") { @setIDs = $c->param('selected_sets'); - $result = $value - ? $c->tag( - 'div', - class => 'alert alert-success p-1 mb-0', - $c->maketext("All selected sets made visible for all students") - ) - : $c->tag( - 'div', - class => 'alert alert-success p-1 mb-0', - $c->maketext("All selected sets hidden from all students") - ); + @result = + $value + ? (1, $c->maketext("All selected sets made visible for all students")) + : (1, $c->maketext("All selected sets hidden from all students")); } # Can we use UPDATE here, instead of fetch/change/store? my @sets = $db->getGlobalSets(@setIDs); map { $_->visible($value); $db->putGlobalSet($_); } @sets; - return $c->tag('div', class => 'alert alert-success p-1 mb-0', $result); + return @result; } sub score_handler ($c) { - my $courseName = $c->stash('courseID'); - - my $scope = $c->param('action.score.scope'); - my @setsToScore; - - if ($scope eq 'none') { - @setsToScore = (); - return $c->maketext('No sets selected for scoring'); - } elsif ($scope eq 'all') { - @setsToScore = @{ $c->{allSetIDs} }; - } elsif ($scope eq 'visible') { - @setsToScore = @{ $c->{visibleSetIDs} }; - } elsif ($scope eq 'selected') { - @setsToScore = $c->param('selected_sets'); - } - - return $c->systemLink($c->url_for('instructor_scoring'), - params => { scoreSelected => 'Score Selected', selectedSet => \@setsToScore }); + # The only time this is called is if "no sets" is selected (do we really need that option), + # or one of the other options was selected but there were no sets to score. + return (0, $c->maketext('No sets selected for scoring.')); } sub delete_handler ($c) { @@ -455,7 +419,7 @@ sub delete_handler ($c) { $c->{selectedSetIDs} = [ keys %selectedSetIDs ]; my $num = @setIDsToDelete; - return $c->tag('div', class => 'alert alert-success p-1 mb-0', $c->maketext('deleted [_1] sets', $num)); + return (1, $c->maketext('deleted [_1] sets', $num)); } sub create_handler ($c) { @@ -463,28 +427,19 @@ sub create_handler ($c) { my $ce = $c->ce; my $newSetID = format_set_name_internal($c->param('action.create.name') // ''); - return $c->tag( - 'div', - class => 'alert alert-danger p-1 mb-0', - $c->maketext("Failed to create new set: Set name cannot exceed 100 characters.") - ) if (length($newSetID) > 100); - return $c->tag( - 'div', - class => 'alert alert-danger p-1 mb-0', - $c->maketext("Failed to create new set: No set name specified.") - ) unless $newSetID =~ /\S/; - return $c->tag( - 'div', - class => 'alert alert-danger p-1 mb-0', + return (0, $c->maketext("Failed to create new set: Set name cannot exceed 100 characters.")) + if (length($newSetID) > 100); + return (0, $c->maketext("Failed to create new set: No set name specified.")) unless $newSetID =~ /\S/; + return ( + 0, $c->maketext( 'Failed to create new set: Invalid characters in set name "[_1]". ' . 'A set name may only contain letters, numbers, hyphens, periods, and spaces.', $newSetID =~ s/_/ /gr ) ) unless $newSetID =~ m/^[-a-zA-Z0-9_.]*$/; - return $c->tag( - 'div', - class => 'alert alert-danger p-1 mb-0', + return ( + 0, $c->maketext( 'The set name "[_1]" is already in use. Pick a different name if you would like to start a new set. ' . 'No set created.', @@ -524,11 +479,7 @@ sub create_handler ($c) { $newSetRecord->assignment_type('default'); $db->addGlobalSet($newSetRecord); } elsif ($type eq "copy") { - return $c->tag( - 'div', - class => 'alert alert-danger p-1 mb-0', - $c->maketext('Failed to duplicate set: no set selected for duplication!') - ) unless $oldSetID =~ /\S/; + return (0, $c->maketext('Failed to duplicate set: no set selected for duplication!')) unless $oldSetID =~ /\S/; $newSetRecord = $db->getGlobalSet($oldSetID); $newSetRecord->set_id($newSetID); $db->addGlobalSet($newSetRecord); @@ -570,12 +521,10 @@ sub create_handler ($c) { push @{ $c->{visibleSetIDs} }, $newSetID; push @{ $c->{allSetIds} }, $newSetID; - return $c->tag('div', class => 'alert alert-danger p-1 mb-0', $c->maketext('Failed to create new set: [_1]', $@)) - if $@; + return (0, $c->maketext('Failed to create new set: [_1]', $@)) if $@; - return $c->tag( - 'div', - class => 'alert alert-success p-1 mb-0', + return ( + 1, $c->b($c->maketext( 'Successfully created new set [_1]', $c->tag('span', dir => 'ltr', format_set_name_display($newSetID)) @@ -600,9 +549,8 @@ sub import_handler ($c) { my $numAdded = @$added; my $numSkipped = @$skipped; - return $c->tag( - 'div', - class => 'alert alert-success p-1 mb-0', + return ( + 1, $c->maketext( '[_1] sets added, [_2] sets skipped. Skipped sets: ([_3])', $numAdded, $numSkipped, join(', ', @$skipped) @@ -627,7 +575,7 @@ sub export_handler ($c) { } $c->{exportMode} = 1; - return $c->tag('div', class => 'alert alert-success p-1 mb-0', $result); + return (1, $result); } sub cancel_export_handler ($c) { @@ -640,7 +588,7 @@ sub cancel_export_handler ($c) { } $c->{exportMode} = 0; - return $c->tag('div', class => 'alert alert-danger p-1 mb-0', $c->maketext('export abandoned')); + return (0, $c->maketext('export abandoned')); } sub save_export_handler ($c) { @@ -660,13 +608,11 @@ sub save_export_handler ($c) { my $numExported = @$exported; my $numSkipped = @$skipped; - my $resultFont = $numSkipped ? 'alert-danger' : 'alert-success'; my @reasons = map { "set $_ - " . $reason->{$_} } keys %$reason; - return $c->tag( - 'div', - class => "alert $resultFont p-1 mb-0", + return ( + !$numSkipped, $c->b($c->maketext( '[_1] sets exported, [_2] sets skipped. Skipped sets: ([_3])', $numExported, $numSkipped, @@ -685,7 +631,7 @@ sub cancel_edit_handler ($c) { } $c->{editMode} = 0; - return $c->tag('div', class => 'alert alert-danger p-1 mb-0', $c->maketext('changes abandoned')); + return (0, $c->maketext('changes abandoned')); } sub save_edit_handler ($c) { @@ -722,37 +668,20 @@ sub save_edit_handler ($c) { my $curr_time = time; my $seconds_per_year = 31_556_926; my $cutoff = $curr_time + $seconds_per_year * 10; - return $c->tag( - 'div', - class => 'alert alert-danger p-1 mb-0', - $c->maketext("Error: open date cannot be more than 10 years from now in set [_1]", $setID) - ) if $Set->open_date > $cutoff; - return $c->tag( - 'div', - class => 'alert alert-danger p-1 mb-0', - $c->maketext("Error: close date cannot be more than 10 years from now in set [_1]", $setID) - ) if $Set->due_date > $cutoff; - return $c->tag( - 'div', - class => 'alert alert-danger p-1 mb-0', - $c->maketext("Error: answer date cannot be more than 10 years from now in set [_1]", $setID) - ) if $Set->answer_date > $cutoff; + return (0, $c->maketext("Error: open date cannot be more than 10 years from now in set [_1]", $setID)) + if $Set->open_date > $cutoff; + return (0, $c->maketext("Error: close date cannot be more than 10 years from now in set [_1]", $setID)) + if $Set->due_date > $cutoff; + return (0, $c->maketext("Error: answer date cannot be more than 10 years from now in set [_1]", $setID)) + if $Set->answer_date > $cutoff; # Check that the open, due and answer dates are in increasing order. # Bail if this is not correct. if ($Set->open_date > $Set->due_date) { - return $c->tag( - 'div', - class => 'alert alert-danger p-1 mb-0', - $c->maketext("Error: Close date must come after open date in set [_1]", $setID) - ); + return (0, $c->maketext("Error: Close date must come after open date in set [_1]", $setID)); } if ($Set->due_date > $Set->answer_date) { - return $c->tag( - 'div', - class => 'alert alert-danger p-1 mb-0', - $c->maketext("Error: Answer date must come after close date in set [_1]", $setID) - ); + return (0, $c->maketext("Error: Answer date must come after close date in set [_1]", $setID)); } # check that the reduced scoring date is in the right place @@ -769,9 +698,8 @@ sub save_edit_handler ($c) { || $Set->reduced_scoring_date < $Set->open_date) ) { - return $c->tag( - 'div', - class => 'alert alert-danger p-1 mb-0', + return ( + 0, $c->maketext( "Error: Reduced scoring date must come between the open date and close date in set [_1]", $setID @@ -792,7 +720,7 @@ sub save_edit_handler ($c) { $c->{editMode} = 0; - return $c->tag('div', class => 'alert alert-success p-1 mb-0', $c->maketext("changes saved")); + return (1, $c->maketext("changes saved")); } # Utilities diff --git a/lib/WeBWorK/ContentGenerator/Problem.pm b/lib/WeBWorK/ContentGenerator/Problem.pm index 3e241b6b62..d2448ff591 100644 --- a/lib/WeBWorK/ContentGenerator/Problem.pm +++ b/lib/WeBWorK/ContentGenerator/Problem.pm @@ -407,8 +407,8 @@ async sub pre_header_initialize ($c) { } $c->addmessage($c->{set}->visible - ? $c->tag('span', class => 'font-visible', $c->maketext('This set is visible to students.')) - : $c->tag('span', class => 'font-hidden', $c->maketext('This set is hidden from students.'))); + ? $c->tag('p', class => 'font-visible', $c->maketext('This set is visible to students.')) + : $c->tag('p', class => 'font-hidden', $c->maketext('This set is hidden from students.'))); } else { # Test for additional problem validity if it's not already invalid. @@ -460,7 +460,7 @@ async sub pre_header_initialize ($c) { $c->{formFields} = $formFields; # Get the status message and add it to the messages. - $c->addmessage($c->tag('p', class => 'my-2', $c->b($c->param('status_message')))) if $c->param('status_message'); + $c->addmessage($c->tag('p', $c->b($c->param('status_message')))) if $c->param('status_message'); # Now that the necessary variables are set, return if the set or problem is invalid. return if $c->{invalidSet} || $c->{invalidProblem}; diff --git a/lib/WeBWorK/ContentGenerator/ProblemSet.pm b/lib/WeBWorK/ContentGenerator/ProblemSet.pm index 2a2fe0bb7a..f81faf39fd 100644 --- a/lib/WeBWorK/ContentGenerator/ProblemSet.pm +++ b/lib/WeBWorK/ContentGenerator/ProblemSet.pm @@ -50,13 +50,13 @@ async sub initialize ($c) { $c->{displayMode} = $user->displayMode || $ce->{pg}{options}{displayMode}; # Display status messages. - $c->addmessage($c->tag('p', class => 'my-2', $c->b($c->param('status_message')))) if $c->param('status_message'); + $c->addmessage($c->tag('p', $c->b($c->param('status_message')))) if $c->param('status_message'); if ($authz->hasPermissions($userID, 'view_hidden_sets')) { if ($c->{set}->visible) { - $c->addmessage($c->tag('span', class => 'font-visible', $c->maketext('This set is visible to students.'))); + $c->addmessage($c->tag('p', class => 'font-visible', $c->maketext('This set is visible to students.'))); } else { - $c->addmessage($c->tag('span', class => 'font-hidden', $c->maketext('This set is hidden from students.'))); + $c->addmessage($c->tag('p', class => 'font-hidden', $c->maketext('This set is hidden from students.'))); } } @@ -76,7 +76,7 @@ async sub initialize ($c) { $screenSetHeader = "$ce->{courseDirs}{templates}/$screenSetHeader" unless $screenSetHeader =~ m!^/!; die 'sourceFilePath is unsafe!' unless path_is_subdir($screenSetHeader, $ce->{courseDirs}{templates}); $c->addmessage($c->tag( - 'div', + 'p', class => 'temporaryFile', $c->maketext('Viewing temporary file: [_1]', $screenSetHeader) )); diff --git a/lib/WeBWorK/ContentGenerator/ProblemSets.pm b/lib/WeBWorK/ContentGenerator/ProblemSets.pm index 5784c1c03b..6f8b797a6e 100644 --- a/lib/WeBWorK/ContentGenerator/ProblemSets.pm +++ b/lib/WeBWorK/ContentGenerator/ProblemSets.pm @@ -60,7 +60,7 @@ sub initialize ($c) { if ($authz->hasPermissions($user, 'access_instructor_tools')) { my $status_message = $c->param('status_message'); - $c->addmessage($c->tag('p', class => 'my-2', $c->b($status_message))) if $status_message; + $c->addmessage($c->tag('p', $c->b($status_message))) if $status_message; } if ($authz->hasPermissions($user, 'navigation_allowed')) { @@ -105,7 +105,7 @@ sub initialize ($c) { $c->addmessage($c->tag( 'p', - class => 'temporaryFile my-2', + class => 'temporaryFile', $c->maketext('Viewing temporary file: [_1]', $course_info_path) )); } diff --git a/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep b/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep index 3819a4d645..00a8d3db44 100644 --- a/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep +++ b/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep @@ -199,6 +199,6 @@
    <%= submit_button maketext($actionFormTitles->{$default_choice}), name => 'submit', id => 'take_action', - class => 'btn btn-primary' =%> + class => 'btn btn-primary mb-2' =%>
    <% end =%> From 0e8d7cdedaee3fbc47eb37a887ed6c8b822f607d Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Fri, 30 Jun 2023 09:48:01 -0500 Subject: [PATCH 061/549] Add the capability in the pg problem editor to pg perltidy code. This adds a new tab to the PG problem editor (unless editing a course configuration file). The tab contains basic information about what it does, but if the "Tidy Code" button is pressed it perltidies the code in the CodeMirror editor window. The tidied code is also saved to the temprorary file. The actual tidying is done by a new webwork webservice action (not a form submission). If errors occur, they are shown in the renderer window. The webwork webwservice depends on a new PG module defined in a corresponding PG pull request (see https://github.com/openwebwork/pg/pull/868). --- conf/snippets/newProblem.pg | 8 ++-- htdocs/js/PGProblemEditor/pgproblemeditor.js | 42 +++++++++++++++++++ .../Instructor/PGProblemEditor.pm | 11 +++-- lib/WebworkWebservice.pm | 1 + lib/WebworkWebservice/ProblemActions.pm | 20 +++++++++ .../PGProblemEditor/pgtidy_form.html.ep | 6 +++ .../InstructorPGProblemEditor.html.ep | 8 ++++ 7 files changed, 88 insertions(+), 8 deletions(-) create mode 100644 templates/ContentGenerator/Instructor/PGProblemEditor/pgtidy_form.html.ep diff --git a/conf/snippets/newProblem.pg b/conf/snippets/newProblem.pg index 3ab92489b4..75289789ee 100644 --- a/conf/snippets/newProblem.pg +++ b/conf/snippets/newProblem.pg @@ -14,9 +14,9 @@ DOCUMENT(); loadMacros( - "PGstandard.pl", # Standard macros for PG language - "PGML.pl", # PGML markup and Math Objects - "PGcourse.pl", # Customization file for the course + "PGstandard.pl", # Standard macros for PG language + "PGML.pl", # PGML markup and Math Objects + "PGcourse.pl", # Customization file for the course ); # Uncomment the following if you don't want to show which @@ -34,6 +34,6 @@ END_PGML BEGIN_PGML_SOLUTION You could type [|pi|]* or [|3.14|]*, or [|22/7|]*, among other options. -END_PGML_SOLUTION +END_PGML_SOLUTION ENDDOCUMENT(); diff --git a/htdocs/js/PGProblemEditor/pgproblemeditor.js b/htdocs/js/PGProblemEditor/pgproblemeditor.js index b0dedbf798..0e4f375fad 100644 --- a/htdocs/js/PGProblemEditor/pgproblemeditor.js +++ b/htdocs/js/PGProblemEditor/pgproblemeditor.js @@ -98,7 +98,49 @@ ?.addEventListener('change', () => deleteBackupCheck.checked = true); } + // Send a request to the server to perltidy the current PG code in the CodeMirror editor. + const tidyPGCode = () => { + const request_object = { + user: document.getElementById('hidden_user')?.value, + courseID: document.getElementsByName('courseID')[0]?.value, + key: document.getElementById('hidden_key')?.value + }; + + request_object.rpc_command = 'tidyPGCode'; + request_object.pgCode = webworkConfig?.pgCodeMirror?.getValue() + ?? document.getElementById('problemContents')?.value ?? ''; + + fetch(webserviceURL, { method: 'post', mode: 'same-origin', body: new URLSearchParams(request_object) }) + .then((response) => response.json()) + .then((data) => { + if (data.result_data.status) { + if (data.result_data.errors) { + renderArea.innerHTML = '
    ' + + '

    PG perltidy errors:

    ' + + '
    ' +
    +							data.result_data.errors
    +							.replace(/^[\s\S]*Begin Error Output Stream\n\n/, '')
    +							.replace(/\n\d*: To save a full \.LOG file rerun with -g/, '') +
    +							'
    '; + } + showMessage('Errors occurred perltidying code.', false); + return; + } + if (webworkConfig?.pgCodeMirror) webworkConfig.pgCodeMirror.setValue(data.result_data.tidiedPGCode); + else document.getElementById('problemContents').value = data.result_data.tidiedPGCode; + saveTempFile(); + showMessage('Successfuly perltidied code.', true); + }) + .catch((err) => showMessage(`Error: ${err?.message ?? err}`)); + }; + document.getElementById('take_action')?.addEventListener('click', async (e) => { + if (document.getElementById('current_action')?.value === 'pgtidy') { + e.preventDefault(); + tidyPGCode(); + return; + } + const actionView = document.getElementById('view'); const editorForm = document.getElementById('editor'); diff --git a/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm b/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm index a6062f5fb4..8b34060559 100644 --- a/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm +++ b/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm @@ -96,6 +96,7 @@ the submit button pressed (the action). Make this set header for: action = add_problem Revert: action = revert Generate Hardcopy: action = hardcopy + Tidy Code: action = pgtidy An undefined or invalid action is interpreted as an initial edit of the file. @@ -115,13 +116,14 @@ use WeBWorK::Utils::Instructor qw(assignProblemToAllSetUsers addProblemToSet); use constant DEFAULT_SEED => 123456; # Editor tabs -use constant ACTION_FORMS => [qw(view hardcopy save save_as add_problem revert)]; +use constant ACTION_FORMS => [qw(view hardcopy pgtidy save save_as add_problem revert)]; use constant ACTION_FORM_TITLES => { view => x('View/Reload'), hardcopy => x('Generate Hardcopy'), - add_problem => x('Append'), + pgtidy => x('Tidy Code'), save => x('Save'), save_as => x('Save As'), + add_problem => x('Append'), revert => x('Revert'), }; @@ -778,9 +780,10 @@ sub view_handler ($c) { return; } -# The hardcopy action is handled by javascript. This is provided just in case -# something goes wrong and the action gets called. +# The hardcopy and pgtidy actions are handled by javascript. These are provided just in case +# something goes wrong and the actions are called. sub hardcopy_action { } +sub pgtidy_action { } sub add_problem_handler ($c) { my $db = $c->db; diff --git a/lib/WebworkWebservice.pm b/lib/WebworkWebservice.pm index 782c6be131..47e1a46b4f 100644 --- a/lib/WebworkWebservice.pm +++ b/lib/WebworkWebservice.pm @@ -268,6 +268,7 @@ sub command_permission { putUserProblem => 'modify_student_data', putProblemVersion => 'modify_student_data', putPastAnswer => 'modify_student_data', + tidyPGCode => 'access_instructor_tools', # WebworkWebservice::RenderProblem renderProblem => 'proctor_quiz_login', diff --git a/lib/WebworkWebservice/ProblemActions.pm b/lib/WebworkWebservice/ProblemActions.pm index 05e4e06cff..36360f3bd2 100644 --- a/lib/WebworkWebservice/ProblemActions.pm +++ b/lib/WebworkWebservice/ProblemActions.pm @@ -22,6 +22,7 @@ use warnings; use Data::Structure::Util qw(unbless); use WeBWorK::Debug; +use WeBWorK::PG::Tidy qw(pgtidy); sub getUserProblem { my ($invocant, $self, $params) = @_; @@ -133,4 +134,23 @@ sub putPastAnswer { }; } +sub tidyPGCode { + my ($invocant, $self, $params) = @_; + + debug('in tidyPGCode'); + + local @ARGV = (); + + my $code = $params->{pgCode}; + my $tidiedPGCode; + my $errors; + + my $result = pgtidy(source => \$code, destination => \$tidiedPGCode, errorfile => \$errors); + + return { + ra_out => { tidiedPGCode => $tidiedPGCode, status => $result, errors => $errors }, + text => 'Tidied code' + }; +} + 1; diff --git a/templates/ContentGenerator/Instructor/PGProblemEditor/pgtidy_form.html.ep b/templates/ContentGenerator/Instructor/PGProblemEditor/pgtidy_form.html.ep new file mode 100644 index 0000000000..c099b968d5 --- /dev/null +++ b/templates/ContentGenerator/Instructor/PGProblemEditor/pgtidy_form.html.ep @@ -0,0 +1,6 @@ +% # Hardcopy headers are previewed from the hardcopy generation tab. +% last if $c->{file_type} eq 'course_info'; +% +
    +

    <%= maketext('Reformat the code using perltidy.') =%>

    +
    diff --git a/templates/HelpFiles/InstructorPGProblemEditor.html.ep b/templates/HelpFiles/InstructorPGProblemEditor.html.ep index ebdf6d65dc..d7b5395cc6 100644 --- a/templates/HelpFiles/InstructorPGProblemEditor.html.ep +++ b/templates/HelpFiles/InstructorPGProblemEditor.html.ep @@ -120,6 +120,14 @@ . 'generating the PDF file using pdflatex.') =%> +
    <%= maketext('Tidy Code') %>
    +
    + <%= maketext('Reformat the code using perltidy. This will change the code in the editor window, and save ' + . 'changes to the temporary file. In some cases (if the code contains backslashes or double tildes) this ' + . 'can result in odd spacing in the code. So make sure to inspect the formatted code, and edit further or ' + . 'revert if needed.') =%> +
    +
    <%= maketext('Save') %>
    <%= maketext('Save the contents of the editor window to the file on disk and re-render the problem. If ' From a9a27bfdf45971f36680741a2c111f863a76365c Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Sat, 1 Jul 2023 20:26:04 -0500 Subject: [PATCH 062/549] Add Perl::Tidy to check_modules.pl. The version needs to be at least 20220613. Newer versions than that should be okay for this, although those cause reformatting of webwork2 and pg code from the 20220613. --- bin/check_modules.pl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bin/check_modules.pl b/bin/check_modules.pl index 41e07e0f63..4ab530bf24 100755 --- a/bin/check_modules.pl +++ b/bin/check_modules.pl @@ -127,6 +127,7 @@ =head1 DESCRIPTION Opcode PadWalker Path::Class + Perl::Tidy PHP::Serialization Pod::Simple::Search Pod::Simple::XHTML @@ -160,6 +161,7 @@ =head1 DESCRIPTION 'LWP::Protocol::https' => 6.06, 'Mojolicious' => 9.22, 'Net::SSLeay' => 1.46, + 'Perl::Tidy' => 20220613 ); my ($test_programs, $test_modules, $show_help); From d617dddfc699c923a631e2e0118cfd118f8bf667 Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Mon, 3 Jul 2023 05:47:22 -0500 Subject: [PATCH 063/549] If perltidy does not change the code, then report that and don't change the code in the editor window. --- htdocs/js/PGProblemEditor/pgproblemeditor.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/htdocs/js/PGProblemEditor/pgproblemeditor.js b/htdocs/js/PGProblemEditor/pgproblemeditor.js index 0e4f375fad..64a92a0ca3 100644 --- a/htdocs/js/PGProblemEditor/pgproblemeditor.js +++ b/htdocs/js/PGProblemEditor/pgproblemeditor.js @@ -126,10 +126,14 @@ showMessage('Errors occurred perltidying code.', false); return; } - if (webworkConfig?.pgCodeMirror) webworkConfig.pgCodeMirror.setValue(data.result_data.tidiedPGCode); - else document.getElementById('problemContents').value = data.result_data.tidiedPGCode; - saveTempFile(); - showMessage('Successfuly perltidied code.', true); + if (request_object.pgCode === data.result_data.tidiedPGCode) { + showMessage('There were no changes to the code.', true); + } else { + if (webworkConfig?.pgCodeMirror) webworkConfig.pgCodeMirror.setValue(data.result_data.tidiedPGCode); + else document.getElementById('problemContents').value = data.result_data.tidiedPGCode; + saveTempFile(); + showMessage('Successfuly perltidied code.', true); + } }) .catch((err) => showMessage(`Error: ${err?.message ?? err}`)); }; From 8ee08266618c623d5d19369f198c66651db8a56b Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Tue, 4 Jul 2023 06:51:24 -0500 Subject: [PATCH 064/549] Add a work around for a `Tie::Hash::NamedCapture` issue with `Safe`. --- lib/WeBWorK/CourseEnvironment.pm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/WeBWorK/CourseEnvironment.pm b/lib/WeBWorK/CourseEnvironment.pm index 7a944fa559..b11fbbda40 100644 --- a/lib/WeBWorK/CourseEnvironment.pm +++ b/lib/WeBWorK/CourseEnvironment.pm @@ -101,6 +101,11 @@ sub new { my %ORIG_SIG; $ORIG_SIG{$_} = $SIG{$_} for keys %SIG; + # The following line is a work around for a bug that occurs on some systems. See + # https://rt.cpan.org/Public/Bug/Display.html?id=77916 and + # https://github.com/openwebwork/webwork2/pull/2098#issuecomment-1619812699. + %+; + my $safe = Safe->new; $safe->permit('rand'); # seed course environment with initial values From a21340747e3e2dfdfb68c44ca9f71037fc58ca43 Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Thu, 6 Jul 2023 07:16:03 -0500 Subject: [PATCH 065/549] Remove the useless debug calls in lib/WebworkWebservice/ProblemActions.pm. --- lib/WebworkWebservice/ProblemActions.pm | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/lib/WebworkWebservice/ProblemActions.pm b/lib/WebworkWebservice/ProblemActions.pm index 36360f3bd2..bee93b1f3d 100644 --- a/lib/WebworkWebservice/ProblemActions.pm +++ b/lib/WebworkWebservice/ProblemActions.pm @@ -21,14 +21,11 @@ use warnings; use Data::Structure::Util qw(unbless); -use WeBWorK::Debug; use WeBWorK::PG::Tidy qw(pgtidy); sub getUserProblem { my ($invocant, $self, $params) = @_; - debug('in getUserProblem'); - my $db = $self->db; my $userProblem = $db->getUserProblem($params->{user_id}, $params->{set_id}, $params->{problem_id}); @@ -44,8 +41,6 @@ sub getUserProblem { sub putUserProblem { my ($invocant, $self, $params) = @_; - debug('in putUserProblem'); - my $db = $self->db; my $userProblem = $db->getUserProblem($params->{user_id}, $params->{set_id}, $params->{problem_id}); @@ -76,8 +71,6 @@ sub putUserProblem { sub putProblemVersion { my ($invocant, $self, $params) = @_; - debug('in putProblemVersion'); - my $db = $self->db; my $problemVersion = @@ -109,8 +102,6 @@ sub putProblemVersion { sub putPastAnswer { my ($invocant, $self, $params) = @_; - debug('in putPastAnswer'); - my $db = $self->db; my $pastAnswer = $db->getPastAnswer($params->{answer_id}); @@ -137,8 +128,6 @@ sub putPastAnswer { sub tidyPGCode { my ($invocant, $self, $params) = @_; - debug('in tidyPGCode'); - local @ARGV = (); my $code = $params->{pgCode}; From 0f82a5516193864792aebd4f2ed2bcbbf9449e5f Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Wed, 5 Jul 2023 15:41:46 -0700 Subject: [PATCH 066/549] different help in LTIUpdate for course/homework --- templates/HelpFiles/InstructorLTIUpdate.html.ep | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/templates/HelpFiles/InstructorLTIUpdate.html.ep b/templates/HelpFiles/InstructorLTIUpdate.html.ep index a8c5637587..76fcd612e2 100644 --- a/templates/HelpFiles/InstructorLTIUpdate.html.ep +++ b/templates/HelpFiles/InstructorLTIUpdate.html.ep @@ -17,8 +17,13 @@ % title maketext('LTI Grade Update Help'); %

    - <%= maketext('This page gives information about mass LTI grade updates, and allows you to trigger a grade update ' - . 'for all users and all sets, all sets for one user, all users for one set, or one user for one set. When ' - . 'a user is selected, the sets drop down menu is updated to only allow selecting sets assigned the selected ' - . 'user. Similarly when a set is selected, the user menu is updated to only allow selecting valid users.') =%> + <%= maketext('This page gives information about mass LTI grade updates, and allows you to trigger a grade update. ') =%> + % if ($ce->{LTIGradeMode} eq 'course') { + <%= maketext('You may trigger a grade update for all users or just one user.') =%> + % } elsif ($ce->{LTIGradeMode} eq 'homework') { + <%= maketext('You may trigger a grade update for all users or just one user, for all sets or just one set. ' + . 'When a user is selected, the menu for sets is updated to only allow selecting sets assigned to the ' + . 'selected user. Similarly when a set is selected, the user menu is updated to only allow selecting ' + . 'valid users.') =%> + % }

    From 092643b9599a857f04a369cc19e5efbbb7a1d457 Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Thu, 6 Jul 2023 10:58:02 -0700 Subject: [PATCH 067/549] code format --- templates/HelpFiles/InstructorLTIUpdate.html.ep | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/templates/HelpFiles/InstructorLTIUpdate.html.ep b/templates/HelpFiles/InstructorLTIUpdate.html.ep index 76fcd612e2..b3a3aff971 100644 --- a/templates/HelpFiles/InstructorLTIUpdate.html.ep +++ b/templates/HelpFiles/InstructorLTIUpdate.html.ep @@ -17,13 +17,15 @@ % title maketext('LTI Grade Update Help'); %

    - <%= maketext('This page gives information about mass LTI grade updates, and allows you to trigger a grade update. ') =%> + <%= maketext('This page gives information about mass LTI grade updates ' + . 'and allows you to trigger a grade update. ') =%> % if ($ce->{LTIGradeMode} eq 'course') { <%= maketext('You may trigger a grade update for all users or just one user.') =%> % } elsif ($ce->{LTIGradeMode} eq 'homework') { - <%= maketext('You may trigger a grade update for all users or just one user, for all sets or just one set. ' - . 'When a user is selected, the menu for sets is updated to only allow selecting sets assigned to the ' - . 'selected user. Similarly when a set is selected, the user menu is updated to only allow selecting ' - . 'valid users.') =%> + <%= maketext('You may trigger a grade update for all users or just one user, ' + . 'for all sets or just one set. When a user is selected, the menu ' + . 'for sets is updated to only allow selecting sets assigned to the ' + . 'selected user. Similarly when a set is selected, the user menu ' + . 'is updated to only allow selecting valid users.') =%> % }

    From 0ca0b9d084455dbac491c5a219fbbb959c5f404c Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Wed, 28 Jun 2023 17:56:03 -0700 Subject: [PATCH 068/549] small corrections --- conf/webwork2.mojolicious.dist.yml | 10 +++++----- lib/WeBWorK.pm | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/conf/webwork2.mojolicious.dist.yml b/conf/webwork2.mojolicious.dist.yml index 29dca8a0ce..a19798d178 100644 --- a/conf/webwork2.mojolicious.dist.yml +++ b/conf/webwork2.mojolicious.dist.yml @@ -41,12 +41,12 @@ JSON_ERROR_LOG: 0 # origins without an explicit directive from the server that it is safe. # Uncomment the extra_headers setting as is to set the header to enable # Cross-Origin Resource Sharing (CORS) for url responses to requests to urls -# that start with /webwork2/webwork_rpc, /webwork2/html2xml, and -# /webwork2_files. This may be needed to use the client formats if they are -# accessed from a *remote* server. +# that start with /webwork2/render_rpc, /webwork2/html2xml, and /webwork2_files. +# This may be needed to use the client formats if they are accessed from a +# *remote* server. # # Note that the /webwork2/html2xml url is deprecated, and code should be adapted -# to use the /webwork2/webwork_rpc path instead. They both do the same thing +# to use the /webwork2/render_rpc path instead. They both do the same thing # that the /webwork2/html2xml endpoint did before, but they no longer pass # through the XMLRPC middle man. # @@ -55,7 +55,7 @@ JSON_ERROR_LOG: 0 # given. #extra_headers: -# /webwork2/webwork_rpc: +# /webwork2/render_rpc: # Access-Control-Allow-Origin: '*' # /webwork2/html2xml: # Access-Control-Allow-Origin: '*' diff --git a/lib/WeBWorK.pm b/lib/WeBWorK.pm index 5430478da7..b6f6706177 100644 --- a/lib/WeBWorK.pm +++ b/lib/WeBWorK.pm @@ -87,7 +87,7 @@ async sub dispatch ($c) { my $displayModule = ref $c; my %routeCaptures = %{ $c->stash->{'mojo.captures'} }; - if ($c->current_route =~ /^render_rpc|instructor_rpc|html2xml$/) { + if ($c->current_route =~ /^(render_rpc|instructor_rpc|html2xml)$/) { $c->{rpc} = 1; # This provides compatibility for legacy html2xml parameters. From 584095a1c7e36fd3252f41d5f5d0d22f86fbd4d8 Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Wed, 28 Jun 2023 20:17:28 -0700 Subject: [PATCH 069/549] remove newly introduced html2xml url parameter --- lib/WeBWorK.pm | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/WeBWorK.pm b/lib/WeBWorK.pm index b6f6706177..74c2d57568 100644 --- a/lib/WeBWorK.pm +++ b/lib/WeBWorK.pm @@ -95,7 +95,6 @@ async sub dispatch ($c) { if ($c->current_route eq 'html2xml') { for ( [ 'userID', 'user' ], - [ 'courseName', 'courseID' ], [ 'course_password', 'passwd' ], [ 'session_key', 'key' ] ) From 2f466b9492680e92fb1b1050c154cbaee21e265a Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Wed, 28 Jun 2023 20:18:14 -0700 Subject: [PATCH 070/549] clean up render_rpc ptx format --- templates/RPCRenderFormats/ptx.html.ep | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/templates/RPCRenderFormats/ptx.html.ep b/templates/RPCRenderFormats/ptx.html.ep index d3c4cbc9b1..91da854eca 100644 --- a/templates/RPCRenderFormats/ptx.html.ep +++ b/templates/RPCRenderFormats/ptx.html.ep @@ -1,7 +1,6 @@ - - + + %== $problemText %== $answerhashXML - From a50e53f26364626d16a512c20e4b6f329a6baa96 Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Wed, 28 Jun 2023 20:20:31 -0700 Subject: [PATCH 071/549] perltidy --- lib/WeBWorK.pm | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/lib/WeBWorK.pm b/lib/WeBWorK.pm index 74c2d57568..5974dc97e6 100644 --- a/lib/WeBWorK.pm +++ b/lib/WeBWorK.pm @@ -93,12 +93,7 @@ async sub dispatch ($c) { # This provides compatibility for legacy html2xml parameters. # This should be deleted when the html2xml endpoint is removed. if ($c->current_route eq 'html2xml') { - for ( - [ 'userID', 'user' ], - [ 'course_password', 'passwd' ], - [ 'session_key', 'key' ] - ) - { + for ([ 'userID', 'user' ], [ 'course_password', 'passwd' ], [ 'session_key', 'key' ]) { $c->param($_->[1], $c->param($_->[0])) if defined $c->param($_->[0]) && !defined $c->param($_->[1]); } } From 1eaa78cab6f98cf25de29f91df7bc7f83bec51d3 Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Wed, 28 Jun 2023 22:42:03 -0700 Subject: [PATCH 072/549] header for ptx via render_rpc --- lib/Mojolicious/WeBWorK.pm | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib/Mojolicious/WeBWorK.pm b/lib/Mojolicious/WeBWorK.pm index 9d09a51f7d..06828ce517 100644 --- a/lib/Mojolicious/WeBWorK.pm +++ b/lib/Mojolicious/WeBWorK.pm @@ -122,6 +122,18 @@ sub startup ($app) { ); } + # Always add Content-Type: text/xml; charset=utf-8 header for static PTX + $app->hook( + before_dispatch => sub ($c) { + if ($c->req->url->path =~ /^\/webwork2\/render_rpc/ + && $c->req->url->query->param('outputformat') eq 'ptx' + && $c->req->url->query->param('displayMode') eq 'PTX') + { + $c->res->headers->header('Content-Type' => 'text/xml; charset=utf-8'); + } + } + ); + # Add a hook that redirects http to https if configured to do so. if ($config->{redirect_http_to_https}) { $app->hook( From 5c08521977541c0efa43e05f3302ff386cf34e38 Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Thu, 29 Jun 2023 07:33:54 -0400 Subject: [PATCH 073/549] Set the content type header in the correct place. This only sets the "text/xml" header if the route is the "render_rpc" route and the output format is "ptx" and the display mode is "PTX". This is done in `FormatRenderedProblem` (instead of `RenderViaRPX` as I suggested earlier) because it needs to be done before the response is rendered, and that occurs at the end of the `formatRenderedProblem` method. --- lib/FormatRenderedProblem.pm | 3 +++ lib/Mojolicious/WeBWorK.pm | 12 ------------ 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/lib/FormatRenderedProblem.pm b/lib/FormatRenderedProblem.pm index ada7587e14..c9038787b5 100644 --- a/lib/FormatRenderedProblem.pm +++ b/lib/FormatRenderedProblem.pm @@ -186,6 +186,9 @@ sub formatRenderedProblem { } $dom->wrap_content(''); $answerhashXML = $dom->to_string; + + $ws->c->res->headers->content_type('text/xml; charset=utf-8') + if $ws->c->current_route eq 'render_rpc' && ($ws->c->param('displayMode') // '') eq 'PTX'; } # Make sure this is defined and is an array reference as saveGradeToLTI might add to it. diff --git a/lib/Mojolicious/WeBWorK.pm b/lib/Mojolicious/WeBWorK.pm index 06828ce517..9d09a51f7d 100644 --- a/lib/Mojolicious/WeBWorK.pm +++ b/lib/Mojolicious/WeBWorK.pm @@ -122,18 +122,6 @@ sub startup ($app) { ); } - # Always add Content-Type: text/xml; charset=utf-8 header for static PTX - $app->hook( - before_dispatch => sub ($c) { - if ($c->req->url->path =~ /^\/webwork2\/render_rpc/ - && $c->req->url->query->param('outputformat') eq 'ptx' - && $c->req->url->query->param('displayMode') eq 'PTX') - { - $c->res->headers->header('Content-Type' => 'text/xml; charset=utf-8'); - } - } - ); - # Add a hook that redirects http to https if configured to do so. if ($config->{redirect_http_to_https}) { $app->hook( From 01c65dcab575474ab9e86fd42d2f68c942ae215f Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Tue, 4 Jul 2023 02:05:25 -0700 Subject: [PATCH 074/549] CORS header for pg_files --- conf/webwork2.mojolicious.dist.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/webwork2.mojolicious.dist.yml b/conf/webwork2.mojolicious.dist.yml index a19798d178..988d233754 100644 --- a/conf/webwork2.mojolicious.dist.yml +++ b/conf/webwork2.mojolicious.dist.yml @@ -61,6 +61,8 @@ JSON_ERROR_LOG: 0 # Access-Control-Allow-Origin: '*' # /webwork2_files: # Access-Control-Allow-Origin: '*' +# /pg_files: +# Access-Control-Allow-Origin: '*' # The user and group to run the server as. These are only used when the # webwork2 app is in production mode and run as the root user. This means that From 85ae35eb3977581f102e28dfffb480fa1fbc6a83 Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Tue, 4 Jul 2023 13:07:51 -0700 Subject: [PATCH 075/549] use scalar return for grade_all_sets --- lib/WeBWorK/Authen/LTIAdvanced/SubmitGrade.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/WeBWorK/Authen/LTIAdvanced/SubmitGrade.pm b/lib/WeBWorK/Authen/LTIAdvanced/SubmitGrade.pm index f7bbea0247..b3728ee102 100644 --- a/lib/WeBWorK/Authen/LTIAdvanced/SubmitGrade.pm +++ b/lib/WeBWorK/Authen/LTIAdvanced/SubmitGrade.pm @@ -126,7 +126,7 @@ async sub submit_course_grade ($self, $userID) { $self->warning("lis_source_did is not available for user: $userID") if !$user->lis_source_did && $ce->{debug_lti_grade_passback}; - return await $self->submit_grade($user->lis_source_did, grade_all_sets($db, $userID)); + return await $self->submit_grade($user->lis_source_did, scalar(grade_all_sets($db, $userID))); } # Computes and submits the set grade for $userID and $setID to the LMS. For gateways the best score is used. From e55c3ada9913bc456cd16e430417437deaf0d978 Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Tue, 11 Jul 2023 10:25:35 -0700 Subject: [PATCH 076/549] fix error with blank problem in new window --- .../ContentGenerator/Instructor/PGProblemEditor.pm | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm b/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm index 8b34060559..91aafb23d0 100644 --- a/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm +++ b/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm @@ -736,6 +736,18 @@ sub view_handler ($c) { status_message => $c->{status_message}->join('') } )); + } elsif ($c->{file_type} eq 'blank_problem') { + # Redirect to Problem.pm.pm. + $c->reply_with_redirect($c->systemLink( + $c->url_for('problem_detail', setID => 'Undefined_Set', problemID => 1), + params => { + displayMode => $displayMode, + problemSeed => $problemSeed, + editMode => 'temporaryFile', + sourceFilePath => $relativeTempFilePath, + status_message => $c->{status_message}->join('') + } + )); } elsif ($c->{file_type} eq 'set_header') { # Redirect to ProblemSet $c->reply_with_redirect($c->systemLink( From 8af656c95acf756c6c875ac21174178650fb537d Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Fri, 7 Jul 2023 09:27:28 -0500 Subject: [PATCH 077/549] Fix a warning that is being emitted due to the hack added in #2098 This just assigns the result of calling `%+` to a dummy variable to avoid the warning that perl gives stating that this is a useless use of a variable in void context. --- lib/WeBWorK/CourseEnvironment.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/WeBWorK/CourseEnvironment.pm b/lib/WeBWorK/CourseEnvironment.pm index b11fbbda40..c3f065efc7 100644 --- a/lib/WeBWorK/CourseEnvironment.pm +++ b/lib/WeBWorK/CourseEnvironment.pm @@ -104,7 +104,7 @@ sub new { # The following line is a work around for a bug that occurs on some systems. See # https://rt.cpan.org/Public/Bug/Display.html?id=77916 and # https://github.com/openwebwork/webwork2/pull/2098#issuecomment-1619812699. - %+; + my %dummy = %+; my $safe = Safe->new; $safe->permit('rand'); From 405162e42691f34fb2cf7d57db7f5bd977f3ad69 Mon Sep 17 00:00:00 2001 From: Peter Staab Date: Tue, 27 Jun 2023 14:36:33 -0400 Subject: [PATCH 078/549] Add folding and comment toggle to codemirror --- htdocs/js/PGCodeMirror/PG.js | 36 +++++++++++++++++++++------- htdocs/js/PGCodeMirror/pgeditor.js | 12 +++++++++- lib/WeBWorK/HTML/CodeMirrorEditor.pm | 5 ++-- 3 files changed, 42 insertions(+), 11 deletions(-) diff --git a/htdocs/js/PGCodeMirror/PG.js b/htdocs/js/PGCodeMirror/PG.js index 62de45cfd7..2aae5b4443 100644 --- a/htdocs/js/PGCodeMirror/PG.js +++ b/htdocs/js/PGCodeMirror/PG.js @@ -1005,7 +1005,7 @@ newPrevState.mode = "tex"; return tokenPGMLSubBlock(stream,state,endstring,style,newPrevState); } - } else if (stream.match(/^\[\|+/)) { // Verbatim + } else if (stream.match(/^\[\|+/)) { // Verbatim style = "tag"; const endstring = stream.current().substring(1) + "\\]"; state.tokenize = function(stream,state) { @@ -1418,16 +1418,36 @@ lineComment: '#' }; }); - + CodeMirror.registerHelper("wordChars", "perl", /[\w$]/); - + + CodeMirror.registerHelper('fold','PG', function(cm,start) { + var line = start.line, lineText = cm.getLine(line); + var lastLineInFold = line; + var m1 = /^\s*BEGIN\_(PGML|PGML\_SOLUTION|PGML_HINT)\s*$/.exec(lineText); + var m2 = /^\s*(Section|Scaffold)::Begin/.exec(lineText); + if(m1 || m2 ){ + for (var current_line = line +1;current_line <= cm.lineCount();current_line++){ + const end_re = m1 ? RegExp(`END_${m1[1]}`) : RegExp(`${m2[1]}::End`); + if(end_re.test(cm.getLine(current_line))) { + return { + from: CodeMirror.Pos(start.line, cm.getLine(start.line).length), + to: CodeMirror.Pos(current_line, cm.getLine(current_line).length) + }; + } + } + } + return; + }); + + CodeMirror.defineMIME("text/x-perl", "perl"); - + // it's like "peek", but need for look-ahead or look-behind if index < 0 function look(stream, c){ return stream.string.charAt(stream.pos+(c||0)); } - + // return a part of prefix of current stream from current position function prefix(stream, c){ if(c){ @@ -1437,14 +1457,14 @@ return stream.string.substr(0,stream.pos-1); } } - + // return a part of suffix of current stream from current position function suffix(stream, c){ var y=stream.string.length; var x=y-stream.pos+1; return stream.string.substr(stream.pos,(c&&c cm.execCommand('insertSoftTab') }, + extraKeys: { + Tab: (cm) => cm.execCommand('insertSoftTab'), + 'Ctrl-/': (cm) => cm.execCommand('toggleComment'), + 'Cmd-/': (cm) => cm.execCommand('toggleComment'), + "Ctrl-R": (cm) => cm.foldCode(cm.getCursor()) + }, highlightSelectionMatches: { annotateScrollbar: true }, matchBrackets: true, inputStyle: 'contenteditable', spellcheck: localStorage.getItem('WW_PGEditor_spellcheck') === 'true', + gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"], + foldGutter: { + rangeFinder: new CodeMirror.fold.combine(CodeMirror.fold.PG) + }, + fold: "PG" }); cm.setSize('100%', '550px'); diff --git a/lib/WeBWorK/HTML/CodeMirrorEditor.pm b/lib/WeBWorK/HTML/CodeMirrorEditor.pm index 7c5fc7637d..54a685ae72 100644 --- a/lib/WeBWorK/HTML/CodeMirrorEditor.pm +++ b/lib/WeBWorK/HTML/CodeMirrorEditor.pm @@ -53,14 +53,15 @@ use constant CODEMIRROR_THEMES => [ use constant CODEMIRROR_KEYMAPS => [ 'emacs', 'sublime', 'vim' ]; # Javascript for addons used by the PG editor (relative to the node_modules/codemirror/addon directory). -use constant CODEMIRROR_ADDONS_CSS => [ 'dialog/dialog.css', 'search/matchesonscrollbar.css' ]; +use constant CODEMIRROR_ADDONS_CSS => [ 'dialog/dialog.css', 'search/matchesonscrollbar.css', 'fold/foldgutter.css' ]; # Javascript for addons used by the PG editor (relative to the node_modules/codemirror/addon directory). use constant CODEMIRROR_ADDONS_JS => [ 'dialog/dialog.js', 'search/search.js', 'search/searchcursor.js', 'search/matchesonscrollbar.js', 'search/match-highlighter.js', 'search/match-highlighter.js', - 'scroll/annotatescrollbar.js', 'edit/matchbrackets.js' + 'scroll/annotatescrollbar.js', 'edit/matchbrackets.js', + 'comment/comment.js', 'fold/foldcode.js' ]; sub generate_codemirror_html ($c, $name, $contents = '', $mode = 'PG') { From 16de77a69cabb392f6315fd89837efb79be4d48c Mon Sep 17 00:00:00 2001 From: Peter Staab Date: Wed, 28 Jun 2023 14:47:04 -0400 Subject: [PATCH 079/549] Cleaned up code and now gutters show arrows for folding. --- htdocs/js/PGCodeMirror/PG.js | 10 ++++------ htdocs/js/PGCodeMirror/pgeditor.js | 14 ++++++-------- lib/WeBWorK/HTML/CodeMirrorEditor.pm | 3 ++- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/htdocs/js/PGCodeMirror/PG.js b/htdocs/js/PGCodeMirror/PG.js index 2aae5b4443..89320d5388 100644 --- a/htdocs/js/PGCodeMirror/PG.js +++ b/htdocs/js/PGCodeMirror/PG.js @@ -1421,13 +1421,11 @@ CodeMirror.registerHelper("wordChars", "perl", /[\w$]/); - CodeMirror.registerHelper('fold','PG', function(cm,start) { - var line = start.line, lineText = cm.getLine(line); - var lastLineInFold = line; - var m1 = /^\s*BEGIN\_(PGML|PGML\_SOLUTION|PGML_HINT)\s*$/.exec(lineText); - var m2 = /^\s*(Section|Scaffold)::Begin/.exec(lineText); + CodeMirror.registerHelper('fold','PG', (cm,start) => { + const m1 = /BEGIN_(PGML|PGML_SOLUTION|PGML_HINT|TEXT|TIKZ|LATEX_IMAGE)\s*$/.exec(cm.getLine(start.line)); + const m2 = /^\s*(Section|Scaffold)::Begin/.exec(cm.getLine(start.line)); if(m1 || m2 ){ - for (var current_line = line +1;current_line <= cm.lineCount();current_line++){ + for (let current_line = start.line +1; current_line <= cm.lineCount(); current_line++){ const end_re = m1 ? RegExp(`END_${m1[1]}`) : RegExp(`${m2[1]}::End`); if(end_re.test(cm.getLine(current_line))) { return { diff --git a/htdocs/js/PGCodeMirror/pgeditor.js b/htdocs/js/PGCodeMirror/pgeditor.js index ec3ac0a497..b6e65dcbcc 100644 --- a/htdocs/js/PGCodeMirror/pgeditor.js +++ b/htdocs/js/PGCodeMirror/pgeditor.js @@ -76,20 +76,18 @@ lineNumbers: true, lineWrapping: true, extraKeys: { - Tab: (cm) => cm.execCommand('insertSoftTab'), - 'Ctrl-/': (cm) => cm.execCommand('toggleComment'), - 'Cmd-/': (cm) => cm.execCommand('toggleComment'), - "Ctrl-R": (cm) => cm.foldCode(cm.getCursor()) + Tab: (cm) => cm.execCommand('insertSoftTab'), + 'Ctrl-/': (cm) => cm.execCommand('toggleComment'), + 'Cmd-/': (cm) => cm.execCommand('toggleComment'), + 'Shift-Ctrl-F': (cm) => cm.foldCode(cm.getCursor(), { scanUp : true }) }, highlightSelectionMatches: { annotateScrollbar: true }, matchBrackets: true, inputStyle: 'contenteditable', spellcheck: localStorage.getItem('WW_PGEditor_spellcheck') === 'true', gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"], - foldGutter: { - rangeFinder: new CodeMirror.fold.combine(CodeMirror.fold.PG) - }, - fold: "PG" + foldGutter: { rangeFinder: new CodeMirror.fold.combine(CodeMirror.fold.PG) }, + fold: 'PG' }); cm.setSize('100%', '550px'); diff --git a/lib/WeBWorK/HTML/CodeMirrorEditor.pm b/lib/WeBWorK/HTML/CodeMirrorEditor.pm index 54a685ae72..c26b45ce90 100644 --- a/lib/WeBWorK/HTML/CodeMirrorEditor.pm +++ b/lib/WeBWorK/HTML/CodeMirrorEditor.pm @@ -61,7 +61,8 @@ use constant CODEMIRROR_ADDONS_JS => [ 'search/searchcursor.js', 'search/matchesonscrollbar.js', 'search/match-highlighter.js', 'search/match-highlighter.js', 'scroll/annotatescrollbar.js', 'edit/matchbrackets.js', - 'comment/comment.js', 'fold/foldcode.js' + 'comment/comment.js', 'fold/foldcode.js', + 'fold/foldgutter.js' ]; sub generate_codemirror_html ($c, $name, $contents = '', $mode = 'PG') { From 68b9984b108630c07f56400a6345a804108facda Mon Sep 17 00:00:00 2001 From: Peter Staab Date: Wed, 28 Jun 2023 18:02:30 -0400 Subject: [PATCH 080/549] Add foldAll and unfoldAll key bindings. --- htdocs/js/PGCodeMirror/PG.js | 1 - htdocs/js/PGCodeMirror/pgeditor.js | 4 +++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/js/PGCodeMirror/PG.js b/htdocs/js/PGCodeMirror/PG.js index 89320d5388..d724fb99f0 100644 --- a/htdocs/js/PGCodeMirror/PG.js +++ b/htdocs/js/PGCodeMirror/PG.js @@ -1438,7 +1438,6 @@ return; }); - CodeMirror.defineMIME("text/x-perl", "perl"); // it's like "peek", but need for look-ahead or look-behind if index < 0 diff --git a/htdocs/js/PGCodeMirror/pgeditor.js b/htdocs/js/PGCodeMirror/pgeditor.js index b6e65dcbcc..c5b904abe0 100644 --- a/htdocs/js/PGCodeMirror/pgeditor.js +++ b/htdocs/js/PGCodeMirror/pgeditor.js @@ -79,7 +79,9 @@ Tab: (cm) => cm.execCommand('insertSoftTab'), 'Ctrl-/': (cm) => cm.execCommand('toggleComment'), 'Cmd-/': (cm) => cm.execCommand('toggleComment'), - 'Shift-Ctrl-F': (cm) => cm.foldCode(cm.getCursor(), { scanUp : true }) + 'Shift-Ctrl-F': (cm) => cm.foldCode(cm.getCursor(), { scanUp : true }), + 'Shift-Ctrl-A': (cm) => CodeMirror.commands.foldAll(cm), + 'Shift-Ctrl-U': (cm) => CodeMirror.commands.unfoldAll(cm), }, highlightSelectionMatches: { annotateScrollbar: true }, matchBrackets: true, From 43c92703bcad6493ff765f915e8c3fc727376f73 Mon Sep 17 00:00:00 2001 From: Peter Staab Date: Thu, 29 Jun 2023 07:51:06 -0400 Subject: [PATCH 081/549] Update the regular expression defining the start folding block. update --- htdocs/js/PGCodeMirror/PG.js | 10 ++++++---- htdocs/js/PGCodeMirror/pgeditor.js | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/htdocs/js/PGCodeMirror/PG.js b/htdocs/js/PGCodeMirror/PG.js index d724fb99f0..15396a7197 100644 --- a/htdocs/js/PGCodeMirror/PG.js +++ b/htdocs/js/PGCodeMirror/PG.js @@ -1421,11 +1421,13 @@ CodeMirror.registerHelper("wordChars", "perl", /[\w$]/); - CodeMirror.registerHelper('fold','PG', (cm,start) => { - const m1 = /BEGIN_(PGML|PGML_SOLUTION|PGML_HINT|TEXT|TIKZ|LATEX_IMAGE)\s*$/.exec(cm.getLine(start.line)); + CodeMirror.registerHelper('fold', 'PG', (cm, start) => { + const m1 = + /^\s*BEGIN_(PGML|PGML_SOLUTION|PGML_HINT|TEXT)\s*$/.exec(cm.getLine(start.line)) || + /^\s*[$\w]*\s*->\s*BEGIN_(TIKZ|LATEX_IMAGE)\s*$/.exec(cm.getLine(start.line)); const m2 = /^\s*(Section|Scaffold)::Begin/.exec(cm.getLine(start.line)); - if(m1 || m2 ){ - for (let current_line = start.line +1; current_line <= cm.lineCount(); current_line++){ + if (m1 || m2) { + for (let current_line = start.line + 1; current_line <= cm.lineCount(); ++current_line) { const end_re = m1 ? RegExp(`END_${m1[1]}`) : RegExp(`${m2[1]}::End`); if(end_re.test(cm.getLine(current_line))) { return { diff --git a/htdocs/js/PGCodeMirror/pgeditor.js b/htdocs/js/PGCodeMirror/pgeditor.js index c5b904abe0..de064c38ba 100644 --- a/htdocs/js/PGCodeMirror/pgeditor.js +++ b/htdocs/js/PGCodeMirror/pgeditor.js @@ -87,7 +87,7 @@ matchBrackets: true, inputStyle: 'contenteditable', spellcheck: localStorage.getItem('WW_PGEditor_spellcheck') === 'true', - gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"], + gutters: ['CodeMirror-linenumbers', 'CodeMirror-foldgutter'], foldGutter: { rangeFinder: new CodeMirror.fold.combine(CodeMirror.fold.PG) }, fold: 'PG' }); From 97a8e50b982dd6c395c781f49c7ea921947fa34d Mon Sep 17 00:00:00 2001 From: Peter Staab Date: Thu, 6 Jul 2023 09:04:21 -0400 Subject: [PATCH 082/549] Customize the commenting code to handle different parts a PGML file. --- htdocs/js/PGCodeMirror/PG.js | 2 +- htdocs/js/PGCodeMirror/comment.js | 265 +++++++++++++++++++++ htdocs/js/PGCodeMirror/pgeditor.js | 1 + lib/WeBWorK/HTML/CodeMirrorEditor.pm | 3 +- templates/HTML/CodeMirrorEditor/js.html.ep | 1 + 5 files changed, 269 insertions(+), 3 deletions(-) create mode 100644 htdocs/js/PGCodeMirror/comment.js diff --git a/htdocs/js/PGCodeMirror/PG.js b/htdocs/js/PGCodeMirror/PG.js index 15396a7197..debcc25100 100644 --- a/htdocs/js/PGCodeMirror/PG.js +++ b/htdocs/js/PGCodeMirror/PG.js @@ -1017,7 +1017,7 @@ return tokenPGMLComment(stream,state,"```",style,newPrevState); } } else if (stream.match(/^\[%/)) { // Comment - style = "bracket"; + style = "comment"; state.tokenize = function(stream,state) { return tokenPGMLComment(stream,state,"%\\]",style,newPrevState); } diff --git a/htdocs/js/PGCodeMirror/comment.js b/htdocs/js/PGCodeMirror/comment.js new file mode 100644 index 0000000000..49fd229f14 --- /dev/null +++ b/htdocs/js/PGCodeMirror/comment.js @@ -0,0 +1,265 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/5/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + var noOptions = {}; + var nonWS = /[^\s\u00a0]/; + var Pos = CodeMirror.Pos, cmp = CodeMirror.cmpPos; + + function firstNonWS(str) { + var found = str.search(nonWS); + return found == -1 ? 0 : found; + } + + CodeMirror.commands.toggleComment = function(cm) { + cm.toggleComment(); + }; + + CodeMirror.defineExtension("toggleComment", function(options) { + if (!options) options = noOptions; + var cm = this; + var minLine = Infinity, ranges = this.listSelections(), mode = null; + for (var i = ranges.length - 1; i >= 0; i--) { + var from = ranges[i].from(), to = ranges[i].to(); + if (from.line >= minLine) continue; + if (to.line >= minLine) to = Pos(minLine, 0); + minLine = from.line; + if (mode == null) { + if (cm.uncomment(from, to, options)) mode = "un"; + else { cm.lineComment(from, to, options); mode = "line"; } + } else if (mode == "un") { + cm.uncomment(from, to, options); + } else { + cm.lineComment(from, to, options); + } + } + }); + + // Rough heuristic to try and detect lines that are part of multi-line string + function probablyInsideString(cm, pos, line) { + return /\bstring\b/.test(cm.getTokenTypeAt(Pos(pos.line, 0))) && !/^[\'\"\`]/.test(line) + } + + const md_section = RegExp('DESCRIPTION|KEYWORDS|DBsubject|DBchapter|DBsection|Date|Author|Institution ' + + '|MO|Static|TitleText|EditionText|AuthorText|Section|Problem|Language|Level'; + + // Custom version of getMode for PG files. + function getMode(cm, pos) { + const mode = cm.getModeAt(pos); + // Clear any comment fields of mode. + delete mode.lineComment; + delete mode.blockCommentStart; + delete mode.blockCommentEnd; + + if(md_section.test(cm.getLine(pos.line)) || insideDescriptionBlock(cm, pos)) { + mode.lineComment = '##'; + mode.name = 'PG_meta'; + } else if (inPGMLBlock(cm, pos)) { + mode.name = 'PGML'; + mode.blockCommentStart = '[%'; + mode.blockCommentEnd = '%]'; + } else if (inTikzBlock(cm, pos)) { + mode.lineComment = '%'; + mode.name = 'tikz'; + } else { + mode.name = 'perl'; + mode.lineComment = '#'; + } + return mode; + } + + function insideDescriptionBlock(cm, pos) { + for(let line = pos.line; line >= 0; --line) { + if (/ENDDESCRIPTION/.test(cm.getLine(line))) return false; + if (/DESCRIPTION/.test(cm.getLine(line))) return true; + } + return false; + } + + function inTikzBlock(cm, pos) { + for(let line = pos.line; line >= 0; --line){ + if (/BEGIN_TIKZ|BEGIN_LATEX_IMAGE/.test(cm.getLine(line))) return true; + if (/END_PGML|END_TIKZ|END_LATEX_IMAGE/.test(cm.getLine(line))) return false; + } + return false; + } + + function inPGMLBlock(cm, pos) { + for(let line = pos.line; line >= 0; --line){ + if (/BEGIN_PGML/.test(cm.getLine(line))) return true; + if (/END_PGML/.test(cm.getLine(line))) return false; + } + return false; + } + + + CodeMirror.defineExtension("lineComment", function(from, to, options) { + if (!options) options = noOptions; + var self = this, mode = getMode(self, from); + var firstLine = self.getLine(from.line); + if (firstLine == null || probablyInsideString(self, from, firstLine)) return; + + var commentString = options.lineComment || mode.lineComment; + if (!commentString) { + if (options.blockCommentStart || mode.blockCommentStart) { + options.fullLines = true; + self.blockComment(from, to, options); + } + return; + } + + var end = Math.min(to.ch != 0 || to.line == from.line ? to.line + 1 : to.line, self.lastLine() + 1); + var pad = options.padding == null ? " " : options.padding; + var blankLines = options.commentBlankLines || from.line == to.line; + + self.operation(function() { + if (options.indent) { + var baseString = null; + for (var i = from.line; i < end; ++i) { + var line = self.getLine(i); + var whitespace = line.search(nonWS) === -1 ? line : line.slice(0, firstNonWS(line)); + if (baseString == null || baseString.length > whitespace.length) { + baseString = whitespace; + } + } + for (var i = from.line; i < end; ++i) { + var line = self.getLine(i), cut = baseString.length; + if (!blankLines && !nonWS.test(line)) continue; + if (line.slice(0, cut) != baseString) cut = firstNonWS(line); + self.replaceRange(baseString + commentString + pad, Pos(i, 0), Pos(i, cut)); + } + } else { + for (var i = from.line; i < end; ++i) { + if (blankLines || nonWS.test(self.getLine(i))) + self.replaceRange(commentString + pad, Pos(i, 0)); + } + } + }); + }); + + CodeMirror.defineExtension("blockComment", function(from, to, options) { + if (!options) options = noOptions; + var self = this, mode = getMode(self, from); + var startString = options.blockCommentStart || mode.blockCommentStart; + var endString = options.blockCommentEnd || mode.blockCommentEnd; + if (!startString || !endString) { + if ((options.lineComment || mode.lineComment) && options.fullLines != false) + self.lineComment(from, to, options); + return; + } + if (/\bcomment\b/.test(self.getTokenTypeAt(Pos(from.line, 0)))) return + + var end = Math.min(to.line, self.lastLine()); + if (end != from.line && to.ch == 0 && nonWS.test(self.getLine(end))) --end; + + var pad = options.padding == null ? " " : options.padding; + if (from.line > end) return; + + self.operation(function() { + if (options.fullLines != false) { + var lastLineHasText = nonWS.test(self.getLine(end)); + self.replaceRange(pad + endString, Pos(end)); + self.replaceRange(startString + pad, Pos(from.line, 0)); + var lead = options.blockCommentLead || mode.blockCommentLead; + if (lead != null) for (var i = from.line + 1; i <= end; ++i) + if (i != end || lastLineHasText) + self.replaceRange(lead + pad, Pos(i, 0)); + } else { + var atCursor = cmp(self.getCursor("to"), to) == 0, empty = !self.somethingSelected() + self.replaceRange(endString, to); + if (atCursor) self.setSelection(empty ? to : self.getCursor("from"), to) + self.replaceRange(startString, from); + } + }); + }); + + CodeMirror.defineExtension("uncomment", function(from, to, options) { + console.log('uncommenting'); + if (!options) options = noOptions; + var self = this, mode = getMode(self, from); + console.log(mode); + var end = Math.min(to.ch != 0 || to.line == from.line ? to.line : to.line - 1, self.lastLine()), start = Math.min(from.line, end); + + // Try finding line comments + var lineString = options.lineComment || mode.lineComment, lines = []; + var pad = options.padding == null ? " " : options.padding, didSomething; + lineComment: { + console.log(lineString); + if (!lineString) break lineComment; + for (var i = start; i <= end; ++i) { + var line = self.getLine(i); + var found = line.indexOf(lineString); + console.log(found); + console.log(self.getTokenTypeAt(Pos(i, found + 1))); + if (found > -1 && !/comment/.test(self.getTokenTypeAt(Pos(i, found + 1)))) found = -1; + if (found == -1 && nonWS.test(line)) break lineComment; + if (found > -1 && nonWS.test(line.slice(0, found))) break lineComment; + lines.push(line); + } + console.log(lines); + self.operation(function() { + for (var i = start; i <= end; ++i) { + var line = lines[i - start]; + var pos = line.indexOf(lineString), endPos = pos + lineString.length; + if (pos < 0) continue; + if (line.slice(endPos, endPos + pad.length) == pad) endPos += pad.length; + didSomething = true; + self.replaceRange("", Pos(i, pos), Pos(i, endPos)); + } + }); + if (didSomething) return true; + } + + // Try block comments + var startString = options.blockCommentStart || mode.blockCommentStart; + var endString = options.blockCommentEnd || mode.blockCommentEnd; + if (!startString || !endString) return false; + var lead = options.blockCommentLead || mode.blockCommentLead; + var startLine = self.getLine(start), open = startLine.indexOf(startString) + if (open == -1) return false + var endLine = end == start ? startLine : self.getLine(end) + var close = endLine.indexOf(endString, end == start ? open + startString.length : 0); + var insideStart = Pos(start, open + 1), insideEnd = Pos(end, close + 1); + if (close == -1 || + !/comment/.test(self.getTokenTypeAt(insideStart)) || + !/comment/.test(self.getTokenTypeAt(insideEnd)) || + self.getRange(insideStart, insideEnd, "\n").indexOf(endString) > -1) + return false; + + // Avoid killing block comments completely outside the selection. + // Positions of the last startString before the start of the selection, and the first endString after it. + var lastStart = startLine.lastIndexOf(startString, from.ch); + var firstEnd = lastStart == -1 ? -1 : startLine.slice(0, from.ch).indexOf(endString, lastStart + startString.length); + if (lastStart != -1 && firstEnd != -1 && firstEnd + endString.length != from.ch) return false; + // Positions of the first endString after the end of the selection, and the last startString before it. + firstEnd = endLine.indexOf(endString, to.ch); + var almostLastStart = endLine.slice(to.ch).lastIndexOf(startString, firstEnd - to.ch); + lastStart = (firstEnd == -1 || almostLastStart == -1) ? -1 : to.ch + almostLastStart; + if (firstEnd != -1 && lastStart != -1 && lastStart != to.ch) return false; + + self.operation(function() { + self.replaceRange("", Pos(end, close - (pad && endLine.slice(close - pad.length, close) == pad ? pad.length : 0)), + Pos(end, close + endString.length)); + var openEnd = open + startString.length; + if (pad && startLine.slice(openEnd, openEnd + pad.length) == pad) openEnd += pad.length; + self.replaceRange("", Pos(start, open), Pos(start, openEnd)); + if (lead) for (var i = start + 1; i <= end; ++i) { + var line = self.getLine(i), found = line.indexOf(lead); + if (found == -1 || nonWS.test(line.slice(0, found))) continue; + var foundEnd = found + lead.length; + if (pad && line.slice(foundEnd, foundEnd + pad.length) == pad) foundEnd += pad.length; + self.replaceRange("", Pos(i, found), Pos(i, foundEnd)); + } + }); + return true; + }); +}); \ No newline at end of file diff --git a/htdocs/js/PGCodeMirror/pgeditor.js b/htdocs/js/PGCodeMirror/pgeditor.js index de064c38ba..6556b9ac02 100644 --- a/htdocs/js/PGCodeMirror/pgeditor.js +++ b/htdocs/js/PGCodeMirror/pgeditor.js @@ -130,4 +130,5 @@ forceRTL.addEventListener('change', () => { cm.setOption('direction', forceRTL.checked ? 'rtl' : 'ltr'); }); + })(); diff --git a/lib/WeBWorK/HTML/CodeMirrorEditor.pm b/lib/WeBWorK/HTML/CodeMirrorEditor.pm index c26b45ce90..84070892aa 100644 --- a/lib/WeBWorK/HTML/CodeMirrorEditor.pm +++ b/lib/WeBWorK/HTML/CodeMirrorEditor.pm @@ -61,8 +61,7 @@ use constant CODEMIRROR_ADDONS_JS => [ 'search/searchcursor.js', 'search/matchesonscrollbar.js', 'search/match-highlighter.js', 'search/match-highlighter.js', 'scroll/annotatescrollbar.js', 'edit/matchbrackets.js', - 'comment/comment.js', 'fold/foldcode.js', - 'fold/foldgutter.js' + 'fold/foldcode.js', 'fold/foldgutter.js' ]; sub generate_codemirror_html ($c, $name, $contents = '', $mode = 'PG') { diff --git a/templates/HTML/CodeMirrorEditor/js.html.ep b/templates/HTML/CodeMirrorEditor/js.html.ep index db04dc693d..33a4be141f 100644 --- a/templates/HTML/CodeMirrorEditor/js.html.ep +++ b/templates/HTML/CodeMirrorEditor/js.html.ep @@ -24,6 +24,7 @@ % } % <%= javascript getAssetURL($ce, 'js/PGCodeMirror/pgeditor.js'), defer => undef =%> + <%= javascript getAssetURL($ce, 'js/PGCodeMirror/comment.js'), defer => undef =%> % end % } % From 23ef879be2941b9c050fdb7654ebc5b0cb619618 Mon Sep 17 00:00:00 2001 From: Peter Staab Date: Thu, 6 Jul 2023 10:37:54 -0400 Subject: [PATCH 083/549] Fix an error, remove console.logs, update keyboard shortcut and add help --- htdocs/js/PGCodeMirror/comment.js | 8 +------- htdocs/js/PGCodeMirror/pgeditor.js | 5 ++++- templates/HelpFiles/InstructorPGProblemEditor.html.ep | 5 ++++- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/htdocs/js/PGCodeMirror/comment.js b/htdocs/js/PGCodeMirror/comment.js index 49fd229f14..0735a801e1 100644 --- a/htdocs/js/PGCodeMirror/comment.js +++ b/htdocs/js/PGCodeMirror/comment.js @@ -50,7 +50,7 @@ } const md_section = RegExp('DESCRIPTION|KEYWORDS|DBsubject|DBchapter|DBsection|Date|Author|Institution ' + - '|MO|Static|TitleText|EditionText|AuthorText|Section|Problem|Language|Level'; + '|MO|Static|TitleText|EditionText|AuthorText|Section|Problem|Language|Level'); // Custom version of getMode for PG files. function getMode(cm, pos) { @@ -183,29 +183,23 @@ }); CodeMirror.defineExtension("uncomment", function(from, to, options) { - console.log('uncommenting'); if (!options) options = noOptions; var self = this, mode = getMode(self, from); - console.log(mode); var end = Math.min(to.ch != 0 || to.line == from.line ? to.line : to.line - 1, self.lastLine()), start = Math.min(from.line, end); // Try finding line comments var lineString = options.lineComment || mode.lineComment, lines = []; var pad = options.padding == null ? " " : options.padding, didSomething; lineComment: { - console.log(lineString); if (!lineString) break lineComment; for (var i = start; i <= end; ++i) { var line = self.getLine(i); var found = line.indexOf(lineString); - console.log(found); - console.log(self.getTokenTypeAt(Pos(i, found + 1))); if (found > -1 && !/comment/.test(self.getTokenTypeAt(Pos(i, found + 1)))) found = -1; if (found == -1 && nonWS.test(line)) break lineComment; if (found > -1 && nonWS.test(line.slice(0, found))) break lineComment; lines.push(line); } - console.log(lines); self.operation(function() { for (var i = start; i <= end; ++i) { var line = lines[i - start]; diff --git a/htdocs/js/PGCodeMirror/pgeditor.js b/htdocs/js/PGCodeMirror/pgeditor.js index 6556b9ac02..83ce2cd978 100644 --- a/htdocs/js/PGCodeMirror/pgeditor.js +++ b/htdocs/js/PGCodeMirror/pgeditor.js @@ -80,8 +80,11 @@ 'Ctrl-/': (cm) => cm.execCommand('toggleComment'), 'Cmd-/': (cm) => cm.execCommand('toggleComment'), 'Shift-Ctrl-F': (cm) => cm.foldCode(cm.getCursor(), { scanUp : true }), + 'Shift-Cmd-F': (cm) => cm.foldCode(cm.getCursor(), { scanUp : true }), 'Shift-Ctrl-A': (cm) => CodeMirror.commands.foldAll(cm), - 'Shift-Ctrl-U': (cm) => CodeMirror.commands.unfoldAll(cm), + 'Shift-Cmd-A': (cm) => CodeMirror.commands.foldAll(cm), + 'Shift-Ctrl-G': (cm) => CodeMirror.commands.unfoldAll(cm), + 'Shift-Cmd-G': (cm) => CodeMirror.commands.unfoldAll(cm), }, highlightSelectionMatches: { annotateScrollbar: true }, matchBrackets: true, diff --git a/templates/HelpFiles/InstructorPGProblemEditor.html.ep b/templates/HelpFiles/InstructorPGProblemEditor.html.ep index d7b5395cc6..6060384fd7 100644 --- a/templates/HelpFiles/InstructorPGProblemEditor.html.ep +++ b/templates/HelpFiles/InstructorPGProblemEditor.html.ep @@ -75,7 +75,10 @@
    <%= maketext('The large text window') %>
    <%= maketext('This is where you edit the text of the problem template. Type Ctrl-Enter while this ' - . 'window has focus to re-render the problem.') =%> + . 'window has focus to re-render the problem. Code folding is enabled either by clicking on ' + . 'the triangles in the gutter next to line numbers or using the shortcut Shift-Ctrl-F. Folding ' + . 'all regions can be accomplished with Shift-Ctrl-A and unfold all regions with Shift-Ctrl-G. ' + . 'Comments can be toggled with Ctrl-/.') =%>
    <%= maketext('Text Editor Options') %>
    From ce80af5a425e8d87bb2dc4d82f6a00eb1462b456 Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Thu, 6 Jul 2023 12:17:29 -0700 Subject: [PATCH 084/549] have LTI 1.1 and 1.3 authentication available by default --- conf/authen_LTI.conf.dist | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/conf/authen_LTI.conf.dist b/conf/authen_LTI.conf.dist index 869553dbca..091bdc4e89 100644 --- a/conf/authen_LTI.conf.dist +++ b/conf/authen_LTI.conf.dist @@ -35,24 +35,21 @@ $debug_lti_grade_passback = 0; # Authentication settings ################################################################################################ -# This section enables LTI authentication. If your site only uses LTI 1.1, then leave the -# LTIAdvantage module commented out. If your site only uses LTI 1.3, then comment out the -# LTIAdvanced module and uncomment the LTIAdvantage module. Both modules can enabled -# (uncommented) for the site, but only one module can be used per course. Make sure that the -# matching configuration files are included below. Failover to Basic_TheLastOption is necessary -# to authenticate with cookie keys. +# This section enables LTI authentication. If a course uses LTI 1.1 (see $LTIVersion below), +# then the LTIAdvanced module will be used. If a course uses LTI 1.3 (see $LTIVersion below), +# the LTIAdvantage will be used. If you know a site will not use one or the other, it can be +# commented out. Failover to Basic_TheLastOption is necessary to authenticate with cookie keys. $authen{user_module} = [ - { '*' => 'WeBWorK::Authen::LTIAdvanced' }, # preferred authorization method - #{ '*' => 'WeBWorK::Authen::LTIAdvantage' }, # secondary authorization method + { '*' => 'WeBWorK::Authen::LTIAdvantage' }, # first try LTI 1.3 + { '*' => 'WeBWorK::Authen::LTIAdvanced' }, # next try LTI 1.1 { '*' => 'WeBWorK::Authen::Basic_TheLastOption' } # fallback authorization method ]; -# Include configurations. Comment out or uncomment either of the following lines to match the -# selected modules above. You will have to copy the file authen_LTI_1_1.conf.dist to -# authen_LTI_1_1.conf, and then edit that file to fill in the settings for LTI 1.1. You will -# have to copy the file authen_LTI_1_3.conf.dist to authen_LTI_1_3.conf, and then edit that file -# to fill in the settings for LTI 1.3. -include('conf/authen_LTI_1_1.conf'); +# Include configurations. You must uncomment at least one of the following. You may uncomment +# both if the site may be using both LTI 1.1 and 1.3 in different courses. After uncommenting +# the LTI_1_x line, you must copy the file authen_LTI_1_x.conf.dist to authen_LTI_1_x.conf and +# then edit that file to fill in the settings for LTI_1_x. +#include('conf/authen_LTI_1_1.conf'); #include('conf/authen_LTI_1_3.conf'); # This is the default LTI version that will be used for the site. This must be 'v1p1' for LTI From 79ec5910d4d1be48fc6ea7acd733b5f4c6834180 Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Thu, 13 Jul 2023 05:25:12 -0500 Subject: [PATCH 085/549] Fix download-OPL-metadata-release.pl to not need write permission to the cwd. Currently the File::Fetch module downloads the release data JSON file from GitHub and slurps its contents into a scalar. When I implemented this, I thought I was avoiding disk IO with this approach. However, File::Fetch is not that well implemented as it turns out. What it is actually doing is creating a temporary directory in the current working directory, downloading the file into that directory, and then slurping the contents. This means that you must have write permission for whatever directory you are running the script from in order for the script to work. This switches to downloading the file into the `$ce->{webworkDirs}{tmp}` directory, then uses Mojo::File to slurp the contents of the downloaded file. Once the file is read, then the file is deleted. So basically, this does the same thing, except it chooses which temporary directory is used for the download. You already need to have write permission for `$ce->{webworkDirs}{tmp}` for the script to work, since that is where the actual OPL metadata release is downloaded to. See https://webwork.maa.org/moodle/mod/forum/discuss.php?d=8270 for the problems caused by the current method. --- bin/download-OPL-metadata-release.pl | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/bin/download-OPL-metadata-release.pl b/bin/download-OPL-metadata-release.pl index 4391780e3c..fbd10e98bc 100755 --- a/bin/download-OPL-metadata-release.pl +++ b/bin/download-OPL-metadata-release.pl @@ -9,6 +9,7 @@ use File::Fetch; use File::Copy; use File::Path; +use Mojo::File; use JSON; BEGIN { @@ -26,11 +27,16 @@ BEGIN my $ce = WeBWorK::CourseEnvironment->new({ webwork_dir => $ENV{WEBWORK_ROOT} }); -my $rawData; +# Make sure the webwork temporary directory exists and is writable before proceeding. +die "The WeBWorK temporary directory $ce->{webworkDirs}{tmp} does not exist or is not writable." + if (!-d $ce->{webworkDirs}{tmp} || !-w $ce->{webworkDirs}{tmp}); + my $releaseDataFF = File::Fetch->new(uri => 'https://api.github.com/repos/openwebwork/webwork-open-problem-library/releases/latest'); -my $file = $releaseDataFF->fetch(to => \$rawData) or die $releaseDataFF->error; -my $releaseData = JSON->new->utf8->decode($rawData); +my $file = $releaseDataFF->fetch(to => $ce->{webworkDirs}{tmp}) or die $releaseDataFF->error; +my $path = Mojo::File->new($file); +my $releaseData = JSON->new->utf8->decode($path->slurp); +$path->remove; my $releaseTag = $releaseData->{tag_name}; say "Found OPL METADATA release $releaseTag."; @@ -42,10 +48,6 @@ BEGIN die 'Unable to determine download url for OPL metadata release.' if !$downloadURL; -# Make sure the webwork temporary directory exists and is writable before proceeding. -die "The WeBWorK temporary directory $ce->{webworkDirs}{tmp} does not exist or is not writable." - if (!-d $ce->{webworkDirs}{tmp} || !-w $ce->{webworkDirs}{tmp}); - # Download and extract the OPL metadata release. my $releaseDownloadFF = File::Fetch->new(uri => $downloadURL); my $releaseFile = $releaseDownloadFF->fetch(to => $ce->{webworkDirs}{tmp}) or die $releaseDownloadFF->error; From 947744e24551d3957f0c0a52fa502f112ee0b1ff Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Tue, 11 Jul 2023 10:40:44 -0700 Subject: [PATCH 086/549] don't show PG stuff while editing course_info --- .../Instructor/PGProblemEditor.pm | 3 + .../Instructor/PGProblemEditor.html.ep | 112 +++++++++--------- .../PGProblemEditor/add_problem_form.html.ep | 2 +- .../PGProblemEditor/hardcopy_form.html.ep | 2 +- .../PGProblemEditor/pgtidy_form.html.ep | 3 +- .../PGProblemEditor/view_form.html.ep | 42 +++---- 6 files changed, 85 insertions(+), 79 deletions(-) diff --git a/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm b/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm index 91aafb23d0..c007be723a 100644 --- a/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm +++ b/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm @@ -233,6 +233,9 @@ sub initialize ($c) { $c->stash->{formsToShow} = ACTION_FORMS(); $c->stash->{actionFormTitles} = ACTION_FORM_TITLES(); + # Tell the templates if we are working on a PG file + $c->{is_pg} = ($c->{file_type} eq 'course_info') ? 0 : 1; + # Check permissions return unless $authz->hasPermissions($user, 'access_instructor_tools') diff --git a/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep b/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep index 00a8d3db44..6392b7cc30 100644 --- a/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep +++ b/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep @@ -83,65 +83,67 @@ % } % % # PG problem authoring resource links -
    - % # http://webwork.maa.org/wiki/Category:Problem_Techniques - <%= link_to maketext('Problem Techniques') => $ce->{webworkURLs}{problemTechniquesHelpURL}, - target => 'techniques_window', - title => maketext('Snippets of PG code illustrating specific techniques'), - class => 'reference-link btn btn-sm btn-info', - data => { bs_toggle => 'tooltip', bs_placement => 'top' } =%> - % # http://webwork.maa.org/wiki/Category:MathObjects - <%= link_to maketext('Math Objects') => $ce->{webworkURLs}{MathObjectsHelpURL}, - target => 'math_objects', - title => maketext('Wiki summary page for MathObjects'), - class => 'reference-link btn btn-sm btn-info', - data => { bs_toggle => 'tooltip', bs_placement => 'top' } =%> - % # PG POD served locally - <%= link_to maketext('POD') => url_for('pod_index'), - target => 'pod_docs', - title => maketext('Documentation from source code for PG modules and macro files.'), - class => 'reference-link btn btn-sm btn-info', - data => { bs_toggle => 'tooltip', bs_placement => 'top' } =%> - % # PGML lab problem rendered as an unattached problem in a new window. - % if (-e "$ce->{courseDirs}{templates}/PGMLLab/PGML-lab.pg") { - <%= link_to maketext('PGML') => $c->systemLink( - url_for('problem_detail', setID => 'Undefined_Set', problemID => 1), - params => { - displayMode => $ce->{pg}{options}{displayMode}, - problemSeed => 1234, - editMode => 'temporaryFile', - sourceFilePath => 'PGMLLab/PGML-lab.pg' - } - ), - target => 'PGML', - title => maketext( - 'PG markdown syntax used to format WeBWorK questions. ' - . 'This interactive lab can help you to learn the techniques.' - ), + % if ($c->{is_pg}) { +
    + % # http://webwork.maa.org/wiki/Category:Problem_Techniques + <%= link_to maketext('Problem Techniques') => $ce->{webworkURLs}{problemTechniquesHelpURL}, + target => 'techniques_window', + title => maketext('Snippets of PG code illustrating specific techniques'), class => 'reference-link btn btn-sm btn-info', data => { bs_toggle => 'tooltip', bs_placement => 'top' } =%> - % } - % # http://webwork.maa.org/wiki/Category:Authors - <%= link_to maketext('Author Info') => $ce->{webworkURLs}{AuthorHelpURL}, - target => 'author_info', - title => maketext('Top level of author information on the wiki.'), - class => 'reference-link btn btn-sm btn-info', - data => { bs_toggle => 'tooltip', bs_placement => 'top' } =%> - % # Only show the report bugs in problem button if editing an OPL or Contrib problem. - % if ($c->{editFilePath} =~ m|^$ce->{courseDirs}{templates}/([^/]*)/| && ($1 eq 'Library' || $1 eq 'Contrib')) { - <%= link_to maketext('Report Bugs in this Problem') => - "$ce->{webworkURLs}{bugReporter}?product=Problem%20libraries" - . "&component=$1&bug_file_loc=$c->{editFilePath}_with_problemSeed=$c->{problemSeed}", - target => 'bug_report', - title => maketext( - 'Report bugs in a WeBWorK question/problem using this link. ' - . 'The very first time you do this you will need to register with an email address so that ' - . 'information on the bug fix can be reported back to you.' - ), + % # http://webwork.maa.org/wiki/Category:MathObjects + <%= link_to maketext('Math Objects') => $ce->{webworkURLs}{MathObjectsHelpURL}, + target => 'math_objects', + title => maketext('Wiki summary page for MathObjects'), class => 'reference-link btn btn-sm btn-info', data => { bs_toggle => 'tooltip', bs_placement => 'top' } =%> - % } -
    + % # PG POD served locally + <%= link_to maketext('POD') => url_for('pod_index'), + target => 'pod_docs', + title => maketext('Documentation from source code for PG modules and macro files.'), + class => 'reference-link btn btn-sm btn-info', + data => { bs_toggle => 'tooltip', bs_placement => 'top' } =%> + % # PGML lab problem rendered as an unattached problem in a new window. + % if (-e "$ce->{courseDirs}{templates}/PGMLLab/PGML-lab.pg") { + <%= link_to maketext('PGML') => $c->systemLink( + url_for('problem_detail', setID => 'Undefined_Set', problemID => 1), + params => { + displayMode => $ce->{pg}{options}{displayMode}, + problemSeed => 1234, + editMode => 'temporaryFile', + sourceFilePath => 'PGMLLab/PGML-lab.pg' + } + ), + target => 'PGML', + title => maketext( + 'PG markdown syntax used to format WeBWorK questions. ' + . 'This interactive lab can help you to learn the techniques.' + ), + class => 'reference-link btn btn-sm btn-info', + data => { bs_toggle => 'tooltip', bs_placement => 'top' } =%> + % } + % # http://webwork.maa.org/wiki/Category:Authors + <%= link_to maketext('Author Info') => $ce->{webworkURLs}{AuthorHelpURL}, + target => 'author_info', + title => maketext('Top level of author information on the wiki.'), + class => 'reference-link btn btn-sm btn-info', + data => { bs_toggle => 'tooltip', bs_placement => 'top' } =%> + % # Only show the report bugs in problem button if editing an OPL or Contrib problem. + % if ($c->{editFilePath} =~ m|^$ce->{courseDirs}{templates}/([^/]*)/| && ($1 eq 'Library' || $1 eq 'Contrib')) { + <%= link_to maketext('Report Bugs in this Problem') => + "$ce->{webworkURLs}{bugReporter}?product=Problem%20libraries" + . "&component=$1&bug_file_loc=$c->{editFilePath}_with_problemSeed=$c->{problemSeed}", + target => 'bug_report', + title => maketext( + 'Report bugs in a WeBWorK question/problem using this link. ' + . 'The very first time you do this you will need to register with an email address so that ' + . 'information on the bug fix can be reported back to you.' + ), + class => 'reference-link btn btn-sm btn-info', + data => { bs_toggle => 'tooltip', bs_placement => 'top' } =%> + % } +
    + % }
    <%= generate_codemirror_html($c, 'problemContents', $problemContents, $codemirrorMode) =%> diff --git a/templates/ContentGenerator/Instructor/PGProblemEditor/add_problem_form.html.ep b/templates/ContentGenerator/Instructor/PGProblemEditor/add_problem_form.html.ep index b70be31a5c..b7cfc01d53 100644 --- a/templates/ContentGenerator/Instructor/PGProblemEditor/add_problem_form.html.ep +++ b/templates/ContentGenerator/Instructor/PGProblemEditor/add_problem_form.html.ep @@ -1,4 +1,4 @@ -% last if $c->{file_type} eq 'course_info'; +% last unless $c->{is_pg}; % % my $allSetNames = [ map { $_->[0] =~ s/^set|\.def$//gr } $db->listGlobalSetsWhere({}, 'set_id') ]; % diff --git a/templates/ContentGenerator/Instructor/PGProblemEditor/hardcopy_form.html.ep b/templates/ContentGenerator/Instructor/PGProblemEditor/hardcopy_form.html.ep index f963793e05..78daf26267 100644 --- a/templates/ContentGenerator/Instructor/PGProblemEditor/hardcopy_form.html.ep +++ b/templates/ContentGenerator/Instructor/PGProblemEditor/hardcopy_form.html.ep @@ -1,4 +1,4 @@ -% last if $c->{file_type} eq 'course_info'; +% last unless $c->{is_pg}; %
    diff --git a/templates/ContentGenerator/Instructor/PGProblemEditor/pgtidy_form.html.ep b/templates/ContentGenerator/Instructor/PGProblemEditor/pgtidy_form.html.ep index c099b968d5..66398f9e6a 100644 --- a/templates/ContentGenerator/Instructor/PGProblemEditor/pgtidy_form.html.ep +++ b/templates/ContentGenerator/Instructor/PGProblemEditor/pgtidy_form.html.ep @@ -1,5 +1,4 @@ -% # Hardcopy headers are previewed from the hardcopy generation tab. -% last if $c->{file_type} eq 'course_info'; +% last unless $c->{is_pg}; %

    <%= maketext('Reformat the code using perltidy.') =%>

    diff --git a/templates/ContentGenerator/Instructor/PGProblemEditor/view_form.html.ep b/templates/ContentGenerator/Instructor/PGProblemEditor/view_form.html.ep index becf981808..7ed737f015 100644 --- a/templates/ContentGenerator/Instructor/PGProblemEditor/view_form.html.ep +++ b/templates/ContentGenerator/Instructor/PGProblemEditor/view_form.html.ep @@ -2,28 +2,30 @@ % last if $c->{file_type} eq 'hardcopy_header'; %
    -
    - <%= label_for action_view_seed_id => maketext('Using what seed?'), class => 'col-form-label col-auto mb-2' =%> -
    - <%= text_field 'action.view.seed' => $c->{problemSeed}, - id => 'action_view_seed_id', class => 'form-control form-control-sm' =%> + % if ($c->{is_pg}) { +
    + <%= label_for action_view_seed_id => maketext('Using what seed?'), class => 'col-form-label col-auto mb-2' =%> +
    + <%= text_field 'action.view.seed' => $c->{problemSeed}, + id => 'action_view_seed_id', class => 'form-control form-control-sm' =%> +
    +
    + +
    -
    - +
    + <%= label_for action_view_displayMode_id => maketext('Using what display mode?'), + class => 'col-form-label col-auto' =%> +
    + <%= select_field 'action.view.displayMode' => [ + map { [ $_ => $_, $_ eq $c->{displayMode} ? (selected => undef) : () ] } + @{ $ce->{pg}{displayModes}}, @{ $ce->{pg}{additionalPGEditorDisplayModes}} + ], id => 'action_view_displayMode_id', class => 'form-select form-select-sm d-inline w-auto' =%> +
    -
    -
    - <%= label_for action_view_displayMode_id => maketext('Using what display mode?'), - class => 'col-form-label col-auto' =%> -
    - <%= select_field 'action.view.displayMode' => [ - map { [ $_ => $_, $_ eq $c->{displayMode} ? (selected => undef) : () ] } - @{ $ce->{pg}{displayModes}}, @{ $ce->{pg}{additionalPGEditorDisplayModes}} - ], id => 'action_view_displayMode_id', class => 'form-select form-select-sm d-inline w-auto' =%> -
    -
    + % }
    <%= check_box 'newWindowView' => 1, id => 'newWindowView', class => 'form-check-input' =%> From 213e2719d00abadd71e92c230d05eefde0bfffa5 Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Tue, 11 Jul 2023 15:27:32 -0700 Subject: [PATCH 087/549] move LTI update up next to Scoring Tools --- templates/ContentGenerator/Base/links.html.ep | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/templates/ContentGenerator/Base/links.html.ep b/templates/ContentGenerator/Base/links.html.ep index d0356369dc..301e5249ec 100644 --- a/templates/ContentGenerator/Base/links.html.ep +++ b/templates/ContentGenerator/Base/links.html.ep @@ -289,6 +289,10 @@ % if ($authz->hasPermissions($userID, 'score_sets')) { % } + % # LTI Grade Update + % if ($ce->{LTIGradeMode} && $authz->hasPermissions($userID, 'score_sets')) { + + % } % # Achievment Editor % if ($ce->{achievementsEnabled} && $authz->hasPermissions($userID, 'edit_achievements')) { @@ -314,10 +318,6 @@ % if ($authz->hasPermissions($userID, 'manage_course_files')) { % } - % # LTI Grade Update - % if ($ce->{LTIGradeMode} && $authz->hasPermissions($userID, 'score_sets')) { - - % } % # Course Configuration % if ($authz->hasPermissions($userID, "manage_course_files")) { From 72a113aa4d4f42bca603b974ccfc76494c5f04da Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Tue, 11 Jul 2023 10:57:47 -0700 Subject: [PATCH 088/549] clean up some comments, logic, and code --- .../Instructor/PGProblemEditor.pm | 27 ++++++++----------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm b/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm index c007be723a..2fc10e7847 100644 --- a/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm +++ b/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm @@ -89,14 +89,13 @@ The behavior on submit is defined by the value of $file_type and the value of the submit button pressed (the action). Requested actions and aliases + View/Reload action = view + Generate Hardcopy: action = hardcopy + Tidy Code: action = pgtidy Save: action = save Save as: action = save_as - View Problem: action = view - Add this problem to: action = add_problem - Make this set header for: action = add_problem + Append: action = add_problem Revert: action = revert - Generate Hardcopy: action = hardcopy - Tidy Code: action = pgtidy An undefined or invalid action is interpreted as an initial edit of the file. @@ -157,7 +156,7 @@ sub pre_header_initialize ($c) { $c->{problemSeed} = (($c->param('problemSeed') // '') =~ s/^\s*|\s*$//gr) || DEFAULT_SEED(); # Save file to permanent or temporary file, then redirect for viewing if it was requested to view in a new window. - # Any file "saved as" should be assigned to "Undefined_Set" and redirected to be viewed again in the editor. + # Any problem file "saved as" should be assigned to "Undefined_Set" and redirected to be viewed again in the editor. # Problems "saved" or 'refreshed' are to be redirected to the Problem.pm module # Set headers which are "saved" are to be redirected to the ProblemSet.pm page # Hardcopy headers which are "saved" are also to be redirected to the ProblemSet.pm page @@ -175,8 +174,8 @@ sub pre_header_initialize ($c) { $c->{file_type} = $c->param('sourceFilePath') =~ m!/headers/|Header\.pg$! ? 'set_header' : 'source_path_for_problem_file'; } elsif (defined $c->{problemID}) { - if ($c->{problemID} =~ /^\d+$/ && $c->{problemID} == 0) { - $c->{file_type} = 'set_header' unless $c->{file_type} eq 'hardcopy_header'; + if ($c->{problemID} == 0) { + $c->{file_type} = 'set_header'; } else { $c->{file_type} = 'problem'; } @@ -185,12 +184,9 @@ sub pre_header_initialize ($c) { } } - # Clean up sourceFilePath and check that sourceFilePath is relative to the templates file + # Clean up sourceFilePath and check that sourceFilePath is relative to the templates folder if ($c->{file_type} eq 'source_path_for_problem_file') { - my $sourceFilePath = $c->param('sourceFilePath'); - $sourceFilePath =~ s/$ce->{courseDirs}{templates}//; - $sourceFilePath =~ s|^/||; - $c->{sourceFilePath} = $sourceFilePath; + $c->{sourceFilePath} = $c->getRelativeSourceFilePath($c->param('sourceFilePath')); } # Initialize these values in case of failure in the getFilePaths method. @@ -265,7 +261,7 @@ sub initialize ($c) { )); } - # Find the text for the problem, either in the temporary file if it exists, in the original file in the template + # Find the text for the editor, either in the temporary file if it exists, in the original file in the template # directory, or in the problem contents gathered in the initialization phase. my $problemContents = ${ $c->{r_problemContents} }; @@ -379,8 +375,7 @@ sub determineTempEditFilePath ($c, $path) { $c->addbadmessage($c->maketext('The path can not be the temporary edit directory.')); } else { if ($path =~ /^$templatesDirectory/) { - $path =~ s|^$templatesDirectory||; - $path =~ s|^/||; # remove the initial slash if any + $path = $c->getRelativeSourceFilePath($path); $path = "$tmpEditFileDirectory/$path.$user.tmp"; } elsif ($path eq $c->ce->{webworkFiles}{screenSnippets}{blankProblem}) { # Handle the case of the blank problem in snippets. From 25857dcf96e816e338129d4ad39cf08482e4745a Mon Sep 17 00:00:00 2001 From: Danny Glin Date: Fri, 14 Jul 2023 13:40:21 -0600 Subject: [PATCH 089/549] Fix typo (colum -> column) --- .../ContentGenerator/Instructor/SendMail/main_form.html.ep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep b/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep index dd17bc1719..719d408da8 100644 --- a/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep +++ b/templates/ContentGenerator/Instructor/SendMail/main_form.html.ep @@ -111,7 +111,7 @@ $STATUS<%= maketext('Enrolled, Drop, etc.') %> $EMAIL<%= maketext('Email address') %> $LOGIN<%= maketext('Login') %> - $COL[n]<%= maketext('nth colum of merge file') %> + $COL[n]<%= maketext('nth column of merge file') %> $COL[-1]<%= maketext('Last column of merge file') %> From 849c5e7cbdaf60f844de4b0f472021499128c022 Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Sun, 16 Jul 2023 16:07:02 -0500 Subject: [PATCH 090/549] Fix codemirror folding for html and xml. Currently when you edit a course info file in the PG problem editor, there is a console log error. This is because the PG code folding options do not work for htmlmixed mode. This will also happen with the xml mode that will be added in pull request #2114. This uses different options for htmlmixed or xml mode than for PG mode so that folding works for html and xml as well. This also only enables comment toggling for PG mode. That doesn't work for html and xml. --- htdocs/js/PGCodeMirror/pgeditor.js | 25 +++++++++++++++++-------- lib/WeBWorK/HTML/CodeMirrorEditor.pm | 3 ++- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/htdocs/js/PGCodeMirror/pgeditor.js b/htdocs/js/PGCodeMirror/pgeditor.js index 83ce2cd978..e7be652fe5 100644 --- a/htdocs/js/PGCodeMirror/pgeditor.js +++ b/htdocs/js/PGCodeMirror/pgeditor.js @@ -69,16 +69,15 @@ return configName; }; - const cm = webworkConfig.pgCodeMirror = CodeMirror.fromTextArea(document.querySelector('.codeMirrorEditor'), { - mode: document.querySelector('.codeMirrorEditor')?.dataset.mode ?? 'PG', + const mode = document.querySelector('.codeMirrorEditor')?.dataset.mode ?? 'PG'; + const options = { + mode, indentUnit: 4, tabMode: 'spaces', lineNumbers: true, lineWrapping: true, extraKeys: { Tab: (cm) => cm.execCommand('insertSoftTab'), - 'Ctrl-/': (cm) => cm.execCommand('toggleComment'), - 'Cmd-/': (cm) => cm.execCommand('toggleComment'), 'Shift-Ctrl-F': (cm) => cm.foldCode(cm.getCursor(), { scanUp : true }), 'Shift-Cmd-F': (cm) => cm.foldCode(cm.getCursor(), { scanUp : true }), 'Shift-Ctrl-A': (cm) => CodeMirror.commands.foldAll(cm), @@ -90,10 +89,20 @@ matchBrackets: true, inputStyle: 'contenteditable', spellcheck: localStorage.getItem('WW_PGEditor_spellcheck') === 'true', - gutters: ['CodeMirror-linenumbers', 'CodeMirror-foldgutter'], - foldGutter: { rangeFinder: new CodeMirror.fold.combine(CodeMirror.fold.PG) }, - fold: 'PG' - }); + gutters: ['CodeMirror-linenumbers', 'CodeMirror-foldgutter'] + }; + + if (mode === 'PG') { + options.extraKeys['Ctrl-/'] = (cm) => cm.execCommand('toggleComment'); + options.extraKeys['Cmd-/'] = (cm) => cm.execCommand('toggleComment'); + options.foldGutter = { rangeFinder: new CodeMirror.fold.combine(CodeMirror.fold.PG) } + options.fold = 'PG' + } else { + options.foldGutter = true; + } + + const cm = webworkConfig.pgCodeMirror + = CodeMirror.fromTextArea(document.querySelector('.codeMirrorEditor'), options); cm.setSize('100%', '550px'); const currentThemeFile = localStorage.getItem('WW_PGEditor_selected_theme') ?? 'default'; diff --git a/lib/WeBWorK/HTML/CodeMirrorEditor.pm b/lib/WeBWorK/HTML/CodeMirrorEditor.pm index 84070892aa..19e6581d75 100644 --- a/lib/WeBWorK/HTML/CodeMirrorEditor.pm +++ b/lib/WeBWorK/HTML/CodeMirrorEditor.pm @@ -61,7 +61,8 @@ use constant CODEMIRROR_ADDONS_JS => [ 'search/searchcursor.js', 'search/matchesonscrollbar.js', 'search/match-highlighter.js', 'search/match-highlighter.js', 'scroll/annotatescrollbar.js', 'edit/matchbrackets.js', - 'fold/foldcode.js', 'fold/foldgutter.js' + 'fold/foldcode.js', 'fold/foldgutter.js', + 'fold/xml-fold.js' ]; sub generate_codemirror_html ($c, $name, $contents = '', $mode = 'PG') { From b45937be8438b9917044e07429fd594da68b3f7d Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Sat, 15 Jul 2023 21:56:11 -0500 Subject: [PATCH 091/549] Don't strip the password from the input parameters for the rpc endpoints. Password authentication for the rpc endpoints relies on this, and this is the cause of issue #2115. There really is no reason that the password should ever be stripped from the parameters. I suspect someone at some point thought leaving it in the parameters after authentication is complete was some sort of security vulnerability. It really isn't. The parameters are secure in the system. Nothing outside of the application can see them. In fact no real security is even gained by removing this parameter either. So the line modified here could simply be safely deleted instead. For now, I left and only leave the parameter for the rpc endpoints though. --- lib/WeBWorK/Authen.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/WeBWorK/Authen.pm b/lib/WeBWorK/Authen.pm index a8f42216bd..a439b865b6 100644 --- a/lib/WeBWorK/Authen.pm +++ b/lib/WeBWorK/Authen.pm @@ -623,7 +623,7 @@ sub set_params { # A2 - params are not non-modifiable, with no explanation or workaround given in docs. WTF! $c->param("user", $self->{user_id}); $c->param("key", $self->{session_key}); - $c->param("passwd", ""); + $c->param("passwd", "") unless $c->{rpc}; debug("params user='", $c->param("user"), "' key='", $c->param("key"), "'"); } From 1caa11002ec523a6aa7a683f1c42e781ecc4ab53 Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Thu, 20 Jul 2023 02:51:42 -0700 Subject: [PATCH 092/549] move help link outside of h1 --- htdocs/themes/math4/math4.scss | 5 +++++ htdocs/themes/math4/system.html.ep | 8 ++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/htdocs/themes/math4/math4.scss b/htdocs/themes/math4/math4.scss index 70fd6de6f6..364c8f5f92 100644 --- a/htdocs/themes/math4/math4.scss +++ b/htdocs/themes/math4/math4.scss @@ -380,6 +380,11 @@ div.showMeAnotherBox { h1.page-title { font-size: 31.5px; line-height: 35px; + display: inline-block; +} +h1.page-title + a { + font-size: 31.5px; + margin-left: 0.5rem; } h2.page-title { diff --git a/htdocs/themes/math4/system.html.ep b/htdocs/themes/math4/system.html.ep index 8411ff82fa..691919b852 100644 --- a/htdocs/themes/math4/system.html.ep +++ b/htdocs/themes/math4/system.html.ep @@ -124,11 +124,11 @@

    <%== $c->page_title %> - % if ($authen->{was_verified} - % && $authz->hasPermissions(param('user'), 'access_instructor_tools')) { - <%= $c->help({ label_size => 'fa-xs' }) %> - % }

    + % if ($authen->{was_verified} + % && $authz->hasPermissions(param('user'), 'access_instructor_tools')) { + <%= $c->help({ label_size => 'fa-xs' }) %> + % }
    % } From af2f4d0613fc1e7c3654736715c96a88d7ea32d6 Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Wed, 19 Jul 2023 17:23:52 -0500 Subject: [PATCH 093/549] Correct htmlPath and imagesPath settings in defaults.config These paths have been incorrect since 2015 when they were added. The comment that was there about these is completely incorrect. It states that these should be complete urls. They should not be urls at all. Instead they should be directories. The only place that these are used is in PGalias.pm to search for auxiliary html files or images, and there they are treated as directories. Also remove the completely unused pdfPath setting. --- conf/defaults.config | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/conf/defaults.config b/conf/defaults.config index e74579e39b..834b3655d4 100644 --- a/conf/defaults.config +++ b/conf/defaults.config @@ -1108,20 +1108,18 @@ $pg{directories}{macrosPath} = [ "$pg{directories}{macros}/deprecated", ]; -$pg{directories}{htmlPath} = [ # paths to search for auxiliary html files (requires full url) - ".", - "$courseURLs{html}", - "$webworkURLs{htdocs}", +# Directories to search for auxiliary html files. +$pg{directories}{htmlPath} = [ + ".", + $courseDirs{html}, + $webworkDirs{htdocs}, ]; -$pg{directories}{imagesPath} = [ # paths to search for image files (requires full url) - ".", - "$courseURLs{html}/images", - "$webworkURLs{htdocs}/images", -]; -$pg{directories}{pdfPath} = [ # paths to search for pdf files (requires full url) - ".", - "$courseURLs{html}/pdf", - "$webworkURLs{htdocs}/pdf", + +# Directories to search for image files. +$pg{directories}{imagesPath} = [ + ".", + "$courseDirs{html}/images", + "$webworkDirs{htdocs}/images", ]; # Contains context-sensitive pg help files. From 386438a7881db2edc0a676881e47ff2ea64a878c Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Tue, 18 Jul 2023 18:54:41 -0700 Subject: [PATCH 094/549] stop supporting a typo --- courses.dist/modelCourse/templates/set0/paperHeaderFile0.pg | 4 ++-- courses.dist/modelCourse/templates/set0/screenHeaderFile0.pg | 2 +- .../modelCourse/templates/setDemo/paperHeaderFile1.pg | 2 +- .../modelCourse/templates/setDemo/screenHeaderFile1.pg | 4 ++-- doc/devel/daemon-problem-environment | 1 - lib/WeBWorK/Utils/Rendering.pm | 2 -- 6 files changed, 6 insertions(+), 9 deletions(-) diff --git a/courses.dist/modelCourse/templates/set0/paperHeaderFile0.pg b/courses.dist/modelCourse/templates/set0/paperHeaderFile0.pg index 967cb43f50..1139dd140b 100644 --- a/courses.dist/modelCourse/templates/set0/paperHeaderFile0.pg +++ b/courses.dist/modelCourse/templates/set0/paperHeaderFile0.pg @@ -9,14 +9,14 @@ loadMacros( "PGanswermacros.pl" ); -$dateTime = $formatedDueDate; +$dateTime = $formattedDueDate; TEXT(EV2(<$db_date; $options{ 'formatted' . ucfirst($date) } = formatDateTime($options{$date}, $ce->{siteDefaults}{timezone}); - # This is provided due to a typo in many header files. - $options{ 'formated' . ucfirst($date) } = $options{ 'formatted' . ucfirst($date) }; my $uc_date = ucfirst($date); for ( [ 'DayOfWeek', '%A' ], From 38432eb633f8dbecd93fb14a80bd776f6032733f Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Wed, 19 Jul 2023 17:45:45 -0700 Subject: [PATCH 095/549] suggestions from PR#2120 --- courses.dist/modelCourse/templates/set0/paperHeaderFile0.pg | 2 -- .../modelCourse/templates/setDemo/paperHeaderFile1.pg | 4 +--- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/courses.dist/modelCourse/templates/set0/paperHeaderFile0.pg b/courses.dist/modelCourse/templates/set0/paperHeaderFile0.pg index 1139dd140b..2ae97e50a8 100644 --- a/courses.dist/modelCourse/templates/set0/paperHeaderFile0.pg +++ b/courses.dist/modelCourse/templates/set0/paperHeaderFile0.pg @@ -9,8 +9,6 @@ loadMacros( "PGanswermacros.pl" ); -$dateTime = $formattedDueDate; - TEXT(EV2(< Date: Wed, 19 Jul 2023 21:46:51 -0500 Subject: [PATCH 096/549] Reset the version back to develop. --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index ac85d97229..2bc79eeb2a 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -$WW_VERSION = '2.18'; +$WW_VERSION = '2.18+develop'; $WW_COPYRIGHT_YEARS = '1996-2023'; 1; From 547a716f1a1cde1b981faf234fd04d8309d0736b Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Sat, 22 Jul 2023 06:07:41 -0500 Subject: [PATCH 097/549] Possible fix for CAS.pm authentication issue. This replaces the mod_perl `$r->unparsed_uri` method with Mojo::Message::Request method `$c->req->url->to_string` which should return the same thing. This may fix the `CAS.pm` module. This is the only mod_perl call in that file, and was missed in the conversion to Mojolicious. I have not way to test this, but clearly that method must be replaced. See https://webwork.maa.org/moodle/mod/forum/discuss.php?d=8317. --- lib/WeBWorK/Authen/CAS.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/WeBWorK/Authen/CAS.pm b/lib/WeBWorK/Authen/CAS.pm index 76e34aee22..c18298dbc9 100644 --- a/lib/WeBWorK/Authen/CAS.pm +++ b/lib/WeBWorK/Authen/CAS.pm @@ -115,7 +115,7 @@ sub get_credentials { # CAFile => $cas_certs); my $cas = new AuthCAS(%{ $ce->{authen}{cas_options}{AuthCAS_opts} }); - my $service = $c->unparsed_uri(); + my $service = $c->req->url->to_string; # Remove the "ticket=..." parameter that the CAS server added # (Not sure if the second test is really needed.) $service =~ s/[?&]ticket=[^&]*$// From 136069b99513ffadb698ea1f674c2f56051cebd6 Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Sun, 23 Jul 2023 06:14:53 -0500 Subject: [PATCH 098/549] Correctly create or update the restricted login proctor password There was logic error that made the `if/else` statement fall through incorrectly. The conditions of a nested `if` were condensed into the first condition of the `if/else` statement. This puts it back to the way it was with a nested `if`. This fixes issue #2146. --- .../Instructor/ProblemSetDetail.pm | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm b/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm index 96f11bb3dc..8a0ff06851 100644 --- a/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm +++ b/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm @@ -1605,18 +1605,20 @@ sub initialize ($c) { # is pretty careful to be sure that there's a one-to-one correspondence between the existence of the # user and the setting of the set restricted_login_proctor field, so we assume that just checking the # latter here is sufficient. - if ($setRecord->restricted_login_proctor eq 'Yes' && $pass ne '********') { - # A new password was submitted. So save it. - my $dbPass = eval { $db->getPassword($procID) }; - if ($@) { - $c->addbadmessage($c->maketext( - 'Error getting old set-proctor password from the database: [_1]. ' - . 'No update to the password was done.', - $@ - )); - } else { - $dbPass->password(cryptPassword($pass)); - $db->putPassword($dbPass); + if ($setRecord->restricted_login_proctor eq 'Yes') { + if ($pass ne '********') { + # A new password was submitted. So save it. + my $dbPass = eval { $db->getPassword($procID) }; + if ($@) { + $c->addbadmessage($c->maketext( + 'Error getting old set-proctor password from the database: [_1]. ' + . 'No update to the password was done.', + $@ + )); + } else { + $dbPass->password(cryptPassword($pass)); + $db->putPassword($dbPass); + } } } else { $setRecord->restricted_login_proctor('Yes'); From 64b5d2896215d0307dce53704dbf695d7d7b3969 Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Mon, 24 Jul 2023 02:18:13 -0700 Subject: [PATCH 099/549] 'occured' misspelling --- bin/old_scripts/wwaddindexing | 2 +- bin/old_scripts/wwdb_init | 4 ++-- bin/ww_purge_old_nonces | 2 +- bin/wwdb | 2 +- htdocs/js/PGProblemEditor/pgproblemeditor.js | 2 +- htdocs/js/RenderProblem/renderproblem.js | 2 +- .../WeBWorK/Tasks/SendInstructorEmail.pm | 2 +- lib/WeBWorK/ContentGenerator/CourseAdmin.pm | 20 ++++++++++--------- lib/WeBWorK/ContentGenerator/Hardcopy.pm | 2 +- .../ContentGenerator/Instructor/Assigner.pm | 2 +- lib/WeBWorK/Utils/DBUpgrade.pm | 4 ++-- .../Base/warning_output.html.ep | 2 +- templates/ContentGenerator/Hardcopy.html.ep | 2 +- templates/exception_default.html.ep | 4 ++-- templates/exception_min.html.ep | 4 ++-- 15 files changed, 29 insertions(+), 27 deletions(-) diff --git a/bin/old_scripts/wwaddindexing b/bin/old_scripts/wwaddindexing index 1ac7fda6a7..9319a9d933 100755 --- a/bin/old_scripts/wwaddindexing +++ b/bin/old_scripts/wwaddindexing @@ -122,7 +122,7 @@ foreach my $source (keys %sources) { my $stmt = "ALTER TABLE `$tableName` $fieldString;"; unless ($dbh->do($stmt)) { - die "An error occured while trying to modify the course database.\n", + die "An error occurred while trying to modify the course database.\n", "It is possible that the course database is in an inconsistent state.\n", "The DBI error message was:\n\n", $dbh->errstr, "\n"; diff --git a/bin/old_scripts/wwdb_init b/bin/old_scripts/wwdb_init index 1966046fe4..b4341aee28 100755 --- a/bin/old_scripts/wwdb_init +++ b/bin/old_scripts/wwdb_init @@ -170,7 +170,7 @@ sub upgrade_to_version { if (exists $info{global_code}) { eval { $info{global_code}->() }; if ($@) { - print "\nAn error occured while running the system upgrade code for version $vers:\n"; + print "\nAn error occurred while running the system upgrade code for version $vers:\n"; print "$@"; return 0 unless ask_permission("Ignore this error and keep going?", 0); } @@ -196,4 +196,4 @@ sub ask_permission { return 0 if lc $resp eq "n"; $prompt = 'Please enter "y" or "n".'; } -} \ No newline at end of file +} diff --git a/bin/ww_purge_old_nonces b/bin/ww_purge_old_nonces index 88e5ceb345..7f6a4263ff 100755 --- a/bin/ww_purge_old_nonces +++ b/bin/ww_purge_old_nonces @@ -94,6 +94,6 @@ foreach my $user_id (@listKeys) { if (@errors) { - warn "The following errors occured:\n", map { "* $_\n" } @errors; + warn "The following errors occurred:\n", map { "* $_\n" } @errors; exit 1; } diff --git a/bin/wwdb b/bin/wwdb index 7857464502..865418528f 100755 --- a/bin/wwdb +++ b/bin/wwdb @@ -124,6 +124,6 @@ if ($command eq "export") { } if (@errors) { - warn "The following errors occured:\n", map { "* $_\n" } @errors; + warn "The following errors occurred:\n", map { "* $_\n" } @errors; exit 1; } diff --git a/htdocs/js/PGProblemEditor/pgproblemeditor.js b/htdocs/js/PGProblemEditor/pgproblemeditor.js index 3cdbdc91dd..3a2078f8ad 100644 --- a/htdocs/js/PGProblemEditor/pgproblemeditor.js +++ b/htdocs/js/PGProblemEditor/pgproblemeditor.js @@ -384,7 +384,7 @@ // If the error is set, show that. if (data.error) throw data.error; // This generally shouldn't happen. - if (!data.html) throw 'A server error occured. The response had no content'; + if (!data.html) throw 'A server error occurred. The response had no content'; renderArea.replaceChildren(iframe); iframe.srcdoc = data.html; diff --git a/htdocs/js/RenderProblem/renderproblem.js b/htdocs/js/RenderProblem/renderproblem.js index 34397ce62e..726ff789a7 100644 --- a/htdocs/js/RenderProblem/renderproblem.js +++ b/htdocs/js/RenderProblem/renderproblem.js @@ -50,7 +50,7 @@ // If the error is set, show that. if (data.error) throw data.error; // This shouldn't happen if the error is not set. - if (!data.html) throw 'A server error occured. The response had no content.'; + if (!data.html) throw 'A server error occurred. The response had no content.'; if (/this problem file was empty/i.test(data.html)) throw 'No such file or file was empty!'; // Give nicer problem rendering error if ( diff --git a/lib/Mojolicious/WeBWorK/Tasks/SendInstructorEmail.pm b/lib/Mojolicious/WeBWorK/Tasks/SendInstructorEmail.pm index 44ba7a71f9..c3f65d91e4 100644 --- a/lib/Mojolicious/WeBWorK/Tasks/SendInstructorEmail.pm +++ b/lib/Mojolicious/WeBWorK/Tasks/SendInstructorEmail.pm @@ -44,7 +44,7 @@ sub run ($job, $mail_data) { eval { $job->email_notification($ce, $mail_data, $result_message) }; if ($@) { - $job->app->log->error("An error occured while trying to send the email notification: $@\n"); + $job->app->log->error("An error occurred while trying to send the email notification: $@\n"); return $job->fail("FAILURE: Unable to send email notifation to instructor."); } diff --git a/lib/WeBWorK/ContentGenerator/CourseAdmin.pm b/lib/WeBWorK/ContentGenerator/CourseAdmin.pm index 2b00aa19a2..2c36bc6dba 100644 --- a/lib/WeBWorK/ContentGenerator/CourseAdmin.pm +++ b/lib/WeBWorK/ContentGenerator/CourseAdmin.pm @@ -394,7 +394,7 @@ sub do_add_course ($c) { $c->tag( 'div', class => 'alert alert-danger p-1 mb-2', - $c->c($c->tag('p', "An error occured while creating the course $add_courseID:"), + $c->c($c->tag('p', "An error occurred while creating the course $add_courseID:"), $c->tag('div', class => 'font-monospace', $error))->join('') ) ); @@ -655,7 +655,7 @@ sub do_retitle_course ($c) { $c->tag( 'p', $c->maketext( - 'An error occured while changing the title of the course [_1].', + 'An error occurred while changing the title of the course [_1].', $rename_oldCourseID ) ), @@ -748,7 +748,7 @@ sub do_rename_course ($c) { $c->tag( 'p', $c->maketext( - 'An error occured while renaming the course [_1] to [_2]:', $rename_oldCourseID, + 'An error occurred while renaming the course [_1] to [_2]:', $rename_oldCourseID, $rename_newCourseID ) ), @@ -877,7 +877,7 @@ sub do_delete_course ($c) { return $c->tag( 'div', class => 'alert alert-danger p-1 my-2', - $c->c($c->tag('p', $c->maketext('An error occured while deleting the course [_1]:', $delete_courseID)), + $c->c($c->tag('p', $c->maketext('An error occurred while deleting the course [_1]:', $delete_courseID)), $c->tag('div', class => 'font-monospace', $error))->join('') ); } else { @@ -1073,7 +1073,7 @@ sub do_archive_course ($c) { 'div', class => 'alert alert-danger p-1 mb-2', $c->c( - $c->tag('p', $c->maketext('An error occured while archiving the course [_1]:', $archive_courseID)), + $c->tag('p', $c->maketext('An error occurred while archiving the course [_1]:', $archive_courseID)), $c->tag('div', class => 'font-monospace', $error) )->join('') ); @@ -1103,7 +1103,9 @@ sub do_archive_course ($c) { $c->c( $c->tag( 'p', - $c->maketext('An error occured while deleting the course [_1]:', $archive_courseID) + $c->maketext( + 'An error occurred while deleting the course [_1]:', $archive_courseID + ) ), $c->tag('div', class => 'font-monospace', $error) )->join('') @@ -1273,7 +1275,7 @@ sub do_unarchive_course ($c) { class => 'alert alert-danger p-1 mb-2', $c->c( $c->tag( - 'p', $c->maketext('An error occured while archiving the course [_1]:', $unarchive_courseID) + 'p', $c->maketext('An error occurred while archiving the course [_1]:', $unarchive_courseID) ), $c->tag('div', class => 'font-monospace', $error) )->join('') @@ -2124,7 +2126,7 @@ sub do_hide_inactive_course ($c) { $c->tag( 'p', $c->maketext( - 'Errors occured while hiding the courses listed below when attempting to create the ' + 'Errors occurred while hiding the courses listed below when attempting to create the ' . q{file hide_directory in the course's directory. Check the ownership and permissions } . q{of the course's directory, e.g "[_1]".}, "$ce->{webworkDirs}{courses}/$failed_courses[0]/" @@ -2193,7 +2195,7 @@ sub do_unhide_inactive_course ($c) { $c->tag( 'p', $c->maketext( - 'Errors occured while unhiding the courses listed below when attempting delete the file ' + 'Errors occurred while unhiding the courses listed below when attempting delete the file ' . q{hide_directory in the course's directory. Check the ownership and permissions of } . q{the course's directory, e.g "[_1]".}, "$ce->{webworkDirs}{courses}/$failed_courses[0]/" diff --git a/lib/WeBWorK/ContentGenerator/Hardcopy.pm b/lib/WeBWorK/ContentGenerator/Hardcopy.pm index 08764a3c48..e6d93d19f7 100644 --- a/lib/WeBWorK/ContentGenerator/Hardcopy.pm +++ b/lib/WeBWorK/ContentGenerator/Hardcopy.pm @@ -647,7 +647,7 @@ sub delete_temp_dir ($c, $temp_dir_path) { # subroutines return a list whose first entry is the generated file name in $temp_dir_path, and # whose remaining elements are names of temporary files that may be of interest in the case of an # error (also located in $temp_dir_path). These are returned whether or not an error actually -# occured. +# occurred. sub generate_hardcopy_tex ($c, $temp_dir_path, $final_file_basename) { my $src_name = "hardcopy.tex"; diff --git a/lib/WeBWorK/ContentGenerator/Instructor/Assigner.pm b/lib/WeBWorK/ContentGenerator/Instructor/Assigner.pm index 22dd6a8986..be9be3c144 100644 --- a/lib/WeBWorK/ContentGenerator/Instructor/Assigner.pm +++ b/lib/WeBWorK/ContentGenerator/Instructor/Assigner.pm @@ -62,7 +62,7 @@ sub pre_header_initialize ($c) { if (@results) { # Can't get here? $c->addbadmessage( - $c->c('The following error(s) occured while assigning:', + $c->c('The following error(s) occurred while assigning:', $c->tag('ul', $c->c(map { $c->tag('li', $_) } @results)->join('')))->join('') ); } diff --git a/lib/WeBWorK/Utils/DBUpgrade.pm b/lib/WeBWorK/Utils/DBUpgrade.pm index 0f4441bef5..cae78a8dae 100644 --- a/lib/WeBWorK/Utils/DBUpgrade.pm +++ b/lib/WeBWorK/Utils/DBUpgrade.pm @@ -629,7 +629,7 @@ sub upgrade_to_version { $info{global_code}->(); }; if ($@) { - print "\nAn error occured while running the system upgrade code for version $vers:\n"; + print "\nAn error occurred while running the system upgrade code for version $vers:\n"; print "$@"; return 0 unless $self->ask_permission("Ignore this error and keep going?", 0); } @@ -702,7 +702,7 @@ sub upgrade_course_to_version { $info{course_code}->($course); }; if ($@) { - print "\nAn error occured while running the course upgrade code for version $vers on course $course:\n"; + print "\nAn error occurred while running the course upgrade code for version $vers on course $course:\n"; print "$@"; return ERROR; } else { diff --git a/templates/ContentGenerator/Base/warning_output.html.ep b/templates/ContentGenerator/Base/warning_output.html.ep index 2eb46dd24d..ace4b696a5 100644 --- a/templates/ContentGenerator/Base/warning_output.html.ep +++ b/templates/ContentGenerator/Base/warning_output.html.ep @@ -3,7 +3,7 @@

    <%= maketext('WeBWorK Warnings') %>

    <%= maketext( - 'WeBWorK has encountered warnings while processing your request. If this occured when viewing ' + 'WeBWorK has encountered warnings while processing your request. If this occurred when viewing ' . 'a problem, it was likely caused by an error or ambiguity in that problem. Otherwise, it may indicate ' . 'a problem with the WeBWorK system itself. If you are a student, report these warnings to your ' . 'professor to have them corrected. If you are a professor, please consult the warning output below ' diff --git a/templates/ContentGenerator/Hardcopy.html.ep b/templates/ContentGenerator/Hardcopy.html.ep index 24eacb7986..30551ffff5 100644 --- a/templates/ContentGenerator/Hardcopy.html.ep +++ b/templates/ContentGenerator/Hardcopy.html.ep @@ -5,7 +5,7 @@ % my %temp_file_map = %{ $c->{temp_file_map} // {} }; % % if ($perm_view_errors) { -

    <%= maketext('Errors occured while generating hardcopy:') %>

    +

    <%= maketext('Errors occurred while generating hardcopy:') %>

      % for (@{ $c->get_errors }) {
    • <%= $_ %>
    • diff --git a/templates/exception_default.html.ep b/templates/exception_default.html.ep index 46c063d6cb..b20cd062c1 100644 --- a/templates/exception_default.html.ep +++ b/templates/exception_default.html.ep @@ -12,14 +12,14 @@

      WeBWorK error

      -

      An error occured while processing your request.

      +

      An error occurred while processing your request.

      For help, please send mail to this site's webmaster\ % # $ENV{WEBWORK_SERVER_ADMIN} is set from $webwork_server_admin_email in site.conf. <% if ($ENV{WEBWORK_SERVER_ADMIN}) { =%> <%= link_to $ENV{WEBWORK_SERVER_ADMIN} => "mailto:$ENV{WEBWORK_SERVER_ADMIN}" %>\ <% } =%>\ - , including all of the following information as well as what what you were doing when the error occured. + , including all of the following information as well as what what you were doing when the error occurred.

      Error record identifier

      <%= $uuid =%>

      diff --git a/templates/exception_min.html.ep b/templates/exception_min.html.ep index eec4053658..a4d370f0f0 100644 --- a/templates/exception_min.html.ep +++ b/templates/exception_min.html.ep @@ -12,14 +12,14 @@

      WeBWorK error

      -

      An error occured while processing your request.

      +

      An error occurred while processing your request.

      For help, please send mail to this site's webmaster\ % # $ENV{WEBWORK_SERVER_ADMIN} is set from $webwork_server_admin_email in site.conf. <% if ($ENV{WEBWORK_SERVER_ADMIN}) { =%> <%= link_to $ENV{WEBWORK_SERVER_ADMIN} => "mailto:$ENV{WEBWORK_SERVER_ADMIN}" %>\ <% } =%>\ - , including the following information as well as what what you were doing when the error occured. + , including the following information as well as what what you were doing when the error occurred.

      Error record identifier

      <%= $uuid %>

      From f0202ce4c9b28c71ef3cbc9093340eb627a43279 Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Tue, 25 Jul 2023 14:42:40 -0500 Subject: [PATCH 100/549] Fix the PG Problem Editor buttons above the editor window. The `if` statement checking for the PGML labs problem went to far, and included the "Author Info" and "Report Bugs in this Problem" buttons, and the ending tag for the div that contains all of the buttons. Those buttons are not present when editing the course information file. This may have been caused by a merge conflict resolution issue. --- .../Instructor/PGProblemEditor.html.ep | 75 ++++++++++--------- 1 file changed, 39 insertions(+), 36 deletions(-) diff --git a/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep b/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep index da3a010035..069dc55553 100644 --- a/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep +++ b/templates/ContentGenerator/Instructor/PGProblemEditor.html.ep @@ -90,43 +90,45 @@ <%= hidden_field hardcopy_theme => param('hardcopy_theme') =%> % } % - % # PG problem authoring resource links -
      - <%= link_to maketext('Sample Problems') => url_for('sample_problem_index'), - target => 'techniques_window', - title => maketext('POD for macros and sample problem code and snippets'), - class => 'reference-link btn btn-sm btn-info', - data => { bs_toggle => 'tooltip', bs_placement => 'top' } =%> - % # http://webwork.maa.org/wiki/Category:MathObjects - <%= link_to maketext('Math Objects') => $ce->{webworkURLs}{MathObjectsHelpURL}, - target => 'math_objects', - title => maketext('Wiki summary page for MathObjects'), - class => 'reference-link btn btn-sm btn-info', - data => { bs_toggle => 'tooltip', bs_placement => 'top' } =%> - % # PG POD served locally - <%= link_to maketext('POD') => url_for('pod_index'), - target => 'pod_docs', - title => maketext('Documentation from source code for PG modules and macro files.'), - class => 'reference-link btn btn-sm btn-info', - data => { bs_toggle => 'tooltip', bs_placement => 'top' } =%> - % # PGML lab problem rendered as an unattached problem in a new window. - % if (-e "$ce->{courseDirs}{templates}/PGMLLab/PGML-lab.pg") { - <%= link_to maketext('PGML') => $c->systemLink( - url_for('problem_detail', setID => 'Undefined_Set', problemID => 1), - params => { - displayMode => $ce->{pg}{options}{displayMode}, - problemSeed => 1234, - editMode => 'temporaryFile', - sourceFilePath => 'PGMLLab/PGML-lab.pg' - } - ), - target => 'PGML', - title => maketext( - 'PG markdown syntax used to format WeBWorK questions. ' - . 'This interactive lab can help you to learn the techniques.' - ), + % if ($c->{is_pg}) { + % # PG problem authoring resource links +
      + <%= link_to maketext('Sample Problems') => url_for('sample_problem_index'), + target => 'techniques_window', + title => maketext('POD for macros and sample problem code and snippets'), + class => 'reference-link btn btn-sm btn-info', + data => { bs_toggle => 'tooltip', bs_placement => 'top' } =%> + % # http://webwork.maa.org/wiki/Category:MathObjects + <%= link_to maketext('Math Objects') => $ce->{webworkURLs}{MathObjectsHelpURL}, + target => 'math_objects', + title => maketext('Wiki summary page for MathObjects'), class => 'reference-link btn btn-sm btn-info', data => { bs_toggle => 'tooltip', bs_placement => 'top' } =%> + % # PG POD served locally + <%= link_to maketext('POD') => url_for('pod_index'), + target => 'pod_docs', + title => maketext('Documentation from source code for PG modules and macro files.'), + class => 'reference-link btn btn-sm btn-info', + data => { bs_toggle => 'tooltip', bs_placement => 'top' } =%> + % # PGML lab problem rendered as an unattached problem in a new window. + % if (-e "$ce->{courseDirs}{templates}/PGMLLab/PGML-lab.pg") { + <%= link_to maketext('PGML') => $c->systemLink( + url_for('problem_detail', setID => 'Undefined_Set', problemID => 1), + params => { + displayMode => $ce->{pg}{options}{displayMode}, + problemSeed => 1234, + editMode => 'temporaryFile', + sourceFilePath => 'PGMLLab/PGML-lab.pg' + } + ), + target => 'PGML', + title => maketext( + 'PG markdown syntax used to format WeBWorK questions. ' + . 'This interactive lab can help you to learn the techniques.' + ), + class => 'reference-link btn btn-sm btn-info', + data => { bs_toggle => 'tooltip', bs_placement => 'top' } =%> + % } % # http://webwork.maa.org/wiki/Category:Authors <%= link_to maketext('Author Info') => $ce->{webworkURLs}{AuthorHelpURL}, target => 'author_info', @@ -134,7 +136,8 @@ class => 'reference-link btn btn-sm btn-info', data => { bs_toggle => 'tooltip', bs_placement => 'top' } =%> % # Only show the report bugs in problem button if editing an OPL or Contrib problem. - % if ($c->{editFilePath} =~ m|^$ce->{courseDirs}{templates}/([^/]*)/| && ($1 eq 'Library' || $1 eq 'Contrib')) { + % if ($c->{editFilePath} =~ m|^$ce->{courseDirs}{templates}/([^/]*)/| + % && ($1 eq 'Library' || $1 eq 'Contrib')) { <%= link_to maketext('Report Bugs in this Problem') => "$ce->{webworkURLs}{bugReporter}?product=Problem%20libraries" . "&component=$1&bug_file_loc=$c->{editFilePath}_with_problemSeed=$c->{problemSeed}", From cbb03caa7b5f674b8f7f20e3d17bf8b2a505377c Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Wed, 26 Jul 2023 20:14:53 -0500 Subject: [PATCH 101/549] Switch the CourseEnvironment and AchievementEvaluator back to WWSafe. It turns out that using the default Safe is causing problems still. When a problem fails to render within the (hardcoded default) 60 second `$WeBWorK::PG::TIMEOUT`, then the alarm signal is not caught by the `$SIG{ALRM}` handler that is set in `WeBWorK::PG`. As a result, instead of getting the information about the problem failing to render within the timeout, you instead get a useless message about decode_json failing in Mojo::JSON. I suspect this is also the cause of issues #2041 and #2148 (now closed). Although the cause of those issues is really an error in the problems, this was hiding the error in the problems (combined with the issue fixed in pull request https://github.com/openwebwork/pg/pull/883 for issue #2041). However, this is not PG's WWSafe module. This is webworks own WeBWorK::WWSafe module. This is used to avoid conflict with PG's module, and not depend on PG's library for scripts. --- lib/WeBWorK/AchievementEvaluator.pm | 13 +- lib/WeBWorK/CourseEnvironment.pm | 13 +- lib/WeBWorK/WWSafe.pm | 640 ++++++++++++++++++++++++++++ 3 files changed, 644 insertions(+), 22 deletions(-) create mode 100644 lib/WeBWorK/WWSafe.pm diff --git a/lib/WeBWorK/AchievementEvaluator.pm b/lib/WeBWorK/AchievementEvaluator.pm index 34358d550f..70901e6f40 100644 --- a/lib/WeBWorK/AchievementEvaluator.pm +++ b/lib/WeBWorK/AchievementEvaluator.pm @@ -26,7 +26,7 @@ use DateTime; use WeBWorK::Utils qw(sortAchievements nfreeze_base64 thaw_base64); use WeBWorK::Utils::Tags; -use Safe; +use WeBWorK::WWSafe; our @EXPORT_OK = qw(checkForAchievements); @@ -89,13 +89,7 @@ sub checkForAchievements ($problem_in, $pg, $c, %options) { $dtCourseTime->month, $dtCourseTime->year, $dtCourseTime->day_of_week ); - # Mojolicious sets the INT and TERM signal handlers, and perl Safe overrides those (as those signals can be used to - # break out of Safe) which causes an error later when the Mojolicious signals handlers are not called as they should - # be. So the current signal handlers are cached here and restored after the Safe reval is completed. - my %ORIG_SIG; - $ORIG_SIG{$_} = $SIG{$_} for keys %SIG; - - my $compartment = Safe->new; + my $compartment = WeBWorK::WWSafe->new; #initialize things that are "" if (not $achievementPoints) { @@ -266,9 +260,6 @@ sub checkForAchievements ($problem_in, $pg, $c, %options) { } #end for loop - # Restore the original signal handlers. - local $SIG{$_} = $ORIG_SIG{$_} for keys %ORIG_SIG; - #nfreeze_base64 globalData and store $globalUserAchievement->frozen_hash(nfreeze_base64($globalData)); $db->putGlobalUserAchievement($globalUserAchievement); diff --git a/lib/WeBWorK/CourseEnvironment.pm b/lib/WeBWorK/CourseEnvironment.pm index f057b1f140..98d977ddb9 100644 --- a/lib/WeBWorK/CourseEnvironment.pm +++ b/lib/WeBWorK/CourseEnvironment.pm @@ -55,7 +55,7 @@ use warnings; use Carp; use Opcode qw(empty_opset); -use Safe; +use WeBWorK::WWSafe; use WeBWorK::Utils qw(readFile); use WeBWorK::Debug; @@ -95,18 +95,12 @@ sub new { $seedVars->{courseName} ||= '___'; # prevents extraneous error messages - # Mojolicious sets the INT and TERM signal handlers, and perl Safe overrides those (as those signals can be used to - # break out of Safe) which causes an error later when the Mojolicious signals handlers are not called as they should - # be. So the current signal handlers are cached here and restored after the Safe reval is completed. - my %ORIG_SIG; - $ORIG_SIG{$_} = $SIG{$_} for keys %SIG; - # The following line is a work around for a bug that occurs on some systems. See # https://rt.cpan.org/Public/Bug/Display.html?id=77916 and # https://github.com/openwebwork/webwork2/pull/2098#issuecomment-1619812699. my %dummy = %+; - my $safe = Safe->new; + my $safe = WeBWorK::WWSafe->new; $safe->permit('rand'); # seed course environment with initial values while (my ($var, $val) = each %$seedVars) { @@ -228,9 +222,6 @@ sub new { warn "Cannot read PG version file $PG_version_file"; } - # Restore the original signal handlers. - local $SIG{$_} = $ORIG_SIG{$_} for keys %ORIG_SIG; - bless $self, $class; # here is where we can do evil things to the course environment *sigh* diff --git a/lib/WeBWorK/WWSafe.pm b/lib/WeBWorK/WWSafe.pm new file mode 100644 index 0000000000..118ad42f89 --- /dev/null +++ b/lib/WeBWorK/WWSafe.pm @@ -0,0 +1,640 @@ +package WeBWorK::WWSafe; + +#use 5.003_11; +use 5.12.0; +use strict; +use utf8; +$WeBWorK::WWSafe::VERSION = "2.16"; + +# *** Don't declare any lexicals above this point *** +# +# This function should return a closure which contains an eval that can't +# see any lexicals in scope (apart from __ExPr__ which is unavoidable) + +sub lexless_anon_sub { + # $_[0] is package; + # $_[1] is strict flag; + my $__ExPr__ = $_[2]; # must be a lexical to create the closure that + # can be used to pass the value into the safe + # world + + # Create anon sub ref in root of compartment. + # Uses a closure (on $__ExPr__) to pass in the code to be executed. + # (eval on one line to keep line numbers as expected by caller) + eval sprintf + 'package %s; %s strict; sub { @_=(); eval q[my $__ExPr__;] . $__ExPr__; }', + $_[0], $_[1] ? 'use' : 'no'; +} + +use Carp; + +BEGIN { + eval q{ + use Carp::Heavy; +}; +} + +use Opcode 1.01, qw( + opset opset_to_ops opmask_add + empty_opset full_opset invert_opset verify_opset + opdesc opcodes opmask define_optag opset_to_hex +); + +*ops_to_opset = \&opset; # Temporary alias for old Penguins + +my $default_root = 0; +# share *_ and functions defined in universal.c +# Don't share stuff like *UNIVERSAL:: otherwise code from the +# compartment can 0wn functions in UNIVERSAL +my $default_share = [ + qw[ + *_ + &PerlIO::get_layers + &UNIVERSAL::isa + &UNIVERSAL::can + &UNIVERSAL::VERSION + &utf8::is_utf8 + &utf8::valid + &utf8::encode + &utf8::decode + &utf8::upgrade + &utf8::downgrade + &utf8::native_to_unicode + &utf8::unicode_to_native + ], + ( + $] >= 5.008001 + && qw[ + &Regexp::DESTROY + ] + ), + ( + $] >= 5.010 + && qw[ + &re::is_regexp + &re::regname + &re::regnames + &re::regnames_count + &Tie::Hash::NamedCapture::FETCH + &Tie::Hash::NamedCapture::STORE + &Tie::Hash::NamedCapture::DELETE + &Tie::Hash::NamedCapture::CLEAR + &Tie::Hash::NamedCapture::EXISTS + &Tie::Hash::NamedCapture::FIRSTKEY + &Tie::Hash::NamedCapture::NEXTKEY + &Tie::Hash::NamedCapture::SCALAR + &Tie::Hash::NamedCapture::flags + &UNIVERSAL::DOES + &version::() + &version::new + &version::("" + &version::stringify + &version::(0+ + &version::numify + &version::normal + &version::(cmp + &version::(<=> + &version::vcmp + &version::(bool + &version::boolean + &version::(nomethod + &version::noop + &version::is_alpha + &version::qv + ] + ), + ( + $] >= 5.011 + && qw[ + &re::regexp_pattern + ] + ) +]; + +sub new { + my ($class, $root, $mask) = @_; + my $obj = {}; + bless $obj, $class; + + if (defined($root)) { + croak "Can't use \"$root\" as root name" + if $root =~ /^main\b/ or $root !~ /^\w[:\w]*$/; + $obj->{Root} = $root; + $obj->{Erase} = 0; + } else { + $obj->{Root} = "WeBWorK::WWSafe::Root" . $default_root++; + $obj->{Erase} = 1; + } + + # use permit/deny methods instead till interface issues resolved + # XXX perhaps new Safe 'Root', mask => $mask, foo => bar, ...; + croak "Mask parameter to new no longer supported" if defined $mask; + $obj->permit_only(':default'); + + # We must share $_ and @_ with the compartment or else ops such + # as split, length and so on won't default to $_ properly, nor + # will passing argument to subroutines work (via @_). In fact, + # for reasons I don't completely understand, we need to share + # the whole glob *_ rather than $_ and @_ separately, otherwise + # @_ in non default packages within the compartment don't work. + $obj->share_from('main', $default_share); + Opcode::_safe_pkg_prep($obj->{Root}) if ($Opcode::VERSION > 1.04); + return $obj; +} + +sub DESTROY { + my $obj = shift; + $obj->erase('DESTROY') if $obj->{Erase}; +} + +sub erase { + my ($obj, $action) = @_; + my $pkg = $obj->root(); + my ($stem, $leaf); + + no strict 'refs'; + $pkg = "main::$pkg\::"; # expand to full symbol table name + ($stem, $leaf) = $pkg =~ m/(.*::)(\w+::)$/; + + # The 'my $foo' is needed! Without it you get an + # 'Attempt to free unreferenced scalar' warning! + my $stem_symtab = *{$stem}{HASH}; + + #warn "erase($pkg) stem=$stem, leaf=$leaf"; + #warn " stem_symtab hash ".scalar(%$stem_symtab)."\n"; + # ", join(', ', %$stem_symtab),"\n"; + + # delete $stem_symtab->{$leaf}; + + my $leaf_glob = $stem_symtab->{$leaf}; + my $leaf_symtab = *{$leaf_glob}{HASH}; + # warn " leaf_symtab ", join(', ', %$leaf_symtab),"\n"; + %$leaf_symtab = (); + #delete $leaf_symtab->{'__ANON__'}; + #delete $leaf_symtab->{'foo'}; + #delete $leaf_symtab->{'main::'}; + # my $foo = undef ${"$stem\::"}{"$leaf\::"}; + + if ($action and $action eq 'DESTROY') { + delete $stem_symtab->{$leaf}; + } else { + $obj->share_from('main', $default_share); + } + 1; +} + +sub reinit { + my $obj = shift; + $obj->erase; + $obj->share_redo; +} + +sub root { + my $obj = shift; + croak("Safe root method now read-only") if @_; + return $obj->{Root}; +} + +sub mask { + my $obj = shift; + return $obj->{Mask} unless @_; + $obj->deny_only(@_); +} + +# v1 compatibility methods +sub trap { shift->deny(@_) } +sub untrap { shift->permit(@_) } + +sub deny { + my $obj = shift; + $obj->{Mask} |= opset(@_); +} + +sub deny_only { + my $obj = shift; + $obj->{Mask} = opset(@_); +} + +sub permit { + my $obj = shift; + # XXX needs testing + $obj->{Mask} &= invert_opset opset(@_); +} + +sub permit_only { + my $obj = shift; + $obj->{Mask} = invert_opset opset(@_); +} + +sub dump_mask { + my $obj = shift; + print opset_to_hex($obj->{Mask}), "\n"; +} + +sub share { + my ($obj, @vars) = @_; + $obj->share_from(scalar(caller), \@vars); +} + +sub share_from { + my $obj = shift; + my $pkg = shift; + my $vars = shift; + my $no_record = shift || 0; + my $root = $obj->root(); + croak("vars not an array ref") unless ref $vars eq 'ARRAY'; + no strict 'refs'; + # Check that 'from' package actually exists + croak("Package \"$pkg\" does not exist") + unless keys %{"$pkg\::"}; + my $arg; + foreach $arg (@$vars) { + # catch some $safe->share($var) errors: + my ($var, $type); + $type = $1 if ($var = $arg) =~ s/^(\W)//; + # warn "share_from $pkg $type $var"; + *{ $root . "::$var" } = + (!$type) ? \&{ $pkg . "::$var" } + : ($type eq '&') ? \&{ $pkg . "::$var" } + : ($type eq '$') ? \${ $pkg . "::$var" } + : ($type eq '@') ? \@{ $pkg . "::$var" } + : ($type eq '%') ? \%{ $pkg . "::$var" } + : ($type eq '*') ? *{ $pkg . "::$var" } + : croak(qq(Can't share "$type$var" of unknown type)); + } + $obj->share_record($pkg, $vars) unless $no_record or !$vars; +} + +sub share_record { + my $obj = shift; + my $pkg = shift; + my $vars = shift; + my $shares = \%{ $obj->{Shares} ||= {} }; + # Record shares using keys of $obj->{Shares}. See reinit. + @{$shares}{@$vars} = ($pkg) x @$vars if @$vars; +} + +sub share_redo { + my $obj = shift; + my $shares = \%{ $obj->{Shares} ||= {} }; + my ($var, $pkg); + while (($var, $pkg) = each %$shares) { + # warn "share_redo $pkg\:: $var"; + $obj->share_from($pkg, [$var], 1); + } +} + +sub share_forget { + delete shift->{Shares}; +} + +sub varglob { + my ($obj, $var) = @_; + no strict 'refs'; + return *{ $obj->root() . "::$var" }; +} + +sub reval { + my ($obj, $expr, $strict) = @_; + my $root = $obj->{Root}; + + my $evalsub = lexless_anon_sub($root, $strict, $expr); + return Opcode::_safe_call_sv($root, $obj->{Mask}, $evalsub); +} + +sub rdo { + my ($obj, $file) = @_; + my $root = $obj->{Root}; + + my $evalsub = eval sprintf('package %s; sub { @_ = (); do $file }', $root); + return Opcode::_safe_call_sv($root, $obj->{Mask}, $evalsub); +} + +1; + +__END__ + +=head1 NAME + +Safe - Compile and execute code in restricted compartments + +=head1 SYNOPSIS + + use WeBWorK::WWSafe; + + $compartment = new Safe; + + $compartment->permit(qw(time sort :browse)); + + $result = $compartment->reval($unsafe_code); + +=head1 DESCRIPTION + +The Safe extension module allows the creation of compartments +in which perl code can be evaluated. Each compartment has + +=over 8 + +=item a new namespace + +The "root" of the namespace (i.e. "main::") is changed to a +different package and code evaluated in the compartment cannot +refer to variables outside this namespace, even with run-time +glob lookups and other tricks. + +Code which is compiled outside the compartment can choose to place +variables into (or I variables with) the compartment's namespace +and only that data will be visible to code evaluated in the +compartment. + +By default, the only variables shared with compartments are the +"underscore" variables $_ and @_ (and, technically, the less frequently +used %_, the _ filehandle and so on). This is because otherwise perl +operators which default to $_ will not work and neither will the +assignment of arguments to @_ on subroutine entry. + +=item an operator mask + +Each compartment has an associated "operator mask". Recall that +perl code is compiled into an internal format before execution. +Evaluating perl code (e.g. via "eval" or "do 'file'") causes +the code to be compiled into an internal format and then, +provided there was no error in the compilation, executed. +Code evaluated in a compartment compiles subject to the +compartment's operator mask. Attempting to evaluate code in a +compartment which contains a masked operator will cause the +compilation to fail with an error. The code will not be executed. + +The default operator mask for a newly created compartment is +the ':default' optag. + +It is important that you read the L module documentation +for more information, especially for detailed definitions of opnames, +optags and opsets. + +Since it is only at the compilation stage that the operator mask +applies, controlled access to potentially unsafe operations can +be achieved by having a handle to a wrapper subroutine (written +outside the compartment) placed into the compartment. For example, + + $cpt = new Safe; + sub wrapper { + # vet arguments and perform potentially unsafe operations + } + $cpt->share('&wrapper'); + +=back + + +=head1 WARNING + +The authors make B, implied or otherwise, about the +suitability of this software for safety or security purposes. + +The authors shall not in any case be liable for special, incidental, +consequential, indirect or other similar damages arising from the use +of this software. + +Your mileage will vary. If in any doubt B. + + +=head2 RECENT CHANGES + +The interface to the Safe module has changed quite dramatically since +version 1 (as supplied with Perl5.002). Study these pages carefully if +you have code written to use Safe version 1 because you will need to +makes changes. + + +=head2 Methods in class Safe + +To create a new compartment, use + + $cpt = new Safe; + +Optional argument is (NAMESPACE), where NAMESPACE is the root namespace +to use for the compartment (defaults to "Safe::Root0", incremented for +each new compartment). + +Note that version 1.00 of the Safe module supported a second optional +parameter, MASK. That functionality has been withdrawn pending deeper +consideration. Use the permit and deny methods described below. + +The following methods can then be used on the compartment +object returned by the above constructor. The object argument +is implicit in each case. + + +=over 8 + +=item permit (OP, ...) + +Permit the listed operators to be used when compiling code in the +compartment (in I to any operators already permitted). + +You can list opcodes by names, or use a tag name; see +L. + +=item permit_only (OP, ...) + +Permit I the listed operators to be used when compiling code in +the compartment (I other operators are permitted). + +=item deny (OP, ...) + +Deny the listed operators from being used when compiling code in the +compartment (other operators may still be permitted). + +=item deny_only (OP, ...) + +Deny I the listed operators from being used when compiling code +in the compartment (I other operators will be permitted). + +=item trap (OP, ...) + +=item untrap (OP, ...) + +The trap and untrap methods are synonyms for deny and permit +respectfully. + +=item share (NAME, ...) + +This shares the variable(s) in the argument list with the compartment. +This is almost identical to exporting variables using the L +module. + +Each NAME must be the B of a non-lexical variable, typically +with the leading type identifier included. A bareword is treated as a +function name. + +Examples of legal names are '$foo' for a scalar, '@foo' for an +array, '%foo' for a hash, '&foo' or 'foo' for a subroutine and '*foo' +for a glob (i.e. all symbol table entries associated with "foo", +including scalar, array, hash, sub and filehandle). + +Each NAME is assumed to be in the calling package. See share_from +for an alternative method (which share uses). + +=item share_from (PACKAGE, ARRAYREF) + +This method is similar to share() but allows you to explicitly name the +package that symbols should be shared from. The symbol names (including +type characters) are supplied as an array reference. + + $safe->share_from('main', [ '$foo', '%bar', 'func' ]); + + +=item varglob (VARNAME) + +This returns a glob reference for the symbol table entry of VARNAME in +the package of the compartment. VARNAME must be the B of a +variable without any leading type marker. For example, + + $cpt = new Safe 'Root'; + $Root::foo = "Hello world"; + # Equivalent version which doesn't need to know $cpt's package name: + ${$cpt->varglob('foo')} = "Hello world"; + + +=item reval (STRING) + +This evaluates STRING as perl code inside the compartment. + +The code can only see the compartment's namespace (as returned by the +B method). The compartment's root package appears to be the +C package to the code inside the compartment. + +Any attempt by the code in STRING to use an operator which is not permitted +by the compartment will cause an error (at run-time of the main program +but at compile-time for the code in STRING). The error is of the form +"'%s' trapped by operation mask...". + +If an operation is trapped in this way, then the code in STRING will +not be executed. If such a trapped operation occurs or any other +compile-time or return error, then $@ is set to the error message, just +as with an eval(). + +If there is no error, then the method returns the value of the last +expression evaluated, or a return statement may be used, just as with +subroutines and B. The context (list or scalar) is determined +by the caller as usual. + +This behaviour differs from the beta distribution of the Safe extension +where earlier versions of perl made it hard to mimic the return +behaviour of the eval() command and the context was always scalar. + +Some points to note: + +If the entereval op is permitted then the code can use eval "..." to +'hide' code which might use denied ops. This is not a major problem +since when the code tries to execute the eval it will fail because the +opmask is still in effect. However this technique would allow clever, +and possibly harmful, code to 'probe' the boundaries of what is +possible. + +Any string eval which is executed by code executing in a compartment, +or by code called from code executing in a compartment, will be eval'd +in the namespace of the compartment. This is potentially a serious +problem. + +Consider a function foo() in package pkg compiled outside a compartment +but shared with it. Assume the compartment has a root package called +'Root'. If foo() contains an eval statement like eval '$foo = 1' then, +normally, $pkg::foo will be set to 1. If foo() is called from the +compartment (by whatever means) then instead of setting $pkg::foo, the +eval will actually set $Root::pkg::foo. + +This can easily be demonstrated by using a module, such as the Socket +module, which uses eval "..." as part of an AUTOLOAD function. You can +'use' the module outside the compartment and share an (autoloaded) +function with the compartment. If an autoload is triggered by code in +the compartment, or by any code anywhere that is called by any means +from the compartment, then the eval in the Socket module's AUTOLOAD +function happens in the namespace of the compartment. Any variables +created or used by the eval'd code are now under the control of +the code in the compartment. + +A similar effect applies to I runtime symbol lookups in code +called from a compartment but not compiled within it. + + + +=item rdo (FILENAME) + +This evaluates the contents of file FILENAME inside the compartment. +See above documentation on the B method for further details. + +=item root (NAMESPACE) + +This method returns the name of the package that is the root of the +compartment's namespace. + +Note that this behaviour differs from version 1.00 of the Safe module +where the root module could be used to change the namespace. That +functionality has been withdrawn pending deeper consideration. + +=item mask (MASK) + +This is a get-or-set method for the compartment's operator mask. + +With no MASK argument present, it returns the current operator mask of +the compartment. + +With the MASK argument present, it sets the operator mask for the +compartment (equivalent to calling the deny_only method). + +=back + + +=head2 Some Safety Issues + +This section is currently just an outline of some of the things code in +a compartment might do (intentionally or unintentionally) which can +have an effect outside the compartment. + +=over 8 + +=item Memory + +Consuming all (or nearly all) available memory. + +=item CPU + +Causing infinite loops etc. + +=item Snooping + +Copying private information out of your system. Even something as +simple as your user name is of value to others. Much useful information +could be gleaned from your environment variables for example. + +=item Signals + +Causing signals (especially SIGFPE and SIGALARM) to affect your process. + +Setting up a signal handler will need to be carefully considered +and controlled. What mask is in effect when a signal handler +gets called? If a user can get an imported function to get an +exception and call the user's signal handler, does that user's +restricted mask get re-instated before the handler is called? +Does an imported handler get called with its original mask or +the user's one? + +=item State Changes + +Ops such as chdir obviously effect the process as a whole and not just +the code in the compartment. Ops such as rand and srand have a similar +but more subtle effect. + +=back + +=head2 AUTHOR + +Originally designed and implemented by Malcolm Beattie. + +Reworked to use the Opcode module and other changes added by Tim Bunce. + +Currently maintained by the Perl 5 Porters, . + +=cut + From d0676f7b8e9da7adf37add90296bcf636e6500ef Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Mon, 7 Aug 2023 23:58:57 -0700 Subject: [PATCH 102/549] use string if it's a string --- lib/WeBWorK/ConfigObject/permission_checkboxlist.pm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/WeBWorK/ConfigObject/permission_checkboxlist.pm b/lib/WeBWorK/ConfigObject/permission_checkboxlist.pm index 78f0696b18..130497f078 100644 --- a/lib/WeBWorK/ConfigObject/permission_checkboxlist.pm +++ b/lib/WeBWorK/ConfigObject/permission_checkboxlist.pm @@ -25,7 +25,11 @@ sub display_value ($self, $val) { # r->param() returns an array, so a custom version of convert_newval_source is needed. sub convert_newval_source ($self, $use_current) { if ($use_current) { - return @{ $self->get_value($self->{c}->ce) }; + if (ref $self->get_value($self->{c}->ce) eq 'ARRAY') { + return @{ $self->get_value($self->{c}->ce) }; + } else { + return $self->get_value($self->{c}->ce); + } } else { return $self->{c}->param($self->{name}); } From 671a4b50683e65b30deae87250287b7bdbdd7205 Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Tue, 8 Aug 2023 07:21:30 -0500 Subject: [PATCH 103/549] Always send feedback emails to those in the `$mail{feedbackRecipients}` list. This is how this was in previous versions of webwork2. Restructuring of things to clean up how the email recipient list is generated resulted in this being dependent on the `$permissionLevels{receive_feedback}` setting. --- lib/WeBWorK/Utils.pm | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/lib/WeBWorK/Utils.pm b/lib/WeBWorK/Utils.pm index 9c242312e7..8a799b884b 100644 --- a/lib/WeBWorK/Utils.pm +++ b/lib/WeBWorK/Utils.pm @@ -1859,27 +1859,30 @@ sub fetchEmailRecipients { my $ce = $c->ce; my $authz = $c->authz; - return unless $permissionType && defined $ce->{permissionLevels}{$permissionType}; + my @recipients; + push(@recipients, @{ $ce->{mail}{feedbackRecipients} }) if ref($ce->{mail}{feedbackRecipients}) eq 'ARRAY'; + + return @recipients unless $permissionType && defined $ce->{permissionLevels}{$permissionType}; my $roles = ref $ce->{permissionLevels}{$permissionType} eq 'ARRAY' ? $ce->{permissionLevels}{$permissionType} : role_and_above($ce->{userRoles}, $ce->{permissionLevels}{$permissionType}); my @rolePermissionLevels = map { $ce->{userRoles}{$_} } grep { defined $ce->{userRoles}{$_} } @$roles; - return unless @rolePermissionLevels; + return @recipients unless @rolePermissionLevels; my $user_ids = [ map { $_->user_id } $db->getPermissionLevelsWhere({ permission => \@rolePermissionLevels }) ]; - my @recipients = + push( + @recipients, map { $_->rfc822_mailbox } $db->getUsersWhere({ user_id => $user_ids, email_address => { '!=', undef }, $ce->{feedback_by_section} - && defined $sender - && defined $sender->section ? (section => $sender->section) : (), - }); - - push @recipients, @{ $ce->{mail}{feedbackRecipients} } if ref($ce->{mail}{feedbackRecipients}) eq 'ARRAY'; + && defined $sender + && defined $sender->section ? (section => $sender->section) : (), + }) + ); return @recipients; } From 278cc13a5bf34dc0e26b87db4ff5f308bc12e9a8 Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Tue, 8 Aug 2023 14:37:39 -0700 Subject: [PATCH 104/549] Update lib/WeBWorK/ConfigObject/permission_checkboxlist.pm Co-authored-by: Glenn Rice <47527406+drgrice1@users.noreply.github.com> --- lib/WeBWorK/ConfigObject/permission_checkboxlist.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/WeBWorK/ConfigObject/permission_checkboxlist.pm b/lib/WeBWorK/ConfigObject/permission_checkboxlist.pm index 130497f078..1fce4c5982 100644 --- a/lib/WeBWorK/ConfigObject/permission_checkboxlist.pm +++ b/lib/WeBWorK/ConfigObject/permission_checkboxlist.pm @@ -28,7 +28,7 @@ sub convert_newval_source ($self, $use_current) { if (ref $self->get_value($self->{c}->ce) eq 'ARRAY') { return @{ $self->get_value($self->{c}->ce) }; } else { - return $self->get_value($self->{c}->ce); + return @{ role_and_above($self->{c}->ce->{userRoles}, $self->get_value($self->{c}->ce)) }; } } else { return $self->{c}->param($self->{name}); From f91532e848d1af50583e22e3b1f28c687abf9d0e Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Tue, 8 Aug 2023 15:47:46 -0700 Subject: [PATCH 105/549] update feedback recipient help --- conf/defaults.config | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/conf/defaults.config b/conf/defaults.config index 97475af20d..92a2a2d48c 100644 --- a/conf/defaults.config +++ b/conf/defaults.config @@ -2075,20 +2075,19 @@ $ConfigValues = [ }, { var => 'permissionLevels{receive_feedback}', - doc => x('E-mail feedback from students automatically sent to this permission level and higher'), + doc => x('Permission levels for receiving feedback email'), doc2 => x( - 'Users with these permission levels will automatically be sent feedback emails from students when they ' - . 'use the "Contact instructor" button on any problem page.' + 'Users with these permission levels will be sent feedback emails from students when they use the ' + . 'feedback button.' ), type => 'permission_checkboxlist', }, { var => 'mail{feedbackRecipients}', - doc => x('Additional addresses for receiving feedback e-mail'), + doc => x('Additional addresses for receiving feedback email'), doc2 => x( 'By default, feedback is sent to all users above who have permission to receive feedback. Feedback ' - . 'is also sent to any addresses specified in this blank. Separate email address entries by ' - . 'commas.' + . 'is also sent to any addresses specified here. Separate email address entries with commas.' ), type => 'list' }, From 0ce04e5dd03f356de18e3cc1928b9be864692095 Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Tue, 8 Aug 2023 15:52:39 -0700 Subject: [PATCH 106/549] change e-mail to email --- conf/defaults.config | 14 +++++++------- .../modelCourse/templates/set0/prob4/testing.html | 2 +- .../templates/set0/screenHeaderFile0.pg | 2 +- .../templates/setDemo/screenHeaderFile1.pg | 2 +- .../setMAAtutorial/MAAtutorialSetHeader.pg | 2 +- .../templates/setOrientation/options_info.txt | 8 ++++---- .../modelCourse/templates/setOrientation/prob15.pg | 2 +- templates/ContentGenerator/Feedback.html.ep | 4 ++-- templates/HelpFiles/InstructorUserList.html.ep | 4 ++-- templates/HelpFiles/Options.html.ep | 2 +- 10 files changed, 21 insertions(+), 21 deletions(-) diff --git a/conf/defaults.config b/conf/defaults.config index 92a2a2d48c..5c9cb4b210 100644 --- a/conf/defaults.config +++ b/conf/defaults.config @@ -1802,8 +1802,8 @@ $ConfigValues = [ }, { var => 'permissionLevels{submit_feedback}', - doc => x('Can e-mail instructor'), - doc2 => x('Only this permission level and higher get buttons for sending e-mail to the instructor.'), + doc => x('Can email instructor'), + doc2 => x('Only this permission level and higher get buttons for sending email to the instructor.'), type => 'permission' }, { @@ -1824,10 +1824,10 @@ $ConfigValues = [ }, { var => 'permissionLevels{change_email_address}', - doc => x('Allowed to change their e-mail address'), + doc => x('Allowed to change their email address'), doc2 => x( - 'Users at this level and higher are allowed to change their e-mail address. Normally guest users are ' - . 'not allowed to change the e-mail address since it does not make sense to send e-mail to ' + 'Users at this level and higher are allowed to change their email address. Normally guest users are ' + . 'not allowed to change the email address since it does not make sense to send email to ' . 'anonymous accounts.' ), type => 'permission' @@ -2043,7 +2043,7 @@ $ConfigValues = [ x('E-Mail'), { var => 'mail{feedbackSubjectFormat}', - doc => x('Format for the subject line in feedback e-mails'), + doc => x('Format for the subject line in feedback emails'), doc2 => x( 'When students click the Email Instructor button to send feedback, WeBWorK fills in the ' . 'subject line. Here you can set the subject line. In it, you can have various bits of ' @@ -2058,7 +2058,7 @@ $ConfigValues = [ var => 'mail{feedbackVerbosity}', doc => x('E-mail verbosity level'), doc2 => x( - 'The e-mail verbosity level controls how much information is automatically added to feedback e-mails. ' + 'The email verbosity level controls how much information is automatically added to feedback emails. ' . 'Levels are
      1. Simple: send only the feedback comment and context link
      2. ' . '
      3. Standard: as in Simple, plus user, set, problem, and PG data
      4. ' . '
      5. Debug: as in Standard, plus the problem environment (debugging data)
      6. ' diff --git a/courses.dist/modelCourse/templates/set0/prob4/testing.html b/courses.dist/modelCourse/templates/set0/prob4/testing.html index a283fd2025..4c359ede58 100644 --- a/courses.dist/modelCourse/templates/set0/prob4/testing.html +++ b/courses.dist/modelCourse/templates/set0/prob4/testing.html @@ -52,7 +52,7 @@

        Remark on hints

        You can use the Feedback button -at the bottom of each problem page to send e-mail to the TA and to the professor. +at the bottom of each problem page to send email to the TA and to the professor. diff --git a/courses.dist/modelCourse/templates/set0/screenHeaderFile0.pg b/courses.dist/modelCourse/templates/set0/screenHeaderFile0.pg index d347007621..b475eb9aa4 100644 --- a/courses.dist/modelCourse/templates/set0/screenHeaderFile0.pg +++ b/courses.dist/modelCourse/templates/set0/screenHeaderFile0.pg @@ -29,7 +29,7 @@ your professor for help. Don't spend a lot of time guessing -- it's not very ef $PAR You can use the Feedback button on each problem -page to send e-mail to the professors. +page to send email to the professors. $PAR Give 4 or 5 significant digits for (floating point) numerical answers. For most problems when entering numerical answers, you can if you wish diff --git a/courses.dist/modelCourse/templates/setDemo/screenHeaderFile1.pg b/courses.dist/modelCourse/templates/setDemo/screenHeaderFile1.pg index f486d1658f..ea6c0bef30 100644 --- a/courses.dist/modelCourse/templates/setDemo/screenHeaderFile1.pg +++ b/courses.dist/modelCourse/templates/setDemo/screenHeaderFile1.pg @@ -58,7 +58,7 @@ your professor for help. Don't spend a lot of time guessing -- it's not very ef $PAR You can use the Feedback button on each problem -page to send e-mail to the professors. +page to send email to the professors. $PAR Give 4 or 5 significant digits for (floating point) numerical answers. For most problems when entering numerical answers, you can if you wish diff --git a/courses.dist/modelCourse/templates/setMAAtutorial/MAAtutorialSetHeader.pg b/courses.dist/modelCourse/templates/setMAAtutorial/MAAtutorialSetHeader.pg index afb36de910..83719e9ae6 100644 --- a/courses.dist/modelCourse/templates/setMAAtutorial/MAAtutorialSetHeader.pg +++ b/courses.dist/modelCourse/templates/setMAAtutorial/MAAtutorialSetHeader.pg @@ -90,7 +90,7 @@ Along with the \{htmlLink(qq!http://webwork.maa.org/wiki/Units!, "list of units" physics problems. $PAR You can use the Feedback button on each problem -page to send e-mail to the professors. +page to send email to the professors. END_TEXT diff --git a/courses.dist/modelCourse/templates/setOrientation/options_info.txt b/courses.dist/modelCourse/templates/setOrientation/options_info.txt index f6aa8eadf3..5987b97799 100644 --- a/courses.dist/modelCourse/templates/setOrientation/options_info.txt +++ b/courses.dist/modelCourse/templates/setOrientation/options_info.txt @@ -12,16 +12,16 @@ then press the "Change User Options" button. Your password should be at least 6 characters long, and should include something other than just letters. Don't make it something that is easily guessed, and don't make it the same as the password for your -e-mail account! +email account!

        -If you prefer to receive your e-mail at a location other than your -Union College account, you should change your e-mail address in the box +If you prefer to receive your email at a location other than your +Union College account, you should change your email address in the box at the left. Be aware, however, that your professor (and others on the Union campus) may still send mail to your Union College address, so you should check that account regularly anyway. Note that you can -have your Union college e-mail forwarded to another address +have your Union college email forwarded to another address automatically if you wish.

        diff --git a/courses.dist/modelCourse/templates/setOrientation/prob15.pg b/courses.dist/modelCourse/templates/setOrientation/prob15.pg index b8d710bd55..5aa4cbed87 100644 --- a/courses.dist/modelCourse/templates/setOrientation/prob15.pg +++ b/courses.dist/modelCourse/templates/setOrientation/prob15.pg @@ -54,7 +54,7 @@ $ITEMSEP $ITEM Use the ${LQ}Email instructor$RQ button at the bottom of the problem page -to send e-mail to your instructor. Include in your message the details of +to send email to your instructor. Include in your message the details of what you have tried so far. If you are having a software problem, include details about the error messages you are getting. diff --git a/templates/ContentGenerator/Feedback.html.ep b/templates/ContentGenerator/Feedback.html.ep index ca31c70e77..bfbd93e713 100644 --- a/templates/ContentGenerator/Feedback.html.ep +++ b/templates/ContentGenerator/Feedback.html.ep @@ -1,13 +1,13 @@ % use Text::Wrap qw(wrap); % % unless ($authz->hasPermissions(param('user'), 'submit_feedback')) { -

        <%= maketext('You are not allowed to send e-mail.') %>

        +

        <%= maketext('You are not allowed to send email.') %>

        <%= link_to maketext('Cancel E-Mail') => $returnURL %>

        % last; % } % % unless ($numRecipients) { -

        <%= maketext('No e-mail recipients are listed for this course.') %>

        +

        <%= maketext('No email recipients are listed for this course.') %>

        <%= link_to maketext('Cancel E-Mail') => $returnURL %>

        % last; % } diff --git a/templates/HelpFiles/InstructorUserList.html.ep b/templates/HelpFiles/InstructorUserList.html.ep index c378fca891..9aa20b41de 100644 --- a/templates/HelpFiles/InstructorUserList.html.ep +++ b/templates/HelpFiles/InstructorUserList.html.ep @@ -101,7 +101,7 @@
        <%= maketext('To drop a student or students, select them for editing as described above and then set the ' . 'pop-up list to enrolled,drop, or audit. Dropped students cannot log in to the course, are not assigned ' - . 'new homework sets and are not sent e-mail. They can be re-enrolled simply by changing their status back ' + . 'new homework sets and are not sent email. They can be re-enrolled simply by changing their status back ' . 'to enrolled. No data is lost, any homework sets assigned before they were dropped are restored ' . 'unchanged.') =%>
        @@ -196,7 +196,7 @@ . 'adjust due dates, or to adjust the grades on a homework set for a student.') =%>
      7. - <%== maketext('Clicking the e-mail address link will bring up your standard email application ' + <%== maketext('Clicking the email address link will bring up your standard email application ' . 'so that you can send email to the student. This works even if the student has been dropped from the ' . 'course. To send email to an entire class or to merge grades with the email message use the "Email" page ' . 'link in the left margin.') =%> diff --git a/templates/HelpFiles/Options.html.ep b/templates/HelpFiles/Options.html.ep index 6ca35f80dd..e0cd395aa2 100644 --- a/templates/HelpFiles/Options.html.ep +++ b/templates/HelpFiles/Options.html.ep @@ -19,7 +19,7 @@

        <%= maketext('This page allows users to change their password, email address, and display settings used in ' . 'problems. Note that you can hide this page entirely for students by setting permission levels to ' - . 'login_proctor or higher for the permissions to change password, change e-mail address, and change display ' + . 'login_proctor or higher for the permissions to change password, change email address, and change display ' . 'settings used in pg problems.') =%>

        <%= maketext('Password') %>

        From 2bedeff7ed2607fa17d0557e56b2434bc198eeb9 Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Wed, 9 Aug 2023 06:50:54 -0500 Subject: [PATCH 107/549] Progress bar accessibility improvements. The progress bar elements are now focusable, and tooltips active on both hover and focus. Note that this makes all `.set-id-tooltips` active on hover and focus. That means that this also applies to the actual set ids as well on the problem sets page. The box shadows on the progress bar and contained elements are now black and thicker. When a progress bar element is focused the border is thicker and box shadow a bit lighter. This may not be good enough by itself, but should be good enough considering that the tooltip is really what is important here. In fact I think that visual aspects of the progress bar in general are not as important with the tooltip being active on focus. Also make the style more specific. The `.progress` and `.progress-bar` classes are bootstrap classes that could conceivably be used for another progress bar. So a `.set-progress` class is added to distinquish this from other progress bars. --- htdocs/themes/math4/math4.js | 6 +- htdocs/themes/math4/math4.scss | 75 ++++++++----------- .../ContentGenerator/Problem/siblings.html.ep | 11 +-- 3 files changed, 40 insertions(+), 52 deletions(-) diff --git a/htdocs/themes/math4/math4.js b/htdocs/themes/math4/math4.js index b180770fc9..7787fd155e 100644 --- a/htdocs/themes/math4/math4.js +++ b/htdocs/themes/math4/math4.js @@ -97,9 +97,9 @@ // Homework sets editor config // FIXME: These are really general purpose tooltips and not just in the homework sets editor. So the class name // should be chosen to better reflect this. - document.querySelectorAll('.set-id-tooltip').forEach( - (el) => {if (el.dataset.bsTitle) new bootstrap.Tooltip(el, {trigger: 'hover', fallbackPlacements: []});} - ); + document.querySelectorAll('.set-id-tooltip').forEach((el) => { + if (el.dataset.bsTitle) new bootstrap.Tooltip(el, { fallbackPlacements: [] }); + }); // Hardcopy tooltips shown on the Problem Sets page. document.querySelectorAll('.hardcopy-tooltip').forEach( diff --git a/htdocs/themes/math4/math4.scss b/htdocs/themes/math4/math4.scss index 0f244b80dd..2485cb4ae2 100644 --- a/htdocs/themes/math4/math4.scss +++ b/htdocs/themes/math4/math4.scss @@ -302,55 +302,42 @@ $site-nav-width: 250px !default; } /* Progress Bar */ -div { - &.progress { - height: 20px; - max-width: 100%; - border: 1px solid #B6B6B4; - background-color: #DDDDDD; - border-radius: 5px; - margin-bottom: 10px; - position: relative; - align-items: center; - } +.progress.set-progress { + height: 25px; + max-width: 100%; + box-shadow: inset 0 0 3px 2px #000; + background-color: #ddd; + border-radius: 5px; + margin-bottom: 10px; + align-items: center; - &.correct-progress { - color: black; - background-color: #8F8; /* same color used as 'correct' */ - box-shadow: inset 0 0 2px 1px #00FF00; - border-radius: 4px; - display: inline-block; - box-sizing: border-box; - text-align: center; + .progress-bar { + box-shadow: inset 0 0 3px 2px #000; height: 100%; - } - - &.incorrect-progress { color: black; - background-color: #FF9494; /* same color used as 'incorrect' */ - box-shadow: inset 0 0 2px 1px #FF0000; - border-radius: 4px; - display: inline-block; - box-sizing: border-box; - height: 100%; - } - &.inprogress-progress { - color: black; - background-color: #FFFF00; /* yellow */ - box-shadow: inset 0 0 2px 1px #FBB117; /* beer border*/ - border-radius: 4px; - display: inline-block; - box-sizing: border-box; - height: 100%; - } + &.correct-progress { + background-color: #8f8; /* same color used as 'correct' */ + } - &.unattempted-progress { - color: black; - background-color: transparent; - display: inline-block; - box-sizing: border-box; - height: 100%; + &.incorrect-progress { + background-color: #ff9494; /* same color used as 'incorrect' */ + } + + &.inprogress-progress { + background-color: #ff0; /* yellow */ + } + + &.unattempted-progress { + background-color: transparent; + } + + &:focus { + outline: 0; + box-shadow: inset 0 0 3px 2px #333; + border: 3px solid black; + z-index: 2; + } } } diff --git a/templates/ContentGenerator/Problem/siblings.html.ep b/templates/ContentGenerator/Problem/siblings.html.ep index 51d0bef1a3..6e158d9f5e 100644 --- a/templates/ContentGenerator/Problem/siblings.html.ep +++ b/templates/ContentGenerator/Problem/siblings.html.ep @@ -7,12 +7,13 @@ % my $progress_bar_inprogress_width = $total_inprogress * 100 / $num_of_problems; % my $progress_bar_unattempted_width = $unattempted * 100 / $num_of_problems; % -
        +
        % if ($total_correct > 0) {
        % # Perfect scores deserve some stars (★)! % if ($total_correct == $num_of_problems) { @@ -24,7 +25,7 @@
        % } @@ -32,7 +33,7 @@
        % } @@ -40,7 +41,7 @@
        % } From 6ba3cde7b37d87bb890eb27ba516472cac940def Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Fri, 4 Aug 2023 19:24:01 -0500 Subject: [PATCH 108/549] Tweak the site navigation link colors. This makes the background color lighter and the foreground color dark for active links in the the site navigation. This makes it easier to determine when the active link has focus because the outline color is darker than the new background color. The math4-green theme needed a slightly darker background than the math4 and math4-red themes, and the the colors are the same as before for the math4-yellow theme for which this is not an issue. This addresses the first part of issue #2157. --- htdocs/themes/math4-green/_theme-overrides.scss | 3 +++ htdocs/themes/math4-yellow/_theme-overrides.scss | 5 +++++ htdocs/themes/math4/bootstrap.scss | 2 ++ htdocs/themes/math4/math4.scss | 4 ++-- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/htdocs/themes/math4-green/_theme-overrides.scss b/htdocs/themes/math4-green/_theme-overrides.scss index e69de29bb2..7270930cfd 100644 --- a/htdocs/themes/math4-green/_theme-overrides.scss +++ b/htdocs/themes/math4-green/_theme-overrides.scss @@ -0,0 +1,3 @@ +:root { + --ww-site-nav-link-active-background-color: #{lighten($primary, 50%)}; +} diff --git a/htdocs/themes/math4-yellow/_theme-overrides.scss b/htdocs/themes/math4-yellow/_theme-overrides.scss index 6b19c107da..f2f10fc49a 100644 --- a/htdocs/themes/math4-yellow/_theme-overrides.scss +++ b/htdocs/themes/math4-yellow/_theme-overrides.scss @@ -20,3 +20,8 @@ .text-primary { color: $link-color !important; } + +:root { + --ww-site-nav-link-active-background-color: #{$primary}; + --ww-site-nav-link-active-color: #{color-contrast($primary)}; +} diff --git a/htdocs/themes/math4/bootstrap.scss b/htdocs/themes/math4/bootstrap.scss index 934255d767..bf5b1debe6 100644 --- a/htdocs/themes/math4/bootstrap.scss +++ b/htdocs/themes/math4/bootstrap.scss @@ -87,6 +87,8 @@ $breadcrumb-active-color: #495057; --ww-logo-background-color: #{$ww-logo-background-color}; --ww-primary-foreground-color: #{color-contrast($primary)}; --ww-achievement-level-color: #{$ww-achievement-level-color}; + --ww-site-nav-link-active-background-color: #{lighten($primary, 55%)}; + --ww-site-nav-link-active-color: #{$primary}; } // Overrides diff --git a/htdocs/themes/math4/math4.scss b/htdocs/themes/math4/math4.scss index 2485cb4ae2..c121797a56 100644 --- a/htdocs/themes/math4/math4.scss +++ b/htdocs/themes/math4/math4.scss @@ -213,8 +213,8 @@ $site-nav-width: 250px !default; padding-bottom: 0.2rem; &.active { - background-color: var(--bs-primary, #038); - color: var(--ww-primary-foreground-color, white); + background-color: var(--ww-site-nav-link-active-background-color, #038); + color: var(--ww-site-nav-link-active-color, white); } } &.list-group-item { From 5e224a9ddfd7da4c8ddbf8e9ff62d02176754be1 Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Sat, 5 Aug 2023 22:11:34 -0700 Subject: [PATCH 109/549] hr in site nav --- htdocs/themes/math4/math4.scss | 5 +++++ templates/ContentGenerator/Base/admin_links.html.ep | 3 ++- templates/ContentGenerator/Base/links.html.ep | 11 ++++++----- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/htdocs/themes/math4/math4.scss b/htdocs/themes/math4/math4.scss index c121797a56..9ec51726a0 100644 --- a/htdocs/themes/math4/math4.scss +++ b/htdocs/themes/math4/math4.scss @@ -301,6 +301,11 @@ $site-nav-width: 250px !default; } } +hr.hr { + margin: 3pt 7pt; + border: 1pt solid; +} + /* Progress Bar */ .progress.set-progress { height: 25px; diff --git a/templates/ContentGenerator/Base/admin_links.html.ep b/templates/ContentGenerator/Base/admin_links.html.ep index d9cb313188..df572c8239 100644 --- a/templates/ContentGenerator/Base/admin_links.html.ep +++ b/templates/ContentGenerator/Base/admin_links.html.ep @@ -1,5 +1,6 @@
    @@ -58,10 +57,10 @@ . 'a large number of students into your class. To view the format for ClassList files see ' . 'the ClassList specification or download the [_2] file and use it as a model. ' . 'ClassList files can be prepared using a spreadsheet and then saved as [_3] (comma separated values) ' - . 'text files. However, to access as a classlist file, the file suffix needs to be changed to [_4], ' + . 'text files. However, to access as a classlist file, the file suffix needs to be changed to [_4], ' . 'which can be done with the "Rename" button.', 'href="http://webwork.maa.org/wiki/Classlist_Files#Format_of_classlist_files" target="Webworkdocs"', - 'demoCourse.lst','.csv','.lst') =%> + 'demoCourse.lst', '.csv', '.lst') =%>
    <%= maketext('Scoring (".csv") files') %>
    From f351e9b1b0291cc5dafa95955d5726558422ab88 Mon Sep 17 00:00:00 2001 From: Peter Staab Date: Mon, 4 Sep 2023 07:31:43 -0400 Subject: [PATCH 145/549] Changed the error handling to report number of existing and outside files --- .../Instructor/FileManager.pm | 67 +++++++++++++------ 1 file changed, 47 insertions(+), 20 deletions(-) diff --git a/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm b/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm index 88bd62d21f..47e93ca25f 100644 --- a/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm +++ b/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm @@ -449,6 +449,10 @@ sub UnpackArchive ($c) { sub unpack_archive ($c, $archive) { my $dir = Mojo::File->new($c->{courseRoot}, $c->{pwd}); + # Used for determining non-existing and existing files. + my (@members, @existing_files); + my $num_extracted = 0; + if ($archive =~ m/\.zip$/) { my $zip = Archive::Zip->new($dir->child($archive)->to_string); unless ($zip) { @@ -461,33 +465,42 @@ sub unpack_archive ($c, $archive) { $c->addbadmessage($error); }); - my $num_extracted = 0; - my @members = $zip->members; + my @members = $zip->members; + my @outside_files; for (@members) { my $out_file = $dir->child($_->fileName)->realpath; if ($out_file !~ /^$dir/) { - $c->addbadmessage($c->maketext( - 'The file "[_1]" can not be safely unpacked as it is outside the current working directory.', - $_->fileName - )); + push(@outside_files, $_->fileName); next; } if (!$c->param('overwrite') && -e $out_file) { - $c->addbadmessage($c->maketext( - 'The file "[_1]" already exists. ' - . 'Check "Overwrite existing files silently" to unpack this file.', - $_->fileName - )); + push(@existing_files, $_->fileName); next; } ++$num_extracted if $zip->extractMember($_ => $out_file->to_string) == AZ_OK; } + if (@outside_files) { + if (scalar(@outside_files) == 1) { + $c->addbadmessage($c->maketext( + 'The file "[_1]" can not be safely unpacked as it is outside the current working directory.', + $outside_files[0] + )); + } else { + $c->addbadmessage($c->maketext( + 'There are [_1] files that already exist including [_2] and [_3]. ' + . 'Check "Overwrite existing files silently" to unpack these files', + scalar(@outside_files), + $outside_files[0], + $outside_files[1] + )); + } + } + Archive::Zip::setErrorHandler(); $c->addgoodmessage($c->maketext('[quant,_1,file] unpacked successfully', $num_extracted)) if $num_extracted; - return $num_extracted == @members; } elsif ($archive =~ m/\.(tar(\.gz)?|tgz)$/) { local $Archive::Tar::WARN = 0; @@ -499,15 +512,10 @@ sub unpack_archive ($c, $archive) { $tar->setcwd($dir->to_string); - my $num_extracted = 0; - my @members = $tar->list_files; + my @members = $tar->list_files; for (@members) { if (!$c->param('overwrite') && -e $dir->child($_)) { - $c->addbadmessage($c->maketext( - 'The file "[_1]" already exists. ' - . 'Check "Overwrite existing files silently" to unpack this file.', - $_ - )); + push(@existing_files, $_); next; } unless ($tar->extract_file($_)) { @@ -518,11 +526,30 @@ sub unpack_archive ($c, $archive) { } $c->addgoodmessage($c->maketext('[quant,_1,file] unpacked successfully', $num_extracted)) if $num_extracted; - return $num_extracted == @members; } else { $c->addbadmessage($c->maketext('Unsupported archive type in file "[_1]"', $archive)); return 0; } + + if (@existing_files) { + if (scalar(@existing_files) == 1) { + $c->addbadmessage($c->maketext( + 'The file "[_1]" already exists. ' + . 'Check "Overwrite existing files silently" to unpack this file.', + $existing_files[0] + )); + } else { + $c->addbadmessage($c->maketext( + 'There are [_1] files that already exist including [_2] and [_3]. ' + . 'Check "Overwrite existing files silently" to unpack these files', + scalar(@existing_files), + $existing_files[0], + $existing_files[1] + )); + } + } + + return $num_extracted == @members; } # Make a new file and edit it From 97a82634b9b3960c7a6558938961b849b323897e Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Mon, 4 Sep 2023 08:21:34 -0500 Subject: [PATCH 146/549] Fix messages for existing files or files outside the course directory. This makes it so that the first thirty files in both lists are shown. If there are more than thirty, then the last item in the list will say that there are more files not shown. To make this work a `min` method was added to Utils.pm (there was a max method, but no min method?), and the change in #2194 to make good and bad messages be in a `div` instead of a `p` was added here too. --- htdocs/themes/math4/math4.scss | 2 +- lib/WeBWorK/ContentGenerator.pm | 6 +- .../Instructor/FileManager.pm | 119 ++++++++++-------- lib/WeBWorK/Utils.pm | 24 ++-- 4 files changed, 91 insertions(+), 60 deletions(-) diff --git a/htdocs/themes/math4/math4.scss b/htdocs/themes/math4/math4.scss index f0fee9b40f..87494e47b8 100644 --- a/htdocs/themes/math4/math4.scss +++ b/htdocs/themes/math4/math4.scss @@ -456,7 +456,7 @@ h2.page-title { gap: 0.25rem; margin: 0 0 0.5rem; - p { + div { margin: 0; } } diff --git a/lib/WeBWorK/ContentGenerator.pm b/lib/WeBWorK/ContentGenerator.pm index 9c0d7dad01..992597c747 100644 --- a/lib/WeBWorK/ContentGenerator.pm +++ b/lib/WeBWorK/ContentGenerator.pm @@ -265,8 +265,9 @@ message() template escape handler. sub addgoodmessage ($c, $message) { $c->addmessage($c->tag( - 'p', + 'div', class => 'alert alert-success alert-dismissible fade show ps-1 py-1', + role => 'alert', $c->c( $message, $c->tag( @@ -290,8 +291,9 @@ message() template escape handler. sub addbadmessage ($c, $message) { $c->addmessage($c->tag( - 'p', + 'div', class => 'alert alert-danger alert-dismissible fade show ps-1 py-1', + role => 'alert', $c->c( $message, $c->tag( diff --git a/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm b/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm index 47e93ca25f..83b5ccaa1c 100644 --- a/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm +++ b/lib/WeBWorK/ContentGenerator/Instructor/FileManager.pm @@ -31,7 +31,7 @@ use Archive::Tar; use Archive::Zip qw(:ERROR_CODES); use Archive::Zip::SimpleZip qw($SimpleZipError); -use WeBWorK::Utils qw(readDirectory readFile sortByName listFilesRecursive); +use WeBWorK::Utils qw(readDirectory readFile sortByName listFilesRecursive min); use WeBWorK::Upload; use WeBWorK::Utils::CourseManagement qw(archiveCourse); @@ -449,8 +449,7 @@ sub UnpackArchive ($c) { sub unpack_archive ($c, $archive) { my $dir = Mojo::File->new($c->{courseRoot}, $c->{pwd}); - # Used for determining non-existing and existing files. - my (@members, @existing_files); + my (@members, @existing_files, @outside_files); my $num_extracted = 0; if ($archive =~ m/\.zip$/) { @@ -465,8 +464,7 @@ sub unpack_archive ($c, $archive) { $c->addbadmessage($error); }); - my @members = $zip->members; - my @outside_files; + @members = $zip->members; for (@members) { my $out_file = $dir->child($_->fileName)->realpath; if ($out_file !~ /^$dir/) { @@ -481,26 +479,7 @@ sub unpack_archive ($c, $archive) { ++$num_extracted if $zip->extractMember($_ => $out_file->to_string) == AZ_OK; } - if (@outside_files) { - if (scalar(@outside_files) == 1) { - $c->addbadmessage($c->maketext( - 'The file "[_1]" can not be safely unpacked as it is outside the current working directory.', - $outside_files[0] - )); - } else { - $c->addbadmessage($c->maketext( - 'There are [_1] files that already exist including [_2] and [_3]. ' - . 'Check "Overwrite existing files silently" to unpack these files', - scalar(@outside_files), - $outside_files[0], - $outside_files[1] - )); - } - } - Archive::Zip::setErrorHandler(); - - $c->addgoodmessage($c->maketext('[quant,_1,file] unpacked successfully', $num_extracted)) if $num_extracted; } elsif ($archive =~ m/\.(tar(\.gz)?|tgz)$/) { local $Archive::Tar::WARN = 0; @@ -512,43 +491,87 @@ sub unpack_archive ($c, $archive) { $tar->setcwd($dir->to_string); - my @members = $tar->list_files; + @members = $tar->list_files; for (@members) { + my $out_file = $dir->child($_)->realpath; + if ($out_file !~ /^$dir/) { + push(@outside_files, $_); + next; + } + if (!$c->param('overwrite') && -e $dir->child($_)) { push(@existing_files, $_); next; } + unless ($tar->extract_file($_)) { $c->addbadmessage($tar->error); next; } ++$num_extracted; } - - $c->addgoodmessage($c->maketext('[quant,_1,file] unpacked successfully', $num_extracted)) if $num_extracted; } else { $c->addbadmessage($c->maketext('Unsupported archive type in file "[_1]"', $archive)); return 0; } - if (@existing_files) { - if (scalar(@existing_files) == 1) { - $c->addbadmessage($c->maketext( - 'The file "[_1]" already exists. ' - . 'Check "Overwrite existing files silently" to unpack this file.', - $existing_files[0] - )); - } else { - $c->addbadmessage($c->maketext( - 'There are [_1] files that already exist including [_2] and [_3]. ' - . 'Check "Overwrite existing files silently" to unpack these files', - scalar(@existing_files), - $existing_files[0], - $existing_files[1] - )); - } + if (@outside_files) { + $c->addbadmessage( + $c->tag( + 'p', + $c->maketext( + 'The following [plural,_1,file is,files are] outside the current working directory ' + . 'and can not be safely unpacked.', + scalar(@outside_files), + ) + ) + . $c->tag( + 'div', + $c->tag( + 'ul', + $c->c( + (map { $c->tag('li', $_) } @outside_files[ 0 .. min(29, $#outside_files) ]), + ( + @outside_files > 30 + ? $c->tag('li', + $c->maketext('[quant,_1,more file,more files] not shown', @outside_files - 30)) + : () + ) + )->join('') + ) + ) + ); } + if (@existing_files) { + $c->addbadmessage( + $c->tag( + 'p', + $c->maketext( + 'The following [plural,_1,file already exists,files already exist]. ' + . 'Check "Overwrite existing files silently" to unpack [plural,_1,this file,these files].', + scalar(@existing_files), + ) + ) + . $c->tag( + 'div', + $c->tag( + 'ul', + $c->c( + (map { $c->tag('li', $_) } @existing_files[ 0 .. min(29, $#existing_files) ]), + ( + @existing_files > 30 + ? $c->tag('li', + $c->maketext('[quant,_1,more file,more files] not shown', @existing_files - 30)) + : () + ) + )->join('') + ) + ) + ); + } + + $c->addgoodmessage($c->maketext('[quant,_1,file] unpacked successfully', $num_extracted)) if $num_extracted; return $num_extracted == @members; } @@ -630,9 +653,8 @@ sub Upload ($c) { $c->Confirm( $c->tag( 'p', - $c->b( - $c->maketext('File [_1] already exists. Overwrite it, or rename it as:', $name) - ) + $c->b($c->maketext( + 'File [_1] already exists. Overwrite it, or rename it as:', $name)) ), uniqueName($dir, $name), $c->maketext('Rename'), @@ -768,9 +790,8 @@ sub directoryListing ($c, $pwd) { for my $name (@values) { my $file = "$dir/$name->[1]"; my ($size, $date) = (lstat($file))[ 7, 9 ]; - $name->[0] = - $c->b( - sprintf("%-${len}s%-16s%10s", $name->[0], -d $file ? ('', '') : (getDate($date), getSize($size))) + $name->[0] = $c->b( + sprintf("%-${len}s%-16s%10s", $name->[0], -d $file ? ('', '') : (getDate($date), getSize($size))) =~ s/\s/ /gr); } } diff --git a/lib/WeBWorK/Utils.pm b/lib/WeBWorK/Utils.pm index 8a799b884b..5f9edbfaf3 100644 --- a/lib/WeBWorK/Utils.pm +++ b/lib/WeBWorK/Utils.pm @@ -81,6 +81,7 @@ our @EXPORT_OK = qw( list2hash listFilesRecursive makeTempDirectory + min max nfreeze_base64 not_blank @@ -1049,15 +1050,22 @@ sub thaw_base64 { } -sub max(@) { - my $soFar; - foreach my $item (@_) { - $soFar = $item unless defined $soFar; - if ($item > $soFar) { - $soFar = $item; - } +sub min { + my @items = @_; + my $min = (shift @items) // 0; + for my $item (@items) { + $min = $item if ($item < $min); + } + return $min; +} + +sub max { + my @items = @_; + my $max = (shift @items) // 0; + for my $item (@items) { + $max = $item if ($item > $max); } - return defined $soFar ? $soFar : 0; + return $max; } sub wwRound(@) { From d5b91d475b078a43bfd95ed591eff610129e5acb Mon Sep 17 00:00:00 2001 From: Danny Glin Date: Tue, 5 Sep 2023 09:27:06 -0600 Subject: [PATCH 147/549] Change help file to match --- templates/HelpFiles/InstructorSetMaker.html.ep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/HelpFiles/InstructorSetMaker.html.ep b/templates/HelpFiles/InstructorSetMaker.html.ep index 9731e164de..c551ab21cc 100644 --- a/templates/HelpFiles/InstructorSetMaker.html.ep +++ b/templates/HelpFiles/InstructorSetMaker.html.ep @@ -38,7 +38,7 @@ . q{haven't been vetted as thoroughly as OPL problems. If you want hints or solutions included while } . 'browsing select the appropriate box.') =%>
    -
    <%= maketext('File Manager') %>
    +
    <%= maketext('Course Files') %>
    <%= maketext('This option shows all pg problems in the course directory structure.')%>
    <%= maketext('Course Sets') %>
    <%= maketext('This option shows all problems in sets that have been created in the course.') %>
    From a961b45cc7841cc057859ed0d71969820af71277 Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Fri, 8 Sep 2023 14:18:12 -0500 Subject: [PATCH 148/549] Make the library browser database connections use a cached connection Currently the database connections used by the library browser are obtained with a `DBI->connect` call, and those connections are never closed. As a result each time the library browser is accessed, a new database connection is obtained, and the previous connections are left open until the server process that created the connection is recycled. This results in the database connection count being unnecessarily incremented. This changes those calls to `DBI->connect_cached`. This means that if the process already has a database connection, it will be reused instead of a new one being made. Thus keeping the database connection count down. See https://webwork.maa.org/moodle/mod/forum/discuss.php?d=8355 for the discussion that led to this pull request. --- lib/WeBWorK/Utils/LibraryStats.pm | 53 ++++++++++--------------------- lib/WeBWorK/Utils/ListingDB.pm | 8 ++--- 2 files changed, 21 insertions(+), 40 deletions(-) diff --git a/lib/WeBWorK/Utils/LibraryStats.pm b/lib/WeBWorK/Utils/LibraryStats.pm index 186935de2a..a4a39027dd 100644 --- a/lib/WeBWorK/Utils/LibraryStats.pm +++ b/lib/WeBWorK/Utils/LibraryStats.pm @@ -13,61 +13,43 @@ # Artistic License for more details. ################################################################################ -########################### -# Utils::LibraryLocalStats -# -# This is an interface for getting local statistics about library problems -# for display -########################### - +# This is an interface for getting global and local statistics about library problems for display. package WeBWorK::Utils::LibraryStats; -use base qw(Exporter); use strict; use warnings; -use DBI; -our @EXPORT = (); -our @EXPORT_OK = qw(); +use DBI; sub new { - my $class = shift; - my $ce = shift; + my ($class, $ce) = @_; - my $dbh = DBI->connect( - $ce->{problemLibrary_db}->{dbsource}, - $ce->{problemLibrary_db}->{user}, - $ce->{problemLibrary_db}->{passwd}, + my $dbh = DBI->connect_cached( + $ce->{problemLibrary_db}{dbsource}, + $ce->{problemLibrary_db}{user}, + $ce->{problemLibrary_db}{passwd}, { PrintError => 0, RaiseError => 0, }, ); - my $localselectstm = $dbh->prepare("SELECT * FROM OPL_local_statistics WHERE source_file = ?"); - - my $globalselectstm = $dbh->prepare("SELECT * FROM OPL_global_statistics WHERE source_file = ?"); - - my $self = { + return bless { dbh => $dbh, - localselectstm => $localselectstm, - globalselectstm => $globalselectstm, - }; - - bless($self, $class); - return $self; + localselectstm => $dbh->prepare("SELECT * FROM OPL_local_statistics WHERE source_file = ?"), + globalselectstm => $dbh->prepare("SELECT * FROM OPL_global_statistics WHERE source_file = ?"), + }, $class; } sub getLocalStats { - my $self = shift; - my $source_file = shift; + my ($self, $source_file) = @_; my $selectstm = $self->{localselectstm}; unless ($selectstm->execute($source_file)) { if ($selectstm->errstr =~ /Table .* doesn't exist/) { - warn - "Couldn't find the OPL local statistics table. Did you download the latest OPL and run update-OPL-statistics.pl?"; + warn "Couldn't find the OPL local statistics table. " + . "Did you download the latest OPL and run update-OPL-statistics.pl?"; } die $selectstm->errstr; } @@ -87,15 +69,14 @@ sub getLocalStats { } sub getGlobalStats { - my $self = shift; - my $source_file = shift; + my ($self, $source_file) = @_; my $selectstm = $self->{globalselectstm}; unless ($selectstm->execute($source_file)) { if ($selectstm->errstr =~ /Table .* doesn't exist/) { - warn - "Couldn't find the OPL global statistics table. Did you download the latest OPL and run load-OPL-global-statistics.pl?"; + warn "Couldn't find the OPL global statistics table. " + . "Did you download the latest OPL and run load-OPL-global-statistics.pl?"; } die $selectstm->errstr; } diff --git a/lib/WeBWorK/Utils/ListingDB.pm b/lib/WeBWorK/Utils/ListingDB.pm index 7bcce145fd..60483182ce 100644 --- a/lib/WeBWorK/Utils/ListingDB.pm +++ b/lib/WeBWorK/Utils/ListingDB.pm @@ -105,10 +105,10 @@ sub getTables { sub getDB { my $ce = shift; - my $dbh = DBI->connect( - $ce->{problemLibrary_db}->{dbsource}, - $ce->{problemLibrary_db}->{user}, - $ce->{problemLibrary_db}->{passwd}, + my $dbh = DBI->connect_cached( + $ce->{problemLibrary_db}{dbsource}, + $ce->{problemLibrary_db}{user}, + $ce->{problemLibrary_db}{passwd}, { PrintError => 0, RaiseError => 1, From a9ff08ffd638a948ab512185fff87dcd12d4e6e4 Mon Sep 17 00:00:00 2001 From: "K. Andrew Parker" Date: Sun, 10 Sep 2023 21:42:06 -0400 Subject: [PATCH 149/549] initial draft --- .../templates/achievements/default.html.ep | 21 + .../WeBWorK/Tasks/AchievementNotification.pm | 101 +++++ lib/WeBWorK/AchievementEvaluator.pm | 15 +- .../Instructor/AchievementEditor.pm | 15 +- .../Instructor/AchievementList.pm | 4 +- .../AchievementNotificationEditor.pm | 378 ++++++++++++++++++ lib/WeBWorK/DB/Record/Achievement.pm | 1 + lib/WeBWorK/Utils.pm | 6 + lib/WeBWorK/Utils/Routes.pm | 8 +- .../AchievementList/default_table.html.ep | 6 + .../AchievementNotificationEditor.ep | 68 ++++ .../disable_form.html.ep | 2 + .../existing_form.html.ep | 7 + .../save_as_form.html.ep | 36 ++ .../save_form.html.ep | 3 + 15 files changed, 656 insertions(+), 15 deletions(-) create mode 100644 courses.dist/modelCourse/templates/achievements/default.html.ep create mode 100644 lib/Mojolicious/WeBWorK/Tasks/AchievementNotification.pm create mode 100644 lib/WeBWorK/ContentGenerator/Instructor/AchievementNotificationEditor.pm create mode 100644 templates/ContentGenerator/Instructor/AchievementNotificationEditor.ep create mode 100644 templates/ContentGenerator/Instructor/AchievementNotificationEditor/disable_form.html.ep create mode 100644 templates/ContentGenerator/Instructor/AchievementNotificationEditor/existing_form.html.ep create mode 100644 templates/ContentGenerator/Instructor/AchievementNotificationEditor/save_as_form.html.ep create mode 100644 templates/ContentGenerator/Instructor/AchievementNotificationEditor/save_form.html.ep diff --git a/courses.dist/modelCourse/templates/achievements/default.html.ep b/courses.dist/modelCourse/templates/achievements/default.html.ep new file mode 100644 index 0000000000..2940e3b83c --- /dev/null +++ b/courses.dist/modelCourse/templates/achievements/default.html.ep @@ -0,0 +1,21 @@ +
    + <%= image $ce->{server_root_url} . ( + $achievement->{icon} + ? "$ce->{courseURLs}{achievements}/$achievement->{icon}" + : "$ce->{webworkURLs}{htdocs}/images/defaulticon.png" + ), + alt => 'Achievement Icon' =%> +
    + % if ($achievement->category eq 'level') { +

    <%= $achievement->{name} %>

    +
    + <%= $ce->{achievementItemsEnabled} + ? $achievement->{description} + : maketext('Congratulations, you earned a new level!') =%> +
    + % } else { +

    <%= $achievement->{name} %>

    +
    <%= $achievement->{points} %> Points: <%= $achievement->{description} %>
    + % } +
    +
    \ No newline at end of file diff --git a/lib/Mojolicious/WeBWorK/Tasks/AchievementNotification.pm b/lib/Mojolicious/WeBWorK/Tasks/AchievementNotification.pm new file mode 100644 index 0000000000..93072fda17 --- /dev/null +++ b/lib/Mojolicious/WeBWorK/Tasks/AchievementNotification.pm @@ -0,0 +1,101 @@ +############################################################################### +# WeBWorK Online Homework Delivery System +# Copyright © 2000-2023 The WeBWorK Project, https://github.com/openwebwork +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of either: (a) the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version, or (b) the "Artistic License" which comes with this package. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the +# Artistic License for more details. +################################################################################ + +package Mojolicious::WeBWorK::Tasks::AchievementNotification; +use Mojo::Base 'Minion::Job', -signatures; + +use Email::Stuffer; +use Email::Sender::Transport::SMTP; + +use WeBWorK::Debug qw(debug); +use WeBWorK::CourseEnvironment; +use WeBWorK::DB; +use WeBWorK::Localize; +use WeBWorK::Utils qw/processEmailMessage createEmailSenderTransportSMTP/; + +# send student notification that they have earned an achievement +sub run ($job, $mail_data) { + my $ce = eval { WeBWorK::CourseEnvironment->new({ courseName => $mail_data->{courseName} }) }; + return $job->fail("Could not construct course environment for $mail_data->{courseName}.") unless $ce; + + my $db = WeBWorK::DB->new($ce->{dbLayout}); + return $job->fail("Could not obtain database connection for $mail_data->{courseName}.") unless $db; + + return $job->fail("Cannot notify student without an achievement.") unless $mail_data->{achievementID}; + $mail_data->{achievement} = $db->getAchievement($mail_data->{achievementID}); + return $job->fail("Could not find achievement $mail_data->{achievementID}.") unless $mail_data->{achievement}; + + $job->{language_handle} = WeBWorK::Localize::getLoc($ce->{language} || 'en'); + + my $result_message = eval { $job->send_achievement_notification($ce, $db, $mail_data) }; + if ($@) { + $job->app->log->error("An error occurred while trying to send email: $@\n"); + return $job->fail(); # fail silently + } + + return $job->finish(); # succeed silently +} + +sub send_achievement_notification ($job, $ce, $db, $mail_data) { + # default From: is default smtpSender from site.conf + unless ($mail_data->{from} || $ce->{mail}{set_return_path}) { + die "Cannot send system email without one of: mail{set_return_path} or mail{smtpSender}\n"; + } + + my $recipient = $mail_data->{recipient}; + my $template = $ce->{courseDirs}{achievements} . '/' . $mail_data->{template}; + my $renderer = Mojo::Template->new; + # what other data might need to be passed to the template? + $mail_data->{body} = $renderer->render_file($template, { + ce => $ce, # holds achievement URLs + maketext => sub { maketext($job, @_) }, # for maketext() in templates + achievement => $mail_data->{achievement}, # full db record + setID => $mail_data->{set_id}, + nextLevelPoints => $mail_data->{nextLevelPoints}, + }); + + my $user_record = $db->getUser($recipient); + unless ($user_record) { + die "Record for user $recipient not found\n"; + } + unless ($user_record->email_address =~ /\S/) { + die "User $recipient does not have an email address -- skipping\n"; + } + + # parse email template similar to how it is done in SendMail.pm + my $msg = processEmailMessage( + $mail_data->{body}, $user_record, + $ce->status_abbrev_to_name($user_record->status), + $mail_data->{merge_data} + ); + + my $email = + Email::Stuffer->to($user_record->email_address)->from($mail_data->{from})->subject($mail_data->{subject}) + ->text_body($msg)->header('X-Remote-Host' => $mail_data->{remote_host}); + + $email->send_or_die({ + transport => createEmailSenderTransportSMTP($ce), + $ce->{mail}{set_return_path} ? (from => $ce->{mail}{set_return_path}) : () + }); + debug 'email sent successfully to ' . $user_record->email_address; + + return $job->maketext('Message sent to [_1] at [_2].', $recipient, $user_record->email_address) . "\n" +} + +sub maketext ($job, @args) { + return &{ $job->{language_handle} }(@args); +} + +1; diff --git a/lib/WeBWorK/AchievementEvaluator.pm b/lib/WeBWorK/AchievementEvaluator.pm index 70901e6f40..d5df138a44 100644 --- a/lib/WeBWorK/AchievementEvaluator.pm +++ b/lib/WeBWorK/AchievementEvaluator.pm @@ -50,7 +50,7 @@ sub checkForAchievements ($problem_in, $pg, $c, %options) { return '' if $set_id eq $excludedSet; } - our $set = $db->getMergedSet($user_id, $problem->set_id); + our $set = $db->getMergedSet($user_id, $set_id); my @achievements = sortAchievements($db->getAchievementsWhere()); my $globalUserAchievement = $db->getGlobalUserAchievement($user_id); @@ -244,6 +244,19 @@ sub checkForAchievements ($problem_in, $pg, $c, %options) { # Construct the cheevo message using the cheevoMessage template. push(@$cheevoMessage, $c->include('AchievementEvaluator/cheevoMessage', achievement => $achievement)); + # if email_template is defined, send an email to the user + $c->minion->enqueue( + sendAchievementEmail => [ { + from => $ce->{mail}{defaultFrom}, + recipient => $user_id, + subject => 'Congratulations on earning a new achievement!', + template => $achievement->email_template, + achievementID => $achievement_id, + setID => $set_id, + nextLevelPoints => $nextLevelPoints, + } ] + ) if ($achievement->email_template); + my $points = $achievement->points; #just in case points is an ininitialzied variable $points = 0 unless $points; diff --git a/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm b/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm index 3e8edb08bf..6e39eb098b 100644 --- a/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm +++ b/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm @@ -25,7 +25,7 @@ WeBWorK::ContentGenerator::Instructor::AchievementEditor - edit an achevement ev use HTML::Entities; use File::Copy; -use WeBWorK::Utils qw(not_blank path_is_subdir x); +use WeBWorK::Utils qw(fix_newlines not_blank path_is_subdir x); use constant ACTION_FORMS => [qw(save save_as)]; use constant ACTION_FORM_TITLES => { @@ -204,21 +204,12 @@ sub saveFileChanges ($c, $outputFilePath, $achievementContents = undef) { return; } -sub fixAchievementContents ($achievementContents) { - # Handle the problem of line endings. - # Make sure that all of the line endings are of unix type. - # Convert \r\n to \n - $achievementContents =~ s/\r\n/\n/g; - $achievementContents =~ s/\r/\n/g; - return $achievementContents; -} - sub save_handler ($c) { my $courseName = $c->{courseID}; my $achievementName = $c->{achievementID}; # Grab the achievementContents from the form in order to save it to the source path - $c->stash->{achievementContents} = fixAchievementContents($c->param('achievementContents')); + $c->stash->{achievementContents} = fix_newlines($c->param('achievementContents')); # Construct the output file path $c->saveFileChanges($c->{sourceFilePath}); @@ -249,7 +240,7 @@ sub save_as_handler ($c) { } # Grab the achievementContents from the form in order to save it to a new permanent file - $c->stash->{achievementContents} = fixAchievementContents($c->param('achievementContents')); + $c->stash->{achievementContents} = fix_newlines($c->param('achievementContents')); warn 'achievement contents is empty' unless $c->stash->{achievementContents}; # Rescue the user in case they forgot to end the file name with .at diff --git a/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm b/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm index 68c950ca4a..bacd03f03d 100644 --- a/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm +++ b/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm @@ -431,7 +431,7 @@ sub import_handler ($c) { $achievement->achievement_id($achievement_id); # Fall back for importing an old list without the number or assignment_type fields - if (scalar(@$data) == 9) { + if (scalar(@$data) >= 9) { # Old lists tend to have an extraneous space at the front. for (my $i = 1; $i <= 7; $i++) { $$data[$i] =~ s/^\s+//; @@ -448,6 +448,7 @@ sub import_handler ($c) { $achievement->icon($$data[7]); $achievement->assignment_type('default'); $achievement->number($count + 1); + $achievement->email_template(''); } else { $achievement->name($$data[1]); $achievement->number($$data[2]); @@ -458,6 +459,7 @@ sub import_handler ($c) { $achievement->max_counter($$data[7]); $achievement->test($$data[8]); $achievement->icon($$data[9]); + $achievement->email_template($$data[10] // ''); } $achievement->enabled($assign eq "all" ? 1 : 0); diff --git a/lib/WeBWorK/ContentGenerator/Instructor/AchievementNotificationEditor.pm b/lib/WeBWorK/ContentGenerator/Instructor/AchievementNotificationEditor.pm new file mode 100644 index 0000000000..ee175e4ef3 --- /dev/null +++ b/lib/WeBWorK/ContentGenerator/Instructor/AchievementNotificationEditor.pm @@ -0,0 +1,378 @@ +################################################################################ +# WeBWorK Online Homework Delivery System +# Copyright © 2000-2023 The WeBWorK Project, https://github.com/openwebwork +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of either: (a) the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version, or (b) the "Artistic License" which comes with this package. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the +# Artistic License for more details. +################################################################################ + +package WeBWorK::ContentGenerator::Instructor::AchievementNotificationEditor; +use Mojo::Base 'WeBWorK::ContentGenerator', -signatures; + +=head1 NAME + +WeBWorK::ContentGenerator::Instructor::AchievementNotificationEditor - edit an achevement evaluator file + +=cut + +use HTML::Entities; +use File::Copy; + +use WeBWorK::Utils qw(fix_newlines not_blank path_is_subdir x); + +use constant ACTION_FORMS => [qw(save save_as existing disable)]; +use constant ACTION_FORM_TITLES => { + save => x('Save'), + save_as => x('Save As'), + existing => x('Use Existing Template'), + disable => x('Disable Notifications'), +}; + +use constant DEFAULT_ICON => 'defaulticon.png'; + +sub pre_header_initialize ($c) { + my $ce = $c->ce; + my $authz = $c->authz; + my $user = $c->param('user'); + $c->{courseID} = $c->stash('courseID'); + $c->{achievementID} = $c->stash('achievementID'); + + # Make sure that are defined for the templates. + $c->stash->{formsToShow} = ACTION_FORMS(); + $c->stash->{actionFormTitles} = ACTION_FORM_TITLES(); + $c->stash->{achievementNotification} = ''; + + # Check permissions + return unless ($authz->hasPermissions($user, 'edit_achievements')); + + # Get the achievement + my $achievement = $c->db->getAchievement($c->{achievementID}); + + if (!$achievement) { + $c->addbadmessage("Achievement $c->{achievementID} not found!"); + return; + } + + $c->{achievement} = $achievement; + my $template_filename = $achievement->email_template || "default.ep"; + $c->{sourceFilePath} = $ce->{courseDirs}{achievements} . "/$template_filename"; + + my $actionID = $c->param('action'); + + # Perform a save or save_as action + if ($actionID) { + unless (grep { $_ eq $actionID } @{ ACTION_FORMS() }) { + die "Action $actionID not found"; + } + + my $actionHandler = "${actionID}_handler"; + $c->$actionHandler; + } + + return; +} + +sub initialize ($c) { + my $authz = $c->authz; + my $user = $c->param('user'); + my $sourceFilePath = $c->{sourceFilePath}; + + return unless ($authz->hasPermissions($user, 'edit_achievements')); + + $c->addmessage($c->param('status_message') || ''); # Record status messages carried over from a redirect + + # Check source file path + if (not(-e $sourceFilePath)) { + $c->addbadmessage('The file "' . $c->shortPath($sourceFilePath) . '" cannot be found.'); + return; + } + + # Find the text for the achievement. + unless ($c->stash->{achievementNotification} =~ /\S/) { + unless (path_is_subdir($sourceFilePath, $c->ce->{courseDirs}{achievements}, 1)) { + $c->addbadmessage('Path is Unsafe!'); + return; + } + + eval { $c->stash->{achievementNotification} = WeBWorK::Utils::readFile($sourceFilePath) }; + $c->stash->{achievementNotification} = $@ if $@; + } + + return; +} + +sub page_title ($c) { + return $c->maketext('Achievement Notification for achievement [_1]', $c->stash('achievementID')); +} + +# Convert long paths to [ACHEVDIR] +sub shortPath ($c, $file) { + my $ache = $c->ce->{courseDirs}{achievements}; + $file =~ s|^$ache|[ACHEVDIR]|; + return $file; +} + +sub getRelativeSourceFilePath ($c, $sourceFilePath) { + my $achievementsDir = $c->ce->{courseDirs}->{achievements}; + $sourceFilePath =~ s|^${achievementsDir}/*||; # remove templates path and any slashes that follow + return $sourceFilePath; +} + +# saveFileChanges does most of the work. It is a separate method so that it can +# be called from either pre_header_initialize or initilize, depending on +# whether a redirect is needed or not. +sub saveFileChanges ($c, $outputFilePath, $achievementNotification = undef) { + my $ce = $c->ce; + + if (defined($achievementNotification) and ref($achievementNotification)) { + $achievementNotification = ${$achievementNotification}; + } elsif (!not_blank($achievementNotification)) { # if the achievementNotification is undefined or empty + $achievementNotification = $c->stash->{achievementNotification}; + } + + unless (not_blank($outputFilePath)) { + $c->addbadmessage($c->maketext('You must specify an file name in order to save a new file.')); + return ''; + } + my $do_not_save = 0; # flag to prevent saving of file + my $editErrors = ''; + + # write changes to the approriate files + # FIXME make sure that the permissions are set correctly!!! + # Make sure that the warning is being transmitted properly. + + my $writeFileErrors; + if (not_blank($outputFilePath)) { # save file + + # make sure any missing directories are created + WeBWorK::Utils::surePathToFile($ce->{courseDirs}->{achievements}, $outputFilePath); + die 'outputFilePath is unsafe!' + unless path_is_subdir($outputFilePath, $ce->{courseDirs}->{achievements}, 1); + + eval { + open my $OUTPUTFILE, '>', $outputFilePath or die "Failed to open $outputFilePath"; + print $OUTPUTFILE $achievementNotification; + close $OUTPUTFILE; + }; + + $writeFileErrors = $@ if $@; + } + + # Catch errors in saving files, + $c->{saveError} = $do_not_save; # Don't do redirects if the file was not saved. + # Don't unlink files or send success messages + + if ($writeFileErrors) { + # Get the current directory from the outputFilePath + $outputFilePath =~ m|^(/.*?/)[^/]+$|; + my $currentDirectory = $1; + + my $errorMessage; + # Check why we failed to give better error messages + if (not -w $ce->{courseDirs}->{achievements}) { + $errorMessage = $c->maketext( + 'Write permissions have not been enabled in the templates directory. No changes can be made.'); + } elsif (not -w $currentDirectory) { + $errorMessage = $c->maketext( + 'Write permissions have not been enabled in "[_1]". ' + . 'Changes must be saved to a different directory for viewing.', + $c->shortPath($currentDirectory) + ); + } elsif (-e $outputFilePath and not -w $outputFilePath) { + $errorMessage = $c->maketext( + 'Write permissions have not been enabled for "[_1]". ' + . 'Changes must be saved to another file for viewing.', + $c->shortPath($outputFilePath) + ); + } else { + $errorMessage = + $c->maketext('Unable to write to "[_1]": [_2]', $c->shortPath($outputFilePath), $writeFileErrors); + } + + $c->{failure} = 1; + $c->addbadmessage($errorMessage); + } + + if (!$writeFileErrors && !$do_not_save && defined $outputFilePath && !$c->{failure}) { + $c->addgoodmessage($c->maketext('Saved to file "[_1]"', $c->shortPath($outputFilePath))); + } + + return; +} + +sub save_handler ($c) { + my $courseName = $c->{courseID}; + my $achievementName = $c->{achievementID}; + + # Grab the achievementNotification from the form in order to save it to the source path + $c->stash->{achievementNotification} = fix_newlines($c->param('achievementNotification')); + + # Construct the output file path + $c->saveFileChanges($c->{sourceFilePath}); + + return; +} + +sub save_as_handler ($c) { + my $db = $c->db; + $c->{status_message} = $c->c; ## DPVC -- remove bogus old messages + my $courseName = $c->{courseID}; + my $achievementName = $c->{achievementID}; + my $effectiveUserName = $c->param('effectiveUser'); + + my $do_not_save = 0; + my $saveMode = $c->param('action.save_as.saveMode') || 'no_save_mode_selected'; + my $new_file_name = $c->param('action.save_as.target_file') || ''; + my $sourceFilePath = $c->param('action.save_as.source_file') || ''; + my $targetAchievementID = $c->param('action.save_as.id') || ''; + + $c->{sourceFilePath} = $sourceFilePath; # store for use in saveFileChanges + $new_file_name =~ s/^\s*//; #remove initial and final white space + $new_file_name =~ s/\s*$//; + if ($new_file_name !~ /\S/) { # need a non-blank file name + # setting $c->{failure} stops saving and any redirects + $do_not_save = 1; + $c->addbadmessage($c->maketext('Please specify a file to save to.')); + } + + # Grab the achievementNotification from the form in order to save it to a new permanent file + $c->stash->{achievementNotification} = fix_newlines($c->param('achievementNotification')); + warn 'achievement contents is empty' unless $c->stash->{achievementNotification}; + + # Rescue the user in case they forgot to end the file name with .ep + $new_file_name =~ s/\.ep$//; # remove it if it is there + $new_file_name .= '.ep'; # put it there + + # Construct the output file path + my $outputFilePath = $c->ce->{courseDirs}->{achievements} . '/' . $new_file_name; + if (defined $outputFilePath and -e $outputFilePath) { + # setting $do_not_save stops saving and any redirects + $do_not_save = 1; + $c->addbadmessage($c->maketext( + 'File "[_1]" exists. File not saved. No changes have been made.', + $c->shortPath($outputFilePath) + )); + } elsif ($saveMode eq 'use_in_new' && !$targetAchievementID) { + $c->addbadmessage( + $c->maketext('No new Achievement ID specified. No new achievement created. File not saved.')); + $do_not_save = 1; + + } elsif ($saveMode eq 'use_in_new' && $db->existsAchievement($targetAchievementID)) { + $c->addbadmessage($c->maketext('Achievement ID exists! No new achievement created. File not saved.')); + $do_not_save = 1; + } else { + $c->{editFilePath} = $outputFilePath; + $c->{inputFilePath} = ''; + } + + return '' if $do_not_save; + + #Save changes + $c->saveFileChanges($outputFilePath); + + if ($saveMode eq 'use_in_current' and -r $outputFilePath) { + # Modify evaluator path in current achievement + my $achievement = $c->db->getAchievement($achievementName); + $achievement->email_template($new_file_name); + if ($c->db->putAchievement($achievement)) { + $c->addgoodmessage($c->maketext( + 'The evaluator for [_1] has been renamed to "[_2]".', $achievementName, + $c->shortPath($outputFilePath) + )); + } else { + $c->addbadmessage( + $c->maketext('Unable to change the evaluator for set [_1]. Unknown error.', $achievementName)); + } + + } elsif ($saveMode eq 'dont_use') { + # Don't change any achievements - just report + $c->addgoodmessage($c->maketext('A new file has been created at "[_1]"', $c->shortPath($outputFilePath))); + } else { + $c->addbadmessage($c->maketext(q{Don't recognize saveMode: |[_1]|. Unknown error.}, $saveMode)); + } + + # Set up redirect + # The redirect gives the server time to detect that the new file exists. + $c->reply_with_redirect($c->systemLink( + $c->url_for( + 'instructor_achievement_notification', + achievementID => $achievementName + ), + params => { + sourceFilePath => $c->getRelativeSourceFilePath($outputFilePath), + status_message => $c->{status_message}->join('') + } + )); + return; +} + +# use an existing template file +sub existing_handler($c) { + my $db = $c->db; + my $ce = $c->ce; + + # get the desired file name from formdata + my $sourceFile = $c->param('action.existing.source_file') || ''; + + if (-e $ce->{courseDirs}{achievements} . "/$sourceFile") { + # if it exists, update the achievement to use the existing email template + my $achievement = $db->getAchievement($c->{achievementID}); + $achievement->email_template($sourceFile); + if ($db->putAchievement($achievement)) { + $c->addgoodmessage($c->maketext( + 'The notification for [_1] has been changed to "[_2]".', $c->{achievementID}, $sourceFile + )); + } else { + $c->addbadmessage($c->maketext( + 'Unable to change the notification for [_1]. Unknown error.', $c->{achievementID})); + } + } else { + $c->addbadmessage($c->maketext('The file "[_1]" cannot be found.', $sourceFile)); + return; + } + + # is this necessary? the achievement DID update... + $c->reply_with_redirect($c->systemLink( + $c->url_for( + 'instructor_achievement_notification', + achievementID => $achievement->achievement_id + ), + params => { + sourceFilePath => $c->$sourceFile, + status_message => $c->{status_message}->join('') + } + )); + return; +} + +sub disable_handler($c) { + my $db = $c->db; + my $ce = $c->ce; + + my $achievement = $c->db->getAchievement($c->{achievementID}); + $achievement->email_template(''); + + if ($c->db->putAchievement($achievement)) { + $c->addgoodmessage($c->maketext('The evaluator for [_1] has been disabled.', $c->{achievementID})); + # redirect to the instructor_achievement_list + $c->reply_with_redirect($c->systemLink( + $c->url_for('instructor_achievement_list'), + params => { + status_message => $c->{status_message}->join('') + } + )); + } else { + $c->addbadmessage($c->maketext('Unable to disable the evaluator for [_1]. Unknown error.', $c->{achievementID})); + } + + +} + +1; diff --git a/lib/WeBWorK/DB/Record/Achievement.pm b/lib/WeBWorK/DB/Record/Achievement.pm index f1d06bc434..64d6cf17c4 100644 --- a/lib/WeBWorK/DB/Record/Achievement.pm +++ b/lib/WeBWorK/DB/Record/Achievement.pm @@ -38,6 +38,7 @@ BEGIN { max_counter => { type => "INT" }, number => { type => "INT" }, assignment_type => { type => "TEXT" }, + email_template => { type => "TEXT" }, ); } diff --git a/lib/WeBWorK/Utils.pm b/lib/WeBWorK/Utils.pm index 8a799b884b..bef9d49fcc 100644 --- a/lib/WeBWorK/Utils.pm +++ b/lib/WeBWorK/Utils.pm @@ -75,6 +75,7 @@ our @EXPORT_OK = qw( dequote encodeAnswers encode_utf8_base64 + fix_newlines fisher_yates_shuffle formatDateTime intDateTime @@ -898,6 +899,11 @@ sub trim_spaces { return ($in); } +# fix non-unix line endings +sub fix_newlines { + return shift =~ s/\r\n/\n/gr; +} + # This is for formatting set names input via text inputs in the user interface for internal use. Set names are allowed # to be input with spaces, but internally spaces are not allowed and are converted to underscores. sub format_set_name_internal { diff --git a/lib/WeBWorK/Utils/Routes.pm b/lib/WeBWorK/Utils/Routes.pm index ce94a6b039..111f03c933 100644 --- a/lib/WeBWorK/Utils/Routes.pm +++ b/lib/WeBWorK/Utils/Routes.pm @@ -100,6 +100,7 @@ PLEASE FOR THE LOVE OF GOD UPDATE THIS IF YOU CHANGE THE ROUTES BELOW!!! instructor_achievement_list /$courseID/instructor/achievement_list instructor_achievement_editor /$courseID/instructor/achievement_list/$achievementID/editor instructor_achievement_user_editor /$courseID/instructor/achievement_list/$achievementID/users + instructor_achievement_notification /$courseID/instructor/achievement_list/$achievementID/email instructor_lti_update /$courseID/instructor/lti_update @@ -461,7 +462,7 @@ my %routeParameters = ( }, instructor_achievement_list => { title => x('Achievement Editor'), - children => [qw(instructor_achievement_editor instructor_achievement_user_editor)], + children => [qw(instructor_achievement_editor instructor_achievement_user_editor instructor_achievement_notification)], module => 'Instructor::AchievementList', path => '/achievement_list' }, @@ -475,6 +476,11 @@ my %routeParameters = ( module => 'Instructor::AchievementUserEditor', path => '/#achievementID/users' }, + instructor_achievement_notification => { + title => x('Achievement Email Notification Editor'), + module => 'Instructor::AchievementNotificationEditor', + path => '/#achievementID/email' + }, instructor_lti_update => { title => x('LTI Grade Update'), module => 'Instructor::LTIUpdate', diff --git a/templates/ContentGenerator/Instructor/AchievementList/default_table.html.ep b/templates/ContentGenerator/Instructor/AchievementList/default_table.html.ep index 240ff15932..04e91317e5 100644 --- a/templates/ContentGenerator/Instructor/AchievementList/default_table.html.ep +++ b/templates/ContentGenerator/Instructor/AchievementList/default_table.html.ep @@ -16,6 +16,7 @@ <%= maketext('Number') %> <%= maketext('Category') %> <%= maketext('Edit Users') %> + <%= maketext('Edit Email Template') %> <%= maketext('Edit Evaluator') %> @@ -54,6 +55,11 @@ url_for('instructor_achievement_user_editor', achievementID => $achievement_id) ) =%> + + <%= link_to ( $_->email_template ? maketext('Edit Email Template') : maketext('Enable Email Notification') )=> $c->systemLink( + url_for('instructor_achievement_notification', achievementID => $achievement_id), + params => { sourceFilePath => $ce->{courseDirs}{achievements} . '/' . ($_->email_template ? $_->email_template : 'default.ep') } + ) =%> <%= link_to maketext('Edit Evaluator') => $c->systemLink( url_for('instructor_achievement_editor', achievementID => $achievement_id), diff --git a/templates/ContentGenerator/Instructor/AchievementNotificationEditor.ep b/templates/ContentGenerator/Instructor/AchievementNotificationEditor.ep new file mode 100644 index 0000000000..69957411fe --- /dev/null +++ b/templates/ContentGenerator/Instructor/AchievementNotificationEditor.ep @@ -0,0 +1,68 @@ +% use WeBWorK::Utils qw(not_blank getAssetURL); +% use WeBWorK::HTML::CodeMirrorEditor + % qw(generate_codemirror_html generate_codemirror_controls_html output_codemirror_static_files); +% +% content_for js => begin + <%= output_codemirror_static_files($c, 'perl') =%> + <%= javascript getAssetURL($ce, 'js/ActionTabs/actiontabs.js'), defer => undef =%> +% end +% +% unless ($authz->hasPermissions(param('user'), 'edit_achievements')) { +
    <%= maketext('You are not authorized to edit achievements.') %>
    + % last; +% } +% +
    + <%= maketext('Editing achievement notification in file "[_1]"', $c->shortPath($c->{sourceFilePath})) =%> +
    +<%= form_for current_route, method => 'POST', id => 'editor', name => 'editor', + enctype => 'application/x-www-form-urlencoded', + begin =%> + <%= $c->hidden_authen_fields =%> + % if (not_blank($c->{sourceFilePath})) { + <%= hidden_field sourceFilePath => $c->{sourceFilePath} =%> + % } + % +
    <%= generate_codemirror_html($c, 'achievementNotification', $achievementNotification, 'perl') =%>
    + <%= generate_codemirror_controls_html($c) =%> + % + % # Output action forms + % my $default_choice; + % + % for my $actionID (@$formsToShow) { + % my $line_contents = include("ContentGenerator/Instructor/AchievementEditor/${actionID}_form"); + % my $active = ''; + % + % if ($line_contents ne '') { + % unless ($default_choice) { $active = ' active'; $default_choice = $actionID; } + % + % content_for 'tab-list' => begin + + % end + % content_for 'tab-content' => begin +
    " id="<%= $actionID %>" + role="tabpanel" aria-labelledby="<%= $actionID %>-tab"> + <%= $line_contents =%> +
    + % end + % } + % } + % + <%= hidden_field action => $default_choice, id => 'current_action' =%> +
    + +
    <%= content 'tab-content' %>
    +
    +
    + <%= submit_button maketext($actionFormTitles->{$default_choice}), + name => 'submit', id => 'take_action', class => 'btn btn-primary' %> +
    +<% end =%> diff --git a/templates/ContentGenerator/Instructor/AchievementNotificationEditor/disable_form.html.ep b/templates/ContentGenerator/Instructor/AchievementNotificationEditor/disable_form.html.ep new file mode 100644 index 0000000000..15af3f5f15 --- /dev/null +++ b/templates/ContentGenerator/Instructor/AchievementNotificationEditor/disable_form.html.ep @@ -0,0 +1,2 @@ +% last unless ($c->{achievement}->email_template); +<%== maketext('Disable email notifications for [_1]', tag('b', $c->{achievementID})) %> diff --git a/templates/ContentGenerator/Instructor/AchievementNotificationEditor/existing_form.html.ep b/templates/ContentGenerator/Instructor/AchievementNotificationEditor/existing_form.html.ep new file mode 100644 index 0000000000..8f6b4020d3 --- /dev/null +++ b/templates/ContentGenerator/Instructor/AchievementNotificationEditor/existing_form.html.ep @@ -0,0 +1,7 @@ +
    + <%= label_for 'action.existing.target_file_id' => maketext('Use existing template:'), class => 'col-form-label col-auto' =%> +
    + <%= text_field 'action.existing.target_file' => $c->getRelativeSourceFilePath($c->{sourceFilePath}), + id => 'action.existing.target_file_id', size => 40, class => 'form-control form-control-sm' =%> +
    +
    diff --git a/templates/ContentGenerator/Instructor/AchievementNotificationEditor/save_as_form.html.ep b/templates/ContentGenerator/Instructor/AchievementNotificationEditor/save_as_form.html.ep new file mode 100644 index 0000000000..ae821d64eb --- /dev/null +++ b/templates/ContentGenerator/Instructor/AchievementNotificationEditor/save_as_form.html.ep @@ -0,0 +1,36 @@ +% # There are three things you can do with a new achievement editor. +% # You can replace the current achievement, use it in a new achievement, or not use it at all. +
    +
    + <%= label_for 'action.save_as.target_file_id' => maketext('Save as:'), class => 'col-form-label col-auto' =%> +
    + <%= text_field 'action.save_as.target_file' => $c->getRelativeSourceFilePath($c->{sourceFilePath}), + id => 'action.save_as.target_file_id', size => 40, class => 'form-control form-control-sm' =%> +
    + <%= hidden_field 'action.save_as.source_file' => $c->{sourceFilePath} =%> +
    +
    + <%= radio_button 'action.save_as.saveMode' => 'use_in_current', + id => 'action.save_as.saveMode.use_in_current', class => 'form-check-input' =%> + <%= label_for 'action.save_as.saveMode.use_in_current', class => 'form-check-label', begin =%> + <%== maketext('Use in achievement [_1]', tag('b', $c->{achievementID})) =%> + <% end =%> +
    +
    +
    + <%= radio_button 'action.save_as.saveMode' => 'use_in_new', + id => 'action.save_as.saveMode.use_in_new', class => 'form-check-input' =%> + <%= label_for 'action.save_as.saveMode.use_in_new' => maketext('Use in new achievement:'), + class => 'form-check-label me-1', id => 'action.save_as.saveMode.use_in_new.label' =%> +
    + <%= text_field 'action.save_as.id' => '', + 'aria-labelledby' => 'action.save_as.saveMode.use_in_new.label', + class => 'form-control form-control-sm d-inline w-auto' =%> +
    +
    + <%= radio_button 'action.save_as.saveMode' => 'dont_use', + id => 'action.save_as.saveMode.dont_use', class => 'form-check-input' =%> + <%= label_for 'action.save_as.saveMode.dont_use' => maketext(q{Don't use in an achievement}), + class => 'form-check-label' =%> +
    +
    diff --git a/templates/ContentGenerator/Instructor/AchievementNotificationEditor/save_form.html.ep b/templates/ContentGenerator/Instructor/AchievementNotificationEditor/save_form.html.ep new file mode 100644 index 0000000000..9305e09ed2 --- /dev/null +++ b/templates/ContentGenerator/Instructor/AchievementNotificationEditor/save_form.html.ep @@ -0,0 +1,3 @@ +% if (-w $c->{sourceFilePath}) { + <%== maketext('Save [_1]', tag('b', $c->shortPath($c->{sourceFilePath}))) %> +% } From 17aea345cfce3b6f6371a6c387f1bb1c409873ae Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Fri, 8 Sep 2023 17:37:23 -0500 Subject: [PATCH 150/549] Remove the `usePolling` chokidar option in generate-assets.js. With node version 20 the `usePolling` option is resulting in high cpu usage. The `followSymlinks` serves the purpose more correctly. The `usePolling` option was initially used because either the `followSymlinks` option did not exist or there was a bug in chokidar and that option wasn't working. I can't remember the exact details. Note that `followSymlinks` is true by default, and so it is not explicitly set. Also remove the `interval` option since that is only used when `usePolling` is true. The actual high cpu usage occurs with the PG generate-assets.js script, and not this one with the `usePolling` option. I don't really know why though. In any case the `followSymlinks` option is more correct for what we want here. --- htdocs/generate-assets.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/htdocs/generate-assets.js b/htdocs/generate-assets.js index d297e8b214..5f275e266f 100755 --- a/htdocs/generate-assets.js +++ b/htdocs/generate-assets.js @@ -212,8 +212,6 @@ if (argv.watchFiles) console.log('\x1b[32mEstablishing watches and performing in chokidar.watch(['js', 'themes'], { ignored: /layouts|\.min\.(js|css)$/, cwd: __dirname, // Make sure all paths are given relative to the htdocs directory. - usePolling: true, // Needed to get changes to symlinks. - interval: 500, awaitWriteFinish: { stabilityThreshold: 500 }, persistent: argv.watchFiles ? true : false }) From cd39add671d771ce1f64f72374441d3dfb53e210 Mon Sep 17 00:00:00 2001 From: Jaimos Skriletz Date: Tue, 12 Sep 2023 10:35:02 -0600 Subject: [PATCH 151/549] Fix incorrect row label in stats page. --- templates/ContentGenerator/Instructor/Stats/set_stats.html.ep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep b/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep index 3c55a1fb40..51b49ef68d 100644 --- a/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep +++ b/templates/ContentGenerator/Instructor/Stats/set_stats.html.ep @@ -166,7 +166,7 @@ <% for (@$problems) { %><%= $_->value %><% } =%> - <%= maketext('Point Value') %> + <%= maketext('Average Percent') %> <% for (@$avgScore) { %><%= $_ %><% } =%> % if ($isJitarSet) { From 7b50a4963de88a187db436cfdc479b6557fa591d Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Thu, 14 Sep 2023 13:43:28 -0500 Subject: [PATCH 152/549] Add the .zip extension when a single file or directory without extension is selected. --- .../ContentGenerator/Instructor/FileManager/archive.html.ep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/ContentGenerator/Instructor/FileManager/archive.html.ep b/templates/ContentGenerator/Instructor/FileManager/archive.html.ep index 86773297c1..324bd542f4 100644 --- a/templates/ContentGenerator/Instructor/FileManager/archive.html.ep +++ b/templates/ContentGenerator/Instructor/FileManager/archive.html.ep @@ -11,7 +11,7 @@
    <%= text_field archive_filename => - @$files == 1 ? $files->[0] =~ s/\..*$/.zip/r : 'webwork_files.zip', + @$files == 1 ? $files->[0] =~ s/(\..*)?$/.zip/r : 'webwork_files.zip', id => 'archive-filename', placeholder => maketext('Archive Filename'), class => 'form-control', size => 30, dir => 'ltr' =%>
    From bdd460b792125a1394400e173812ff68338e37de Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Fri, 15 Sep 2023 18:12:55 -0500 Subject: [PATCH 153/549] Watch the PG.pl macro file when running morbo. Since this file is cached in the safe zone when the application starts, changes to this file require the webwork2 application to be restarted in order for them to take effect. I have noticed this recently when making changes to that file. This of course only affects running the webwork2 app in development with morbo. With hypnotoad you would need to restart the app manually since hypnotoad doesn't hot reload. Of course you normally don't edit PG.pl in production, so that is how it should be. --- bin/dev_scripts/webwork2-morbo | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/bin/dev_scripts/webwork2-morbo b/bin/dev_scripts/webwork2-morbo index f951d94c35..37dfe8121e 100755 --- a/bin/dev_scripts/webwork2-morbo +++ b/bin/dev_scripts/webwork2-morbo @@ -87,9 +87,10 @@ push(@watch, "$webwork_root/lib", "$webwork_root/templates", "$webwork_root/htdocs/js", "$webwork_root/htdocs/themes", "$webwork_root/conf"); -# Add the pg lib and pg htdocs directory if they are readable. -push(@watch, "$config->{pg_dir}/lib") if -r "$config->{pg_dir}/lib"; -push(@watch, "$config->{pg_dir}/htdocs") if -r "$config->{pg_dir}/htdocs"; +# Add the pg lib and pg htdocs directory and the PG.pl macro if they are readable. +push(@watch, "$config->{pg_dir}/lib") if -r "$config->{pg_dir}/lib"; +push(@watch, "$config->{pg_dir}/htdocs") if -r "$config->{pg_dir}/htdocs"; +push(@watch, "$config->{pg_dir}/macros/PG.pl") if -r "$config->{pg_dir}/macros/PG.pl"; my $morbo = Mojo::Server::Morbo->new(silent => !$verbose); $morbo->daemon->listen(\@listen) if @listen; From 9c29d9c4855b1c81d30a6b1f49c48f4e1a7d22c3 Mon Sep 17 00:00:00 2001 From: drdrew42 Date: Mon, 11 Sep 2023 17:35:34 +0000 Subject: [PATCH 154/549] fixing silly mistakes update copypasta fix template -> .html.ep fix url_for achievement notification editor --- .../Instructor/AchievementList.pm | 2 +- .../Instructor/AchievementNotificationEditor.pm | 15 +++++++-------- .../AchievementList/default_table.html.ep | 4 ++-- ...r.ep => AchievementNotificationEditor.html.ep} | 4 ++-- 4 files changed, 12 insertions(+), 13 deletions(-) rename templates/ContentGenerator/Instructor/{AchievementNotificationEditor.ep => AchievementNotificationEditor.html.ep} (94%) diff --git a/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm b/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm index bacd03f03d..12b04c15a7 100644 --- a/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm +++ b/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm @@ -431,7 +431,7 @@ sub import_handler ($c) { $achievement->achievement_id($achievement_id); # Fall back for importing an old list without the number or assignment_type fields - if (scalar(@$data) >= 9) { + if (scalar(@$data) == 7) { # Old lists tend to have an extraneous space at the front. for (my $i = 1; $i <= 7; $i++) { $$data[$i] =~ s/^\s+//; diff --git a/lib/WeBWorK/ContentGenerator/Instructor/AchievementNotificationEditor.pm b/lib/WeBWorK/ContentGenerator/Instructor/AchievementNotificationEditor.pm index ee175e4ef3..be00d7e2f2 100644 --- a/lib/WeBWorK/ContentGenerator/Instructor/AchievementNotificationEditor.pm +++ b/lib/WeBWorK/ContentGenerator/Instructor/AchievementNotificationEditor.pm @@ -61,7 +61,7 @@ sub pre_header_initialize ($c) { } $c->{achievement} = $achievement; - my $template_filename = $achievement->email_template || "default.ep"; + my $template_filename = $achievement->email_template || "default.html.ep"; $c->{sourceFilePath} = $ce->{courseDirs}{achievements} . "/$template_filename"; my $actionID = $c->param('action'); @@ -102,7 +102,7 @@ sub initialize ($c) { } eval { $c->stash->{achievementNotification} = WeBWorK::Utils::readFile($sourceFilePath) }; - $c->stash->{achievementNotification} = $@ if $@; + $c->stash->{achievementNotification} = $@ if $@; } return; @@ -319,7 +319,7 @@ sub existing_handler($c) { my $ce = $c->ce; # get the desired file name from formdata - my $sourceFile = $c->param('action.existing.source_file') || ''; + my $sourceFile = $c->param('action.existing.target_file') || ''; if (-e $ce->{courseDirs}{achievements} . "/$sourceFile") { # if it exists, update the achievement to use the existing email template @@ -342,12 +342,11 @@ sub existing_handler($c) { $c->reply_with_redirect($c->systemLink( $c->url_for( 'instructor_achievement_notification', - achievementID => $achievement->achievement_id + achievementID => $c->{achievementID} ), - params => { - sourceFilePath => $c->$sourceFile, - status_message => $c->{status_message}->join('') - } + params => { + status_message => $c->{status_message}->join(''), + } )); return; } diff --git a/templates/ContentGenerator/Instructor/AchievementList/default_table.html.ep b/templates/ContentGenerator/Instructor/AchievementList/default_table.html.ep index 04e91317e5..99d5176735 100644 --- a/templates/ContentGenerator/Instructor/AchievementList/default_table.html.ep +++ b/templates/ContentGenerator/Instructor/AchievementList/default_table.html.ep @@ -56,9 +56,9 @@ ) =%> - <%= link_to ( $_->email_template ? maketext('Edit Email Template') : maketext('Enable Email Notification') )=> $c->systemLink( + % my $templateText = $_->email_template ? maketext('Edit Email Template') : maketext('Enable Email Notification'); + <%= link_to $templateText => $c->systemLink( url_for('instructor_achievement_notification', achievementID => $achievement_id), - params => { sourceFilePath => $ce->{courseDirs}{achievements} . '/' . ($_->email_template ? $_->email_template : 'default.ep') } ) =%> <%= link_to maketext('Edit Evaluator') => $c->systemLink( diff --git a/templates/ContentGenerator/Instructor/AchievementNotificationEditor.ep b/templates/ContentGenerator/Instructor/AchievementNotificationEditor.html.ep similarity index 94% rename from templates/ContentGenerator/Instructor/AchievementNotificationEditor.ep rename to templates/ContentGenerator/Instructor/AchievementNotificationEditor.html.ep index 69957411fe..8e2db0ad06 100644 --- a/templates/ContentGenerator/Instructor/AchievementNotificationEditor.ep +++ b/templates/ContentGenerator/Instructor/AchievementNotificationEditor.html.ep @@ -13,7 +13,7 @@ % } %
    - <%= maketext('Editing achievement notification in file "[_1]"', $c->shortPath($c->{sourceFilePath})) =%> + <%= maketext('Editing achievement in file "[_1]"', $c->shortPath($c->{sourceFilePath})) =%>
    <%= form_for current_route, method => 'POST', id => 'editor', name => 'editor', enctype => 'application/x-www-form-urlencoded', @@ -30,7 +30,7 @@ % my $default_choice; % % for my $actionID (@$formsToShow) { - % my $line_contents = include("ContentGenerator/Instructor/AchievementEditor/${actionID}_form"); + % my $line_contents = include("ContentGenerator/Instructor/AchievementNotificationEditor/${actionID}_form"); % my $active = ''; % % if ($line_contents ne '') { From ea05e95b611775f3d2c2b57a08592f3fa09f5c71 Mon Sep 17 00:00:00 2001 From: "K. Andrew Parker" Date: Mon, 18 Sep 2023 15:21:08 -0400 Subject: [PATCH 155/549] fix templates & perltidy pass vars to template template variable updates sender fix linting --- lib/Mojolicious/WeBWorK.pm | 5 +- .../WeBWorK/Tasks/AchievementNotification.pm | 61 +++++++++------ lib/WeBWorK/AchievementEvaluator.pm | 24 +++--- .../AchievementNotificationEditor.pm | 75 ++++++++++++------- lib/WeBWorK/Utils/Routes.pm | 7 +- 5 files changed, 102 insertions(+), 70 deletions(-) diff --git a/lib/Mojolicious/WeBWorK.pm b/lib/Mojolicious/WeBWorK.pm index 5d54412868..5eff7a429d 100644 --- a/lib/Mojolicious/WeBWorK.pm +++ b/lib/Mojolicious/WeBWorK.pm @@ -86,8 +86,9 @@ sub startup ($app) { # Setup the Minion job queue. $app->plugin(Minion => { $ce->{job_queue}{backend} => $ce->{job_queue}{database_dsn} }); - $app->minion->add_task(lti_mass_update => 'Mojolicious::WeBWorK::Tasks::LTIMassUpdate'); - $app->minion->add_task(send_instructor_email => 'Mojolicious::WeBWorK::Tasks::SendInstructorEmail'); + $app->minion->add_task(lti_mass_update => 'Mojolicious::WeBWorK::Tasks::LTIMassUpdate'); + $app->minion->add_task(send_instructor_email => 'Mojolicious::WeBWorK::Tasks::SendInstructorEmail'); + $app->minion->add_task(send_achievement_email => 'Mojolicious::WeBWorK::Tasks::AchievementNotification'); # Provide the ability to serve data as a file download. $app->plugin('RenderFile'); diff --git a/lib/Mojolicious/WeBWorK/Tasks/AchievementNotification.pm b/lib/Mojolicious/WeBWorK/Tasks/AchievementNotification.pm index 93072fda17..f389ad2009 100644 --- a/lib/Mojolicious/WeBWorK/Tasks/AchievementNotification.pm +++ b/lib/Mojolicious/WeBWorK/Tasks/AchievementNotification.pm @@ -27,44 +27,57 @@ use WeBWorK::Utils qw/processEmailMessage createEmailSenderTransportSMTP/; # send student notification that they have earned an achievement sub run ($job, $mail_data) { - my $ce = eval { WeBWorK::CourseEnvironment->new({ courseName => $mail_data->{courseName} }) }; - return $job->fail("Could not construct course environment for $mail_data->{courseName}.") unless $ce; + my $ce = eval { WeBWorK::CourseEnvironment->new({ courseName => $mail_data->{courseName} }); }; + return $job->fail("Could not construct course environment for $mail_data->{courseName}.") + unless $ce; my $db = WeBWorK::DB->new($ce->{dbLayout}); - return $job->fail("Could not obtain database connection for $mail_data->{courseName}.") unless $db; + return $job->fail("Could not obtain database connection for $mail_data->{courseName}.") + unless $db; - return $job->fail("Cannot notify student without an achievement.") unless $mail_data->{achievementID}; - $mail_data->{achievement} = $db->getAchievement($mail_data->{achievementID}); - return $job->fail("Could not find achievement $mail_data->{achievementID}.") unless $mail_data->{achievement}; + return $job->fail("Cannot notify student without an achievement.") + unless $mail_data->{achievementID}; + $mail_data->{achievement} = + $db->getAchievement($mail_data->{achievementID}); + return $job->fail("Could not find achievement $mail_data->{achievementID}.") + unless $mail_data->{achievement}; - $job->{language_handle} = WeBWorK::Localize::getLoc($ce->{language} || 'en'); + $job->{language_handle} = + WeBWorK::Localize::getLoc($ce->{language} || 'en'); my $result_message = eval { $job->send_achievement_notification($ce, $db, $mail_data) }; if ($@) { - $job->app->log->error("An error occurred while trying to send email: $@\n"); - return $job->fail(); # fail silently + $job->app->log->error("An error occurred while trying to send email: $@"); + return $job->fail(); # fail silently } - - return $job->finish(); # succeed silently + $job->app->log->info("Message sent to $mail_data->{recipient}"); + return $job->finish(); # succeed silently } sub send_achievement_notification ($job, $ce, $db, $mail_data) { - # default From: is default smtpSender from site.conf - unless ($mail_data->{from} || $ce->{mail}{set_return_path}) { - die "Cannot send system email without one of: mail{set_return_path} or mail{smtpSender}\n"; + if ($ce->{mail}{smtpSender} || $ce->{mail}{set_return_path}) { + $mail_data->{from} = + $ce->{mail}{smtpSender} || $ce->{mail}{set_return_path}; + } else { + die "Cannot send system email without one of: mail{set_return_path} or mail{smtpSender}"; } my $recipient = $mail_data->{recipient}; - my $template = $ce->{courseDirs}{achievements} . '/' . $mail_data->{template}; - my $renderer = Mojo::Template->new; + my $template = $ce->{courseDirs}{achievements} . '/' . $mail_data->{achievement}{email_template}; + my $renderer = Mojo::Template->new(vars => 1); + # what other data might need to be passed to the template? - $mail_data->{body} = $renderer->render_file($template, { - ce => $ce, # holds achievement URLs - maketext => sub { maketext($job, @_) }, # for maketext() in templates - achievement => $mail_data->{achievement}, # full db record - setID => $mail_data->{set_id}, - nextLevelPoints => $mail_data->{nextLevelPoints}, - }); + $mail_data->{body} = $renderer->render_file( + $template, + { + ce => $ce, # holds achievement URLs + maketext => sub { maketext($job, @_) }, + achievement => $mail_data->{achievement}, # full db record + setID => $mail_data->{set_id}, + nextLevelPoints => $mail_data->{nextLevelPoints}, + pointsEarned => $mail_data->{pointsEarned}, + } + ); my $user_record = $db->getUser($recipient); unless ($user_record) { @@ -91,7 +104,7 @@ sub send_achievement_notification ($job, $ce, $db, $mail_data) { }); debug 'email sent successfully to ' . $user_record->email_address; - return $job->maketext('Message sent to [_1] at [_2].', $recipient, $user_record->email_address) . "\n" + return $job->maketext('Message sent to [_1] at [_2].', $recipient, $user_record->email_address) . "\n"; } sub maketext ($job, @args) { diff --git a/lib/WeBWorK/AchievementEvaluator.pm b/lib/WeBWorK/AchievementEvaluator.pm index d5df138a44..2b6d484183 100644 --- a/lib/WeBWorK/AchievementEvaluator.pm +++ b/lib/WeBWorK/AchievementEvaluator.pm @@ -244,26 +244,26 @@ sub checkForAchievements ($problem_in, $pg, $c, %options) { # Construct the cheevo message using the cheevoMessage template. push(@$cheevoMessage, $c->include('AchievementEvaluator/cheevoMessage', achievement => $achievement)); + my $points = $achievement->points; + #just in case points is an uninitialized variable + $points = 0 unless $points; + + $globalUserAchievement->achievement_points($globalUserAchievement->achievement_points + $points); + #this variable is shared and should be considered iffy + $achievementPoints += $points; + # if email_template is defined, send an email to the user $c->minion->enqueue( - sendAchievementEmail => [ { - from => $ce->{mail}{defaultFrom}, + send_achievement_email => [ { recipient => $user_id, - subject => 'Congratulations on earning a new achievement!', - template => $achievement->email_template, + subject => 'Congratulations on earning a new achievement!', + courseName => $ce->{courseName}, achievementID => $achievement_id, setID => $set_id, nextLevelPoints => $nextLevelPoints, + pointsEarned => $achievementPoints, } ] ) if ($achievement->email_template); - - my $points = $achievement->points; - #just in case points is an ininitialzied variable - $points = 0 unless $points; - - $globalUserAchievement->achievement_points($globalUserAchievement->achievement_points + $points); - #this variable is shared and should be considered iffy - $achievementPoints += $points; } #update counter, nfreeze_base64 localData and store diff --git a/lib/WeBWorK/ContentGenerator/Instructor/AchievementNotificationEditor.pm b/lib/WeBWorK/ContentGenerator/Instructor/AchievementNotificationEditor.pm index be00d7e2f2..c38c6284e7 100644 --- a/lib/WeBWorK/ContentGenerator/Instructor/AchievementNotificationEditor.pm +++ b/lib/WeBWorK/ContentGenerator/Instructor/AchievementNotificationEditor.pm @@ -45,8 +45,8 @@ sub pre_header_initialize ($c) { $c->{achievementID} = $c->stash('achievementID'); # Make sure that are defined for the templates. - $c->stash->{formsToShow} = ACTION_FORMS(); - $c->stash->{actionFormTitles} = ACTION_FORM_TITLES(); + $c->stash->{formsToShow} = ACTION_FORMS(); + $c->stash->{actionFormTitles} = ACTION_FORM_TITLES(); $c->stash->{achievementNotification} = ''; # Check permissions @@ -60,9 +60,10 @@ sub pre_header_initialize ($c) { return; } - $c->{achievement} = $achievement; + $c->{achievement} = $achievement; my $template_filename = $achievement->email_template || "default.html.ep"; - $c->{sourceFilePath} = $ce->{courseDirs}{achievements} . "/$template_filename"; + $c->{sourceFilePath} = + $ce->{courseDirs}{achievements} . "/$template_filename"; my $actionID = $c->param('action'); @@ -101,8 +102,8 @@ sub initialize ($c) { return; } - eval { $c->stash->{achievementNotification} = WeBWorK::Utils::readFile($sourceFilePath) }; - $c->stash->{achievementNotification} = $@ if $@; + eval { $c->stash->{achievementNotification} = WeBWorK::Utils::readFile($sourceFilePath); }; + $c->stash->{achievementNotification} = $@ if $@; } return; @@ -141,7 +142,7 @@ sub saveFileChanges ($c, $outputFilePath, $achievementNotification = undef) { $c->addbadmessage($c->maketext('You must specify an file name in order to save a new file.')); return ''; } - my $do_not_save = 0; # flag to prevent saving of file + my $do_not_save = 0; # flag to prevent saving of file my $editErrors = ''; # write changes to the approriate files @@ -157,7 +158,8 @@ sub saveFileChanges ($c, $outputFilePath, $achievementNotification = undef) { unless path_is_subdir($outputFilePath, $ce->{courseDirs}->{achievements}, 1); eval { - open my $OUTPUTFILE, '>', $outputFilePath or die "Failed to open $outputFilePath"; + open my $OUTPUTFILE, '>', $outputFilePath + or die "Failed to open $outputFilePath"; print $OUTPUTFILE $achievementNotification; close $OUTPUTFILE; }; @@ -170,11 +172,13 @@ sub saveFileChanges ($c, $outputFilePath, $achievementNotification = undef) { # Don't unlink files or send success messages if ($writeFileErrors) { + # Get the current directory from the outputFilePath $outputFilePath =~ m|^(/.*?/)[^/]+$|; my $currentDirectory = $1; my $errorMessage; + # Check why we failed to give better error messages if (not -w $ce->{courseDirs}->{achievements}) { $errorMessage = $c->maketext( @@ -200,7 +204,11 @@ sub saveFileChanges ($c, $outputFilePath, $achievementNotification = undef) { $c->addbadmessage($errorMessage); } - if (!$writeFileErrors && !$do_not_save && defined $outputFilePath && !$c->{failure}) { + if (!$writeFileErrors + && !$do_not_save + && defined $outputFilePath + && !$c->{failure}) + { $c->addgoodmessage($c->maketext('Saved to file "[_1]"', $c->shortPath($outputFilePath))); } @@ -212,7 +220,8 @@ sub save_handler ($c) { my $achievementName = $c->{achievementID}; # Grab the achievementNotification from the form in order to save it to the source path - $c->stash->{achievementNotification} = fix_newlines($c->param('achievementNotification')); + $c->stash->{achievementNotification} = + fix_newlines($c->param('achievementNotification')); # Construct the output file path $c->saveFileChanges($c->{sourceFilePath}); @@ -243,8 +252,10 @@ sub save_as_handler ($c) { } # Grab the achievementNotification from the form in order to save it to a new permanent file - $c->stash->{achievementNotification} = fix_newlines($c->param('achievementNotification')); - warn 'achievement contents is empty' unless $c->stash->{achievementNotification}; + $c->stash->{achievementNotification} = + fix_newlines($c->param('achievementNotification')); + warn 'achievement contents is empty' + unless $c->stash->{achievementNotification}; # Rescue the user in case they forgot to end the file name with .ep $new_file_name =~ s/\.ep$//; # remove it if it is there @@ -253,6 +264,7 @@ sub save_as_handler ($c) { # Construct the output file path my $outputFilePath = $c->ce->{courseDirs}->{achievements} . '/' . $new_file_name; if (defined $outputFilePath and -e $outputFilePath) { + # setting $do_not_save stops saving and any redirects $do_not_save = 1; $c->addbadmessage($c->maketext( @@ -264,7 +276,9 @@ sub save_as_handler ($c) { $c->maketext('No new Achievement ID specified. No new achievement created. File not saved.')); $do_not_save = 1; - } elsif ($saveMode eq 'use_in_new' && $db->existsAchievement($targetAchievementID)) { + } elsif ($saveMode eq 'use_in_new' + && $db->existsAchievement($targetAchievementID)) + { $c->addbadmessage($c->maketext('Achievement ID exists! No new achievement created. File not saved.')); $do_not_save = 1; } else { @@ -278,6 +292,7 @@ sub save_as_handler ($c) { $c->saveFileChanges($outputFilePath); if ($saveMode eq 'use_in_current' and -r $outputFilePath) { + # Modify evaluator path in current achievement my $achievement = $c->db->getAchievement($achievementName); $achievement->email_template($new_file_name); @@ -287,11 +302,12 @@ sub save_as_handler ($c) { $c->shortPath($outputFilePath) )); } else { - $c->addbadmessage( - $c->maketext('Unable to change the evaluator for set [_1]. Unknown error.', $achievementName)); + $c->addbadmessage($c->maketext( + 'Unable to change the evaluator for set [_1]. Unknown error.', $achievementName)); } } elsif ($saveMode eq 'dont_use') { + # Don't change any achievements - just report $c->addgoodmessage($c->maketext('A new file has been created at "[_1]"', $c->shortPath($outputFilePath))); } else { @@ -302,8 +318,7 @@ sub save_as_handler ($c) { # The redirect gives the server time to detect that the new file exists. $c->reply_with_redirect($c->systemLink( $c->url_for( - 'instructor_achievement_notification', - achievementID => $achievementName + 'instructor_achievement_notification', achievementID => $achievementName ), params => { sourceFilePath => $c->getRelativeSourceFilePath($outputFilePath), @@ -314,20 +329,22 @@ sub save_as_handler ($c) { } # use an existing template file -sub existing_handler($c) { +sub existing_handler ($c) { my $db = $c->db; my $ce = $c->ce; - + # get the desired file name from formdata my $sourceFile = $c->param('action.existing.target_file') || ''; if (-e $ce->{courseDirs}{achievements} . "/$sourceFile") { + # if it exists, update the achievement to use the existing email template my $achievement = $db->getAchievement($c->{achievementID}); $achievement->email_template($sourceFile); if ($db->putAchievement($achievement)) { $c->addgoodmessage($c->maketext( - 'The notification for [_1] has been changed to "[_2]".', $c->{achievementID}, $sourceFile + 'The notification for [_1] has been changed to "[_2]".', + $c->{achievementID}, $sourceFile )); } else { $c->addbadmessage($c->maketext( @@ -341,17 +358,16 @@ sub existing_handler($c) { # is this necessary? the achievement DID update... $c->reply_with_redirect($c->systemLink( $c->url_for( - 'instructor_achievement_notification', - achievementID => $c->{achievementID} + 'instructor_achievement_notification', achievementID => $c->{achievementID} ), - params => { - status_message => $c->{status_message}->join(''), - } + params => { + status_message => $c->{status_message}->join(''), + } )); return; } -sub disable_handler($c) { +sub disable_handler ($c) { my $db = $c->db; my $ce = $c->ce; @@ -360,7 +376,8 @@ sub disable_handler($c) { if ($c->db->putAchievement($achievement)) { $c->addgoodmessage($c->maketext('The evaluator for [_1] has been disabled.', $c->{achievementID})); - # redirect to the instructor_achievement_list + + # redirect to the instructor_achievement_list $c->reply_with_redirect($c->systemLink( $c->url_for('instructor_achievement_list'), params => { @@ -368,10 +385,10 @@ sub disable_handler($c) { } )); } else { - $c->addbadmessage($c->maketext('Unable to disable the evaluator for [_1]. Unknown error.', $c->{achievementID})); + $c->addbadmessage($c->maketext( + 'Unable to disable the evaluator for [_1]. Unknown error.', $c->{achievementID})); } - } 1; diff --git a/lib/WeBWorK/Utils/Routes.pm b/lib/WeBWorK/Utils/Routes.pm index 111f03c933..ee45291853 100644 --- a/lib/WeBWorK/Utils/Routes.pm +++ b/lib/WeBWorK/Utils/Routes.pm @@ -462,9 +462,10 @@ my %routeParameters = ( }, instructor_achievement_list => { title => x('Achievement Editor'), - children => [qw(instructor_achievement_editor instructor_achievement_user_editor instructor_achievement_notification)], - module => 'Instructor::AchievementList', - path => '/achievement_list' + children => + [qw(instructor_achievement_editor instructor_achievement_user_editor instructor_achievement_notification)], + module => 'Instructor::AchievementList', + path => '/achievement_list' }, instructor_achievement_editor => { title => '[_5]', From 6974fa3f09bf772fd60cd747c7b56c22a9514d6b Mon Sep 17 00:00:00 2001 From: "K. Andrew Parker" Date: Mon, 18 Sep 2023 15:25:58 -0400 Subject: [PATCH 156/549] update default email template --- .../templates/achievements/default.html.ep | 31 ++++++------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/courses.dist/modelCourse/templates/achievements/default.html.ep b/courses.dist/modelCourse/templates/achievements/default.html.ep index 2940e3b83c..2975a5887c 100644 --- a/courses.dist/modelCourse/templates/achievements/default.html.ep +++ b/courses.dist/modelCourse/templates/achievements/default.html.ep @@ -1,21 +1,10 @@ -
    - <%= image $ce->{server_root_url} . ( - $achievement->{icon} - ? "$ce->{courseURLs}{achievements}/$achievement->{icon}" - : "$ce->{webworkURLs}{htdocs}/images/defaulticon.png" - ), - alt => 'Achievement Icon' =%> -
    - % if ($achievement->category eq 'level') { -

    <%= $achievement->{name} %>

    -
    - <%= $ce->{achievementItemsEnabled} - ? $achievement->{description} - : maketext('Congratulations, you earned a new level!') =%> -
    - % } else { -

    <%= $achievement->{name} %>

    -
    <%= $achievement->{points} %> Points: <%= $achievement->{description} %>
    - % } -
    -
    \ No newline at end of file +$FN + +Congratulations, you just earned the "<%= $achievement->{name} %>" achievement! + +<%= $achievement->{description} %> + +You have <%= $nextLevelPoints - $pointsEarned %> points remaining until your next level-up. + +Great job! +--Prof. X \ No newline at end of file From 2e3b07c5fba0db5941b6980ef1173a2368a71b46 Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Fri, 29 Sep 2023 09:41:50 -0500 Subject: [PATCH 157/549] Refresh the code mirror window when its containing div resizes. This fixes issue #2218. --- htdocs/js/PGCodeMirror/pgeditor.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/htdocs/js/PGCodeMirror/pgeditor.js b/htdocs/js/PGCodeMirror/pgeditor.js index f57a8eeb0c..d00c18d6d5 100644 --- a/htdocs/js/PGCodeMirror/pgeditor.js +++ b/htdocs/js/PGCodeMirror/pgeditor.js @@ -105,6 +105,10 @@ = CodeMirror.fromTextArea(document.querySelector('.codeMirrorEditor'), options); cm.setSize('100%', '550px'); + // Refresh the CodeMirror instance anytime the containing div resizes so that if line wrapping changes, + // the mouse cursor will still go to the correct place when the user clicks on the CodeMirror window. + new ResizeObserver(() => cm.refresh()).observe(document.querySelector('.CodeMirror')); + const currentThemeFile = localStorage.getItem('WW_PGEditor_selected_theme') ?? 'default'; const currentThemeName = await loadConfig(currentThemeFile); cm.setOption('theme', currentThemeName); From acc9c4a0ef8e90fdcf724f9df8bb0711644c644c Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Fri, 29 Sep 2023 14:55:05 -0700 Subject: [PATCH 158/549] allow set list to be sorted by reduced scoring date --- .../Instructor/ProblemSetList/sort_form.html.ep | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/templates/ContentGenerator/Instructor/ProblemSetList/sort_form.html.ep b/templates/ContentGenerator/Instructor/ProblemSetList/sort_form.html.ep index 2a96703db9..9f21e3a49e 100644 --- a/templates/ContentGenerator/Instructor/ProblemSetList/sort_form.html.ep +++ b/templates/ContentGenerator/Instructor/ProblemSetList/sort_form.html.ep @@ -6,6 +6,10 @@ <%= select_field 'action.sort.primary' => [ [ maketext('Set Name') => 'set_id' ], [ maketext('Open Date') => 'open_date' ], + ($ce->{pg}{ansEvalDefaults}{enableReducedScoring} + ? [ maketext('Reduced Scoring Date') => 'reduced_scoring_date' ] + : () + ), [ maketext('Close Date') => 'due_date', selected => undef ], [ maketext('Answer Date') => 'answer_date' ], [ maketext('Visibility') => 'visible' ] @@ -20,6 +24,10 @@ <%= select_field 'action.sort.secondary' => [ [ maketext('Set Name') => 'set_id' ], [ maketext('Open Date') => 'open_date', selected => undef], + ($ce->{pg}{ansEvalDefaults}{enableReducedScoring} + ? [ maketext('Reduced Scoring Date') => 'reduced_scoring_date' ] + : () + ), [ maketext('Close Date') => 'due_date' ], [ maketext('Answer Date') => 'answer_date' ], [ maketext('Visibility') => 'visible' ] From 5c3b6ef3a56331d7ae40adfb5b03a8f3c204bd93 Mon Sep 17 00:00:00 2001 From: Alex Jordan Date: Fri, 29 Sep 2023 15:00:47 -0700 Subject: [PATCH 159/549] refine description of this achievement item --- lib/WeBWorK/AchievementItems/ResurrectHW.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/WeBWorK/AchievementItems/ResurrectHW.pm b/lib/WeBWorK/AchievementItems/ResurrectHW.pm index 9016a5ea50..4303059730 100644 --- a/lib/WeBWorK/AchievementItems/ResurrectHW.pm +++ b/lib/WeBWorK/AchievementItems/ResurrectHW.pm @@ -24,7 +24,7 @@ sub new ($class) { return bless { id => 'ResurrectHW', name => x('Scroll of Resurrection'), - description => x('Opens any homework set for 24 hours.') + description => x("Reopens one closed homework set for 24 hours and rerandomizes all problems."), }, $class; } From 732af448c64cf221a845f754f34b42e5b4e4df1b Mon Sep 17 00:00:00 2001 From: Jaimos Skriletz Date: Sun, 24 Sep 2023 21:02:05 -0600 Subject: [PATCH 160/549] Fix issue with hidden input probstatusX in gateway quizzes. The number `X` in the hidden input `probstatusX` needs to be the problem ID, but was being set to the index + 1 of the array used to randomized the problems. This causes the single problem grader javascript to hit an error if a test's problems do not start at 1 and are not in sequential order, as mentioned in #2215. Also, since GatewayQuiz.pm assumes the X is the problem ID, and uses this hidden input to get the status of its problems when moving though different pages, a quiz whose problems don't start with 1 or are not in sequential error could retrieve an incorrect status as a result. This update fixes the issue by setting X equal to the problemID. --- templates/ContentGenerator/GatewayQuiz.html.ep | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/templates/ContentGenerator/GatewayQuiz.html.ep b/templates/ContentGenerator/GatewayQuiz.html.ep index 4b35ff4100..f85113404c 100644 --- a/templates/ContentGenerator/GatewayQuiz.html.ep +++ b/templates/ContentGenerator/GatewayQuiz.html.ep @@ -589,7 +589,8 @@ % }
    % # Store the problem status for continued attempts recording. - <%= hidden_field 'probstatus' . ($probOrder->[$i] + 1) => $c->{probStatus}[ $probOrder->[$i] ] =%> + <%= hidden_field 'probstatus' . $problems->[ $probOrder->[$i] ]{problem_id} + => $c->{probStatus}[ $probOrder->[$i] ] =%> %
    % } else { @@ -605,7 +606,8 @@ % } % } % # Store the problem status for continued attempts recording. - <%= hidden_field 'probstatus' . ($probOrder->[$i] + 1) => $c->{probStatus}[ $probOrder->[$i] ] %> + <%= hidden_field 'probstatus' . $problems->[ $probOrder->[$i] ]{problem_id} + => $c->{probStatus}[ $probOrder->[$i] ] %> % } % } % From 757a417836d8a7e8ed61c56eedb706e7ad228e9a Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Tue, 1 Aug 2023 09:08:30 -0500 Subject: [PATCH 161/549] Clean up the FormatRenderedProblem pretty_print method. --- lib/FormatRenderedProblem.pm | 62 ++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 27 deletions(-) diff --git a/lib/FormatRenderedProblem.pm b/lib/FormatRenderedProblem.pm index 005b9c2c37..8e128d1bc6 100644 --- a/lib/FormatRenderedProblem.pm +++ b/lib/FormatRenderedProblem.pm @@ -403,20 +403,28 @@ EOS # Nice output for debugging sub pretty_print { my ($r_input, $level) = @_; + return 'undef' unless defined $r_input; + $level //= 4; $level--; - return '' unless $level > 0; # Only print three levels of hashes (safety feature) - my $out = ''; - if (!ref $r_input) { - $out = $r_input if defined $r_input; - $out =~ s/}; - + return 'too deep' unless $level > 0; + + my $ref = ref($r_input); + + if (!$ref) { + return xml_escape($r_input); + } elsif (eval { %$r_input || 1 }) { + # `eval { %$r_input || 1 }` will pick up all objectes that can be accessed like a hash and so works better than + # `ref $r_input`. Do not use `"$r_input" =~ /hash/i` because that will pick up strings containing the word + # hash, and that will cause an error below. + my $out = + '
    ' + . ($ref eq 'HASH' + ? '' + : '
    ' + . "$ref
    ") + . '
    '; for my $key (sort keys %$r_input) { # Safety feature - we do not want to display the contents of %seed_ce which # contains the database password and lots of other things, and explicitly hide @@ -429,24 +437,24 @@ sub pretty_print { || ($key eq "externalPrograms") || ($key eq "permissionLevels") || ($key eq "seed_ce")); - $out .= "$key=> " . pretty_print($r_input->{$key}, $level) . ""; + $out .= + '
    ' + . xml_escape($key) + . '
    ' + . qq{
    =>
    } + . qq{
    } + . pretty_print($r_input->{$key}, $level) + . '
    '; } - $out .= ''; - } elsif (ref $r_input eq 'ARRAY') { - my @array = @$r_input; - $out .= '( '; - while (@array) { - $out .= pretty_print(shift @array, $level) . ' , '; - } - $out .= ' )'; - } elsif (ref $r_input eq 'CODE') { - $out = "$r_input"; + $out .= '
    '; + return $out; + } elsif ($ref eq 'ARRAY') { + return '[ ' . join(', ', map { pretty_print($_, $level) } @$r_input) . ' ]'; + } elsif ($ref eq 'CODE') { + return 'CODE'; } else { - $out = $r_input; - $out =~ s/ Date: Fri, 6 Oct 2023 16:18:50 -0400 Subject: [PATCH 162/549] cleanup based on pr feedback --- .../WeBWorK/Tasks/AchievementNotification.pm | 1 - .../Instructor/AchievementEditor.pm | 24 ++-- .../Instructor/AchievementList.pm | 47 ++----- .../AchievementNotificationEditor.pm | 125 ++++++------------ lib/WeBWorK/Utils.pm | 2 +- lib/WeBWorK/Utils/Routes.pm | 2 +- .../AchievementEditor/save_as_form.html.ep | 2 +- .../AchievementList/default_table.html.ep | 9 +- .../disable_form.html.ep | 2 +- .../save_as_form.html.ep | 4 +- 10 files changed, 78 insertions(+), 140 deletions(-) diff --git a/lib/Mojolicious/WeBWorK/Tasks/AchievementNotification.pm b/lib/Mojolicious/WeBWorK/Tasks/AchievementNotification.pm index f389ad2009..9caa5292fc 100644 --- a/lib/Mojolicious/WeBWorK/Tasks/AchievementNotification.pm +++ b/lib/Mojolicious/WeBWorK/Tasks/AchievementNotification.pm @@ -71,7 +71,6 @@ sub send_achievement_notification ($job, $ce, $db, $mail_data) { $template, { ce => $ce, # holds achievement URLs - maketext => sub { maketext($job, @_) }, achievement => $mail_data->{achievement}, # full db record setID => $mail_data->{set_id}, nextLevelPoints => $mail_data->{nextLevelPoints}, diff --git a/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm b/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm index 6e39eb098b..60ad04a366 100644 --- a/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm +++ b/lib/WeBWorK/ContentGenerator/Instructor/AchievementEditor.pm @@ -39,8 +39,6 @@ sub pre_header_initialize ($c) { my $ce = $c->ce; my $authz = $c->authz; my $user = $c->param('user'); - $c->{courseID} = $c->stash('courseID'); - $c->{achievementID} = $c->stash('achievementID'); # Make sure that are defined for the templates. $c->stash->{formsToShow} = ACTION_FORMS(); @@ -51,10 +49,10 @@ sub pre_header_initialize ($c) { return unless ($authz->hasPermissions($user, 'edit_achievements')); # Get the achievement - my $Achievement = $c->db->getAchievement($c->{achievementID}); + my $Achievement = $c->db->getAchievement($c->stash('achievementID')); if (!$Achievement) { - $c->addbadmessage("Achievement $c->{achievementID} not found!"); + $c->addbadmessage("Achievement $c->stash('achievementID') not found!"); return; } @@ -117,7 +115,7 @@ sub shortPath ($c, $file) { } sub getRelativeSourceFilePath ($c, $sourceFilePath) { - my $achievementsDir = $c->ce->{courseDirs}->{achievements}; + my $achievementsDir = $c->ce->{courseDirs}{achievements}; $sourceFilePath =~ s|^${achievementsDir}/*||; # remove templates path and any slashes that follow return $sourceFilePath; } @@ -149,9 +147,9 @@ sub saveFileChanges ($c, $outputFilePath, $achievementContents = undef) { if (not_blank($outputFilePath)) { # save file # make sure any missing directories are created - WeBWorK::Utils::surePathToFile($ce->{courseDirs}->{achievements}, $outputFilePath); + WeBWorK::Utils::surePathToFile($ce->{courseDirs}{achievements}, $outputFilePath); die 'outputFilePath is unsafe!' - unless path_is_subdir($outputFilePath, $ce->{courseDirs}->{achievements}, 1); + unless path_is_subdir($outputFilePath, $ce->{courseDirs}{achievements}, 1); eval { open my $OUTPUTFILE, '>', $outputFilePath or die "Failed to open $outputFilePath"; @@ -173,7 +171,7 @@ sub saveFileChanges ($c, $outputFilePath, $achievementContents = undef) { my $errorMessage; # Check why we failed to give better error messages - if (not -w $ce->{courseDirs}->{achievements}) { + if (not -w $ce->{courseDirs}{achievements}) { $errorMessage = $c->maketext( 'Write permissions have not been enabled in the templates directory. No changes can be made.'); } elsif (not -w $currentDirectory) { @@ -205,8 +203,8 @@ sub saveFileChanges ($c, $outputFilePath, $achievementContents = undef) { } sub save_handler ($c) { - my $courseName = $c->{courseID}; - my $achievementName = $c->{achievementID}; + my $courseName = $c->stash('courseID'); + my $achievementName = $c->stash('achievementID'); # Grab the achievementContents from the form in order to save it to the source path $c->stash->{achievementContents} = fix_newlines($c->param('achievementContents')); @@ -220,8 +218,8 @@ sub save_handler ($c) { sub save_as_handler ($c) { my $db = $c->db; $c->{status_message} = $c->c; ## DPVC -- remove bogus old messages - my $courseName = $c->{courseID}; - my $achievementName = $c->{achievementID}; + my $courseName = $c->stash('courseID'); + my $achievementName = $c->stash('achievementID'); my $effectiveUserName = $c->param('effectiveUser'); my $do_not_save = 0; @@ -248,7 +246,7 @@ sub save_as_handler ($c) { $new_file_name .= '.at'; # put it there # Construct the output file path - my $outputFilePath = $c->ce->{courseDirs}->{achievements} . '/' . $new_file_name; + my $outputFilePath = $c->ce->{courseDirs}{achievements} . '/' . $new_file_name; if (defined $outputFilePath and -e $outputFilePath) { # setting $do_not_save stops saving and any redirects $do_not_save = 1; diff --git a/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm b/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm index 12b04c15a7..1e2c7b2c60 100644 --- a/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm +++ b/lib/WeBWorK/ContentGenerator/Instructor/AchievementList.pm @@ -241,7 +241,7 @@ sub score_handler ($c) { # Define file name my $scoreFileName = $courseName . "_achievement_scores.csv"; - my $scoreFilePath = $ce->{courseDirs}->{scoring} . '/' . $scoreFileName; + my $scoreFilePath = $ce->{courseDirs}{scoring} . '/' . $scoreFileName; # Back up existing file if (-e $scoreFilePath) { @@ -250,7 +250,7 @@ sub score_handler ($c) { } # Check path and open the file - $scoreFilePath = WeBWorK::Utils::surePathToFile($ce->{courseDirs}->{scoring}, $scoreFilePath); + $scoreFilePath = WeBWorK::Utils::surePathToFile($ce->{courseDirs}{scoring}, $scoreFilePath); my $SCORE = Mojo::File->new($scoreFilePath)->open('>:encoding(UTF-8)') or return (0, $c->maketext("Failed to open [_1]", $scoreFilePath)); @@ -410,7 +410,7 @@ sub import_handler ($c) { my $assign = $c->param('action.import.assign'); my @users = $db->listUsers; my %allAchievementIDs = map { $_ => 1 } @{ $c->{allAchievementIDs} }; - my $filePath = $ce->{courseDirs}->{achievements} . '/' . $fileName; + my $filePath = $ce->{courseDirs}{achievements} . '/' . $fileName; # Open file name my $fh = Mojo::File->new($filePath)->open('<:encoding(UTF-8)') @@ -430,37 +430,16 @@ sub import_handler ($c) { $achievement->achievement_id($achievement_id); - # Fall back for importing an old list without the number or assignment_type fields - if (scalar(@$data) == 7) { - # Old lists tend to have an extraneous space at the front. - for (my $i = 1; $i <= 7; $i++) { - $$data[$i] =~ s/^\s+//; - } - - $$data[1] =~ s/\;/,/; - $achievement->name($$data[1]); - $achievement->category($$data[2]); - $$data[3] =~ s/\;/,/; - $achievement->description($$data[3]); - $achievement->points($$data[4]); - $achievement->max_counter($$data[5]); - $achievement->test($$data[6]); - $achievement->icon($$data[7]); - $achievement->assignment_type('default'); - $achievement->number($count + 1); - $achievement->email_template(''); - } else { - $achievement->name($$data[1]); - $achievement->number($$data[2]); - $achievement->category($$data[3]); - $achievement->assignment_type($$data[4]); - $achievement->description($$data[5]); - $achievement->points($$data[6]); - $achievement->max_counter($$data[7]); - $achievement->test($$data[8]); - $achievement->icon($$data[9]); - $achievement->email_template($$data[10] // ''); - } + $achievement->name($$data[1]); + $achievement->number($$data[2]); + $achievement->category($$data[3]); + $achievement->assignment_type($$data[4]); + $achievement->description($$data[5]); + $achievement->points($$data[6]); + $achievement->max_counter($$data[7]); + $achievement->test($$data[8]); + $achievement->icon($$data[9]); + $achievement->email_template($$data[10] // ''); $achievement->enabled($assign eq "all" ? 1 : 0); diff --git a/lib/WeBWorK/ContentGenerator/Instructor/AchievementNotificationEditor.pm b/lib/WeBWorK/ContentGenerator/Instructor/AchievementNotificationEditor.pm index c38c6284e7..e952bc923d 100644 --- a/lib/WeBWorK/ContentGenerator/Instructor/AchievementNotificationEditor.pm +++ b/lib/WeBWorK/ContentGenerator/Instructor/AchievementNotificationEditor.pm @@ -18,13 +18,10 @@ use Mojo::Base 'WeBWorK::ContentGenerator', -signatures; =head1 NAME -WeBWorK::ContentGenerator::Instructor::AchievementNotificationEditor - edit an achevement evaluator file +WeBWorK::ContentGenerator::Instructor::AchievementNotificationEditor - edit the achievement notification template =cut -use HTML::Entities; -use File::Copy; - use WeBWorK::Utils qw(fix_newlines not_blank path_is_subdir x); use constant ACTION_FORMS => [qw(save save_as existing disable)]; @@ -35,14 +32,9 @@ use constant ACTION_FORM_TITLES => { disable => x('Disable Notifications'), }; -use constant DEFAULT_ICON => 'defaulticon.png'; - sub pre_header_initialize ($c) { - my $ce = $c->ce; - my $authz = $c->authz; - my $user = $c->param('user'); - $c->{courseID} = $c->stash('courseID'); - $c->{achievementID} = $c->stash('achievementID'); + my $courseID = $c->stash('courseID'); + my $achievementID = $c->stash('achievementID'); # Make sure that are defined for the templates. $c->stash->{formsToShow} = ACTION_FORMS(); @@ -50,28 +42,25 @@ sub pre_header_initialize ($c) { $c->stash->{achievementNotification} = ''; # Check permissions - return unless ($authz->hasPermissions($user, 'edit_achievements')); + return unless ($c->authz->hasPermissions($c->param('user'), 'edit_achievements')); # Get the achievement - my $achievement = $c->db->getAchievement($c->{achievementID}); + my $achievement = $c->db->getAchievement($achievementID); if (!$achievement) { - $c->addbadmessage("Achievement $c->{achievementID} not found!"); + $c->addbadmessage($c->maketext("Achievement [_1] not found!", $achievementID)); return; } $c->{achievement} = $achievement; my $template_filename = $achievement->email_template || "default.html.ep"; - $c->{sourceFilePath} = - $ce->{courseDirs}{achievements} . "/$template_filename"; + $c->{sourceFilePath} = $c->ce->{courseDirs}{achievements} . "/$template_filename"; my $actionID = $c->param('action'); # Perform a save or save_as action if ($actionID) { - unless (grep { $_ eq $actionID } @{ ACTION_FORMS() }) { - die "Action $actionID not found"; - } + die "Action $actionID not found" unless (grep { $_ eq $actionID } @{ ACTION_FORMS() }); my $actionHandler = "${actionID}_handler"; $c->$actionHandler; @@ -91,12 +80,12 @@ sub initialize ($c) { # Check source file path if (not(-e $sourceFilePath)) { - $c->addbadmessage('The file "' . $c->shortPath($sourceFilePath) . '" cannot be found.'); + $c->addbadmessage($c->maketext('The file [_1] cannot be found.', $sourceFilePath)); return; } # Find the text for the achievement. - unless ($c->stash->{achievementNotification} =~ /\S/) { + unless ($c->stash('achievementNotification') =~ /\S/) { unless (path_is_subdir($sourceFilePath, $c->ce->{courseDirs}{achievements}, 1)) { $c->addbadmessage('Path is Unsafe!'); return; @@ -109,10 +98,6 @@ sub initialize ($c) { return; } -sub page_title ($c) { - return $c->maketext('Achievement Notification for achievement [_1]', $c->stash('achievementID')); -} - # Convert long paths to [ACHEVDIR] sub shortPath ($c, $file) { my $ache = $c->ce->{courseDirs}{achievements}; @@ -121,7 +106,7 @@ sub shortPath ($c, $file) { } sub getRelativeSourceFilePath ($c, $sourceFilePath) { - my $achievementsDir = $c->ce->{courseDirs}->{achievements}; + my $achievementsDir = $c->ce->{courseDirs}{achievements}; $sourceFilePath =~ s|^${achievementsDir}/*||; # remove templates path and any slashes that follow return $sourceFilePath; } @@ -132,47 +117,36 @@ sub getRelativeSourceFilePath ($c, $sourceFilePath) { sub saveFileChanges ($c, $outputFilePath, $achievementNotification = undef) { my $ce = $c->ce; - if (defined($achievementNotification) and ref($achievementNotification)) { + if (ref($achievementNotification)) { $achievementNotification = ${$achievementNotification}; } elsif (!not_blank($achievementNotification)) { # if the achievementNotification is undefined or empty - $achievementNotification = $c->stash->{achievementNotification}; + $achievementNotification = $c->stash('achievementNotification'); } unless (not_blank($outputFilePath)) { $c->addbadmessage($c->maketext('You must specify an file name in order to save a new file.')); - return ''; + return; } - my $do_not_save = 0; # flag to prevent saving of file - my $editErrors = ''; # write changes to the approriate files # FIXME make sure that the permissions are set correctly!!! # Make sure that the warning is being transmitted properly. - my $writeFileErrors; - if (not_blank($outputFilePath)) { # save file + # make sure any missing directories are created + WeBWorK::Utils::surePathToFile($ce->{courseDirs}{achievements}, $outputFilePath); + die 'outputFilePath is unsafe!' + unless path_is_subdir($outputFilePath, $ce->{courseDirs}{achievements}, 1); - # make sure any missing directories are created - WeBWorK::Utils::surePathToFile($ce->{courseDirs}->{achievements}, $outputFilePath); - die 'outputFilePath is unsafe!' - unless path_is_subdir($outputFilePath, $ce->{courseDirs}->{achievements}, 1); - - eval { - open my $OUTPUTFILE, '>', $outputFilePath - or die "Failed to open $outputFilePath"; - print $OUTPUTFILE $achievementNotification; - close $OUTPUTFILE; - }; - - $writeFileErrors = $@ if $@; - } + eval { + open my $OUTPUTFILE, '>', $outputFilePath + or die "Failed to open $outputFilePath"; + print $OUTPUTFILE $achievementNotification; + close $OUTPUTFILE; + }; + my $writeFileErrors = $@ if $@; # Catch errors in saving files, - $c->{saveError} = $do_not_save; # Don't do redirects if the file was not saved. - # Don't unlink files or send success messages - if ($writeFileErrors) { - # Get the current directory from the outputFilePath $outputFilePath =~ m|^(/.*?/)[^/]+$|; my $currentDirectory = $1; @@ -180,7 +154,7 @@ sub saveFileChanges ($c, $outputFilePath, $achievementNotification = undef) { my $errorMessage; # Check why we failed to give better error messages - if (not -w $ce->{courseDirs}->{achievements}) { + if (not -w $ce->{courseDirs}{achievements}) { $errorMessage = $c->maketext( 'Write permissions have not been enabled in the templates directory. No changes can be made.'); } elsif (not -w $currentDirectory) { @@ -200,15 +174,8 @@ sub saveFileChanges ($c, $outputFilePath, $achievementNotification = undef) { $c->maketext('Unable to write to "[_1]": [_2]', $c->shortPath($outputFilePath), $writeFileErrors); } - $c->{failure} = 1; $c->addbadmessage($errorMessage); - } - - if (!$writeFileErrors - && !$do_not_save - && defined $outputFilePath - && !$c->{failure}) - { + } else { $c->addgoodmessage($c->maketext('Saved to file "[_1]"', $c->shortPath($outputFilePath))); } @@ -216,24 +183,20 @@ sub saveFileChanges ($c, $outputFilePath, $achievementNotification = undef) { } sub save_handler ($c) { - my $courseName = $c->{courseID}; - my $achievementName = $c->{achievementID}; - # Grab the achievementNotification from the form in order to save it to the source path $c->stash->{achievementNotification} = fix_newlines($c->param('achievementNotification')); # Construct the output file path $c->saveFileChanges($c->{sourceFilePath}); - return; } sub save_as_handler ($c) { my $db = $c->db; $c->{status_message} = $c->c; ## DPVC -- remove bogus old messages - my $courseName = $c->{courseID}; - my $achievementName = $c->{achievementID}; + my $courseName = $c->stash('courseID'); + my $achievementName = $c->stash('achievementID'); my $effectiveUserName = $c->param('effectiveUser'); my $do_not_save = 0; @@ -262,7 +225,7 @@ sub save_as_handler ($c) { $new_file_name .= '.ep'; # put it there # Construct the output file path - my $outputFilePath = $c->ce->{courseDirs}->{achievements} . '/' . $new_file_name; + my $outputFilePath = $c->ce->{courseDirs}{achievements} . '/' . $new_file_name; if (defined $outputFilePath and -e $outputFilePath) { # setting $do_not_save stops saving and any redirects @@ -307,7 +270,6 @@ sub save_as_handler ($c) { } } elsif ($saveMode eq 'dont_use') { - # Don't change any achievements - just report $c->addgoodmessage($c->maketext('A new file has been created at "[_1]"', $c->shortPath($outputFilePath))); } else { @@ -330,8 +292,9 @@ sub save_as_handler ($c) { # use an existing template file sub existing_handler ($c) { - my $db = $c->db; - my $ce = $c->ce; + my $db = $c->db; + my $ce = $c->ce; + my $achievementID = $c->stash('achievementID'); # get the desired file name from formdata my $sourceFile = $c->param('action.existing.target_file') || ''; @@ -339,16 +302,14 @@ sub existing_handler ($c) { if (-e $ce->{courseDirs}{achievements} . "/$sourceFile") { # if it exists, update the achievement to use the existing email template - my $achievement = $db->getAchievement($c->{achievementID}); + my $achievement = $db->getAchievement($achievementID); $achievement->email_template($sourceFile); if ($db->putAchievement($achievement)) { $c->addgoodmessage($c->maketext( - 'The notification for [_1] has been changed to "[_2]".', - $c->{achievementID}, $sourceFile - )); + 'The notification for [_1] has been changed to "[_2]".', $achievementID, $sourceFile)); } else { $c->addbadmessage($c->maketext( - 'Unable to change the notification for [_1]. Unknown error.', $c->{achievementID})); + 'Unable to change the notification for [_1]. Unknown error.', $achievementID)); } } else { $c->addbadmessage($c->maketext('The file "[_1]" cannot be found.', $sourceFile)); @@ -358,7 +319,7 @@ sub existing_handler ($c) { # is this necessary? the achievement DID update... $c->reply_with_redirect($c->systemLink( $c->url_for( - 'instructor_achievement_notification', achievementID => $c->{achievementID} + 'instructor_achievement_notification', achievementID => $achievementID ), params => { status_message => $c->{status_message}->join(''), @@ -368,14 +329,15 @@ sub existing_handler ($c) { } sub disable_handler ($c) { - my $db = $c->db; - my $ce = $c->ce; + my $db = $c->db; + my $ce = $c->ce; + my $achievementID = $c->stash('achievementID'); - my $achievement = $c->db->getAchievement($c->{achievementID}); + my $achievement = $c->db->getAchievement($achievementID); $achievement->email_template(''); if ($c->db->putAchievement($achievement)) { - $c->addgoodmessage($c->maketext('The evaluator for [_1] has been disabled.', $c->{achievementID})); + $c->addgoodmessage($c->maketext('The evaluator for [_1] has been disabled.', $achievementID)); # redirect to the instructor_achievement_list $c->reply_with_redirect($c->systemLink( @@ -385,8 +347,7 @@ sub disable_handler ($c) { } )); } else { - $c->addbadmessage($c->maketext( - 'Unable to disable the evaluator for [_1]. Unknown error.', $c->{achievementID})); + $c->addbadmessage($c->maketext('Unable to disable the evaluator for [_1]. Unknown error.', $achievementID)); } } diff --git a/lib/WeBWorK/Utils.pm b/lib/WeBWorK/Utils.pm index bef9d49fcc..7b333a7cda 100644 --- a/lib/WeBWorK/Utils.pm +++ b/lib/WeBWorK/Utils.pm @@ -901,7 +901,7 @@ sub trim_spaces { # fix non-unix line endings sub fix_newlines { - return shift =~ s/\r\n/\n/gr; + return shift =~ s/\r\n?/\n/gr; } # This is for formatting set names input via text inputs in the user interface for internal use. Set names are allowed diff --git a/lib/WeBWorK/Utils/Routes.pm b/lib/WeBWorK/Utils/Routes.pm index ee45291853..a0c61f6a15 100644 --- a/lib/WeBWorK/Utils/Routes.pm +++ b/lib/WeBWorK/Utils/Routes.pm @@ -478,7 +478,7 @@ my %routeParameters = ( path => '/#achievementID/users' }, instructor_achievement_notification => { - title => x('Achievement Email Notification Editor'), + title => x('Achievement Notification for [_5]'), module => 'Instructor::AchievementNotificationEditor', path => '/#achievementID/email' }, diff --git a/templates/ContentGenerator/Instructor/AchievementEditor/save_as_form.html.ep b/templates/ContentGenerator/Instructor/AchievementEditor/save_as_form.html.ep index ae821d64eb..d7fd8c3ae9 100644 --- a/templates/ContentGenerator/Instructor/AchievementEditor/save_as_form.html.ep +++ b/templates/ContentGenerator/Instructor/AchievementEditor/save_as_form.html.ep @@ -13,7 +13,7 @@ <%= radio_button 'action.save_as.saveMode' => 'use_in_current', id => 'action.save_as.saveMode.use_in_current', class => 'form-check-input' =%> <%= label_for 'action.save_as.saveMode.use_in_current', class => 'form-check-label', begin =%> - <%== maketext('Use in achievement [_1]', tag('b', $c->{achievementID})) =%> + <%== maketext('Use in achievement [_1]', tag('b', $achievementID)) =%> <% end =%>