first round of i18n magic in cstore
authormiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Tue, 6 Nov 2007 00:25:09 +0000 (00:25 +0000)
committermiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Tue, 6 Nov 2007 00:25:09 +0000 (00:25 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/trunk@8011 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/examples/fm_IDL.xml
Open-ILS/src/c-apps/oils_cstore.c
Open-ILS/src/c-apps/oils_idl-core.c
Open-ILS/src/sql/Pg/002.functions.config.sql
Open-ILS/src/sql/Pg/002.schema.config.sql
Open-ILS/src/sql/Pg/build-db.sh

index ac4dfd3..626c8fa 100644 (file)
                        <field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
                        <field name="holdable" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="bool"/>
                        <field name="id" oils_obj:array_position="4" oils_persist:virtual="false" reporter:selector="name" reporter:datatype="id"/>
-                       <field name="name" oils_obj:array_position="5" oils_persist:virtual="false"  reporter:datatype="text"/>
+                       <field name="name" oils_obj:array_position="5" oils_persist:virtual="false"  reporter:datatype="text" oils_persist:i18n="true"/>
                </fields>
                <links/>
        </class>
index b44c57e..60a0e6e 100644 (file)
@@ -1,5 +1,6 @@
 #include "opensrf/osrf_application.h"
 #include "opensrf/osrf_settings.h"
+#include "opensrf/osrf_message.h"
 #include "opensrf/utils.h"
 #include "objson/object.h"
 #include "opensrf/log.h"
@@ -2080,6 +2081,7 @@ char* buildSELECT ( jsonObject* search_hash, jsonObject* order_hash, osrfHash* m
                while ( (node = jsonObjectIteratorNext( select_itr )) ) {
                        osrfHash* field = osrfHashGet( osrfHashGet( idlClass, "fields" ), jsonObjectToSimpleString(node->item) );
                        char* fname = osrfHashGet(field, "name");
+                       char* locale = osrf_message_get_last_locale();
 
                        if (!field) continue;
 
@@ -2089,7 +2091,20 @@ char* buildSELECT ( jsonObject* search_hash, jsonObject* order_hash, osrfHash* m
                                buffer_add(select_buf, ",");
                        }
 
-                       buffer_fadd(select_buf, " \"%s\".%s", cname, fname);
+            if (locale) {
+                       char* i18n = osrfHashGet(field, "i18n");
+
+                       if ( i18n && !strncasecmp("true", i18n, 4)) {
+                       char* pkey = osrfHashGet(idlClass, "primarykey");
+                       char* tname = osrfHashGet(idlClass, "tablename");
+
+                           buffer_fadd(select_buf, " COALESCE( oils_i18n_xlate('%s.%s', \"%s\".%s::TEXT, '%s'), \"%s\".%s )", tname, fname, cname, pkey, locale, cname, fname);
+                } else {
+                               buffer_fadd(select_buf, " \"%s\".%s", cname, fname);
+                }
+            } else {
+                           buffer_fadd(select_buf, " \"%s\".%s", cname, fname);
+            }
                }
        }
 
index 0ace15a..a247446 100644 (file)
@@ -142,6 +142,15 @@ osrfHash* oilsIDLInit( char* idl_filename ) {
                                                }
 
                                                string_tmp = NULL;
+                                               if( (string_tmp = (char*)xmlGetNsProp(_f, BAD_CAST "i18n", BAD_CAST PERSIST_NS)) ) {
+                                                       osrfHashSet(
+                                                               _tmp,
+                                                               strdup( string_tmp ),
+                                                               "i18n"
+                                                       );
+                                               }
+
+                                               string_tmp = NULL;
                                                if( (string_tmp = (char*)xmlGetNsProp(_f, BAD_CAST "virtual", BAD_CAST PERSIST_NS)) ) {
                                                        osrfHashSet(
                                                                _tmp,
index b5d326c..cc76c7e 100644 (file)
@@ -1,5 +1,6 @@
 BEGIN;
 
+/*
 CREATE OR REPLACE FUNCTION oils_xml_transform ( TEXT, TEXT ) RETURNS TEXT AS $_$
        SELECT  CASE    WHEN (SELECT COUNT(*) FROM config.xml_transform WHERE name = $2 AND xslt = '---') > 0 THEN $1
                        ELSE xslt_process($1, (SELECT xslt FROM config.xml_transform WHERE name = $2))
@@ -17,14 +18,14 @@ BEGIN
        FOR i IN ARRAY_LOWER(field_list,1) .. ARRAY_UPPER(field_list,1) LOOP
                FOR rec IN      SELECT  DISTINCT r, field_list[i], BTRIM(REGEXP_REPLACE(REGEXP_REPLACE(f, E'\n', ' ', 'g'), '[ ]+', ' ', 'g'))
                                  FROM  xpath_table_ns(
-                                               'id',
-                                               $$oils_xml_transform(marc,'$$ || (SELECT format FROM config.metabib_field WHERE id = field_list[i]) || $$')$$,
-                                               'biblio.record_entry',
-                                               (SELECT xpath FROM config.metabib_field WHERE id = field_list[i]),
-                                               'id = ' || record,
-                                               (SELECT x.prefix FROM config.xml_transform x JOIN config.metabib_field m ON (m.format = x.name) WHERE m.id = field_list[i]),
-                                               (SELECT x.namespace_uri FROM config.xml_transform x JOIN config.metabib_field m ON (m.format = x.name) WHERE m.id = field_list[i])
-                                       ) AS t( r bigint, f text)
+                                               'id',
+                                               $$oils_xml_transform(marc,'$$ || (SELECT format FROM config.metabib_field WHERE id = field_list[i]) || $$')$$,
+                                               'biblio.record_entry',
+                                               (SELECT xpath FROM config.metabib_field WHERE id = field_list[i]),
+                                               'id = ' || record,
+                                               (SELECT x.prefix FROM config.xml_transform x JOIN config.metabib_field m ON (m.format = x.name) WHERE m.id = field_list[i]),
+                                                   (SELECT x.namespace_uri FROM config.xml_transform x JOIN config.metabib_field m ON (m.format = x.name) WHERE m.id = field_list[i])
+                                       ) AS t( r bigint, f text)
                                  WHERE f IS NOT NULL LOOP
                        RETURN NEXT rec;
                END LOOP;
@@ -33,10 +34,39 @@ END;
 $_$ LANGUAGE PLPGSQL;
 
 
-
 CREATE OR REPLACE FUNCTION biblio_field_table ( record BIGINT, field INT ) RETURNS SETOF biblio_field_vtype AS $_$
        SELECT * FROM biblio_field_table( $1, ARRAY[$2] )
 $_$ LANGUAGE SQL;
 
+*/
+
+CREATE OR REPLACE FUNCTION oils_i18n_xlate ( keyfield TEXT, keyvalue TEXT, raw_locale TEXT ) RETURNS TEXT AS $func$
+DECLARE
+    locale      TEXT := LOWER( REGEXP_REPLACE( REGEXP_REPLACE( raw_locale, E'[;, ].+$', '' ), E'-', '_', 'g' ) );
+    language    TEXT := REGEXP_REPLACE( locale, E'_.+$', '' );
+    result      config.i18n_core%ROWTYPE;
+BEGIN
+
+    RAISE NOTICE '%', locale;
+
+    SELECT  * INTO result
+      FROM  config.i18n_core
+      WHERE fq_field = keyfield
+            AND identity_value = keyvalue
+            AND translation = locale;
+
+    IF NOT FOUND THEN
+        SELECT  * INTO result
+          FROM  config.i18n_core
+          WHERE fq_field = keyfield
+                AND identity_value = keyvalue
+                AND translation = language;
+    END IF;
+
+    RETURN result.string;
+END;
+$func$ LANGUAGE PLPGSQL;
+
+
 COMMIT;
 
index 577b9dd..39572a3 100644 (file)
@@ -28,6 +28,15 @@ COMMENT ON SCHEMA config IS $$
  */
 $$;
 
+CREATE TABLE config.i18n_core (
+    id              BIGSERIAL   PRIMARY KEY,
+    fq_field        TEXT        NOT NULL,
+    identity_value  TEXT        NOT NULL,
+    translation     TEXT        NOT NULL,
+    string          TEXT        NOT NULL
+);
+
+CREATE UNIQUE INDEX i18n_identity ON config.i18n_core (fq_field,identity_value,translation);
 
 CREATE TABLE config.bib_source (
        id              SERIAL  PRIMARY KEY,
index 563a0ad..2c83e98 100755 (executable)
@@ -6,6 +6,7 @@
 PGPASSWORD=$5 PGUSER=$4 PGHOST=$1 PGPORT=$2 PGDATABASE=$3 psql -f 000.english.pg$6.fts-config.sql
 PGPASSWORD=$5 PGUSER=$4 PGHOST=$1 PGPORT=$2 PGDATABASE=$3 psql -f 001.schema.offline.sql
 PGPASSWORD=$5 PGUSER=$4 PGHOST=$1 PGPORT=$2 PGDATABASE=$3 psql -f 002.schema.config.sql
+PGPASSWORD=$5 PGUSER=$4 PGHOST=$1 PGPORT=$2 PGDATABASE=$3 psql -f 002.functions.config.sql
 PGPASSWORD=$5 PGUSER=$4 PGHOST=$1 PGPORT=$2 PGDATABASE=$3 psql -f 005.schema.actors.sql
 PGPASSWORD=$5 PGUSER=$4 PGHOST=$1 PGPORT=$2 PGDATABASE=$3 psql -f 006.schema.permissions.sql
 PGPASSWORD=$5 PGUSER=$4 PGHOST=$1 PGPORT=$2 PGDATABASE=$3 psql -f 006.data.permissions.sql