使用备用语言检索i18n数据
问题描述:
我必须从数据库中获取i18n文本。默认语言是英文,它的文字为,全部为。但非英语语言不一定具有所有期望的翻译。如果某个实体/密钥的非英文翻译在数据库中不可用,那么我想让它返回英文文本。所以,英文是fallback这里的语言。使用备用语言检索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不可知论的方式会很好。
答
尝试这样的事:
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'
作品中预言过。谢谢! – 2012-08-27 08:39:21