Phil Haack có một bài viết xuất sắc Localizing ASP.Net MVC Validation hướng dẫn cụ thể bạn thông qua việc ghi đè các chuỗi của bạn. Bài viết này áp dụng nhiều hơn cho DataAnnotations
so với số ASP.net MVC
. Do đó, điều này sẽ giúp bạn sử dụng DataAnnotattions.
Dưới đây tôi đã liệt kê các bước đơn giản nhất để thêm Tài nguyên được bản địa hóa trong Visual Studio.
- Mở hộp thoại
Project Properties
.
- Chọn tab
Resources
.
- Nhấp để tạo mới mặc định tài nguyên tệp.
- Thao tác này sẽ tạo hai tệp trong thư mục
Properties
của bạn.
- Resources.resx
- Resources.Designer.cs
- Khi Resources.resx đã mở, thay đổi nó
Access Modifier
để Public
.
- Thêm chuỗi của bạn.
Để bổ sung thêm tập tin tài nguyên cho nền văn hóa cụ thể bạn sẽ cần phải.
- Nhấp chuột phải
Project
trong Solution Explorer
của bạn.
- Chọn Thêm -> New Item ->Resource File.
- Đặt tên là
Resources.en-us.resx
. (thay thế 'en-us' với mã thích hợp)
- Nhấn Add
- Kéo nó vào thư mục
Properties
.
- mở Resources.en-us.resx và thay đổi nó
Access Modifier
để Public
.
- Thêm chuỗi của bạn.
- Lặp lại cho mỗi nền văn hóa bạn cần hỗ trợ.
Trong xây dựng VS sẽ chuyển đổi các Resx file .resource tập tin và xây dựng các lớp wrapper cho bạn. Sau đó, bạn có thể truy cập qua không gian tên YourAssembly.Properties.Resources
.
Với tuyên bố sử dụng này.
using YourAssembly.Properties;
Bạn có thể trang trí với các thuộc tính như thế này:
[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "MyStringName")]
Lưu ý: Tôi sử dụng Thuộc tính thư mục cho nhất quán. Để sử dụng App_GlobalResources, hãy di chuyển các tệp .resx vào đó và thay đổi câu lệnh sử dụng của bạn để khớp với tên thư mục. Như thế này:
using YourAssembly.App_GlobalResources;
Edit: Gần nhất mà bạn có thể nhận để mạnh mẽ gõ tên tài nguyên sẽ làm điều gì đó như thế này:
public class ResourceNames
{
public const string EmailRequired = "EmailRequired";
}
Sau đó bạn có thể trang trí với các thuộc tính như thế này.
[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = ResourceNames.EmailRequired)]
Để kích hoạt tự động phát hiện văn hóa client thêm globalizationsection đến web.config tập tin.
<configuration>
<system.web>
<globalization enableClientBasedCulture="true" culture="auto:en-us" uiCulture="auto:en-us"/>
</system.web>
<configuration>
Ở đây tôi đã kích hoạt một nền văn hóa dựa trên khách hàng và thiết lập văn hóa và uiculture để "auto" với một mặc định của "en-us".
Tạo Assemblies vệ tinh riêng:
MSDN Creating Satellite Assemblies bài viết sẽ giúp là tốt. Nếu bạn chưa quen với cụm vệ tinh, hãy đảm bảo bạn đọc Packaging and Deploying Resources.
Khi tạo các cụm vệ tinh trong quá khứ, tôi thấy hữu ích khi sử dụng các sự kiện VS build. Đây là những bước tôi sẽ thực hiện.
- Tạo dự án riêng biệt
Class Library
trong giải pháp của tôi.
- Tạo hoặc Thêm
.resx
tệp của dự án này.
- Thêm
Post-Build Event
vào hộp thoại Project Properties
. (Giống như hình dưới đây)
Mẫu VS Post-Build Script:
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
Nếu bạn không muốn sử dụng ResGen.exe để chuyển đổi .resx
các tập tin, bạn có thể làm một cái gì đó như thế này .
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();
}
}
}
}
Một trong những lợi thế rút lại tiềm năng khi thực hiện chuyển đổi theo cách này là cần tham khảo System.Windows.Forms.dll
. Bạn sẽ vẫn cần sử dụng Assembly Linker.
Chỉnh sửa: Vì wRAR đã nhắc nhở chúng tôi nếu bạn đang ký hợp đồng với các phím của mình must match.
Tôi biết điều này, nhưng tôi không muốn thay đổi tất cả các thuộc tính. – wRAR