多語言欄位系統 (Multilingual Fields)
多語言欄位系統是項目中處理國際化內容的核心模組,允許同一個欄位儲存多種語言的內容,並提供自動翻譯、查詢和管理的功能。
系統架構
核心組件
mermaid
graph TB
A[前端請求] --> B[BaseService.find]
B --> C{是否包含多語言查詢?}
C -->|是| D[多語言查詢處理]
C -->|否| E[普通查詢]
D --> F[MultilingualFieldsService]
F --> G[AI翻譯服務]
F --> H[資料庫儲存]
H --> I[返回多語言數據]
E --> I
數據結構
MultilingualFieldsEntity
typescript
{
id: string // 主鍵ID
fieldId: string // 對應欄位ID (格式: multilingual-xxxxx)
language: string // 語言代碼 (如: zh-TW, en, ja)
value: string // 該語言的欄位值
// 繼承 BaseEntity 的基礎欄位
}
工作原理
1. 多語言欄位識別
系統通過檢查欄位值是否以 multilingual-
開頭來識別多語言欄位:
typescript
// 普通欄位
{
title: "Hello World",
description: "This is a description"
}
// 多語言欄位
{
title: "multilingual-12345", // 多語言欄位
description: "multilingual-67890" // 多語言欄位
}
2. 查詢流程
前端查詢請求
typescript
// 前端發送查詢請求
{
pageSize: 10,
currentPage: 1,
multilingualFields: ["title", "description"], // 指定需要多語言查詢的欄位
title: "標題內容" // 根據多語言內容查詢
}
後端處理流程
- 識別多語言欄位: 檢查
multilingualFields
參數 - 查詢多語言映射: 在
multilingual-fields
表中尋找對應的fieldId
- 生成查詢組合: 使用笛卡兒積生成所有可能的查詢條件
- 執行資料庫查詢: 使用
fieldId
進行實際查詢 - 附加多語言數據: 將多語言內容附加到查詢結果中
3. 返回數據結構
typescript
// 查詢結果
{
list: [
{
id: "1",
title: "multilingual-12345",
description: "multilingual-67890",
// 其他欄位...
// 自動附加的多語言數據
multilingualFields: {
title: [
{ id: "1", fieldId: "multilingual-12345", language: "zh-TW", value: "標題" },
{ id: "2", fieldId: "multilingual-12345", language: "en", value: "Title" },
{ id: "3", fieldId: "multilingual-12345", language: "ja", value: "タイトル" }
],
description: [
{ id: "4", fieldId: "multilingual-67890", language: "zh-TW", value: "描述" },
{ id: "5", fieldId: "multilingual-67890", language: "en", value: "Description" }
]
}
}
],
total: 1
}
核心功能
1. 多語言內容管理
創建多語言內容
typescript
// 創建單個多語言欄位
await multilingualFieldsService.create({
fieldId: 'multilingual-12345',
language: 'zh-TW',
value: '標題內容'
})
// 批次創建
await multilingualFieldsService.createBatch([
{ fieldId: 'multilingual-12345', language: 'zh-TW', value: '標題' },
{ fieldId: 'multilingual-12345', language: 'en', value: 'Title' },
{ fieldId: 'multilingual-12345', language: 'ja', value: 'タイトル' }
])
查詢多語言內容
typescript
// 查詢特定欄位的所有語言版本
const result = await multilingualFieldsService.find({
fieldId: 'multilingual-12345',
pageSize: 0 // 不分頁
})
更新多語言內容
typescript
// 更新特定語言版本
await multilingualFieldsService.update({
id: '1',
value: '新的標題內容'
})
2. AI 自動翻譯
語言轉換功能
typescript
// 將文字轉換為多種語言
const result = await multilingualFieldsService.convertLanguage({
text: "Hello World",
targetLanguages: ["zh-TW", "ja", "ko"]
})
// 返回結果
{
"zh-TW": "你好世界",
"ja": "こんにちは世界",
"ko": "안녕하세요 세계"
}
翻譯流程
- 接收原始文字和目標語言列表
- 調用 AI 翻譯服務 (ChatGPT)
- 解析 JSON 格式的翻譯結果
- 返回語言代碼對應的翻譯內容
3. 狀態管理
封鎖/解封鎖多語言欄位
typescript
// 封鎖多語言欄位
await multilingualFieldsService.block('1')
// 解封鎖多語言欄位
await multilingualFieldsService.unblock('1')
使用場景
1. 內容管理系統
typescript
// 文章管理
const article = {
title: 'multilingual-article-001',
content: 'multilingual-article-002',
category: 'multilingual-category-001'
}
// 查詢時自動返回多語言內容
const result = await find({
dto: {
multilingualFields: ['title', 'content', 'category'],
title: '文章標題'
},
repository: articleRepository
})
2. 產品目錄
typescript
// 產品資訊
const product = {
name: 'multilingual-product-001',
description: 'multilingual-product-002',
specifications: 'multilingual-product-003'
}
3. 用戶界面文本
typescript
// 界面文本
const uiText = {
buttonText: 'multilingual-ui-001',
errorMessage: 'multilingual-ui-002',
helpText: 'multilingual-ui-003'
}
最佳實踐
1. 欄位命名規範
typescript
// 推薦的 fieldId 命名格式
const fieldId = `multilingual-${entityType}-${fieldName}-${uniqueId}`
// 範例
'multilingual-article-title-001'
'multilingual-product-name-002'
'multilingual-ui-button-003'
2. 語言代碼標準
typescript
// 使用標準的語言代碼
const languages = {
'zh-TW': '繁體中文',
'zh-CN': '簡體中文',
'en': 'English',
'ja': '日本語',
'ko': '한국어'
}
3. 性能最佳化
查詢最佳化
typescript
// 只在需要時使用多語言查詢
const result = await find({
dto: {
multilingualFields: ['title'], // 只查詢需要的欄位
title: '標題'
},
repository: articleRepository
})
快取策略
typescript
// 對頻繁查詢的多語言內容進行快取
const cacheKey = `multilingual-${fieldId}`
const cached = await cacheService.get(cacheKey)
if (cached)
return cached
const result = await multilingualFieldsService.find({ fieldId })
await cacheService.set(cacheKey, result, 3600) // 快取1小時
4. 錯誤處理
typescript
try {
const result = await multilingualFieldsService.convertLanguage({
text: 'Hello',
targetLanguages: ['zh-TW', 'ja']
})
}
catch (error) {
if (error instanceof BadRequestException) {
// 處理翻譯失敗
console.error('翻譯失敗:', error.message)
}
}
資料庫設計
表結構
sql
CREATE TABLE system_multilingual_fields (
id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主鍵ID',
field_id VARCHAR(50) NOT NULL COMMENT '對應欄位ID',
language VARCHAR(50) NOT NULL COMMENT '對應語言',
value VARCHAR(255) NOT NULL COMMENT '欄位值',
remark VARCHAR(255) COMMENT '備註',
status TINYINT DEFAULT 1 COMMENT '狀態 0:禁用 1:啟用',
is_deleted TINYINT DEFAULT 0 COMMENT '是否刪除 0:否 1:是',
creator BIGINT COMMENT '建立人',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間',
updater BIGINT COMMENT '更新人',
update_time DATETIME ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間'
);
索引建議
sql
-- 主要查詢索引
CREATE INDEX idx_field_id ON system_multilingual_fields(field_id);
CREATE INDEX idx_language ON system_multilingual_fields(language);
CREATE INDEX idx_field_language ON system_multilingual_fields(field_id, language);
-- 狀態過濾索引
CREATE INDEX idx_status_deleted ON system_multilingual_fields(status, is_deleted);
配置說明
環境變數
env
# AI 翻譯服務配置
CHAT_GPT_API_KEY=your_chatgpt_api_key
# 多語言相關配置
DEFAULT_LANGUAGE=zh-TW
SUPPORTED_LANGUAGES=zh-TW,en,ja,ko
服務配置
typescript
// 在模組中配置
@Module({
imports: [
TypeOrmModule.forFeature([MultilingualFieldsEntity]),
// 其他依賴...
],
providers: [MultilingualFieldsService],
controllers: [MultilingualFieldsController],
exports: [MultilingualFieldsService]
})
export class MultilingualFieldsModule {}
常見問題
1. 多語言查詢性能問題
問題: 多個多語言欄位會產生笛卡兒積,影響查詢性能
解決方案:
- 限制同時查詢的多語言欄位數量
- 使用快取減少重複查詢
- 考慮使用全文搜尋索引
2. 翻譯準確性問題
問題: AI 翻譯可能不夠準確
解決方案:
- 提供人工校對功能
- 支持自訂翻譯
- 使用專業翻譯服務
3. 數據一致性問題
問題: 多語言數據可能不同步
解決方案:
- 實現數據同步機制
- 提供數據校驗功能
- 定期檢查數據完整性
擴展功能
1. 版本控制
typescript
// 支持多語言內容的版本控制
interface MultilingualVersion {
fieldId: string
language: string
version: number
value: string
isActive: boolean
}
2. 批次操作
typescript
// 批次更新多語言內容
await multilingualFieldsService.updateBatch([
{ id: '1', value: '新內容1' },
{ id: '2', value: '新內容2' }
])
3. 導入導出
typescript
// 導出多語言數據
const exportData = await multilingualFieldsService.export({
fieldIds: ['multilingual-001', 'multilingual-002'],
languages: ['zh-TW', 'en']
})
// 導入多語言數據
await multilingualFieldsService.import(importData)
總結
多語言欄位系統提供了完整的國際化解決方案,通過與 BaseService 的深度集成,實現了自動化的多語言查詢和管理。系統設計靈活,易於擴展,能夠滿足各種多語言應用的需求。
關鍵優勢:
- 自動化: 與 BaseService 無縫集成
- 智慧化: AI 自動翻譯功能
- 靈活性: 支持任意欄位的多語言化
- 性能最佳化: 智慧查詢和快取機制
- 易用性: 簡單的 API 介面