using System.Globalization;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Primitives;
namespace Rainbow.Web;
/// <summary>API 错误消息多语言支持。根据 Accept-Language 请求头自动选择中文/英文。</summary>
public static class ApiMessages
{
/// <summary>当前请求的语言(zh 或 en)</summary>
public static String GetLanguage(HttpContext? context)
{
if (context == null) return "zh";
var acceptLang = context.Request.Headers.AcceptLanguage;
if (acceptLang.Count == 0) return "zh";
// 解析第一个语言标签
var firstLang = acceptLang[0]?.Split(',')[0]?.Trim();
if (String.IsNullOrEmpty(firstLang)) return "zh";
return firstLang.StartsWith("en") ? "en" : "zh";
}
/// <summary>获取本地化消息</summary>
public static String Get(HttpContext? context, String zh, String en)
{
return GetLanguage(context) == "en" ? en : zh;
}
// ── 通用错误消息 ──
public static String NotFound(HttpContext? ctx, String entity) =>
Get(ctx, $"{entity}不存在", $"{entity} not found");
public static String BadRequest(HttpContext? ctx, String detail) =>
Get(ctx, $"请求参数错误:{detail}", $"Invalid request: {detail}");
public static String Unauthorized(HttpContext? ctx) =>
Get(ctx, "未登录或登录已过期", "Not authenticated or session expired");
public static String Forbidden(HttpContext? ctx) =>
Get(ctx, "无权限访问该资源", "Access denied");
public static String ServerError(HttpContext? ctx) =>
Get(ctx, "服务器内部错误,请稍后重试", "Internal server error, please try again later");
public static String NetworkError(HttpContext? ctx) =>
Get(ctx, "无法连接到服务器", "Cannot connect to server");
// ── 业务错误消息 ──
public static String DeviceNotFound(HttpContext? ctx) =>
Get(ctx, "设备不存在", "Device not found");
public static String MemberNotFound(HttpContext? ctx) =>
Get(ctx, "成员不存在", "Member not found");
public static String GroupNotFound(HttpContext? ctx) =>
Get(ctx, "分组不存在", "Group not found");
public static String MacInUse(HttpContext? ctx) =>
Get(ctx, "MAC 地址已被其他绑定使用", "MAC address is already in use");
public static String IpInUse(HttpContext? ctx) =>
Get(ctx, "IP 地址已被其他绑定使用", "IP address is already in use");
public static String NameRequired(HttpContext? ctx) =>
Get(ctx, "名称为必填项", "Name is required");
public static String OperationSuccess(HttpContext? ctx) =>
Get(ctx, "操作成功", "Operation succeeded");
public static String OperationFailed(HttpContext? ctx) =>
Get(ctx, "操作失败", "Operation failed");
public static String ConfigBackupSuccess(HttpContext? ctx) =>
Get(ctx, "配置已备份", "Configuration backed up");
public static String ConfigBackupFailed(HttpContext? ctx) =>
Get(ctx, "备份失败", "Backup failed");
public static String ConfigRollbackSuccess(HttpContext? ctx) =>
Get(ctx, "配置已回滚", "Configuration rolled back");
public static String ImportSuccess(HttpContext? ctx, Int32 added, Int32 skipped) =>
Get(ctx, $"导入完成:新增 {added} 条,跳过 {skipped} 条(已存在)", $"Import complete: {added} added, {skipped} skipped (duplicates)");
public static String ImportFailed(HttpContext? ctx) =>
Get(ctx, "导入失败,请检查数据格式", "Import failed, please check data format");
public static String BulkImportEmpty(HttpContext? ctx) =>
Get(ctx, "导入数据不能为空", "Import data cannot be empty");
}
|