Đa ngôn ngữ là chủ đề của Toàn cầu hóa (i10n) và Bản địa hóa (l10n) bao hàm nhiều khía cạnh khác nhau. Bài viết dưới đây minh họa việc đa ngôn ngữ một cách đơn giản và thực dụng. Cần viết 1 class Java là controller và 3 file properties để chứa key-value pairs. Thêm 1 class nữa để gọi ra phương thức chuyển ngữ (method có tên getText()). Cấu trúc thư mục xem góc trên phải của ảnh chụp màn hình:
(Bạn có thể click chuột phải, chọn view image trong một của tab mới để nhìn cho rõ)
File LanguagesController.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
package com.smartJob.demo;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;
// Get multi-language string.
public class LanguagesController {
private final Map supportedLanguages;
private final ResourceBundle translation;
public LanguagesController(String language) {
supportedLanguages = new HashMap();
supportedLanguages.put(“English”, Locale.ENGLISH);
supportedLanguages.put(“Vietnamese”, new Locale(“vi”, “VN”));
translation = ResourceBundle.getBundle(“language”, (Locale) supportedLanguages.get(language));
}
public String getWord(String keyword) {
return translation.getString(keyword);
}
public static String getText(String key) {
String result = “”;
if (“en”.equals(System.getProperty(“user.language”))) {
LanguagesController langController_en = new LanguagesController(“English”);
result = langController_en.getWord(key);
}
if (“vi”.equals(System.getProperty(“user.language”))) {
LanguagesController langController_vi = new LanguagesController(“Vietnamese”);
result = langController_vi.getWord(key);
}
return result;
}
}
|
3 tập tin resources dưới đây đặt ngay trong thư mục source Java là language.properties, language_vi.properties, language_en.properties.
File language.properties
1
2
3
4
|
# This is comment line in file properies.
com.infoTech.highProfile.SmartJob = SmartJob join stock company
com.infoTech.highProfile.DCV = Data Communication Of Viet Nam
message.prefix = You are viewing website of
|
File language_en.properties
1
2
3
4
|
# This is comment line in file properies.
com.infoTech.highProfile.SmartJob = SmartJob join stock company
com.infoTech.highProfile.DCV = Data Communication Of Viet Nam
message.prefix = You are viewing website of
|
File language_vi.properties
1
2
3
4
5
6
7
|
# Đây chỉ là dòng ghi chú.
# Công ty cổ phần SmartJob
com.infoTech.highProfile.SmartJob = Công ty cổ phần SmartJob
# Công ty cổ phần truyền số liệu Việt Nam
com.infoTech.highProfile.DCV = Công ty cổ phần truyền số liệu Việt Nam
# Bạn đang xem website của
message.prefix = Bạn đang xem web site của
|
File Using.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
package com.smartJob.demo;
public class Using {
public static void main(String[] args) {
String prefix = LanguagesController.getText(“message.prefix”) + ” “;
String message = LanguagesController.getText(“com.infoTech.highProfile.SmartJob”);
System.out.println(prefix + message + “.”);
}
}
// Kết quả nếu máy bạn tính của sử dụng ngôn ngữ tiếng Việt :
// Bạn đang xem website của Công ty cổ phần SmartJob.
// Kết quả nếu máy bạn tính của sử dụng ngôn ngữ tiếng Anh :
// You are viewing website of SmartJob joint stock company.
|
Tại bất cứ nơi đâu trong ứng dụng, bạn chỉ cần gọi method getText(“”), trong đó chỉ ra key của xâu ký tự thì bạn sẽ có được value tương ứng. Số lượng ngôn ngữ hỗ trợ là không giới hạn. Số cặp key-value để biểu diễn các chuỗi ký tự (String) cũng không giới hạn.
Mẹo: Kinh nghiệm thực tế cho thấy việc Đa ngôn ngữ đôi khi phức tạp hơn bạn nghĩ. Trong các tình huống chữ tượng hình, chữ Arap, v.v.. Các lỗi phát sinh do bộ mã kỹ tự. Khi đó có công cụ hỗ trợ chuyển đổi (convert) ký tự unicode sang ký tự escape unicode:
http://www.mobilefish.com/services/unicode_escape_sequence_converter/unicode_escape_sequence_converter.php
File language_vi.properties sẽ có tác dụng tương như file ở trên. Ưu điểm: Sau khi chuyển ký tự sang dạng escape unicode, file không bị lỗi khi lưu tập tin ở các chế độ encoding khác nhau:
1
2
3
4
5
6
7
|
# Đây chỉ là dòng ghi chú.
# Công ty cổ phần SmartJob
com.infoTech.highProfile.SmartJob = Cu00f4ng ty cu1ed5 phu1ea7n SmartJob
# Công ty cổ phần truyền số liệu Việt Nam
com.infoTech.highProfile.DCV = Cu00f4ng ty cu1ed5 phu1ea7n truyu1ec1n su1ed1 liu1ec7u Viu1ec7t Nam
# Bạn đang xem website của
message.prefix = Bu1ea1n u0111ang xem web site cu1ee7a
|
Tại sao lại đặt key rườm ra như thế này: com.infoTech.highProfile.SmartJob , bởi vì số lable, văn bản tĩnh trong ứng dụng là rất nhiều, bạn phải phân nhóm theo cấu trúc cây (được phân tách bởi dấu chấm) để dễ quản lý, giống như đặt tên package trong thư mục mã nguồn Java vậy.
Tải về mã nguồn project: MultiLanguage
hoặc clone/fork từ repository Github: https://github.com/SmartJobVN/Java_multilanguage
Xem thêm: Câu hỏi phỏng vấn java
Đỗ Như Vý – developer tại SmartJob
java,
multi-language,