簡介
您是否曾嘗試過國際化 MIDlet,卻以失敗告終?使用 MIDP/CLDC 本地化 MIDlet 需要完成大量的工作,java Platform,Standard Edition(Java SE)以成熟的 API 簡化國際化工作。CDC Foundation 提供了大量 API 來完成國際化和本地化工作。而如果使用 MIDP/CLDC 來完成這些工作,將是一次非常痛苦的經歷;甚至沒有一個可用的 ResourceBundle 類。還好有另外一個選擇 —— JSR-238 提供了可直接用于資源本地化和數據格式化的類。
作為開始,看一下 Java SE 和 Java ME 對全球化支持的對比,如 圖 1 所示。(本圖是從 “Considerations of Globalization Solutions in J2ME” 文中轉載的。參見 參考資料 中的鏈接。)
圖 1 顯示出,編寫一個支持全球化的 Java SE 應用程序是十分簡單的;Java SE 提供了開發全球化應用程序所需的幾乎所有東西。CDC Foundation 提供了一些用來編寫全球化應用程序的 API ,但不是全部。然而建立在 MIDP/CLDC 基礎上的應用程序僅提供有限的日歷和時區的相關類,您需要親自編寫幾乎所有的全球化類。
全球化應用程序的歷史
要本地化 MIDlet,通常需要使用 MIDP 核心類編寫 ResourceBundle 和 Locale。有很多關于如何完成這一任務的文章,包括 “Globalize Your Embedded Apps”(參見 參考資料)。
為了實現國際化功能,就是說根據不同的地區顯示其當地語言,您需要編寫自己的 ResourceBundle 類,這對檢索本地化字符串是很必要的,例如面向不同地區的 “Hello” 和 “Bonjour”。對于數據格式化,例如 Currency、Numbers 和 DateTime,您也需要實現這些程序。這將耗費大量的精力,因為您不得不收集大量的地區數據信息,還必須熟知具體的文化差異。
JSR-238 Mobile Internationalization API 簡介
國際化 MIDlet 是接觸更廣闊市場的一個關鍵條件。新的 JSR-238 Mobile Internationalization API 提供了一種標準方法幫助您更快、更輕松地實現 MIDlet 國際化,還提供了用 MIDP/CLDC 實現 MIDlet 國際化的基礎 API。
請注意:JSR-238 API 是一個可選的軟件包。開始向其部署 JSR-238 MIDlet 之前,必須確保您的設備支持它。
JSR-238 目標聲明
此聲明引自 JSR-238 規范:
“Mobile Internationalization API 的目標是為運行在 CLDC 上 MIDP 中的 Java MIDlet 提供國際化服務。Java 2 Standard Edition 提供對國際化的廣泛支持,JAVA 2,Micro Eition 更具局限性的設置和配置文件并不包括這種支持。”
這種 API 被設計為以簡潔通用的形式提供服務。在國際化方面,它使 MIDP 應用程序達到一個與桌面應用程序類似的級別,從而擴充了 MIDP 應用程序平臺。
JSR-238 包,javax.microedition.global 提供的一些重要類如下:
我將具體討論這些類,但在此之前您必須了解,您將需要使用 Sun Java Wireless Toolkit 2.5 for CLDC Beta、Nokia JSR-238 RI 或 Eclipse 來配合 JSR-238 開發 MIDlet。本例將使用 Eclipse。
首先,您需要獲得 JSR-238 庫,它是隨 Sun WTK 2.5 Beta、Nokia 的 JSR-238 RI 一起提供的。IBM? 在 WebSphere? Everyplace Micro Environment 移植包中提供了 JSR-238,IBM 業務合作伙伴都可以使用。
如果您現在使用的是 WTK 的老版本,其中不包括 JSR-238 庫,您需要自己添加 JSR-238。您依然可以在 Eclipse 編寫和編譯,但由于類加載器的限制,Eclipse 是無法啟動的。要配置 Java ME 項目以包含 JSR-238 支持:
就是這樣!您已經將 JSR-238 庫添加到開發環境中可,現在就可以開始編寫 MIDlet 國際化程序了。
使用 ResourceManager
現在我將演示如何使用 ResourceManager 來管理不同地區的資源文件。
要用不同的語言來顯示本地字符串,就需要準備不同地區的資源文件。資源文件包括要本地化的字符串,如果有圖片的話,也要將其包含在資源文件里面。資源文件就像 Java SE 的屬性文件,但是是二進制格式。它有以下優點:
對于條件有限的設備來說,這些優點是十分重要和有效的。
現在讓我們編寫一個簡單的 MIDlet,根據地區顯示字符串和圖片。圖 5 顯示了資源文件結構。在以下步驟中,我將使用 WebSphere Everyplace Micro Environment 6.1 和 IBM WebSphere Everyplace Micro Environment 移植包的 JSR-238 庫。
步驟 1:準備資源文件
二進制的資源文件必須遵守嚴格的格式。(參考 JSR-238 規范)。可以使用任何一種二進
制文件編輯器或者 Nokia JSR-238 RI 創建資源文件。
為演示起見,我使用 Nokia JSR-238 RI 來創建二進制資源文件,如 圖 6 所示。我想為 zh-TW,de-DE 和 es-ES 這幾個地區顯示 “Welcome” 字符串和一幅圖片。可以閱讀 Nokia 238 RI 的自述文件了解相關步驟,但基本上,您需要為字符串和圖片編寫一個 xml 資源文件,運行 ResourceMaker 工具獲得二進制文件。
進入討論組討論。
在 圖 7 中,采用當地語言的字符串存儲在一個地區文件夾中,圖片的二進制文件存儲在 /global/WelcomeMidlets.res 中。您不會希望圖像的二進制文件存儲在每一個資源文件中!
步驟 3:編寫 MIDlet
為了從資源文件檢索字符串和圖片,您需要執行下列步驟:
ResourceManager 實例。您可以指定一個地區,也可以使用系統默ResourceManager 實例的兩種方法。以下代碼返回具有 “WelcomeMidlet” 基本名稱以及系統默認地區的 ResourceManager 實例:
res = ResourceManager.getManager("WelcomeMidlet"); 使用以下代碼檢索字符串:
//STRING_WELCOME is the resource id in the resource file; in this case 1StringItem desc = new StringItem(res.getString(STRING_WELCOME),"");
使用下列代碼檢索圖片:
//IMAGE_EILEAN is the resource id in resource file, in this case 111byte[] imageData = res.getData(IMAGE_EILEAN);
清單 1 演示了這些步驟。
try{ //Get the resource manager with the base name and default systemlocale res = ResourceManager.getManager("WelcomeMIDlet"); //Retrieve the welcome string StringItem desc = new StringItem(res.getString(STRING_WELCOME),""); fmMain = new Form(res.getString(STRING_WELCOME)); fmMain.append(desc); //Retrieve the Eilean image byte[] imageData = res.getData(IMAGE_EILEAN); Image eilean = Image.createImage(imageData, 0, imageData.length); fmMain.append(eilean);}catch(ResourceException re){ System.out.
- 運行 MIDlet。我在 Eclipse 中使用 IBM J9 仿真器運行它。
表 2 展示了在 zh-TW 和 de-DE 地區顯示 “Welcome MIDlet” 的結果。
表 2. Welcome MIDlet
zh-TW 地區de-DE 地區
就是這樣!使用資源文件管理不同地區的本地化字符串,將圖片的二進制文件轉換為所有地
區都可以使用的通用資源。ResourceManager 類將根據系統默認地區或您在構造函數中指定
的地區來裝載資源文件。現在您可以使用一種更快、更簡單的方法來本地化菜單、按
鈕和消息了。
進入討論組討論。 數據格式化
每一個地區都有自己的文化,都采用自己的方式顯示日期、時間、數字、百分數和貨幣數據。Formatter 類可以滿足格式化此類數據的全部需求。表 3 顯示了它所提供的類。
表 3. 數據格式化方法
日期和時間 formatDateTime(java.util.Calendar dateTime, int style) 數字和百分比 formatNumber(double number)
formatNumber(double number, int decimals)
formatNumber(long number)
formatPercentage(float value, int decimals)
formatPercentage(long value) 貨幣值 formatCurrency(double number)
formatCurrency(double number, java.lang.String currencyCode) 現在將編寫一個簡單的 MIDlet 程序來顯示日期、時間、數字、百分比和貨幣數據。

步驟 1:構造一個 Formatter 實例
您可以指定地區,也可使用系統默認地區。下面是所需要的代碼:
//Using system default localeFormatter fmt = new Formatter();//Specify the localeFormatter fmt = new Formatter("zh-TW");
步驟 2:創建可編輯文本字段。
您希望創建可編輯的文本文件以使用戶輸入數字、百分數、貨幣數據等等。您需
要這些文本字段的內容和對其進行格式化的 Formatter 類方法,如 清單 2 所示。
清單 2. 數據格式化
public String formatNumber(double number){ return fmt.formatNumber(number); } public String formatPercentage(float number, int decimals){ return fmt.formatPercentage(number,decimals); } public String formatCurrency(double number){ return fmt.formatCurrency(number); } ..... //Process events public void commandAction(Command c, Displayable s) { if (c == cmExit) { destroyApp(false); notifyDestroyed(); } else if( c == cmFormat) { //Number formatting double num = Double.parseDouble(tfNumeric.getString()); siResultNum.setText(this.formatNumber(num)); //Percentage formatting float percentage = Float.parseFloat(tfPercentage.getString()); siResultPercent.setText(this.formatPercentage(percentage,2)); //Currency formatting double curr = Double.parseDouble(tfCurrency.getString()); siResultCurr.setText(this.formatCurrency(curr)); //Display the result displayResult(); }
現在運行 MIDlet。表 4 顯示了應獲得的結果。(注意:我為 zh-TW 使用了一種不同的字體。)
進入討論組討論。 表 4. Formatter MIDlet
zh-TW 地區de-DE 地區
格式化日期/時間的不同風格
Formatter 類支持以下風格:
- 僅 short date
- 僅 long date
- 僅 short time
- 僅 long time
- short date 和 time
- short date 和 time
Formatter 類為不同的風格定義了字段。例如,對于僅 short date 這種風格定義了 Formatter.DATE_SHORT,您在 formatDate 方法里使用這些風格就可以了。進入討論組討論。
清單 3 給出了一個簡單的 MIDlet,它示范了日期格式化。
清單 3. 日期格式化 MIDlet
public String formatDateTime(Calendar c){ //Short date format String result = fmt.formatDateTime(c,Formatter.DATE_SHORT); String result_set = ""; result_set= result_set+"/n"+"formatDateTime(Calendar, DATE_SHORT)
returns:"+result; //Long date format result = fmt.formatDateTime(c,Formatter.DATE_LONG); result_set = result_set+"/n"+"formatDateTime
(Calendar, DATE_LONG)returns:"+result; //Long date and time result = fmt.formatDateTime(c,Formatter.DATETIME_LONG); result_set =
result_set+"/n"+"formatDateTime(Calendar, DATETIME_LONG)returns:"+result; //Short date and time result = fmt.formatDateTime(c,Formatter.DATETIME_SHORT); result_set =
result_set+"/n"+"formatDateTime(Calendar, DATETIME_SHORT) returns:"+result; //Long time result = fmt.formatDateTime(c,Formatter.TIME_LONG); result_set =
result_set+"/n"+"formatDateTime(Calendar, TIME_LONG) returns:"+result; //Short time result = fmt.formatDateTime(c,Formatter.TIME_SHORT); result_set =
result_set+"/n"+"formatDateTime(Calendar, TIME_SHORT) returns:"+result; return result_set;} //Called by the application manager to start the MIDlet.public void startApp(){ display.setCurrent(fmMain);}public void pauseApp(){}public void destroyApp(boolean unconditional){}//Process eventspublic void commandAction(Command c, Displayable s){ if (c == cmExit) { destroyApp(false); notifyDestroyed(); } else if( c == cmFormat) { //Get the current system date and time Date dt = new Date(); Calendar cal = Calendar.getInstance(); cal.setTime(dt); siResult.setText(this.formatDatetime(cal)); displayResult(); }}
表 4 展示了 DateTime format MIDlet 在 zh-TW 和 de-DE 這兩個地區的顯示結果。
表 4. DateTime format MIDlet
zh-TW 地區de-DE 地區
另一個有用的類
可以使用 StringComparator 執行字符串的排序和比較操作。相關的排序編程示例,
請參考 JSR-238 指南。
結束語
JSR-238 提供了一種更快、更簡單的方法,利用 MIDP/CLDC 來國際化您的 MIDlet。使用 javax.microedition.global 包中的 ResourceManager、Formatter 和 StringComparator 類來進行本地化工作以及特定于地區的數據格式化。提醒一下,JSR-238 是一個可選包;務必確保您的設備支持它。現在您應該熟悉了 JSR-238,可以去更出色地完成開發工作了!
進入討論組討論。 (出處:http://m.survivalescaperooms.com)
學習交流
熱門圖片
猜你喜歡的新聞
新聞熱點
2019-10-23 09:17:05
2019-10-21 09:20:02
2019-10-21 09:00:12
2019-09-26 08:57:12
2019-09-25 08:46:36
2019-09-25 08:15:43
疑難解答
主站蜘蛛池模板:
都江堰市|
怀宁县|
汶川县|
定陶县|
黄浦区|
赫章县|
盐山县|
商丘市|
建德市|
安顺市|
梅河口市|
霍城县|
临泽县|
南陵县|
那坡县|
丰原市|
通州市|
黔西县|
衡阳县|
耒阳市|
莱西市|
菏泽市|
东光县|
阳曲县|
高雄县|
威海市|
大庆市|
汽车|
丘北县|
合作市|
大英县|
南安市|
阿克陶县|
南川市|
瓦房店市|
太康县|
内黄县|
永顺县|
兴文县|
广饶县|
逊克县|