【问题标题】:Is there an easy way to convert HTTP_ACCEPT_LANGUAGE to Oracle NLS_LANG settings?有没有一种简单的方法可以将 HTTP_ACCEPT_LANGUAGE 转换为 Oracle NLS_LANG 设置?
【发布时间】:2009-05-21 23:50:06
【问题描述】:

在向 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?

【问题讨论】:

    标签: oracle internationalization cgi environment-variables nls


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 感谢Curt清晰详细的回复。不过,我并没有真正说清楚,因为我真的在问是否有任何现有的 Oracle 小部件可以处理这个问题。我已经在手动解析 HTTP_ACCEPT_LANGUAGE 变量的道路上,并且 - 正如您在回答中指出的那样 - 它越来越多地参与其中。它感觉就像以前一定做过很多次的事情。我有一种下沉的“我在重新发明轮子”的感觉。 :)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-12-25
      • 1970-01-01
      • 2022-09-24
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      • 2012-02-25
      • 1970-01-01
      相关资源
      最近更新 更多