Domanda

Quando si aggiungono funzionalità di internazionalizzazione a un'applicazione Web Oracle (basata su mod_plsql), vorrei interpretare il parametro HTTP_ACCEPT_LANGUAGE e utilizzarlo per impostare varie impostazioni NLS_* nella sessione Oracle.

Per esempio:

HTTP_ACCEPT_LANGUAGE=de

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

Tuttavia, potresti ottenere qualcosa di più complicato, suppongo...

HTTP_ACCEPT_LANGUAGE=en-us,en;q=0.5

In che modo le persone hanno affrontato questo genere di cose prima?

EDIT: in seguito alla risposta dettagliata di Curt di seguito

Grazie per la risposta chiara e dettagliata Curt.Tuttavia, non sono stato molto chiaro, poiché stavo davvero chiedendo se esistessero widget Oracle esistenti che gestissero questo problema.

Sono già sulla strada dell'analisi manuale della variabile HTTP_ACCEPT_LANGUAGE e, come indicato da Curt nella sua risposta, ci sono alcune sottili aree di complessità.Esso sente come qualcosa che deve essere stato fatto molte volte prima.Mentre scrivevo sempre più codice, provavo quella sensazione di affondamento "Sto reinventando la ruota".:)

Deve esistere un approccio Oracle esistente per questo - probabilmente qualcosa in iAS??

EDIT: mi sono imbattuto nella risposta

Mentre cercavo qualcos'altro, mi sono imbattuto nel pacchetto UTL_I18N, che fa esattamente quello che sto cercando:

Esiste un modo semplice per convertire le impostazioni HTTP_ACCEPT_LANGUAGE in Oracle NLS_LANG?

È stato utile?

Soluzione 2

Alla fine mi sono imbattuto nella risposta.Il pacchetto Oracle UTL_I18N contiene funzioni per mappare dai codici lingua del browser alle impostazioni Oracle NLS:

utl_i18n.map_language_from_iso;
utl_i18n.map_territory_from_iso;

La mappatura non sembra gestire molto bene le impostazioni multilingue, ad es.en-us,en;q=0.5, ma finché usi solo i primi 5 caratteri le funzioni sembrano funzionare bene.

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

Altri suggerimenti

Certo, e non è troppo difficile, se risolvi correttamente il problema e non diventi troppo ambizioso all'inizio.

Sono necessarie essenzialmente due funzioni:uno per analizzare il HTTP_ACCEPT_LANGUAGE e produrre un codice linguistico, e uno per prenderlo e generare quello appropriato set comandi.

Il primo può diventare piuttosto sofisticato;se ti viene fornito solo "en", probabilmente vorrai generare "en-us", devi occuparti della scelta di una delle scelte multiple quando nulla corrisponde perfettamente, devi gestire valori di intestazione non corretti e così via.Non provare ad affrontare tutto in una volta:fai semplicemente qualcosa di molto semplice all'inizio ed estendilo in seguito.

Lo stesso vale più o meno per l'altra metà, generando il set comandi, ma questo è comunque piuttosto semplice di per sé;in realtà è solo una funzione di ricerca, anche se potrebbe diventare un po' più sofisticata a seconda di ciò che le viene fornito.

Ciò che davvero renderà o distruggerà la tua esperienza di programmazione su qualcosa di simile sono i tuoi test unitari.Questo è un problema ideale per i test unitari e lo sviluppo basato sui test.I test unitari faranno in modo che quando cambi le cose, le vecchie funzionalità continuino a funzionare e semplifichino l'aggiunta di nuove funzionalità e la correzione dei bug, perché aggiungi semplicemente un altro test e avrai quello che ti guiderà da quel punto in poi.(Troverai anche più semplice eseguire una riscrittura completa di una delle funzioni se scopri di aver sbagliato terribilmente ad un certo punto, perché puoi facilmente confermare che la nuova versione non sta rompendo nulla.)

Il modo in cui esegui i test unitari nel tuo ambiente probabilmente va un po' oltre lo scopo di questa domanda, ma consentitemi di aggiungere alcuni suggerimenti.Innanzitutto, se è disponibile un framework di test unitario ("pl-sql-unit?") per il tuo ambiente, è fantastico.In caso contrario, niente panico.Non hai bisogno di nulla di sofisticato:Solo una serie di input e output previsti e un modo per eseguirli attraverso la funzione e entrambi dicono "Tutto ok!" o mostra risultati errati.Probabilmente puoi scrivere una singola, semplice funzione PL/SQL che legga gli input e gli output attesi da una tabella e lo faccia per te.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top