BỌC TÀI NGUYÊN

Khi thực hiện bản địa hoá một phần mềm, ta thường gặp phải vấn đề gây nhiều phiền phức là phải dịch rất nhiều thông báo, tên gọi của các nút, nhãn, các mục, v.v. sang tiếng bản địa. Đẻ cho tiện lợi hơn, ta có thể định nghĩa các xâu ở bên ngoài và đặt vào cảc bọc tài nguyên, độc lập với chương trình, được gọi là tệp tài nguyên. Các tệp tài nguyên được biên soạn, dịch sang tiếng bản địa mà không ảnh hường gì đến mã nguồn cùa chương trình.

1. Bản địa hóa tài nguyên

Công nghệ Java cung cấp lớp ResourceBundle hỗ trợ để ta thực hiện được các yêu cầu trên. Ta có thể tạo ra một lớp khác cho mỗi khu vực, sau đó gọi phương thức getBundle () của ResourceBundle để xác định tự động lớp theo yêu cầu. Các lớp đó phải kế thừa từ lớp ResourceBundle.

Để thực hiện được các yêụ cầu trên, ta phải tuân theo qui ước đặt tên cho các lớp này tương ứng với từng khu vực. Ví dụ, tài nguyên dành riêng người Đức thì lớp đó là ProgramResourcesde_de, còn tài nguyên cho khu vực những người nói tiếng Đức là ProgramResourcesde_de__DE. Ta sừ dụng qui ước

ProgramResour ces_language_count ry đế đặt tên các tệp tài nguyên cho tất cả các nước theo country cụ thề, và

ProgramResources_language

để đặt tên các tệp tài nguyên cho tất câ các khu vực nói tiếng language.

Khi đã có một lớp bọc tài nguyên, ta có thể tải nó xuống bằng lệnh

ResourceBundle currentResource =

ResourceBundle.getBundle(“ProgramResources”, currentLocale); Hàm getBundle () sẽ thử tải xuống một trong các lớp tài nguyên sau: PrograitfResources_language_country_variant ProgramResources_language__country ProgramResources_language ProgramResources

Nếu không tải xuống được thì nó thử làm một lần nữa, nhưng lần này không phải áp dụng với đối tượng khu vực hiện thời mà là với khu vực mặc định. Trường họp không thề tải xuống được thì nó phát sinh ra ngoại lệ MissìngResourceExceptìon.

2. Đặt tài nguyên vào các bọc

Trong Java, ta có thể đặt tài nguyên vào trong các lóp được mờ rộng từ lớp ResourceBundle, Mỗi bọc tài nguyên cài đặt như là một bảng tra cứu tìm các từ tương ứng theo các từ khoá.

Khi thiết kể chương trình, ta phải cung cấp xâu chính (từ khoá) cho mỗi lần thiết lập vùng bản địa và sau này sử dụng nó để truy tim đối tượng khu vực.

String camputeButtonLabel

= resources.getstring(“computeButton”ì;

Ta cũng có thể sử dụng hàm getobject 0 để xác định đối tượng ‘bất kỳ từ bọc tài nguyên.

Color backgroundColor

= (Color)resources.getobject(“backgroundColor”); doublet] paperSize

= (double[])resources.getobject(“defaultPaperSize”);

Để cài đạt lớp bọc tài nguyên riêng, ta phải cài đặt hai hàm

Enumeration getKeys()

Object handleGetObject(String key)

Ví dụ, lóp sau đây cung cấp tài nguyên để dịch cho khu vực nói Đức và người Mỹ nói tiếng Anh.

public class ProgramResources extends ResourceBundle{

// Đặt hàm getKeys {) vào lớp cơ sở public Enumeration getKeỵs(){

return Collections.enumeration(Arrays.asList(keys));

}

private String [] keys’ = {“computeButton”,

“backgroundColor”, “defaultPaperSize”};

}

}

public class ProgramResources_de extends ProgramResources{

// Lớp tài nguyên cho khu vực nói tiếng Đức public Object handleGetObject(String key){ if (key. equals (“computeButton” ) ) return “Rechmen”;

else if(key.equals(“backgroundColor”)) return Color.black;

else if(key.equals(“defaultPaperSize”)) return new double[]{210, 297};

}

}

