316 lines
11 KiB
Plaintext
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$')
|