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

时间:2009-05-21 23:50:06

标签: oracle internationalization cgi environment-variables nls

在向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软件包,这完全是我所追求的:

Is there an easy way to convert HTTP_ACCEPT_LANGUAGE to Oracle NLS_LANG settings?

2 个答案:

答案 0 :(得分:1)

当然,如果你正确地解决问题并且最初没有雄心勃勃,那就不是太难了。

基本上,您需要两个函数:一个用于解析HTTP_ACCEPT_LANGUAGE并生成语言代码,另一个用于生成相应的set命令。

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

对于另一半,或多或少相同,生成set命令,但这本身就很简单;它实际上只是一个查找功能,但根据提供给它的内容可能会更复杂一些。

在这样的事情上真正成就或破坏你的编程经验的是你的单元测试。这是单元测试和测试驱动开发的理想问题。单元测试将确保在您更改内容时,旧功能可以继续工作,并且可以更轻松地添加新功能并修复错误,因为您只需添加另一个测试,您就可以从那时开始指导您。 (如果你发现在某些方面你已经非常错误,你也会发现更容易完全重写其中一个功能,因为你可以很容易地确认新版本没有破坏任何东西。)

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

答案 1 :(得分: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