public class ProgramRe sources_en_ƯS extends ProgramResources{ // Lóp tài nguyên cho khu vực người Mỹ nói tiếng Anh public Object handleGetObject(String key){ if(key.equals(“computeButton”)) return “Compute”;

else if(key.equals(“backgroundColor”)) return Color.blue;

else if(key.equals(“defaultPaperSize”)) return new doublet](216, 279);

}

}

Hiển nhiên, công việc viết các mã lệnh như trên là khả buồn chán. Thư viện chuẩn cùa Java cung cấp hai loại lớp tài nguyên khác là ListResourceBundle và PropertyResourceBundle giúp cho việc tổ chức chúng dễ dàng hơn.

a) ListResourceBundle cho phép đặt tài nguyên vào một mảng các đối tượng, public class ProgramResources_language_country extends LístResourceBundle{ public Object!] getContents(){ return contents;

}

static final Object!]u contents = {

// Các thông tin được bản địa hoá

};

}

Ví dụ trên có thể viết lại như sau:

public class ProgramResources_de extends ListResourceBundle! public Object!] getcontents(){ return contents;

}

static final Object!][] contents = {

{“computeButton”, “Rechmen”}f {“backgroundColor”, Color.black]

{“defaultPaperSize”, new double[]{210, 297}}

}

}

public class ProgramResources_en_US extends ListResourceBundle{ public Object!] getContents(){ return contents;

}

static final Object!][] contents = {

{“computeButton”, “Compute”},

{“backgroundColor”, Color.blue}

{“defaultPaperSize”, new double[]{216, 279}}

b) p rope rtyRe sour ce Bundle cho phép đặt cảc tài nguyên một cách linh hoạt hon Ta có thể tạo ra tệp tài sản cùa tài nguyên đon giản ìà tệp văn bản bao gồm từng cặp giả trị trên mỗi dòng, viết dưới dạng

computeButton=Compute backgroundColor=blue defauItPapersize=216×279

Sau đó ta mỡ tệp tài sản này và truyền nó vào cho toán tử tạo lập của

PropertyResourceBundle.

Input Stream in = … ; // Mở tệp tài sản

PropertyResourceBundle currentResources = new PropertyResourceBundle(in);

Các tệp tài sản thường có tên trùng với tên của các tài nguyên và có phần mở rộng là .property, vi dụ ProgramResources_en__US.property là tệp tài sản dùng cho những người Mỹ nói tiếng Anh. Ta có thể mờ tệp tài sản thông qua hàm getResourceAsStream ( ) cùa lóp Class như sau:

in = Program.class.getResourceAsStream (

“ProgramResources_en_US. propety”);

PropertyResourceBundle currentResources = new PropertyResourceBundle(in);

Lưu ý: Như vậy đối với những chưomg trình cần được bản địa hoá thì cần phải tạo ra hai loại tệp: các tệp lớp (.class) và các tệp tài sản ( property). Tệp tài sản là các tệp văn bản gồm các cặp giá trị từ khoá / giá trị (key/value), trong đó giá trị value chính là tên được bàn địa hoá cùa từ khoá key. Cả hai loại tệp này phải được đặt vào cùng một thư mục hoặc gộp vào trong một tệp JAR

Khi cần tìm hiểu sâu về vấn đề quốc tế hoá và bàn địa hoá phần mềm, bạn có thể sừ dụng công cụ jikit (http://iava,sun.com/products/iikitl để quản lý việc tạo lập và duy trì các bọc tài nguyên.

java.utiI.ResourceBu.ndle

  • static ResourceBundle getBundle(String baseNamd, Locale 1)
  • static ResourceBundle getBundle(String baseName)

Nạp lớp bọc tài nguyên có tên baseName và dịch sang khu vực 1 hoặc khu vực mặc

định .

  • OBject getobject(String name)

Tim đối tượng từ bọc tài nguyên hoặc từ các lớp cha của nó.

  • String getstring(String name)

Tìm đối tượng từ bọc tài nguyên hoặc từ các lớp cha của nó và ép kiểu về string.

  • stringn getStringArraỵ (string name)

Tìm đối tượng từ bọc tài nguyên hoặc từ các lóp cha của nó và ép kiểu về mảng của các xâu.

  • Enumeration getKeỵs()

Lấy ra dãy các từ khoả theo thứ tự được liệt kê.