Empaquetage et déploiement de ressources

Le .NET Framework utilise un modèle « hub and spoke » pour empaqueter et déployer les ressources. Le hub est l'assembly principal qui contient le code exécutable non localisé et les ressources pour une culture, appelée la culture neutre ou par défaut. La culture par défaut est la culture de secours pour l'application. Chaque spoke se connecte à un assembly satellite qui contient les ressources pour une culture, mais ne contient pas de code.

Ce modèle comprend plusieurs avantages :

  • Vous pouvez ajouter de façon incrémentielle des ressources pour de nouvelles cultures après avoir déployé une application. Dans la mesure où le développement ultérieur de ressources spécifiques à une culture peut nécessiter du temps, cela vous permet de libérer d'abord votre application principale, puis de proposer des ressources spécifiques à une culture ultérieurement.

  • Vous pouvez mettre à jour et changer les assemblys satellites d'une application sans recompiler l'application.

  • Une application a besoin de charger uniquement les assemblys satellites qui contiennent les ressources nécessaires pour une culture spécifique. Cela peut diminuer de manière importante l'utilisation des ressources système.

Cependant, ce modèle a également des inconvénients :

  • Vous devez gérer plusieurs ensembles de ressources.

  • Le coût initial du test d'une application augmente, car vous devez tester plusieurs configurations. À longue échéance, il sera plus facile et moins coûteux de tester une application principale et plusieurs satellites, que de tester et de tenir à jour en parallèle plusieurs versions internationales.

Conventions d'affectation de noms pour les ressources

Lorsque vous empaquetez les ressources de votre application, vous devez les nommer en utilisant les conventions d'affectation de noms que le Common Language Runtime attend. Le runtime identifie une ressource par la signature de sa culture, ou nom. Chaque culture a un nom unique, qui est une combinaison d'un nom de culture de deux lettres en minuscules associé à une langue, et si nécessaire, un nom de sous-culture en majuscules à deux lettres associé à un pays ou une région. Le nom de la sous-culture suit le nom de la culture, séparé par un tiret (-). Par exemple, ja-JP pour japonais au Japon, en-US pour anglais américain ou de-DE pour allemand en Allemagne (par opposition à de-AT pour allemand en Autriche). Consultez la classe CultureInfo pour obtenir une liste complète des noms de culture.

Processus de secours pour les ressources

Le modèle « hub and spoke » pour l'empaquetage et le déploiement des ressources utilise un processus de secours pour rechercher les ressources adéquates. Si l'utilisateur d'une application demande un ResourceSet qui n'est pas disponible, le Common Language Runtime recherche dans la hiérarchie des cultures une ressource de secours appropriée qui est la plus proche de celle demandée par l'utilisateur, et déclenche une exception uniquement en dernier ressort. À chaque niveau de la hiérarchie, si une ressource appropriée est trouvée, le runtime l'utilise. Si la ressource n'est pas trouvée, la recherche se poursuit au niveau suivant. Le processus de secours est décrit ci-après :

  1. Le runtime recherche tout d'abord un assembly qui correspond à la culture demandée dans le Global Assembly Cache pour votre application.

    Le Global Assembly Cache peut stocker des assemblys de ressources partagés par de nombreuses applications. Cela vous permet de ne pas inclure des ensembles de ressources spécifiques dans la structure de répertoires de chaque application que vous créez. Si le runtime trouve une référence à l'assembly, il recherche la ressource demandée dans cet assembly. S'il trouve l'entrée dans l'assembly, il utilise la ressource demandée. S'il ne trouve pas l'entrée, il continue la recherche.

  2. Le runtime vérifie ensuite le répertoire de l'assembly en cours d'exécution à la recherche d'un répertoire qui correspond à la culture demandée. S'il trouve le répertoire, il recherche dedans un assembly satellite valide pour la culture demandée. Le runtime recherche ensuite dans l'assembly satellite la ressource demandée. S'il trouve la ressource dans l'assembly, il l'utilise. S'il ne trouve pas la ressource, il continue la recherche.

  3. Le runtime recherche ensuite de nouveau dans le Global Assembly Cache, cette fois l'assembly parent de la ressource demandée. Si l'assembly parent existe dans le Global Assembly Cache, le runtime recherche la ressource demandée dans cet assembly.

    Le parent est défini comme culture de secours appropriée. Les parents sont les meilleurs candidats ; car n'importe quelle ressource est préférable à la levée d'une exception. Ce processus vous permet de réutiliser les ressources. Vous devez inclure une ressource donnée au niveau parent uniquement si la culture enfant n'a pas besoin de localiser la ressource demandée. Par exemple, si vous fournissez des assemblys satellites pour en (anglais neutre), en-GB (anglais parlé en Grande-Bretagne) et en-US (anglais parlé aux États-Unis), le satellite en contient la terminologie commune et les satellites en-GB et en-US fournissent les substitutions pour les termes qui changent.

  4. Le runtime vérifie ensuite le répertoire de l'assembly en cours d'exécution pour voir s'il contient un répertoire parent. Si un répertoire parent existe, le runtime recherche un assembly satellite valide pour la culture parente dans le répertoire. S'il trouve l'assembly, le runtime recherche la ressource demandée dans cet assembly. S'il trouve la ressource, il l'utilise. S'il ne trouve pas la ressource, il continue la recherche.

  5. Le runtime recherche ensuite les assemblys parents, comme à l'étape précédente, dans les différents niveaux. Chaque culture n'a qu'un parent, mais un parent peut avoir son propre parent.

  6. Si la culture spécifiée à l'origine et tous les parents ont fait l'objet de la recherche et que la ressource est toujours introuvable, la ressource pour la culture par défaut (de secours) est utilisée. En commençant par le .NET Framework version 2.0, vous pouvez spécifier que l'emplacement de secours ultime pour les ressources est un assembly satellite, plutôt que l'assembly principal. En utilisant le NeutralResourcesLanguageAttribute avec l'énumération UltimateResourceFallbackLocation, vous pouvez déterminer si l'emplacement de secours ultime pour les ressources est dans l'assembly principal, ou dans un assembly satellite.

    Notes

    La ressource par défaut est la seule ressource qui est compilée avec l'assembly principal. À moins que vous ne spécifiiez un assembly satellite à l'aide du NeutralResourcesLanguageAttribute, c'est le secours ultime (parent définitif). C'est pourquoi, il est fortement conseillé d'inclure un ensemble de ressources par défaut dans votre assembly principal. Cela vous permet de vous assurer que des exceptions ne sont pas levées. En incluant un fichier de ressources par défaut, vous fournissez une solution de secours pour toutes les ressources, et vous assurez qu'au moins une ressource est toujours présente pour l'utilisateur, même si elle n'est pas spécifique à une culture.

  7. Enfin, si le runtime ne trouve pas une ressource pour une culture (de secours) par défaut, une exception est levée indiquant que la ressource est introuvable.

