Condividi tramite


ResourceManager e ASP.NET

È possibile accedere a ResourceManager anche da applicazioni Web mediante ASP.NET. Il codice per questa piccola applicazione è disponibile nella sottodirectory WorldDocs e le routine più importanti sono contenute in due file: Global.asax e Default.aspx.

La prima richiesta dell'utente all'applicazione WorldDocs carica Global.asax ed esegue la subroutine Application_Onstart. Ancora una volta la subroutine utilizza il metodo CreateFileBasedResourceManager statico per la creazione di uno strumento di gestione delle risorse per caricare le risorse basate su testo da file anziché da assembly. Anche nei programmi di esempio precedenti è stato illustrato lo stesso meccanismo. L'applicazione ResourceManager viene quindi assegnata alla variabile RM di Application. Ogni richiesta dell'utente esegue anche la subroutine Application_BeginRequest, che determina l'assegnazione della lingua dell'utente (in base a quanto specificato dalla proprietà Request.UserLanguages) al thread in esecuzione corrente al server Web, come viene illustrato nel codice riportato di seguito.

Listato 5. Risorse con nome con ResourceManager (Global.asax)

void Application_OnStart() {
    Application["RM"] = 
        ResourceManager.CreateFileBasedResourceManager 
       ("mytext", Server.MapPath("resources") 
       + Path.DirectorySeparatorChar, null);
}

void Application_BeginRequest(Object sender, EventArgs args) {
    // For each request initialize the culture values with
    // the user language as specified by the browser.

    try {
        Thread.CurrentThread.CurrentCulture = new 
            CultureInfo(Request.UserLanguages[0]);
    }
    catch(Exception) {
        // provide fallback for not supported languages.
        Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
    }

    Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
}

L'assegnazione delle risorse dinamiche viene gestita man mano che la pagina viene caricata, in questo caso nelle subroutine Page_Init e Page_Load in Default.aspx. Page_Init crea una ResourceManager con ambito di pagina e assegna la variabile RM di Application. La subroutine Page_Load modifica dinamicamente la lingua, eseguendo automaticamente il postback al server ogni volta che l'utente modifica la selezione della lingua, come viene illustrato nel codice riportato di seguito.

Listato 6. Risorse con nome con ResourceManager (Default.aspx)

void Page_Init(Object sender, EventArgs args) {
    // Get the ResourceManager from the Application object.
    rm = (ResourceManager) Application["RM"];
    ...
}

void Page_Load(Object sender, EventArgs args) {
    String SelectedCulture = MyUICulture.SelectedItem.Text;
    if(! SelectedCulture.StartsWith("Choose")) {
        // If another culture was selected, use that instead.
        Thread.CurrentThread.CurrentCulture = new  
            CultureInfo(SelectedCulture);
        Thread.CurrentThread.CurrentUICulture = new  
            CultureInfo(SelectedCulture);
    }
}

La porzione finale di codice da esaminare è quella che effettivamente restituisce le risorse immagine e di tipo stringa.

    <img src="Flags/<%=CultureInfo.CurrentCulture%>.jpg">
    <%=rm.GetString("greeting")%>

La risorsa immagine viene determinata dinamicamente attraverso la generazione di una specifica del file basata sul codice della lingua dell'utente e la risorsa di tipo stringa utilizza ResourceManager per caricare una risorsa di tipo stringa dal file RESOURCES appropriato.