package i18n import ( "context" "fmt" "strings" "github.com/gogf/gf/v2/frame/g" ) // 支持的语言列表 var SupportedLanguages = []string{"zh-CN", "en-US"} // 默认语言 const DefaultLanguage = "en-US" // 语言映射表 var languageMap = map[string]map[string]string{ "zh-CN": { "hello": "你好,世界", // 通用消息 "success": "操作成功", "server_error": "服务器内部错误", "invalid_operation": "非法的操作请求", "params_error": "请求参数错误", "not_login": "用户未登录", "account_disabled": "账户已被禁用", "permission_denied": "没有权限执行该操作", "token_expired": "token已过期", "not_found": "资源不存在", "forbidden": "禁止访问", "unauthorized": "未授权访问", "unknown_error": "未知错误", // 用户相关 "auth_failed": "账户名或密码不正确", "password_incorrect": "密码不正确", "email_exists": "该邮箱已被注册", "password_mismatch": "两次密码输入不一致", "database_query_failed": "数据库查询失败", "data_conversion_failed": "数据转换失败", "token_generation_failed": "Token 生成失败", "password_encryption_failed": "密码加密失败", "registration_failed": "注册失败", "user_not_found": "用户不存在或已被禁用", "email_not_found": "未找到该邮箱注册账户", // 管理员相关 "admin_not_found": "管理员不存在", "admin_query_failed": "查询管理员信息失败", "invalid_token_format": "无效的token格式", "password_update_failed": "密码更新失败", "token_parse_failed": "Token解析失败", "invalid_token": "无效的Token", // 小说相关 "book_query_failed": "小说查询失败", "book_exists": "小说已存在", "book_create_failed": "小说创建失败", "book_not_found": "小说不存在", "book_update_failed": "小说更新失败", "book_delete_failed": "小说删除失败", "chapter_not_found": "章节不存在", "insufficient_points": "积分不足", "chapter_locked": "章节已锁定,需要积分解锁", // 分类相关 "category_query_failed": "分类查询失败", "category_exists": "分类已存在", "category_create_failed": "分类创建失败", "category_not_found": "分类不存在", "category_update_failed": "分类更新失败", "category_delete_failed": "分类删除失败", "category_type_invalid": "分类类型无效,只能为1(男频)或2(女频)", // 标签相关 "tag_query_failed": "标签查询失败", "tag_exists": "标签已存在", "tag_create_failed": "标签创建失败", "tag_not_found": "标签不存在", "tag_update_failed": "标签更新失败", "tag_delete_failed": "标签删除失败", // 章节相关 "chapter_query_failed": "章节查询失败", "chapter_create_failed": "章节创建失败", "chapter_update_failed": "章节更新失败", "chapter_delete_failed": "章节删除失败", // 反馈相关 "feedback_create_failed": "反馈提交失败", // 阅读记录相关 "read_record_create_failed": "阅读记录创建失败", "read_record_query_failed": "阅读记录查询失败", "read_record_not_found": "阅读记录不存在", "read_record_delete_failed": "阅读记录删除失败", // 关注作者相关 "user_follow_author_query_failed": "关注作者查询失败", "user_follow_author_exists": "已关注该作者", "user_follow_author_create_failed": "关注作者失败", "user_follow_author_not_found": "关注记录不存在", "user_follow_author_delete_failed": "取消关注失败", }, "en-US": { "hello": "Hello World!", // Common messages "success": "Operation successful", "server_error": "Internal server error", "invalid_operation": "Invalid operation request", "params_error": "Request parameter error", "not_login": "User not logged in", "account_disabled": "Account has been disabled", "permission_denied": "No permission to perform this operation", "token_expired": "Token has expired", "not_found": "Resource not found", "forbidden": "Access forbidden", "unauthorized": "Unauthorized access", "unknown_error": "Unknown error", // User related "auth_failed": "Incorrect username or password", "password_incorrect": "Incorrect password", "email_exists": "This email has already been registered", "password_mismatch": "Passwords do not match", "database_query_failed": "Database query failed", "data_conversion_failed": "Data conversion failed", "token_generation_failed": "Token generation failed", "password_encryption_failed": "Password encryption failed", "registration_failed": "Registration failed", "user_not_found": "User does not exist or has been disabled", "email_not_found": "No registered account found for this email", // Admin related "admin_not_found": "Administrator not found", "admin_query_failed": "Failed to query administrator information", "invalid_token_format": "Invalid token format", "password_update_failed": "Password update failed", "token_parse_failed": "Token parsing failed", "invalid_token": "Invalid token", // Novel related "book_query_failed": "Book query failed", "book_exists": "Book already exists", "book_create_failed": "Book creation failed", "book_not_found": "Book not found", "book_update_failed": "Book update failed", "book_delete_failed": "Book deletion failed", "chapter_not_found": "Chapter not found", "insufficient_points": "Insufficient points", "chapter_locked": "Chapter is locked, requires points to unlock", // Category related "category_query_failed": "Category query failed", "category_exists": "Category already exists", "category_create_failed": "Category creation failed", "category_not_found": "Category not found", "category_update_failed": "Category update failed", "category_delete_failed": "Category deletion failed", "category_type_invalid": "Invalid category type, must be 1 (male) or 2 (female)", // Tag related "tag_query_failed": "Tag query failed", "tag_exists": "Tag already exists", "tag_create_failed": "Tag creation failed", "tag_not_found": "Tag not found", "tag_update_failed": "Tag update failed", "tag_delete_failed": "Tag deletion failed", // Chapter related "chapter_query_failed": "Chapter query failed", "chapter_create_failed": "Chapter creation failed", "chapter_update_failed": "Chapter update failed", "chapter_delete_failed": "Chapter deletion failed", // Feedback related "feedback_create_failed": "Feedback creation failed", // ReadRecord related "read_record_create_failed": "Read record creation failed", "read_record_query_failed": "Read record query failed", "read_record_not_found": "Read record not found", "read_record_delete_failed": "Read record deletion failed", // UserFollowAuthor related "user_follow_author_query_failed": "User follow author query failed", "user_follow_author_exists": "Already followed this author", "user_follow_author_create_failed": "User follow author creation failed", "user_follow_author_not_found": "Follow record not found", "user_follow_author_delete_failed": "Unfollow failed", }, } // GetLanguage 从请求头或查询参数获取语言设置 func GetLanguage(ctx context.Context) string { // 优先从请求头获取 if r := g.RequestFromCtx(ctx); r != nil { // 从 Accept-Language 头获取 acceptLang := r.GetHeader("Accept-Language") if acceptLang != "" { lang := parseAcceptLanguage(acceptLang) if isSupportedLanguage(lang) { return lang } } // 从查询参数获取 lang := r.Get("lang").String() if isSupportedLanguage(lang) { return lang } // 从请求头获取自定义语言头 lang = r.GetHeader("X-Language") if isSupportedLanguage(lang) { return lang } } return DefaultLanguage } // T 翻译消息 func T(ctx context.Context, key string) string { lang := GetLanguage(ctx) if messages, exists := languageMap[lang]; exists { if message, exists := messages[key]; exists { return message } } // 如果当前语言没有找到,尝试默认语言 if lang != DefaultLanguage { if messages, exists := languageMap[DefaultLanguage]; exists { if message, exists := messages[key]; exists { return message } } } // 如果都没有找到,返回key本身 return key } // Tf 翻译消息并格式化 func Tf(ctx context.Context, key string, args ...interface{}) string { message := T(ctx, key) if len(args) > 0 { message = fmt.Sprintf(message, args...) } return message } // isSupportedLanguage 检查是否为支持的语言 func isSupportedLanguage(lang string) bool { for _, supported := range SupportedLanguages { if supported == lang { return true } } return false } // parseAcceptLanguage 解析Accept-Language头 func parseAcceptLanguage(acceptLang string) string { // 简单的解析,取第一个语言代码 parts := strings.Split(acceptLang, ",") if len(parts) > 0 { lang := strings.TrimSpace(parts[0]) // 移除质量值 if idx := strings.Index(lang, ";"); idx != -1 { lang = lang[:idx] } return lang } return "" } // GetSupportedLanguages 获取支持的语言列表 func GetSupportedLanguages() []string { return SupportedLanguages }