Internationalization và Localization trong Java
Bài viết được sự cho phép của tác giả Lê Hồng Kỳ
Internationalization và Localization trong Java sẽ đề cập đến Internationalization và Localization.
Internationalization cũng có thể được viết tắt là i18n vì có 18 ký tự ở giữa I và N. Internationalization (quốc tế hoá) là một kỹ thuật cho phép chúng ta tạo ra các ứng dụng mà có thể thích ứng với nhiều ngôn ngữ và nhiều khu vực khác nhau.
Localization cũng có thể được viết tắt là l10n vì 10 ký tự ở giữa L và N. Localization (nội địa hoá) là kỹ thuật giúp tạo ra một ứng dụng có thể thích ứng với một ngôn ngữ và vùng miền cụ thể.
Như vậy, một ứng dụng hỗ trợ đa ngôn ngữ thì gọi là Internationalization (quốc tế hoá) và khi người dùng chọn một ngôn ngữ cụ thể để hiển thị thì gọi là Localization (nội địa hoá)
Internationalization và localization trong Java – Các thành phần trong ứng dụng cần được quốc tế hóa
Internationalization và localization trong Java – Quốc tế hoá các thông điệp (Messages)
Chúng ta sẽ sử dụng lớp ResourceBundle để xử lý quốc tế hoá cho các message. Các message trong ứng dụng sẽ được khai báo trong tập tin properties thay vì viết trong code (hardcoded).
Tên của tập tin properties đặt theo qui tắc filename_languagecode_countrycode với filename là tên tập tin, languagecode là mã ngôn ngữ, countrycode là mã quốc gia. Bên dưới là bảng mô tả language code và country code theo từng quốc gia.
Country | Language Code | Country Code |
English | en | EN |
Germany | de | DE |
China | zh | CN |
Czech Republic | cs | CZ |
Netherlands | nl | AN |
France | fr | FR |
Italy | it | IT |
Japan | ja | JP |
Korea | ko | KR |
Russia | ru | RU |
Spain | es | ES |
Bulgaria | bg | BG |
Canada | ca | CA |
Croatia | hr | HR |
Denmark | da | DK |
Finland | fi | FI |
Greece | el | GR |
Hungary | hu | HU |
Indonesia | in | ID |
Latvia | lv | LV |
Lithuania | lt | LT |
Norway | nb | NO |
Portugal | pt | PT |
Romania | ro | RO |
Serbia | sr | RS |
Slovakia | sk | SK |
Slovenia | sl | SI |
Sweden | sv | SE |
Thailand | th | TH |
Turkey | tr | TR |
Ukraine | uk | UA |
Vietnam | vi | VN |
Ví dụ tạo chương trình hiển thị chuỗi “Hello World” và “Xin chào thế giới!” tuỳ thuộc vào lựa chọn của người dùng là tiếng Anh hay tiếng Việt. Các bước thực hiện như sau:
Bước 1: Tạo 2 tập tin properties tương ứng 2 ngôn ngữ muốn hiển thị
Tạo tập tin MessageBundle_en_US bằng cách chuột phải vào project hoặc package -> chọn New -> chọn Properties File -> nhập tên tập tin tại File Name -> chọn Finish
Nhập nội dung cho tập tin MessageBundle_en_US
#key = value greeting = Hello World!
Tạo tập tin MessageBundle_vi_VN và nhập nội dung sau
greeting = Xin chào thế giới!
Lưu ý key trong các tập tin phải giống nhau, các tập tin này chỉ khác nhau về value. Mỗi value tương ứng cho một ngôn ngữ.
Hình bên dưới cho biết hai tập tin properties được lưu trong packge tên internationalization.message
Bước 2: Tạo lớp I18NMessages và cài đặt xử lý
package internationalization.message;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.Scanner;
/**
*
* @author giasutinhoc.vn
*/
public class I18NMessages {
public static void main(String[] args) {
int lang;
Scanner s = new Scanner(System.in);
ResourceBundle bundle;
do {
System.out.println("1. English");
System.out.println("2. Vietnamese");
System.out.println("3. Exit program");
System.out.print("Please choose your language: ");
lang = s.nextInt();
switch (lang) {
case 1:
//internationalization.message is package name
//MessageBundle is properties file name
bundle = ResourceBundle.getBundle("internationalization.message.MessageBundle", Locale.US);
System.out.println("Message in " + Locale.US
+ ": " + bundle.getString("greeting"));
break;
case 2:
//changing the default locale to Vietnamese
Locale.setDefault(new Locale("vi", "VN"));
bundle = ResourceBundle.getBundle("internationalization.message.MessageBundle");
System.out.println("Message in " + Locale.getDefault()
+ ": " + bundle.getString("greeting"));
break;
}
} while (lang != 3);
}
}
Khi chạy chương trình trên, chúng ta sẽ nhận được kết quả sau
Tham khảo việc làm Java hấp dẫn trên TopDev
Internationalization và localization trong Java – Quốc tế hoá ngày (Date)
Chúng ta có thể quốc tế hoá ngày bằng cách sử dụng phương thức getDateInstance() của lớp DateFormat. Phương thức này nhận vào 2 tham số là style với các kiểu như DEFAULT, SHORT, LONG và locale.
Ví dụ sau đây sẽ hiển thị ngày hiện tại theo những vùng miền khác nhau như JP và VN
package internationalization;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Scanner;
/**
*
* @author giasutinhoc.vn
*/
public class I18NDate {
private static void printDate(Locale locale) {
DateFormat formatter = DateFormat.getDateInstance(DateFormat.LONG,
locale);
Date currentDate = new Date();
String date = formatter.format(currentDate);
System.out.println(locale + " : " + date);
}
public static void main(String[] args) {
int region;
Scanner s = new Scanner(System.in);
do {
System.out.println("1. Japan");
System.out.println("2. Vietnam");
System.out.println("3. Exit program");
System.out.print("Please choose your region: ");
region = s.nextInt();
switch (region) {
case 1:
printDate(Locale.JAPAN);
break;
case 2:
printDate(new Locale("vi", "VN"));
break;
}
} while (region != 3);
}
}
Khi chạy chương trình
Internationalization và localization trong Java – Quốc tế hoá thời gian (Time)
Trong ví dụ này, chương trình sẽ hiển thị thời gian hiện tại dựa theo vùng miền được chỉ định.
package internationalization; import java.text.DateFormat; import java.util.Date; import java.util.Locale; import java.util.Scanner; /** * * @author giasutinhoc.vn */ public class I18NTime { static void printTime(Locale locale) { DateFormat formatter = DateFormat.getTimeInstance(DateFormat.LONG, locale); Date currentDate = new Date(); String time = formatter.format(currentDate); System.out.println(time + " in locale: " + locale); } public static void main(String[] args) { int region; Scanner s = new Scanner(System.in); do { System.out.println("1. England"); System.out.println("2. Vietnam"); System.out.println("3. Exit program"); System.out.print("Please choose your region: "); region = s.nextInt(); switch (region) { case 1: printTime(Locale.ENGLISH); break; case 2: printTime(new Locale("vi", "VN")); break; } } while (region != 3); } }
package internationalization;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Scanner;
/**
*
* @author giasutinhoc.vn
*/
public class I18NTime {
static void printTime(Locale locale) {
DateFormat formatter = DateFormat.getTimeInstance(DateFormat.LONG, locale);
Date currentDate = new Date();
String time = formatter.format(currentDate);
System.out.println(time + " in locale: " + locale);
}
public static void main(String[] args) {
int region;
Scanner s = new Scanner(System.in);
do {
System.out.println("1. England");
System.out.println("2. Vietnam");
System.out.println("3. Exit program");
System.out.print("Please choose your region: ");
region = s.nextInt();
switch (region) {
case 1:
printTime(Locale.ENGLISH);
break;
case 2:
printTime(new Locale("vi", "VN"));
break;
}
} while (region != 3);
}
}
Internationalization và localization trong Java – Quốc tế hoá số (Number)
Cài đặt ví dụ
package internationalization;
import static internationalization.I18NTime.printTime;
import java.text.NumberFormat;
import java.util.Locale;
import java.util.Scanner;
/**
*
* @author giasutinhoc.vn
*/
public class I18NNumber {
private static void printNumber(Locale locale) {
double n = 10000.12345;
NumberFormat formatter = NumberFormat.getNumberInstance(locale);
String number = formatter.format(n);
System.out.println(number + " for the locale " + locale);
}
public static void main(String[] args) {
int region;
Scanner s = new Scanner(System.in);
do {
System.out.println("1. England");
System.out.println("2. Vietnam");
System.out.println("3. Exit program");
System.out.print("Please choose your region: ");
region = s.nextInt();
switch (region) {
case 1:
printNumber(Locale.ENGLISH);
break;
case 2:
printNumber(new Locale("vi", "VN"));
break;
}
} while (region != 3);
}
}
Kết quả khi chạy chương trình
Internationalization và localization trong Java – Quốc tế hoá tiền tệ (Currency)
package internationalization;
import java.text.NumberFormat;
import java.util.Locale;
import java.util.Scanner;
/**
*
* @author giasutinhoc.vn
*/
public class I18NCurrency {
private static void printCurrency(Locale locale) {
float n = 10500.3245F;
NumberFormat formatter = NumberFormat.getCurrencyInstance(locale);
String currency = formatter.format(n);
System.out.println(currency + " for the locale " + locale);
}
public static void main(String[] args) {
int region;
Scanner s = new Scanner(System.in);
do {
System.out.println("1. Japan");
System.out.println("2. Vietnam");
System.out.println("3. Exit program");
System.out.print("Please choose your region: ");
region = s.nextInt();
switch (region) {
case 1:
printCurrency(Locale.JAPAN);
break;
case 2:
printCurrency(new Locale("vi", "VN"));
break;
}
} while (region != 3);
}
}
Kết quả khi chạy chương trình
Tổng kết Internationalization và localization trong Java
- Quốc tế hoà và nội địa hoá
- Quốc tế hoà thông điệp
- Quốc tế hoá ngày, thời gian, số và tiền tệ
Bài viết gốc được đăng tải tại giasutinhoc.vn
Xem thêm:
- Top 10 câu hỏi phỏng vấn Java Developer thường gặp
- Hướng dẫn Java Design Pattern – Builder
- Code ví dụ Callable, Future, Executors trong Java
Đừng bỏ lỡ việc làm IT mọi cấp độ tại TopDev
- T Từ khóa final trong Java
- R RxJava – Thời đại lập trình Reactive programming ứng dụng Android đã tới
- J Java roadmap cho newbie – Từ số 0 đến chuyên nghiệp
- T Top các Framework Java Backend phổ biến cho anh em Developer
- T Tìm hiểu về lớp HashMap trong Java: Các hoạt động và cách dùng
- L Lập trình Android bằng Java: Hướng dẫn toàn diện
- J Java Super là gì? Sự khác biệt giữa Java Super và Java thông thường
- K Khai báo phương thức overloading trong Java
- J Java Sleep: Kỹ thuật ngủ luồng trong lập trình Java
- S Sử dụng subString trong xử lý văn bản trong Java