初始化项目框架,完成部分接口开发
This commit is contained in:
275
utility/i18n/i18n.go
Normal file
275
utility/i18n/i18n.go
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user