Localization – Internationalization trong C#.NET


Ngày nay, với đà phát triển của ứng dụng tin học, việc tạo 1 ứng dụng (win/web) đòi hỏi đa ngôn ngữ trở nên hết sức cần thiết. Trong bài viết này, tôi sẽ hướng dẫn các bạn tạo ra 1 ứng dụng căn bản giải quyết vấn đề này.

Nói chung, có rất nhiều kỹ thuật được đặt ra. Tôi sẽ giời thiệu sô bộ vài kỹ thuật:

1.  Dùng database để lưu các trường chứa các mẫu tin cho các ngôn ngữ khác nhau. Cách này chậm.

2. Dùng file các file XML để lưu các ngôn ngữ khác nhau rồi tùy theo người dùng chọn ngôn ngữ nào bạn dùng DOM (chẳng hạn) lấy ra node rồi hiển thị.

3. Cách này hay hơn cả – đó là dùng localization trong C# (internationalization trong java).

4. Cách này bèo nhất – Tạo 2 ứng dụng (web)  giống nhau nhưng cho 2 ngôn ngữ khác nhau.

5. …

Nói chung tùy theo mong muốn / sở thích của bạn mà viết. Ở đây tôi sẽ hướng dẫn bạn dùng cách thứ 3 (localization) để viết 1 ứng dụng đa ngôn ngữ.

Ở đây tôi dùng ngôn ngữ C#, IDE là VS 2008
1.

Tạo 1 project (C#) có tên LocalizationInternationalization.

Tạo 1 form mới có tên là frmUpdateInfo. Thiết kế như hình sau (nhớ đặt tên các controls như các giá trị text trong controls, còn giá trị text là gì không cần thiết)

2.

Trong cửa sổ Project Explorer, nhấn chuột phải lên project, chọn Add -> New Item, chọn Resource File, đặt tên là LocalizationResource.resx như hình:

Sau đó nhấn OK .

Nhập các giá trị cho resx này như hình sau:

Chú ý: Cột Name chính là tên của các controls của chúng ta và cột value chính là giá trị của thuộc tính text.
3.

Tạo các file resources khác tương ứng với các ngôn ngữ mà bạn cần. Ở đây tôi tạo thêm 1 ngôn ngữ là tiếng việt (không biết ngôn ngữ thì lên google mà translate )

Tên của các resource file phải bắ đầu với tên củaResource mặc định sau đó đến .culture-language:

Các file tương ứng của chúng ta sẽ là:

  • LocalizationResource.vi.resx

Riêng em VI thì khác 


Bạn có thể xem liệt kê các ngôn ngữ hỗ trợ trong NetFX ở bài viết: https://daylaptrinh.wordpress.com/2011/10/25/li%E1%BB%87t-ke-cac-ten-culture-va-cac-d%E1%BB%8Bnh-danh-trong-c/

4.

Cấu trúc Project của ứng dụng chúng ta như hình sau:

5. Code cho Form

Bạn phải khai báo sử dụng các thư viện sau

using System.Resources;
using System.Globalization;
using System.Threading;

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Resources;
using System.Globalization;
using System.Threading;
namespace LocalizationInternationalization.Teachers
{
public partial class frmUpdateInfo : Form
{
private ResourceManager m_objResourceMan = new ResourceManager(“LocalizationInternationalization.LocalizationResource”,
System.Reflection.Assembly.GetExecutingAssembly());
private CultureInfo m_EnglishCulture = new CultureInfo(“en-US”);
private CultureInfo m_VietnameCulture =new CultureInfo(“vi”);

public frmUpdateInfo()
{
InitializeComponent();
}

private void UpdateUI()
{
lblFirstName.Text = m_objResourceMan.GetString(“lblFirstName”);
lblLastName.Text = m_objResourceMan.GetString(“lblLastName”);
grbOptions.Text = m_objResourceMan.GetString(“grbOptions”);
grbUpdateInfo.Text = m_objResourceMan.GetString(“grbUpdateInfo”);
lblEmail.Text = m_objResourceMan.GetString(“lblEmail”);
lblPhone.Text = m_objResourceMan.GetString(“lblPhone”);
lblWebsite.Text = m_objResourceMan.GetString(“lblWebsite”);
optEnglish.Text = m_objResourceMan.GetString(“optEnglish”);
optVietnamese.Text = m_objResourceMan.GetString(“optVietnamese”);
btnUpdate.Text = m_objResourceMan.GetString(“btnUpdate”);
this.Text = m_objResourceMan.GetString(“frmUpdateInfo”);
}

private void CheckSupportLanguages()
{
if (m_objResourceMan.GetResourceSet(m_VietnameCulture, true, false) == null)
{
optVietnamese.Enabled = false;
}
}

private void frmUpdateInfo_Load(object sender, EventArgs e)
{
CheckSupportLanguages();
Thread.CurrentThread.CurrentUICulture = m_EnglishCulture;
UpdateUI();
}

private void optEnglish_CheckedChanged(object sender, EventArgs e)
{
CultureInfo cul = null;
if (optEnglish.Checked == true)
cul = m_EnglishCulture;
else if (optVietnamese.Checked == true)
cul = m_VietnameCulture;

Thread.CurrentThread.CurrentUICulture = cul;
UpdateUI();
}

private void btnUpdate_Click(object sender, EventArgs e)
{
string message = m_objResourceMan.GetString(“messageUpdate”);
MessageBox.Show(this, message, this.Text, MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
}
}

Kết quả thực thi:

Gửi phản hồi

Please log in using one of these methods to post your comment:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s