Version 14.55

This commit is contained in:
Antonio Cañas Vargas 2015-01-14 00:32:23 +01:00
parent e3c47370f4
commit a376042ee0
14 changed files with 350 additions and 182 deletions

View File

@ -146,7 +146,6 @@ CREATE TABLE IF NOT EXISTS centres (
RequesterUsrCod INT NOT NULL DEFAULT -1,
ShortName VARCHAR(32) COLLATE latin1_spanish_ci NOT NULL,
FullName VARCHAR(127) COLLATE latin1_spanish_ci NOT NULL,
Logo VARCHAR(16) NOT NULL,
WWW VARCHAR(255) NOT NULL,
PhotoAttribution TEXT NOT NULL,
UNIQUE INDEX(CtrCod),

View File

@ -216,10 +216,11 @@ Centre:
116. ActCtrSch Search for courses, teachers, documents...
117. ActPrnCtrInf Print information on the current centre
118. ActReqCtrPho Show form to send the photo of the current centre
119. ActRecCtrPho Receive and store the photo of the current centre
120. ActChgCtrPhoAtt Change attribution of centre photo
121. ActChgCtrLog Change logo of centre
---. ActReqCtrLog Show form to send the logo of the current centre
118. ActRecCtrLog Receive and store the logo of the current centre
119. ActReqCtrPho Show form to send the photo of the current centre
120. ActRecCtrPho Receive and store the photo of the current centre
121. ActChgCtrPhoAtt Change attribution of centre photo
122. ActEdiDeg Request edition of degrees of a type
123. ActReqDeg Request the creation of a request for a new degree (a teacher makes the petition to an administrator)
@ -1358,10 +1359,11 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
/* ActCtrSch */{1183,-1,TabCtr,ActCtrReqSch ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Sch_GetParamsSearch ,Sch_CtrSearch ,NULL},
/* ActPrnCtrInf */{1152,-1,TabCtr,ActSeeCtrInf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_NEW_WINDOW ,NULL ,Ctr_PrintConfiguration ,NULL},
/* ActReqCtrPho */{1160,-1,TabCtr,ActSeeCtrInf ,0x100,0x100,0x100,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Ctr_ReqPhoto ,NULL},
/* ActReqCtrLog */{1244,-1,TabCtr,ActSeeCtrInf ,0x100,0x100,0x100,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Ctr_RequestLogo ,NULL},
/* ActRecCtrLog */{1051,-1,TabCtr,ActSeeCtrInf ,0x100,0x100,0x100,Act_CONTENT_DATA,Act_MAIN_WINDOW,NULL ,Ctr_ReceiveLogo ,NULL},
/* ActReqCtrPho */{1160,-1,TabCtr,ActSeeCtrInf ,0x100,0x100,0x100,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Ctr_RequestPhoto ,NULL},
/* ActRecCtrPho */{1161,-1,TabCtr,ActSeeCtrInf ,0x100,0x100,0x100,Act_CONTENT_DATA,Act_MAIN_WINDOW,NULL ,Ctr_ReceivePhoto ,NULL},
/* ActChgCtrPhoAtt */{1159,-1,TabCtr,ActSeeCtrInf ,0x100,0x100,0x100,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Ctr_ChangeCtrPhotoAttribution ,NULL},
/* ActChgCtrLog */{1051,-1,TabCtr,ActSeeCtrInf ,0x100,0x100,0x100,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Ctr_ChangeCtrLogo ,NULL},
/* ActEdiDeg */{ 536,-1,TabCtr,ActSeeDeg ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Deg_EditDegrees ,NULL},
/* ActReqDeg */{1206,-1,TabCtr,ActSeeDeg ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Deg_RecFormReqDeg ,NULL},
@ -3330,7 +3332,7 @@ Act_Action_t Act_FromActCodToAction[1+Act_MAX_ACTION_COD] = // Do not reuse uniq
ActChgDatBrf, // #1048
ActChgDegCtr, // #1049
-1, // #1050 (obsolete action)
ActChgCtrLog, // #1051
ActRecCtrLog, // #1051
-1, // #1052 (obsolete action)
ActReqCrs, // #1053
ActReqSignUp, // #1054
@ -3523,6 +3525,7 @@ Act_Action_t Act_FromActCodToAction[1+Act_MAX_ACTION_COD] = // Do not reuse uniq
ActNewIDOth, // #1241
ActSeeSyl, // #1242
ActChgMnu, // #1243
ActReqCtrLog, // #1244
};
/*****************************************************************************/

View File

@ -69,9 +69,9 @@ typedef enum
typedef int Act_Action_t; // Must be a signed type, because -1 is used to indicate obsolete action
#define Act_NUM_ACTIONS (7+52+15+39+22+17+204+184+94+168+28+75)
#define Act_NUM_ACTIONS (7+52+15+39+23+17+204+184+94+168+28+75)
#define Act_MAX_ACTION_COD 1243
#define Act_MAX_ACTION_COD 1244
#define Act_MAX_OPTIONS_IN_MENU_PER_TAB 20
@ -233,24 +233,25 @@ typedef int Act_Action_t; // Must be a signed type, because -1 is used to indica
// Secondary actions
#define ActCtrSch (ActRenHld+ 4)
#define ActPrnCtrInf (ActRenHld+ 5)
#define ActReqCtrPho (ActRenHld+ 6)
#define ActRecCtrPho (ActRenHld+ 7)
#define ActChgCtrPhoAtt (ActRenHld+ 8)
#define ActChgCtrLog (ActRenHld+ 9)
#define ActReqCtrLog (ActRenHld+ 6)
#define ActRecCtrLog (ActRenHld+ 7)
#define ActReqCtrPho (ActRenHld+ 8)
#define ActRecCtrPho (ActRenHld+ 9)
#define ActChgCtrPhoAtt (ActRenHld+ 10)
#define ActEdiDeg (ActRenHld+ 10)
#define ActReqDeg (ActRenHld+ 11)
#define ActNewDeg (ActRenHld+ 12)
#define ActRemDeg (ActRenHld+ 13)
#define ActRenDegSho (ActRenHld+ 14)
#define ActRenDegFul (ActRenHld+ 15)
#define ActChgDegTyp (ActRenHld+ 16)
#define ActChgDegCtr (ActRenHld+ 17)
#define ActChgDegFstYea (ActRenHld+ 18)
#define ActChgDegLstYea (ActRenHld+ 19)
#define ActChgDegOptYea (ActRenHld+ 20)
#define ActChgDegWWW (ActRenHld+ 21)
#define ActChgDegSta (ActRenHld+ 22)
#define ActEdiDeg (ActRenHld+ 11)
#define ActReqDeg (ActRenHld+ 12)
#define ActNewDeg (ActRenHld+ 13)
#define ActRemDeg (ActRenHld+ 14)
#define ActRenDegSho (ActRenHld+ 15)
#define ActRenDegFul (ActRenHld+ 16)
#define ActChgDegTyp (ActRenHld+ 17)
#define ActChgDegCtr (ActRenHld+ 18)
#define ActChgDegFstYea (ActRenHld+ 19)
#define ActChgDegLstYea (ActRenHld+ 20)
#define ActChgDegOptYea (ActRenHld+ 21)
#define ActChgDegWWW (ActRenHld+ 22)
#define ActChgDegSta (ActRenHld+ 23)
/*****************************************************************************/
/********************************* Degree tab ********************************/

