Realizzazione di una base di dati e un applicativo web per la gestione di traduzioni
Upcoming SlideShare
Loading in...5
×
 

Realizzazione di una base di dati e un applicativo web per la gestione di traduzioni

on

  • 187 views

 

Statistics

Views

Total Views
187
Views on SlideShare
187
Embed Views
0

Actions

Likes
0
Downloads
2
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft Word

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Realizzazione di una base di dati e un applicativo web per la gestione di traduzioni Realizzazione di una base di dati e un applicativo web per la gestione di traduzioni Document Transcript

    • UNIVERSITÀ DEGLI STUDI DI TRIESTE DIPARTIMENTO DI INGEGNERIA ED ARCHITETTURA CORSO DI LAUREA TRIENNALE IN INGEGNERIA DELL'INFORMAZIONE CURRICULUM INFORMATICA REALIZZAZIONE DI UNA BASE DI DATI E UN APPLICATIVO WEB PER LA GESTIONE DI TRADUZIONI Laureando: Relatore: STEFANO PACCHIEGA CHIAR.MO PROF. MAURIZIO FERMEGLIA ANNO ACCADEMICO 2012/2013
    • 2 INDICE DEI CONTENUTI CAPITOLO 1 INTRODUZIONE 4 CAPITOLO 2 ANALISI 2.1 Intervista al cliente 2.2 Analisi del sistema 2.3 Analisi dettagliata dei casi d’uso 2.3.1 L’utente 2.3.2 Il traduttore 2.3.3 L’admin 6 6 7 10 10 10 10 CAPITOLO 3 LA BASE DI DATI 3.1 Progettazione 3.2 Realizzazione 11 11 15 CAPITOLO 4 LA WEB APPLICATION 4.1 Progettazione 4.2Il Data Binding 4.3 Il Login 4.4Pagine utente 4.4.1 Home utente 4.4.2 Richiesta traduzione di un testo 4.4.3 Richiesta traduzione di un file 4.4.4 Visualizzazione traduzione 4.5Pagine traduttore 4.5.1 Home traduttore 4.5.2 Caricamento di una traduzione 4.6 Pagine admin 4.7 Sistema di notifiche per utenti 16 16 17 17 19 19 22 24 25 30 30 31 33 36
    • 3 CAPITOLO 5 CONCLUSIONE 5.1 Possibililità di implementazione 5.2 Integrazione futura 37 38 39 CAPITOLO 6 BIBLIOGRAFIA E SITOGRAFIA 40
    • 4 CAPITOLO 1 Introduzione Lo scopo di questa tesi è la creazione di una base dati e la creazione di un applicativo web per la gestione di traduzioni. In particolare si vogliono fornire servizi diversi per 3 “entità”: - Gli utenti potranno richiedere un testo o file da tradurre; -I traduttori potranno decidere se operare sui lavori e in caso affermativo fare l’upload della traduzione; - L’admin gestirà le traduzioni, si occuperàdell’associazione testo/traduttore e darà una valutazione degli elaborati finali. Nei capitoli successivi si mostrerà in dettaglio come è stato implementato il sistema: Nella sezione dedicata all’analisi verranno trattati gli argomenti relativi alla verifica dei requisiti e della situazione iniziale. Verranno quindi definite le basi di un sistema informativo. Nella parte di progettazione si esamineranno gli schemi relativi alla creazione del database con la documentazione associata e la struttura dell’applicazione web Nel capitolo conclusivo si tratterà i risultati dell’elaborato e i possibili miglioramenti ed implementazioni. I vincoli progettuali sono rappresentati dall’utilizzo delle tecnologie .NET, del linguaggio di programmazione C# e del linguaggio di markup HTML5. Gli obiettivi della realizzazione consistono in:  Analizzare i requisiti da parte del committente (intervista);  Analizzare la struttura del sistema informativo;  Analizzare e progettare la base dati;  Analizzare e progettare la web application tramite le tecnologie .NET, ASP.NET, C# e HTML5;  Studiare le iterazioni fra base dati ed applicazione.
    • 5 Tutti i moduli software di questo documento sono stati creati dall’autore e sono stati sviluppati mediante i software: - SQL Server Management Studio 2012 - Visual Studio 2012 - Visio 2013
    • 6 CAPITOLO 2 Analisi 2.1 Intervista al cliente A seguito di una prima intervista al committente,il primo dato ottenuto consiste nella mancanza di un sistema preesistente da implementare. Perciò si ha la necessità di realizzare un nuovo sistema. Le richieste del committente sono:  La creazione di una base dati per la gestione delle traduzioni;  La creazione di un applicativo web universale che permetta agli utenti (registrati) di richiedere una traduzione tramite file o TextBox;  La creazione di un applicativo web universale che consenta ai traduttori di vedere le richieste di traduzione (assegnate dall’amministratore) e di caricare le traduzioni completate;  La creazione di un applicativo web universale che permetta all’amministratore di gestire le traduzioni in modo tale da poter assegnare traduttori e traduzioni e di poter valutare gli elaborati finali.  La creazione di un sistema di Login per accedere alle 3 applicazioni precedenti l’unione attraverso una singola finestra.
    • 7 2.2 Analisi del sistema Gli attori fondamentali sono 3: - L’utente (il richiedente la traduzione) - Il traduttore - L’amministratore L’utente dovrà unicamente inserire il testo da tradurre (potrà anche valutare lo storico delle sue richieste cosi da trovare eventuali traduzioni).
    • 8 Il traduttore potrà accettare le traduzioni offerte dall’amministratore e potrà caricarle tramite la web application una volta completate. L’amministratore potrà assegnare le traduzioni a traduttori e potrà visualizzare tutti i dati. Il DIAGRAMMA DELLE ATTIVITA’ può essere diviso in più fasi: 1) L’utente carica il testo da tradurre 2) L’admin valuta i dati e assegna ad un traduttore un testo di tipo “pending” 3) Il traduttore decide se tradurre il testo o rifiutare l’incarico. Eventualmente, in caso di consenso, carica la traduzione.
    • 9
    • 10 2.3 Analisi dettagliata dei casi d’uso 2.3.1 Analisi dettagliata del caso d’uso dell’utente Il principale caso d’uso dell’utente è quello che lo porta all’inserimento di una nuova richiesta di traduzione. 1) Effettua il login; 2) Inserisce una nuova richiesta di traduzione che può essere un testo semplice o un file; 3) Compila il form della richiesta; 4) Attende risposta da parte del sistema dell’update dello stato in cui si trova la sua traduzione; 5) Valuta le tradizioni completate (tradotte e revisionate). 2.3.2 Analisi dettagliata del caso del traduttore Il principale caso d’uso del traduttore è quello che lo porta al accettare una traduzione e all’inserimento della stessa. 1) Effettua il login; 2) Valuta nella pagina di “storico” i lavori in attesa di risposta (Pending, in attesa del traduttore); 3) Il traduttore accetta o rifiuta il lavoro; 4) Se il traduttore accetta il lavoro, può caricarne la traduzione. 2.3.3 Analisi dettagliata del caso d’uso dell’admin Di seguito i passaggi effettuati dall’admin: 1) Effettua il login; 2) Valuta nella pagina dello storico i lavori. 3) Se un lavoro è nello stato “in attesa di assegnazione” l’admin può associare un possibile traduttore; 4) Se un lavoro è nello stato “tradotto, in attesa di revisione” l’admin può revisionare il lavoro e giudicarne l’idoneità; 5) Se il lavoro è nello stato “tradotto e revisionato” può valutarne la traduzione.
    • 11 CAPITOLO 3 La base di dati 3.1) Progettazione della base di dati Una volta raccolte le informazioni ottenute dall’intervista al committente è stato redatto un primo glossario dei termini. Termine Descrizione Sinonimi Collegamenti Utente Colui che richiede una traduzione User Testo Testo Insieme di parole che il cliente desidera tradurre File, Brano, Lavoro Utente, Traduzione Traduttore Colui che traduce il testo Traduzione, Lingue Traduzione Traduzione del Testo fatta da parte del traduttore Testo, Traduttore Lingue Le lingue conosciute dal traduttore e richieste nella traduzione. Traduttore,Testo Grazie a questi dati possiamo creare uno schema concettuale E-R. In realtà “File” e “Brano” in un secondo momento non verranno considerati sinonimidel termine “Testo”, ma avranno una diversa concezione. Con “File” infatti verrà preso in considerazione un file vero e proprio con estensione, ad esempio .txt o .pdf, mentre con “Brano” verrà considerata una parte di testo da tradurre.
    • 12 Si mette ora in evidenza l’analisi delle principali entità. Utente ID Utente È il codice univoco che viene assegnato all’utente. È candidato ad essere chiave primaria dell’entità “utente” Nome È il nome dell’utente Cognome È il cognome dell’utente E-mail L’e-mail del cliente CREDENZIALI User e password per il login (ATTRIBUTO COMPOSTO) Traduttore ID Traduttore È il codice univoco che viene assegnato al traduttore. È candidato ad essere chiave primaria dell’entità “traduttore” Nome È il nome del traduttore Cognome È il cognome del traduttore E-mail L’e-mail deltraduttore CREDENZIALI User e password per il login (ATTRIBUTO COMPOSTO)
    • 13 Testo ID Lavoro È il codice univoco che viene assegnato al brano. È candidato ad essere chiave primaria dell’entità “Testo” File E’ il nome del file Testo È il brano Data di aggiunta La data di aggiunta del lavoro Scadenza La data di scadenza del lavoro Lingue ID Lingue È il codice univoco che viene assegnato alla lingua. È candidato ad essere chiave primaria dell’entità “Lingue” Lingua È la lingua Stato ID stato È il codice univoco che viene assegnato allo stato del lavoro. È candidato ad essere chiave primaria dell’entità “Stato” Tipo Stato È lo stato in cui si trova il lavoro
    • 14
    • 15 3.2) Progettazione della base dati Il database è stato realizzato con SQL Server Management Studio 2012 ed è formato da 12 tabelle e 4 viste. Il suo diagram è: TblConoscenza Traduttore Lingua TblLingua IDLingua Lingua TblUtente IDUtente NomeUtente CognomeUtente EMailUtente TblRichiesta Utente Testo TblStatoTotale IDStato TipoStato TblStatoProgetto Stato Testo TblStatoT IDStato TipoStato TblTraduz Traduttore Testo Stato TestoTradotto FileTradotto TblCredenzialiTraduttori ID Utente Password TblCredenzialiUtente ID Utente Password TblTraduttore IDTraduttore NomeTraduttore CognomeTraduttore EMailTraduttore TblTesto IDLavoro NomeFile Testo DataDiAggiunta Scadenza LinguaSorgente LinguaDestinazione
    • 16 CAPITOLO 4 La Web Application 4.1) La progettazione L’applicazione web è stata progettata con una interfaccia molto semplice e userfriendly. La sua semplicitàpermette un miglioramento continuo nel futuro. L’applicazione è formata da più pagine aspx create tramite il Software Visual Studio 2012. Il seguente grafico mostra la struttura della web app. Login Page Home utente Home traduttore Richiedi file Richiedi testo Vedi traduzione Accetta/rifiuta traduzione Carica traduzione Home admin Assegna traduzione Valuta traduzione
    • 17 4.2) Il Data Binding Lo scambio di dati fra l’applicazione e il database avviene tramite una connessione data dalla stringa restituita dal metodo GetConnectionString(): static private string GetConnectionString() { return "Data Source=(LocalDB)v11.0; Initial Catalog=DataTrad;" + "Integrated Security=true;"; } Quando il sistema verrà installato nell’ambiente in cui dovrà operare sarà necessario modificare questa stringa con i parametri adeguati. 4.3) Il Login La web application contiene una unica pagina di login formata da due TextBox e un Button. In caso di errato inserimento delle credenziali viene mostrato un messaggio di errore. L’inserimento di credenziali corrette porterà ad un Redirect verso le rispettive pagine dei tre gruppi di lavoro: - La pagina dell’admin - La pagina del traduttore - La pagina dell’utente
    • 18 Premendo il tasto Login viene eseguito il codice seguente: protected void Button1_Click(object sender, EventArgs e) { SqlConnection connection1 = new SqlConnection(); connection1.ConnectionString = GetConnectionString(); SqlCommand CheckTesUser = new SqlCommand("select ID from TblCredenzialiUtente where Utente=@user AND Password=@Pass", connection1); CheckTesUser.Parameters.AddWithValue("user", TextBox1.Text); CheckTesUser.Parameters.AddWithValue("pass", TextBox2.Text); connection1.Open(); SqlDataReader rd = CheckTesUser.ExecuteReader(); if (rd.HasRows) { rd.Read(); rd.Close(); int IdUser = (int)CheckTesUser.ExecuteScalar(); Response.Redirect("UserForm.aspx?ID="+IdUser); } rd.Close(); connection1.Close(); SqlConnection connection2 = new SqlConnection(); connection2.ConnectionString = GetConnectionString(); SqlCommand CheckTesTrad = new SqlCommand("select ID from TblCredenzialiTraduttori where Utente=@user AND Password=@Pass", connection2); CheckTesTrad.Parameters.AddWithValue("user", TextBox1.Text); CheckTesTrad.Parameters.AddWithValue("pass", TextBox2.Text); connection2.Open(); SqlDataReader rdtrad = CheckTesTrad.ExecuteReader(); if (rdtrad.HasRows) { rdtrad.Read(); rdtrad.Close(); String IdTrad = CheckTesTrad.ExecuteScalar().ToString(); Response.Redirect("TradForm.aspx?ID="+IdTrad); } rdtrad.Close(); connection2.Close(); //credenziali dell’admin, password in chiaro if (TextBox1.Text == "admin" && TextBox2.Text == "admin") { Response.Redirect("AdminForm.aspx"); }
    • 19 else { Label1.Text = "Username e/o Password errate"; } connection2.Close(); } Il passaggio dell’id utente o dell’id tesista viene mediante l’espressione url?variabile = valore. 4.4) Pagina utente 4.4.1) Home utente Dopo il login un normale utente viene indirizzato verso la propria “pagina di lavoro”. Questa pagina contiene un messaggio di benvenuto, con il nome e cognome dell’utente, la data, la possibilità tramite una RadioButtonList e un Button di iniziare il caricamento di una nuova richiesta di traduzione e lo storico delle richieste fatte dall’utente.
    • 20 Al momento del caricamento della pagina vengono riempiti i label con i dati dell’utente grazie al codice: protected void Page_Load(object sender, EventArgs e) { SqlConnection connection2 = new SqlConnection(); connection2.ConnectionString = GetConnectionString(); // viene salvato il valore ricevuto dalla pagina di login (l’id dell’user) String ID = Request.QueryString["ID"]; int id = Convert.ToInt32(ID); SqlCommand npersona = new SqlCommand("SELECT NomeUtente FROM [TblUtente] WHERE IDUtente="+id, connection2); npersona.Parameters.AddWithValue("nome",id); connection2.Open(); SqlDataReader dr = npersona.ExecuteReader(); dr.Close(); String Name = (String)npersona.ExecuteScalar(); SqlCommand cpersona = new SqlCommand("SELECT CognomeUtente FROM [TblUtente] WHERE IDUtente=" + id, connection2); cpersona.Parameters.AddWithValue("cognome", id); SqlDataReader cn = cpersona.ExecuteReader(); cn.Close(); String cname = (String)cpersona.ExecuteScalar(); // vengono riempiti i label all’inizio della pagina Label1.Text = Name; Label3.Text = cname; Label2.Text = DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss"); Label4.Text = id.ToString(); Label4.Visible = false; } Il codice del Button della RadioButtonList è: protected void Button1_Click(object sender, EventArgs e) { String ID = Request.QueryString["ID"]; int id = Convert.ToInt32(ID); if (RadioButtonList1.SelectedItem.Value == "Testo") { Response.Redirect("CaricaTesto.aspx?ID="+id); } if (RadioButtonList1.SelectedItem.Value == "File") { Response.Redirect("CaricaFile.aspx?ID=" + id);
    • 21 } } Quando quindi un utente vorrà caricare un nuovo brano o file verrà rediretto verso due nuove pagine, CaricaTesto.aspx o CaricaFile.aspx. Infine la pagina è composta dalla GridView per poter visualizzare lo storico delle richieste da parte dell’utente e, in caso di traduzione revisionata, poter vedere la traduzione. protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) { String stato = GridView1.SelectedRow.Cells[6].Text; if (stato != "Tradotto e Revisionato") { DialogResult dialogResult = MessageBox.Show("Lavoro non ancora terminato", "ALERT", MessageBoxButtons.OK); } if (stato == "Tradotto e Revisionato") { String idProgetto = GridView1.SelectedRow.Cells[1].Text; String NomeFile = GridView1.SelectedRow.Cells[2].Text; String Testo = GridView1.SelectedRow.Cells[3].Text; String Data = GridView1.SelectedRow.Cells[4].Text; String Scadenza = GridView1.SelectedRow.Cells[5].Text; bool isTesto; String TextFile = NomeFile; if (TextFile == " ") { isTesto = true; } else { isTesto = false; } SqlConnection connection1 = new SqlConnection(); connection1.ConnectionString = GetConnectionString(); connection1.Open(); Response.Redirect("TestoETradUser.aspx?IDProg=" + idProgetto); } }
    • 22 4.4.2) Richiesta traduzione di un testo La pagina di caricamento testo è formata da due DropList per inserire le lingue, un Calendar selezionabile per indicare la scadenza, una TextBox per inserire il brano da tradurre e tre bottoni, Submit per inviare la richiesta, Home per tornare alla pagina dell’utente e Logout per tornare alla pagina di login. Le DropList hanno la medesima struttura e il codice della prima è: protected void DropDownList3_SelectedIndexChanged(object sender, EventArgs e) { SqlConnection connection1 = new SqlConnection(); connection1.ConnectionString = GetConnectionString(); SqlCommand cmdLingua = new SqlCommand("SELECT Lingua FROM [TblLingua]", connection1); connection1.Open(); SqlDataReader dr; dr = cmdLingua.ExecuteReader(); DropDownList3.DataSource = dr; DropDownList3.DataValueField = "Lingua"; DropDownList3.DataTextField = "IdLingua"; DropDownList3.DataBind(); DropDownList3.Items.Insert(0, new ListItem("seleziona lingua", "-1")); connection1.Close(); cmdLingua.Dispose(); }
    • 23 Alla pressione del tasto Submit viene eseguito il seguente codice che permette ai dati, se idonei, di essere inseriti all’interno del database. protected void Button1_Click(object sender, EventArgs e) { if (TextBox1.Text.Length != 0) //se è presente del testo nella textbox { SqlConnection connection3 = new SqlConnection(); connection3.ConnectionString = GetConnectionString(); String ID = Request.QueryString["ID"]; int idutente = Convert.ToInt32(ID); if (Label2.Text == "Scadenza non selezionata") { Label2.Text = DateTime.Now.ToString("yyyy/MM/dd"); } SqlConnection connection4 = new SqlConnection(); connection4.ConnectionString = GetConnectionString(); connection4.Open(); SqlCommand progetto = new SqlCommand("SELECT MAX(IDLavoro) AS IDLavoro FROM TblTesto", connection4); int idprog = Convert.ToInt32(progetto.ExecuteScalar()); idprog++; SqlCommand NewProgetto = new SqlCommand("Insert into TblTesto (IDLavoro, Testo, DataDiAggiunta, Scadenza, LinguaSorgente,LinguaDestinazione) VALUES (@idprog, @testo ,@DataDiAggiunta, @DataScadenza, @linguaSorgente, @linguaDestinazione)", connection3); SqlCommand NewProgettoStato = new SqlCommand("Insert into TblStatoProgetto (Stato, Testo) VALUES (@stato, @idprog)", connection3); SqlCommand NewProgettoUtente = new SqlCommand("Insert into TblRichiesta (Utente, Testo) VALUES (@idutente, @idprog)", connection3); //lingua sorgente SqlConnection connection1 = new SqlConnection(); connection1.ConnectionString = GetConnectionString(); connection1.Open(); SqlCommand linguasorgente = new SqlCommand("SELECT IDLingua FROM TblLingua WHERE Lingua = '" + DropDownList3.SelectedValue + "'", connection1); int ls = Convert.ToInt32(linguasorgente.ExecuteScalar()); //lingua destinazione SqlConnection connection2 = new SqlConnection(); connection2.ConnectionString = GetConnectionString(); connection2.Open(); SqlCommand linguadestinazione = new SqlCommand("SELECT IDLingua FROM TblLingua WHERE Lingua = '" + DropDownList4.SelectedValue + "'", connection2); int ld = Convert.ToInt32(linguadestinazione.ExecuteScalar()); NewProgetto.Parameters.AddWithValue("idprog", idprog); NewProgetto.Parameters.AddWithValue("testo", TextBox1.Text); NewProgetto.Parameters.AddWithValue("DataDiAggiunta", DateTime.Now.ToString("yyyy/MM/dd")); NewProgetto.Parameters.AddWithValue("DataScadenza", Label2.Text);
    • 24 NewProgetto.Parameters.AddWithValue("LinguaSorgente", ls); NewProgetto.Parameters.AddWithValue("LinguaDestinazione", ld); NewProgettoStato.Parameters.AddWithValue("stato", 1); //stato 1 = pending NewProgettoStato.Parameters.AddWithValue("idprog", idprog); NewProgettoUtente.Parameters.AddWithValue("idutente", idutente); NewProgettoUtente.Parameters.AddWithValue("idprog", idprog); connection3.Open(); NewProgetto.ExecuteNonQuery(); NewProgettoStato.ExecuteNonQuery(); NewProgettoUtente.ExecuteNonQuery(); connection3.Close(); int IdUser = idutente; Response.Redirect("UserForm.aspx?ID=" + IdUser); } else { DialogResult dialogResult = MessageBox.Show("Non hai inserito il testo", "ALERT", MessageBoxButtons.OK); } } 4.4.3) Richiesta traduzione di un file La struttura della pagina è analoga alla precedente con la sola diffirenza che al posto della Textbox è presente un Button per poter caricare il file.
    • 25 Il codice varia unicamente per quanto concerne la struttura dell’upload file. #region Web Form Designer generated code override protected void OnInit(EventArgs e) { // CODEGEN: This call is required by the ASP.NET Web Form Designer. InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.Submit1.ServerClick += new System.EventHandler(this.Submit1_ServerClick); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void Submit1_ServerClick(object sender, System.EventArgs e) { if ((File1.PostedFile != null) && (File1.PostedFile.ContentLength > 0)) { string fn = System.IO.Path.GetFileName(File1.PostedFile.FileName); fn = Label2.Text + "_" + fn; string SaveLocation = Server.MapPath("TESTI") + "" + fn; try { File1.PostedFile.SaveAs(SaveLocation); Label3.Text = "File Caricato"; Label5.Text = fn; } catch (Exception ex) { Label3.Text = "Error: " + ex.Message; } } } I file vengono salvati in una apposita cartella chiamata TESTI. Il path dovrà essere modificato quando il sistema verrà installato nell’ambiente in cui dovrà operare. 4.4.4) Visualizzazione traduzione Quando un brano o un file nello storico dell’utente è “Tradotto e Revisionato” può essere selezionato per poter vedere la traduzione. Cliccandoci sopra vi è una redirection ad una nuova pagina che mostrerà i dati del testo e la sua traduzione.
    • 26 Ciò accade sia che il brano sia un normale testo, sia che sia un file. Infatti, se la richiesta è la traduzione di un file, comparirà una pagina con le informazioni sul file, il file sorgente e il file traduzione. Se invece l’utente avesse richiesto un brano comparirà il testo e poco dopo la sua traduzione. La pagina consiste in un insieme di Labels e Buttons; i labels vengono tutti riempiti durante il loading della pagina.
    • 27 protected void Page_Load(object sender, EventArgs e) { String idprog = Request.QueryString["IDProg"]; int idprogetto = Convert.ToInt32(idprog); Label1.Text = idprog; SqlConnection connection1 = new SqlConnection(); connection1.ConnectionString = GetConnectionString(); connection1.Open(); SqlCommand idUtent = new SqlCommand("SELECT Utente FROM TblRichiesta WHERE Testo = '" + idprogetto + "'", connection1); int idUtente = Convert.ToInt32(idUtent.ExecuteScalar()); connection1.Close(); // Nome e Cognome utente SqlConnection connection2 = new SqlConnection(); connection2.ConnectionString = GetConnectionString(); connection2.Open(); SqlCommand NUtent = new SqlCommand("SELECT NomeUtente FROM TblUtente WHERE IdUtente = '" + idUtente + "'", connection2); String NUtente = Convert.ToString(NUtent.ExecuteScalar()); SqlCommand CUtent = new SqlCommand("SELECT CognomeUtente FROM TblUtente WHERE IdUtente = '" + idUtente + "'", connection2); String CUtente = Convert.ToString(CUtent.ExecuteScalar()); connection2.Close(); Label2.Text = NUtente; Label3.Text = CUtente; // Nome e Cognome traduttore SqlConnection connection = new SqlConnection(); connection.ConnectionString = GetConnectionString(); connection.Open(); SqlCommand idTrad = new SqlCommand("SELECT Traduttore FROM TblTraduz WHERE Testo = '" + idprog + "'", connection); String IdTraduttore = Convert.ToString(idTrad.ExecuteScalar()); SqlCommand Ntrad = new SqlCommand("SELECT NomeTraduttore FROM TblTraduttore WHERE IdTraduttore = '" + IdTraduttore + "'", connection); String Ntraduttore = Convert.ToString(Ntrad.ExecuteScalar()); SqlCommand Ctrad = new SqlCommand("SELECT CognomeTraduttore FROM TblTraduttore WHERE IdTraduttore = '" + IdTraduttore + "'", connection); String Ctraduttore = Convert.ToString(Ctrad.ExecuteScalar()); connection2.Close(); Label7.Text = Ntraduttore; Label8.Text = Ctraduttore; // è un testo? bool isTesto; SqlConnection connection3 = new SqlConnection(); connection3.ConnectionString = GetConnectionString(); connection3.Open(); SqlCommand TestoOFile = new SqlCommand("SELECT NomeFile FROM TblTesto WHERE IDLavoro = '" + idprogetto + "'", connection3); String TextFile = Convert.ToString(TestoOFile.ExecuteScalar()); if (TextFile.Equals("")) {
    • 28 isTesto = true; Label5.Text = "Testo"; Label11.Text = "Testo"; } else { isTesto = false; Label5.Text = "File"; Label11.Text = "File"; } connection2.Close(); //LINGUE SqlConnection connection4 = new SqlConnection(); connection4.ConnectionString = GetConnectionString(); connection4.Open(); SqlCommand idLSorg = new SqlCommand("SELECT LinguaSorgente FROM TblTesto WHERE IDLavoro = '" + idprogetto + "'", connection4); int idls = Convert.ToInt32(idLSorg.ExecuteScalar()); SqlCommand idLDest = new SqlCommand("SELECT LinguaDestinazione FROM TblTesto WHERE IDLavoro = '" + idprogetto + "'", connection4); int idld = Convert.ToInt32(idLDest.ExecuteScalar()); SqlCommand LSorg = new SqlCommand("SELECT Lingua FROM TblLingua WHERE IDLingua = '" + idls + "'", connection4); String ls = Convert.ToString(LSorg.ExecuteScalar()); SqlCommand LDest = new SqlCommand("SELECT Lingua FROM TblLingua WHERE IDLingua = '" + idld + "'", connection4); String ld = Convert.ToString(LDest.ExecuteScalar()); Label4.Text = ls; Label6.Text = ld; if (isTesto) { SqlCommand test = new SqlCommand("SELECT Testo FROM TblTesto WHERE IDLavoro = '" + idprog + "'", connection4); String testo = Convert.ToString(test.ExecuteScalar()); Label9.Text = "Il testo in lingua originale è"; Label10.Text = testo; Button1.Visible = false; Button2.Visible = false; SqlCommand trad = new SqlCommand("SELECT TestoTradotto FROM TblTraduz WHERE Testo = '" + idprogetto + "'", connection4); String traduzione = Convert.ToString(trad.ExecuteScalar()); Label12.Text = traduzione; } if (!isTesto) { SqlCommand test = new SqlCommand("SELECT Testo FROM TblTesto WHERE IDLavoro = '" + idprogetto + "'", connection4); String testo = Convert.ToString(test.ExecuteScalar()); Label9.Visible = false; Label10.Text = "Il file in lingua originale è"; Label12.Visible = false; }
    • 29 connection4.Close(); } E’ stata così creata una unica pagina aspx che viene modificata a seconda che il contenuto della richiesta sia un file o un brano. Se infatti si tratta di un brano, verranno semplicemente riempite due Labels con il testo e la traduzione; altrimenti verranno visualizzati due Buttons con cui si potrà scaricare i files. Per usare una singola pagina è stata utilizzata la proprietà Visible degli oggetti che, tramite opportuni costrutti if, maschera i bottoni e i labels nei due casi.
    • 30 4.5) Pagina traduttore 4.5.1) Home traduttore Dopo aver effettuato login, il traduttore viene indirizzato verso la propria home. Analogamente alla pagina dell’utente, anche questa ha dei Labels dove sono contenute le informazioni riguardo il nome, cognome del traduttore e data. Poi è presente una GridView selezionabile dove sono contenuti tutti i lavori assegnategli dall’admin. Le linee di codice sono simili, senza molte differenze degne di nota. Il traduttore in un primo momento si troverà soltanto lavori di tipo “in attesa di conferma”. Cliccando sul lavoro accederà ad una nuova pagina dove saranno contenute tutte le informazioni su quest’ultimo. In questa pagina il traduttore potrà decidere se accettare o rifiutare il lavoro il lavoro. Lo status della richiesta verrà quindi modificato in “accettato” o “rifiutato” (come si può vedere nella foto della home del traduttore). Se rifiutato, lo status del lavoro verrà nuovamente modificato in “Pending” e l’admin dovrà assegnare nuovamente il lavoro ad un’altro traduttore o giudicarlo “Non traducibile”.
    • 31 4.5.2) Caricamento di una traduzione Una volta che il traduttore ha accettato il lavoro, quest’ultimo può iniziare la traduzione. Cliccando nuovamente sul brano si aprirà una nuova pagina dove sarà possibile caricare la traduzione.
    • 32 Verranno così mostrate due pagine diverse a seconda che il testo sia un file o un brano.
    • 33 4.6) Pagineadmin Dopo il login l’admin viene indirizzato verso la propria home. La pagina è formata da una GridView con tutti i lavori richiesti, ordinati per scadenza rispetto allo stato. Selezionando un lavoro in “attesa di assegnazione” l’admin verrà rediretto verso una nuova pagina che conterrà le informazioni del lavoro e i traduttori possibili.
    • 34 Cliccando su un traduttore apparirà un popup per la conferma dell’associazione traduttore- testo. DialogResult dialogResult = MessageBox.Show("Sei sicuro di associare il traduttore al testo?", "Domanda", MessageBoxButtons.YesNo); Tra le mansioni dell’amministratore c’è anche la valutazione della traduzione. Quando un lavoro passa da uno stato “in traduzione” a “in attesa della valutazione dell’admin”, l’amministratore, cliccando sul brano, può valutarne il testo e dire se il lavoro è corretto o no; in caso negativo verrà riposto lo status di pending.
    • 35 Cliccando su “valuta la traduzione” apparirà un pop up che chiederà se la traduzione è corretta o no. DialogResult dialogResult = MessageBox.Show("La traduzione è corretta?", "Domanda", MessageBoxButtons.YesNoCancel); Infine il traduttore potrà rivedere le traduzioni completate, esattamente come gli utenti.
    • 36 4.7) Sistema di notifica per utenti L’applicazione web sfrutta l’indirizzo e-mail degli utenti per poter notificare in tempo reale la modifica dello status di un proprio lavoro richiesto. L’user può così sapere quando il lavoro è concluso. String MailTo = Request.QueryString["MailTo"]; String Stato = Request.QueryString["Stato"]; String IDLavoro = Request.QueryString["ID"]; String body = "la traduzione" + IDLavoro + " che hai richiesto ha modificato lo stato in " + Stato + "."; MailAddress fromAddress = new MailAddress("admin@admin.it"); MailAddress toAddress = new MailAddress(MailTo); MailMessage mail = new MailMessage(fromAddress.Address, toAddress.Address); mail.Subject = "Update stato traduzione"; mail.Body = body; SmtpClient client = new SmtpClient(); client.Host = "smtp.mail.yahoo.it"; client.Port = 587; client.EnableSsl = true; client.Timeout = 5000; client.UseDefaultCredentials = false; client.Credentials = new NetworkCredential("admin@yahoo.it", "*********"); try { client.Send(mail); MessageBox.Show("Mail Sent!", "Success", MessageBoxButtons.OK); } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK); } Per l’invio di mail è stato usato il mail server di Yahoo. L’admin, per inviare le mail, deve autenticarsi quindi con il mail server di Yahoo "smtp.mail.yahoo.it". Molti mail server, tra cui Gmail, impediscono l’invio di mail, per fermare il fenomeno dello spam, ponendo ulteriori dati per l’invio quali ad esempio una domanda di sicurezza o un codice da cellulare, che impediscono il corretto funzionamento del programma. Quando il sistema verrà installato nell’ambiente in cui dovrà operare, sarà necessario modificare gli indirizzi con i parametri adeguati.
    • 37 CAPITOLO 5 Conclusione Gli obiettivi prefissati all’inizio del progetto sono stati raggiunti tramite la creazione degli elementi: - La base dati - Tre distinte web app accomunate da una stessa pagina iniziale Infatti, l’applicazione web può essere considerata (e trattata in un possibilile futuro) come tre diverse applicazioni che possono coesistere non dipendendo l’una dall’altra. I sistemi di gesione dell’utente, dell’admin e dei traduttori possono essere inseriti in diversi contesti e luoghi. Basterà modificare adeguatamente le stringhe di connessione (il dataBinding). Sono state acquisite nuove conoscenze ed approfondite altre, riguardante in particolare:  Il linguaggio SQL;  Il linguaggio C#;  Il linguaggio HTML;  Sviluppo di applicazioni ASP.NET; e l’uso di software come:  SQL Server 2012  SQL Server Management Studio  Visual Studio 2012
    • 38 5.1 Possibilità di implementazione Il sistema creato offre moltissime possibilità di implementazione. Il sistema necessita di un miglioramento del front end e dell’implementazione grafica. Inoltre il sistema è scalabile e può essere arricchito con molte nuove feature. Una delle prime è l’uso di un dizionario integrato per aiutare il lavoro dei traduttori. Tra le opportunità di sviluppo troviamo anche la creazione di un finder, un’operatore per ordinare e cercare le traduzioni, così anche limitando possibili copie di traduzioni nella base dati. Le traduzioni potrebberoin questo modo essere a disposizione di tutti tramite una semplice ricerca, magari attraverso opportuni tag. Successivamente può essere creata una sezione di monitorizzazione del carico del lavoro per non associare troppi lavori ad uno stesso traduttore ma mantenere un carico di lavoro equo e simili per tutti i traduttori. Può essere notevolmente migliorata la valutazione dello storico per tutti gli utenti del sistema. Infatti possono essere create statistiche aggiornate e grafici in-time con i lavori richiesti, tradotti, finiti e rifiutati. Questa miglioria può dare vita ad una sorta di punteggio per i traduttori. Un esempio può essere quanto riportato: i traduttori partono con un punteggio di 60 su 100 al momento del loro inserimento sul database. Quel punteggio indica la percentuale di volte in cui appaiono all’admin nel momento della selezione traduttore-testo. Se eseguono una traduzione correttamente il punteggio verrà incrementato, altrimenti decrementato. Quindi verrebbe dato anche un indice di affidabilità ai traduttori (e al sistema stesso). Nel sistema può essere integrata anche la gestione backup della base dati e dei file. Questo da adito a problemi di tipo di sincronizzazione. Difatti non è detto che i dati del database e i file vengano copiati nello stesso istante. Questo problema può essere risolto con un backup immediato dei file appena caricati/modificati e un backup normale del database oppure con una futura integrazione del database dei file stessi.
    • 39 5.2Integrazione futura Il sistema dovrà essere in un futuro integrato con il Directory Service per gestire il database e i file. Così il sistema potrà accedere ai file con le credenziali degli utenti universitari, ponendo ad esempio come normale utente qualsiasi utente di Esse3 e come traduttori una piccola cerchia di persone. Per integrare il sistema si dovrà utilizzare ADSI, Active Directory Service Interface, che servirà per unire in un unico sottoinseme di interfaccie più risorse di diverse reti. Nel momendo dell’integrazione dovranno essere modificati tutti i datapath e i valori inseriti nel sistema di notifiche via mail.
    • 40 CAPITOLO 6 Bibliografia - Atzeni,P., Ceri S., Paraboschi S, Torlone R, Basi di dati: modelli e linguaggi di interrogazione, Mc Graw Hill, III edizione 2009 Sitografia - http://www.support.microsoft.com - http://www.asp.net - http://www.html.it - http://www.c-sharpcorner.com