• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Xây dựng ứng dụng có giao diện đa ngôn ngữ trong .NET

Các bài viết hướng dẫn về Visual Basic .NET và C#

Điều hành viên: tungcan5diop, QUANITGROBEST

Hình đại diện của người dùng
onlysoft
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 330
Ngày tham gia: T.Tư 26/03/2008 6:32 pm
Đến từ: ONLYSOFT
Been thanked: 8 time

Xây dựng ứng dụng có giao diện đa ngôn ngữ trong .NET

Gửi bàigửi bởi onlysoft » T.Sáu 09/05/2008 10:23 pm

Tên bài viết: Xây dựng ứng dụng có giao diện đa ngôn ngữ trong .NET
Tác giả: ">Sưu tầm ;))
Cấp độ bài viết: Chưa đánh giá
Tóm tắt: Xây dựng ứng dụng có giao diện đa ngôn ngữ trong .NET


Hẳn chúng ta đã từng sử dụng bộ gõ tiếng Việt nổi tiếng là VietKey. Trong phần config của phần mềm này có mục lựa chọn hiển thị ngôn ngữ là tiếng Việt và tiếng Anh. Khi ta chọn Hiển thị tiếng Việt thì toàn bộ giao diện của phần mềm sẽ chuyển qua tiếng Việt và bỏ chọn thì sẽ chuyển giao diện hoàn toàn sang tiếng Anh.

Ta có thể làm điều này bằng cách xây dựng một hệ dữ liệu lưu trữ thông tin của các control bao gồm loại ngôn ngữ hiển thị, và các giá trị text của control tương ứng với từng loại ngôn ngữ. Khi muốn hiển thị loại ngôn ngữ nào, ta chỉ việc đọc các thông tin đã lưu trữ trong hệ dữ liệu lên cho các control.
Một cách khác, ta có thể khai thác các file tài nguyên của ứng dụng. Một ứng dụng ngoài các tập tin xử lý còn có các tập tin tài nguyên (*.resx) để lưu trữ các thông tin về giao diện của ứng dụng. Giả sử ứng dụng của chúng ta cần hiển thị 2 loại ngôn ngữ là tiếng Việt và tiếng Anh (default).
Ở hình minh họa phía dưới, chúng ta thấy xuất hiện nhiều file .resx, mỗi file tương ứng với một giao diện của một loại ngôn ngữ (ứng dụng bình thường chỉ có 1 file resx).

Hình ảnh

Bài viết này xin giới thiệu cách xây dựng một ứng dụng có giao diện đa ngôn ngữ minh hoạ bằng VB.NET.
Bước 1: Tạo một project VB.Net và tạo ra 1 Form có giao diện như hình vẽ

Hình ảnh

Kiểm tra trong property của Form này ta thấy các thông tin Language là Default (English - US) và Localizable là False.
Bước 2: Bây giờ ta set lại các thông tin này:
Language = Vietnamese
Localizable = True
Khi chọn như ở trên, chúng ta đang làm việc với resource của ngôn ngữ tiếng Việt (Vietnamese). Lúc này việc sửa đổi giao diện trên màn hình design sẽ có tác động tới file .resx của ngôn ngữ tiếng Việt mà không ảnh hưởng tới file .resx của ngôn ngữ mặc định (tiếng Anh). Kiểm tra trong thư mục chứa project ta sẽ thấy xuất hiện 2 tập tin .resx là Form1.vi.resx và Form1.resx. Đây là 2 tập tin đại diện cho 2 ngôn ngữ.
Bước 3: Thay đổi giao diện của giao diện ngôn ngữ tiếng Việt như hình vẽ
Ở bước này, chúng ta sửa lại caption của các control và của Form thành tiếng Việt.
Save project lại.
Sau khi lưu project, chúng ta lựa chọn trong combobox Language lần lượt 2 loại ngôn ngữ đã thiết kế là Default và Vietnamese. IDE sẽ load các giao diện tương ứng với từng loại ngôn ngữ được chọn.
Bước 4: Viết code cho ứng dụng
Mặc dù có nhiều tập tin .resx nhưng chỉ có một tập tin xử lý (*.vb) cho Form này.
Mở màn hình ViewCode của Form. Trước hết ta khai báo một biến resources để làm việc với các file giao diện .resx.
Bước 5: Viết code cho các sự kiện của RadioButton khi lựa chọn các loại ngôn ngữ hiển thị.
Import 2 thư viện System.Threading và System.Globalization.

