2009-05-21 10 views
1

Beim Hinzufügen von Internationalisierungsfunktionen zu einer Oracle-Webanwendung (auf mod_plsql aufbauen) möchte ich den Parameter HTTP_ACCEPT_LANGUAGE interpretieren und damit verschiedene NLS_ * -Einstellungen in der Oracle-Sitzung festlegen.Gibt es eine einfache Möglichkeit, HTTP_ACCEPT_LANGUAGE in Oracle NLS_LANG-Einstellungen zu konvertieren?

Zum Beispiel:

HTTP_ACCEPT_LANGUAGE=de 

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

Sie könnten jedoch etwas komplizierter ich nehme an ...

HTTP_ACCEPT_LANGUAGE=en-us,en;q=0.5 

Wie Leute diese Art der Sache vor in Angriff genommen haben?

EDIT - im Anschluss an Curts ausführliche Antwort unter

Vielen Dank für die klare und ausführliche Antwort Curt. Ich habe mich jedoch nicht wirklich klar gemacht, da ich wirklich gefragt habe, ob es irgendwelche Oracle-Widgets gibt, die das handhaben.

Ich bin schon auf dem Weg der manuellen Analyse der Variable HTTP_ACCEPT_LANGUAGE und - wie Curt in seiner Antwort angegeben hat - gibt es ein paar subtile Bereiche der Komplexität. Es fühlt sich wie etwas an, das viele Male vorher getan worden sein muss. Als ich mehr und mehr Code schrieb, hatte ich das Gefühl, "ich erfinde das Rad neu zu erfinden". :)

Es muss eine bestehende Oracle-Ansatz für diese - wahrscheinlich etwas in iAS ??

EDIT - über die Antwort gestolpert sonst

Während der Suche nach etwas, stolperte ich über das UTL_I18N-Paket, das genau ich nicht wham bin nach:

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

Antwort

1

Schließlich stolperte über die Antwort. Das Oracle-Paket UTL_I18N enthält Funktionen aus dem Browser-Sprachcodes zu Oracle NLS Einstellungen zur Karte:

utl_i18n.map_language_from_iso; 
utl_i18n.map_territory_from_iso; 

Die Abbildung scheint nicht sehr gut mit den Einstellungen in mehreren Sprachen zu bewältigen, beispielsweise en-de, en; q = 0.5, aber solange du nur die ersten 5 Zeichen verwendest, scheinen die Funktionen in Ordnung zu sein.

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

Sicher, und es ist nicht zu schwer, wenn man das Problem richtig auflöst und am Anfang nicht zu ehrgeizig wird.

Sie benötigen im Wesentlichen zwei Funktionen: eine, um die HTTP_ACCEPT_LANGUAGE zu analysieren und einen Sprachencode zu erzeugen, und einen, um das zu nehmen und die passenden set Befehle zu erzeugen.

Ersterer kann ziemlich anspruchsvoll werden; Wenn du nur 'en' angegeben hast, möchtest du wahrscheinlich 'en-us' generieren, du musst dich mit einer von mehreren Möglichkeiten beschäftigen, wenn nichts perfekt passt, du musst mit falsch formatierten Header-Werten umgehen und so weiter. Versuchen Sie nicht, alles auf einmal anzugehen: Tun Sie zunächst etwas sehr Einfaches und erweitern Sie es später.

Das gleiche mehr oder weniger geht für die andere Hälfte davon, Generierung der set Befehle, aber das ist ziemlich einfach an und für sich; Es ist wirklich nur eine Lookup-Funktion, obwohl sie je nach dem, was ihr zur Verfügung gestellt wird, etwas ausgefeilter werden kann.

Was wirklich Ihre Programmiererfahrung auf so etwas macht oder bricht, sind Ihre Komponententests. Dies ist ein ideales Problem für Komponententests und testgetriebene Entwicklung. Komponententests sorgen dafür, dass alte Funktionen funktionieren, wenn neue Dinge geändert werden, und es wird einfacher, neue Funktionen hinzuzufügen und Fehler zu beheben, da Sie einfach einen weiteren Test hinzufügen und Sie von diesem Punkt an weiterleiten können.(Sie werden es auch leichter finden, eine der Funktionen komplett neu zu schreiben, wenn Sie feststellen, dass Sie irgendwann einmal schrecklich falsch gelaufen sind, weil Sie leicht bestätigen können, dass die neue Version nichts kaputt macht.)

Wie Sie Komponententests in Ihrer Umgebung durchführen, ist wahrscheinlich etwas über den Rahmen dieser Frage hinaus, aber lassen Sie mich ein paar Hinweise hinzufügen. Erstens, wenn es ein Unit-Test-Framework ("pl-sql-unit?") Für Ihre Umgebung gibt, ist das großartig. Wenn nicht, keine Panik. Sie brauchen nichts anspruchsvolles: nur eine Reihe von Eingaben und erwarteten Ausgaben und eine Möglichkeit, sie durch die Funktion zu führen und entweder "alles OK" zu sagen. oder zeigen Sie falsche Ergebnisse an. Sie können wahrscheinlich eine einzelne, einfache PL/SQL-Funktion schreiben, die die Eingaben und erwarteten Ausgaben aus einer Tabelle liest und dies für Sie erledigt.

+0

Danke für die klare und detaillierte Antwort Curt. Ich habe mich jedoch nicht wirklich klar gemacht, da ich wirklich gefragt habe, ob es irgendwelche Oracle-Widgets gibt, die das handhaben. Ich bin schon dabei, die Variable HTTP_ACCEPT_LANGUAGE manuell zu parsen und - wie Sie in Ihrer Antwort angedeutet haben - wurde es immer komplizierter. Es fühlte sich an wie etwas, das man schon oft getan haben muss. Ich hatte das Gefühl, "ich erfinde das Rad neu zu erfinden". :) –

+0

:-(. –