我有一个名为 movies
的表,其中包含两列,description
和 longer_description
。这些列包含用于获取翻译的翻译键。我设法使用连接获取翻译,但如果找不到翻译,我想回退到默认语言环境。
我有一个这样的数据库结构:
电影表
movies
---------------------------------------
name | description | longer_description
本地化表
localizations
------------------------------
textkey | locale | translation
使用 textkey + locale 作为主键。
电影的示例数据:
name | description | longer_description
-------------------------------------------------------------
Batman movie | batman.description | batman.longer_description
这些值用于匹配本地化表中的文本键:
本地化示例数据:
textkey | locale | translation
---------------------------------------------------------------
batman.description | en | english description
batman.longer_description | en | english longer description
我想要实现的是使用给定的文本键 + 语言环境进行查询,如果存在翻译:选择,如果不存在:回退到默认的 en
语言环境。
SELECT
m.name,
t1.translation AS description,
t2.translation AS long_description
FROM
movies m
LEFT OUTER JOIN
localizations t1
ON
t1.language = 'sv' AND
t1.text_key = m.description
LEFT OUTER JOIN
localizations t2
ON
t2.language = 'sv' AND
t2.text_key = m.long_description
ORDER BY
m.name
这会得到我想要的翻译,但它不会解决翻译不存在并且我需要回退到 en
语言环境的情况。
最佳答案
为此使用存储函数:
create function fn_get_translation(p_key text, p_language text) returns text static strict language sql as $$
select
translation
from
localizations l join
(values(1,p_language),(2,'en')) as lng(ord,code) on (l.locale = lng.code)
where
l.text_key = p_key
order by
lng.ord
limit 1
$$;
免责声明:功能未经测试,但我相信您能够修复可能的错误。
然后查询会更简单:
select
m.name,
fn_get_translation(m.description, 'sv') as description,
fn_get_translation(m.long_description, 'sv') as long_description
from
movies m;
关于使用默认回退的 SQL 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40016493/