Есть ли простой способ конвертировать HTTP_ACCEPT_LANGUAGE в настройки Oracle NLS_LANG? - PullRequest
1 голос
/ 22 мая 2009

При добавлении возможностей интернационализации в веб-приложение Oracle (построено на mod_plsql) я хотел бы интерпретировать параметр HTTP_ACCEPT_LANGUAGE и использовать его для установки различных настроек NLS_ * в сеансе Oracle.

Например:

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 - возможно, что-то в iAS ??

РЕДАКТИРОВАТЬ - наткнулся на ответ

В поисках чего-то другого я наткнулся на пакет UTL_I18N, который делает именно то, что мне нужно:

Есть ли простой способ преобразовать HTTP_ACCEPT_LANGUAGE в настройки Oracle NLS_LANG?

Ответы [ 2 ]

1 голос
/ 30 ноября 2009

Наконец наткнулся на ответ. Пакет 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 голос
/ 22 мая 2009

Конечно, и это не так уж сложно, если вы правильно решите проблему и сначала не добьетесь амбиций.

По сути, вам нужны две функции: одна для анализа HTTP_ACCEPT_LANGUAGE и создания кода языка, а другая для его получения и генерации соответствующих set команд.

Первый может быть довольно сложным; если вам дано только «en», вы, вероятно, захотите сгенерировать «en-us», вам нужно иметь дело с выбором одного из нескольких вариантов, когда ничего не совпадает идеально, вам нужно иметь дело с искаженными значениями заголовка и так далее. Не пытайтесь решить все это сразу: сначала сделайте что-нибудь очень простое, а потом расширьте.

То же самое относится и к другой половине, генерируя команды set, но в любом случае это довольно просто; на самом деле это просто функция поиска, хотя она может стать немного более сложной в зависимости от того, что ей предоставлено.

Что действительно сделает или сломает ваш опыт программирования на чем-то подобном, так это ваши модульные тесты. Это идеальная проблема для модульного тестирования и разработки через тестирование. Модульные тесты позволят убедиться, что когда вы что-то меняете, старая функциональность продолжает работать, и упростит добавление новой функциональности и исправление ошибок, потому что вы просто добавляете еще один тест, и у вас есть это, чтобы вести вас с этого момента. (Вам также будет проще выполнить полную переписывание одной из функций, если вы обнаружите, что в какой-то момент вы ошиблись, потому что вы легко можете убедиться, что новая версия ничего не нарушает.)

То, как вы проводите модульное тестирование в своей среде, возможно, немного выходит за рамки этого вопроса, но позвольте мне добавить несколько советов. Во-первых, если для вашей среды доступен фреймворк модульного тестирования («pl-sql-unit?»), Это здорово. Если нет, не паникуйте. Вам не нужно ничего сложного: просто набор входов и ожидаемых выходов, а также способ запустить их через функцию и сказать «все в порядке!» или показать какие-либо неверные результаты. Вероятно, вы можете написать одну простую функцию PL / SQL, которая считывает входные и ожидаемые выходные данные из таблицы и делает это для вас.

...