Phil Haack tiene un excelente artículo Localizing ASP.Net MVC Validation que le guía específicamente a través anulando sus cadenas. Este artículo se aplica más a DataAnnotations
que a ASP.net MVC
. Por lo tanto, esto ayudará sin embargo si está utilizando DataAnnotattions.
A continuación, he enumerado los pasos más simples para agregar recursos localizados en Visual Studio.
- Abra el diálogo
Project Properties
.
- Seleccione la pestaña
Resources
.
- Haga clic para crear una nueva archivo de recursos predeterminado.
- Esto creará dos archivos en su carpeta
Properties
.
- Resources.resx
- Resources.Designer.cs
- Cuando Resources.resx ha abierto , cambiar su
Access Modifier
a Public
.
- Agregue sus cadenas.
Para añadir archivos de recursos adicionales para culturas específicas que se necesitan para.
- Haga clic derecho en su
Project
en el Solution Explorer
.
- Seleccionar Añadir -> Nuevo elemento -> Recursos Archivo.
- nómbrelo
Resources.en-us.resx
. (reemplace 'es-es' con el código apropiado )
- Haga clic en Agregar
- arrastrarlo a la carpeta
Properties
.
- abierto Resources.en-us.resx y cambiar su
Access Modifier
a Public
.
- Agregue sus cadenas.
- Repita para cada cultura que necesita para soporte.
Durante la acumulación VS convertirá el Resx archivos a .resource archivos y crear clases contenedoras para usted. A continuación, puede acceder a través del espacio de nombres YourAssembly.Properties.Resources
.
Con esta declaración de uso.
using YourAssembly.Properties;
Se puede decorar con atributos como esto:
[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "MyStringName")]
Nota: He utilizado el Propiedades de carpetas para mantener la coherencia. Para usar App_GlobalResources mueve tus archivos .resx allí y cambia tu declaración de uso para que coincida con el nombre del directorio. De esta manera:
using YourAssembly.App_GlobalResources;
Editar: Lo más cerca que se puede llegar al establecimiento inflexible nombres de recursos habría que hacer algo como esto:
public class ResourceNames
{
public const string EmailRequired = "EmailRequired";
}
entonces Se puede decorar con atributos como este.
[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = ResourceNames.EmailRequired)]
para permitir la detección automática de clientes cultura añadir el globalizationsection al archivo web.config .
<configuration>
<system.web>
<globalization enableClientBasedCulture="true" culture="auto:en-us" uiCulture="auto:en-us"/>
</system.web>
<configuration>
Aquí me han permitido una cultura basada en el cliente y establecer la cultura y la uiculture a " automático" con un valor predeterminado de "es-".
Crear ensamblados satélite separados:
El MSDN Creating Satellite Assemblies artículo le ayudará también. Si es nuevo en los ensambles satelitales, asegúrese de leer Packaging and Deploying Resources.
Al crear ensambles satelitales en el pasado, he encontrado que es útil usar eventos de compilación VS. Estos son los pasos que tomaría.
- Crear un proyecto separado
Class Library
en mi solución.
- Crear o agregar mis archivos
.resx
a este proyecto.
- Añadir un
Post-Build Event
al diálogo Project Properties
. (Como la de abajo)
Muestra VS Post Script-Build:
set RESGEN="C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\resgen.exe"
set LINKER="C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\al.exe"
set ASSEMBLY=$(TargetName)
set SOURCEDIR=$(ProjectDir)
Set OUTDIR=$(TargetDir)
REM Build Default Culture Resources (en)
%RESGEN% %SOURCEDIR%en\%ASSEMBLY%.en.resx %SOURCEDIR%en\%ASSEMBLY%.resources
REM Embed Default Culture
%LINKER% /t:lib /embed:%SOURCEDIR%en\%ASSEMBLY%.resources /culture:en /out:%OUTDIR%%ASSEMBLY%.resources.dll
REM Embed English Culture
IF NOT EXIST %OUTDIR%en\ MKDIR $%OUTDIR%en\
%LINKER% /t:lib /embed:%SOURCEDIR%en\%ASSEMBLY%.resources /culture:en /out:%OUTDIR%en\%ASSEMBLY%.resources.dll
REM These are just a byproduct of using the project build event to run the resource build script
IF EXIST %OUTDIR%%ASSEMBLY%.dll DEL %OUTDIR%%ASSEMBLY%.dll
IF EXIST %OUTDIR%%ASSEMBLY%.pdb DEL %OUTDIR%%ASSEMBLY%.pdb
Si prefiere no utilizar ResGen.exe para convertir sus .resx
archivos, usted podría hacer algo como esto .
using System;
using System.Collections;
using System.IO;
using System.Resources;
namespace ResXConverter
{
public class ResxToResource
{
public void Convert(string resxPath, string resourcePath)
{
using (ResXResourceReader resxReader = new ResXResourceReader(resxPath))
using (IResourceWriter resWriter = new ResourceWriter(
new FileStream(resourcePath, FileMode.Create, FileAccess.Write)))
{
foreach (DictionaryEntry entry in resxReader)
{
resWriter.AddResource(entry.Key.ToString(), entry.Value);
}
resWriter.Generate();
resWriter.Close();
}
}
}
}
Una de las posibles pegas a hacer la conversión de esta manera es la necesidad de hacer referencia a la System.Windows.Forms.dll
. Aún necesitará usar Assembly Linker.
Editar: Como wRAR nos ha recordado si está firmando sus conjuntos, sus claves must match.
Lo sé, pero no quiero cambiar todos los atributos. – wRAR