""" 国际化响应序列化器 提供基础的 I18nResponseMixin 类,用于为 API 响应添加国际化字段。 """ from typing import Any, Dict, List, Union from pydantic import BaseModel class I18nResponseMixin: """国际化响应混入类 为响应数据添加国际化字段,特别是为枚举值添加 _display 后缀的翻译字段。 使用方法: 1. 继承此类 2. 实现 _get_enum_fields() 方法定义需要翻译的枚举字段 3. 调用 serialize_with_i18n() 方法序列化数据 示例: class WorkspaceSerializer(I18nResponseMixin): def _get_enum_fields(self) -> Dict[str, str]: return { "role": "workspace_role", "status": "workspace_status" } def serialize(self, workspace: Workspace, locale: str = "zh") -> Dict: data = { "id": str(workspace.id), "name": workspace.name, "role": workspace.role, "status": workspace.status } return self.serialize_with_i18n(data, locale) """ def serialize_with_i18n( self, data: Any, locale: str = "zh" ) -> Union[Dict, List[Dict], Any]: """序列化数据并添加国际化字段 Args: data: 要序列化的数据(字典、列表或 Pydantic 模型) locale: 语言代码 Returns: 序列化后的数据,包含国际化字段 """ # 如果是 Pydantic 模型,转换为字典 if isinstance(data, BaseModel): data = data.model_dump() # 处理不同类型的数据 if isinstance(data, dict): return self._serialize_dict(data, locale) elif isinstance(data, list): return [self._serialize_dict(item, locale) if isinstance(item, dict) else item for item in data] else: return data def _serialize_dict(self, data: Dict, locale: str) -> Dict: """序列化字典并添加 _display 字段 Args: data: 字典数据 locale: 语言代码 Returns: 添加了 _display 字段的字典 """ from app.i18n.service import get_translation_service translation_service = get_translation_service() result = data.copy() # 获取需要翻译的枚举字段 enum_fields = self._get_enum_fields() # 为每个枚举字段添加 _display 字段 for field, enum_type in enum_fields.items(): if field in result and result[field] is not None: value = result[field] # 翻译枚举值 display_value = translation_service.translate_enum( enum_type=enum_type, value=str(value), locale=locale ) # 添加 _display 字段 result[f"{field}_display"] = display_value return result def _get_enum_fields(self) -> Dict[str, str]: """获取需要翻译的枚举字段 子类必须实现此方法,返回字段名到枚举类型的映射。 Returns: 字段名到枚举类型的映射 例如: {"role": "workspace_role", "status": "workspace_status"} """ return {} class WorkspaceSerializer(I18nResponseMixin): """工作空间序列化器 为工作空间响应添加国际化字段。 """ def _get_enum_fields(self) -> Dict[str, str]: """定义工作空间的枚举字段""" return { "role": "workspace_role", "status": "workspace_status" } def serialize(self, workspace_data: Union[Dict, BaseModel], locale: str = "zh") -> Dict: """序列化工作空间数据 Args: workspace_data: 工作空间数据(字典或 Pydantic 模型) locale: 语言代码 Returns: 序列化后的工作空间数据,包含国际化字段 """ return self.serialize_with_i18n(workspace_data, locale) def serialize_list(self, workspaces: List[Union[Dict, BaseModel]], locale: str = "zh") -> List[Dict]: """序列化工作空间列表 Args: workspaces: 工作空间列表 locale: 语言代码 Returns: 序列化后的工作空间列表 """ return [self.serialize(ws, locale) for ws in workspaces] class WorkspaceMemberSerializer(I18nResponseMixin): """工作空间成员序列化器 为工作空间成员响应添加国际化字段。 """ def _get_enum_fields(self) -> Dict[str, str]: """定义工作空间成员的枚举字段""" return { "role": "workspace_role" } def serialize(self, member_data: Union[Dict, BaseModel], locale: str = "zh") -> Dict: """序列化工作空间成员数据 Args: member_data: 成员数据(字典或 Pydantic 模型) locale: 语言代码 Returns: 序列化后的成员数据,包含国际化字段 """ return self.serialize_with_i18n(member_data, locale) def serialize_list(self, members: List[Union[Dict, BaseModel]], locale: str = "zh") -> List[Dict]: """序列化工作空间成员列表 Args: members: 成员列表 locale: 语言代码 Returns: 序列化后的成员列表 """ return [self.serialize(member, locale) for member in members] class WorkspaceInviteSerializer(I18nResponseMixin): """工作空间邀请序列化器 为工作空间邀请响应添加国际化字段。 """ def _get_enum_fields(self) -> Dict[str, str]: """定义工作空间邀请的枚举字段""" return { "status": "invite_status", "role": "workspace_role" } def serialize(self, invite_data: Union[Dict, BaseModel], locale: str = "zh") -> Dict: """序列化工作空间邀请数据 Args: invite_data: 邀请数据(字典或 Pydantic 模型) locale: 语言代码 Returns: 序列化后的邀请数据,包含国际化字段 """ return self.serialize_with_i18n(invite_data, locale) def serialize_list(self, invites: List[Union[Dict, BaseModel]], locale: str = "zh") -> List[Dict]: """序列化工作空间邀请列表 Args: invites: 邀请列表 locale: 语言代码 Returns: 序列化后的邀请列表 """ return [self.serialize(invite, locale) for invite in invites]