22. tháng 2 2025
Ví dụ về cấu hình mà tôi muốn thực hiện:
Dưới đây là mã nguồn cần thêm vào tệp đánh bài online Program.cs:
using Microsoft.AspNetCore.Localization;
var builder = WebApplication.CreateBuilder(args);
// Thêm các dịch vụ vào container.
builder.Services.AddControllersWithViews();
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");
builder.Services.AddMvc()
.AddViewLocalization(Microsoft.AspNetCore.Mvc.Razor.LanguageViewLocationExpanderFormat.Suffix)
.AddDataAnnotationsLocalization();
builder.Services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[] { "en", "vi" }; // tiếng Anh và tiếng Việt
options.SetDefaultCulture(supportedCultures[0]) // thiết lập mặc định là tiếng Anh
.AddSupportedCultures(supportedCultures) // thêm các văn hóa hỗ trợ
.AddSupportedUICultures(supportedCultures); // thêm giao diện người dùng hỗ trợ
});
var app = builder.Build();
app.UseRequestLocalization(); // sử dụng localization cho ứng dụng
...
Lưu ý rằng tài liệu chính thức có thể phân tán và khó áp dụng, vì vậy hãy dựa trên cấu hình của tôi ở trên.
Trong trường hợp Views: Ví dụ như tệp mẫu Views/Home/About.cshtml, nếu đã chỉ định thư mục lưu trữ là Resources, thì các tệp tài nguyên dịch tương ứng sẽ là một trong hai tệp sau:
Tôi thích cách viết đầu tiên hơn. Nếu không chỉ định ResourcesPath, bạn có thể đặt các tệp .resx cùng thư mục với tệp cshtml. Tuy nhiên, điều này làm phức tạp việc quản lý tập trung tài nguyên dịch.
Trong trường hợp Controllers: Tương tự, khi đã chỉ định thư mục Resources, cũng có hai cách cấu trúc thư mục:
Nếu không chỉ định ResourcesPath, các tệp .resx có thể đặt tại thư mục gốc của dự án với tên gọi Controllers.HomeController.vi.resx. So sánh các phương pháp, cách tốt nhất vẫn là sử dụng một thư mục Resources riêng biệt để lưu trữ.
Giả sử tham số culture trong yêu cầu là fr-CA, thì ASP sẽ tuần tự kiểm tra ba tệp tài nguyên sau, trả về kết quả đầu tiên khớp:
Chỉ cần thêm tham số culture tương ứng vào URL, ví dụ như công cụ tạo mã QR trực tuyến mà tôi đã thực hiện:
app.UseRequestLocalization(app.Services.GetRequiredService<Microsoft.Extensions.Options.IOptions<RequestLocalizationOptions>>().Value);
Hiện tại, tiếng Anh đã hiển thị đúng. Đoạn mã có thể đơn giản hóa thành:
app.UseRequestLocalization();
Khi không thiết lập culture hoặc thiết lập thành fr, luôn trả về tiếng Việt thay vì tiếng Anh mặc định. Thực tế có ba chiến lược xác định ngôn ngữ:
Mặc định là sử dụng Query String trong URL. Khi chiến lược URL thất bại, hệ thống có thể chuyển sang sử dụng ngôn ngữ trình duyệt (AcceptLanguageHeaderRequestCultureProvider). Sau khi chỉnh sửa ngôn ngữ trình tỷ số bóng đá hôm nay duyệt thành en, mọi thứ hoạt động ổn thỏa. Cách tiếp cận của .NET 8 rất nghiêm ngặt và đáng tin cậy.