Prenons un exemple pour expliquer comment la recherche d'une ressource demandée se passe, supposons que l'utilisateur demande une ressource localisée pour l'espagnol Mexique. Selon les conventions d'affectation de noms des ressources décrites ci-dessus, le runtime recherche tout d'abord dans le Global Assembly Cache un assembly correspondant à la culture demandée, « es-MX ». Ne le trouvant pas, le runtime recherche dans le répertoire de l'assembly en cours d'exécution un répertoire « es-MX ». Le runtime recherche ensuite de nouveau dans le Global Assembly Cache un assembly parent représentant la culture de secours appropriée, dans ce cas « es » (Espagnol). Si l'assembly parent est introuvable, le runtime recherche dans tous les niveaux potentiels des assemblys parents la culture « es-MX » jusqu'à ce qu'une ressource correspondante soit trouvée. Si une ressource n'est pas trouvée, le runtime utilise la ressource de la culture par défaut.

Secours ultime à assembly satellite

Commençant par le .NET Framework version 2.0, vous pouvez supprimer facultativement des ressources de l'assembly principal et spécifier que les ressources de secours ultimes seront recherchées dans un assembly satellite qui correspond à une culture spécifique. Pour contrôler le processus de secours, vous pouvez utiliser le NeutralResourcesLanguageAttribute. Un nouveau constructeur a été ajouté à la classe NeutralResourcesLanguageAttribute qui accepte un paramètre UltimateResourceFallbackLocation supplémentaire pour spécifier l'emplacement où le ResourceManager doit extraire les ressources de secours : l'assembly principal ou un assembly satellite.

L'exemple suivant montre comment appliquer l'attribut au niveau de classe :

[assembly: NeutralResourcesLanguageAttribute("de" , UltimateResourceFallbackLocation.Satellite)]

Pour l'emplacement de secours ultime, cela indique au ResourceManager qu'il doit rechercher les ressources dans le sous-répertoire « de » dans le répertoire de l'assembly en cours d'exécution.

Autre empaquetage suggéré

En raison de contraintes de temps ou de budget, il peut être difficile pour vous de créer un ensemble de ressources pour chaque sous-culture que votre application prend en charge. Dans cette situation, vous pouvez créer un assembly satellite pour une culture parente qui peut être utilisé par toutes les sous-cultures apparentées. Par exemple, vous pouvez fournir un unique assembly satellite anglais (en) qui est extrait par les utilisateurs qui demandent des ressources anglaises spécifiques à une région et un assembly satellite allemand (de) pour les utilisateurs qui demandent des ressources allemandes spécifiques à une région. Par exemple, les demandes en allemand pour l'Allemagne (de-DE), allemand pour l'Autriche (de-AT) et en allemand pour la Suisse (de-CH) reviennent à l'assembly satellite allemand (de). Sélectionnez précisément les ressources par défaut pour compiler avec l'assembly principal. Les ressources par défaut sont les ressources de secours final et doivent être les ressources qui seront demandées par la majorité des utilisateurs de votre application. Bien que cette solution déploie des ressources qui ne sont pas spécifiques à une culture, elle peut réduire de manière significative les coûts de localisation de votre application.

Voir aussi

Concepts

Ressources dans les applications
Global Assembly Cache
Création d'assemblys satellites