使用全球化开发工具包 (GDK) 构建全球化应用程序

目的

本课程使用 Oracle 全球化开发工具包 (GDK) 中的 API,演示如何将现有的英语单语种 J2EE 应用程序移植到全球化多语种应用程序。该应用程序包含一个指向基于 oe 示例模式 (Schema) 的简单客户订单检索应用程序(Oracle 商店)的 JSP 前端,并包含使用 GDK 维护常规 Java 对象的 servlet。

主题

本模块将讨论以下主题:

 概述
 前提条件
 了解 Oracle 商店应用程序

安装 Oracle 商店应用程序

 运行并观察当前的英语单语种 Oracle 商店应用程序
 配置和设置 GDK 应用程序
 添加已翻译的商店徽标
 集成已翻译的 UI 文本

使用 Oracle Formatter 类格式化日期和数字

 使用预定义的 Oracle 本地化信息翻译
 检测用户首选的本地化信息
 实现对汇率、已翻译的产品名称和说明的支持
 使用 Oracle 语言排序
 显示国旗和可用语言翻译
 添加对新本地化信息(德语)的支持
 集成语言检测技术

查看屏幕截图

 将光标置于该图标上,以显示所有屏幕截图。您也可以将光标置于每个图标上,只查看与之关联的屏幕截图。

概述

返回主题列表

针对 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.

完成 在 Linux 上安装 Oracle 数据库 10g 课程

3.

完成 在 Linux 上安装 Oracle9i JDeveloper 课程。

4.

gdk.zip 下载并解压到工作目录(即 /home/oracle/wkdir)

了解 Oracle 商店应用程序

返回主题列表

该应用程序包含以下文件:

Java 源文件

src/oracle/i18n/demo/obe/gdkshop
 AuthFilter.java 认证过滤器
 MyAccountAction.java 我的帐户 servlet
 OrderInformationAction.java 订单信息 servlet
 ShopAction.java 商店操作
src/oracle/i18n/demo/obe/gdkshop/bean
 Customer.java 客户 bean
 Order.java 订单 bean
 OrderItem.java 订单项 bean
src/oracle/i18n/demo/obe/gdkshop/gdk
 DBLocaleSource.java 数据库中用户模式的本地化信息源
 Translations.java 英语 UI 翻译(将在本课程中加)
 Translations_de.java 德语 UI 翻译(将在本课程中添加)
 Translations_es.java 西班牙语 UI 翻译(将在本课程中添加)
 Translations _zh_cn.java 简体中文 UI 翻译(将在本课程中添加)

JSP 和静态内容

public_html/
 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 印度国旗图像(将在本课程中添加)
public_html/de/
 store_logo_new.gif 德语 Oracle 商店徽标(将在本课程中添加)
public_html/es/
 store_logo_new.gif 西班牙语 Oracle 商店徽标(将在本课程中添加)
public_html/zh_cn/
 store_logo_new.gif 简体中文 Oracle 商店徽标(将在本课程中添加)
public_html/WEB-INF/
 web.xml Web 部署描述符
 gdkapp.xml GDK/OGS 应用程序配置文件(将在本课程中添加)
