10/10/2018, 10:51

Làm sao để tạo một website đa ngôn ngữ

Website đa ngôn ngữ là gì.
Trong thế giới internet ngày nay, mọi thông tin được truyền tải và diễn đạt dưới nhiều hình thức, trong đó, nội dung văn bản luôn được chú trọng. Yêu cầu truyền đạt thông tin trên diện rộng thì nội dung thông tin phải phù hợp với nhiều thành phần người sử dụng khác nhau, yếu tố ngôn ngữ, thân thiện với người sử dụng luôn được đặt lên hàng đầu. Chúng ta không thể làm cho người sử dụng cảm thấy thoải mái nếu họ không hiểu những gì họ đang làm, họ không biết họ phải làm gì, rào cản ngôn ngữ là một vấn đề nan giải. Vì vậy những website đa ngôn ngữ ra đời nhằm bản địa hóa nội dung, xử lý cho phù hợp với phần lớn người sử dụng ở bất kỳ vùng miền nào trên thế giới. Nói như vậy không có nghĩa là website đa ngôn ngữ phải bao gồm tất cả ngôn ngữ hiện có, mà nó chỉ đảm nhiệm việc bản địa hóa "một số" ngôn ngữ phong tục mà người chủ website hướng đến. Hiểu theo cách đơn giản thì website đa ngôn ngữ là website có thể hiển thị nội dung trên nhiều ngôn ngữ khác nhau (ít nhất là 2). Do nhu cầu phổ cập "Tiếng Việt cho người Anh" hay "đem chuông đi đánh xứ người" nên đa phần những website hiện nay thường có cặp bài trùng Tiếng Việt, Tiếng Anh, nên gọi tắt thì website đa ngôn ngữ là website Anh-Việt cũng không sai.
[HR]


Hiển thị đa ngôn ngữ là như thế nào
Vâng, mổ xẻ kỹ hơn, thì hiển thị nhiều ngôn ngữ được chia làm 2 loại

Đa ngôn giao diện
Giả sử một diễn đàn có nội dung sau (đang sử dụng Tiếng Việt)

Tiêu đề bài viết
Cu Tèo đi tắm mưa

Sau đó chúng ta "thay máu" sang ngôn ngữ Tiếng Anh

Post title
Cu Tèo đi tắm mưa

Nội dung bài viết không hề thay đổi, chỉ có những dòng chú thích, diễn giải, tiêu đề của diễn đàn là thay đổi sang ngôn ngữ phù hợp, nó không như mong đợi của chúng ta là đoạn "Cu Tèo đi tắm mưa" phải "bị dịch" sang Tiếng Anh, có thể đại loại như "Cu Teo di tam mua" chẳng hạn. Chính vì vậy, cách đa ngôn ngữ này là đa ngôn ngữ giao diện.

Đa ngôn ngữ nội dung
Được hiểu rõ ràng rằng, nếu website bạn có đăng một bài viết với tiêu đề là "Xin chào" cho anh em người Việt xem, thì một ku Tí nước ngoài sử dụng Tiếng Anh vào website và chọn mục chuyển ngữ sang Tiếng Anh thì lập tức chữ "Xin chào" phải đổi thành "Hello"

Thực hiện
Về đa ngôn ngữ giao diện thì có rất nhiều cách xử lý khác nhau: người lưu trữ trong database, kẻ thích lưu vào tập tin text, xml, ini, hoặc không thì là những đoạn mã PHP (sử dụng mảng), thậm chí là nhân thành N website tùy theo số lượng ngôn ngữ (website cho người Việt, website cho người Campuchia...), 9 người 11 ý, mình chỉ nêu sơ lược.

Mình xin đi sâu vào vấn đề tổ chức dữ liệu để đáp ứng nhu cầu đa ngôn ngữ nội dung. Việc tổ chức được chia làm nhiều "trường phái" khác nhau:

Sao chép thành nhiều website khác nhau
Việc này tuy đơn giản những không kém phần "mất sức", cứ hiểu theo cách thằng Việt Nam thì vào website nội dung Tiếng Việt, thằng Binladen thì vào nội dung Tiếng Ả Rập. Cách này dễ làm, thuận lợi cho những website có nội dung khác biệt khá lớn ở mỗi ngôn ngữ, việc này tương đương làm nhiều website. Ngược lại sẽ vất vả cho những website chỉ khác về nội dung văn bản nhưng giao diện ở các ngôn ngữ thì giống nhau, vậy mỗi lần chỉnh sửa là phải điều chỉnh nhiều lần trên mỗi ngôn ngữ. Sử dụng cách này như http://google.co.uk và http://google.com.vn

