Les thèmes ASP.NET permettent de regrouper tout ce qui a trait à l'apparence d'un site pour pouvoir en changer rapidement. Pour des exemples, voir ici.
Le problème, c'est que dans une Skin on ne peut pas mettre d'expressions autres que <%# Eval %> et <%# Bind %>. Du coup on ne peut pas utiliser <%$ Resource ... %>. Devrait-on alors renoncer au multilinguisme? Non, et voici comment.
Dans cet exemple, je vais customiser l'apparence d'un GridView, et son en-tête va être traduit. Pour commencer, je déclare la grille dans la page ASPX:
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
Puis je place dans le fichier aspx.cs le code de remplissage de la grille:
protected void Page_Load(object sender, EventArgs e)
{
CultureInfo[] list = CultureInfo.GetCultures(CultureTypes.NeutralCultures);
GridView1.DataSource = list;
GridView1.DataBind();
}
Pour permettre la traduction, je crée un contrôle ResouceLabel qui prend un nom de ressource et affiche la ressource traduite. ResourceLabel.ascx est le suivant:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ResourceLabel.ascx.cs" Inherits="ResourceLabel" %>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
Et ResourceLabel.ascx.cs:
public partial class ResourceLabel : System.Web.UI.UserControl
{
public string Texte
{
set { Label1.Text = GetLocalResourceObject(value); }
}
}
Il ne me reste plus qu'à créer un thème "Def" que je déclare dans le Web.config avec le contrôle fraîchement créé:
<system.web>
<pages theme="Def">
<controls>
<add src="~/ResourceLabel.ascx" tagName="ResourceLabel" tagPrefix="uc1"/>
</controls>
</pages>
...
</system.web>
Pour finir, j'ajoute un fichier Grille.skin à mon thème, qui a le contenu suivant:
<asp:GridView runat="server" AutoGenerateColumns="False">
<Columns>
<asp:TemplateField>
<HeaderTemplate>
<uc1:ResourceLabel runat="server" Texte="A traduire" />
</HeaderTemplate>
<ItemTemplate>
<asp:Label runat="server" Text='<%# Bind("EnglishName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Et le tour est joué! La chaîne "A traduire" apparaîtra traduite d'après le fichier RESX local de la page.
Comments