Files
Database/FAC/FAC_PACL.SRC
Peter Feij 81ee459e28 YKPN#79783 Ondersteuning van sensorlimieten: iets vergevingsgezinder (zoals asp)
svn path=/Database/trunk/; revision=61639
2023-08-30 10:37:17 +00:00

316 lines
11 KiB
Plaintext

/* $Revision$
* $Id$
*/
/* FAC_PACL, (L means Language) to be included from fac_pac.src, isolated for convenience only
* The LCL-package source.
*
* Contains all functions for localization.
* Let op: vertaalde waarden of meegegeven default zouden langer kunnen zijn
* dan in de native taal.
*
*/
/* Formatted on 10-9-2010 12:08:44 (QP5 v5.136.908.31019) */
CREATE OR REPLACE PACKAGE lcl
AS
fcltdblanguage fac_version.fac_version_lang%TYPE;
FUNCTION getuserlanguage
RETURN VARCHAR2;
PROCEDURE setuserlanguage (flcode IN VARCHAR2);
PROCEDURE setdatabaselanguage (flcode IN VARCHAR2);
FUNCTION xl (pnaam IN VARCHAR2, pkey IN NUMBER, pdefault IN VARCHAR2, plang IN VARCHAR2)
RETURN VARCHAR2;
FUNCTION x (pnaam IN VARCHAR2, pkey IN NUMBER, pdefault IN VARCHAR2, pautolcl IN NUMBER DEFAULT 1)
RETURN VARCHAR2;
FUNCTION L (pnaam IN VARCHAR2, pautolcl IN NUMBER DEFAULT 0)
RETURN VARCHAR2;
PROCEDURE fallback_languages;
END lcl;
/
CREATE OR REPLACE PACKAGE BODY lcl
AS
FUNCTION getuserlanguage
RETURN VARCHAR2
AS
userlang VARCHAR2 (10);
BEGIN
-- Cache de databasetaal in een package-global
IF fcltdblanguage IS NULL
THEN
SELECT fac_version_lang INTO fcltdblanguage FROM fac_version;
DBMS_OUTPUT.put_line ('Recaching language ' || fcltdblanguage);
END IF;
-- Bepaalt de applicatietaal van de user zoals vanuit ASP gezet
-- Links is wat Oracle teruggeeft, rechts wat ISO-639 vindt (onze keuze)
userlang := SYS_CONTEXT ('userenv', 'LANG');
RETURN CASE userlang
WHEN 'NL' THEN 'NL'
WHEN 'GB' THEN 'EN'
WHEN 'D' THEN 'DE'
WHEN 'F' THEN 'FR'
WHEN 'S' THEN 'SV'
WHEN 'N' THEN 'NO'
WHEN 'DK' THEN 'DA'
WHEN 'SF' THEN 'FI'
ELSE fcltdblanguage
END;
END;
PROCEDURE setuserlanguage (flcode IN VARCHAR2)
AS
nlslang VARCHAR2 (30);
setsql VARCHAR2 (60);
lflcode VARCHAR2 (10); -- locale kopie
BEGIN
-- Zet de sessie in de juiste taal, gegeven de FACILITOR-tweeletterige taalcode
-- Indien geen code, dan wordt de FACILITOR-installatietaal genomen volgens fac_version
-- Valt terug naar NL bij een onbekende taalcode
IF flcode IS NULL
THEN
SELECT fac_version_lang
INTO lflcode
FROM fac_version;
ELSE
lflcode := SUBSTR(flcode, 1, 10);
END IF;
-- de rechterkant vind je met select * from v$nls_valid_values where parameter = 'LANGUAGE'
-- de linkerkant vind je in Oracle terug met lcl.getuserlanguage()
CASE lflcode
WHEN 'NL'
THEN
nlslang := 'DUTCH';
WHEN 'EN'
THEN
nlslang := 'ENGLISH';
WHEN 'DE'
THEN
nlslang := 'GERMAN';
WHEN 'FR'
THEN
nlslang := 'FRENCH';
WHEN 'SV'
THEN
nlslang := 'SWEDISH';
WHEN 'NO'
THEN
nlslang := 'NORWEGIAN';
WHEN 'DA'
THEN
nlslang := 'DANISH';
WHEN 'FI'
THEN
nlslang := 'FINNISH';
ELSE
nlslang := 'DUTCH';
END CASE;
setsql := 'ALTER SESSION SET NLS_LANGUAGE=' || nlslang;
EXECUTE IMMEDIATE setsql;
END;
/* Let op dat ASP-code mogelijk ook nog cache't. Wijzig een willekeurige setting voor een re-cache */
PROCEDURE setdatabaselanguage (flcode IN VARCHAR2)
AS
BEGIN
UPDATE fac_version
SET fac_version_lang = flcode;
fcltdblanguage := flcode; -- Gecachete waarde bijwerken
END;
/* levert de vertaalde string op*/
FUNCTION xl (pnaam IN VARCHAR2, pkey IN NUMBER, pdefault IN VARCHAR2, plang IN VARCHAR2)
RETURN VARCHAR2
AS
retval fac_locale_xsl.fac_locale_xsl_tekst%TYPE;
BEGIN
BEGIN
-- language vertaling, geen dialect. Geldt voor kolommen
SELECT COALESCE (fac_locale_tekst, pdefault)
INTO retval
FROM fac_locale
WHERE fac_locale_kolomnaam = UPPER (pnaam)
AND fac_locale_lang = UPPER (plang)
AND fac_locale_kolomkeyval = pkey
AND fac_localeitems_key IS NULL
AND fac_locale_dialect_key IS NULL;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
retval := pdefault;
DBMS_OUTPUT.put_line ('No translation found for ' || pnaam || ', returning default ' || pdefault);
END;
RETURN retval;
END;
FUNCTION x (pnaam IN VARCHAR2, pkey IN NUMBER, pdefault IN VARCHAR2, pautolcl IN NUMBER DEFAULT 1)
RETURN VARCHAR2
AS
requiredlang fac_version.fac_version_lang%TYPE;
retval fac_locale_xsl.fac_locale_xsl_tekst%TYPE;
BEGIN
-- Cache de databasetaal in een package-global
IF fcltdblanguage IS NULL
THEN
SELECT fac_version_lang INTO fcltdblanguage FROM fac_version;
DBMS_OUTPUT.put_line ('Recaching language ' || fcltdblanguage);
END IF;
requiredlang := lcl.getuserlanguage ();
IF (requiredlang = fcltdblanguage OR pkey IS NULL)
THEN
-- DBMS_OUTPUT.put_line ('Using default language ' || requiredlang);
retval := pdefault;
ELSE
-- DBMS_OUTPUT.put_line ('Using notdefault language ' || requiredlang);
retval := lcl.xl (pnaam, pkey, pdefault, requiredlang);
END IF;
-- Voor lcl_noti_* maar verder generiek
IF pautolcl = 1 THEN
retval := lcl.L(retval, pautolcl);
END IF;
RETURN retval;
END;
-- Oracle variant van de ASP-L functie
-- Geef pautolcl=1 mee als je niet zeker weet of het een lcl is
-- Geeft de lcl zelf retour als deze niet gedefinieerd is (beter dan nodatafound)
FUNCTION l (pnaam IN VARCHAR2, pautolcl IN NUMBER DEFAULT 0)
RETURN VARCHAR2
AS
retval fac_locale_xsl.fac_locale_xsl_tekst%TYPE;
BEGIN
-- Voor lcl_noti_* maar verder generiek
IF pautolcl = 1 AND pnaam NOT LIKE 'lcl_%'
THEN
RETURN pnaam;
END IF;
BEGIN
SELECT COALESCE (fac_locale_xsl_cust, fac_locale_xsl_tekst)
INTO retval
FROM fac_locale_xsl
WHERE fac_locale_xsl_lang = lcl.getuserlanguage ()
AND fac_locale_xsl_label = pnaam
AND fac_locale_xsl_module = 'ASP';
EXCEPTION
WHEN NO_DATA_FOUND
THEN
retval := pnaam;
END;
RETURN retval;
END;
PROCEDURE fallback_languages
AS
BEGIN
-- Eerst: missende LCL's aanmaken vanuit NL (die ik compleet veronderstel)
-- Eerder ggeimporteerde talen zijn mogelijk niet compleet namelijk
FOR c_lang IN (SELECT DISTINCT (fac_locale_xsl_lang) lang
FROM fac_locale_xsl
WHERE fac_locale_xsl_lang <> 'NL')
LOOP
DBMS_OUTPUT.PUT_LINE ('Updating language ' || c_lang.lang);
INSERT INTO fac_locale_xsl (fac_locale_xsl_lang,
fac_locale_xsl_module,
fac_locale_xsl_label,
fac_locale_xsl_tekst,
fac_locale_xsl_isvalid)
SELECT c_lang.lang,
fac_locale_xsl_module,
fac_locale_xsl_label,
'@@',
0
FROM fac_locale_xsl x2
WHERE fac_locale_xsl_lang = 'NL'
AND NOT EXISTS
(SELECT 1
FROM fac_locale_xsl x3
WHERE x3.fac_locale_xsl_lang = c_lang.lang
AND x2.fac_locale_xsl_label =
x3.fac_locale_xsl_label
AND x2.fac_locale_xsl_module =
x3.fac_locale_xsl_module);
END LOOP;
-- Dan: Engelstalig terugvallen op de database taal (of NL)
UPDATE fac_locale_xsl flx1
SET fac_locale_xsl_isvalid = 0,
fac_locale_xsl_tekst =
(SELECT fac_locale_xsl_tekst
FROM fac_locale_xsl flx2
WHERE flx1.fac_locale_xsl_label = flx2.fac_locale_xsl_label
AND flx1.fac_locale_xsl_module =
flx2.fac_locale_xsl_module
AND fac_locale_xsl_lang =
COALESCE((SELECT fac_version_lang FROM fac_version), 'NL'))
WHERE ( fac_locale_xsl_isvalid = 0
OR fac_locale_xsl_tekst IS NULL
OR fac_locale_xsl_tekst = '@'
OR fac_locale_xsl_tekst = '@@')
AND fac_locale_xsl_lang = 'EN';
-- Dan: Nu nog steeds missende Engelstalig echt terugvallen op NL. Altijd beter dan '@@'
UPDATE fac_locale_xsl flx1
SET fac_locale_xsl_isvalid = 0,
fac_locale_xsl_tekst =
(SELECT fac_locale_xsl_tekst
FROM fac_locale_xsl flx2
WHERE flx1.fac_locale_xsl_label = flx2.fac_locale_xsl_label
AND flx1.fac_locale_xsl_module =
flx2.fac_locale_xsl_module
AND fac_locale_xsl_lang = 'NL')
WHERE ( fac_locale_xsl_isvalid = 0
OR fac_locale_xsl_tekst IS NULL
OR fac_locale_xsl_tekst = '@'
OR fac_locale_xsl_tekst = '@@')
AND fac_locale_xsl_lang = 'EN';
-- Daarna: Alle andere talen terugvallen op Engelstalig
UPDATE fac_locale_xsl flx1
SET fac_locale_xsl_isvalid = 0,
fac_locale_xsl_tekst =
(SELECT fac_locale_xsl_tekst
FROM fac_locale_xsl flx2
WHERE flx1.fac_locale_xsl_label = flx2.fac_locale_xsl_label
AND flx1.fac_locale_xsl_module =
flx2.fac_locale_xsl_module
AND fac_locale_xsl_lang = 'EN')
WHERE ( fac_locale_xsl_isvalid = 0
OR fac_locale_xsl_tekst IS NULL
OR fac_locale_xsl_tekst = '@'
OR fac_locale_xsl_tekst = '@@')
AND fac_locale_xsl_lang NOT IN
('EN', 'NL');
-- En allerlaatst: lege teksten zijn altijd valid
UPDATE fac_locale_xsl flx1
SET fac_locale_xsl_isvalid = 1
WHERE fac_locale_xsl_tekst IS NULL;
END;
END lcl;
/
REGISTERRUN('$Id$')