mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-10-13 10:26:38 +08:00
feat(frontend): 控制台 next-intl 中英双语
接入无 URL 前缀的 zh-CN/en,顶栏与外观设置可切换语言;选择写入 cookie 后刷新生效。
This commit is contained in:
@@ -19,43 +19,43 @@ export const PAGE_SIZE_OPTIONS = [20, 50, 100, 200];
|
||||
|
||||
export const OVERVIEW_RANGE_OPTIONS: {
|
||||
value: OverviewRangeHours;
|
||||
label: string;
|
||||
labelKey: `range.h${OverviewRangeHours}`;
|
||||
}[] = [
|
||||
{ value: 24, label: '24 小时' },
|
||||
{ value: 168, label: '7 天' },
|
||||
{ value: 360, label: '15 天' },
|
||||
{ value: 720, label: '30 天' },
|
||||
{ value: 24, labelKey: 'range.h24' },
|
||||
{ value: 168, labelKey: 'range.h168' },
|
||||
{ value: 360, labelKey: 'range.h360' },
|
||||
{ value: 720, labelKey: 'range.h720' },
|
||||
];
|
||||
|
||||
export const RATE_LIMIT_RANGE_OPTIONS: {
|
||||
value: RateLimitRangeHours;
|
||||
label: string;
|
||||
labelKey: 'range.h24' | 'range.h72';
|
||||
}[] = [
|
||||
{ value: 24, label: '24 小时' },
|
||||
{ value: 72, label: '3 天' },
|
||||
{ value: 24, labelKey: 'range.h24' },
|
||||
{ value: 72, labelKey: 'range.h72' },
|
||||
];
|
||||
|
||||
export const DETAIL_SORT_OPTIONS = [
|
||||
{ value: 'logged_at:desc', label: '时间从新到旧' },
|
||||
{ value: 'logged_at:asc', label: '时间从旧到新' },
|
||||
{ value: 'status_code:desc', label: '状态码从高到低' },
|
||||
{ value: 'status_code:asc', label: '状态码从低到高' },
|
||||
{ value: 'remote_addr:asc', label: 'IP 正序' },
|
||||
{ value: 'remote_addr:desc', label: 'IP 倒序' },
|
||||
];
|
||||
{ value: 'logged_at:desc', labelKey: 'sort.logged_at:desc' },
|
||||
{ value: 'logged_at:asc', labelKey: 'sort.logged_at:asc' },
|
||||
{ value: 'status_code:desc', labelKey: 'sort.status_code:desc' },
|
||||
{ value: 'status_code:asc', labelKey: 'sort.status_code:asc' },
|
||||
{ value: 'remote_addr:asc', labelKey: 'sort.remote_addr:asc' },
|
||||
{ value: 'remote_addr:desc', labelKey: 'sort.remote_addr:desc' },
|
||||
] as const;
|
||||
|
||||
export const IP_SORT_OPTIONS = [
|
||||
{ value: 'total_requests:desc', label: '请求数从高到低' },
|
||||
{ value: 'total_requests:asc', label: '请求数从低到高' },
|
||||
{ value: 'request_length:desc', label: '入站从高到低' },
|
||||
{ value: 'request_length:asc', label: '入站从低到高' },
|
||||
{ value: 'bytes_sent:desc', label: '出站从高到低' },
|
||||
{ value: 'bytes_sent:asc', label: '出站从低到高' },
|
||||
{ value: 'success_ratio:desc', label: '2xx 比例从高到低' },
|
||||
{ value: 'success_ratio:asc', label: '2xx 比例从低到高' },
|
||||
{ value: 'last_seen_at:desc', label: '最后访问从新到旧' },
|
||||
{ value: 'last_seen_at:asc', label: '最后访问从旧到新' },
|
||||
];
|
||||
{ value: 'total_requests:desc', labelKey: 'sort.total_requests:desc' },
|
||||
{ value: 'total_requests:asc', labelKey: 'sort.total_requests:asc' },
|
||||
{ value: 'request_length:desc', labelKey: 'sort.request_length:desc' },
|
||||
{ value: 'request_length:asc', labelKey: 'sort.request_length:asc' },
|
||||
{ value: 'bytes_sent:desc', labelKey: 'sort.bytes_sent:desc' },
|
||||
{ value: 'bytes_sent:asc', labelKey: 'sort.bytes_sent:asc' },
|
||||
{ value: 'success_ratio:desc', labelKey: 'sort.success_ratio:desc' },
|
||||
{ value: 'success_ratio:asc', labelKey: 'sort.success_ratio:asc' },
|
||||
{ value: 'last_seen_at:desc', labelKey: 'sort.last_seen_at:desc' },
|
||||
{ value: 'last_seen_at:asc', labelKey: 'sort.last_seen_at:asc' },
|
||||
] as const;
|
||||
|
||||
export function parseSortValue(value: string) {
|
||||
const [sortBy = 'logged_at', sortOrder = 'desc'] = value.split(':');
|
||||
@@ -72,10 +72,16 @@ export function formatCompactNumber(value: number) {
|
||||
}).format(value);
|
||||
}
|
||||
|
||||
export function formatOverviewRangeHint(hours: number) {
|
||||
if (hours <= 24) return '近 24 小时';
|
||||
if (hours % 24 === 0) return `近 ${hours / 24} 天`;
|
||||
return `近 ${hours} 小时`;
|
||||
export function formatOverviewRangeHint(
|
||||
hours: number,
|
||||
t: (
|
||||
key: 'rangeHint.hours24' | 'rangeHint.days' | 'rangeHint.hours',
|
||||
values?: { count: number },
|
||||
) => string,
|
||||
) {
|
||||
if (hours <= 24) return t('rangeHint.hours24');
|
||||
if (hours % 24 === 0) return t('rangeHint.days', { count: hours / 24 });
|
||||
return t('rangeHint.hours', { count: hours });
|
||||
}
|
||||
|
||||
export function formatOverviewTrendLabel(value: string, hours: number) {
|
||||
@@ -112,13 +118,9 @@ export function resolveCacheOutcome(
|
||||
return 'uncached';
|
||||
}
|
||||
|
||||
export function cacheOutcomeLabel(outcome: CacheOutcome) {
|
||||
switch (outcome) {
|
||||
case 'hit':
|
||||
return '命中';
|
||||
case 'origin':
|
||||
return '回源';
|
||||
default:
|
||||
return '未缓存';
|
||||
}
|
||||
export function cacheOutcomeLabel(
|
||||
outcome: CacheOutcome,
|
||||
t: (key: `cache.${CacheOutcome}`) => string,
|
||||
) {
|
||||
return t(`cache.${outcome}`);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user