Phil Haack ha un eccellente articolo Localizing ASP.Net MVC Validation che ti guida specificatamente attraverso l'override delle stringhe. Questo articolo si applica più a DataAnnotations
rispetto a ASP.net MVC
. Quindi, questo ti aiuterà comunque a utilizzare DataAnnotattions.
Di seguito sono elencati i passaggi più semplici per aggiungere risorse localizzate in Visual Studio.
- Aprire la finestra di
Project Properties
.
- Selezionare la scheda
Resources
.
- Fare clic per creare un nuovo file risorse predefinito .
- Ciò creerà due file nella cartella
Properties
.
- Resources.resx
- Resources.Designer.cs
- Quando Resources.resx ha aperto , cambiare è
Access Modifier
a Public
. - Aggiungi le tue stringhe.
Per aggiungere ulteriori file di risorse per culture specifiche sarà necessario.
- Fare clic destro tua
Project
nel Solution Explorer
.
- Selezionare Aggiungi ->Nuovo elemento ->risorse file.
- Denominarlo
Resources.en-us.resx
. (sostituire 'it-it' con codice appropriato )
- Fare clic su Aggiungi
- trascinare nella cartella
Properties
.
- aperto Resources.en-us.resx e cambiare è
Access Modifier
a Public
.
- Aggiungi le tue stringhe.
- Ripetere per ogni coltura che è necessario il supporto .
durante la costruzione VS convertirà i file .resx-.resource file e costruire classi wrapper per voi. È quindi possibile accedere tramite il namespace YourAssembly.Properties.Resources
.
Con questa istruzione using.
using YourAssembly.Properties;
Potete decorare con attributi come questo:
[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "MyStringName")]
Nota: ho usato la cartella Proprietà per coerenza. Per utilizzare App_GlobalResources spostare i file .resx e modificare l'istruzione using in modo che corrisponda al nome della directory. Come questo:
using YourAssembly.App_GlobalResources;
Edit: Il più vicino che si può arrivare a tipizzato fortemente i nomi di risorsa potrebbe essere quella di fare qualcosa di simile:
public class ResourceNames
{
public const string EmailRequired = "EmailRequired";
}
È quindi possibile decorare con attributi come questo.
[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = ResourceNames.EmailRequired)]
per attivare il rilevamento automatico di cultura cliente aggiunge il globalizationsection al file di web.config.
<configuration>
<system.web>
<globalization enableClientBasedCulture="true" culture="auto:en-us" uiCulture="auto:en-us"/>
</system.web>
<configuration>
Qui mi hanno consentito una cultura basata client e impostare il cultura e la uiculture a "auto" con un valore predefinito di "it-it".
Creazione di assembly satellite separati:
MSDN Creating Satellite Assemblies articolo vi aiuterà pure. Se si è nuovi all'assemblaggio satellitare, assicurarsi di leggere Packaging and Deploying Resources.
Durante la creazione di assemblee satellitari in passato, ho trovato utile utilizzare gli eventi di generazione VS. Questi sono i passi che vorrei prendere.
- Creare un distinto progetto di
Class Library
nella mia soluzione.
- Creare o aggiungere i miei
.resx
file a questo progetto.
- Aggiungi un
Post-Build Event
alla finestra di Project Properties
. (Come quella qui sotto)
Esempio VS Script di post-generazione:
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
Se si preferisce non utilizzare ResGen.exe per convertire i .resx
file, si potrebbe fare qualcosa di simile .
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();
}
}
}
}
Uno dei potenziali spalle di disegnare a fare la conversione in questo modo è la necessità di fare riferimento al System.Windows.Forms.dll
. Sarà comunque necessario utilizzare Assembly Linker.
Modifica: come wRAR ci ha ricordato se si sta firmando il tuo assemblee le chiavi must match.
Lo so, ma non voglio cambiare tutti gli attributi. – wRAR