Получение i18n данные с языком нейтрализации

Я должен захватить i18n текст от базы данных. Язык по умолчанию является английским, он имеет текст для всего. Но неанглийские языки не обязательно имеют все желаемые переводы. Если бы неанглийский перевод для определенного объекта/ключа не доступен в DB, то я хотел бы иметь его для возврата английского текста вместо этого. Так, английский язык является языком нейтрализации здесь.

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-запросе?

Рассматриваемым DB является PostgreSQL, но RDMBS-агностический путь был бы хорош.

11
задан BalusC 8 June 2015 в 18:57
поделиться