โอเคครับ 😎 เรามาไล่ IStringLocalizer ใน ASP.NET Core ให้เข้าใจแบบละเอียด ตั้งแต่พื้นฐานจนถึงการใช้งานจริง ✅
1️⃣ IStringLocalizer คืออะไร?
-
IStringLocalizerเป็น interface ของ .NET Core สำหรับ Localization / การแปลข้อความ -
ใช้เพื่อให้แอปสามารถรองรับหลายภาษา (multi-language) ได้ง่าย
-
ทำงานแบบ key-value: เราส่ง key → ได้ ข้อความแปลแล้ว
ข้อดี:
-
ไม่ต้อง hard-code ข้อความ
-
รองรับหลายภาษาแบบ dynamic
-
ทำงานได้ทั้ง Controller, Razor, View, Razor Page
2️⃣ การติดตั้ง
ใน Startup.cs หรือ Program.cs:
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");
// สำหรับ MVC/Razor
builder.Services.AddControllersWithViews()
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
.AddDataAnnotationsLocalization();
-
ResourcesPath→ โฟลเดอร์ที่จะเก็บไฟล์ localization
3️⃣ การสร้าง Resource File
สมมติเรามี class:
public class SharedResource
{
}
-
สร้างไฟล์
Resources/SharedResource.en.resx-
key =
Hello -
value =
Hello
-
-
สร้างไฟล์
Resources/SharedResource.th.resx-
key =
Hello -
value =
สวัสดี
-
4️⃣ การใช้ IStringLocalizer
🔹 ใน Controller
using Microsoft.Extensions.Localization;
public class HomeController : Controller
{
private readonly IStringLocalizer<SharedResource> _localizer;
public HomeController(IStringLocalizer<SharedResource> localizer)
{
_localizer = localizer;
}
public IActionResult Index()
{
// ดึงข้อความแปล
string message = _localizer["Hello"];
ViewBag.Message = message;
return View();
}
}
-
IStringLocalizer<SharedResource>→ บอกว่าใช้ resource ของSharedResource -
_localizer["Hello"]→ คืนค่า ข้อความแปลตามภาษาปัจจุบัน
🔹 ใน Razor View
@inject IStringLocalizer<SharedResource> Localizer
<h1>@Localizer["Hello"]</h1>
-
ใช้
@injectเพื่อเรียก localizer -
["Hello"]→ คืนค่า"Hello"หรือ"สวัสดี"ขึ้นอยู่กับ Culture
5️⃣ การตั้งค่า Culture (ภาษา)
ใน Program.cs / Startup.cs:
var supportedCultures = new[] { "en", "th" };
var localizationOptions = new RequestLocalizationOptions()
.SetDefaultCulture("en")
.AddSupportedCultures(supportedCultures)
.AddSupportedUICultures(supportedCultures);
app.UseRequestLocalization(localizationOptions);
-
Culture ถูกเลือกจาก:
-
query string (
?culture=th) -
cookie
-
HTTP header
-
ตัวอย่างเปลี่ยน culture แบบ runtime:
CultureInfo.CurrentCulture = new CultureInfo("th");
CultureInfo.CurrentUICulture = new CultureInfo("th");
6️⃣ Advanced: การใช้ Parameter
// Resource
// Key = Greeting
// Value = Hello {0}, welcome to our site!
string name = "Jen";
string message = _localizer["Greeting", name];
// message = "Hello Jen, welcome to our site!" (หรือภาษาไทยตาม resx)
-
สามารถใช้
{0},{1}ใน resource แล้วส่ง parameter ได้
7️⃣ สรุป
| สิ่งที่ทำ | ความหมาย |
|---|---|
IStringLocalizer<T> |
Interface สำหรับดึงข้อความแปลจาก Resource ของ T |
_localizer["Key"] |
คืนข้อความแปลตามภาษาปัจจุบัน |
Resources/SharedResource.xx.resx |
ไฟล์เก็บข้อความแปลตามภาษา |
UseRequestLocalization |
ตั้งค่า supported cultures และ default culture |
💡 Tip:
-
ใช้
IStringLocalizerแทน hard-code เพื่อให้รองรับหลายภาษาแบบ scalable -
สามารถใช้กับ Controller, Razor, Razor Pages, View, DataAnnotations
-
ถ้าใช้หลายภาษา ควรสร้าง Resource file แยกตาม Class จะจัดการง่าย
ถ้าคุณอยาก ผมสามารถทำ ตัวอย่าง project ASP.NET Core แบบเต็ม ที่ใช้ IStringLocalizer ทั้ง Controller + View + Resource + เปลี่ยนภาษา runtime ให้ดูเลย
คุณอยากให้ผมทำตัวอย่างนั้นไหมครับ?