From e3952c0debc16515f8879745aef8fef213dad9f0 Mon Sep 17 00:00:00 2001 From: miker Date: Tue, 6 Nov 2007 00:25:09 +0000 Subject: [PATCH] first round of i18n magic in cstore git-svn-id: svn://svn.open-ils.org/ILS/trunk@8011 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- Open-ILS/examples/fm_IDL.xml | 2 +- Open-ILS/src/c-apps/oils_cstore.c | 17 +++++++++- Open-ILS/src/c-apps/oils_idl-core.c | 9 ++++++ Open-ILS/src/sql/Pg/002.functions.config.sql | 48 ++++++++++++++++++++++------ Open-ILS/src/sql/Pg/002.schema.config.sql | 9 ++++++ Open-ILS/src/sql/Pg/build-db.sh | 1 + 6 files changed, 75 insertions(+), 11 deletions(-) diff --git a/Open-ILS/examples/fm_IDL.xml b/Open-ILS/examples/fm_IDL.xml index ac4dfd3e82..626c8faa86 100644 --- a/Open-ILS/examples/fm_IDL.xml +++ b/Open-ILS/examples/fm_IDL.xml @@ -922,7 +922,7 @@ - + diff --git a/Open-ILS/src/c-apps/oils_cstore.c b/Open-ILS/src/c-apps/oils_cstore.c index b44c57ee98..60a0e6ed5f 100644 --- a/Open-ILS/src/c-apps/oils_cstore.c +++ b/Open-ILS/src/c-apps/oils_cstore.c @@ -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); + } } } diff --git a/Open-ILS/src/c-apps/oils_idl-core.c b/Open-ILS/src/c-apps/oils_idl-core.c index 0ace15ab6e..a247446316 100644 --- a/Open-ILS/src/c-apps/oils_idl-core.c +++ b/Open-ILS/src/c-apps/oils_idl-core.c @@ -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, diff --git a/Open-ILS/src/sql/Pg/002.functions.config.sql b/Open-ILS/src/sql/Pg/002.functions.config.sql index b5d326c4b9..cc76c7edba 100644 --- a/Open-ILS/src/sql/Pg/002.functions.config.sql +++ b/Open-ILS/src/sql/Pg/002.functions.config.sql @@ -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; diff --git a/Open-ILS/src/sql/Pg/002.schema.config.sql b/Open-ILS/src/sql/Pg/002.schema.config.sql index 577b9dd913..39572a3ff3 100644 --- a/Open-ILS/src/sql/Pg/002.schema.config.sql +++ b/Open-ILS/src/sql/Pg/002.schema.config.sql @@ -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, diff --git a/Open-ILS/src/sql/Pg/build-db.sh b/Open-ILS/src/sql/Pg/build-db.sh index 563a0ad60e..2c83e98830 100755 --- a/Open-ILS/src/sql/Pg/build-db.sh +++ b/Open-ILS/src/sql/Pg/build-db.sh @@ -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 -- 2.11.0