Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: 3 lingue

  1. #1

    3 lingue

    ciao,
    mi serve un0idea su come gestire le 3 lingue del sito.
    Praticamente quando si clicca su una bandierina, dovrebbero cambiare in automatico le variabili che piazzo qui e la con il relativo contenuto. Io ho una pagina lingua.aspx dove tramite una "select case" setto la lingua e dove vorrei settare queste variabili.

    es.
    var1 = "it"
    var1 = "uk"
    var1 = "de"

    in base alla bandiera selezionata. Però questa variabile sta dentro ad una pagina aspx qualunque del sito. La mia domanda è come faccio a fare in modo che questa non sia "Non dichiarata?"

    es. pag.aspx

    ciao la lingua selezionata è: <% =var1 %>

    grazie.

  2. #2
    Utente di HTML.it L'avatar di Legnetto
    Registrato dal
    May 2002
    Messaggi
    1,419
    Quando clicchi sulla bandierina cambi un valore di session che di default può essere ad esempio Session("lang")="Italiano" e imposti:
    ciao la lingua selezionata è: <% =(Session("lang")%> e utilizzi poi il valore di session per cambiare i file di risorse o quello che usi tu.
    Ciao

  3. #3
    si quello gia lo faccio ma io devo impostare tipo 25 variabili diverse per ogni lingua e portarmele dietro per tutta la durata della visita.
    Non mi pare il caso di fare 25 sessioni.

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2001
    Messaggi
    1,482
    Ti spiego come faccio io:

    nel DB ho 3 tabelle: lingue, traduzioni e testi_traduzioni

    lingue:

    ID|Lingua
    1|italiano
    2|inglese
    3|tedesco
    .....

    traduzioni:

    ID|Nome
    1|var1
    2|var2
    .....

    testi_traduzioni

    ID|IDTesto|IDLingua|Testo
    1 |1 |1 |Testo1
    1 |1 |2 |Text1
    .......

    Al momento della scelta della lingua puoi decidere se impostare una variabile di sessione, passartela per querystring oppure salvarla nel DB. In ogni pagina puoi inserire una funzione che se trova la variabile lingua vuota la imposta ad un valore predefinito (es: 1 per l'italiano) oppure che ti faccia un redirect alla pagina di scelta. Questo sistema può essere utile per una gestione illimitata di lingue.

    La query di SELECT è veramente banale:

    SELECT Testo FROM testi_traduzioni INNER JOIN traduzioni ON testi_traduzioni.IDTesto = traduzioni.ID WHERE (traduzioni.ID=Valore OR traduzioni.Nome='Valore') AND testi_traduzioni.IDLingua=Valore

    Mi sono poicreato una semplice funzione alla quale accedo in questo modo:

    Testo=Traduci(IDVariante, IDLingua)

    oppure

    Testo=Traduci(NomeVariante, IDLingua)


    Hey hey, my my Rock and roll can never die!

  5. #5
    io volevo evitare di accedere al db.
    la mia idea era quella di avere delel variabili globali che potevano essere lette da qualsiasi parte del sito.

    Tipo le variabili GLOBAL di VB

  6. #6

  7. #7
    mi spiegheresti il funzionamento...poi questa sera lo guardo meglio sperando di capire qualcosa.

  8. #8
    Si certo.
    A grandi linee...

    I file di risorse sono file appositamente creati per queste esigenze. Per utilizzarli nel tuo sito devi creare una directory "resources" nella root e tenere li tutti i file .resources.

    La sintassi di un file resources è semplice:
    codice:
    ;commento
    variabile1 = valore1
    variabile2 = valore2
    ...
    variabileN = valoreN
    Deve esistere un file .resources di default che sarà poi la tua lingua di default. Solitamente come nome di file si utilizza "strings.resources". I file di risorsa sono però file compilati quindi prima ti devi creare un file txt in chiaro.
    Facciamo un esempio: il mio sito è di 2 lingue, inglese (default) e italiano. Creo 2 file:

    strings.txt
    strings.it.txt

    strings.txt è il file di default per il sito e qui metto i testi in lingua inglese. Mentre per tutte le altre lingue bisogna indicare il suffisso della nazione nel nome del file (quel ".it" non è a caso). Volendo aggiungere un testo per i tedeschi: strings.de.txt

    Ok ci siamo? Una volta completato il file delle risorse va compilato da riga di comando con:

    RESGEN strings.txt

    (va fatto per ogni file di risorse ovviamente)

    A questo punto abbiamo pronte le ns risorse. Per poterle ora utilizzare nelle pagine del sito bisogna richiamare alcuni metodi/proprietà dei namespace Globalization e Resources. Io per es. utilizzo sempre una semplice classe creata al volo qualche tempo fa:
    codice:
    namespace Languages {
    using System;
    using System.IO;
    using System.Globalization;
    using System.Resources;
    using System.Threading;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public class Translate {
    
      private static ResourceManager rm;
        
        private static CultureInfo ci;
        
        public Translate() {
          //ci = new CultureInfo("en"); // con questo imposto a EN la lingua
          ci = CultureInfo.CurrentCulture;
          rm = ResourceManager.CreateFileBasedResourceManager("strings",
    PathFileRisorse, null);
        }
    
        ~ Translate() {
          rm.ReleaseAllResources();
        }
    
        public string GetLabel(string strLabel) {
          return rm.GetString(strLabel, ci);
        }
    
        public string Culture {
          get {
            return ci.Name;
          }
          set {
            ci = new CultureInfo(value);
          }
        }
      }
    }
    In questo modo dalle mie pagine ASP.NET le stringhe tradotte in questo modo:

    <%= myTranslate.GetLabel("variabile1") %>

    Dove l'oggetto myTranslate è stato inizializzato così:

    codice:
    Translate myTranslate {
      get {
        Translate tmpTranslate;
        if ( Session["myTranslate"] == null ) {
          tmpTranslate = new Translate();
        } else {
          tmpTranslate = (Translate) Session["myTranslate"];
        }
        Session["myTranslate"] = tmpTranslate;
        return tmpTranslate;
      }
    }
    Info: il framework di default assegna all'oggetto Culture la lingua che utilizza il visitatore del tuo sito (sempre che sia presente). Quindi avendo IT e EN, un italiano vede il sito in IT, mentre un inglese (o tutti gli altri) lo vedono in EN.
    Così anche se richiami Label inesistenti in una lingua: in questo caso vengono richiamate quelle del file di default.

    Scusa ho scritto un pò velocemente

  9. #9
    allora io sono arrivato a fare i file resource ed a compilarli.

    ora non capisco come faccio a fare in modo che quando clicco su una bandierina mi cambino i contenuti delle variabili.

    Al click della bandierina io vado su lingua.aspx qui cosa devo fare?

  10. #10
    codice:
    <%@ Page language="c#" debug="true" %>
    <%@ Import namespace="System.Reflection"%>
    <%@ Import namespace="System.Globalization"%>
    <%@ Import namespace="System.Threading"%>
    <%@ Import namespace="System.Resources"%>
    
    <script runat="server">
    	private void Page_Load(object sender, System.EventArgs e)
    	{
    		if (!Page.IsPostBack)
    		{
    			//auto seleziono la lingua
    			CultureInfo original=CultureInfo.CreateSpecificCulture(Request.UserLanguages[0]);
    			Thread.CurrentThread.CurrentUICulture=original;
    			//la seleziono anche nella lista di lingue
    			ListItem item=llist.Items.FindByValue(original.ToString());
    			if (item!=null) llist.SelectedIndex=llist.Items.IndexOf(item);
    			//carico i dati
    			bindValues();
    		}
    	}
    
    	private void bindValues()
    	{
    		//carico le risorse dall'assembly di risorse
    		Assembly assembly=Assembly.Load("resourceScriptText");
    		ResourceManager rm=new ResourceManager("resourceScript",assembly);
    		//associo i valori
    		language.Text=rm.GetString("Language");
    		link1.Text=rm.GetString("Link1");
    		link2.Text=rm.GetString("Link2");
    		link3.Text=rm.GetString("Link3");
    		content.Text=rm.GetString("Content");
    		//rilascio le risorse
    		rm.ReleaseAllResources();
    	}
    
    	protected void llist_changed(object s, EventArgs e)
    	{
    		//imposto la lingua in base a quella selezionata
    		Thread.CurrentThread.CurrentUICulture = new CultureInfo(llist.SelectedItem.Value);
    		bindValues();
    	}
    </script>
    	
    <form runat="server">
    <table width="700" align="center" border="1" cellPadding="5" cellSpacing="0" borderColor="#000000">
      <tr>
        <td colspan="2">
          <font size="+2">Resources script</font>
        </td>
      </tr>
      <tr>
        <td width="68%">
          <asp:HyperLink NavigateUrl="#" EnableViewState="false" id="link1" runat="server"/> |
          <asp:HyperLink NavigateUrl="#" EnableViewState="false" id="link2" runat="server"/> |
          <asp:HyperLink NavigateUrl="#" EnableViewState="false" id="link3" runat="server"/>
        </td>
        <td width="35%" align="right">
          <asp:Label id="language" EnableViewState="false" runat="server"/>
          <asp:DropDownList id="llist" EnableViewState="true" runat="server" AutoPostBack="true" onSelectedIndexChanged="llist_changed">
    	<asp:ListItem value="" selected="true">Default</asp:ListItem>
    	<asp:ListItem value="it-IT">Italiano</asp:ListItem>
          </asp:DropDownList>
        </td>
       </tr>
       <tr>
         <td align="justify" colSpan="2">
    	
    
    </p>
    	  <asp:Label id="content" EnableViewState="false" runat="server"/>
    	
    
    </p>
         </td>
       </tr>
    </table>
    </form>
    allora l'esempio l'ho capito bene...però ora vorrei capire una cosa.
    Io ho 30 variabili divisi in 3 pagine. Ogni volta che accedo in una pagina devo fare il caricamento variabili della relativa pagina o posso fare in un'altro modo?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.