Lưu trữ bất đồng bộ
Cách này lưu trữ sử dụng trường NgonNgu để phân biệt dữ liệu thuộc ngôn ngữ chỉ định

Dữ liệu mẫu
TieuDe: Xin chào
NoiDung: Không có gì cả
NgonNgu: VN

TieuDe: Hello
NoiDung: Nothing
NgonNgu: EN

Ở mỗi mục dữ liệu chúng ta lưu quy ước rằng VN là Tiếng Việt, EN là English, hoặc có thể lưu trữ NgonNgu là một con số như 1 là Tiếng Việt và 2 là English

Sử dụng mẫu truy vấn sau để lấy dữ liệu: SELECT * FROM BangDuLieu WHERE NgonNgu = NgonNguDangSuDung

Cách này lợi điểm là có thể gia giảm số lượng ngôn ngữ dễ dàng, dễ hiểu. Mỗi ngôn ngữ có thể có nội dung không trùng lắp, nghĩa là khi xem trang Tiếng Việt có 5 nội dung, thì không hẳn chuyển sang Tiếng Anh vẫn có đủ 5 nội dung. Nhược điểm chí mạng là khi xem một nội dung ở ngôn ngữ nào đó, chúng ta chuyển sang ngôn ngữ khác thì phải di chuyển về trang chủ hoặc trang tạm, do khi chuyển ngôn ngữ, chúng ta không thể xác định rằng có một nội dung nào đó là bản dịch của nội dung hiện tại đang xem.

Lưu trữ nhiều trường / cột
Cách này hơi thô bạo, bằng cách sử dụng mỗi trường dữ liệu có cùng tên những nối tiếp theo mã ngôn ngữ để lưu trữ nội dung cho ngôn ngữ tương ứng

[BLOCKQUOTE][BLOCKQUOTE][/BLOCKQUOTE][/BLOCKQUOTE]



Trường NoiDungBinhThuong chỉ có một là do nội dung này không cần dịch sang ngôn ngữ khác. Trường TieuDeVN, TieuDeEN đại diện cho những bản dịch của TieuDe ở những ngôn ngữ VN, EN

Dữ liệu mẫu
NoiDungBinhThuong: 100.000
TieuDeVN: Xin chào
TieuDeEN: Hello

Chúng ta chỉ cần sử dụng 1 mục dữ liệu để diễn tả tất cả nội dung ngôn ngữ.
Sử dụng câu truy vấn sau cho việc lấy nội dung Tiếng Việt SELECT NoiDungBinhThuong, TieuDeVN FROM BangDuLieu và SELECT NoiDungBinhThuong, TieuDeEN FROM BangDuLieu

Ưu điểm tiết kiệm số mục dữ liệu, nhược điểm làm phình to bảng dữ liệu, khó quản lý, phức tạp khi thêm / bớt ngôn ngữ (do chúng ta phải thêm / bớt trường dữ liệu, điều này không nên với những ứng dụng lớn)

Lưu trữ bản dịch song song

[BLOCKQUOTE][BLOCKQUOTE][/BLOCKQUOTE][/BLOCKQUOTE]



Sử dụng 2 bảng dữ liệu, một bảng chính lưu trữ những nội dung cố định, không cần dịch, bảng còn lại lưu trữ những bản dịch của những trường dữ liệu, có sử dụng trường NgonNgu dễ chỉ định ngôn ngữ cho mục dữ liệu và trường Khoa để ràng buộc 2 bảng, cho biết bản dịch ở bảng dữ liệu thuộc về một mục dữ của bảng dữ liệu chính.

Dữ liệu mẫu
Khoa: 1
NoiDungBinhThuong: 100.000

Khoa: 1
TieuDe: Xin chào
NoiDung: Không có gì
NgonNgu: VN

Khoa: 1
TieuDe: Hello
NoiDung: Nothing
NgonNgu: EN

Sử dụng câu truy vấn SELECT bc.Khoa, bc.NoiDungBinhThuong bp.TieuDe, bp.NoiDung FROM BangChinh bc INNER JOIN BangPhu bp ON bc.Khoa = bp.Khoa WHERE bp.NgonNgu = NgonNguDangSuDung

