【问题标题】:Retrieving i18n data with fallback language使用回退语言检索 i18n 数据
【发布时间】:2011-03-15 09:32:08
【问题描述】:

我必须从数据库中获取 i18n 文本。默认语言是英语,它有 everything 的文本。但非英语语言不一定有所有需要的翻译。如果数据库中没有某个实体/键的非英文翻译,那么我希望它返回英文文本。所以,英语是这里的后备语言。

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'的值是要参数化的)

所以它返回以下内容:

+-----+--------------+ |关键 |价值 | +-----+--------------+ |富 | foo 在Nederlands (荷兰语) | 世界银行 |酒吧 |酒吧英文| +-----+--------------+

如何在单个 SQL 查询中实现这一点?

有问题的数据库是 PostgreSQL,但与 RDMBS 无关的方式会很好。

【问题讨论】:

    标签: sql postgresql internationalization fallback


    【解决方案1】:

    试试这样的:

    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'
    

    【讨论】:

      猜你喜欢
      • 2017-07-19
      • 1970-01-01
      • 1970-01-01
      • 2015-01-02
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多