public_html/WEB-INF/lib/
 orai18n-lcsd.jar GDK LCSD(语言和字符集检测)扩展(将在本课程中添加
 orai18n.jar GDK 主库(将在本课程中添加)

安装 Oracle 商店应用程序

返回主题列表

为使 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 的脚本,用于卸载为本课程创建的所有对象。

将鼠标移动到该图标上以查看图像

运行并观察当前的英语单语种 Oracle 商店应用程序

返回主题列表

您将把该应用程序作为英语单语种应用程序运行并观察它的行为。然后,您将更改其源文件,把该应用程序改为多语种应用程序。请注意,修改后的文件已经提供,您不必更改源文件。但是,在此课程中将明示对文件的更改。

执行以下操作,运行单语种应用程序:

1.

启动 Oracle9 i JDeveloper。

2.

将 Mozilla 设置为 Jdeveloper 中的默认浏览器。
Tools --> Preferences --> Web Browser/Proxy。在 Browser Command Line 域中输入 /usr/bin/mozilla -remote openURL(${URL}) || /usr/bin/mozilla ${URL}

将鼠标移动到该图标上以查看图像

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.

与上一画面相似,包括产品名称和说明在内的所有文本均以英文显示;货币值使用基于美元和美国借方符号的美国货币惯例格式化。订单项基于英文产品名称的二进制值进行排序。单击 商店徽标将返回客户登录页面。

将鼠标移动到该图标上以查看图像

配置和设置 GDK 应用程序

返回主题列表

此时,您将把单语种应用程序移植到全球化多语种 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。单击 PathEdit 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"?>
                              
<gdkapp
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="gdkapp.xsd">
<!-- Application Configurations -->
<page-charset default="yes">UTF-8</page-charset>
<application-locales>
<locale default="yes">en</locale>
<locale>es</locale>
<locale>zh_CN</locale>
<locale>en_IN</locale>
</application-locales>
<locale-determine-rule>
<locale-source>oracle.i18n.servlet.localesource.HttpAcceptLanguage</locale-source>
</locale-determine-rule>
<!-- URL rewriting rule -->
<url-rewrite-rule fallback="yes">
<pattern>(.*)/([^/]+)$</pattern>
<result>$1/$A/$2</result>
</url-rewrite-rule>
</gdkapp>

这是 GDK 应用程序配置文件,它控制 Oracle 商店应用程序的全球化行为。使用 GDK 的每个 J2EE 应用程序都需要一个应用程序配置文件。

 英语 (en) 是默认的应用程序本地化信息,同时还支持西班牙语 (es)、中国的简体中文
(zh_CN) 和印度的英语 (en_IN)
 使用浏览器语言首选项(HTTP Accept-Language 头部)
确定用户本地化信息
 重新编写 URL 以基于用户本地化信息重定向到已翻译的内容

添加已翻译的商店徽标

返回主题列表

每种语言可以有不同的徽标。您现在可以添加商店徽标。执行以下操作:

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 页面上均如此显示。

将鼠标移动到该图标上以查看图像

集成已翻译的 UI 文本

返回主题列表

为了将应用程序翻译到不同语言,应将所有硬编码的文本字符串导出到资源文件,随后即可将这些文件交付翻译。资源包是 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;
                                
import java.util.ListResourceBundle;
public class Translations_es extends ListResourceBundle
{
static final Object[][] contents =
{
{ "RETURNING_CUSTOMERS", "Clientes que vuelven..."},
{ "SUBMIT", "Env\u00ede" },
{ "MY_ACCOUNT", "Mi cuenta " },
{ "ACCOUNT_PROFILE", "Infomaci\u00f3n de cuenta" },
{ "FIRST_NAME", "Nombre" },
{ "LAST_NAME", "Apellido" },
{ "EMAIL", "Correo electr\u00f3nico" },
{ "LANGUAGE", "Idioma" },
{ "TERRITORY", "Territorio" },
{ "REGISTERED_DATE", "Fecha de registraci\u00f3n" },
{ "CREDIT_LIMIT", "Limite de credito" },
{ "ORDER_TRACKING_AND_HISTORY", "Seguimiento del pedido e historial" },
{ "GRAND_TOTAL", "El gran total" },
{ "TOTAL", "Total" },
{ "DISCOUNT", "Descuento" },
{ "PRODUCT_NAME", "Nombre del producto" },
{ "PRODUCT_DESCRIPTION", "Descripci\u00f3n del producto" },
{ "ITEM_NUMBER", "N\u00famero de parte" },
{ "QUANTITY", "Cantidad" },
{ "SUB_TOTAL", "Subtotal" },
{ "ORDER_INFORMATION", "Informaci\u00f3n de orden" },
{ "ORDER_NUMBER", "N\u00famero de orden" },
{ "ORDER_DATE", "Fecha de orden" },
{ "YOUR_ORDER_PLACED", "Su orden procesada {0}" },
{ "FEEDBACK", "Comentarios" },
{ "YOUR_MESSAGE", "Su comentario ha sido enviado" }
};
public Object[][] getContents()
{
return contents;
}
}

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;
                                
import oracle.i18n.servlet.Localizer; Localizer localizer = ServletHelper.getLocalizerInstance(request); request.setAttribute("localizer",localizer);

5.

要使应用程序可以识别西班牙语和简体中文翻译文件,应将资源包包含在项目中。在 JDeveloper 中的 System-Navigator 窗口中,单击并高亮显示 gdkshop.jpr。单击左上角的 + 图标。

6.

选择并打开目录 home/oracle/wkdir/gdk/gdkshop/src 。从“File type”下拉式列表框中选择 Java 源文件
(*.java)。单击 Open

将鼠标移动到该图标上以查看图像

7.

单击 OK

将鼠标移动到该图标上以查看图像

8.

现在即可再次运行该应用程序。 终止嵌入式 OC4J 服务器重建 gdkshop.jpr运行 gdkshop.jpr

9.

您将看到该窗口中的域和按钮已经翻译为西班牙语。单击 Envie 按钮。

将鼠标移动到该图标上以查看图像

10.

您将看到各域已被翻译为西班牙语。

将鼠标移动到该图标上以查看图像

使用 Oracle Formatter 类格式化日期和数字

返回主题列表

现在,您可以格式化日期和数字以查看它对应用程序的影响。执行以下操作:

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,
                                  
DateFormat.LONG)}) %>

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 无法自动重新计算新的汇率。有关解决该问题的方法,请参见
实现对汇率、已翻译的产品名称和说明的支持

