1

Lors de l'ajout des capacités d'internationalisation à une application Web Oracle (build sur mod_plsql), j'aimerais interpréter le paramètre HTTP_ACCEPT_LANGUAGE et de l'utiliser pour régler divers paramètres NLS_ * dans la session Oracle.Existe-t-il un moyen facile de convertir HTTP_ACCEPT_LANGUAGE en paramètres Oracle NLS_LANG?

Par exemple:

HTTP_ACCEPT_LANGUAGE=de 

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

Cependant, vous pourriez obtenir quelque chose de plus compliqué, je suppose ...

HTTP_ACCEPT_LANGUAGE=en-us,en;q=0.5 

Comment ont abordé des gens ce genre de chose avant?

EDIT - suite à la réponse détaillée de Curt ci-dessous

Merci pour la réponse claire et détaillée Curt. Cependant, je ne me suis pas vraiment montré clair, car je demandais vraiment s'il y avait des widgets Oracle qui traitaient cela.

Je suis déjà sur la route de l'analyse syntaxique manuellement la variable HTTP_ACCEPT_LANGUAGE et - comme Curt a indiqué dans sa réponse - il y a quelques zones subtiles de complexité. Il sent comme quelque chose qui doit avoir été fait plusieurs fois auparavant. Au fur et à mesure que j'écrivais de plus en plus de code, j'avais ce sentiment de «je réinvente la roue». :)

Il doit y avoir une approche Oracle existante pour cela - probablement quelque chose dans iAS ??

EDIT - a trébuché à travers la réponse

Alors que vous cherchez quelque chose d'autre, je suis tombé sur le paquet UTL_I18N, qui ne Wham exactement que je suis après:

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

Répondre

1

Finalement trébuché sur la réponse. Le UTL_I18N du package Oracle contient des fonctions à la carte des codes de langue du navigateur aux paramètres Oracle NLS:

utl_i18n.map_language_from_iso; 
utl_i18n.map_territory_from_iso; 

La cartographie ne semble pas faire face très bien avec les réglages en plusieurs langues, par exemple en-us, fr; q = 0.5, mais tant que vous n'utilisez que les 5 premiers caractères, les fonctions semblent fonctionner correctement.

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

Bien sûr, et ce n'est pas trop dur, si vous cassez le problème correctement et ne devenez pas ambitieux au début.

Vous avez besoin, essentiellement, de deux fonctions: une pour analyser le HTTP_ACCEPT_LANGUAGE et produire un code de langue, et un pour le prendre et générer les commandes set appropriées.

L'ancien peut être assez sophistiqué; Si vous ne recevez que 'en', vous voulez probablement générer 'en-us', vous devez choisir parmi plusieurs choix lorsque rien ne correspond parfaitement, vous devez gérer des valeurs d'en-tête malformées, et ainsi de suite. N'essayez pas d'aborder tout cela en même temps: faites simplement quelque chose de très simple au début, et prolongez-le plus tard.

La même chose vaut plus ou moins pour l'autre moitié, générant les commandes set, mais c'est assez simple en soi de toute façon; c'est vraiment juste une fonction de recherche, même si elle peut devenir un peu plus sophistiquée en fonction de ce qui lui est fourni.

Que va vraiment faire ou défaire votre expérience de programmation sur quelque chose comme ceci est vos tests unitaires. C'est un problème idéal pour les tests unitaires et le développement piloté par les tests. Les tests unitaires s'assureront que lorsque vous changez des choses, les anciennes fonctionnalités continuent de fonctionner, facilitent l'ajout de nouvelles fonctionnalités et la correction des bogues, parce que vous ajoutez simplement un autre test et que vous en avez pour vous guider à partir de ce moment.(Vous trouverez également plus facile de faire une réécriture complète de l'une des fonctions si vous constatez que vous avez terriblement tort à un moment donné, car vous pouvez facilement confirmer que la nouvelle version ne casse rien.)

Comment vous faites des tests unitaires dans votre environnement est probablement un peu au-delà de la portée de cette question, mais laissez-moi ajouter quelques conseils. Premièrement, s'il y a un framework de test unitaire ("pl-sql-unit?") Disponible pour votre environnement, c'est génial. Sinon, ne paniquez pas. Vous n'avez besoin de rien de sophistiqué: juste un ensemble d'entrées et de sorties attendues, et un moyen de les faire passer par la fonction et soit dire "tout va bien!" ou montrer des résultats incorrects. Vous pouvez probablement écrire une seule fonction PL/SQL simple qui lit les entrées et les sorties attendues d'une table et fait cela pour vous.

+0

Merci pour la réponse claire et détaillée Curt. Cependant, je ne me suis pas vraiment montré clair, car je demandais vraiment s'il y avait des widgets Oracle qui traitaient cela. Je suis déjà sur la route d'analyser manuellement la variable HTTP_ACCEPT_LANGUAGE et - comme vous l'avez indiqué dans votre réponse - il devenait plus impliqué. C'était comme si quelque chose avait dû être fait plusieurs fois auparavant. J'ai ressenti ce sentiment de «je réinvente la roue». :) –

+0

:-(. –

Questions connexes