Internationalization và localization trong Java (Bài 9)

Internationalization và localization trong JavaInternationalization 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.

Tương tự như Internationalization, 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 and localization in java 1

internationalization va localization trong java 7

internationalization va localization trong java 8

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

internationalization va localization trong java 2

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

internationalization va localization trong java 3

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 va localization trong java 4

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);
 }
}

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 va localization trong java 5

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

internationalization va localization trong java 6

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ệ

Trả lời