Cet article commencera par les concepts de base de la mondialisation et de la localisation des ressources dans Asp.net, et expliquera les étapes et les méthodes pour réaliser la mondialisation et la localisation dans Asp.net1.1 et Asp.net2.0.
un. Notions de base
1. Pourquoi localiser les ressources ?
Notre site peut être consulté par des personnes de différents pays et régions du monde, et les personnes de chaque pays et région ont leur propre langue et leurs propres caractéristiques culturelles. Prenons l’exemple de notre grande patrie : la Chine continentale utilise le chinois simplifié, tandis que Hong Kong, Macao et Taiwan utilisent le chinois traditionnel. De plus, chaque pays a des formats d'expression différents pour la devise, les chiffres, le calendrier et d'autres informations. Notre pays utilise principalement le format année, mois et jour, tandis que les États-Unis utilisent le format mois, jour et année. Il existe de nombreuses différences de ce type, je ne donnerai donc pas beaucoup d’exemples. Afin d'offrir aux visiteurs de notre site Web une meilleure expérience utilisateur, nous devons proposer une solution globale. Tant que l'utilisateur sélectionne sa langue et sa région, le site affichera les informations de la page en fonction de sa langue et de ses habitudes culturelles. localisation.
2.
Les nomsde culture, de culture fixe, de culture non spécifique et de culture spécifique à la culture
suivent la norme RFC 1766 et sont au format « <codelangue2>-<codepays/région2> », où <codelangue2> est dérivé de la norme ISO 639-1. code minuscule à deux lettres, <country/regioncode2> est un code à deux majuscules dérivé de la norme ISO 3166. Par exemple, l'anglais américain se dit « en-US ». Lorsque les codes de langue à deux lettres ne sont pas disponibles, des codes à trois lettres dérivés de la norme ISO 639-2 sont utilisés, par exemple, le code à trois lettres « div » est utilisé pour les régions où la langue Dhivehi est parlée ; Certains noms de culture ont des suffixes qui spécifient un symbole d'écriture ; par exemple, "-Cyrl" spécifie un symbole d'écriture cyrillique et "-Latn" spécifie un symbole d'écriture latine. Exemple:
Nom de la culture | Identifiant | de la culture Langue - Pays |
zh-CN | 0x0804 | Chinois - Chine |
zh-TW | 0x0404 | Chinois - Taiwan |
zh-CHS | 0x0004 | Chinois simplifié |
zh-CHT | 0x |
7C |
04 | Chinois traditionnel | |
en | 0x0009 | Anglais |
en - US | 0x0409 | Anglais - États-Unis | en
- | GB | 0x0809 |
uz | - | UZ - Cyrl |
0x0843 | Ouzbek (cyrillique) - Ouzbékistan uz-UZ-Latn 0x0443 | Ouzbek (latin) - Ouzbékistan |
Les cultures fixes ne sont pas sensible à la culture. Vous pouvez utiliser la chaîne vide ("") pour spécifier une culture fixe par son nom ou par l'identifiant de culture 0x007F. Les instances de culture invariantes sont représentées par la propriété InvariantCulture de la classe CultureInfo. Les cultures fixes ne sont associées qu’à la langue anglaise, pas à n’importe quel pays. Il peut être utilisé dans presque toutes les méthodes de l'espace de noms « mondialisé » qui nécessite une culture. Si votre programme effectue des comparaisons de chaînes ou des opérations de changement de casse, il doit utiliser une InvariantCulture pour garantir que quelle que soit la culture définie par le système, le comportement sera effectué conformément à la culture fixe de la langue anglaise représentée par InvariantCulture. Cependant, une culture fixe ne doit être utilisée que par des processus qui nécessitent des résultats indépendants de la culture (comme les services système), sinon les résultats qu'elle obtient peuvent être linguistiquement incorrects ou culturellement inappropriés ; Exemple : CultureInfo Invc = New CultureInfo("");
CultureInfo Invc = CultureInfo.InvariantCulture; Ces deux lignes de code ont le même effet, le but est d'obtenir une instance de culture invariante.
Par exemple, vous souhaitez maintenant exécuter la méthode dateTime.ToString() sur une instance DateTime dateTime. Cette méthode utilise en fait la CurrentCulture de votre thread actuel comme culture par défaut et convertit l'instance de date en la forme de chaîne correspondante basée sur cette culture. Donc, si nous n'en avons pas besoin pour effectuer l'opération ToString en fonction du thread ou de la culture du système à ce moment-là, nous devrions alors utiliser cette méthode dateTime.ToString("G", CultureInfo.InvariantCulture) ou dateTime.ToString("G" , DateTimeFormatInfo.InvariantInfo) .
Une culture neutre est une culture associée à une langue mais pas à un pays. Une culture spécifique est associée à une certaine langue et à un certain pays. Par exemple, « en » est une culture neutre, tandis que « en-US » est une culture spécifique. Notez que « zh-CHS » (chinois simplifié) et « zh-CHT » (chinois traditionnel) sont neutres du point de vue culturel.
Les cultures ont une structure hiérarchique, c'est-à-dire que le parent d'une culture spécifique est une culture non spécifique et que le parent d'une culture non spécifique est une culture invariante. La propriété Parent de la classe CultureInfo renverra la culture non spécifique associée à la culture spécifique. Si la ressource spécifique à la culture n'existe pas sur le système ou est indisponible, la ressource non spécifique à la culture est utilisée ; si la ressource non spécifique à la culture est également indisponible, la ressource intégrée dans l'assembly principal est utilisée.
3. Implémentez des types, propriétés et méthodes communs pour la localisation.
La classe CultureInfo représente des informations sur une culture spécifique, y compris le nom de la culture, le système d'écriture et le calendrier utilisé, ainsi que des informations sur les opérations courantes (telles que le formatage des dates et des dates). chaînes de tri). Donne accès à des objets d’information spécifiques à la culture. Il existe généralement deux manières d'instancier la classe CultureInfo, comme suit :
CultureInfo culture = CultureInfo. CreateSpecificCulture (nom) ;
CultureInfo culture = new CultureInfo(name);
La différence entre les deux est qu'en utilisant la première méthode, vous ne pouvez créer qu'une instance CultureInfo d'une culture fixe ou d'une culture spécifique. Si name est une chaîne vide, une instance de culture fixe est créée. Si name est une culture non spécifique, une instance CultureInfo spécifique à la culture par défaut associée à name est créée. La deuxième méthode consiste à créer une instance CultureInfo de la culture spécifiée par son nom, qui peut être fixe, non spécifique ou spécifique à la culture.
La propriété CurrentCulture de la classe Thread est utilisée pour obtenir ou définir la culture du thread actuel. Il doit être adapté à une culture spécifique. Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); Si Thread.CurrentThread.CurrentCulture = new CultureInfo("en ");
La propriété CurrentUICulture de la classe Thread est utilisée pour obtenir ou définir la culture actuelle utilisée par le gestionnaire de ressources pour rechercher des ressources spécifiques à la culture au moment de l'exécution. Le gestionnaire de ressources ici peut être associé à la classe ResourceManger.
Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
La classe ResourceManger peut trouver des ressources spécifiques à la culture, fournir des ressources de remplacement lorsque les ressources localisées n'existent pas et prendre en charge la sérialisation des ressources. Le constructeur ResourceManager couramment utilisé est public ResourceManager(string, Assembly). Sa signification est d'initialiser une nouvelle instance de la classe ResourceManager, qui recherche les fichiers de ressources de l'assembly donné en utilisant le nom racine spécifié. Le nom dit racine est, par exemple, le nom racine d'un fichier de ressources nommé "MyResource.en-US.resources" est "MyResource". Un espace de noms peut être ajouté à l'expression du nom racine, tel que « MyWebSite.Resource.UserFolder.MyResource ». L'Assembly peut être l'Assembly où se trouve la page qui doit appeler le fichier de ressources, par exemple typeof(MyPage).Assembly. La méthode GetString de la classe ResourceManager est utilisée pour obtenir la valeur de la clé spécifiée dans le fichier de ressources. Exemple : lorsque la propriété CurrentUICulture du thread a été définie, suivez la méthode suivante.
ResourceManager rm = new ResourceManager("items", Assembly.GetExecutingAssembly());
String str = rm.GetString("welcome");
Si vous souhaitez obtenir des ressources selon la culture spécifiée, écrivez comme suit :
ResourceManager rm = new ResourceManager("items", Assembly.GetExecutingAssembly());
CultureInfo ci = Thread.CurrentThread.CurrentCulture;
String str = rm.GetString("bienvenue",ci);
deux. Pour implémenter la localisation des ressources dans Asp.net1.1,
vous devez d'abord créer un dossier de ressources dans le projet de site Web WebTest et stocker les fichiers de ressources communs à l'ensemble du projet dans ce dossier. Par exemple, nous avons créé les trois fichiers de ressources suivants : MyResource.en.resx, MyResource.en-US.resx, MyResource.zh-CN.res. Il existe deux paires clé-valeur dans chaque fichier de ressources, les valeurs clés sont State et Address. Appelez le fichier de ressources dans la page MyPage.aspx qui doit utiliser le fichier de ressources, comme indiqué ci-dessous :
Thread.CurrentThread.CurrentCulture= CultureInfo.CreateSpecificCulture("zh-CN");
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
ResourceManager rm = new ResourceManager("WebTest.Resource.MyResource", typeof (MyPage).Assembly);
Label1.Text = rm.GetString("State");
Label2.Text = rm.GetString("Address");
Eh bien, à ce moment, Label1 et Label2 afficheront "l'état" et "l'adresse" conformément aux réglementations du fichier MyResource.zh-CN.resx. Ce qui précède est la méthode de localisation la plus basique et la plus simple. Il y a quelques problèmes cachés ici. Résolvons et optimisons cette méthode un par un.
1. Comment obtenir la culture par défaut de l'utilisateur
consiste à définir les paramètres de l'option "Propriétés" -> "Langue" du navigateur de l'utilisateur. Prenez celle du haut comme langue par défaut de l'utilisateur.
CultureInfo cultureInfo = CultureInfo.CreateSpecificCulture(Request.UserLanguages[0]);
Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;
Généralement, CurrentCulture et CurrentUICulture sont définis pour avoir la même culture. Bien sûr, ils peuvent également être différents. Par exemple, vous spécifiez que CurrentCulture est en-US et CurrentUICulture est zh-CN. Cela a pour effet que la devise, la date et d'autres informations sur la page sont affichées au format anglais américain et que le gestionnaire de ressources obtiendra le contenu qui doit être obtenu à partir du fichier de ressources à partir de MyResource.zh-CN.resx. déposer.
Si la page de votre site ne fournit pas la fonction permettant aux utilisateurs de sélectionner une langue, elle sera affichée par défaut en fonction de la culture définie par le navigateur de l'utilisateur, vous pouvez donc mettre le code ci-dessus dans la méthode Application_BeginRequest de Global.asax. fichier cs. De cette façon, chaque fois qu'un utilisateur fait une demande pour une page, notre programme définira d'abord la culture.
2. Mémoriser les paramètres régionaux de l'utilisateur
Les paramètres régionaux ou les sélections du navigateur peuvent être mémorisés tout au long de la session. Mais cette opération ne peut pas être effectuée dans la méthode Application_BeginRequest du fichier Global.asax.cs, car la session n'est toujours pas disponible à ce moment-là. Si votre site ne permet pas aux utilisateurs de sélectionner une langue, vous n'avez pas besoin de mémoriser les paramètres régionaux de l'utilisateur. Définissez-le simplement dans la méthode Application_BeginRequest dans le fichier Global.asax.cs comme décrit ci-dessus. performance. Cela évite principalement les conflits dans lesquels l'utilisateur modifie soudainement les paramètres de langue dans le navigateur à mi-chemin, mais le site Web affiche toujours le contenu de la page à l'utilisateur en fonction de la culture stockée dans la session.
Si vous avez mentionné la fonction permettant à l'utilisateur de sélectionner une langue, vous devez évidemment utiliser une session dans le programme de page pour enregistrer la sélection culturelle de l'utilisateur. Étant donné que chaque demande du client au segment de serveur, le segment de serveur ouvrira un nouveau thread pour le traitement et la réponse. Si votre programme ne mémorise pas la sélection du client, il répondra uniquement avec la culture par défaut.
3. Comment le gestionnaire de ressources trouve-t-il les fichiers de ressources correspondants pour une culture spécifiée ?
Lors de l'exécution d'une opération de valeur, c'est-à-dire lors de l'exécution de la méthode GetString de la classe ResourceManager, le gestionnaire de ressources recherchera le fichier de ressources correspondant en fonction de la propriété CurrentUICulture du thread actuel. Il existe plusieurs situations :
(1). Par exemple, si la culture correspondant à la CurrentUICulture actuelle est en-US, vérifiez d'abord si MyResource.en-US.resx existe. Si elle existe, prenez-en la valeur si elle n'existe pas. si MyResource.en.resx existe.
(2). Par exemple, la culture correspondant à la CurrentUICulture actuelle est en, car en est une culture non spécifique, puis recherchez d'abord si le fichier de ressources MyResource.en-US.resx de la culture spécifique en-US lui est associé. par défaut existe. Si tel est le cas, récupérez-en la valeur ; si elle n'existe pas, vérifiez si MyResource.en.resx existe.
(3). Par exemple, si la culture correspondant à la CurrentUICulture actuelle est en-GB, recherchez d'abord le fichier de ressources MyResource.en-GB.resx s'il n'existe pas, vérifiez si MyResource.en.resx existe. il existe, récupérez-en la valeur ; S'il n'existe pas, vérifiez si le fichier de ressources MyResource.en-US.resx de la culture spécifique par défaut en-US associée à en existe. existe actuellement, mais MyResource.en-CA resx existe, le programme lancera toujours une exception indiquant que le fichier de ressources approprié est introuvable.
On peut donc résumer que lorsque le thread courant CurrentUICulture correspond à une culture spécifique, le gestionnaire de ressources recherche d'abord le fichier de ressources correspondant à cette culture spécifique s'il n'est pas trouvé, il recherchera son fichier de ressources non-culturel. il n'a pas encore été trouvé, puis recherchez le fichier de ressources de la culture par défaut associée à son association non spécifique à la culture. Lorsque le CurrentUICulture du thread actuel correspond à une culture non spécifique, le gestionnaire de ressources vérifie d'abord si le fichier de ressources spécifique à la culture par défaut correspondant à la culture non spécifique existe. S'il n'existe pas, vérifiez si le fichier de ressources correspondant à la culture non spécifique. -une culture spécifique existe et lève une exception si elle n'existe pas non plus.
4. Comment gérer les cultures qui ne fournissent pas de support de localisation ?
Si le site ne fournit pas de fichiers de ressources correspondants pour prendre en charge la culture par défaut de l'utilisateur, la culture CurrentUICulture de son fil de discussion actuel doit être convertie dans la culture par défaut de votre site, telle que en-US ou zh-CN. Il existe deux possibilités de conversion :
La première est que lorsque vous obtenez Request.UserLanguages[0], comparez-le avec le préréglage de culture pris en charge dans le fichier de configuration. S'il est confirmé qu'il n'est pas pris en charge, définissez immédiatement CurrentUICulture comme culture par défaut.
La seconde consiste à utiliser la structure try catch pour capturer l'exception MissingManifestResourceException lors de l'utilisation de la méthode GetString de ResourceManager pour obtenir la valeur. Dans la gestion des exceptions, définissez d'abord CurrentUICulture sur la culture par défaut, puis utilisez GetString pour obtenir à nouveau la valeur.
5. Définissez la culture et l'uiCulture par défaut du site via Web.config
<globalization requestEncoding="utf-8" ResponseEncoding="utf-8" uiCulture="zh-CN" culture="en-US"/>
Comme indiqué ci-dessus : Il est précisé que la culture par défaut du site est en-US (il doit s'agir ici d'une culture spécifique), et la uiCulture est zh-CN.
Bien entendu, vous pouvez également le paramétrer page par page dans la balise Page de chaque page : <@Page Culture="zh-CN" UICulture="fr">. Quelle que soit la façon dont web.config est défini ici, la page sera affichée en fonction des paramètres de la balise Page.
trois. Implémentation de la localisation des ressources dans Asp.net2.0
Asp.net2.0 fournit des méthodes d'implémentation plus diverses pour la localisation des ressources. Je vais me concentrer ici sur les différences par rapport à Asp.net1.1.
1. La définition de la culture et de l'uiCulture par défaut du site via Web.config
a déjà été abordée dans Asp.net1.1 en utilisant le fichier web.config pour définir la culture du site, mais dans Asp.net2.0, c'est plus flexible. En règle générale, vous souhaiterez que toutes les pages de votre site soient conformes à la même culture. Attribuez simplement une valeur "auto" à l'échelle du site aux attributs UICulture et Culture (culture) de l'élément de globalisation dans web.config comme indiqué ci-dessous. Notez que cette valeur "auto" n'est pas utilisée dans Asp.net1.1 acceptée. <globalization uiCulture="auto" culture="auto" /> La signification de auto est qu'ASP.NET obtient le paramètre de culture préféré de l'utilisateur en vérifiant l'en-tête HTTP envoyé par le navigateur et utilise cette culture pour définir la culture par défaut du site. C’est-à-dire les propriétés CurrentUICulture et CurrentCulture du thread actuel.
En plus des paramètres automatiques, vous pouvez également spécifier la culture par défaut d'un site pour Asp.net : <globalization uiCulture="auto:zh-CN" culture="auto:zh-CN" /> Remarque : Ceci n'est possible que si ASP. NET ne peut pas trouver l'en-tête HTTP pour déterminer la culture préférée de l'utilisateur. Par exemple, lorsqu'il n'y a aucun paramètre de culture dans les « Propriétés » -> « Langue » du navigateur et qu'il est complètement vide, la culture par défaut définie après auto prendra effet.
Une fois la globalisation configurée dans web.config, votre application n'a pas besoin d'écrire de code. Les CurrentUICulture et CurrentCulture du thread obtiendront les paramètres de culture en fonction des valeurs des attributs uiCulture et culture définies dans l'élément de globalisation. Si la globalisation n’est pas configurée, CurrentUICulture et CurrentCulture du thread seront par défaut en-US.
2. Utilisez le fichier Web.config pour suivre la sélection régionale de l'utilisateur
Dans Asp.net1.1, les sites qui proposent une sélection régionale utilisent généralement des sessions pour enregistrer la sélection de l'utilisateur afin que chaque fois que l'utilisateur fait une demande sur le site, All. le contenu affiché est localisé en fonction de la culture choisie par l'utilisateur. Une autre méthode fournie dans Asp.net2.0 consiste à utiliser le fichier web.config pour suivre la sélection culturelle de l'utilisateur.
Vous pouvez prendre en charge l'identification anonyme de la culture d'un utilisateur en ajoutant une propriété de profil basée sur une chaîne appelée LanguagePreference à votre fichier web.config. Veuillez noter que l'attribut activé de l'élément anonymeIdentification doit être "true", sinon la fonction d'identification anonyme ne sera pas disponible.
<anonymousIdentification activé="true"/>
<profil>
<propriétés>
<add name="LanguagePreference" type="string" defaultValue="auto" allowAnonymous="true" />
</propriétés>
</profile>
Ci-dessous, j'expliquerai comment programmer l'attribut LanguagePreference dans Asp.net2.0. Tout d’abord, vous pouvez écrire une classe PageBase, qui hérite de System.Web.UI.Page et sert de classe de base pour toutes les classes de page du site. Le but est en fait très simple : extraire certains processus de traitement courants dans chaque page et les placer dans la classe de base pour réduire la duplication de code et améliorer la maintenabilité. Écrivez ensuite le code suivant dans la classe PageBase : protected override void InitializeCulture()
{
base.InitializeCulture();
chaîne LanguagePreference = ((ProfileCommon)this.Context.Profile).LanguagePreference;
//Lorsque l'utilisateur visite ce site pour la première fois et que Profile.LanguagePreference est vide, identifiez le paramètre de langue du navigateur de l'utilisateur
si (string.IsNullOrEmpty (LanguagePreference))
{
if (this.Context.Request.UserLanguages != null)
{
LanguagePreference = this.Context.Request.UserLanguages[0];
((ProfileCommon)Context.Profile).LanguagePreference = LanguagePreference;
}
}
autre
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(LanguagePreference);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(LanguagePreference);
}
}
La méthode InitializeCulture de la classe System.Web.UI.Page est nouvellement ajoutée dans Asp.net2.0. Elle définit Culture et UICulture pour le thread actuel. Le cycle de vie de la page a été conçu pour que la méthode InitializeCulture s'exécute avant l'Init et le Load de la page. Dans le code ci-dessus, utilisez d'abord ((ProfileCommon)this.Context.Profile).LanguagePreference; pour obtenir la valeur de l'attribut de profil LanguagePreference actuel et déterminer s'il est vide, c'est-à-dire si les paramètres culturels ont été enregistrés pour l'utilisateur. . Si vide, la culture préférée de l'utilisateur est obtenue à partir de l'en-tête Http et enregistrée via ((ProfileCommon)Context.Profile).LanguagePreference = LanguagePreference;. S'il n'est pas vide, cela signifie que les paramètres de culture de l'utilisateur ont été enregistrés, utilisez alors cette culture pour définir les propriétés CurrentUICulture et CurrentCulture du thread actuel.
Si <globalization uiCulture="auto" culture="auto" /> est défini dans Web.config, alors le code ci-dessus peut être simplifié comme suit : protected override void InitializeCulture()
{
base.InitializeCulture();
string LanguagePreference = ((ProfileCommon)this.Context.Profile).LanguagePreference;
if(!string.IsNullOrEmpty(LanguagePreference))
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(LanguagePreference);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(LanguagePreference);
}
autre
{
((ProfileCommon)Context.Profile).LanguagePreference = Thread.CurrentThread.CurrentCulture.Name;
}
}
Si le site fournit une fonction qui permet aux utilisateurs de sélectionner une culture, par exemple en plaçant une liste de sélections de langues dans la page maître du site, alors le choix de culture de l'utilisateur peut être mémorisé via l'instruction suivante :
protected void lstLanguage_SelectedIndexChanged (expéditeur d'objet, EventArgs e)
{
if (lstLanguage.SelectedValue != "Auto") //L'option par défaut est Auto
{
Profile.LanguagePreference = lstLanguage.SelectedValue ;
}
autre
{
Profile.LanguagePreference = null ;
}
Réponse.Redirect(Request.Url.AbsolutePath);
}
Faites attention à la ligne de code Response.Redirect(Request.Url.AbsolutePath); car le code de gestion des événements est exécuté après Page_Load, si vous souhaitez que la page change rapidement, vous devez effectuer une opération de redirection.
Lors de l'utilisation de fichiers de ressources pour créer des fichiers de ressources globales sur le site
dans Asp.net2.0
, VS.Net2005 créera automatiquement un dossier App_GlobalResources spécifiquement pour stocker les fichiers de ressources globales.Le fichier de ressources global est un fichier de ressources utilisé par plusieurs fichiers de pages ou pages maîtres du site. Supposons que nous créions des fichiers nommés MyResource.resx et MyResource.zh-cn.resx. Dans le programme, nous pouvons utiliser le code suivant pour obtenir la valeur dans le fichier de ressources : this.lblCountry.Text = Resources.MyResource.Country;
Où Country est la clé dans le fichier de ressources. Évidemment, c'est beaucoup plus simple que d'obtenir des valeurs à partir de fichiers de ressources dans Asp.net 1.1.
Il y a deux problèmes à noter ici : Premièrement, lors de la création d'un groupe de fichiers de ressources avec le même nom racine, des fichiers sans identification de culture doivent être créés, tels que MyResource.resx, d'autres tels que MyResource.en-gb resx et MyResource. zh-cn.resx sont créés selon les besoins. Si MyResource.resx n'est pas créé et que seul MyResource.zh-cn.resx est créé, MyResource n'apparaîtra pas sous l'espace de noms Resources dans le code ci-dessus, donc la compilation du code ci-dessus ne peut pas réussir. MyResource.resx doit stocker le contenu de la langue par défaut du site au cas où un fichier de ressources localisé correspondant à CurrentUICulture du thread actuel ne serait pas trouvé ou si la valeur de clé correspondante ne serait pas trouvée dans le fichier de ressources localisé. Asp.net est basé sur la clé du fichier MyResource.resx. Si la clé Country n'existe pas dans MyResource.resx, mais que la clé Country existe dans MyResource.zh-cn.resx, le code ci-dessus signalera également une erreur. lors de la compilation. Deuxièmement, Asp.net ne signalera aucune exception lorsqu'il ne trouvera pas la ressource localisée dans la zone correspondante. Il obtiendra automatiquement la valeur du fichier MyResource.resx, mais il ne modifiera pas la CurrentUICulture du thread actuel.
Lors de la création de fichiers de ressources locales sur le site, VS.Net2005 créera automatiquement un dossier App_LocalResources spécifiquement pour stocker les fichiers de ressources locales. Les fichiers de ressources locaux sont des fichiers de ressources utilisés pour un fichier d'une seule page du site. Sa méthode de dénomination est généralement Default.aspx.resx et Default.aspx.zh-cn.resx. Maintenant, j'ajoute trois clés Language, lblNavigation.Text et lblNavigation.ForeColor dans le fichier de ressources par défaut. Parmi eux, j'ai défini le bleu pour lblNavigation.ForeColor de Default.aspx.resx et le rouge pour lblNavigation.ForeColor de Default.aspx.zh-cn.resx. Il existe deux manières d'obtenir le contenu des fichiers de ressources locales dans Default.aspx dans le fichier d'échange :
(1). <asp:Label ID="lblLanguage" runat="server" Text="<%$ Resources:Language %>"></asp:Label>
(2).
Veillez à utiliser le symbole $ lorsque vous utilisez la première méthode. L'utilisation de la deuxième méthode est plus flexible et vous permet de définir des valeurs pour plusieurs propriétés du contrôle à la fois.
Il y a encore des problèmes à noter ici : le fichier de ressources locales par défaut de la page doit être créé, tel que Default.aspx.resx est requis, et Default.aspx.zh-cn.resx est requis. Si vous ne créez pas de fichier de ressources locales par défaut, mais utilisez des fichiers de ressources locales dans la page, lors de l'utilisation de la première méthode de liaison, une erreur de compilation se produira ; lors de l'utilisation de la deuxième méthode de liaison, aucune erreur de compilation ne se produira. Une erreur se produit, mais les paramètres de ces propriétés n'ont aucun effet, comme s'ils n'étaient pas écrits.
4. Affichage d'images localisées
L'affichage d'images localisées est également une nouvelle fonctionnalité d'Asp.net2.0. Dans Asp.net2.0, les fichiers de ressources ne se limitent pas aux combinaisons de paires clé-valeur de type chaîne, ils peuvent enregistrer plusieurs types de fichiers. Utilisez cette fonctionnalité pour localiser les images. En fait, les images dites localisées ne sont rien d'autre que le placement d'images préparées pour différentes régions dans différents fichiers de ressources localisés. Par exemple, placez LitwareSlogan.jpg dans MyResource.resx et mettez LitwareSlogan.cn.jpg dans MyResource.zh-cn.resx.
Lorsque des fichiers de ressources globales de différentes versions localisées contiennent des versions localisées de fichiers image, vous pouvez personnaliser un fichier de gestionnaire nommé MyLocalImage.ashx pour le charger de manière conditionnelle en fonction des préférences linguistiques de l'utilisateur. Le code est le suivant.
Méthode d'appel dans la page :
<asp:Image ID="Image1" runat="server" ImageUrl="~/ MyLocalImage.ashx" />
Comment écrire le gestionnaire de MyLocalImage.ashx :
classe publique MyLocalImage : IHttpHandler
{
public void ProcessRequest (contexte HttpContext)
{
contexte.Response.ContentType = "image/png";
chaîne LanaguageReference = ((ProfileCommon)context.Profile).LanguagePreference;
si (!string.IsNullOrEmpty(LananguageReference))
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(LananguageReference);
}
Bitmap bm = Resources.Litware.LitwareSlogan ;
Image MemoryStream = new MemoryStream();
bm.Save(image,ImageFormat.Png);
contexte.Response.BinaryWrite(image.GetBuffer());
}
}
La classe de gestionnaire personnalisé définie dans MyLocalImage.ashx utilise une logique similaire à celle que vous avez vue précédemment dans la méthode personnalisée InitializeCulture pour initialiser les paramètres CurrentUICulture pour le thread actuel avant de récupérer le fichier image du fichier de ressources global. Vous vous demandez peut-être pourquoi le CurrentUICulture du thread actuel a été défini dans la classe de base de la page et doit être réinitialisé ici, car le thread ici n'est pas le même thread que celui traité dans la classe de base. Une fois que le gestionnaire personnalisé a correctement initialisé les paramètres CurrentUICulture, il peut accéder au fichier image via la classe de ressources fortement typée de MyResource.resx. Ensuite, il suffit d'écrire les bits du fichier image dans le flux de réponse HTTP.