Files
novel_server/utility/i18n/i18n.go

531 lines
22 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package i18n
import (
"context"
"fmt"
"strings"
"sync"
"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": "未知错误",
"user_id_invalid": "用户ID无效请重新登录",
// 用户相关
"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": "未找到该邮箱注册账户",
"user_id_required": "用户ID不能为空",
"user_query_failed": "用户查询失败",
"purchase_query_failed": "购买记录查询失败",
"score_deduction_failed": "积分扣除失败",
"purchase_record_failed": "购买记录创建失败",
// 管理员相关
"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": "章节已锁定,需要积分解锁",
"book_id_required": "书籍ID不能为空",
// 分类相关
"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": "章节删除失败",
"chapter_book_id_required": "书籍ID不能为空",
"chapter_id_required": "章节ID不能为空",
"point_log_failed": "积分日志记录失败",
"purchase_id_failed": "获取购买记录ID失败",
"progress_invalid": "阅读进度无效必须在0-100之间",
"read_record_update_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": "取消关注失败",
"user_follow_author_update_failed": "关注作者更新失败",
// 作者相关
"author_query_failed": "作者查询失败",
"author_user_exists": "该用户已绑定作者",
"author_create_failed": "作者创建失败",
"author_not_found": "作者不存在",
"author_update_failed": "作者更新失败",
"author_delete_failed": "作者删除失败",
"author_info_failed": "获取作者信息失败",
"not_author": "当前用户不是作者",
"author_id_required": "作者ID不能为空",
"author_review_failed": "作者审核失败",
"author_review_status_invalid": "审核状态无效",
"author_review_remark_too_long": "审核备注过长",
// 书架相关
"bookshelve_query_failed": "书架查询失败",
"bookshelve_exists": "该书已在书架中",
"bookshelve_create_failed": "加入书架失败",
"bookshelve_bookids_empty": "请选择要移除的书籍",
"bookshelve_delete_failed": "移除书架失败",
// 评分相关
"rating_invalid": "评分无效必须在1-10分之间",
"rating_query_failed": "评分查询失败",
"rating_update_failed": "评分更新失败",
"rating_create_failed": "评分创建失败",
"rating_calculation_failed": "评分计算失败",
"book_rating_update_failed": "书籍评分更新失败",
// 我的书籍列表相关
"type_invalid": "类型参数无效必须为1-3",
"bookshelf_query_failed": "书架查询失败",
"history_query_failed": "历史记录查询失败",
"history_create_failed": "历史记录创建失败",
"history_delete_failed": "历史记录删除失败",
"history_bookids_empty": "请选择要删除的历史记录",
"history_update_failed": "历史记录更新失败",
"bookshelf_update_failed": "书架更新失败",
"chapter_count_failed": "章节统计失败",
"read_chapter_count_failed": "已读章节统计失败",
// 图片上传相关
"image_file_required": "图片文件不能为空",
"image_type_invalid": "只允许上传图片文件",
"image_format_invalid": "仅支持 jpg、png、gif、webp 格式的图片",
"image_size_exceeded": "图片大小不能超过1MB",
"image_read_failed": "无法读取图片内容",
"image_upload_failed": "图片上传失败",
// 推荐相关
"book_recommendation_query_failed": "推荐查询失败",
"book_recommendation_exists": "该类型下该书籍已存在推荐",
"book_recommendation_create_failed": "推荐创建失败",
"book_recommendation_not_found": "推荐不存在",
"book_recommendation_update_failed": "推荐更新失败",
"book_recommendation_delete_failed": "推荐删除失败",
// 签到奖励规则相关
"sign_in_reward_rule_query_failed": "签到奖励规则查询失败",
"sign_in_reward_rule_exists": "规则名称已存在",
"sign_in_reward_rule_create_failed": "签到奖励规则创建失败",
"sign_in_reward_rule_not_found": "签到奖励规则不存在",
"sign_in_reward_rule_update_failed": "签到奖励规则更新失败",
"sign_in_reward_rule_delete_failed": "签到奖励规则删除失败",
// 签到奖励明细相关
"sign_in_reward_detail_query_failed": "签到奖励明细查询失败",
"sign_in_reward_detail_exists": "该规则下该天奖励已存在",
"sign_in_reward_detail_create_failed": "签到奖励明细创建失败",
"sign_in_reward_detail_not_found": "签到奖励明细不存在",
"sign_in_reward_detail_update_failed": "签到奖励明细更新失败",
"sign_in_reward_detail_delete_failed": "签到奖励明细删除失败",
// 签到日志相关
"user_sign_in_log_query_failed": "签到日志查询失败",
"user_sign_in_log_create_failed": "签到日志创建失败",
"user_points_log_create_failed": "积分日志创建失败",
"user_points_update_failed": "用户积分更新失败",
// 用户阅读历史相关
"user_read_history_query_failed": "历史记录查询失败",
"user_read_history_update_failed": "历史记录更新失败",
"user_read_history_create_failed": "历史记录创建失败",
"user_read_history_delete_failed": "历史记录删除失败",
"user_read_history_not_found": "历史记录不存在",
"user_id_or_book_id_or_chapter_id_invalid": "用户ID、书籍ID或章节ID无效",
"user_id_or_book_ids_invalid": "用户ID或书籍ID列表无效",
// 任务相关
"task_query_failed": "任务查询失败",
"task_add_failed": "任务添加失败",
"task_edit_failed": "任务编辑失败",
"task_delete_failed": "任务删除失败",
"task_not_found": "任务不存在",
"task_log_query_failed": "任务日志查询失败",
// 任务类型相关
"task_type_query_failed": "任务类型查询失败",
"task_type_add_failed": "任务类型添加失败",
"task_type_edit_failed": "任务类型编辑失败",
"task_type_delete_failed": "任务类型删除失败",
"task_type_not_found": "任务类型不存在",
},
"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_id_invalid": "Invalid user ID, please re-login",
// 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",
"user_id_required": "User ID cannot be empty",
"user_query_failed": "User query failed",
"purchase_query_failed": "Purchase record query failed",
"score_deduction_failed": "Score deduction failed",
"purchase_record_failed": "Purchase record creation failed",
// 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",
"book_id_required": "Book ID cannot be empty",
// 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",
"chapter_book_id_required": "Book ID cannot be empty",
"chapter_id_required": "Chapter ID cannot be empty",
"point_log_failed": "Point log creation failed",
"purchase_id_failed": "Failed to get purchase record ID",
"progress_invalid": "Reading progress is invalid, must be between 0 and 100",
"read_record_query_failed": "Read record query failed",
"read_record_update_failed": "Read record update failed",
"read_record_create_failed": "Read record creation failed",
// Feedback related
"feedback_create_failed": "Feedback creation failed",
// ReadRecord related
"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",
// Author related
"author_query_failed": "Author query failed",
"author_user_exists": "User already has an author profile",
"author_create_failed": "Author creation failed",
"author_not_found": "Author not found",
"author_update_failed": "Author update failed",
"author_delete_failed": "Author deletion failed",
"author_info_failed": "Failed to get author info",
"not_author": "Current user is not an author",
"author_id_required": "Author ID cannot be empty",
"author_review_failed": "Author review failed",
"author_review_status_invalid": "Invalid review status",
"author_review_remark_too_long": "Review remark is too long",
"user_follow_author_update_failed": "Author update failed",
// Bookshelve related
"bookshelve_query_failed": "Bookshelf query failed",
"bookshelve_exists": "Book already in bookshelf",
"bookshelve_create_failed": "Failed to add to bookshelf",
"bookshelve_bookids_empty": "Please select books to remove",
"bookshelve_delete_failed": "Failed to remove from bookshelf",
// 评分相关
"rating_invalid": "Rating is invalid, must be between 1-10",
"rating_query_failed": "Rating query failed",
"rating_update_failed": "Rating update failed",
"rating_create_failed": "Rating creation failed",
"rating_calculation_failed": "Rating calculation failed",
"book_rating_update_failed": "Book rating update failed",
// 我的书籍列表相关
"type_invalid": "Type parameter is invalid, must be 1-3",
"bookshelf_query_failed": "Bookshelf query failed",
"history_query_failed": "History query failed",
"history_create_failed": "History creation failed",
"history_delete_failed": "History deletion failed",
"history_bookids_empty": "Please select history records to delete",
"history_update_failed": "History update failed",
"bookshelf_update_failed": "Bookshelf update failed",
"chapter_count_failed": "Chapter count failed",
"read_chapter_count_failed": "Read chapter count failed",
// 图片上传相关
"image_file_required": "Image file is required",
"image_type_invalid": "Only image files are allowed",
"image_format_invalid": "Only jpg, png, gif, webp formats are supported",
"image_size_exceeded": "Image size cannot exceed 1MB",
"image_read_failed": "Failed to read image file",
"image_upload_failed": "Image upload failed",
// Recommendation related
"book_recommendation_query_failed": "Recommendation query failed",
"book_recommendation_exists": "The book already exists in this recommendation type",
"book_recommendation_create_failed": "Recommendation creation failed",
"book_recommendation_not_found": "Recommendation not found",
"book_recommendation_update_failed": "Recommendation update failed",
"book_recommendation_delete_failed": "Recommendation deletion failed",
// 签到奖励规则相关
"sign_in_reward_rule_query_failed": "Sign-in reward rule query failed",
"sign_in_reward_rule_exists": "Rule name already exists",
"sign_in_reward_rule_create_failed": "Sign-in reward rule creation failed",
"sign_in_reward_rule_not_found": "Sign-in reward rule not found",
"sign_in_reward_rule_update_failed": "Sign-in reward rule update failed",
"sign_in_reward_rule_delete_failed": "Sign-in reward rule deletion failed",
// Sign-in reward detail related
"sign_in_reward_detail_query_failed": "Sign-in reward detail query failed",
"sign_in_reward_detail_exists": "Reward for this day already exists under the rule",
"sign_in_reward_detail_create_failed": "Sign-in reward detail creation failed",
"sign_in_reward_detail_not_found": "Sign-in reward detail not found",
"sign_in_reward_detail_update_failed": "Sign-in reward detail update failed",
"sign_in_reward_detail_delete_failed": "Sign-in reward detail deletion failed",
// Sign-in log related
"user_sign_in_log_query_failed": "Sign-in log query failed",
"user_sign_in_log_create_failed": "Sign-in log creation failed",
"user_points_log_create_failed": "Points log creation failed",
"user_points_update_failed": "User points update failed",
// User read history related
"user_read_history_query_failed": "Read history query failed",
"user_read_history_update_failed": "Read history update failed",
"user_read_history_create_failed": "Read history creation failed",
"user_read_history_delete_failed": "Read history deletion failed",
"user_read_history_not_found": "Read history not found",
"user_id_or_book_id_or_chapter_id_invalid": "User ID, Book ID or Chapter ID is invalid",
"user_id_or_book_ids_invalid": "User ID or Book IDs is invalid",
// Task related
"task_query_failed": "Task query failed",
"task_add_failed": "Task add failed",
"task_edit_failed": "Task edit failed",
"task_delete_failed": "Task delete failed",
"task_not_found": "Task not found",
"task_log_query_failed": "Task log query failed",
// TaskType related
"task_type_query_failed": "Task type query failed",
"task_type_add_failed": "Task type add failed",
"task_type_edit_failed": "Task type edit failed",
"task_type_delete_failed": "Task type delete failed",
"task_type_not_found": "Task type not found",
},
}
// I18n 单例结构体
type I18n struct {
languageMap map[string]map[string]string
mu sync.RWMutex
}
var (
instance *I18n
once sync.Once
)
// GetInstance 获取单例实例
func GetInstance() *I18n {
once.Do(func() {
instance = &I18n{
languageMap: languageMap,
}
})
return instance
}
// init 初始化函数
func init() {
// 确保单例实例被创建
GetInstance()
}
// GetLanguage 从请求头或查询参数获取语言设置
func (i *I18n) 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 (i *I18n) T(ctx context.Context, key string) string {
lang := i.GetLanguage(ctx)
i.mu.RLock()
defer i.mu.RUnlock()
if messages, exists := i.languageMap[lang]; exists {
if message, exists := messages[key]; exists {
return message
}
}
// 如果当前语言没有找到,尝试默认语言
if lang != DefaultLanguage {
if messages, exists := i.languageMap[DefaultLanguage]; exists {
if message, exists := messages[key]; exists {
return message
}
}
}
// 如果都没有找到返回key本身
return key
}
// Tf 翻译消息并格式化
func (i *I18n) Tf(ctx context.Context, key string, args ...interface{}) string {
message := i.T(ctx, key)
if len(args) > 0 {
message = fmt.Sprintf(message, args...)
}
return message
}
// 为了保持向后兼容,提供全局函数
func GetLanguage(ctx context.Context) string {
return GetInstance().GetLanguage(ctx)
}
func T(ctx context.Context, key string) string {
return GetInstance().T(ctx, key)
}
func Tf(ctx context.Context, key string, args ...interface{}) string {
return GetInstance().Tf(ctx, key, args...)
}
// 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
}