从作品开始,而不是从数据库行开始
一篇双语文章是一份思想作品的两种完整表达。两个页面拥有共同身份,但任何一页都不应该变成装着许多半翻译字段的袋子。
| 字段 | 共享或本地化 | 用途 |
|---|---|---|
| Slug | 共享 | 跨语言保持稳定身份 |
| Language | 每页独立 | 当前正文的语言 |
| Origin Language | 共享 | 作者实际写作时使用的语言 |
| Title 与 Summary | 本地化 | 面向读者的 metadata |
| Status | 每页独立 | 独立控制发布 |
| Other Version | Relation | 连接两个完整页面 |
公开查询应该刻意保持严格:
type Locale = 'en' | 'zh'
async function findPublishedArticle(locale: Locale, slug: string) {
return repository.find({
language: locale,
slug,
status: 'Published',
})
}
Relation 可以帮助界面展示“阅读另一语言”,但不能改变当前 URL 所请求的内容。
编辑流程
- 先完成原语言页面。
- 用同一 Slug 创建另一语言页面。
- 两页填写相同的 Origin Language。
- 建立双向 relation。
- 分别检查两种语言的标题、摘要和链接。
- 独立决定每一页何时发布。
写作视图
只显示 Language 与 Origin Language 相同的页面,作者看到的是每篇手写作品的一行。
发布视图
显示所有语言页面、relation、状态和日期,让缺失或未完成的翻译保持可见。
将来增加日语时,应该创建第三个完整 locale 页面,而不是继续往原有数据库行里塞更多语言列。