Mã: Chọn hết

  1. Imports System.Threading
  2. Imports System.Globalization

Trong thân hàm sự kiện CheckedChanged của RadioButton lựa chọn tiếng Việt ta thêm các dòng lệnh sau:

Mã: Chọn hết

  1. Thread.CurrentThread.CurrentUICulture = New CultureInfo("vi-VN")
  2. Me.Text = resources.GetString("$this.Text")
  3. For Each c As Control In Me.Controls
  4. c.Text = resources.GetString(c.Name & ".Text")
  5. Next
Trong đó “vi-VN” là ký hiệu qui ước của tiếng Việt. Để biết các ký hiệu cho các loại ngôn ngữ khác, chúng ta có thể xem thông tin trong MSDN.
Trong thân hàm sự kiện CheckedChanged của RadioButton lựa chọn tiếng Anh ta thêm các dòng lệnh sau:

Mã: Chọn hết

  1. Thread.CurrentThread.CurrentUICulture = New CultureInfo("")
  2. Me.Text = resources.GetString("$this.Text")
  3. For Each c As Control In Me.Controls
  4. c.Text = resources.GetString(c.Name & ".Text")
  5. Next
Trong đó giá trị của CultureInfo để trống có nghĩa là ngôn ngữ Default (tiếng Anh).
Bước 6: Run project và “thưởng thức” kết quả. >:)


:x Tin học là cuộc sống, Lập trình là người yêu, Vợ là computer :x
Tôi yêu tin học, Tin học lập trình, Để lập trình tôi dùng VB, Tôi là B-)nly

daitn
Thành viên chính thức
Thành viên chính thức
Bài viết: 14
Ngày tham gia: T.Sáu 09/05/2008 10:26 am

Re: Xây dựng ứng dụng có giao diện đa ngôn ngữ trong .NET

Gửi bàigửi bởi daitn » T.Năm 19/06/2008 3:54 pm

Cái này hay đó. Nhưng cho hỏi nó có khả thi với PM lớn không, như mấy cái PM quản lý ấy. Liệu có nên viết riêng cái file *.lng hay không?

Hình đại diện của người dùng
farmersoft
Thành viên chính thức
Thành viên chính thức
Bài viết: 15
Ngày tham gia: T.Sáu 13/06/2008 7:31 pm
Đến từ: Hải Phòng
Liên hệ:

Re: Xây dựng ứng dụng có giao diện đa ngôn ngữ trong .NET

Gửi bàigửi bởi farmersoft » T.Năm 19/06/2008 7:19 pm

daitn đã viết:Cái này hay đó. Nhưng cho hỏi nó có khả thi với PM lớn không, như mấy cái PM quản lý ấy. Liệu có nên viết riêng cái file *.lng hay không?

Các soft lớn mới cần đa ngôn ngữ chứ :)
Miễn lễ

giongto35
Thành viên danh dự
Thành viên danh dự
Bài viết: 194
Ngày tham gia: T.Năm 19/04/2007 10:17 am
Đến từ: Đà Nẵng City
Been thanked: 1 time
Liên hệ:

Re: Xây dựng ứng dụng có giao diện đa ngôn ngữ trong .NET

Gửi bàigửi bởi giongto35 » T.Năm 19/06/2008 7:24 pm

Vì soft lớn thì làm kiểu thủ công thế này mới mệt chứ
________________________________________________________________________________________________
. . . . . . . . . . . . .. .

