初始化项目框架,完成部分接口开发

This commit is contained in:
2025-07-10 21:04:29 +08:00
commit b2871ec0d2
168 changed files with 6399 additions and 0 deletions

275
utility/i18n/i18n.go Normal file
View File

@ -0,0 +1,275 @@
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
}