Version 22.43: Oct 11, 2022 Review of projects (not finished).

This commit is contained in:
acanas 2022-10-11 23:30:47 +02:00
parent 7202f590ed
commit 6e3cea9ba1
8 changed files with 249 additions and 41 deletions

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M0 64C0 28.7 28.7 0 64 0H224V128c0 17.7 14.3 32 32 32H384v38.6C310.1 219.5 256 287.4 256 368c0 59.1 29.1 111.3 73.7 143.3c-3.2 .5-6.4 .7-9.7 .7H64c-35.3 0-64-28.7-64-64V64zm384 64H256V0L384 128zM576 368c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zm-76.7-43.3c-6.2-6.2-16.4-6.2-22.6 0L416 385.4l-28.7-28.7c-6.2-6.2-16.4-6.2-22.6 0s-6.2 16.4 0 22.6l40 40c6.2 6.2 16.4 6.2 22.6 0l72-72c6.2-6.2 6.2-16.4 0-22.6z"/></svg>

After

Width:  |  Height:  |  Size: 687 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M0 64C0 28.7 28.7 0 64 0H224V128c0 17.7 14.3 32 32 32H384v38.6C310.1 219.5 256 287.4 256 368c0 59.1 29.1 111.3 73.7 143.3c-3.2 .5-6.4 .7-9.7 .7H64c-35.3 0-64-28.7-64-64V64zm384 64H256V0L384 128zm48 384c-79.5 0-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144s-64.5 144-144 144zm0-48c13.3 0 24-10.7 24-24s-10.7-24-24-24s-24 10.7-24 24s10.7 24 24 24zm0-192c-8.8 0-16 7.2-16 16v80c0 8.8 7.2 16 16 16s16-7.2 16-16V288c0-8.8-7.2-16-16-16z"/></svg>

After

Width:  |  Height:  |  Size: 683 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M0 64C0 28.7 28.7 0 64 0H224V128c0 17.7 14.3 32 32 32H384v38.6C310.1 219.5 256 287.4 256 368c0 59.1 29.1 111.3 73.7 143.3c-3.2 .5-6.4 .7-9.7 .7H64c-35.3 0-64-28.7-64-64V64zm384 64H256V0L384 128zm48 384c-79.5 0-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144s-64.5 144-144 144zm0-48c13.3 0 24-10.7 24-24s-10.7-24-24-24s-24 10.7-24 24s10.7 24 24 24zM368 321.6V328c0 8.8 7.2 16 16 16s16-7.2 16-16v-6.4c0-5.3 4.3-9.6 9.6-9.6h40.5c7.7 0 13.9 6.2 13.9 13.9c0 5.2-2.9 9.9-7.4 12.3l-32 16.8c-5.3 2.8-8.6 8.2-8.6 14.2V384c0 8.8 7.2 16 16 16s16-7.2 16-16v-5.1l23.5-12.3c15.1-7.9 24.5-23.6 24.5-40.6c0-25.4-20.6-45.9-45.9-45.9H409.6c-23 0-41.6 18.6-41.6 41.6z"/></svg>

After

Width:  |  Height:  |  Size: 899 B

View File