View File

@ -82,6 +82,7 @@ static Ctr_Status_t Ctr_GetStatusBitsFromStatusTxt (Ctr_StatusTxt_t StatusTxt);
static void Ctr_PutParamOtherCtrCod (long CtrCod);
static void Ctr_RenameCentre (Cns_ShortOrFullName_t ShortOrFullName);
static bool Ctr_CheckIfCentreNameExistsInCurrentIns (const char *FieldName,const char *Name,long CtrCod);
static void Ctr_PutFormToChangeCtrLogo (bool LogoExists);
static void Ctr_PutFormToChangeCtrPhoto (bool PhotoExists);
static void Ctr_PutFormToCreateCentre (void);
static void Ctr_PutHeadCentresForSeeing (bool OrderSelectable);
@ -171,7 +172,7 @@ void Ctr_SeeCtrWithPendingDegs (void)
" vertical-align:middle; background-color:%s;\">"
"<a href=\"%s\" title=\"%s\" class=\"DAT\" target=\"_blank\">",
BgColor,Ctr.WWW,Ctr.FullName);
Ctr_DrawCentreLogo (Ctr.Logo,Ctr.ShortName,16,"vertical-align:top;");
Ctr_DrawCentreLogo (Ctr.CtrCod,Ctr.ShortName,16,"vertical-align:top;");
fprintf (Gbl.F.Out,"</a>"
"</td>");
@ -236,12 +237,13 @@ static void Ctr_Configuration (bool PrintView)
extern const char *The_ClassFormul[The_NUM_THEMES];
extern const char *Txt_Centre;
extern const char *Txt_Short_Name;
extern const char *Txt_Logo;
extern const char *Txt_Shortcut_to_this_centre;
extern const char *Txt_QR_code;
extern const char *Txt_Degrees;
extern const char *Txt_Courses;
extern const char *Txt_ROLES_PLURAL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
char PathLogo[PATH_MAX+1];
bool LogoExists;
char PathPhoto[PATH_MAX+1];
bool PhotoExists;
char *PhotoAttribution = NULL;
@ -249,6 +251,15 @@ static void Ctr_Configuration (bool PrintView)
if (Gbl.CurrentCtr.Ctr.CtrCod > 0)
{
/***** Path to logo *****/
sprintf (PathLogo,"%s/%s/%02u/%u/logo/%u.png",
Cfg_PATH_SWAD_PUBLIC,Cfg_FOLDER_CTR,
(unsigned) (Gbl.CurrentCtr.Ctr.CtrCod % 100),
(unsigned) Gbl.CurrentCtr.Ctr.CtrCod,
(unsigned) Gbl.CurrentCtr.Ctr.CtrCod);
LogoExists = Fil_CheckIfPathExists (PathLogo);
/***** Path to photo *****/
sprintf (PathPhoto,"%s/%s/%02u/%u/%u.jpg",
Cfg_PATH_SWAD_PUBLIC,Cfg_FOLDER_CTR,
(unsigned) (Gbl.CurrentCtr.Ctr.CtrCod % 100),
@ -266,8 +277,11 @@ static void Ctr_Configuration (bool PrintView)
Lay_PutLinkToPrintView2 ();
/* Link to upload photo */
if (Gbl.Usrs.Me.LoggedRole == Rol_ROLE_SUPERUSER)
if (Gbl.Usrs.Me.LoggedRole >= Rol_ROLE_CTR_ADMIN)
{
Ctr_PutFormToChangeCtrLogo (LogoExists);
Ctr_PutFormToChangeCtrPhoto (PhotoExists);
}
fprintf (Gbl.F.Out,"</div>");
}
@ -284,7 +298,7 @@ static void Ctr_Configuration (bool PrintView)
" class=\"TITLE_LOCATION\" title=\"%s\">",
Gbl.CurrentCtr.Ctr.WWW,
Gbl.CurrentCtr.Ctr.FullName);
Ctr_DrawCentreLogo (Gbl.CurrentCtr.Ctr.Logo,
Ctr_DrawCentreLogo (Gbl.CurrentCtr.Ctr.CtrCod,
Gbl.CurrentCtr.Ctr.ShortName,
64,NULL);
fprintf (Gbl.F.Out,"<br />%s",Gbl.CurrentCtr.Ctr.FullName);
@ -382,28 +396,6 @@ static void Ctr_Configuration (bool PrintView)
Txt_Short_Name,
Gbl.CurrentCtr.Ctr.ShortName);
/***** Centre logo *****/
if (Gbl.Usrs.Me.LoggedRole == Rol_ROLE_SUPERUSER)
{
fprintf (Gbl.F.Out,"<tr>"
"<td class=\"%s\" style=\"text-align:right;"
" vertical-align:middle;\">"
"%s:"
"</td>"
"<td style=\"text-align:left;"
" vertical-align:middle;\">",
The_ClassFormul[Gbl.Prefs.Theme],
Txt_Logo);
Act_FormStart (ActChgCtrLog);
fprintf (Gbl.F.Out,"<input type=\"text\" name=\"Logo\" size=\"4\" maxlength=\"%u\" value=\"%s\""
" onchange=\"javascript:document.getElementById('%s').submit();\" />"
"</form>"
"</td>"
"</tr>",
Ctr_MAX_LENGTH_CENTRE_LOGO,Gbl.CurrentCtr.Ctr.Logo,
Gbl.FormId);
}
/***** Link to the centre *****/
fprintf (Gbl.F.Out,"<tr>"
"<td class=\"%s\""
@ -560,7 +552,7 @@ static void Ctr_ListCentresForSeeing (void)
/***** Write heading *****/
sprintf (Gbl.Title,Txt_Centres_of_INSTITUTION_X,
Gbl.CurrentIns.Ins.ShortName);
Gbl.CurrentIns.Ins.FullName);
Lay_StartRoundFrameTable10 (NULL,2,Gbl.Title);
Ctr_PutHeadCentresForSeeing (true); // Order selectable
@ -612,7 +604,7 @@ static void Ctr_ListOneCentreForSeeing (struct Centre *Ctr,unsigned NumCtr)
"<a href=\"%s\" title=\"%s\" class=\"DAT\" target=\"_blank\">",
TxtClass,BgColor,
Ctr->WWW,Ctr->FullName);
Ctr_DrawCentreLogo (Ctr->Logo,Ctr->ShortName,16,"vertical-align:top;");
Ctr_DrawCentreLogo (Ctr->CtrCod,Ctr->ShortName,16,"vertical-align:top;");
fprintf (Gbl.F.Out,"</a>"
"</td>");
@ -759,7 +751,7 @@ void Ctr_GetListCentres (long InsCod)
if (InsCod > 0) // Only the centres of the specified institution
sprintf (Query,"(SELECT centres.CtrCod,centres.InsCod,centres.PlcCod,"
"centres.Status,centres.RequesterUsrCod,"
"centres.ShortName,centres.FullName,centres.logo,centres.WWW,"
"centres.ShortName,centres.FullName,centres.WWW,"
"COUNT(DISTINCT usr_data.UsrCod) AS NumTchs"
" FROM centres,usr_data,crs_usr"
" WHERE centres.InsCod='%ld' AND crs_usr.Role='%u'"
@ -767,7 +759,7 @@ void Ctr_GetListCentres (long InsCod)
" GROUP BY centres.CtrCod)"
" UNION "
"(SELECT CtrCod,InsCod,PlcCod,Status,RequesterUsrCod,"
"ShortName,FullName,Logo,WWW,0 AS NumTchs"
"ShortName,FullName,WWW,0 AS NumTchs"
" FROM centres"
" WHERE centres.InsCod='%ld' AND CtrCod NOT IN"
" (SELECT DISTINCT usr_data.CtrCod FROM usr_data,crs_usr"
@ -782,7 +774,7 @@ void Ctr_GetListCentres (long InsCod)
else // InsCod <= 0 ==> all the centres
sprintf (Query,"(SELECT centres.CtrCod,centres.InsCod,centres.PlcCod,"
"centres.Status,centres.RequesterUsrCod,"
"centres.ShortName,centres.FullName,centres.Logo,centres.WWW,"
"centres.ShortName,centres.FullName,centres.WWW,"
"COUNT(DISTINCT usr_data.UsrCod) AS NumTchs"
" FROM centres,usr_data,crs_usr"
" WHERE crs_usr.Role='%u'"
@ -790,7 +782,7 @@ void Ctr_GetListCentres (long InsCod)
" GROUP BY centres.CtrCod)"
" UNION "
"(SELECT CtrCod,InsCod,PlcCod,Status,RequesterUsrCod,"
"ShortName,FullName,Logo,WWW,0 AS NumTchs"
"ShortName,FullName,WWW,0 AS NumTchs"
" FROM centres"
" WHERE CtrCod NOT IN"
" (SELECT DISTINCT usr_data.CtrCod FROM usr_data,crs_usr"
@ -844,14 +836,11 @@ void Ctr_GetListCentres (long InsCod)
/* Get the full name of the centre (row[6]) */
strcpy (Ctr->FullName,row[6]);
/* Get the logo of the centre (row[7]) */
strcpy (Ctr->Logo,row[7]);
/* Get the URL of the centre (row[7]) */
strcpy (Ctr->WWW,row[7]);
/* Get the URL of the centre (row[8]) */
strcpy (Ctr->WWW,row[8]);
/* Get number of teachers in this centre (row[9]) */
if (sscanf (row[9],"%u",&Ctr->NumTchs) != 1)
/* Get number of teachers in this centre (row[8]) */
if (sscanf (row[8],"%u",&Ctr->NumTchs) != 1)
Ctr->NumTchs = 0;
/* Count number of degrees in this centre */
@ -883,7 +872,6 @@ bool Ctr_GetDataOfCentreByCod (struct Centre *Ctr)
Ctr->RequesterUsrCod = -1L;
Ctr->ShortName[0] = '\0';
Ctr->FullName[0] = '\0';
Ctr->Logo[0] = '\0';
Ctr->WWW[0] = '\0';
Ctr->NumDegs = 0;
Ctr->NumTchs = 0;
@ -893,13 +881,13 @@ bool Ctr_GetDataOfCentreByCod (struct Centre *Ctr)
{
/***** Get data of a centre from database *****/
sprintf (Query,"(SELECT centres.InsCod,centres.PlcCod,centres.Status,centres.RequesterUsrCod,centres.ShortName,centres.FullName,"
"centres.Logo,centres.WWW,COUNT(DISTINCT usr_data.UsrCod) AS NumTchs"
"centres.WWW,COUNT(DISTINCT usr_data.UsrCod) AS NumTchs"
" FROM centres,usr_data,crs_usr"
" WHERE centres.CtrCod='%ld'"
" AND centres.CtrCod=usr_data.CtrCod AND usr_data.UsrCod=crs_usr.UsrCod AND crs_usr.Role='%u'"
" GROUP BY centres.CtrCod)"
" UNION "
"(SELECT InsCod,PlcCod,Status,RequesterUsrCod,ShortName,FullName,Logo,WWW,0 AS NumTchs"
"(SELECT InsCod,PlcCod,Status,RequesterUsrCod,ShortName,FullName,WWW,0 AS NumTchs"
" FROM centres"
" WHERE CtrCod='%ld' AND CtrCod NOT IN"
" (SELECT DISTINCT usr_data.CtrCod FROM usr_data,crs_usr"
@ -933,14 +921,11 @@ bool Ctr_GetDataOfCentreByCod (struct Centre *Ctr)
/* Get the full name of the centre (row[5]) */
strcpy (Ctr->FullName,row[5]);
/* Get the logo of the centre (row[6]) */
strcpy (Ctr->Logo,row[6]);
/* Get the URL of the centre (row[6]) */
strcpy (Ctr->WWW,row[6]);
/* Get the URL of the centre (row[7]) */
strcpy (Ctr->WWW,row[7]);
/* Get number of teachers in this centre (row[8]) */
if (sscanf (row[8],"%u",&Ctr->NumTchs) != 1)
/* Get number of teachers in this centre (row[7]) */
if (sscanf (row[7],"%u",&Ctr->NumTchs) != 1)
Ctr->NumTchs = 0;
/* Count number of degrees in this centre */
@ -1114,7 +1099,7 @@ static void Ctr_ListCentresForEdition (void)
/***** Write heading *****/
sprintf (Gbl.Title,Txt_Centres_of_INSTITUTION_X,
Gbl.CurrentIns.Ins.ShortName);
Gbl.CurrentIns.Ins.FullName);
Lay_StartRoundFrameTable10 (NULL,2,Gbl.Title);
Ctr_PutHeadCentresForEdition ();
@ -1158,11 +1143,11 @@ static void Ctr_ListCentresForEdition (void)
"</td>",
Ctr->CtrCod);
/* Institution logo */
/* Centre logo */
fprintf (Gbl.F.Out,"<td title=\"%s\""
" style=\"width:20px; text-align:left;\">",
Ctr->FullName);
Ctr_DrawCentreLogo (Ctr->Logo,Ctr->ShortName,16,NULL);
Ctr_DrawCentreLogo (Ctr->CtrCod,Ctr->ShortName,16,NULL);
fprintf (Gbl.F.Out,"</td>");
/* Institution */
@ -1648,31 +1633,6 @@ static bool Ctr_CheckIfCentreNameExistsInCurrentIns (const char *FieldName,const
return (DB_QueryCOUNT (Query,"can not check if the name of a centre already existed") != 0);
}
/*****************************************************************************/
/************************ Change the logo of a centre ************************/
/*****************************************************************************/
void Ctr_ChangeCtrLogo (void)
{
extern const char *Txt_The_new_logo_is_X;
char Query[256+Ctr_MAX_LENGTH_CENTRE_LOGO];
/***** Get the new logo for the centre from form *****/
Par_GetParToText ("Logo",Gbl.CurrentCtr.Ctr.Logo,Ctr_MAX_LENGTH_CENTRE_LOGO);
/***** Update the table changing old logo by new logo *****/
sprintf (Query,"UPDATE centres SET Logo='%s' WHERE CtrCod='%ld'",
Gbl.CurrentCtr.Ctr.Logo,Gbl.CurrentCtr.Ctr.CtrCod);
DB_QueryUPDATE (Query,"can not update the logo of the centre");
/***** Write message to show the change made *****/
sprintf (Gbl.Message,Txt_The_new_logo_is_X,Gbl.CurrentCtr.Ctr.Logo);
Lay_ShowAlert (Lay_SUCCESS,Gbl.Message);
/***** Show the form again *****/
Ctr_ShowConfiguration ();
}
/*****************************************************************************/
/************************* Change the URL of a centre ************************/
/*****************************************************************************/
@ -1765,6 +1725,131 @@ void Ctr_ChangeCtrStatus (void)
Ctr_EditCentres ();
}
/*****************************************************************************/
/********* Put a link to the action used to request logo of centre ***********/
/*****************************************************************************/
static void Ctr_PutFormToChangeCtrLogo (bool LogoExists)
{
extern const char *The_ClassFormul[The_NUM_THEMES];
extern const char *Txt_Change_logo;
extern const char *Txt_Upload_logo;
const char *Msg;
/***** Link for changing / uploading the photo *****/
Act_FormStart (ActReqCtrLog);
Msg = LogoExists ? Txt_Change_logo :
Txt_Upload_logo;
Act_LinkFormSubmit (Msg,The_ClassFormul[Gbl.Prefs.Theme]);
Lay_PutSendIcon ("ctr",Msg,Msg);
fprintf (Gbl.F.Out,"</form>");
}
/*****************************************************************************/
/*********** Show a form for sending a logo of the current centre ************/
/*****************************************************************************/
void Ctr_RequestLogo (void)
{
extern const char *The_ClassFormul[The_NUM_THEMES];
extern const char *Txt_You_can_send_a_file_with_an_image_in_png_format_transparent_background_and_size_X_Y;
extern const char *Txt_File_with_the_logo;
extern const char *Txt_Upload_logo;
/***** Write help message *****/
sprintf (Gbl.Message,Txt_You_can_send_a_file_with_an_image_in_png_format_transparent_background_and_size_X_Y,
64,64);
Lay_ShowAlert (Lay_INFO,Gbl.Message);
/***** Write a form to send logo *****/
Act_FormStart (ActRecCtrLog);
fprintf (Gbl.F.Out,"<table style=\"margin:0 auto;\">"
"<tr>"
"<td class=\"%s\" style=\"text-align:right;\">"
"%s:"
"</td>"
"<td style=\"text-align:left;\">"
"<input type=\"file\" name=\"%s\" size=\"40\" maxlength=\"100\" value=\"\" />"
"</td>"
"</tr>"
"<tr>"
"<td colspan=\"2\" style=\"text-align:center;\">"
"<input type=\"submit\" value=\"%s\" accept=\"image/jpeg\" />"
"</td>"
"</tr>"
"</table>"
"</form>",
The_ClassFormul[Gbl.Prefs.Theme],
Txt_File_with_the_logo,
Fil_NAME_OF_PARAM_FILENAME_ORG,
Txt_Upload_logo);
}
/*****************************************************************************/
/****************** Receive a photo of the current centre ********************/
/*****************************************************************************/
void Ctr_ReceiveLogo (void)
{
extern const char *Txt_The_file_is_not_X;
char Path[PATH_MAX+1];
char FileNameLogoSrc[PATH_MAX+1];
char MIMEType[Brw_MAX_BYTES_MIME_TYPE+1];
char FileNameLogo[PATH_MAX+1]; // Full name (including path and .png) of the destination file
bool WrongType = false;
/***** Creates directories if not exist *****/
sprintf (Path,"%s/%s",
Cfg_PATH_SWAD_PUBLIC,Cfg_FOLDER_CTR);
Fil_CreateDirIfNotExists (Path);
sprintf (Path,"%s/%s/%02u",
Cfg_PATH_SWAD_PUBLIC,Cfg_FOLDER_CTR,
(unsigned) (Gbl.CurrentCtr.Ctr.CtrCod % 100));
Fil_CreateDirIfNotExists (Path);
sprintf (Path,"%s/%s/%02u/%u",
Cfg_PATH_SWAD_PUBLIC,Cfg_FOLDER_CTR,
(unsigned) (Gbl.CurrentCtr.Ctr.CtrCod % 100),
(unsigned) Gbl.CurrentCtr.Ctr.CtrCod);
Fil_CreateDirIfNotExists (Path);
sprintf (Path,"%s/%s/%02u/%u/logo",
Cfg_PATH_SWAD_PUBLIC,Cfg_FOLDER_CTR,
(unsigned) (Gbl.CurrentCtr.Ctr.CtrCod % 100),
(unsigned) Gbl.CurrentCtr.Ctr.CtrCod);
Fil_CreateDirIfNotExists (Path);
/***** Copy in disk the file received from stdin (really from Gbl.F.Tmp) *****/
Fil_StartReceptionOfFile (FileNameLogoSrc,MIMEType);
/* Check if the file type is image/jpeg or image/pjpeg or application/octet-stream */
if (strcmp (MIMEType,"image/png"))
if (strcmp (MIMEType,"image/x-png"))
if (strcmp (MIMEType,"application/octet-stream"))
if (strcmp (MIMEType,"application/octetstream"))
if (strcmp (MIMEType,"application/octet"))
WrongType = true;
if (WrongType)
{
sprintf (Gbl.Message,Txt_The_file_is_not_X,"png");
Lay_ShowAlert (Lay_WARNING,Gbl.Message);
return;
}
/* End the reception of logo in a temporary file */
sprintf (FileNameLogo,"%s/%s/%02u/%u/logo/%u.png",
Cfg_PATH_SWAD_PUBLIC,Cfg_FOLDER_CTR,
(unsigned) (Gbl.CurrentCtr.Ctr.CtrCod % 100),
(unsigned) Gbl.CurrentCtr.Ctr.CtrCod,
(unsigned) Gbl.CurrentCtr.Ctr.CtrCod);
if (!Fil_EndReceptionOfFile (FileNameLogo))
{
Lay_ShowAlert (Lay_WARNING,"Error uploading file.");
return;
}
/***** Show the centre information again *****/
Ctr_ShowConfiguration ();
}
/*****************************************************************************/
/******** Put a link to the action used to request photo of centre ***********/
/*****************************************************************************/
@ -1789,7 +1874,7 @@ static void Ctr_PutFormToChangeCtrPhoto (bool PhotoExists)
/*********** Show a form for sending a photo of the current centre ***********/
/*****************************************************************************/
void Ctr_ReqPhoto (void)
void Ctr_RequestPhoto (void)
{
extern const char *The_ClassFormul[The_NUM_THEMES];
extern const char *Txt_You_can_send_a_file_with_an_image_in_jpg_format_and_size_X_Y;
@ -1832,7 +1917,7 @@ void Ctr_ReqPhoto (void)
void Ctr_ReceivePhoto (void)
{
extern const char *Txt_The_file_is_not_jpg;
extern const char *Txt_The_file_is_not_X;
char Path[PATH_MAX+1];
char FileNamePhotoSrc[PATH_MAX+1];
char MIMEType[Brw_MAX_BYTES_MIME_TYPE+1];
@ -1865,7 +1950,8 @@ void Ctr_ReceivePhoto (void)
WrongType = true;
if (WrongType)
{
Lay_ShowAlert (Lay_WARNING,Txt_The_file_is_not_jpg);
sprintf (Gbl.Message,Txt_The_file_is_not_X,"jpg");
Lay_ShowAlert (Lay_WARNING,Gbl.Message);
return;
}
@ -1877,7 +1963,7 @@ void Ctr_ReceivePhoto (void)
(unsigned) Gbl.CurrentCtr.Ctr.CtrCod);
if (!Fil_EndReceptionOfFile (FileNamePhoto))
{
Lay_ShowAlert (Lay_WARNING,Gbl.Message);
Lay_ShowAlert (Lay_WARNING,"Error uploading file.");
return;
}
@ -1953,7 +2039,7 @@ static void Ctr_PutFormToCreateCentre (void)
/***** Centre logo *****/
fprintf (Gbl.F.Out,"<td style=\"width:20px; text-align:left;\">");
Ctr_DrawCentreLogo (NULL,"",16,NULL);
Ctr_DrawCentreLogo (-1L,"",16,NULL);
fprintf (Gbl.F.Out,"</td>");
/***** Institution *****/
@ -2231,7 +2317,7 @@ static void Ctr_RecFormRequestOrCreateCtr (unsigned Status)
else // Add new centre to database
Ctr_CreateCentre (Ctr,Status);
}
else // If there is not a centre logo or web
else // If there is not a web
{
sprintf (Gbl.Message,"%s",Txt_You_must_specify_the_web_address_of_the_new_centre);
Lay_ShowAlert (Lay_WARNING,Gbl.Message);
@ -2258,9 +2344,9 @@ static void Ctr_CreateCentre (struct Centre *Ctr,unsigned Status)
/***** Create a new centre *****/
sprintf (Query,"INSERT INTO centres (InsCod,PlcCod,Status,RequesterUsrCod,"
"ShortName,FullName,Logo,WWW)"
"ShortName,FullName,WWW)"
" VALUES ('%ld','%ld','%u','%ld',"
"'%s','%s','','%s')",
"'%s','%s','%s')",
Ctr->InsCod,Ctr->PlcCod,
Status,
Gbl.Usrs.Me.UsrDat.UsrCod,
@ -2391,33 +2477,37 @@ unsigned Ctr_GetNumCtrsWithUsrs (Rol_Role_t Role,const char *SubQuery)
/****************************** Draw centre logo *****************************/
/*****************************************************************************/
void Ctr_DrawCentreLogo (const char *Logo,const char *AltText,
void Ctr_DrawCentreLogo (long CtrCod,const char *AltText,
unsigned Size,const char *Style)
{
char PathLogo[PATH_MAX+1];
bool LogoExists = false;
bool LogoExists;
/***** Path to logo *****/
if (Logo)
if (Logo[0])
{
sprintf (PathLogo,"%s/%s/%s/%s64x64.gif",
Cfg_PATH_SWAD_PUBLIC,
Cfg_FOLDER_PUBLIC_ICON,
Cfg_ICON_FOLDER_CENTRES,
Logo);
LogoExists = Fil_CheckIfPathExists (PathLogo);
}
if (CtrCod > 0)
{
sprintf (PathLogo,"%s/%s/%02u/%u/logo/%u.png",
Cfg_PATH_SWAD_PUBLIC,Cfg_FOLDER_CTR,
(unsigned) (CtrCod % 100),
(unsigned) CtrCod,
(unsigned) CtrCod);
LogoExists = Fil_CheckIfPathExists (PathLogo);
}
else
LogoExists = false;
/***** Draw logo *****/
fprintf (Gbl.F.Out,"<img src=\"");
if (LogoExists)
fprintf (Gbl.F.Out,"%s/%s/%s",
Gbl.Prefs.IconsURL,Cfg_ICON_FOLDER_CENTRES,Logo);
fprintf (Gbl.F.Out,"%s/%s/%02u/%u/logo/%u.png",
Cfg_HTTPS_URL_SWAD_PUBLIC,Cfg_FOLDER_CTR,
(unsigned) (CtrCod % 100),
(unsigned) CtrCod,
(unsigned) CtrCod);
else
fprintf (Gbl.F.Out,"%s/ctr",
fprintf (Gbl.F.Out,"%s/ctr64x64.gif",
Gbl.Prefs.IconsURL);
fprintf (Gbl.F.Out,"64x64.gif\" alt=\"%s\" class=\"ICON%ux%u\"",
fprintf (Gbl.F.Out,"\" alt=\"%s\" class=\"ICON%ux%u\"",
AltText,Size,Size);
if (Style)
if (Style[0])

View File

@ -55,7 +55,6 @@ typedef enum
#define Ctr_MAX_LENGTH_CENTRE_SHORT_NAME 32
#define Ctr_MAX_LENGTH_CENTRE_FULL_NAME 127
#define Ctr_MAX_LENGTH_CENTRE_LOGO 16
#define Ctr_MAX_LENGTH_PHOTO_ATTRIBUTION (4*1024)
struct Centre
@ -67,7 +66,6 @@ struct Centre
long RequesterUsrCod; // User code of the person who requested the creation of this centre
char ShortName[Ctr_MAX_LENGTH_CENTRE_SHORT_NAME+1];
char FullName[Ctr_MAX_LENGTH_CENTRE_FULL_NAME+1];
char Logo[Ctr_MAX_LENGTH_CENTRE_LOGO+1];
char WWW[Cns_MAX_LENGTH_WWW+1];
unsigned NumDegs; // Number of degrees in this centre
unsigned NumTchs; // Number of teachers in this centre
@ -103,10 +101,11 @@ void Ctr_ChangeCentreIns (void);
void Ctr_ChangeCentrePlace (void);
void Ctr_RenameCentreShort (void);
void Ctr_RenameCentreFull (void);
void Ctr_ChangeCtrLogo (void);
void Ctr_ChangeCtrWWW (void);
void Ctr_ChangeCtrStatus (void);
void Ctr_ReqPhoto (void);
void Ctr_RequestLogo (void);
void Ctr_ReceiveLogo (void);
void Ctr_RequestPhoto (void);
void Ctr_ReceivePhoto (void);
void Ctr_ChangeCtrPhotoAttribution (void);
void Ctr_RecFormReqCtr (void);
@ -120,7 +119,7 @@ unsigned Ctr_GetNumCtrsWithDegs (const char *SubQuery);
unsigned Ctr_GetNumCtrsWithCrss (const char *SubQuery);
unsigned Ctr_GetNumCtrsWithUsrs (Rol_Role_t Role,const char *SubQuery);
void Ctr_DrawCentreLogo (const char *Logo,const char *AltText,
void Ctr_DrawCentreLogo (long CtrCod,const char *AltText,
unsigned Size,const char *Style);
unsigned Ctr_ListCtrsFound (const char *Query);

View File

@ -39,11 +39,17 @@
/****************************** Public constants *****************************/
/*****************************************************************************/
#define Log_PLATFORM_VERSION "SWAD 14.54.7 (2015/01/13)"
#define Log_PLATFORM_VERSION "SWAD 14.55 (2015/01/14)"
// Number of lines (includes comments but not blank lines) has been got with the following command:
// nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*.h | tail -1
/*
Version 14.55 : Jan 14, 2015 New option to upload logo of a centre. (173509 lines)
3 changes necessary in database:
UPDATE actions SET Txt='Enviar logo del centro' WHERE ActCod='1051' AND Language='es';
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1244','es','N','Solicitar env&iacute;o de foto del centro');
ALTER TABLE centres DROP COLUMN Logo;
Version 14.54.7: Jan 13, 2015 Fixed bug in edition of centres. (173349 lines)
Version 14.54.6: Jan 13, 2015 Tab and menu icons always in 64x64 pixels. (173348 lines)
Version 14.54.5: Jan 13, 2015 Icons for institutions, centres and degrees always in 64x64 pixels. (173346 lines)

View File

@ -271,9 +271,6 @@
#define Cfg_ABOUT_SWAD_URL "http://openswad.org/info/"
#define Cfg_HOW_TO_COLLABORATE_URL "http://swad.ugr.es/wiki/index.php/Colaborar"
/* Link to nettiquete rules for messages */
// #define Cfg_NETTIQUETE "http://swad.ugr.es/wiki/index.php/Netiquette"
/* Link to download Java: keep updated! */
#define Cfg_JAVA_URL "http://www.java.com/es/download/"
#define Cfg_JAVA_NAME "Java Runtime Environment"
@ -397,7 +394,6 @@
#define Cfg_ICON_FOLDER_ICON_SETS "iconset" // Directory with all the icons for each icon set
#define Cfg_ICON_FOLDER_COUNTRIES "country" // Directory with icons for countries
#define Cfg_ICON_FOLDER_INSTITUTIONS "institution" // Directory with icons for institutions
#define Cfg_ICON_FOLDER_CENTRES "centre" // Directory with icons for centres
#define Cfg_ICON_FOLDER_DEGREES "degree" // Directory with icons for degrees
#define Cfg_ICON_FOLDER_FILEXT "filext" // Directory with icons for file extensions
#define Cfg_ICON_FOLDER_PLUGINS "plugin" // Directory with icons for plugins

View File

@ -701,7 +701,7 @@ static void Crs_WriteListMyCoursesToSelectOne (void)
Ctr_PutParamCtrCod (Ctr.CtrCod);
Act_LinkFormSubmit (Act_GetActionTextFromDB (Act_Actions[ActSeeCtrInf].ActCod,ActTxt),
The_ClassFormul[Gbl.Prefs.Theme]);
Ctr_DrawCentreLogo (Ctr.Logo,Ctr.ShortName,16,"vertical-align:middle;");
Ctr_DrawCentreLogo (Ctr.CtrCod,Ctr.ShortName,16,"vertical-align:middle;");
Highlight = (Gbl.CurrentDeg.Deg.DegCod <= 0 &&
Gbl.CurrentCtr.Ctr.CtrCod == Ctr.CtrCod);
if (Highlight)

View File

@ -378,11 +378,10 @@ mysql> DESCRIBE centres;
| RequesterUsrCod | int(11) | NO | | -1 | |
| ShortName | varchar(32) | NO | | NULL | |
| FullName | varchar(127) | NO | | NULL | |
| Logo | varchar(16) | NO | | NULL | |
| WWW | varchar(255) | NO | | NULL | |
| PhotoAttribution | text | NO | | NULL | |
+------------------+--------------+------+-----+---------+----------------+
10 rows in set (0.01 sec)
9 rows in set (0.00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS centres ("
"CtrCod INT NOT NULL AUTO_INCREMENT,"
@ -392,7 +391,6 @@ mysql> DESCRIBE centres;
"RequesterUsrCod INT NOT NULL DEFAULT -1,"
"ShortName VARCHAR(32) COLLATE latin1_spanish_ci NOT NULL,"
"FullName VARCHAR(127) COLLATE latin1_spanish_ci NOT NULL,"
"Logo VARCHAR(16) NOT NULL,"
"WWW VARCHAR(255) NOT NULL,"
"PhotoAttribution TEXT NOT NULL,"
"UNIQUE INDEX(CtrCod),INDEX(InsCod),INDEX(PlcCod),INDEX(Status))");

View File

@ -2150,7 +2150,7 @@ static void For_WriteLinkToForum (For_ForumType_t ForumType,Act_Action_t NextAct
break;
case For_FORUM_CENTRE_USRS:
case For_FORUM_CENTRE_TCHS:
Ctr_DrawCentreLogo (Gbl.Forum.Ctr.Logo,ForumName,16,"vertical-align:middle;");
Ctr_DrawCentreLogo (Gbl.Forum.Ctr.CtrCod,ForumName,16,"vertical-align:middle;");
break;
case For_FORUM_DEGREE_USRS:
case For_FORUM_DEGREE_TCHS:

View File

@ -1949,7 +1949,7 @@ void Inf_ReceivePagInfo (void)
FileIsOK = true;
}
else
Lay_ShowAlert (Lay_WARNING,Gbl.Message);
Lay_ShowAlert (Lay_WARNING,"Error uploading file.");
}
else if (Str_FileIs (SourceFileName,"zip")) // .zip file
{
@ -1989,7 +1989,7 @@ void Inf_ReceivePagInfo (void)
Lay_ShowErrorAndExit ("Can not unzip file.");
}
else
Lay_ShowAlert (Lay_WARNING,Gbl.Message);
Lay_ShowAlert (Lay_WARNING,"Error uploading file.");
}
else
Lay_ShowAlert (Lay_WARNING,Txt_The_file_type_should_be_HTML_or_ZIP);

View File

@ -385,7 +385,7 @@ void Pho_RemoveUsrPhoto (void)
void Pho_ReceivePhotoAndDetectFaces (bool ItsMe,const struct UsrData *UsrDat)
{
extern const char *Txt_The_file_is_not_jpg;
extern const char *Txt_The_file_is_not_X;
extern const char *Txt_Could_not_detect_any_face_in_front_position_;
extern const char *Txt_A_face_marked_in_green_has_been_detected_;
extern const char *Txt_A_face_marked_in_red_has_been_detected_;
@ -450,7 +450,8 @@ void Pho_ReceivePhotoAndDetectFaces (bool ItsMe,const struct UsrData *UsrDat)
WrongType = true;
if (WrongType)
{
Lay_ShowAlert (Lay_WARNING,Txt_The_file_is_not_jpg);
sprintf (Gbl.Message,Txt_The_file_is_not_X,"jpg");
Lay_ShowAlert (Lay_WARNING,Gbl.Message);
return;
}
@ -460,7 +461,7 @@ void Pho_ReceivePhotoAndDetectFaces (bool ItsMe,const struct UsrData *UsrDat)
Cfg_FOLDER_PHOTO_TMP,Gbl.UniqueNameEncrypted);
if (!Fil_EndReceptionOfFile (FileNamePhotoTmp))
{
Lay_ShowAlert (Lay_WARNING,Gbl.Message);
Lay_ShowAlert (Lay_WARNING,"Error uploading file.");
return;
}

View File

@ -386,7 +386,7 @@ static void TsI_WriteAnswersOfAQstXML (long QstCod)
void TsI_ImportQstsFromXML (void)
{
extern const char *Txt_The_file_is_not_xml;
extern const char *Txt_The_file_is_not_X;
char PathTestPriv[PATH_MAX+1];
char FileNameXMLSrc[PATH_MAX+1];
char FileNameXMLTmp[PATH_MAX+1]; // Full name (including path and .xml) of the destination temporary file
@ -420,10 +420,13 @@ void TsI_ImportQstsFromXML (void)
/***** Get questions from XML file and store them in database *****/
TsI_ReadQuestionsFromXMLFileAndStoreInDB (FileNameXMLTmp);
else
Lay_ShowAlert (Lay_WARNING,Gbl.Message);
Lay_ShowAlert (Lay_WARNING,"Error uploading file.");
}
else
Lay_ShowAlert (Lay_WARNING,Txt_The_file_is_not_xml);
{
sprintf (Gbl.Message,Txt_The_file_is_not_X,"xml");
Lay_ShowAlert (Lay_WARNING,Gbl.Message);
}
}
/*****************************************************************************/

View File

@ -3996,6 +3996,27 @@ const char *Txt_Change_IDs =
"Alterar n&ordm;s. identif.";
#endif
const char *Txt_Change_logo =
#if L==0
"Canviar logo";
#elif L==1
"Logo &auml;ndern";
#elif L==2
"Change logo";
#elif L==3
"Cambiar logo";
#elif L==4
"Changer logo";
#elif L==5
"Cambiar logo"; // Okoteve traducción
#elif L==6
"Cambiare logo";
#elif L==7
"Zmie&nacute; logo";
#elif L==8
"Alterar logotipo";
#endif
const char *Txt_Change_my_groups =
#if L==0
"Canviar de grups";
@ -10730,6 +10751,27 @@ const char *Txt_FILE_UPLOAD_Done =
"Terminar";
#endif
const char *Txt_File_with_the_logo =
#if L==0
"Fitxer amb el logo";
#elif L==1
"Datei mit dem Logo";
#elif L==2
"File with the logo";
#elif L==3
"Archivo con el logo";
#elif L==4
"Fichier avec le logo";
#elif L==5
"Archivo con el logo"; // Okoteve traducción
#elif L==6
"File con il logo";
#elif L==7
"Plik ze logo";
#elif L==8
"Arquivo com o logotipo";
#endif
const char *Txt_File_with_the_photo =
#if L==0
"Fitxer amb la foto";
@ -38127,46 +38169,25 @@ const char *Txt_The_file_X_has_been_placed_inside_the_folder_Y = // Warning: it
" dentro do diret&oacute;rio <strong>%s</strong>.";
#endif
const char *Txt_The_file_is_not_jpg =
const char *Txt_The_file_is_not_X = // Warning: it is very important to include %s in the following sentences
#if L==0
"El archivo no es <em>jpg</em>."; // Necessita traduccio
"El archivo no es <em>%s</em>."; // Necessita traduccio
#elif L==1
"The file is not <em>jpg</em>."; // Need Übersetzung
"The file is not <em>%s</em>."; // Need Übersetzung
#elif L==2
"The file is not <em>jpg</em>.";
"The file is not <em>%s</em>.";
#elif L==3
"El archivo no es <em>jpg</em>.";
"El archivo no es <em>%s</em>.";
#elif L==4
"The file is not <em>jpg</em>."; // Besoin de traduction
"The file is not <em>%s</em>."; // Besoin de traduction
#elif L==5
"El archivo no es <em>jpg</em>."; // Okoteve traducción
"El archivo no es <em>%s</em>."; // Okoteve traducción
#elif L==6
"IL file non &egrave; <em>jpg</em>.";
"IL file non &egrave; <em>%s</em>.";
#elif L==7
"The file is not <em>jpg</em>."; // Potrzebujesz tlumaczenie
"The file is not <em>%s</em>."; // Potrzebujesz tlumaczenie
#elif L==8
"The file is not <em>jpg</em>."; // Necessita de tradução
#endif
const char *Txt_The_file_is_not_xml =
#if L==0
"El archivo no es <em>xml</em>."; // Necessita traduccio
#elif L==1
"The file is not <em>xml</em>."; // Need Übersetzung
#elif L==2
"The file is not <em>xml</em>.";
#elif L==3
"El archivo no es <em>xml</em>.";
#elif L==4
"The file is not <em>xml</em>."; // Besoin de traduction
#elif L==5
"El archivo no es <em>xml</em>."; // Okoteve traducción
#elif L==6
"IL file non &egrave; <em>xml</em>.";
#elif L==7
"The file is not <em>xml</em>."; // Potrzebujesz tlumaczenie
#elif L==8
"The file is not <em>xml</em>."; // Necessita de tradução
"The file is not <em>%s</em>."; // Necessita de tradução
#endif
const char *Txt_The_file_of_folder_no_longer_exists_or_is_now_hidden =
@ -45238,6 +45259,27 @@ const char *Txt_Upload_files_QUESTION =
"Fazer upload<br />de arquivos?";
#endif
const char *Txt_Upload_logo =
#if L==0
"Enviar logo";
#elif L==1
"Upload Logo";
#elif L==2
"Upload logo";
#elif L==3
"Subir logo";
#elif L==4
"T&eacute;l&eacute;charger logo";
#elif L==5
"Subir logo"; // Okoteve traducción
#elif L==6
"Caricare logo";
#elif L==7
"Upload logo"; // Potrzebujesz tlumaczenie
#elif L==8
"Fazer upload de logotipo";
#endif
const char *Txt_Upload_photo =
#if L==0
"Enviar foto";
@ -48488,6 +48530,36 @@ const char *Txt_You_can_register_voluntarily_in_one_or_more_groups_of_type_X = /
" in one or more groups of type %s."; // Necessita de tradução
#endif
const char *Txt_You_can_send_a_file_with_an_image_in_png_format_transparent_background_and_size_X_Y = // Warning: it is very important to include two %u in the following sentences
#if L==0
"Puede enviar un archivo con una imagen en formato <em>png</em>,"
" fondo transparente y tama&ntilde;o %u&times;%u p&iacute;xeles."; // Necessita traduccio
#elif L==1
"You can send a file with an image in <em>png</em> format,"
" transparent background and size %u&times;%u pixels."; // Need Übersetzung
#elif L==2
"You can send a file with an image in <em>png</em> format,"
" transparent background and size %u&times;%u pixels.";
#elif L==3
"Puede enviar un archivo con una imagen en formato <em>png</em>,"
" fondo transparente y tama&ntilde;o %u&times;%u p&iacute;xeles.";
#elif L==4
"You can send a file with an image in <em>png</em> format,"
" transparent background and size %u&times;%u pixels."; // Besoin de traduction
#elif L==5
"Puede enviar un archivo con una imagen en formato <em>png</em>,"
" fondo transparente y tama&ntilde;o %u&times;%u p&iacute;xeles."; // Okoteve traducción
#elif L==6
"Puoi inviare un file con un'immagine in formato <em>png</em>,"
" sfondo trasparente e di dimensione %u&times;%u pixel.";
#elif L==7
"You can send a file with an image in <em>png</em> format,"
" transparent background and size %u&times;%u pixels."; // Potrzebujesz tlumaczenie
#elif L==8
"You can send a file with an image in <em>png</em> format,"
" transparent background and size %u&times;%u pixels."; // Necessita de tradução
#endif
const char *Txt_You_can_send_a_file_with_an_image_in_jpg_format_ =
#if L==0
"Puede enviar un archivo con una imagen en formato <em>jpg</em>.<br />"