Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it L'avatar di albgen
    Registrato dal
    Jun 2005
    Messaggi
    3,249

    [C# o VB] Satellite Assembly,applicazione multilingua

    Salve a tutti
    allora, ho creato un'applicazione multilingua con 2 lingue(è un app tanto per provare come funziona il discorso multilingua).
    funziona tutto, il problema è che quando cambio la lingua(tramite una combobox), nell'evento TextChanged della combobox devo cambiare uno alla volta tutti i testi tramite delle istruzioni del genere.

    string cultura = "en-US";
    Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultura );
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultura );
    button1.Text = resourceManager.GetString("btn1");
    button2.Text = resourceManager.GetString("btn2");
    button3.Text = resourceManager.GetString("btn3");
    ......etc

    ovviamente questa è un problema, se io ho 100 testi da cambiare devo scrivere 100 righe di codice.

    si può fare più velocemente con una istruzione del tipo

    string cultura = "en-US";
    Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultura);
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultura );

    e lui in automatico carica l'assembly e quindi cambia anche tutte le stringhe...

    si può fare ?
    I got the remedy

  2. #2
    Utente di HTML.it L'avatar di albgen
    Registrato dal
    Jun 2005
    Messaggi
    3,249
    ho risolto con il reflection...
    se qualcuno ha un metodo più semplice, avanti...
    I got the remedy

  3. #3

    posteresti il codice?

    ciao,
    sono interessato all'argomento e sto cercando di risolverlo con Resource e DataBinding..

    Se possibile posteresti la tua soluzione, o almeno il codice principale?

    Grazie comunque,
    marco
    marco

  4. #4
    Utente di HTML.it L'avatar di albgen
    Registrato dal
    Jun 2005
    Messaggi
    3,249
    private void comboBox1_TextChanged(object sender, EventArgs e)
    {
    string specCult = "";
    if (comboBox1.Text.Contains("it-IT"))
    specCult = "it-IT";
    if (comboBox1.Text.Contains("en-AU"))
    specCult = "en-AU";
    if (comboBox1.Text.Contains("en-US"))
    specCult = "en-US";

    Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(specCult);
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(specCult);
    ResourceManager resMgr = new ResourceManager("MyApp", Assembly.GetExecutingAssembly());
    System.Reflection.FieldInfo[] fi = this.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);

    this.Text = resMgr.GetString("frm");
    for (int i = 0; i < fi.Length; ++i)
    {
    FieldInfo info = fi[i];
    if ((typeof(Button) == info.FieldType) || (typeof(CheckBox) == info.FieldType) || (typeof(Label) == info.FieldType))
    {
    Control item = (Control)info.GetValue(this);
    item.Text = resMgr.GetString(info.Name);
    }
    }


    }

    questo evento è collegato ala combobox che cambia la lingua...
    se non capisci qualcosa chiedi...
    I got the remedy

  5. #5
    innanzitutto grazie.
    Lo sto riscrivendo per vb.net, ma alla riga

    Me.Text = resMgr.GetString("frm")

    mi da il seguente errore:
    "Could not find any resources appropriate for the specified culture or the neutral culture. Make sure "MyApp.resources" was correctly embedded or linked into assembly "MultiLingual3" at compile time, or that all the satellite assemblies required are loadable and fully signed."

    credo debba creare qualcosa in cui andare a scrivere le coppie oggetto/valore, giusto? si tratta dei file di risorse o qualcos'altro? Immagino ce ne sarà uno per ogni lingua, confermi?
    marco

  6. #6
    Utente di HTML.it L'avatar di albgen
    Registrato dal
    Jun 2005
    Messaggi
    3,249
    devi creare una cartella per ogni lingua.
    per esempio per l'italiano(in italia) crei la cartella it-IT per l'inglese degli usa en-US e cosi' via...
    poi in ogni cartella devi crearti un file risorse che contengono coppie chiavi, valore(per es btn1=ok). si possono utilizzare 2 formati per le risorse, un semplice file txt oppure un file di risorse di visual studio.
    poi devi "compilare"(tramite dei cmd) questi file risorsa e produrre le dll(una per ogni lingua)...

    risorse in formato testo txt
    http://msdn2.microsoft.com/it-it/library/s9eey0h7(VS.80).aspx

    risorse in formato resx
    http://msdn2.microsoft.com/it-it/library/ekyft91f(VS.80).aspx

    quando compili uno dei 2 formati di sopra produce un file con estensione resources
    http://msdn2.microsoft.com/it-it/library/zew6azb7(VS.80).aspx

    poi da resources produci la dll tramite un tool

    un esempio completo su msdn spiegato abbastanza bene
    http://msdn2.microsoft.com/en-us/lib...cemanager.aspx
    I got the remedy

  7. #7
    sto seguendo le indicazioni presenti in questo esempio:
    http://msdn2.microsoft.com/it-it/lib...esourcemanager(VS.80).aspx

    però non so come continuare. Ho creato i 2 file indicati (rmc.resources -come da step2- e rmc.resouces.dll -come da step 6-)

    Ditemi se sbaglio, nel mio progetto vb.net, in Esplora Soluzioni, ho creato un cartella Resouces e una sottocartella es-ES.

    I file sopraindicati devo metterli in queste cartelle? Ho provato ma quando eseguo mi becco:
    "Impossibile trovare risorse appropriate per il gruppo linguistico specificato o per la lingua non associata ad alcun paese. Assicurarsi che "rmc.resources" sia stato correttamente incorporato o collegato all'assembly "MultiLingual3" in fase di compilazione o che tutti gli assembly satellite richiesti siano caricabili e firmati completamente."
    marco

  8. #8

    una soluzione

    Al momento ho trovato questa soluzione (VB.NET):

    Step 1 - i file con le traduzioni
    Creo dei file .txt (esempio "en-US.txt", "it-IT.txt") e dentro scrivo le traduzioni.
    Ad esempio nel file en-US.txt scrivo:
    FormMain.ButtonOpenForm.Text=Open form
    Form2.Text=Welcome

    mentre nel file it-IT.txt scrivo:
    FormMain.ButtonOpenForm.Text=Apri form
    Form2.Text=Benvenuto


    Step2 - i file .resources
    utilizzando resgne.exe compilo i .txt sopra indicati ed ottengo i rispettivi .resources
    Quindi avrò "en-US.resouces" e "it-IT.resources"
    Copiare questi file nella cartella "\bin\debug" della vostra applicazione.


    Step3 - Caricare le risorse
    Imports System.Resources
    Public Class FormMain
    Sub ChangeLanguage()
    Dim rs As ResourceSet
    rs = New ResourceSet(LanguageId & ".resources")
    ButtonOpenForm.Text = rs.GetString("FormMain.ButtonOpenForm.Text")
    rs.Close()
    rs.Dispose()
    End Sub
    End Class

    questo codice si collega al file risorse (la variabile globale LanguageId conterrà valori come "it-IT", "en-US"..) e legge, tramite getstring, le coppie dato/valore interessate.

    Step4 - e le altre form?
    Se il vostro programma prevede anche altre form (ad esempio Form2) è sufficiente che in fase di load della form, replichiate lo stesso codice sopra indicato, ovviamente andrete a leggere altri valori (non "FormMain.ButtonOpenForm.Text" ma per esempio "Form2.Text")

    Note conclusive:
    Se vi interessa cambiare solo le parole questo esempio è sufficiente, se invece volete ampliare il discorso e considerare anche le diverse formattazioni di numeri e date che una lingua differente può comportare, allora dovete approfondire il discorso con:
    Thread.CurrentThread.CurrentCulture = New CultureInfo(LanguageId)
    Thread.CurrentThread.CurrentUICulture = New CultureInfo(LanguageId)

    Spero di essere stato chiaro, schematico ed esaustivo. A disposizione per chiarimenti,
    marco

  9. #9
    il nome corretto è "resgen.exe" non "resgne.exe", ciao
    marco

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2007
    residenza
    Faenza
    Messaggi
    47

    help

    Originariamente inviato da albgen
    private void comboBox1_TextChanged(object sender, EventArgs e)
    {
    string specCult = "";
    if (comboBox1.Text.Contains("it-IT"))
    specCult = "it-IT";
    if (comboBox1.Text.Contains("en-AU"))
    specCult = "en-AU";
    if (comboBox1.Text.Contains("en-US"))
    specCult = "en-US";

    Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(specCult);
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(specCult);
    ResourceManager resMgr = new ResourceManager("MyApp", Assembly.GetExecutingAssembly());
    System.Reflection.FieldInfo[] fi = this.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);

    this.Text = resMgr.GetString("frm");
    for (int i = 0; i < fi.Length; ++i)
    {
    FieldInfo info = fi[i];
    if ((typeof(Button) == info.FieldType) || (typeof(CheckBox) == info.FieldType) || (typeof(Label) == info.FieldType))
    {
    Control item = (Control)info.GetValue(this);
    item.Text = resMgr.GetString(info.Name);
    }
    }


    }

    questo evento è collegato ala combobox che cambia la lingua...
    se non capisci qualcosa chiedi...
    ciao!
    ho fatto tutto quello che hai scritto ma mi viene segnalato un errore (lo stesso che ha segnalato marcobrambilla)
    Come posso fare? Devo aggiungere il file .resources ma non so dove e come...ti ringrazio per l'aiuto...ciaoo

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 © 2024 vBulletin Solutions, Inc. All rights reserved.