Hình đại diện của người dùng
onlysoft
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 330
Ngày tham gia: T.Tư 26/03/2008 6:32 pm
Đến từ: ONLYSOFT
Been thanked: 8 time

Re: Xây dựng ứng dụng có giao diện đa ngôn ngữ trong .NET

Gửi bàigửi bởi onlysoft » T.Năm 19/06/2008 9:33 pm

giongto35 đã viết:Vì soft lớn thì làm kiểu thủ công thế này mới mệt chứ

vậy có cách nào hay mà nhanh hơn thì giông tố nói xem nào, sẳn trao đổi luôn :)
:x Tin học là cuộc sống, Lập trình là người yêu, Vợ là computer :x
Tôi yêu tin học, Tin học lập trình, Để lập trình tôi dùng VB, Tôi là B-)nly

tienlbhoc
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 415
Ngày tham gia: T.Bảy 14/07/2007 10:06 pm
Đến từ: Hà Nội
Been thanked: 1 time

Re: Xây dựng ứng dụng có giao diện đa ngôn ngữ trong .NET

Gửi bàigửi bởi tienlbhoc » T.Năm 19/06/2008 9:57 pm

Trong 1 số soft , nó thiết kế kiểu file language , như vậy, người dùng không có code có thể tự dịch từ file english (giống inno setup đó có bản dịch tiếng việt). only thử làm phát bằng xml coi
Diễn đàn và blog phần mềm tự làm :
http://my.opera.com/DienDanTienlbhoc/forums/
http://my.opera.com/tienlbhoc/blog/

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Re: Xây dựng ứng dụng có giao diện đa ngôn ngữ trong .NET

Gửi bàigửi bởi vo_minhdat2007 » T.Bảy 12/07/2008 7:55 pm

VB2008 không tìm được cái resources.GetString

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Re: Xây dựng ứng dụng có giao diện đa ngôn ngữ trong .NET

Gửi bàigửi bởi vo_minhdat2007 » T.Bảy 12/07/2008 7:58 pm

À tìm ra rồi (dành cho VB2008) :

Mã: Chọn hết

  1.        Dim resRead As Resources.ResourceManager
  2.         Thread.CurrentThread.CurrentUICulture = New CultureInfo("vi-VN")
  3.         Me.Text = resRead.GetString("$this.text")
  4.         For Each c As Control In Me.Controls
  5.             c.Text = resRead.GetString(c.Name & ".Text")
  6.         Next

vroto
Thành viên chính thức
Thành viên chính thức
Bài viết: 21
Ngày tham gia: T.Ba 21/10/2008 7:06 pm

Re: Xây dựng ứng dụng có giao diện đa ngôn ngữ trong .NET

Gửi bàigửi bởi vroto » T.Sáu 16/01/2009 12:15 am

nếu trong ứng dụng có các control mà chứa child control (menustrip (có các MenuStripItem) , hoặc những component của DxExpress 8.2 (tạo bar) có nhiều đối điều khiển con bên trong) thì làm sao đổi Lang cho chúng đc vậy các bác ?

Hình đại diện của người dùng
hoangthu1974
Guru
Guru
Bài viết: 812
Ngày tham gia: T.Năm 09/03/2006 9:30 am
Đến từ: Hà Nội --> Tp. Hồ Chí Minh
Been thanked: 13 time
Liên hệ:

Re: Xây dựng ứng dụng có giao diện đa ngôn ngữ trong .NET

Gửi bàigửi bởi hoangthu1974 » T.Sáu 16/01/2009 8:27 am

Chức năng này cũng hay, nhưng không thể dùng cho tùy biến ngôn ngữ (Customize Language) được. Nếu bạn viết một chương trình và muốn người dùng có thể dịch ra ngôn ngữ riêng của họ cho giao diện thì bó tay.
Nhớ cách này, hình như anhtuyenbk hay vietteiv đã post bài rồi mà.