Ưu điểm có thể thêm / bớt ngôn ngữ một cách linh động. Hơi bất lợi vì sử dụng nhiều bảng dữ liệu, giả sử trong website có 20 loại nội dung cần đa ngôn ngữ thì cần phải có 20 cặp bảng chính / phụ (40 bảng dữ liệu).

Lưu trữ bản dịch toàn cục

[BLOCKQUOTE][BLOCKQUOTE][/BLOCKQUOTE][/BLOCKQUOTE]




Tổ chức bảng dữ liệu chính bình thường, thêm vào đó ta sử dụng bảng dữ liệu BanDichToanCuc để lưu trữ thông tin của tất cả những dữ liệu cần chuyển đổi ngôn ngữ. BanDichToanCuc có những trường như sau: Khoa để lưu trữ thông tin khóa của mục dữ liệu cần dịch, BangDuLieu cho biết bản dịch này dành cho bảng dữ liệu nào, TruongDuLieu cho biết bản dịch sử dụng cho trường nào thuộc BangDuLieu, BanDich là nội dung đã dịch, NgonNgu cho biết bản dịch này thuộc ngôn ngữ nào. Dữ liệu mẫu như sau:

Khoa: 1
TieuDe: Tiêu đề gốc
NoiDung: Nội dung gốc

Khoa: 1
BangDuLieu: BangChinh
TruongDuLieu: TieuDe
BanDich: Xin chào
NgonNgu: VN

Khoa: 1
BangDuLieu: BangChinh
TruongDuLieu: NoiDung
BanDich: Không có gì
NgonNgu: VN


Khoa: 1
BangDuLieu: BangChinh
TruongDuLieu: TieuDe
BanDich: Hello
NgonNgu: EN

Khoa: 1
BangDuLieu: BangChinh
TruongDuLieu: NoiDung
BanDich: Nothing
NgonNgu: EN

Sử dụng câu truy vấn
SELECT
bc.Khoa,
bpTieuDe.BanDich AS TieuDe,
bpNoiDung.BanDich AS NoiDung
FROM
BangChinh bc
INNER JOIN BangPhu bpTieuDe ON bpTieuDe.NgonNgu = NgonNguDangSuDung AND bpTieuDe.Khoa = bc.Khoa AND bpTieuDe.BangDuLieu = 'BangChinh' AND bpTieuDe.TruongDuLieu = 'TieuDe'
INNER JOIN BangPhu bpNoiDung ON bpNoiDung.NgonNgu = NgonNguDangSuDung AND bpNoiDung.Khoa = bc.Khoa AND bpNoiDung.BangDuLieu = 'BangChinh' AND bpNoiDung.TruongDuLieu = 'NoiDung'

Ưu điểm không cần cài đặt thêm trường mới, bảng mới mỗi khi thêm bớt ngôn ngữ, có thể cài đặt dịch / không dịch trên một bảng dữ liệu dễ dàng. Nhược điểm là lấy dữ liệu ra khá phức tạp và khi quản lý xóa / thay đổi dữ liệu cũng nhiêu khê.

Mỗi cách lưu trữ có lợi điểm riêng, tùy nội dung website mà chúng ta chọn cách lưu trữ thích hợp nhất
Bạn có cao kiến gì về cách tổ chức dữ liệu, xin vui lòng chia sẻ tại đây

