2009-05-21 87 views
1

將國際化功能添加到Oracle Web應用程序(基於mod_plsql構建)時,我想解釋HTTP_ACCEPT_LANGUAGE參數並使用它在Oracle會話中設置各種NLS_ *設置。有沒有簡單的方法將HTTP_ACCEPT_LANGUAGE轉換爲Oracle NLS_LANG設置?

例如:

HTTP_ACCEPT_LANGUAGE=de 

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

但是,你可以得到更復雜的東西,我想......

HTTP_ACCEPT_LANGUAGE=en-us,en;q=0.5 

怎麼有鄉親解決這種事情之前?

編輯 - 從簡略的詳細回答以下下面

感謝明確和詳細的答覆簡略。但我並沒有真正清楚自己,因爲我確實在問是否有任何現有的Oracle小部件可以處理這個問題。

我已經下來的手工解析HTTP_ACCEPT_LANGUAGE變量和道路 - 因爲柯特在他的答覆中指出 - 有複雜的一些細微的地方。它感覺就像之前必須做過很多次的事情。隨着我寫越來越多的代碼,我沉浸在「我正在重塑車輪」的感覺中。 :)

必須有這個現有的Oracle方法 - 可能是一些國際會計準則?

編輯 - 偶然發現的答案

雖然尋找別的東西,我整個UTL_I18N包,這不正是威猛跌跌撞撞我後:

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

回答

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 
1

當然,和如果你正確分解問題並且一開始就沒有雄心壯志,這並不難。

實際上,您需要兩個功能:一個解析HTTP_ACCEPT_LANGUAGE並生成語言代碼,一個解析並生成相應的set命令。

前者可以變得相當複雜;如果只給出'en',你可能想要生成'en-us',當沒有完全匹配時,你需要處理選擇多個選擇中的一個,你需要處理格式錯誤的頭部值,等等。不要試圖一次性解決這個問題:首先做一些非常簡單的事情,然後再延長。

同樣或多或少無二它的另一半,產生set命令,但是這是在反正本身非常簡單;它實際上只是一個查找函數,但它可能會更復雜一些,具體取決於提供給它的內容。

什麼能令或折斷這樣的事情你的編程經驗是你的單元測試。這是單元測試和測試驅動開發的理想問題。單元測試將確保當你改變東西時,舊的功能可以繼續工作,並且使添加新功能和修復錯誤變得更加容易,因爲你只需添加另一個測試,並從那一點開始引導你。(如果你發現你在某些時候出現了嚴重的錯誤,你也會發現更容易完成其中一個功能的重寫,因爲你可以很容易地確認新版本沒有破壞任何東西。)

如何在你的環境中進行單元測試可能超出了這個問題的範圍,但讓我添加一些提示。首先,如果有一個適用於您的環境的單元測試框架(「pl-sql-unit?」),那很好。如果沒有,請不要驚慌。你不需要任何複雜的東西:只需要一組輸入和預期輸出,以及通過函數運行它們的方法,並且可以說「一切OK!」或顯示任何不正確的結果。您可以編寫一個簡單的PL/SQL函數來讀取表中的輸入和期望輸出,併爲您執行此操作。

+0

感謝明確和詳細的答覆簡略。但我並沒有真正清楚自己,因爲我確實在問是否有任何現有的Oracle小部件可以處理這個問題。我已經下來的手工解析HTTP_ACCEPT_LANGUAGE變量和道路 - 正如你在答覆中指出 - 它更多地參與。它感覺*就像之前必須做過很多次的事情。我有這樣的那顆「我重新發明輪子」的感覺。 :) – 2009-05-22 08:33:00

相關問題