使用后备语言检索i18n数据

Bal*_*usC 11 sql postgresql fallback internationalization

我必须从数据库中获取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)
)
Run Code Online (Sandbox Code Playgroud)

数据如下所示:

INSERT INTO translation 
    (language_code, key, value) 
VALUES
    ('en', 'foo', 'foo in English'),
    ('nl', 'foo', 'foo in Nederlands (Dutch)'),
    ('en', 'bar', 'bar in English')
Run Code Online (Sandbox Code Playgroud)

我想基本上做下面的伪SQL查询:

SELECT key, value 
FROM translation 
WHERE (language_code = 'nl' OR IF value IS NULL THEN language_code = 'en')
Run Code Online (Sandbox Code Playgroud)

(实际上,该'nl'值是参数化的)

这样它返回以下内容:

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

如何在单个SQL查询中实现此目的?

有问题的DB是PostgreSQL,但RDMBS无关的方式会很好.

KM.*_*KM. 20

尝试这样的事情:

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'
Run Code Online (Sandbox Code Playgroud)