使用预定义的 Oracle 本地化信息翻译

返回主题列表

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
                                  
</locale-source>
<locale-source>oracle.i18n.servlet.localesource.HttpAcceptLanguage
</locale-source> </locale-determine-rule>

3.

要使应用程序可以识别西班牙语和简体中文翻译文件,应将资源包包含在项目中。在 JDeveloper 中的 System-Navigator 窗口中,单击并高亮显示 gdkshop.jpr。单击左上角的 + 图标。

4.

要使应用程序可以识别 DBLocaleSource.java,需要将该文件包含在 JDeveloper 项目中。选择并打开目录 home/oracle/wkdir/gdk/gdkshop/src 。从“File type”下拉式列表框中选择 Java 源文件
(*.java)。单击 Open

将鼠标移动到该图标上以查看图像

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/OrderInformation
                                  
Action.java 
OrderInformation
                                  
Action.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
                                
                              
                            


增强 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
                                  
, 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(?)" );
                                
                              
                            


向 getOrderItems 中添加一个 Localizer 参数

                               
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 的订单。产品名称和产品说明现在应基于该客户的语言设置显示了。所有货币值从美元转换为客户的本地货币。

将鼠标移动到该图标上以查看图像

使用 Oracle 语言排序

返回主题列表

在到目前为止,您所开发和运行的应用程序中还没有排序选项。您现在将学习添加语言排序功能。执行以下步骤来使用语言排序:

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/Shop
                                  
Action.java Shop
                                  
Action.java
cp /home/oracle/wkdir/gdk/step8/OrderInformation
                                  
Action.java 
OrderInformation
                                  
Action.java
                                
                              
                            

OrderItem.java 文件的修改包括 :

导入 OraCollationKey

                               
                                 
import oracle.i18n.text.OraCollationKey;
                              
                            


向 OrderItem 中添加一个 OraCollationKey 类型的变量

                               
                                 
public OraCollationKey ocolkey;
                              
                            


更改 Comparator 对象以比较对照键 (collation key) 而非产品名称

                               
       
                                
                                                            
                              
                                 
从 return s.productName.compareTo(d.productName);
更改为  
                                  
return s.ocolkey.compareTo(d.ocolkey);
       
从 return d.productName.compareTo(s.productName);
更改为 return d.ocolkey.compareTo(s.ocolkey);
                                
                              
                              
                                 
      
                                      
                            

ShopAction.java 文件的修改包括 :

导入 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 文件的修改包括 :

添加一个 JavaScript,用于当您选择一个下拉菜单时提交语言排序名称。

  
                              
<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 页面中,您现在可以看到语言排序下拉式列表框出现在产品
名称之上,它允许客户从
与其所选语言相匹配的 Oracle 语言排序列表中选择排序方式来对记录进行重新排序。从列表中选择 Binary Sort

将鼠标移动到该图标上以查看图像

5.

使用二进制排序的问题是,大写字母始终排在所有小写
字母之前。选择 OracleStore 徽标并选择 Colin.Olin (Spanish) 以查看西班牙语的排序选项。

将鼠标移动到该图标上以查看图像

6.

选择 Espanol Multilingue 会发现,为了按传统西班牙语排序, ch 被视为单个字符 cd

将鼠标移动到该图标上以查看图像

显示国旗和可用语言翻译

返回主题列表

要显示应用程序支持的所有本地化信息,您可能要通过执行以下操作来显示国旗和语言翻译:

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 文件的修改包括:

显示 gdkapp.xml 中定义的所支持语言的名称

                               
                                 
                                   
<%
                                
                                
                                   
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 文件的修改包括:

显示 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 个本地化信息。如果此时选择
Sarah,她的所有订单信息将被翻译,而且对本地化信息敏感的
信息现在将按德语惯例显示。

将鼠标移动到该图标上以查看图像

将鼠标移动到该图标上以查看图像

将鼠标移动到该图标上以查看图像

集成语言检测技术

返回主题列表

Oracle 商店应用程序包含一个反馈页面,使客户能够撰写反馈并将反馈提交给 Oracle 商店。然而,如果事先不知道撰写反馈所用的语言,则该应用程序无法将反馈提交给最适宜的 Oracle 商店国际办事处进行处理。执行以下步骤,将语言检测添加到应用程序:

1.

从终端窗口中,执行以下命令:

                               
                                 
cd /home/oracle/wkdir/gdk/gdkshop/public_html
                                  
cp /home/oracle/wkdir/gdk/stepB/feedback.jsp feedback.jsp

feedback.jsp 文件的修改包括:

导入 LCSD 包:

                               
<%@ 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") %%>
&nbsp;
(<%= localizer.getDisplayLanguage(olang)%%>)
</p%>
Left Curve
热门下载
Right Curve
Left Curve
更多融合中间件下载
Right Curve