代码之家  ›  专栏  ›  技术社区  ›  Nick Pierpoint

是否有一种简单的方法可以将HTTP接受语言转换为Oracle NLS语言设置?

  •  1
  • Nick Pierpoint  · 技术社区  · 15 年前

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

    例如:

    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详细答案开始

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

    我已经在手动分析HTTP接受语言变量的过程中,正如他的答案中所指出的那样,这里有一些复杂的微妙方面。它 感觉 就像以前做过很多次一样。当我写越来越多的代码时,我有一种“我在重塑方向盘”的感觉。:)

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

    编辑-偶然发现了答案

    在寻找其他东西的时候,我偶然发现了UTL-I18N包,它正是我想要的:

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

    2 回复  |  直到 14 年前
        1
  •  1
  •   cjs    15 年前

    当然,如果你能很好地解决问题,一开始就不要雄心勃勃,这并不难。

    本质上,您需要两个函数:一个用于解析 HTTP_ACCEPT_LANGUAGE 并生成一个语言代码,其中一个代码接受并生成适当的 set 命令。

    前者可以变得相当复杂;如果只给你‘en’,你可能想生成‘en-us’,你需要处理在没有完全匹配的情况下选择多个选项中的一个,你需要处理格式错误的头值,等等。不要试图一次性解决这一切:先做一些非常简单的事情,然后再进行扩展。

    另一半的情况也差不多,产生了 设置 命令,但这本身非常简单;它实际上只是一个查找函数,尽管根据提供给它的内容,它可能会变得更复杂一些。

    在这种情况下,真正使您的编程经验成败的是您的单元测试。这是单元测试和测试驱动开发的理想问题。单元测试将确保当您改变事情时,旧的功能将继续工作,并使添加新功能和修复bug变得更容易,因为您只需添加另一个测试,就可以从这一点开始指导您。(如果您发现在某个时刻出现了严重错误,您也会发现对其中一个函数进行完全重写更容易,因为您可以轻松地确认新版本没有破坏任何东西。)

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

        2
  •  1
  •   Nick Pierpoint    14 年前

    最后偶然发现了答案。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