本课程使用 Oracle 全球化开发工具包 (GDK) 中的 API,演示如何将现有的英语单语种 J2EE 应用程序移植到全球化多语种应用程序。该应用程序包含一个指向基于 oe 示例模式 (Schema) 的简单客户订单检索应用程序(Oracle 商店)的 JSP 前端,并包含使用 GDK 维护常规 Java 对象的 servlet。
本模块将讨论以下主题:
将光标置于该图标上,以显示所有屏幕截图。您也可以将光标置于每个图标上,只查看与之关联的屏幕截图。
针对 Java 的全球化开发工具包 (GDK) 提供了 J2EE 应用程序框架和 Java API,使您能够使用 Oracle 设计的最佳全球化应用和功能开发全球化互连网应用程序。GDK 通过将 Oracle 全球化支持功能扩展到应用服务器,对 Java 中的现有全球化功能进行了补充。现在可以在中间层中使用全球化逻辑(如 Oracle 日期/数字/货币格式以及 Oracle 二进制排序与语言排序)。GDK 提供 Oracle 本地化信息与 Java 本地化信息之间的映射、Oracle 字符集与 Java 字符集之间的转换,并返回本地化信息相关的数据集,如常用语言、常用语言排序以及给定地区所支持的本地时区等。它提供可以封装全球化编程的复杂部分(如本地化信息确定以及本地化信息的缓存和处理)的 API。它支持对用户首选本地化信息的检测、重新编写 URL 以为不同的本地化信息定位内容,并提供了单个应用程序配置文件来控制用户应用程序的全球化行为。
注意:本地化信息是指国家语言以及使用该语言的地区。例如,美国和英国的主要语言是英语,但这两个地区具有不同的货币和不同的日期格式惯例。因此,美国和英国被视为是两种不同的本地化信息。
在开始本模块的学习之前,您应该已经:
| 1. |
Completed the Configuring Linux for the Installation of Oracle Database 10g lesson |
|
| 2. | ||
| 3. | ||
| 4. |
将 gdk.zip 下载并解压到工作目录(即 /home/oracle/wkdir) |
|
该应用程序包含以下文件:
| AuthFilter.java | 认证过滤器 | |
| MyAccountAction.java | 我的帐户 servlet | |
| OrderInformationAction.java | 订单信息 servlet | |
| ShopAction.java | 商店操作 |
| Customer.java | 客户 bean | |
| Order.java | 订单 bean | |
| OrderItem.java | 订单项 bean |
| DBLocaleSource.java | 数据库中用户模式的本地化信息源 | |
| Translations.java | 英语 UI 翻译(将在本课程中加) | |
| Translations_de.java | 德语 UI 翻译(将在本课程中添加) | |
| Translations_es.java | 西班牙语 UI 翻译(将在本课程中添加) | |
| Translations _zh_cn.java | 简体中文 UI 翻译(将在本课程中添加) |
JSP 和静态内容
| index.jsp | 索引 JSP 页面 | |
| myaccount.jsp | 我的帐户 JSP 页面 | |
| orderinformation.jsp | 订单信息 JSP 页面 | |
| feedback.jsp | 反馈 JSP 页面 | |
| store_logo_new.gif | 英语商店徽标图像 | |
| US.gif | 美国国旗图像(将在本课程中添加) | |
| CN.gif | 中国国旗图像(将在本课程中添加) | |
| DE.gif | 德国国旗图像(将在本课程中添加) | |
| ES.gif | 西班牙国旗图像(将在本课程中添加) | |
| IN.gif | 印度国旗图像(将在本课程中添加) |
| store_logo_new.gif | 德语 Oracle 商店徽标(将在本课程中添加) |
| store_logo_new.gif | 西班牙语 Oracle 商店徽标(将在本课程中添加) |
| store_logo_new.gif | 简体中文 Oracle 商店徽标(将在本课程中添加) |
| web.xml | Web 部署描述符 | |
| gdkapp.xml | GDK/OGS 应用程序配置文件(将在本课程中添加) |
| orai18n-lcsd.jar | GDK LCSD(语言和字符集检测)扩展(将在本课程中添加 | |
| orai18n.jar | GDK 主库(将在本课程中添加) |
为使 Oracle 商店应用程序正常工作,您需要使用新示例数据填充示例模式。执行以下操作:
| 1. |
将 gdk.zip 解压到工作目录。将 /home/oracle/wkdir 设为工作目录。 |
|
| 2. |
创建用于存储货币汇率和时区信息的表。打开终端窗口,执行以下命令: cd /home/oracle/wkdir/gdk/step0 sqlplus oe/oe @obeGdkSetup 注意:obeGdkSetup.sql 是一个脚本文件,用于填充 OE 模式的 CUSTOMERS、ORDERS 和 ORDER_ITEMS 等表。该目录还包含一个名为 obeGdkRevert.sql 的脚本,用于卸载为本课程创建的所有对象。 |
|
您将把该应用程序作为英语单语种应用程序运行并观察它的行为。然后,您将更改其源文件,把该应用程序改为多语种应用程序。请注意,修改后的文件已经提供,您不必更改源文件。但是,在此课程中将明示对文件的更改。
执行以下操作,运行单语种应用程序:
| 1. |
启动 Oracle9i JDeveloper。 |
|
| 2. |
将 Mozilla 设置为 Jdeveloper 中的默认浏览器。 |
|
| 3. |
在 System-Navigator 窗口中单击并高亮显示 Workspaces。单击 Add to Workspaces... 左上角的 + 图标 |
|
| 4. |
选择并打开文件 /home/oracle/wkdir/gdk/obe_gdk.jws。注意:如果询问您是否要移植这些文件,请单击 Yes |
|
| 5. |
展开该树型结构,确保包含了项目 gdkshop.jpr。 |
|
| 6. |
您将需要验证 JDBC 数据库连接字符串。展开 gdkshop.jpr 的项目树。右键单击 web.xml 并选择 Open。 |
|
| 7. |
它应包含以下信息: <context-param> <param-name>gdkdemo.jdbccon</param-name> <param-value>jdbc:oracle:thin:@localhost:1521:orcl</param-value> </context-param> 当前设置使用端口 1521 连接到本地计算机上 SID 为 orcl 的数据库。如有必要,将其替换为您的连接字符串并保存该文件。 |
|
| 8. |
单击并高亮显示项目 gdkshop.jpr。选择 Menu 选项 Run -> Run gdkshop.jpr。 注意:您可能需要打开一个浏览器实例才能查看该应用程序 |
|
| 9. |
第一个页面是 Oracle 商店应用程序的登录画面,其中的下拉式列表框显示可用的客户及其所在国家。单击 Submit 按钮,查看帐户配置文件以及选定客户的订单历史记录。 |
|
| 10. |
查客户详细信息。注意,日期将显示在浏览器的右上角。单击 Back。 |
|
| 11. |
查看另一位客户 Daniel Zhang 的详细信息。从下拉式列表框中选择 Daniel Zhang 并单击 Submit。 |
|
| 12. |
请注意,Daniel 的地区首选项是中国 (China),但由于该应用程序尚未全球化,因此所有文本均以英文显示;信用额度 (credit limit) 以美元计算;订单的日期时间戳根据数据库时间戳而非客户时区而定。从数据库获得的日期使用 Oracle 的日期惯例格式化,而为应用程序生成的日期基于 Java 的惯例格式化。单击订单链接查看订单的详细信息。 |
|
| 13. |
与上一画面相似,包括产品名称和说明在内的所有文本均以英文显示;货币值使用基于美元和美国借方符号的美国货币惯例格式化。订单项基于英文产品名称的二进制值进行排序。单击商店徽标将返回客户登录页面。 |
|
此时,您将把单语种应用程序移植到全球化多语种 Oracle 商店。您将添加对以下语言的支持:分别服务于中国、西班牙和印度的 Oracle 商店客户的简体中文、西班牙语和英语。
注意:您不必在现有应用程序中键入所有代码更改,所有更新已经准备好并随演示多语种 Oracle 商店应用程序的压缩文件一起提供。
注意:某些语言可能在某些浏览器中不受支持。建议在本课程中使用 Internet Explorer 6.0 或更高版本。
执行以下操作:
| 1. |
打开终端窗口,执行以下命令: cd /home/oracle/wkdir/gdk/gdkshop/public_html/WEB-INF mkdir lib cd lib cp /home/oracle/wkdir/gdk/step1/lib/orai18n.jar orai18n.jar cp /home/oracle/wkdir/gdk/step1/lib/orai18n-lcsd.jar orai18n-lcsd.jar cd .. cp /home/oracle/wkdir/gdk/step1/web.xml web.xml 在 JDeveloper 中,右键单击 gdkshop.jpr 项目并选择 Project Properties。单击 Path 和 Edit Additional Class Path。单击 Add Entry 并添加以下路径 /home/oracle/wkdir/gdk/gdkshop/public_html/WEB-INF/lib/orai18n.jar 和 /home/oracle/wkdir/gdk/gdkshop/public_html/WEB-INF/lib/orai18n-lcsd.jar
单击 OK |
|||||||
| 2. |
从终端窗口中执行以下命令: cd /home/oracle/wkdir/gdk/gdkshop/public_html/WEB-INF cp /home/oracle/wkdir/gdk/step1/gdkapp.xml gdkapp.xml 该文件包含以下内容: <?xml version="1.0" encoding="utf-8"?> 这是 GDK 应用程序配置文件,它控制 Oracle 商店应用程序的全球化行为。使用 GDK 的每个 J2EE 应用程序都需要一个应用程序配置文件。
|
|||||||
每种语言可以有不同的徽标。您现在可以添加商店徽标。执行以下操作:
| 1. |
从终端窗口中,执行以下命令: cd /home/oracle/wkdir/gdk/gdkshop/public_html mkdir es cd es cp /home/oracle/wkdir/gdk/step2/es/store_logo_new.gif store_logo_new.gif cd .. mkdir zh_CN cd zh_CN cp /home/oracle/wkdir/gdk/step2/zh_CN/store_logo_new.gif store_logo_new.gif 目录“es”和“zh_cn”存储西班牙语和中文 Oracle 商店徽标。 |
|
| 2. |
将 JSP 文件 index.jsp、myaccount.jsp 和 orderinformation.jsp 复制到相应的目录。从终端窗口中,执行以下命令: cd .. cp /home/oracle/wkdir/gdk/step2/index.jsp index.jsp cp /home/oracle/wkdir/gdk/step2/myaccount.jsp myaccount.jsp cp /home/oracle/wkdir/gdk/step2/orderinformation.jsp orderinformation.jsp cp /home/oracle/wkdir/gdk/step2/feedback.jsp feedback.jsp 注意:该文件夹已经包含这三个用于单语种应用程序的文件。用修改后的文件覆盖旧文件。 打开每个文件可以看到,servlet 包和 util 包中的类用如下方式导入: <%@ page import="oracle.i18n.servlet.*, oracle.i18n.util.*" %> 并将 JSP 文件中的商店登录徽标由 store_logo_new.gif 替换为 <%= ServletHelper.rewriteURL("./store_logo_new.gif", request) %>
|
|
|
3. |
现在即可在 JDeveloper 内运行该应用程序。首先,需要确定已经终止 OC4J 服务器。选择 Run -> Terminate -> Embedded OC4J Server |
|
| 4. |
重建项目 gdkshop.jpr。选择 Project -> Rebuild gdkshop.jpr。
|
|
| 5. |
选择 Run -> Run gdkshop.jpr。 |
|
|
6. |
如果看到如下所示的英文 Oracle 商店徽标,则应设置浏览器的语言首选项。 |
|
| 7. |
在本课程中假设您使用 Mozilla 浏览器。选择 Edit --> Preferences。然后,选择导航器下的 Languages。单击 Add 按钮。 |
|
| 8. |
在 Others 域中输入 es 并按回车键。 |
|
| 9. |
请注意,西班牙语已经添加到了列表中。再次单击 Add 按钮添加 Chinese。 |
|
| 10. |
在 Others 域中输入 zh-CN 并按回车键。 |
|
| 11. |
从列表中选择 Spanish 并单击 Move Up 按钮,直到 Spanish 显示在列表顶部。然后单击 OK。 |
|
| 12. |
切换回网页并刷新屏幕。您将看到现在显示西班牙语商店徽标。确保所有 3 个 JSP 页面上均如此显示。 |
|
为了将应用程序翻译到不同语言,应将所有硬编码的文本字符串导出到资源文件,随后即可将这些文件交付翻译。资源包是 Java 本地化应用程序的基本机制。将三个 JSP 文件中的所有 UI 文本导出到 Java 资源包中。执行以下操作:
| 1. |
您需要将这三个翻译文件复制到您的项目目录。从终端窗口中,执行以下命令: cd /home/oracle/wkdir/gdk/gdkshop/src/oracle/i18n/demo/obe/gdkshop mkdir gdk cd gdk cp /home/oracle/wkdir/gdk/step3/Translations.java Translations.java cp /home/oracle/wkdir/gdk/step3/Translations_es.java Translations_es.java cp /home/oracle/wkdir/gdk/step3/Translations_zh_CN.java Translations_zh_CN.java 以下是西班牙语翻译文件 Translations_es.java 的内容: package oracle.i18n.demo.obe.gdkshop.gdk;
|
|
| 2. |
您必须注册“Translations”类。从终端窗口中,执行以下命令: cd /home/oracle/wkdir/gdk/gdkshop/public_html/WEB-INF cp /home/oracle/wkdir/gdk/step3/gdkapp.xml gdkapp.xml 如果查看文件内容,则可以看到 <message-bundles> <resource-bundle name="default">oracle.i18n.demo.obe.gdkshop.gdk.Translations </resource-bundle> </message-bundles>
|
|
| 3. |
处理翻译所必须的代码已经添加到了 JSP 文件中。从终端窗口中,执行以下命令: cd ..(注意:您的目标目录为 /home/oracle/wkdir/gdk/gdkshop/public_html) cp /home/oracle/wkdir/gdk/step3/index.jsp index.jsp cp /home/oracle/wkdir/gdk/step3/myaccount.jsp myaccount.jsp cp /home/oracle/wkdir/gdk/step3/orderinformation.jsp orderinformation.jsp cp /home/oracle/wkdir/gdk/step3/feedback.jsp feedback.jsp 如果查看每个文件的内容,则将看到 Localizer 对象已经通过以下代码在每个 JSP 页面的顶部进行了实例化: <% Localizer localizer = ServletHelper.getLocalizerInstance(request); %> 此外,所有可翻译的文本已经为 localizer.getMessage API 调用所替换。例如,“Returning Customers...”应替换为 <%= localizer.getMessage("RETURNING_CUSTOMERS") %>
|
|
| 4. |
处理翻译所必须的代码已经添加到 java 文件中。从终端窗口中,执行以下命令: cd /home/oracle/wkdir/gdk/gdkshop/src/oracle/i18n/demo/obe/gdkshop cp /home/oracle/wkdir/gdk/step3/MyAccountAction.java MyAccountAction.java cp /home/oracle/wkdir/gdk/step3/OrderInformationAction.java OrderInformationAction.java 如果查看每个文件的内容,则将看到 Localizer 对象已经使用以下代码进行了实例化: <% Localizer localizer = ServletHelper.getLocalizerInstance (request); %> 此外,所有可翻译的文本已经为 localizer.getMessage API 调用所替换。例如,“Returning Customers...”应替换为 import oracle.i18n.servlet.ServletHelper;
|
|
| 5. |
要使应用程序可以识别西班牙语和简体中文翻译文件,应将资源包包含在项目中。在 JDeveloper 中的 System-Navigator 窗口中,单击并高亮显示 gdkshop.jpr。单击左上角的 + 图标。 |
|
| 6. |
选择并打开目录 home/oracle/wkdir/gdk/gdkshop/src。从“File type”下拉式列表框中选择 Java 源文件 |
|
| 7. |
单击 OK。 |
|
|
8. |
现在即可再次运行该应用程序。终止嵌入式 OC4J 服务器、重建 gdkshop.jpr 并运行 gdkshop.jpr。 |
|
|
9. |
您将看到该窗口中的域和按钮已经翻译为西班牙语。单击 Envie 按钮。 |
|
|
10. |
您将看到各域已被翻译为西班牙语。 |
|
现在,您可以格式化日期和数字以查看它对应用程序的影响。执行以下操作:
| 1. |
为了格式化应用程序中的日期和数字,已经进行更改。从终端窗口中,执行以下命令: cd /home/oracle/wkdir/gdk/gdkshop/public_html cp /home/oracle/wkdir/gdk/step4/myaccount.jsp myaccount.jsp cp /home/oracle/wkdir/gdk/step4/orderinformation.jsp orderinformation.jsp cp /home/oracle/wkdir/gdk/step4/feedback.jsp feedback.jsp 使用了以下日期格式: <%= localizer.formatDateTime(new Date(), DateFormat.LONG) %> <%= localizer.formatDate(customer.registeredDate,DateFormat.SHORT)%> <%= localizer.formatDateTime(order.orderDate,DateFormat.LONG)%> 使用了以下货币格式: <%= localizer.formatCurrency(customer.creditLimit) %> 使用了以下消息格式格式化翻译中的复杂 UI 文本: <%= new MessageFormat(localizer.getMessage("YOUR_ORDER_PLACED")). format(new Object[] {localizer.formatDateTime(o.orderDate, |
|
| 2. |
您需要将浏览器中的语言更改为英语。选择 Edit -> Preferences。在导航器下,选择 Languages。选择 English/United States 并单击 Move Up。然后选择 English 并单击 Move Up。然后单击 OK。
|
|
|
3. |
现在即可再次运行该应用程序。终止嵌入式 OC4J 服务器、重建 gdkshop.jpr 并运行 gdkshop.jpr。 |
|
| 4. | 选择 Submit。
|
|
| 5. | 您将看到所有日期、数字和货币现在已经基于 Oracle 的 全球化惯例格式化为一致的格式。
|
|
| 6. | 将语言更改为 Chinese 以查看日期和货币的更改方式。
|
|
| 7. | 语言现在为 Chinese。单击 Submit 按钮。
|
|
| 8. | 您应看到,所有日期和货币格式已经更改为中文。
由于 Localizer 对象依赖浏览器的语言设置,因此时间戳也将从数据库时区转换为浏览器本地化信息所定义的默认时区。该方法存在的问题是,对于具有多个时区的国家,转换后的时间戳可能未反映客户的实际本地时间。有关解决该问题的方法,请参见检测用户首选的本地化信息。 此外,已经对货币进行了更改以反映该地区的本地货币。但是,由于货币间的汇率是不断变化的,因此 localizer 无法自动重新计算新的汇率。有关解决该问题的方法,请参见 |
|
GDK 中提供了 Oracle 支持的所有地区、语言、语言排序、时区、货币和字符集等名称的翻译。可以通过调用相应的类在应用程序内直接使用这些翻译。要使用预定义的 Oracle 本地化信息翻译,请进行以下更改:
| 1. |
针对名称翻译,已对 myaccount.jsp 进行了更改。从终端窗口中,执行以下命令: cd /home/oracle/wkdir/gdk/gdkshop/public_html cp /home/oracle/wkdir/gdk/step5/myaccount.jsp myaccount.jsp Account Profile(帐户信息)中的 Territory(地区)已经更改为相应的翻译名称。 <%= localizer.getDisplayTerritory(customer.nlsTerritory)%> 该语言名称已更改为相应的已翻译语言名称。 <%= localizer.getDisplayLanguage (LocaleMapper.getOraLanguageFromShortName(customer.nlsLanguage)) %> 存储在 OE.CUSTOMER 表中的语言 ID 使用 Oracle 短语言名称。要获取完整的翻译名称,需要调用 LocaleMapper.getOraLanguageFromShortName 将其转换为完整语言名称。 |
|
|
2. |
现在即可再次运行该应用程序。终止嵌入式 OC4J 服务器、重建 gdkshop.jpr 并运行 gdkshop.jpr。 |
|
| 3. | 当显示第一个画面时,单击 Submit。请注意,Account Profile(帐户信息)页面中的语言和地区名称已翻译为浏览器中的语言集。
|
|
| 客户的帐户信息已经包含客户的语言和地区信息,该信息可用于在客户登录到应用程序后建立客户首选的本地化信息。OBE 设置脚本 obeGdkSetup.sql 创建了存储客户时区信息的表,该信息将用于将数据库内存储的系统时间转换为用户当前时区对应的时间。 |
SQL> desc ext_user_profile
Name Type
----------------------------------------- -----------------------
CUSTOMER_ID NUMBER(6)
TIMEZONE VARCHAR2(50)
REG_DATE DATE
SQL> select * from ext_user_profile;
CUSTOMER_ID TIMEZONE REG_DATE
----------- -------------------------------------------------- ---------
9000 America/Los_Angeles 30-SEP-02
9001 Europe/Madrid 05-MAR-01
9002 Asia/Shanghai 12-JUN-99
9003 Asia/Calcutta 23-NOV-00
9004 Europe/Berlin 20-NOV-02
|
执行以下操作:
| 1. |
创建了一个 DBLocaleSource,用于获得存储在 OE.CUSTOMER 表中的用户本地化信息以及 OE.EXT_USER_PROFILE 中的用户时区。从终端窗口中,执行以下命令: cd /home/oracle/wkdir/gdk/gdkshop/src/oracle/i18n/demo/obe/gdkshop/gdk cp /home/oracle/wkdir/gdk/step6/DBLocaleSource.java DBLocaleSource.java |
|
| 2. |
为注册 GDK 配置文件中的本地化信息源类,已经对 gdkapp.xml 进行了更改。从终端窗口中,执行以下命令: cd /home/oracle/wkdir/gdk/gdkshop/public_html/WEB-INF cp /home/oracle/wkdir/gdk/step6/gdkapp.xml gdkapp.xml 向 gdkapp.xml 文件中添加了一代码行(粗体)。 <locale-determine-rule> <locale-source>oracle.i18n.demo.obe.gdkshop.gdk.DBLocaleSource |
|
| 3. |
要使应用程序可以识别西班牙语和简体中文翻译文件,应将资源包包含在项目中。在 JDeveloper 中的 System-Navigator 窗口中,单击并高亮显示 gdkshop.jpr。单击左上角的 + 图标。 |
|
| 4. |
要使应用程序可以识别 DBLocaleSource.java,需要将该文件包含在 JDeveloper 项目中。选择并打开目录 home/oracle/wkdir/gdk/gdkshop/src。从“File type”下拉式列表框中选择 Java 源文件 |
|
| 5. |
单击 OK。 |
|
|
6. |
现在即可再次运行该应用程序。终止嵌入式 OC4J 服务器、重建 gdkshop.jpr 并运行 gdkshop.jpr。 |
|
| 7. |
确保选中了 Becky Landis,然后单击该按钮显示详细信息。 |
|
| 8. |
该应用程序将模拟客户登录,然后基于用户的时区、语言和地区设置显示订单历史记录信息。在本示例中,语言为英语。单击 OracleStore 徽标。 |
|
| 9. |
选择 Colin.Olin (SPAIN) 并单击该按钮显示详细信息。
|
|
| 10. |
该信息现在被翻译为西班牙语。选择 order。 注意:GDK 应用程序框架还可以使用预定义的本地化信息源(而非客户本地化信息源)检测用户配置文件表内部存储的本地化信息首选项。可以通过在 GDK 应用程序配置文件的 |
|
|
您将注意到,虽然该页中的某些文本为西班牙语,但是产品名称和说明仍为英语。 您现在将看到如何翻译产品名称和说明以及如何支持汇率。 |
|
上一步为 localizer 对象提供了客户本地化信息。使用该信息可以进一步将以用户本地语言表示的产品名称和说明纳入订单中。可以将汇率应用于订单,把美元转换为客户的本地货币。 |
SQL> desc exchange_rates;
Name Type
----------------------------------------- -----------------------
NLS_TERRITORY VARCHAR2(50)
RATES NUMBER(8,4)
SQL> select * from exchange_rates;
NLS_TERRITORY RATES
-------------------------------------------- ----------
AMERICA 1
CHINA 8.2768
INDIA 47.175
GERMANY .8705
JAPAN 117.168
SPAIN .8705
|
执行以下操作
| 1. |
从终端窗口中,执行以下命令: cd /home/oracle/wkdir/gdk/gdkshop/src/oracle/i18n/demo/obe/gdkshop cp /home/oracle/wkdir/gdk/step7/ShopAction.java ShopAction.java cp /home/oracle/wkdir/gdk/step7/MyAccountAction.java MyAccountAction.java cp /home/oracle/wkdir/gdk/step7/OrderInformationAction.java OrderInformationAction.java 对 ShopAction.java 文件的修改包括: 导入 ShopAction.java 中的全球化类 import java.util.Locale;
import oracle.i18n.servlet.Localizer;
import oracle.i18n.util.OraLocaleInfo;
import oracle.i18n.util.LocaleMapper;
import oracle.i18n.text.OraCollator;
向 getOrders 中添加一个 Localizer 参数
public static List /* Order */ getOrders(String userid, Localizer localizer) throws Exception 增强 SQL 以包含 order_total 的汇率
ps = cn.prepareStatement(
"SELECT o.order_id, o.order_date, o.order_mode, o.customer_id, "
+ "o.order_status, o.order_total * e.rates, "
+ "TO_CHAR(o.order_date, 'DD-MON-RR HH12:MI:SS AM') "
+ "FROM orders o, customers c, exchange_rates e "
+ "WHERE o.customer_id = c.customer_id AND "
+ "e.nls_territory =?AND "
+ "LOWER(c.cust_email) = LOWER(?) ORDER BY order_date DESC" );
ps.setString(1, localizer.getOraTerritory().toUpperCase(Locale.US));
ps.setString(2, userid);
向 getOrders 中添加一个 Localizer 参数 public static Order getOrder(long orderid, Localizer localizer) throws Exception
ps = cn.prepareStatement( "SELECT o.order_id, o.order_date, o.order_mode, o.customer_id, " + "o.order_status, o.order_total * e.rates, " + "TO_CHAR(o.order_date, 'DD-MON-RR HH12:MI:SS AM') " +"FROM orders o, exchange_rates e " + "WHERE o.order_id = ?AND e.nls_territory = ?" ); ps.setLong(1, orderid); ps.setString(2, localizer.getOraTerritory().toUpperCase(Locale.US)); : : public static Customer getCustomer(String userid) throws Exception 增强 SQL 以包含 credit_limit 的汇率
ps = cn.prepareStatement(
"SELECT c.cust_first_name, c.cust_last_name, c.nls_language, "
+ "c.nls_territory, c.cust_email, c.credit_limit * ex.rates, "
+ "e.reg_date, TO_CHAR(e.reg_date) "
+ "FROM customers c, ext_user_profile e, exchange_rates ex "
+ "WHERE c.customer_id = e.customer_id "
+ "AND ex.nls_territory = c.nls_territory "
+ "AND LOWER(c.cust_email) = LOWER(?)" );
public static List /* OrderItem */ getOrderItems(long orderId, Comparator
sortComp, Localizer localizer) throws Exception
更改 SQL,以获取已翻译的产品名称和说明 ResultSet rs = null; ps = cn.prepareStatement("SELECT oi.order_id, oi.product_id," + "pd.translated_name, pd.translated_description," + "oi.unit_price * e.rates, oi.quantity FROM order_items oi, " + "product_information p, product_descriptions pd,exchange_rates e " + "WHERE oi.order_id = ?AND p.product_id = oi.product_id AND " + "pd.product_id = p.product_id AND pd.language_id = ?AND " + "e.nls_territory = ?" ); ps.setLong(1, orderId); String lang = localizer.getOraShortLanguage().toUpperCase(Locale.US); String terr = localizer.getOraTerritory().toUpperCase(Locale.US); ps.setString(2, lang); ps.setString(3, terr); 对 MyAccountAction.java 文件的修改包括: 向 getOrder、getOrders 和 getOrderItems 中添加了一个新的 Localizer 参数。 List orderLst = ShopAction.getOrders(userid, localizer); 对 OrderInformationAction.java 文件的修改包括: List orderItemList = ShopAction.getOrderItems(orderId, sortDir, localizer); Order od = ShopAction.getOrder(orderId, localizer); |
|
|
2. |
现在即可再次运行该应用程序。终止嵌入式 OC4J 服务器、重建 gdkshop.jpr 并运行 gdkshop.jpr。 |
|
| 3. |
再次察看 Colin.Olin 的订单。产品名称和产品说明现在应基于该客户的语言设置显示了。所有货币值从美元转换为客户的本地货币。
|
|
在到目前为止,您所开发和运行的应用程序中还没有排序选项。您现在将学习添加语言排序功能。执行以下步骤来使用语言排序:
| 1. |
从终端窗口中,执行以下命令: cd /home/oracle/wkdir/gdk/gdkshop/src/oracle/i18n/demo/obe/gdkshop/bean cp /home/oracle/wkdir/gdk/step8/OrderItem.java OrderItem.java cd .. cp /home/oracle/wkdir/gdk/step8/ShopAction.java ShopAction.java cp /home/oracle/wkdir/gdk/step8/OrderInformationAction.java OrderInformationAction.java 对 OrderItem.java 文件的修改包括: import oracle.i18n.text.OraCollationKey;
public OraCollationKey ocolkey;
从 return s.productName.compareTo(d.productName); 更改为 return s.ocolkey.compareTo(d.ocolkey); 从 return d.productName.compareTo(s.productName); 更改为 return d.ocolkey.compareTo(s.ocolkey); 对 文件的修改包括: 导入 OraCollator import oracle.i18n.text.OraCollator; 添加一个新 URL 参数来保存语言排序的名称 public static String PARAM_SORT_NAME = "sortname"; 添加一个取得语言排序名称的方法 public static String getSortingName(HttpServletRequest request) { String sortname = request.getParameter(PARAM_SORT_NAME); if (sortname != null) { return sortname; } Localizer localizer = (Localizer)request.getAttribute("localizer"); return localizer.getLocalLinguisticSorts()[0]; } 向方法 getOrderItems 中添加一个排序名称参数 public static List /* OrderItem */ getOrderItems (long orderId, String
sortName, Comparator sortComp, Localizer localizer ) throws Exception
添加代码,为每个 OrderItem 对象生对照键
OraCollator ocol = OraCollator.getInstance(sortName);
...
odit.ocolkey = ocol.getCollationKey(odit.productName);
对 ShopAction.java 文件的修改包括: 向 getOrderItems 中添加语言排序名称: String sortName = ShopAction.getSortingName(request);
request.setAttribute("sortname", sortName);
List orderItemList = ShopAction.getOrderItems(orderId, sortName, sortDir,
localizer);
|
|
| 2. |
从终端窗口中,执行以下命令: cd /home/oracle/wkdir/gdk/gdkshop/public_html cp /home/oracle/wkdir/gdk/step8/orderinformation.jsp orderinformation.jsp 对 OrderItem.java 文件的修改包括: <script language="JavaScript" type="text/JavaScript">
<!--
function MM_jumpMenu(targ,selObj, restore, orderid){ //v3.0
eval(targ+".location='orderinformation?orderid="+ orderid +
"&sortname=" + selObj.options[selObj.selectedIndex].value+"'");
if (restore) selObj.selectedIndex=0;
}
//-->
</script>
为下拉菜单添加一个表单。
<td width="750" colspan="4"> <select name="sortings" onChange="MM_jumpMenu( 'parent',this,0,'<%= order.orderId %>','asc')"> <% String[] lingsorts = localizer.getLocalLinguisticSorts(); String sortname = (String) request.getAttribute("sortname"); for (int i=0; i<lingsorts.length; ++i) { %> <option value="<%= lingsorts[i] %>" <%=lingsorts[i].equals(sortname) ?"selected" : "" %>> <%=localizer.getDisplayLinguisticSort(lingsorts[i]) %> </option> <% } %> </select> </td> |
|
| 3. |
现在即可再次运行该应用程序。终止嵌入式 OC4J 服务器、重建 gdkshop.jpr 并运行 gdkshop.jpr。 |
|
| 4. |
在 Order Information 页面中,您现在可以看到语言排序下拉式列表框出现在产品 |
|
| 5. |
使用二进制排序的问题是,大写字母始终排在所有小写 |
|
| 6. |
选择 Espanol Multilingue 会发现,为了按传统西班牙语排序,ch 被视为单个字符 c 和 d。 |
|
要显示应用程序支持的所有本地化信息,您可能要通过执行以下操作来显示国旗和语言翻译:
| 1. |
添加位图来表示所支持的本地化信息。从终端窗口中,执行以下命令: cd /home/oracle/wkdir/gdk/gdkshop/public_html cp /home/oracle/wkdir/gdk/step9/US.gif US.gif cp /home/oracle/wkdir/gdk/step9/ES.gif ES.gif cp /home/oracle/wkdir/gdk/step9/CN.gif CN.gif cp /home/oracle/wkdir/gdk/step9/IN.gif IN.gif cp /home/oracle/wkdir/gdk/step9/index.jsp index.jsp 对 index.jsp 文件的修改包括: <% Locale[] locales = localizer.getSupportedLocales(); for (int i=0; i<locales.length; ++i) { OraLocaleInfo oloc = OraLocaleInfo.getInstance(locales[i]); String jt = LocaleMapper.getJavaTerrFromOraTerr(oloc.getTerritory()); %> <td><div align="center"><img src="<%= jt %>.gif" width="25" height="18"><br> <font size="-2"> <%= OraDisplayLocaleInfo.getInstance(locales[i]).getDisplayLanguage(locales[i]) %> </font></div> </td> <% } %> |
|
| 2. |
要使应用程序可以识别国旗,需要将图像文件包括在项目中。在 JDeveloper 的 System-Navigator 窗口中,单击并高亮显示 gdkshop.jpr。单击左上角的 + 图标。 |
|
| 3. |
要使应用程序可以识别国旗,需要将文件包括在 JDeveloper 项目中。选择并打开目录 home/oracle/wkdir/gdk/gdkshop/public_html。从“File type”下拉式列表框中选择 Image。单击 Open。 |
|
| 4. |
单击 OK。 |
|
|
5. |
现在即可再次运行该应用程序。终止嵌入式 OC4J 服务器、重建 gdkshop.jpr 并运行 gdkshop.jpr。 |
|
| 6. |
您应看到 Oracle 商店所支持的 4 个本地化信息。 |
|
| 7. |
如果选择德国客户 Sarah,应用程序将把英语“en”作为用户本地化信息的默认设置。 |
|
由于 Oracle 商店应用程序现在已经使用 GDK 进行了彻底全球化,因此添加对新本地化信息的支持非常简单。只需使用新语言的翻译创建一个翻译文件(对应于新本地化信息的新国旗和新商店徽标),然后更新 GDK 应用程序配置文件中的本地化信息项即可。执行以下操作:
| 1. |
从终端窗口中,执行以下命令: cd /home/oracle/wkdir/gdk/gdkshop/src/oracle/i18n/demo/obe/gdkshop/gdk cp /home/oracle/wkdir/gdk/stepA/Translations_de.java Translations_de.java cd /home/oracle/wkdir/gdk/gdkshop/public_html cp /home/oracle/wkdir/gdk/stepA/DE.gif DE.gif mkdir de cd de cp /home/oracle/wkdir/gdk/stepA/de/store_logo_new.gif store_logo_new.gif cd /home/oracle/wkdir/gdk/gdkshop/public_html/WEB-INF cp /home/oracle/wkdir/gdk/stepA/gdkapp.xml gdkapp.xml 对 gdkapp.xml 文件的修改包括: <application-locales> <locale default="yes">en</locale> <locale>es</locale> <locale>zh_CN</locale> <locale>en_IN</locale> <locale>de</locale> </application-locales> |
|
| 2. |
要使应用程序可以识别国旗图像和德语资源包,需要将它们包括在项目中。在 JDeveloper 的 System-Navigator 窗口中,单击并高亮显示 gdkshop.jpr。单击左上角的 + 图标。 |
|
| 3. |
要使应用程序可以识别国旗,需要将文件包括在 JDeveloper 目中。按住 Shift,选择 /home/oracle/wkdir/gdk/gdkshop/public_html 和 /home/oracle/wkdir/gdk/gdkshop/src。然后单击 Open。 |
|
| 4. |
单击 OK。 |
|
|
5. |
现在即可再次运行该应用程序。终止嵌入式 OC4J 服务器、重建 gdkshop.jpr 并运行 gdkshop.jpr。 |
|
| 6. |
您应看到 Oracle 商店现在所支持的 5 个本地化信息。如果此时选择 |
|
Oracle 商店应用程序包含一个反馈页面,使客户能够撰写反馈并将反馈提交给 Oracle 商店。然而,如果事先不知道撰写反馈所用的语言,则该应用程序无法将反馈提交给最适宜的 Oracle 商店国际办事处进行处理。执行以下步骤,将语言检测添加到应用程序:
| 1. |
从终端窗口中,执行以下命令: cd /home/oracle/wkdir/gdk/gdkshop/public_html 对 feedback.jsp 文件的修改包括: <%@ page import="oracle.i18n.lcsd.*" %> 在获取内容后检测内容语言: <%
// detect
String fb_content = request.getParameter("fb_content");
String olang = null;
if (fb_content != null && fb_content.length() > 0)
{
LCSDetector led = new LCSDetector();
led.detect(fb_content);
LCSDResultSet ledrs = led.getResult();
olang = ledrs.getISOLanguage();
}
Localizer localizer = ServletHelper.getLocalizerInstance(request);
%>
显示结果: <% if (olang != null){%%>
<p>
<%= localizer.getMessage("YOUR_MESSAGE") %%>
(<%= localizer.getDisplayLanguage(olang)%%>)
</p%>
<%}%>
|
|
|
2. |
现在即可再次运行该应用程序。终止嵌入式 OC4J 服务器、重建 gdkshop.jpr 并运行 gdkshop.jpr。 |
|
| 3. |
单击页面右上角的 Feedback 链接。 |
|
| 4. |
在文本框中键入消息,并单击 Submit。 |
|
| 5. |
您将看到结果。 |
|
将光标置于该图标上,以隐藏所有屏幕截图。