diff --git a/swad_action.c b/swad_action.c index ee2322e31..fc77e57e7 100644 --- a/swad_action.c +++ b/swad_action.c @@ -1573,8 +1573,8 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = /* ActReqDeg */{1206,-1,TabCtr,ActSeeDeg ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Deg_RecFormReqDeg ,NULL}, /* ActNewDeg */{ 540,-1,TabCtr,ActSeeDeg ,0x1C0,0x1C0,0x1C0,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Deg_RecFormNewDeg ,NULL}, /* ActRemDeg */{ 542,-1,TabCtr,ActSeeDeg ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Deg_RemoveDegree ,NULL}, - /* ActRenDegSho */{ 546,-1,TabCtr,ActSeeDeg ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Deg_RenameDegreeShort ,NULL}, - /* ActRenDegFul */{ 547,-1,TabCtr,ActSeeDeg ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Deg_RenameDegreeFull ,NULL}, + /* ActRenDegSho */{ 546,-1,TabCtr,ActSeeDeg ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,Deg_RenameDegreeShort ,Deg_ContEditAfterChgDeg ,NULL}, + /* ActRenDegFul */{ 547,-1,TabCtr,ActSeeDeg ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,Deg_RenameDegreeFull ,Deg_ContEditAfterChgDeg ,NULL}, /* ActChgDegTyp */{ 544,-1,TabCtr,ActSeeDeg ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Deg_ChangeDegreeType ,NULL}, /* ActChgDegCtr */{1049,-1,TabCtr,ActSeeDeg ,0x1C0,0x1C0,0x1C0,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Deg_ChangeDegreeCtr ,NULL}, /* ActChgDegWWW */{ 554,-1,TabCtr,ActSeeDeg ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Deg_ChangeDegWWW ,NULL}, diff --git a/swad_changelog.h b/swad_changelog.h index 235452e3e..69e4c5287 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -125,13 +125,14 @@ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 15.140.1 (2016-03-01)" +#define Log_PLATFORM_VERSION "SWAD 15.141 (2016-03-01)" #define CSS_FILE "swad15.137.2.css" #define JS_FILE "swad15.131.3.js" // 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 sql/swad*.sql | tail -1 /* + Version 15.141: Mar 01, 2016 Button to go to another degree after editing. (195898 lines) Version 15.140.1: Mar 01, 2016 The link to go to another course after editing is replaced by a button. (195817 lines) Version 15.140: Mar 01, 2016 New option "landing page". (195817 lines) 2 changes necessary in database: diff --git a/swad_course.c b/swad_course.c index 814803be6..5993da21f 100644 --- a/swad_course.c +++ b/swad_course.c @@ -2400,7 +2400,7 @@ void Crs_ChangeInsCrsCod (void) /***** Change the institutional course code *****/ if (strcmp (NewInstitutionalCrsCod,Crs->InstitutionalCrsCod)) { - Crs_UpdateCurrentInstitutionalCrsCod (Crs,NewInstitutionalCrsCod); + Crs_UpdateInstitutionalCrsCod (Crs,NewInstitutionalCrsCod); sprintf (Gbl.Message,Txt_The_institutional_code_of_the_course_X_has_changed_to_Y, Crs->ShortName,NewInstitutionalCrsCod); Lay_ShowAlert (Lay_SUCCESS,Gbl.Message); @@ -2489,6 +2489,7 @@ void Crs_ChangeCrsDegree (void) sprintf (Query,"UPDATE courses SET DegCod='%ld' WHERE CrsCod='%ld'", NewDeg.DegCod,Crs->CrsCod); DB_QueryUPDATE (Query,"can not move course to another degree"); + Crs->DegCod = NewDeg.DegCod; /***** Write message to show the change made *****/ sprintf (Gbl.Message,Txt_The_course_X_has_been_moved_to_the_degree_Y, @@ -2600,16 +2601,13 @@ void Crs_ChangeCrsYear (void) } /*****************************************************************************/ -/******** Change the institutional course code of the current course *********/ +/************* Change the institutional course code of a course **************/ /*****************************************************************************/ -void Crs_UpdateCurrentInstitutionalCrsCod (struct Course *Crs,const char *NewInstitutionalCrsCod) +void Crs_UpdateInstitutionalCrsCod (struct Course *Crs,const char *NewInstitutionalCrsCod) { char Query[512]; - strncpy (Gbl.CurrentCrs.Crs.InstitutionalCrsCod,NewInstitutionalCrsCod,Crs_LENGTH_INSTITUTIONAL_CRS_COD); - Gbl.CurrentCrs.Crs.InstitutionalCrsCod[Crs_LENGTH_INSTITUTIONAL_CRS_COD] = '\0'; - /***** Update institutional course code in table of courses *****/ sprintf (Query,"UPDATE courses SET InsCrsCod='%s' WHERE CrsCod='%ld'", NewInstitutionalCrsCod,Crs->CrsCod); @@ -2743,7 +2741,10 @@ static bool Crs_RenameCourse (struct Course *Crs,Cns_ShortOrFullName_t ShortOrFu } } else - Lay_ShowAlert (Lay_WARNING,Txt_You_dont_have_permission_to_edit_this_course); + { + strcpy (Gbl.Message,Txt_You_dont_have_permission_to_edit_this_course); + Gbl.Error = true; + } return CourseHasBeenRenamed; } @@ -2804,14 +2805,18 @@ void Crs_ChangeCrsStatus (void) void Crs_ContEditAfterChgCrs (void) { - /***** Write error/success message showing the change made *****/ - Lay_ShowAlert (Gbl.Error ? Lay_WARNING : - Lay_INFO, - Gbl.Message); + if (Gbl.Error) + /***** Write error message *****/ + Lay_ShowAlert (Lay_WARNING,Gbl.Message); + else + { + /***** Write success message showing the change made *****/ + Lay_ShowAlert (Lay_INFO,Gbl.Message); - /***** Put button to go to course changed *****/ - if (Gbl.Degs.EditingCrs.CrsCod != Gbl.CurrentCrs.Crs.CrsCod) // If changing other course different than the current one... - Crs_PutButtonToGoToCrs (&Gbl.Degs.EditingCrs); + /***** Put button to go to course changed *****/ + if (Gbl.Degs.EditingCrs.CrsCod != Gbl.CurrentCrs.Crs.CrsCod) // If changing other course different than the current one... + Crs_PutButtonToGoToCrs (&Gbl.Degs.EditingCrs); + } /***** Show the form again *****/ Crs_ReqEditCourses (); diff --git a/swad_course.h b/swad_course.h index 4cbfdced0..2788c4ded 100644 --- a/swad_course.h +++ b/swad_course.h @@ -120,7 +120,7 @@ void Crs_RemoveCourseCompletely (long CrsCod); void Crs_ChangeInsCrsCod (void); void Crs_ChangeCrsDegree (void); void Crs_ChangeCrsYear (void); -void Crs_UpdateCurrentInstitutionalCrsCod (struct Course *Crs,const char *NewInstitutionalCrsCod); +void Crs_UpdateInstitutionalCrsCod (struct Course *Crs,const char *NewInstitutionalCrsCod); void Crs_RenameCourseShort (void); void Crs_RenameCourseFull (void); void Crs_ChangeCrsStatus (void); diff --git a/swad_degree.c b/swad_degree.c index 5e885a3dd..8f31a4c8c 100644 --- a/swad_degree.c +++ b/swad_degree.c @@ -117,9 +117,10 @@ static unsigned Deg_CountNumDegsOfType (long DegTypCod); static void Deg_GetDataOfDegreeFromRow (struct Degree *Deg,MYSQL_ROW row); static void Deg_RemoveDegreeTypeCompletely (long DegTypCod); static void Deg_RemoveDegreeCompletely (long DegCod); -static void Deg_RenameDegree (struct Degree *Deg,Cns_ShortOrFullName_t ShortOrFullName); +static bool Deg_RenameDegree (struct Degree *Deg,Cns_ShortOrFullName_t ShortOrFullName); static bool Deg_CheckIfDegreeTypeNameExists (const char *DegTypName,long DegTypCod); static bool Deg_CheckIfDegreeNameExists (long CtrCod,const char *FieldName,const char *Name,long DegCod); +static void Deg_PutButtonToGoToDeg (struct Degree *Deg); /*****************************************************************************/ /********** List pending institutions, centres, degrees and courses **********/ @@ -2079,6 +2080,9 @@ static void Deg_CreateDegree (struct Degree *Deg,unsigned Status) sprintf (Gbl.Message,Txt_Created_new_degree_X, Deg->FullName); Lay_ShowAlert (Lay_SUCCESS,Gbl.Message); + + /***** Put button to go to degree created *****/ + Deg_PutButtonToGoToDeg (Deg); } /*****************************************************************************/ @@ -2601,7 +2605,7 @@ void Deg_RemoveDegree (void) if ((Deg.DegCod = Deg_GetParamOtherDegCod ()) == -1L) Lay_ShowErrorAndExit ("Code of degree is missing."); - /***** Get data of the degree from database *****/ + /***** Get data of degree *****/ Deg_GetDataOfDegreeByCod (&Deg); /***** Check if this degree has courses *****/ @@ -3134,7 +3138,7 @@ void Deg_RenameDegreeType (void) NewNameDegTyp,DegTyp->DegTypCod); DB_QueryUPDATE (Query,"can not update the type of a degree"); - /***** Write message to show the change made *****/ + /* Write message to show the change made */ sprintf (Gbl.Message,Txt_The_type_of_degree_X_has_been_renamed_as_Y, DegTyp->DegTypName,NewNameDegTyp); Lay_ShowAlert (Lay_SUCCESS,Gbl.Message); @@ -3159,7 +3163,13 @@ void Deg_RenameDegreeType (void) void Deg_RenameDegreeShort (void) { - Deg_RenameDegree (&Gbl.Degs.EditingDeg,Cns_SHORT_NAME); + struct Degree *Deg; + + Deg = &Gbl.Degs.EditingDeg; + + if (Deg_RenameDegree (Deg,Cns_SHORT_NAME)) + if (Deg->DegCod == Gbl.CurrentDeg.Deg.DegCod) // If renaming current degree... + strcpy (Gbl.CurrentDeg.Deg.ShortName,Deg->ShortName); // Overwrite current degree name in order to show correctly in page title and heading } /*****************************************************************************/ @@ -3168,14 +3178,22 @@ void Deg_RenameDegreeShort (void) void Deg_RenameDegreeFull (void) { - Deg_RenameDegree (&Gbl.Degs.EditingDeg,Cns_FULL_NAME); + struct Degree *Deg; + + Deg = &Gbl.Degs.EditingDeg; + + if (Deg_RenameDegree (Deg,Cns_FULL_NAME)) + if (Deg->DegCod == Gbl.CurrentDeg.Deg.DegCod) // If renaming current degree... + strcpy (Gbl.CurrentDeg.Deg.FullName,Deg->FullName); // Overwrite current degree name in order to show correctly in page title and heading } /*****************************************************************************/ /************************ Change the name of a degree ************************/ /*****************************************************************************/ +// Returns true if the degree is renamed +// Returns false if the degree is not renamed -static void Deg_RenameDegree (struct Degree *Deg,Cns_ShortOrFullName_t ShortOrFullName) +static bool Deg_RenameDegree (struct Degree *Deg,Cns_ShortOrFullName_t ShortOrFullName) { extern const char *Txt_You_can_not_leave_the_name_of_the_degree_X_empty; extern const char *Txt_The_degree_X_already_exists; @@ -3187,6 +3205,7 @@ static void Deg_RenameDegree (struct Degree *Deg,Cns_ShortOrFullName_t ShortOrFu unsigned MaxLength = 0; // Initialized to avoid warning char *CurrentDegName = NULL; // Initialized to avoid warning char NewDegName[Deg_MAX_LENGTH_DEGREE_FULL_NAME+1]; + bool DegreeHasBeenRenamed = false; switch (ShortOrFullName) { @@ -3212,15 +3231,15 @@ static void Deg_RenameDegree (struct Degree *Deg,Cns_ShortOrFullName_t ShortOrFu /* Get the new name for the degree */ Par_GetParToText (ParamName,NewDegName,MaxLength); - /***** Get from the database the type and the old names of the degree *****/ - Deg_GetDataOfDegreeByCod (&Gbl.Degs.EditingDeg); + /***** Get data of degree *****/ + Deg_GetDataOfDegreeByCod (Deg); /***** Check if new name is empty *****/ if (!NewDegName[0]) { sprintf (Gbl.Message,Txt_You_can_not_leave_the_name_of_the_degree_X_empty, CurrentDegName); - Lay_ShowAlert (Lay_WARNING,Gbl.Message); + Gbl.Error = true; } else { @@ -3232,7 +3251,7 @@ static void Deg_RenameDegree (struct Degree *Deg,Cns_ShortOrFullName_t ShortOrFu { sprintf (Gbl.Message,Txt_The_degree_X_already_exists, NewDegName); - Lay_ShowAlert (Lay_WARNING,Gbl.Message); + Gbl.Error = true; } else { @@ -3241,23 +3260,23 @@ static void Deg_RenameDegree (struct Degree *Deg,Cns_ShortOrFullName_t ShortOrFu FieldName,NewDegName,Deg->DegCod); DB_QueryUPDATE (Query,"can not update the name of a degree"); - /***** Write message to show the change made *****/ + /* Write message to show the change made */ sprintf (Gbl.Message,Txt_The_name_of_the_degree_X_has_changed_to_Y, CurrentDegName,NewDegName); - Lay_ShowAlert (Lay_SUCCESS,Gbl.Message); + + /* Change current degree name in order to display it properly */ + strncpy (CurrentDegName,NewDegName,MaxLength); + CurrentDegName[MaxLength] = '\0'; + + DegreeHasBeenRenamed = true; } } else // The same name - { sprintf (Gbl.Message,Txt_The_name_of_the_degree_X_has_not_changed, CurrentDegName); - Lay_ShowAlert (Lay_INFO,Gbl.Message); - } } - /***** Show the form again *****/ - strcpy (CurrentDegName,NewDegName); - Deg_EditDegrees (); + return DegreeHasBeenRenamed; } /*****************************************************************************/ @@ -3357,7 +3376,7 @@ void Deg_ChangeDegreeType (void) /* Get the new degree type */ NewDegTypCod = Deg_GetParamOtherDegTypCod (); - /* Get from the database the type and the name of the editing degree */ + /***** Get data of degree *****/ Deg_GetDataOfDegreeByCod (Deg); /***** Update the table of degrees changing old type by new type *****/ @@ -3370,6 +3389,10 @@ void Deg_ChangeDegreeType (void) Deg->FullName); Lay_ShowAlert (Lay_SUCCESS,Gbl.Message); + /***** Put button to go to degree changed *****/ + if (Deg->DegCod != Gbl.CurrentDeg.Deg.DegCod) // If changing other degree different than the current one... + Deg_PutButtonToGoToDeg (Deg); + /***** Show the form again *****/ Gbl.Degs.EditingDegTyp.DegTypCod = NewDegTypCod; Deg_EditDegrees (); @@ -3381,8 +3404,9 @@ void Deg_ChangeDegreeType (void) void Deg_ChangeDegreeCtr (void) { - extern const char *Txt_The_centre_of_the_degree_has_changed; + extern const char *Txt_The_degree_X_has_been_moved_to_the_centre_Y; struct Degree *Deg; + struct Centre NewCtr; char Query[512]; Deg = &Gbl.Degs.EditingDeg; @@ -3393,15 +3417,26 @@ void Deg_ChangeDegreeCtr (void) Lay_ShowErrorAndExit ("Code of degree is missing."); /* Get parameter with centre code */ - Deg->CtrCod = Ctr_GetParamOtherCtrCod (); + NewCtr.CtrCod = Ctr_GetParamOtherCtrCod (); + + /***** Get data of degree and new centre *****/ + Deg_GetDataOfDegreeByCod (Deg); + Ctr_GetDataOfCentreByCod (&NewCtr); /***** Update centre in table of degrees *****/ sprintf (Query,"UPDATE degrees SET CtrCod='%ld' WHERE DegCod='%ld'", - Deg->CtrCod,Deg->DegCod); + NewCtr.CtrCod,Deg->DegCod); DB_QueryUPDATE (Query,"can not update the centre of a degree"); + Deg->CtrCod = NewCtr.CtrCod; /***** Write message to show the change made *****/ - Lay_ShowAlert (Lay_SUCCESS,Txt_The_centre_of_the_degree_has_changed); + sprintf (Gbl.Message,Txt_The_degree_X_has_been_moved_to_the_centre_Y, + Deg->FullName,NewCtr.FullName); + Lay_ShowAlert (Lay_SUCCESS,Gbl.Message); + + /***** Put button to go to degree changed *****/ + if (Deg->DegCod != Gbl.CurrentDeg.Deg.DegCod) // If changing other degree different than the current one... + Deg_PutButtonToGoToDeg (Deg); /***** Show the form again *****/ Deg_EditDegrees (); @@ -3429,10 +3464,13 @@ void Deg_ChangeDegWWW (void) /* Get the new WWW for the degree */ Par_GetParToText ("WWW",NewWWW,Cns_MAX_LENGTH_WWW); + /***** Get data of degree *****/ + Deg_GetDataOfDegreeByCod (Deg); + /***** Check if new WWW is empty *****/ if (NewWWW[0]) { - /* Update the table changing old WWW by new WWW */ + /***** Update the table changing old WWW by new WWW *****/ sprintf (Query,"UPDATE degrees SET WWW='%s' WHERE DegCod='%ld'", NewWWW,Deg->DegCod); DB_QueryUPDATE (Query,"can not update the web of a degree"); @@ -3441,6 +3479,10 @@ void Deg_ChangeDegWWW (void) sprintf (Gbl.Message,Txt_The_new_web_address_is_X, NewWWW); Lay_ShowAlert (Lay_SUCCESS,Gbl.Message); + + /***** Put button to go to degree changed *****/ + if (Deg->DegCod != Gbl.CurrentDeg.Deg.DegCod) // If changing other degree different than the current one... + Deg_PutButtonToGoToDeg (Deg); } else { @@ -3495,10 +3537,52 @@ void Deg_ChangeDegStatus (void) Deg->ShortName); Lay_ShowAlert (Lay_SUCCESS,Gbl.Message); + /***** Put button to go to degree changed *****/ + if (Deg->DegCod != Gbl.CurrentDeg.Deg.DegCod) // If changing other degree different than the current one... + Deg_PutButtonToGoToDeg (Deg); + /***** Show the form again *****/ Deg_EditDegrees (); } +/*****************************************************************************/ +/************* Show message of success after changing a degree ***************/ +/*****************************************************************************/ + +void Deg_ContEditAfterChgDeg (void) + { + if (Gbl.Error) + /***** Write error message *****/ + Lay_ShowAlert (Lay_WARNING,Gbl.Message); + else + { + /***** Write success message showing the change made *****/ + Lay_ShowAlert (Lay_INFO,Gbl.Message); + + /***** Put button to go to degree changed *****/ + if (Gbl.Degs.EditingDeg.DegCod != Gbl.CurrentDeg.Deg.DegCod) // If changing other degree different than the current one... + Deg_PutButtonToGoToDeg (&Gbl.Degs.EditingDeg); + } + + /***** Show the form again *****/ + Deg_EditDegrees (); + } + +/*****************************************************************************/ +/************************ Put button to go to degree *************************/ +/*****************************************************************************/ + +static void Deg_PutButtonToGoToDeg (struct Degree *Deg) + { + extern const char *Txt_Go_to_X; + + Act_FormStart (ActSeeDegInf); + Deg_PutParamDegCod (Deg->DegCod); + sprintf (Gbl.Title,Txt_Go_to_X,Deg->ShortName); + Lay_PutConfirmButton (Gbl.Title); + Act_FormEnd (); + } + /*****************************************************************************/ /*********** Show a form for sending a logo of the current degree ************/ /*****************************************************************************/ diff --git a/swad_degree.h b/swad_degree.h index 716081ee9..fa4fb59b4 100644 --- a/swad_degree.h +++ b/swad_degree.h @@ -144,6 +144,8 @@ void Deg_ChangeDegreeType (void); void Deg_ChangeDegreeCtr (void); void Deg_ChangeDegWWW (void); void Deg_ChangeDegStatus (void); +void Deg_ContEditAfterChgDeg (void); + void Deg_RequestLogo (void); void Deg_ReceiveLogo (void); void Deg_RemoveLogo (void); diff --git a/swad_enrollment.c b/swad_enrollment.c index 90c13f85e..0d89ee74a 100644 --- a/swad_enrollment.c +++ b/swad_enrollment.c @@ -1522,7 +1522,7 @@ static void Enr_ReceiveFormUsrsCrs (Rol_Role_t Role) Imp_ImportStdsFromAnImpGrp (GrpCod,&LstGrps,&NumUsrsRegistered); /* Update the institutional course code to the external course code */ - Crs_UpdateCurrentInstitutionalCrsCod (&Gbl.CurrentCrs.Crs,ExternalCrsCod); + Crs_UpdateInstitutionalCrsCod (&Gbl.CurrentCrs.Crs,ExternalCrsCod); } } } diff --git a/swad_text.c b/swad_text.c index fbe5cfa69..4d0f0b05a 100644 --- a/swad_text.c +++ b/swad_text.c @@ -40080,27 +40080,6 @@ const char *Txt_The_banner_X_is_now_visible = // Warning: it is very important t "O banner %s é agora visible."; #endif -const char *Txt_The_centre_of_the_degree_has_changed = -#if L==1 - "El centro de la titulación ha cambiado."; // Necessita traduccio -#elif L==2 - "The centre of the degree has changed."; // Need Übersetzung -#elif L==3 - "The centre of the degree has changed."; -#elif L==4 - "El centro de la titulación ha cambiado."; -#elif L==5 - "The centre of the degree has changed."; // Besoin de traduction -#elif L==6 - "El centro de la titulación ha cambiado."; // Okoteve traducción -#elif L==7 - "Il centro della laurea è cambiato."; -#elif L==8 - "The centre of the degree has changed."; // Potrzebujesz tlumaczenie -#elif L==9 - "The centre of the degree has changed."; // Necessita de tradução -#endif - const char *Txt_The_centre_X_already_exists = // Warning: it is very important to include %s in the following sentences #if L==1 "El centro %s ya existe."; // Necessita traduccio @@ -40704,6 +40683,36 @@ const char *Txt_The_degree_X_already_exists = // Warning: it is very important t "The degree %s already exists."; // Necessita de tradução #endif +const char *Txt_The_degree_X_has_been_moved_to_the_centre_Y = // Warning: it is very important to include two %s in the following sentences +#if L==1 + "La titulación %s se ha movido" + " al centro %s."; // Necessita traduccio +#elif L==2 + "The degree %s has been moved" + " to the centre %s."; // Need Übersetzung +#elif L==3 + "The degree %s has been moved" + " to the centre %s."; +#elif L==4 + "La titulación %s se ha movido" + " al centro %s."; +#elif L==5 + "The degree %s has been moved" + " to the centre %s."; // Besoin de traduction +#elif L==6 + "La titulación %s se ha movido" + " al centro %s."; // Okoteve traducción +#elif L==7 + "La laurea %s è stata spostata" + " al centro %s."; +#elif L==8 + "The degree %s has been moved" + " to the centre %s."; // Potrzebujesz tlumaczenie +#elif L==9 + "The degree %s has been moved" + " to the centre %s."; // Necessita de tradução +#endif + const char *Txt_The_department_X_already_exists = // Warning: it is very important to include %s in the following sentences #if L==1 "El departamento %s ya existe."; // Necessita traduccio