i18n = osrfHashGet( field_def, "i18n" );
if( str_is_true( i18n ) ) {
- buffer_fadd( select_buf, " oils_i18n_xlate('%s', '%s', '%s', "
- "'%s', \"%s\".%s::TEXT, '%s') AS \"%s\"",
+ buffer_fadd( select_buf, " COALESCE(oils_i18n_xlate('%s', '%s', '%s', "
+ "'%s', \"%s\".%s::TEXT, '%s'),%s) AS \"%s\"",
class_tname, cname, col_name, class_pkey,
- cname, class_pkey, locale, col_name );
+ cname, class_pkey, locale, col_name, col_name );
} else {
buffer_fadd( select_buf, " \"%s\".%s AS \"%s\"",
cname, col_name, col_name );
if( str_is_true( i18n ) ) {
buffer_fadd( select_buf,
- " oils_i18n_xlate('%s', '%s', '%s', '%s', "
- "\"%s\".%s::TEXT, '%s') AS \"%s\"",
+ " COALESCE(oils_i18n_xlate('%s', '%s', '%s', '%s', "
+ "\"%s\".%s::TEXT, '%s'),%s) AS \"%s\"",
class_tname, cname, col_name, class_pkey, cname,
- class_pkey, locale, _alias );
+ class_pkey, locale, col_name, _alias );
} else {
buffer_fadd( select_buf, " \"%s\".%s AS \"%s\"",
cname, col_name, _alias );
char* pkey = osrfHashGet( idlClass, "primarykey" );
char* tname = osrfHashGet( idlClass, "tablename" );
- buffer_fadd( select_buf, " oils_i18n_xlate('%s', '%s', '%s', "
- "'%s', \"%s\".%s::TEXT, '%s') AS \"%s\"",
- tname, cname, fname, pkey, cname, pkey, locale, fname );
+ buffer_fadd( select_buf, " COALESCE(oils_i18n_xlate('%s', '%s', '%s', "
+ "'%s', \"%s\".%s::TEXT, '%s'),%s) AS \"%s\"",
+ tname, cname, fname, pkey, cname, pkey, locale, fname, fname );
} else {
buffer_fadd( select_buf, " \"%s\".%s", cname, fname );
}
-CREATE OR REPLACE FUNCTION oils_i18n_xlate ( keytable TEXT, keyclass TEXT, keycol TEXT, identcol TEXT, keyvalue TEXT, raw_locale TEXT ) RETURNS TEXT AS $func$
-DECLARE
- locale TEXT := REGEXP_REPLACE( REGEXP_REPLACE( raw_locale, E'[;, ].+$', '' ), E'_', '-', 'g' );
- language TEXT := REGEXP_REPLACE( locale, E'-.+$', '' );
- result config.i18n_core%ROWTYPE;
- fallback TEXT;
- keyfield TEXT := keyclass || '.' || keycol;
-BEGIN
+CREATE OR REPLACE FUNCTION oils_i18n_xlate (text, text, text, text, text, text) RETURNS TEXT AS $$
+
+WITH
+ wlocale AS (
+ SELECT REGEXP_REPLACE( REGEXP_REPLACE( $6, E'[;, ].+$', '' ), E'_', '-', 'g' ) AS value
+ ),
+ wlanguage AS (
+ SELECT REGEXP_REPLACE( wlocale.value, E'-.+$', '' ) AS value FROM wlocale
+ )
- -- Try the full locale
- SELECT * INTO result
- FROM config.i18n_core
- WHERE fq_field = keyfield
- AND identity_value = keyvalue
- AND translation = locale;
-
- -- Try just the language
- IF NOT FOUND THEN
- SELECT * INTO result
- FROM config.i18n_core
- WHERE fq_field = keyfield
- AND identity_value = keyvalue
- AND translation = language;
- END IF;
-
- -- Fall back to the string we passed in in the first place
- IF NOT FOUND THEN
- EXECUTE
- 'SELECT ' ||
- keycol ||
- ' FROM ' || keytable ||
- ' WHERE ' || identcol || ' = ' || quote_literal(keyvalue)
- INTO fallback;
- RETURN fallback;
- END IF;
-
- RETURN result.string;
-END;
-$func$ LANGUAGE PLPGSQL STABLE;
+ SELECT string
+ FROM config.i18n_core,
+ wlocale,
+ wlanguage
+ WHERE fq_field = $2 || '.' || $3
+ AND translation IN (wlanguage.value, wlanguage.value)
+ AND identity_value = $5
+ ORDER BY LENGTH(translation) DESC
+ LIMIT 1
+
+$$ LANGUAGE SQL STABLE;
-- Functions for marking translatable strings in SQL statements
-- Parameters are: primary key, string, class hint, property
--- /dev/null
+BEGIN;
+
+DROP FUNCTION oils_i18n_xlate (text, text, text, text, text, text);
+
+CREATE OR REPLACE FUNCTION oils_i18n_xlate (text, text, text, text, text, text) RETURNS TEXT AS $$
+
+WITH
+ wlocale AS (
+ SELECT REGEXP_REPLACE( REGEXP_REPLACE( $6, E'[;, ].+$', '' ), E'_', '-', 'g' ) AS value
+ ),
+ wlanguage AS (
+ SELECT REGEXP_REPLACE( wlocale.value, E'-.+$', '' ) AS value FROM wlocale
+ )
+
+ SELECT string
+ FROM config.i18n_core,
+ wlocale,
+ wlanguage
+ WHERE fq_field = $2 || '.' || $3
+ AND translation IN (wlanguage.value, wlanguage.value)
+ AND identity_value = $5
+ ORDER BY LENGTH(translation) DESC
+ LIMIT 1
+
+$$ LANGUAGE SQL STABLE;
+
+COMMIT;
+
+