Nguồn http://linq2js.blogspot.com/2010/11/...-ngon-ngu.html
focusman viết 13:04 ngày 10/10/2018
Việc tách làm 2 tables là giải pháp tối ưu về dữ liệu nhưng cũng khá bất cập trong việc bố trí và xử lý với trường hợp website có nhiều ngôn ngữ. Mình vẫn đang dùng giải pháp này, nhưng với một số website phía đối tác nước ngoài muốn dùng từ 10 ngôn ngữ trở lên thì mình lại chuyển sang tich hop google translation.
1024KB viết 12:54 ngày 10/10/2018
Được gửi bởi focusman
Việc tách làm 2 tables là giải pháp tối ưu về dữ liệu nhưng cũng khá bất cập trong việc bố trí và xử lý với trường hợp website có nhiều ngôn ngữ. Mình vẫn đang dùng giải pháp này, nhưng với một số website phía đối tác nước ngoài muốn dùng từ 10 ngôn ngữ trở lên thì mình lại chuyển sang tich hop google translation.
Nhỡ khách hàng lại bảo: "Google làm sao dịch chính xác bằng tao, chỉnh lại cho tao đi ". Bạn sẽ làm thế nào? Khách hàng là thượng đế mà. Phải thay đổi lại cơ sở dữ liệu thôi.
anhchanghaudau viết 12:57 ngày 10/10/2018
Được gửi bởi 1024KB
Nhỡ khách hàng lại bảo: "Google làm sao dịch chính xác bằng tao, chỉnh lại cho tao đi ". Bạn sẽ làm thế nào? Khách hàng là thượng đế mà. Phải thay đổi lại cơ sở dữ liệu thôi.
Tùy thời mà "chém gió" thôi . Mình thì mình chỉ sợ cái mỗi field một ngôn ngữ TieuDeVN, TieuDeEN
1024KB viết 12:52 ngày 10/10/2018
Mình thấy một số database của website đa ngôn ngữ họ dùng một bảng ngôn ngữ: language(id, name, code), các bảng dữ liệu thì thêm trường lang.
Ví dụ:
data_table(id, title, content, lang_id)

Như vậy, ta có thể tùy chọn việc thêm bớt ngôn ngữ. Việc sử dụng truy vấn cũng đơn giản hơn.
PHP Code:
SELECT FROM data_table WHERE lang_id 1
//lang_id được lấy từ bảng language khi người dùng chọn 1 ngôn ngữ bất kỳ. 
Mình thấy cái này có nhược điểm là mỗi một bài viết (chẳng hạn) sẽ có một id riêng biệt. Nó không phù hợp cho trường hợp, khi người dùng đang xem một bài viết nào đó. Người dùng thay đổi ngôn ngữ, nó sẽ không trở lại bài viết vừa xem được, mà phải trở lại trang chủ.
anhchanghaudau viết 12:57 ngày 10/10/2018
Được gửi bởi 1024KB
Mình thấy một số database của website đa ngôn ngữ họ dùng một bảng ngôn ngữ: language(id, name, code), các bảng dữ liệu thì thêm trường lang.
Ví dụ:
data_table(id, title, content, lang_id)

Như vậy, ta có thể tùy chọn việc thêm bớt ngôn ngữ. Việc sử dụng truy vấn cũng đơn giản hơn.
PHP Code:
SELECT FROM data_table WHERE lang_id 1
//lang_id được lấy từ bảng language khi người dùng chọn 1 ngôn ngữ bất kỳ. 
Mình thấy cái này có nhược điểm là mỗi một bài viết (chẳng hạn) sẽ có một id riêng biệt. Nó không phù hợp cho trường hợp, khi người dùng đang xem một bài viết nào đó. Người dùng thay đổi ngôn ngữ, nó sẽ không trở lại bài viết vừa xem được, mà phải trở lại trang chủ.
Đó chính là cách thứ 2
hoangcn02 viết 12:52 ngày 10/10/2018
Tùy vào từng trường hợp mà mỗi cách có cái hay của nó - Tùy vào nhu cầu người dùng vì 9 người 10 ý
- Có ông bảo : tao thích làm theo kiểu mỗi bài viết tao nhập một lúc 2 ngôn ngữ - có id y chang nhau
- Có ôn bảo : tui thích nhập theo từng bản riêng( id riêng ) và tui sẽ chọn ngôn ngữ để hiện thị
- Người khác lại bảo....

Vậy đó, nên cứ phải,,,tùy cơ ứng biến
anhchanghaudau viết 12:55 ngày 10/10/2018
Được gửi bởi hoangcn02
Tùy vào từng trường hợp mà mỗi cách có cái hay của nó - Tùy vào nhu cầu người dùng vì 9 người 10 ý
- Có ông bảo : tao thích làm theo kiểu mỗi bài viết tao nhập một lúc 2 ngôn ngữ - có id y chang nhau
- Có ôn bảo : tui thích nhập theo từng bản riêng( id riêng ) và tui sẽ chọn ngôn ngữ để hiện thị
- Người khác lại bảo....

Vậy đó, nên cứ phải,,,tùy cơ ứng biến
Vâng, 1 người đôi khi còn 2-3 ý nữa là
Bài liên quan
0