C# – Multi Language (đa ngôn ngữ) trong Windows Forms

Để tạo một ứng dụng đa ngôn ngữ, cách điển hình là tạo các string table để lưu trữ các văn bản, chuỗi cho mỗi ngôn ngữ. Trong .NET, bạn có thể dùng các Resource để tạo ra các string table này và dùng lớp ResourceManager để quản lý và lấy ra các chuỗi cụ thể dựa vào một đối tượng CultureInfo.

Download sourcecode (38 KB)

Trước hết tôi tạo một ứng dụng WinFoms với tên WinFormsMultilingual, tạo thêm một thư mục tên là “Lang”. Sau đó thêm một Resources File với tên MyResource.resx vào thư mục này.

Tạo thêm hai Resource vào thư mục Lang tương ứng cho hai ngôn ngữ là English và Vietnamese. Các Resource này phải có tên theo dạng < default resource name >.<culture>.resx với <default resource name > chính là MyResource mà tôi đặt ở bước trên.

Solution Explorer sẽ có dạng:

Thêm dữ liệu vào các file MyResource.en-US.resx và  MyResource.vi-VN.resx. Mỗi dòng bao gồm hai cột cần có dữ liệu là Name và Value. Cột Name là định danh giúp lấy ra Value của bảng khi bạn dùng ResourceManager để làm việc:

Viết phương thức SetLanguage() để thay đổi ngôn ngữ cho giao diện. Các giá trị của tham số cultureName bạn có thể tham khảo ở cuối bài viết:

private void SetLanguage(string cultureName)
{
    culture = CultureInfo.CreateSpecificCulture(cultureName);
    ResourceManager rm = new
        ResourceManager("WinFormsMultiLingual.Lang.MyResource", typeof(Form1).Assembly);

    btnHello.Text = rm.GetString("hello", culture);
    radEnglish.Text = rm.GetString("english", culture);
    radVietnamese.Text = rm.GetString("vietnamese", culture);
    helloWorldString = rm.GetString("helloworld", culture);
}

Mã nguồn code-behind hoàn chỉnh của Form1.cs:

using System;
using System.Windows.Forms;
using System.Resources;
using System.Globalization;

namespace WinFormsMultiLingual
{
    public partial class Form1 : Form
    {
        CultureInfo culture;
        string helloWorldString = "Hello World!";

        public Form1()
        {
            InitializeComponent();

            culture = CultureInfo.CurrentCulture;

        }

        private void btnHello_Click(object sender, EventArgs e)
        {
            MessageBox.Show(helloWorldString);
        }

        private void LanguageRadioButtons_CheckedChanged(object sender, EventArgs e)
        {
            if (radEnglish.Checked)
                SetLanguage("en-US");
            else if (radVietnamese.Checked)
                SetLanguage("vi-VN");
            //else
            //    ...

        }

        private void SetLanguage(string cultureName)
        {
            culture = CultureInfo.CreateSpecificCulture(cultureName);
            ResourceManager rm = new
                ResourceManager("WinFormsMultiLingual.Lang.MyResource", typeof(Form1).Assembly);

            btnHello.Text = rm.GetString("hello", culture);
            radEnglish.Text = rm.GetString("english", culture);
            radVietnamese.Text = rm.GetString("vietnamese", culture);
            helloWorldString = rm.GetString("helloworld", culture);
        }
    }
}

Khi biên dịch, mỗi một tập tin Resource sẽ được tạo ra trong một thư mục mới với tên tương ứng là en-US và vi-VN. Mỗi thư mục này sẽ chứa một tập tin có tên WinFormsMultiLingual.resources.dll.

Kết quả: