/*  $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$')
