1

在向 Oracle Web 应用程序(基于 mod_plsql 构建)添加国际化功能时,我想解释 HTTP_ACCEPT_LANGUAGE 参数并使用它来设置 Oracle 会话中的各种 NLS_* 设置。

例如:

HTTP_ACCEPT_LANGUAGE=de

alter session set nls_territory=germany;
alter session set nls_lang=...

但是,我想你可以得到更复杂的东西......

HTTP_ACCEPT_LANGUAGE=en-us,en;q=0.5

人们以前是如何处理这种事情的?

编辑 - 以下是 Curt 的详细回答

感谢Curt清晰详细的回复。不过,我并没有真正说清楚,因为我真的在问是否有任何现有的 Oracle 小部件可以处理这个问题。

我已经在手动解析 HTTP_ACCEPT_LANGUAGE 变量的道路上,并且 - 正如 Curt 在他的回答中指出的那样 - 有一些微妙的复杂领域。感觉就像以前必须做过很多次的事情。随着我编写越来越多的代码,我有一种下沉的“我在重新发明轮子”的感觉。:)

必须有一个现有的 Oracle 方法来解决这个问题——可能在 iAS 中?

编辑 - 偶然发现了答案

在寻找其他东西时,我偶然发现了 UTL_I18N 包,这正是我所追求的:

有没有一种简单的方法可以将 HTTP_ACCEPT_LANGUAGE 转换为 Oracle NLS_LANG 设置?

4

2 回答 2

1

当然,如果你正确地解决问题并且一开始不要雄心勃勃,这并不太难。

本质上,您需要两个功能:一个用于解析HTTP_ACCEPT_LANGUAGE并生成语言代码,另一个用于获取并生成适当的set命令。

前者可以变得非常复杂;如果你只给出'en',你可能想要生成'en-us',当没有完美匹配时,你需要处理选择多个选项之一,你需要处理格式错误的标题值,等等。不要试图一次解决所有问题:先做一些非常简单的事情,然后再扩展它。

生成命令的另一半或多或少也是如此set,但这本身就很简单;它实际上只是一个查找函数,尽管根据提供给它的内容,它可能会变得更复杂一些。

真正会成就或破坏您在此类事情上的编程体验的是您的单元测试。这是单元测试和测试驱动开发的理想问题。单元测试将确保当您更改内容时,旧功能继续工作,并更容易添加新功能和修复错误,因为您只需添加另一个测试,您就可以从那时起指导您。(如果您发现自己在某些时候出现了严重错误,您还会发现完全重写其中一个功能会更容易,因为您可以轻松确认新版本没有破坏任何东西。)

你如何在你的环境中进行单元测试可能有点超出这个问题的范围,但让我添加一些提示。首先,如果您的环境有可用的单元测试框架(“pl-sql-unit?”),那就太好了。如果没有,请不要惊慌。您不需要任何复杂的东西:只需要一组输入和预期输出,以及通过函数运行它们的方法,或者说“一切正常!” 或显示任何不正确的结果。您可能可以编写一个简单的 PL/SQL 函数,从表中读取输入和预期输出并为您执行此操作。

于 2009-05-22T01:30:30.973 回答
1

终于偶然发现了答案。Oracle 包 UTL_I18N 包含从浏览器语言代码映射到 Oracle NLS 设置的函数:

utl_i18n.map_language_from_iso;
utl_i18n.map_territory_from_iso;

该映射似乎不能很好地处理多语言设置,例如 en-us,en;q=0.5,但只要您只使用前 5 个字符,这些功能似乎就可以正常工作。

HTTP_ACCEPT_LANGUAGE: ar-lb,en-gb;q=0.5
v_language: 
v_territory: 

HTTP_ACCEPT_LANGUAGE: ar-lb
v_language: ARABIC
v_territory: LEBANON
于 2009-11-30T15:01:41.217 回答