@ -606,19 +606,23 @@ TODO: Fix bug: error al enviar un mensaje a dos recipientes, error on duplicate
TODO: Attach pdf files in multimedia.
*/
#define Log_PLATFORM_VERSION "SWAD 22.42 (2022-10-11)"
#define Log_PLATFORM_VERSION "SWAD 22.43 (2022-10-11)"
#define CSS_FILE "swad22.40.css"
#define JS_FILE "swad21.100.js"
/*
Version 22.42: Oct 11, 2022 Review of projects (not finished). (? lines)
Version 22.43: Oct 11, 2022 Review of projects (not finished). (332930 lines)
Version 22.42: Oct 11, 2022 Review of projects (not finished). (332738 lines)
3 changes necessary in database:
ALTER TABLE prj_projects ADD COLUMN ReviewStatus ENUM('unreviewed','unapproved','approved') NOT NULL DEFAULT 'unreviewed' AFTER URL,ADD INDEX (CrsCod,ReviewStatus);
ALTER TABLE prj_projects ADD COLUMN ReviewTime DATETIME NOT NULL DEFAULT '1970-01-01 01:00:00' AFTER ReviewStatus;
ALTER TABLE prj_projects ADD COLUMN ReviewTxt TEXT NOT NULL AFTER ReviewTime;
Copy the following icons to icon public directory:
sudo cp icon/comment-slash.svg /var/www/html/swad/icon/
sudo cp icon/thumbs-down.svg /var/www/html/swad/icon/
sudo cp icon/thumbs-up.svg /var/www/html/swad/icon/
// sudo cp icon/comment-slash.svg /var/www/html/swad/icon/
sudo cp icon/file-circle-check.svg /var/www/html/swad/icon/
sudo cp icon/file-circle-exclamation.svg /var/www/html/swad/icon/
sudo cp icon/file-circle-question.svg /var/www/html/swad/icon/
// sudo cp icon/thumbs-down.svg /var/www/html/swad/icon/
// sudo cp icon/thumbs-up.svg /var/www/html/swad/icon/
Version 22.41.1: Oct 07, 2022 Fixed issue in main title. (332512 lines)
Version 22.41: Oct 06, 2022 Changes in the behavior of the expansion/contraction of program items. (332511 lines)

View File

@ -91,12 +91,24 @@ static const unsigned Brw_NUM_ROLES_TO_SHOW = sizeof (Prj_RolesToShow) /
sizeof (Prj_RolesToShow[0]);
/***** Assigned/non-assigned project *****/
static const char *AssignedNonassigImage[Prj_NUM_ASSIGNED_NONASSIG] =
static const char *AssignedNonassigIcon[Prj_NUM_ASSIGNED_NONASSIG] =
{
[Prj_ASSIGNED] = "user.svg",
[Prj_NONASSIG] = "user-slash.svg",
};
/***** Review status *****/
static struct
{
const char *Icon;
Ico_Color_t Color;
} ReviewIcon[Prj_NUM_REVIEW_STATUS] =
{
[Prj_UNREVIEWED] = {"file-circle-question.svg" ,Ico_BLACK},
[Prj_UNAPPROVED] = {"file-circle-exclamation.svg",Ico_RED },
[Prj_APPROVED ] = {"file-circle-check.svg" ,Ico_GREEN},
};
/***** Locked/unlocked project edition *****/
static const struct
{
@ -622,7 +634,7 @@ static void Prj_ShowFormToFilterByAssign (const struct Prj_Projects *Projects)
Projects->SelectedOrder,
Projects->CurrentPage,
-1L);
Ico_PutSettingIconLink (AssignedNonassigImage[Assign],Ico_BLACK,
Ico_PutSettingIconLink (AssignedNonassigIcon[Assign],Ico_BLACK,
Txt_PROJECT_ASSIGNED_NONASSIGNED_PLURAL[Assign]);
Frm_EndForm ();
Set_EndPref ();
@ -726,19 +738,9 @@ static void Prj_ShowFormToFilterByWarning (const struct Prj_Projects *Projects)
static void Prj_ShowFormToFilterByReview (const struct Prj_Projects *Projects)
{
extern const char *Txt_PROJECT_REVIEWED_PROJECTS[Prj_NUM_REVIEW_STATUS];
extern const char *Txt_PROJECT_REVIEW_PLURAL[Prj_NUM_REVIEW_STATUS];
struct Prj_Filter Filter;
Prj_ReviewStatus_t ReviewStatus;
struct
{
const char *Icon;
Ico_Color_t Color;
} ReviewIcon[Prj_NUM_REVIEW_STATUS] =
{
[Prj_UNREVIEWED] = {"comment-slash.svg",Ico_BLACK},
[Prj_UNAPPROVED] = {"thumbs-down.svg" ,Ico_RED },
[Prj_APPROVED ] = {"thumbs-up.svg" ,Ico_GREEN},
};
Set_BeginOneSettingSelector ();
for (ReviewStatus = (Prj_ReviewStatus_t) 0;
@ -759,7 +761,7 @@ static void Prj_ShowFormToFilterByReview (const struct Prj_Projects *Projects)
-1L);
Ico_PutSettingIconLink (ReviewIcon[ReviewStatus].Icon,
ReviewIcon[ReviewStatus].Color,
Txt_PROJECT_REVIEWED_PROJECTS[ReviewStatus]);
Txt_PROJECT_REVIEW_PLURAL[ReviewStatus]);
Frm_EndForm ();
Set_EndPref ();
}
@ -1352,6 +1354,8 @@ static void Prj_ShowProjectRow (struct Prj_Projects *Projects,
Prj_ProjectView_t ProjectView)
{
extern const char *Txt_Actions[Act_NUM_ACTIONS];
extern const char *Txt_Review;
extern const char *Txt_PROJECT_REVIEW_SINGUL[Prj_NUM_REVIEW_STATUS];
extern const char *Txt_Assigned_QUESTION;
extern const char *Txt_Yes;
extern const char *Txt_No;
@ -1395,7 +1399,7 @@ static void Prj_ShowProjectRow (struct Prj_Projects *Projects,
switch (ProjectView)
{
case Prj_LIST_PROJECTS:
HTM_TD_Begin ("rowspan=\"3\" class=\"RT BIG_INDEX_%s %s\"",
HTM_TD_Begin ("rowspan=\"4\" class=\"RT BIG_INDEX_%s %s\"",
The_GetSuffix (),
The_GetColorRows ());
HTM_Unsigned (NumIndex);
@ -1414,7 +1418,7 @@ static void Prj_ShowProjectRow (struct Prj_Projects *Projects,
switch (ProjectView)
{
case Prj_LIST_PROJECTS:
HTM_TD_Begin ("rowspan=\"3\" class=\"CONTEXT_COL %s\"",
HTM_TD_Begin ("rowspan=\"4\" class=\"CONTEXT_COL %s\"",
The_GetColorRows ());
Prj_PutIconsToRemEditOnePrj (Projects,Anchor);
HTM_TD_End ();
@ -1505,8 +1509,51 @@ static void Prj_ShowProjectRow (struct Prj_Projects *Projects,
/* Department */
Prj_ShowOneProjectDepartment (&Projects->Prj,ProjectView);
/***** Assigned? *****/
HTM_TR_Begin (NULL);
HTM_TR_End ();
/***** Review status *****/
HTM_TR_Begin (NULL);
switch (ProjectView)
{
case Prj_LIST_PROJECTS:
HTM_TD_Begin ("colspan=\"2\" class=\"RT %s_%s %s\"",
ClassLabel,The_GetSuffix (),The_GetColorRows ());
break;
default:
HTM_TD_Begin ("colspan=\"2\" class=\"RT %s_%s\"",
ClassLabel,The_GetSuffix ());
break;
}
HTM_TxtColon (Txt_Review);
HTM_TD_End ();
switch (ProjectView)
{
case Prj_LIST_PROJECTS:
HTM_TD_Begin ("colspan=\"2\" class=\"LT %s_%s %s\"",
ClassData,The_GetSuffix (),The_GetColorRows ());
break;
default:
HTM_TD_Begin ("colspan=\"2\" class=\"LT %s_%s\"",
ClassData,The_GetSuffix ());
break;
}
HTM_TxtF ("%s&nbsp;",Txt_PROJECT_REVIEW_SINGUL[Projects->Prj.ReviewStatus]);
Ico_PutIconOff (ReviewIcon[Projects->Prj.ReviewStatus].Icon,
ReviewIcon[Projects->Prj.ReviewStatus].Color,
Txt_PROJECT_REVIEW_SINGUL[Projects->Prj.ReviewStatus]);
/*
if (Faults.WrongAssigned)
Prj_PutWarningIcon ();
*/
HTM_TD_End ();
HTM_TR_End ();
/***** Assigned? *****/
HTM_TR_Begin (NULL);
switch (ProjectView)
{
@ -1535,7 +1582,7 @@ static void Prj_ShowProjectRow (struct Prj_Projects *Projects,
}
HTM_TxtF ("%s&nbsp;",Projects->Prj.Assigned == Prj_ASSIGNED ? Txt_Yes :
Txt_No);
Ico_PutIconOff (AssignedNonassigImage[Projects->Prj.Assigned],Ico_BLACK,
Ico_PutIconOff (AssignedNonassigIcon[Projects->Prj.Assigned],Ico_BLACK,
Txt_PROJECT_ASSIGNED_NONASSIGNED_SINGUL[Projects->Prj.Assigned]);
if (Faults.WrongAssigned)
@ -1924,7 +1971,6 @@ static void Prj_ShowOneProjectDepartment (const struct Prj_Project *Prj,
if (PutLink)
HTM_A_End ();
HTM_TD_End ();
HTM_TR_End ();
}
static void Prj_ShowTableAllProjectsDepartment (const struct Prj_Project *Prj)
@ -2999,9 +3045,11 @@ static void Prj_GetListProjects (struct Prj_Projects *Projects)
void Prj_GetDataOfProjectByCod (struct Prj_Project *Prj)
{
extern const char *Prj_Proposal_DB[Prj_NUM_PROPOSAL_TYPES];
extern const char *Prj_ReviewStatus_DB[Prj_NUM_REVIEW_STATUS];
MYSQL_RES *mysql_res;
MYSQL_ROW row;
Prj_Proposal_t Proposal;
Prj_ReviewStatus_t ReviewStatus;
if (Prj->PrjCod > 0)
{
@ -3057,6 +3105,20 @@ void Prj_GetDataOfProjectByCod (struct Prj_Project *Prj)
Str_Copy (Prj->Knowledge ,row[12],Cns_MAX_BYTES_TEXT);
Str_Copy (Prj->Materials ,row[13],Cns_MAX_BYTES_TEXT);
Str_Copy (Prj->URL ,row[14],sizeof (Prj->URL ) - 1);
/* Get review status (row[15]), review time (row[16])
and review text (row[17]) */
Prj->ReviewStatus = Prj_REVIEW_STATUS_DEFAULT;
for (ReviewStatus = (Prj_ReviewStatus_t) 0;
ReviewStatus <= (Prj_ReviewStatus_t) (Prj_NUM_REVIEW_STATUS - 1);
ReviewStatus++)
if (!strcmp (Prj_ReviewStatus_DB[Proposal],row[15]))
{
Prj->ReviewStatus = ReviewStatus;
break;
}
Prj->ReviewTime = Dat_GetUNIXTimeFromStr (row[16]);
Str_Copy (Prj->ReviewTxt ,row[17],Cns_MAX_BYTES_TEXT);
}
/***** Free structure that stores the query result *****/
@ -3092,6 +3154,10 @@ static void Prj_ResetProject (struct Prj_Project *Prj)
Prj->Knowledge[0] = '\0';
Prj->Materials[0] = '\0';
Prj->URL[0] = '\0';
Prj->ReviewStatus = Prj_REVIEW_STATUS_DEFAULT;
Prj->ReviewTime = (time_t) 0;
Prj->ReviewTxt[0] = '\0';
}
/*****************************************************************************/
@ -3620,6 +3686,9 @@ void Prj_AllocMemProject (struct Prj_Project *Prj)
if ((Prj->Materials = malloc (Cns_MAX_BYTES_TEXT + 1)) == NULL)
Err_NotEnoughMemoryExit ();
if ((Prj->ReviewTxt = malloc (Cns_MAX_BYTES_TEXT + 1)) == NULL)
Err_NotEnoughMemoryExit ();
}
/*****************************************************************************/
@ -3643,6 +3712,11 @@ void Prj_FreeMemProject (struct Prj_Project *Prj)
free (Prj->Materials);
Prj->Materials = NULL;
}
if (Prj->ReviewTxt)
{
free (Prj->ReviewTxt);
Prj->ReviewTxt = NULL;
}
}
/*****************************************************************************/

View File

@ -91,6 +91,7 @@ typedef enum
Prj_UNAPPROVED = 1,
Prj_APPROVED = 2,
} Prj_ReviewStatus_t;
#define Prj_REVIEW_STATUS_DEFAULT Prj_UNREVIEWED
#define Prj_FILTER_UNREVIEWED_DEFAULT (1 << Prj_UNREVIEWED) // on
#define Prj_FILTER_UNAPPROVED_DEFAULT (1 << Prj_UNAPPROVED) // on
#define Prj_FILTER_APPROVED_DEFAULT (1 << Prj_APPROVED) // on
@ -163,6 +164,9 @@ struct Prj_Project
char *Knowledge;
char *Materials;
char URL[Cns_MAX_BYTES_WWW + 1];
Prj_ReviewStatus_t ReviewStatus;
time_t ReviewTime;
char *ReviewTxt;
};
/***** Struct to store context/status of projects *****/

View File

@ -52,6 +52,14 @@ const char *Prj_Proposal_DB[Prj_NUM_PROPOSAL_TYPES] =
[Prj_PROPOSAL_UNMODIFIED] = "unmodified",
};
/***** Enum field in database for review status *****/
const char *Prj_ReviewStatus_DB[Prj_NUM_REVIEW_STATUS] =
{
[Prj_UNREVIEWED] = "unreviewed",
[Prj_UNAPPROVED] = "unapproved",
[Prj_APPROVED ] = "approved",
};
/*****************************************************************************/
/************ Update configuration of projects for current course ************/
/*****************************************************************************/
@ -109,11 +117,13 @@ long Prj_DB_CreateProject (const struct Prj_Project *Prj)
"INSERT INTO prj_projects"
" (CrsCod,DptCod,Hidden,Assigned,NumStds,Proposal,"
"CreatTime,ModifTime,"
"Title,Description,Knowledge,Materials,URL)"
"Title,Description,Knowledge,Materials,URL,"
"ReviewStatus,ReviewTime,ReviewTxt)"
" VALUES"
" (%ld,%ld,'%c','%c',%u,'%s',"
"FROM_UNIXTIME(%ld),FROM_UNIXTIME(%ld),"
"'%s','%s','%s','%s','%s')",
"'%s','%s','%s','%s','%s',"
"'%s',FROM_UNIXTIME(%ld),'%s')",
Gbl.Hierarchy.Crs.CrsCod,
Prj->DptCod,
Prj->Hidden == Prj_HIDDEN ? 'Y' :
@ -128,7 +138,10 @@ long Prj_DB_CreateProject (const struct Prj_Project *Prj)
Prj->Description,
Prj->Knowledge,
Prj->Materials,
Prj->URL);
Prj->URL,
Prj_ReviewStatus_DB[Prj->ReviewStatus],
Prj->ReviewTime,
Prj->ReviewTxt);
}
/*****************************************************************************/
@ -283,30 +296,42 @@ unsigned Prj_DB_GetListProjects (MYSQL_RES **mysql_res,
switch (Projects->Filter.Review)
{
case (1 << Prj_UNREVIEWED): // Unreviewed projects
if (asprintf (&AssignSubQuery," AND prj_projects.ReviewStatus='unreviewed'") < 0)
if (asprintf (&AssignSubQuery," AND prj_projects.ReviewStatus='%s'",
Prj_ReviewStatus_DB[Prj_UNREVIEWED]) < 0)
Err_NotEnoughMemoryExit ();
break;
case (1 << Prj_UNAPPROVED): // Unapproved projects
if (asprintf (&AssignSubQuery," AND prj_projects.ReviewStatus='unapproved'") < 0)
if (asprintf (&AssignSubQuery," AND prj_projects.ReviewStatus='%s'",
Prj_ReviewStatus_DB[Prj_UNAPPROVED]) < 0)
Err_NotEnoughMemoryExit ();
break;
case (1 << Prj_APPROVED): // Approved projects
if (asprintf (&AssignSubQuery," AND prj_projects.ReviewStatus='approved'") < 0)
if (asprintf (&AssignSubQuery," AND prj_projects.ReviewStatus='%s'",
Prj_ReviewStatus_DB[Prj_APPROVED ]) < 0)
Err_NotEnoughMemoryExit ();
break;
case (1 << Prj_UNREVIEWED | 1 << Prj_UNAPPROVED): // Unreviewed and unapproved projects
if (asprintf (&AssignSubQuery," AND prj_projects.ReviewStatus IN ('unreviewed','unapproved')") < 0)
case (1 << Prj_UNREVIEWED |
1 << Prj_UNAPPROVED): // Unreviewed and unapproved projects
if (asprintf (&AssignSubQuery," AND prj_projects.ReviewStatus IN ('%s','%s')",
Prj_ReviewStatus_DB[Prj_UNREVIEWED],
Prj_ReviewStatus_DB[Prj_UNAPPROVED]) < 0)
Err_NotEnoughMemoryExit ();
break;
case (1 << Prj_UNREVIEWED | 1 << Prj_APPROVED): // Unreviewed and approved projects
if (asprintf (&AssignSubQuery," AND prj_projects.ReviewStatus IN ('unreviewed','approved')") < 0)
case (1 << Prj_UNREVIEWED |
1 << Prj_APPROVED): // Unreviewed and approved projects
if (asprintf (&AssignSubQuery," AND prj_projects.ReviewStatus IN ('%s','%s')",
Prj_ReviewStatus_DB[Prj_UNREVIEWED],
Prj_ReviewStatus_DB[Prj_APPROVED ]) < 0)
Err_NotEnoughMemoryExit ();
break;
case (1 << Prj_UNAPPROVED | 1 << Prj_APPROVED): // Unapproved and approved projects
if (asprintf (&AssignSubQuery," AND prj_projects.ReviewStatus IN ('unapproved','approved')") < 0)
case (1 << Prj_UNAPPROVED |
1 << Prj_APPROVED): // Unapproved and approved projects
if (asprintf (&AssignSubQuery," AND prj_projects.ReviewStatus IN ('%s','%s')",
Prj_ReviewStatus_DB[Prj_UNAPPROVED],
Prj_ReviewStatus_DB[Prj_APPROVED ]) < 0)
Err_NotEnoughMemoryExit ();
break;
default: // All projects
default: // All projects
if (asprintf (&AssignSubQuery,"%s","") < 0)
Err_NotEnoughMemoryExit ();
break;
@ -525,7 +550,10 @@ unsigned Prj_DB_GetDataOfProjectByCod (MYSQL_RES **mysql_res,long PrjCod)
"Description," // row[11]
"Knowledge," // row[12]
"Materials," // row[13]
"URL" // row[14]
"URL," // row[14]
"ReviewStatus," // row[15]
"UNIX_TIMESTAMP(ReviewTime)," // row[16]
"ReviewTxt" // row[17]
" FROM prj_projects"
" WHERE PrjCod=%ld"
" AND CrsCod=%ld", // Extra check

View File

@ -2469,7 +2469,7 @@ const char *Txt_Assigned_QUESTION =
#elif L==9 // pt
"Atribu&iacute;do?";
#elif L==10 // tr
"Assigned?"; // Çeviri lazim!
"Atand&inodot; m&inodot;?";
#endif
const char *Txt_Assignment =
@ -32970,7 +32970,79 @@ const char *Txt_PROJECT_FAULTY_FAULTLESS_PROJECTS[Prj_NUM_FAULTINESS] =
#endif
};
const char *Txt_PROJECT_REVIEWED_PROJECTS[Prj_NUM_REVIEW_STATUS] =
const char *Txt_PROJECT_REVIEW_PLURAL[Prj_NUM_REVIEW_STATUS] =
{
[Prj_UNREVIEWED] =
#if L==1 // ca
"Projectes sense revisar"
#elif L==2 // de
"Ungepr&uuml;fte Projekte"
#elif L==3 // en
"Unreviewed projects"
#elif L==4 // es
"Proyectos sin revisar"
#elif L==5 // fr
"Projets non revus"
#elif L==6 // gn
"Proyectos sin revisar" // Okoteve traducción
#elif L==7 // it
"Progetti non recensiti"
#elif L==8 // pl
"Niesprawdzone projekty"
#elif L==9 // pt
"Projetos n&atilde;o revisados"
#elif L==10 // tr
"&Idot;ncelenmemi&scedil; projeler"
#endif
,
[Prj_UNAPPROVED] =
#if L==1 // ca
"Projectes sense aprovar"
#elif L==2 // de
"Nicht genehmigte Projekte"
#elif L==3 // en
"Unapproved projects"
#elif L==4 // es
"Proyectos sin aprobar"
#elif L==5 // fr
"Projets non approuv&eacute;s"
#elif L==6 // gn
"Proyectos sin aprobar" // Okoteve traducción
#elif L==7 // it
"Progetti non approvati"
#elif L==8 // pl
"Niezatwierdzone projekty"
#elif L==9 // pt
"Projetos n&atilde;o aprovados"
#elif L==10 // tr
"Onaylanmam&inodot;&scedil; projeler"
#endif
,
[Prj_APPROVED] =
#if L==1 // ca
"Projectes aprovats"
#elif L==2 // de
"Genehmigte Projekte"
#elif L==3 // en
"Approved projects"
#elif L==4 // es
"Proyectos aprobados"
#elif L==5 // fr
"Projets approuv&eacute;s"
#elif L==6 // gn
"Proyectos aprobados" // Okoteve traducción
#elif L==7 // it
"Progetti approvati"
#elif L==8 // pl
"Zatwierdzone projekty"
#elif L==9 // pt
"Projetos aprovados"
#elif L==10 // tr
"Onaylanm&inodot;&scedil; projeler"
#endif
};
const char *Txt_PROJECT_REVIEW_SINGUL[Prj_NUM_REVIEW_STATUS] =
{
[Prj_UNREVIEWED] =
#if L==1 // ca
@ -36252,6 +36324,29 @@ const char *Txt_Retype_new_password =
"Yeni &scedil;ifrenizi tekrar yaz&inodot;n&inodot;z";
#endif
const char *Txt_Review =
#if L==1 // ca
"Revisi&oacute;";
#elif L==2 // de
"&Uuml;berpr&uuml;fungs";
#elif L==3 // en
"Review";
#elif L==4 // es
"Revisi&oacute;n";
#elif L==5 // fr
"Examen";
#elif L==6 // gn
"Revisi&oacute;n"; // Okoteve traducción
#elif L==7 // it
"Revisione";
#elif L==8 // pl
"Recenzja";
#elif L==9 // pt
"Revis&atilde;o";
#elif L==10 // tr
"G&ouml;zden ge&ccedil;ir";
#endif
const char *Txt_Role =
#if L==1 // ca
"Rol";