Получение данных i18n с использованием резервного языка - PullRequest
11 голосов
/ 13 июля 2010

Мне нужно взять i18n текст из базы данных. Язык по умолчанию - английский, в нем есть текст для все . Но неанглийские языки не обязательно имеют все желаемые переводы. Если не английский перевод для определенной сущности / ключа недоступен в БД, то я бы хотел, чтобы он вместо этого возвращал текст на английском языке. Итак, английский - это запасной язык здесь.

Текстовая таблица i18n выглядит так (диалект PostgreSQL):

CREATE TABLE translation (
    id SERIAL PRIMARY KEY,
    language_code CHAR(2) NOT NULL,
    key VARCHAR(20) NOT NULL,
    value TEXT NOT NULL,
    CONSTRAINT translation_unique UNIQUE (language_code, key)
)

Данные выглядят так:

INSERT INTO translation 
    (language_code, key, value) 
VALUES
    ('en', 'foo', 'foo in English'),
    ('nl', 'foo', 'foo in Nederlands (Dutch)'),
    ('en', 'bar', 'bar in English')

Я бы хотел выполнить псевдо-SQL ниже:

SELECT key, value 
FROM translation 
WHERE (language_code = 'nl' OR IF value IS NULL THEN language_code = 'en')

(на самом деле, значение 'nl' должно быть параметризовано)

Так что он возвращает следующее:

+-----+---------------------------+
| key | value                     |
+-----+---------------------------+
| foo | foo in Nederlands (Dutch) |
| bar | bar in English            |
+-----+---------------------------+

Как я могу добиться этого в одном запросе SQL?

БД, о которой идет речь, - это PostgreSQL, но было бы неплохо использовать независимый от RDMBS способ.

1 Ответ

20 голосов
/ 13 июля 2010

попробуйте что-то вроде этого:

SELECT
    e.key,COALESCE(o.value,e.value)
    FROM Translation                e
        LEFT OUTER JOIN Translation o ON e.key=o.key and o.language_code='nl'
    WHERE e.language_code='en'
...