tdk2311
Bài viết: 1
Ngày tham gia: T.Năm 05/03/2009 2:19 pm

Re: Xây dựng ứng dụng có giao diện đa ngôn ngữ trong .NET

Gửi bàigửi bởi tdk2311 » T.Năm 05/03/2009 2:25 pm

Cho mình hỏi khi mình muốn tạo 1 MenuStrip và 1 GroupBox mà 2 thành phần này điều có thể thay đổi ngôn ngữ thì phải làm sao
Hình ảnh
giao diện tiếng anh
Hình ảnh
giao diện tiếng việt
Hình ảnh
chương trình chạy thực tế

Mã: Chọn hết

  1. Imports System.Threading
  2. Imports System.Globalization
  3. Public Class frmLogin
  4.     Dim resources As System.Resources.ResourceManager = New System.Resources.ResourceManager(GetType(frmLogin))
  5.     Dim a As New MenuStrip
  6.  
  7.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  8.  
  9.     End Sub
  10.  
  11.     Private Sub TiếngViệtToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TiếngViệtToolStripMenuItem.Click
  12.         Thread.CurrentThread.CurrentUICulture = New CultureInfo("vi-VN")
  13.         Me.Text = resources.GetString("$this.Text")
  14.         For Each c As Control In Me.Controls
  15.             c.Text = resources.GetString(c.Name & ".Text")
  16.         Next
  17.     End Sub
  18.  
  19.     Private Sub EnglishToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EnglishToolStripMenuItem.Click
  20.         Thread.CurrentThread.CurrentUICulture = New CultureInfo("")
  21.         Me.Text = resources.GetString("$this.Text")
  22.         For Each c As Control In Me.Controls
  23.             c.Text = resources.GetString(c.Name & ".Text")
  24.         Next
  25.     End Sub
  26. End Class
  27.  

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Re: Xây dựng ứng dụng có giao diện đa ngôn ngữ trong .NET

Gửi bàigửi bởi vo_minhdat2007 » T.Sáu 13/03/2009 9:09 am

À mình hiểu vấn đề của bạn rồi. Thực ra control trong Frame không phải là con của Form, mà là con của Frame, do vậy bạn phải chạy thêm 1 vòng lặp trong Frame nữa!

Chúc bạn thành công.

toohuman
Thành viên chính thức
Thành viên chính thức
Bài viết: 40
Ngày tham gia: CN 08/02/2009 1:41 am

Re: Xây dựng ứng dụng có giao diện đa ngôn ngữ trong .NET

Gửi bàigửi bởi toohuman » T.Ba 17/03/2009 5:39 pm

-GetString is not a member of resources là sao bạn, mình không sử dụng được (mình dùng VB 2005)
-Sẵn tiện cho mình hỏi mấy bạn có sài Krypton.v3.0.8 để thiết kế giao diện VB không mình gặp 1 vài rắc rối để hỏi các bạn.

thanhthuy40
Thành viên chính thức
Thành viên chính thức
Bài viết: 32
Ngày tham gia: CN 17/05/2009 12:17 am
Đến từ: Daklak
Has thanked: 3 time

Re: Xây dựng ứng dụng có giao diện đa ngôn ngữ trong .NET

Gửi bàigửi bởi thanhthuy40 » T.Năm 23/07/2009 9:24 pm

bạn ơi mình cũng đã làm như hướng dẫn của bạn nhưng sao cái menustrip nó không đổi sang tiếng việt vậy bạn. mong các cao thủ chỉ dáo. làm nếu mà lảm thay đồi giao diện ngôn ngữ mà phải chạy lại thì mình làm rùi nhưng mà làm giống của bận mà nó ko đổi cái language vậy
Tập tin đính kèm
logindangonngu.rar
(48.73 KiB) Đã tải 550 lần


Quay về “[.NET] Bài viết hướng dẫn”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.0 khách