1

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

Как бы люди решать такого рода вещи раньше?

EDIT - вслед за подробный ответ Курта ниже

Спасибо за четкий и подробный ответ Курта. Я действительно не понимал, хотя, поскольку я действительно спрашивал, есть ли какие-либо существующие виджеты Oracle, которые обрабатывали это.

Я уже прошел путь к ручному анализу переменной HTTP_ACCEPT_LANGUAGE и, как указал Курт в своем ответе, есть несколько тонких областей сложности. Это чувствует как-то, что должно было быть сделано много раз раньше. Поскольку я писал все больше и больше кода, у меня было то, что я погружался в чувство «Я изобретаю колесо». :)

Для этого должен существовать существующий подход Oracle - возможно, что-то в iAS ??

EDIT - наткнулся на ответ

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

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

ответ

1

Наконец-то наткнулся на ответ. Пакет UTL_I18N Oracle содержит функции для отображения от языка браузера кодов настройки 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?»), Это здорово. Если нет, не паникуйте. Вам не нужно ничего сложного: просто набор входов и ожидаемых выходов, а также способ запускать их через функцию и либо сказать «все нормально!» или показать неправильные результаты. Вероятно, вы можете написать одну простую функцию PL/SQL, которая считывает входные данные и ожидаемые выходы из таблицы и делает это за вас.

+0

Спасибо за четкий и подробный ответ Курт. Я действительно не понимал, хотя, поскольку я действительно спрашивал, есть ли какие-либо существующие виджеты Oracle, которые обрабатывали это. Я уже иду по ручному анализу переменной HTTP_ACCEPT_LANGUAGE, и, как вы указали в своем ответе, он стал более активным. Он * чувствовал * как нечто, что, должно быть, было сделано много раз раньше. У меня было то, что я погрузился в чувство «Я изобретаю колесо». :) –

+0

:-(. –

Смежные вопросы