Cấu hình

Cấu hình

66 Club Game Bài 79,Rio88 Game Bài Đổi Thưởng Uy Tín Bet20,bongda88 trực tuyến

Quốc tế hóa (I18N) trong ASP.NET Core với .NET 8

Ngày cập nhật: 2024-08-11
Lượt xem: 2017
Số từ: 613
Danh mục: Windows

Tìm kiếm

Giả sử bạn mong muốn đạt được hiệu quả như sau:

  • Hỗ trợ hai ngôn ngữ là tiếng Trung và tiếng Anh
  • Ngôn ngữ mặc định là tiếng Anh
  • Tất cả các tệp tài nguyên dịch thuật sẽ được lưu trữ trong thư mục Resources

Dưới đây là đoạn mã cụ thể, thêm vào file Program.cs:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
using Microsoft.AspNetCore.Localization;
var builder = WebApplication.CreateBuilder(args);
// Thêm các dịch vụ cần thiết 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", "zh" };
  options.SetDefaultCulture(supportedCultures[0])
    .AddSupportedCultures(supportedCultures)
    .AddSupportedUICultures(supportedCultures);
});
var app = builder.Build();
app.UseRequestLocalization();
...

Chi tiết có thể

Tuy nhiên, tài liệu chính thức đôi khi khá rời rạc và khó áp dụng trực tiếp. Vì vậy, hãy ưu tiên cấu hình theo mẫu trên.

Cách xác định thư mục Controller và View khác nhau

Với Views:

Ví dụ, nếu bạn có một file giao diện Views/Home/About.cshtml, thì trong điều kiện đã chỉ định thư mục Resources là nơi lưu trữ các bản dịch, hệ thống sẽ tìm đến một trong hai tệp dưới đây để lấy nội dung bản địa hóa:

  • Resources/Views/Home/About.fr.resx
  • Resources/Views.Home.About.fr.resx

Tôi cá nhân thích cách viết thứ nhất hơn vì nó dễ hiểu và dễ quản lý.

Nếu không cài đặt ResourcesPath, thì các file .resx có thể được đặt cùng cấp với các file .cshtml. Tuy nhiên, tôi không khuyến khích làm như vậy vì việc quản lý tập trung sẽ bị ảnh hưởng.

Với Controllers:

Tương tự như trên, trong trường hợp đã chỉ định thư mục Resources là nơi chứa các bản dịch, bạn có thể chọn giữa hai cách sau:

  • Resources/Controllers/HomeController.fr.resx
  • Resources/Controllers.HomeController.fr.resx

Nếu không chỉ định ResourcesPath, bạn có thể đặt tệp .resx ở gốc dự án với tên Controllers.HomeController.fr.resx.

So sánh lại, việc dùng một thư mục Resources riêng biệt vẫn là lựa chọn tốt nhất. Dù có thể thuận tiện hơn cho Views, nhưng đối với Controllers thì sự phân loại rõ ràng giúp dễ tra cứu hơn.

Cơ chế fallback

Giả sử tham số culture gửi về là fr-CA, ASP.NET sẽ lần lượt kiểm tra ba tệp nguồn sau, và trả về nội dung đầu tiên phù hợp:

  • Welcome.fr-CA.resx
  • Welcome.fr.resx
  • Welcome.resx

Đây là cơ chế giúp đảm bảo rằng người dùng luôn nhận được phiên bản gần đúng nhất khi không có bản dịch cụ thể.

Chuyển đổi ngôn ngữ

Bạn chỉ cần thêm tham số culture tương ứng vào URL. Ví dụ, tôi đã triển khai công cụ tạo QR Code trực tuyến như sau:

  • Phiên bản tiếng Trung:
  • Phiên bản tiếng Anh:

Lỗi chuyển đổi ngôn ngữ không hoạt động

Tham khảo bài đăng này:

Mã ví dụ:

1
app.UseRequestLocalization(app.Services.GetRequiredService<Microsoft.Extensions.Options.IOptions<RequestLocalizationOptions>>().Value);

Hiện giờ tiếng Anh đã hiển thị bình thường.

Bạn có thể rút gọn thành:

1
app.UseRequestLocalization();

SetDefaultCulture không có hiệu lực

Khi không cài đặt culture hay cài đặt fr, ứng dụng vẫn trả về tiếng Trung, chứ không phải tiếng Anh mặc định. Trên thực tế, có ba chiến lược được sử dụng:

  • QueryStringRequestCultureProvider
  • CookieRequestCultureProvider
  • AcceptLanguageHeaderRequestCultureProvider

Mặc định là đọc từ chuỗi query string trong URL. Nếu không tìm thấy, hệ thống sẽ chuyển sang sử dụng ngôn ngữ trình duyệt (tức là AcceptLanguageHeaderRequestCultureProvider). Sau khi bạn thay đổi ngôn ngữ trình duyệt thành en, mọi thứ hoạt động ổn.

.NET 8 thực hiện rất nghiêm ngặt và chặt chẽ trong xử lý quốc tế hóa, đảm bảo trải nghiệm đa ngôn ngữ hiệu quả và linh hoạt cho người dùng.

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
Theme Stack thiết kế bởi Jimmy