Empacotamento e implantação de recursos
A.NET Framework usa um modelo hub e spoke para empacotar e implantar os recursos. O hub é o assembly principal que contém o código executável nonlocalizable e os recursos para uma cultura único, chamado de neutro ou cultura padrão. A cultura padrão é a cultura de retorno para o aplicativo. Cada spoke conecta-se a um assembly satélite que contém os recursos para uma cultura única, mas não contém qualquer código.
Existem diversas vantagens para esse modelo:
Incrementalmente, você pode adicionar recursos para novas culturas depois de implantar um aplicativo. Como subseqüente desenvolvimento de recursos específicos da cultura pode exigir uma quantidade significativa de tempo, isso permite que a versão principal do aplicativo primeiro e fornecer recursos específicos da cultura em uma data posterior.
Você pode atualizar e alterar os assemblies de satélite do aplicativo sem recompilar o aplicativo.
Um aplicativo precisa carregar esses assemblies de satélite que contêm os recursos necessários para uma determinada cultura. Isso pode reduzir significativamente o uso de recursos do sistema.
No entanto, também há desvantagens para esse modelo:
Você deve gerenciar vários conjuntos de recursos.
Aumenta o custo inicial de um aplicativo de teste, porque você deve testar várias configurações. Observe que a longo prazo será mais fácil e barato testar um aplicativo de núcleo com vários satélites, que a testar e manter várias versões internacionais de paralelas.
Convenções de nomenclatura de recursos
Quando você empacota os recursos do aplicativo, você deve nomeá-los usando as convenções de nomenclatura de recursos que espera do common language runtime. O tempo de execução identifica um recurso por sua assinatura de cultura, ou o nome. Cada cultura tem um nome exclusivo, que é uma combinação de um nome de cultura de duas letras, letras minúsculas associado a um idioma e, se necessário, um nome de subcultura de duas letras, maiúsculas associado a um país ou região. O nome de subcultura segue o nome de cultura, separado por um traço (-). Exemplos incluem ja-JP para japonês no Japão, en-US para inglês (EUA) ou de-DE para alemão na Alemanha (em oposição a alternativo como, por exemplo, de-AT para alemão na Áustria). Consulte o classe CultureInfo para obter uma lista completa de nomes de cultura.
Processo de Fallback de recurso
O modelo hub e spoke para empacotamento e implantação de recursos usa um processo de fallback para localizar recursos apropriados. Se um usuário de aplicativo solicita um ResourceSet que não está disponível, o common language runtime procura a hierarquia das culturas procurando um recurso de fallback apropriado que melhor corresponda à solicitação do usuário e gera uma exceção apenas como um último recurso. Em cada nível da hierarquia, se um recurso apropriado for encontrado, o runtime usa-lo. Se o recurso não for encontrado, a pesquisa continua no próximo nível.
Para melhorar o desempenho da pesquisa, aplicar o NeutralResourcesLanguageAttribute de atributo para seu assembly principal e passe o nome do idioma neutro que funcionarão com o seu assembly principal.
O processo de fallback de recurso é descrito nas etapas a seguir:
O tempo de execução primeiro verifica o global assembly cache para um assembly correspondente a cultura solicitada para o seu aplicativo.
O global assembly cache pode armazenar módulos de recursos que são compartilhados por vários aplicativos. Isso elimina a necessidade que incluir conjuntos específicos de recursos na estrutura do diretório de cada aplicativo que você criar. Se o tempo de execução localiza uma referência ao assembly, ele procura o assembly para o recurso solicitado. Se ele encontrar a entrada no assembly, ele usa o recurso solicitado. Se não encontrar a entrada, ele continua a pesquisa.
O tempo de execução, em seguida, verifica o diretório do conjunto atualmente em execução para um diretório correspondente a cultura solicitada. Se ele encontrar o diretório, ele procurará nesse diretório um assembly satélite válido para a cultura solicitada. O tempo de execução, em seguida, procura o assembly satélite para o recurso solicitado. Se encontrar o recurso no assembly, ele usa. Se ele não localizar o recurso, ele continua a pesquisa.
As pesquisas de tempo de execução próxima global assembly cache de novamente, desta vez para o assembly do pai do recurso solicitado. Se o assembly pai existe no cache global de assemblies, o runtime procura o assembly para o recurso solicitado.
O pai é definido como a cultura de retorno apropriada. Considere os pais como candidatos de ajuste perfeitos; fornecer qualquer recurso é preferível gerar uma exceção. Esse processo também permite a reutilização de recursos. Você precisa incluir um determinado recurso no nível pai somente se a cultura filho não precisar localizar o recurso solicitado. Por exemplo, se você fornecer os assemblies de satélite para en (neutro em inglês), en-GB (inglês como falado no Reino Unido) e en-US (em inglês como falado nos Estados Unidos), o satélite en conteria a terminologia comum e os satélites en-GB e en-US poderiam fornecer substituições para apenas esses termos são diferentes.
O tempo de execução, em seguida, verifica o diretório do assembly em execução no momento para ver se ele contém um diretório pai. Se um diretório pai existe, o runtime procura no diretório para um assembly satélite válido para a cultura pai. Se ele encontrar o assembly, o runtime procura o assembly para o recurso solicitado. Se encontrar o recurso, ele usa. Se ele não localizar o recurso, ele continua a pesquisa.
As pesquisas de tempo de execução próxima pai assemblies, como na etapa anterior, por meio de vários níveis possíveis. Cada cultura tem apenas um pai, mas um pai pode ter seu próprio pai.
Se a cultura originalmente especificado e todos os pais foram pesquisados e o recurso ainda não for encontrado, o recurso para a cultura (fallback) padrão é usado. Começando com o.NET Framework versão 2.0, você pode especificar que o local de fallback final para recursos é um assembly satélite, em vez do assembly principal. Usando o NeutralResourcesLanguageAttribute com o UltimateResourceFallbackLocation enumeração, você pode controlar se encontrar o local de fallback final para recursos no assembly principal ou em um assembly satélite.
Observação
O recurso de padrão é o único recurso que é compilado com o assembly principal.A menos que você especifique um assembly satélite usando o NeutralResourcesLanguageAttribute, é o fallback ultimate (pai final).Portanto, é altamente recomendável sempre incluem um conjunto padrão de recursos no seu assembly principal.Isso ajuda a garantir que as exceções não são lançadas.Incluindo um padrão arquivo de recurso que você fornece um fallback para todos os recursos e garantir que pelo menos um recurso está sempre presente para o usuário, mesmo se não for culturalmente específico.
Finalmente, se o tempo de execução não encontrar um recurso para uma cultura (fallback) do padrão, uma exceção é lançada indicando que o recurso não pôde ser encontrado.
Um exemplo de como a pesquisa para um recurso solicitado é conduzida, suponha que o usuário solicita um recurso localizado para espanhol mexicano. De acordo com as convenções de nomenclatura de recursos descritas acima, o runtime primeiro procura global assembly cache o assembly correspondente a cultura solicitada, "es-MX". Não encontrá-las, o tempo de execução, em seguida, procura no diretório do assembly em execução no momento para um "es-MX" diretório. Caso de falha, o runtime procura global assembly cache novamente para um assembly pai, refletindo a cultura de retorno apropriada — neste caso, "es" (Espanhol). Se o assembly pai não for encontrado, o runtime procura todos os níveis possíveis de assemblies de pai para "es-MX" cultura até que um recurso correspondente seja encontrado. Se um recurso não for encontrado, o runtime usa o recurso para a cultura padrão.
Ultimate Fallback para o Assembly satélite
Começando com o.NET Framework versão 2.0, você pode, opcionalmente, remover os recursos do assembly principal e especificar que os recursos finais de fallback são encontradas em um assembly satélite correspondente a uma cultura específica. Para controlar o processo de fallback, você pode usar o NeutralResourcesLanguageAttribute. Foi adicionado um novo construtor para o NeutralResourcesLanguageAttribute que leva um adicional de classe UltimateResourceFallbackLocation parâmetro para especificar o local onde o ResourceManager deve extrair os recursos de fallback: o assembly principal ou um assembly satélite.
O exemplo a seguir mostra como aplicar o atributo no nível de classe:
[assembly: NeutralResourcesLanguageAttribute("de" , UltimateResourceFallbackLocation.Satellite)]
O local final de fallback, isso instrui o ResourceManager para procurar os recursos de "de" subdiretório no diretório do assembly em execução no momento.
Sugestão de alternativa de embalagem
Devido a restrições de tempo ou orçamento, talvez não seja viável para você criar um conjunto de recursos para cada subcultura de seu aplicativo suporta. Nessa situação, você pode criar um assembly satélite único para uma cultura pai que pode ser usado por todos os subcultures relacionados. Por exemplo, você poderia fornecer um conjunto de único satélite alemão (de) e de um assembly satélite único de inglês (en) que poderia ser recuperado por usuários que solicitam recursos específicos de região do inglês para usuários que solicitam recursos de alemão específicos da região. Por exemplo, solicitações para alemão na Alemanha (de-DE), alemão na Áustria (de-AT) e o alemão da Suíça (de-CH) faria fallback para o assembly satélite alemão (de). Selecione cuidadosamente os recursos padrão para compilar com o assembly principal. Os recursos padrão são o fallback final e, portanto, devem ser os recursos que serão solicitados pela maioria dos usuários do aplicativo. Embora esta solução implanta recursos que são menos culturalmente específicos, ele pode reduzir significativamente os custos de localização do aplicativo.