Просмотр исходного кода

fix:重新调整模型定价页面进去直接同步上游渠道模型而后查询,数据看板中默认隐藏偏好设置

韩洋 3 недель назад
Родитель
Сommit
716cc545b1
31 измененных файлов с 2070 добавлено и 341 удалено
  1. 0 188
      default/src/features/dashboard/components/models/models-chart-preferences.tsx
  2. 3 3
      default/src/features/dashboard/constants.ts
  3. 9 25
      default/src/features/dashboard/index.tsx
  4. 1 61
      default/src/features/dashboard/lib/filters.ts
  5. 255 0
      default/src/features/model-pricing/hooks/use-auto-upstream-sync.ts
  6. 38 4
      default/src/features/model-pricing/index.tsx
  7. 1 1
      default/src/features/system-settings/billing/section-registry.tsx
  8. 2 2
      default/src/features/system-settings/components/settings-section.tsx
  9. 2 2
      default/src/features/system-settings/models/model-pricing-inputs.tsx
  10. 1 1
      default/src/features/system-settings/models/model-pricing-sheet.tsx
  11. 1 1
      default/src/features/system-settings/models/ratio-settings-card.tsx
  12. 3 3
      default/src/features/system-settings/models/tiered-pricing-editor.tsx
  13. 2 2
      default/src/features/system-settings/models/tool-price-settings.tsx
  14. 4 0
      default/src/i18n/locales/_extras/fr.extras.json
  15. 4 0
      default/src/i18n/locales/_extras/ja.extras.json
  16. 4 0
      default/src/i18n/locales/_extras/ru.extras.json
  17. 4 0
      default/src/i18n/locales/_extras/vi.extras.json
  18. 4 0
      default/src/i18n/locales/_extras/zh-TW.extras.json
  19. 15 15
      default/src/i18n/locales/_reports/_sync-report.json
  20. 61 0
      default/src/i18n/locales/_reports/fr.untranslated.json
  21. 223 0
      default/src/i18n/locales/_reports/ja.untranslated.json
  22. 223 0
      default/src/i18n/locales/_reports/ru.untranslated.json
  23. 61 0
      default/src/i18n/locales/_reports/vi.untranslated.json
  24. 5 0
      default/src/i18n/locales/_reports/zh.untranslated.json
  25. 5 5
      default/src/i18n/locales/en.json
  26. 226 4
      default/src/i18n/locales/fr.json
  27. 226 4
      default/src/i18n/locales/ja.json
  28. 226 4
      default/src/i18n/locales/ru.json
  29. 226 4
      default/src/i18n/locales/vi.json
  30. 226 5
      default/src/i18n/locales/zh-TW.json
  31. 9 7
      default/src/i18n/locales/zh.json

+ 0 - 188
default/src/features/dashboard/components/models/models-chart-preferences.tsx

@@ -1,188 +0,0 @@
-/*
-Copyright (C) 2023-2026 QuantumNous
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as
-published by the Free Software Foundation, either version 3 of the
-License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program. If not, see <https://www.gnu.org/licenses/>.
-
-For commercial licensing, please contact support@quantumnous.com
-*/
-import { Save, Settings2 } from 'lucide-react'
-import { useState } from 'react'
-import { useTranslation } from 'react-i18next'
-
-import { Dialog } from '@/components/dialog'
-import { Button } from '@/components/ui/button'
-import { Label } from '@/components/ui/label'
-import {
-  Select,
-  SelectContent,
-  SelectGroup,
-  SelectItem,
-  SelectTrigger,
-  SelectValue,
-} from '@/components/ui/select'
-import {
-  MODEL_ANALYTICS_CHART_OPTIONS,
-  TIME_GRANULARITY_OPTIONS,
-  TIME_RANGE_PRESETS,
-} from '@/features/dashboard/constants'
-import type {
-  DashboardChartPreferences,
-  ModelAnalyticsChartTab,
-} from '@/features/dashboard/types'
-import type { TimeGranularity } from '@/lib/time'
-
-interface ModelsChartPreferencesProps {
-  preferences: DashboardChartPreferences
-  onPreferencesChange: (preferences: DashboardChartPreferences) => void
-}
-
-export function ModelsChartPreferences(props: ModelsChartPreferencesProps) {
-  const { t } = useTranslation()
-  const [open, setOpen] = useState(false)
-  const [draft, setDraft] = useState<DashboardChartPreferences>(
-    props.preferences
-  )
-
-  const handleOpenChange = (nextOpen: boolean) => {
-    if (nextOpen) setDraft(props.preferences)
-    setOpen(nextOpen)
-  }
-
-  const handleSave = () => {
-    props.onPreferencesChange(draft)
-    setOpen(false)
-  }
-
-  return (
-    <Dialog
-      open={open}
-      onOpenChange={handleOpenChange}
-      trigger={
-        <Button variant='outline' size='sm'>
-          <Settings2 className='mr-2 h-4 w-4' />
-          {t('Preferences')}
-        </Button>
-      }
-      title={t('Model Analytics Defaults')}
-      description={t('Set default ranges and charts for model analytics.')}
-      contentClassName='sm:max-w-md'
-      contentHeight='auto'
-      bodyClassName='grid gap-3'
-      footer={
-        <Button onClick={handleSave} type='button'>
-          <Save className='mr-2 h-4 w-4' />
-          {t('Save Preferences')}
-        </Button>
-      }
-    >
-      <div className='grid gap-1.5'>
-        <Label htmlFor='default-time-range'>{t('Default range')}</Label>
-        <Select
-          items={[
-            ...TIME_RANGE_PRESETS.map((option) => ({
-              value: String(option.days),
-              label: t(option.label),
-            })),
-          ]}
-          value={String(draft.defaultTimeRangeDays)}
-          onValueChange={(value) =>
-            setDraft((prev) => ({
-              ...prev,
-              defaultTimeRangeDays: Number(value),
-            }))
-          }
-        >
-          <SelectTrigger id='default-time-range'>
-            <SelectValue placeholder={t('Select default range')} />
-          </SelectTrigger>
-          <SelectContent alignItemWithTrigger={false}>
-            <SelectGroup>
-              {TIME_RANGE_PRESETS.map((option) => (
-                <SelectItem key={option.days} value={String(option.days)}>
-                  {t(option.label)}
-                </SelectItem>
-              ))}
-            </SelectGroup>
-          </SelectContent>
-        </Select>
-      </div>
-      <div className='grid gap-1.5'>
-        <Label htmlFor='default-time-granularity'>
-          {t('Default time granularity')}
-        </Label>
-        <Select
-          items={[
-            ...TIME_GRANULARITY_OPTIONS.map((option) => ({
-              value: option.value,
-              label: t(option.label),
-            })),
-          ]}
-          value={draft.defaultTimeGranularity}
-          onValueChange={(value) =>
-            setDraft((prev) => ({
-              ...prev,
-              defaultTimeGranularity: value as TimeGranularity,
-            }))
-          }
-        >
-          <SelectTrigger id='default-time-granularity'>
-            <SelectValue placeholder={t('Select time granularity')} />
-          </SelectTrigger>
-          <SelectContent alignItemWithTrigger={false}>
-            <SelectGroup>
-              {TIME_GRANULARITY_OPTIONS.map((option) => (
-                <SelectItem key={option.value} value={option.value}>
-                  {t(option.label)}
-                </SelectItem>
-              ))}
-            </SelectGroup>
-          </SelectContent>
-        </Select>
-      </div>
-      <div className='grid gap-1.5'>
-        <Label htmlFor='model-analytics-chart'>
-          {t('Default model call chart')}
-        </Label>
-        <Select
-          items={[
-            ...MODEL_ANALYTICS_CHART_OPTIONS.map((option) => ({
-              value: option.value,
-              label: t(option.labelKey),
-            })),
-          ]}
-          value={draft.modelAnalyticsChart}
-          onValueChange={(value) =>
-            setDraft((prev) => ({
-              ...prev,
-              modelAnalyticsChart: value as ModelAnalyticsChartTab,
-            }))
-          }
-        >
-          <SelectTrigger id='model-analytics-chart'>
-            <SelectValue placeholder={t('Select default chart')} />
-          </SelectTrigger>
-          <SelectContent alignItemWithTrigger={false}>
-            <SelectGroup>
-              {MODEL_ANALYTICS_CHART_OPTIONS.map((option) => (
-                <SelectItem key={option.value} value={option.value}>
-                  {t(option.labelKey)}
-                </SelectItem>
-              ))}
-            </SelectGroup>
-          </SelectContent>
-        </Select>
-      </div>
-    </Dialog>
-  )
-}

+ 3 - 3
default/src/features/dashboard/constants.ts

@@ -21,13 +21,13 @@ import type { DashboardChartPreferences, DashboardFilters } from './types'
 export const TIME_GRANULARITY_STORAGE_KEY = 'data_export_default_time'
 export const DASHBOARD_CHART_PREFERENCES_STORAGE_KEY =
   'dashboard_models_chart_preferences'
-export const DEFAULT_TIME_GRANULARITY = 'hour' as const
+export const DEFAULT_TIME_GRANULARITY = 'day' as const
 export const MAX_CHART_TREND_POINTS = 7
 
 export const DEFAULT_DASHBOARD_CHART_PREFERENCES: DashboardChartPreferences = {
   consumptionDistributionChart: 'bar',
   modelAnalyticsChart: 'trend',
-  defaultTimeRangeDays: 1,
+  defaultTimeRangeDays: 7,
   defaultTimeGranularity: DEFAULT_TIME_GRANULARITY,
 }
 
@@ -68,7 +68,7 @@ export const MODEL_ANALYTICS_CHART_OPTIONS = [
 export const EMPTY_DASHBOARD_FILTERS: DashboardFilters = {
   start_timestamp: undefined,
   end_timestamp: undefined,
-  time_granularity: 'hour',
+  time_granularity: 'day',
   username: '',
   data_type: 'platform',
 }

+ 9 - 25
default/src/features/dashboard/index.tsx

@@ -35,7 +35,6 @@ import { ROLE } from '@/lib/roles'
 import { cn } from '@/lib/utils'
 import { useAuthStore } from '@/stores/auth-store'
 
-import { ModelsChartPreferences } from './components/models/models-chart-preferences'
 import { ModelsFilter } from './components/models/models-filter-dialog'
 import { DEFAULT_TIME_GRANULARITY } from './constants'
 import {
@@ -43,7 +42,6 @@ import {
   getDefaultDays,
   getSavedChartPreferences,
   getSavedGranularity,
-  saveChartPreferences,
 } from './lib'
 import {
   type DashboardSectionId,
@@ -166,8 +164,9 @@ export function Dashboard() {
 
   const [modelData, setModelData] = useState<DashboardDataItem[]>([])
   const [dataLoading, setDataLoading] = useState(false)
-  const [chartPreferences, setChartPreferences] =
-    useState<DashboardChartPreferences>(() => getSavedChartPreferences())
+  const [chartPreferences] = useState<DashboardChartPreferences>(() =>
+    getSavedChartPreferences()
+  )
   const [modelFilters, setModelFilters] = useState<DashboardFilters>(() =>
     buildDefaultDashboardFilters(getSavedChartPreferences())
   )
@@ -200,15 +199,6 @@ export function Dashboard() {
     []
   )
 
-  const handleChartPreferencesChange = useCallback(
-    (preferences: DashboardChartPreferences) => {
-      setChartPreferences(preferences)
-      setModelFilters(buildDefaultDashboardFilters(preferences))
-      saveChartPreferences(preferences)
-    },
-    []
-  )
-
   const meta = SECTION_META[activeSection] ?? SECTION_META.models
   const isAdmin = Boolean(userRole && userRole >= ROLE.ADMIN)
   const visibleSections = useMemo(
@@ -228,18 +218,12 @@ export function Dashboard() {
   const showSectionTabs = visibleSections.length > 1
   const modelActions =
     activeSection === 'models' ? (
-      <>
-        <ModelsChartPreferences
-          preferences={chartPreferences}
-          onPreferencesChange={handleChartPreferencesChange}
-        />
-        <ModelsFilter
-          preferences={chartPreferences}
-          currentFilters={modelFilters}
-          onFilterChange={handleFilterChange}
-          onReset={handleResetFilters}
-        />
-      </>
+      <ModelsFilter
+        preferences={chartPreferences}
+        currentFilters={modelFilters}
+        onFilterChange={handleFilterChange}
+        onReset={handleResetFilters}
+      />
     ) : null
   const flowActions =
     activeSection === 'flow' ? (

+ 1 - 61
default/src/features/dashboard/lib/filters.ts

@@ -19,46 +19,16 @@ For commercial licensing, please contact support@quantumnous.com
 import {
   DASHBOARD_CHART_PREFERENCES_STORAGE_KEY,
   DEFAULT_DASHBOARD_CHART_PREFERENCES,
-  DEFAULT_TIME_GRANULARITY,
   EMPTY_DASHBOARD_FILTERS,
   TIME_GRANULARITY_STORAGE_KEY,
-  TIME_RANGE_PRESETS,
   TIME_RANGE_BY_GRANULARITY,
 } from '@/features/dashboard/constants'
 import type {
-  ConsumptionDistributionChartType,
   DashboardChartPreferences,
   DashboardFilters,
-  ModelAnalyticsChartTab,
 } from '@/features/dashboard/types'
 import { getRollingDateRange, type TimeGranularity } from '@/lib/time'
 
-function isTimeGranularity(value: unknown): value is TimeGranularity {
-  return value === 'hour' || value === 'day' || value === 'week'
-}
-
-function getLegacySavedGranularity(): TimeGranularity {
-  if (typeof window === 'undefined') return DEFAULT_TIME_GRANULARITY
-  const saved = localStorage.getItem(TIME_GRANULARITY_STORAGE_KEY)
-  return isTimeGranularity(saved) ? saved : DEFAULT_TIME_GRANULARITY
-}
-
-function isConsumptionDistributionChartType(
-  value: unknown
-): value is ConsumptionDistributionChartType {
-  return value === 'bar' || value === 'area'
-}
-
-function isModelAnalyticsChartTab(
-  value: unknown
-): value is ModelAnalyticsChartTab {
-  return value === 'trend' || value === 'distribution'
-}
-
-function isTimeRangePresetDays(value: unknown): value is number {
-  return TIME_RANGE_PRESETS.some((preset) => preset.days === value)
-}
-
 export function cleanFilters<T extends Record<string, unknown>>(
   filters: T
 ): Partial<T> {
@@ -92,37 +62,7 @@ export function saveGranularity(granularity: TimeGranularity): void {
 }
 
 export function getSavedChartPreferences(): DashboardChartPreferences {
-  if (typeof window === 'undefined') return DEFAULT_DASHBOARD_CHART_PREFERENCES
-
-  const fallbackPreferences = {
-    ...DEFAULT_DASHBOARD_CHART_PREFERENCES,
-    defaultTimeGranularity: getLegacySavedGranularity(),
-  }
-
-  try {
-    const raw = localStorage.getItem(DASHBOARD_CHART_PREFERENCES_STORAGE_KEY)
-    if (!raw) return fallbackPreferences
-
-    const parsed = JSON.parse(raw) as Partial<DashboardChartPreferences>
-    return {
-      consumptionDistributionChart: isConsumptionDistributionChartType(
-        parsed.consumptionDistributionChart
-      )
-        ? parsed.consumptionDistributionChart
-        : fallbackPreferences.consumptionDistributionChart,
-      modelAnalyticsChart: isModelAnalyticsChartTab(parsed.modelAnalyticsChart)
-        ? parsed.modelAnalyticsChart
-        : fallbackPreferences.modelAnalyticsChart,
-      defaultTimeRangeDays: isTimeRangePresetDays(parsed.defaultTimeRangeDays)
-        ? parsed.defaultTimeRangeDays
-        : fallbackPreferences.defaultTimeRangeDays,
-      defaultTimeGranularity: isTimeGranularity(parsed.defaultTimeGranularity)
-        ? parsed.defaultTimeGranularity
-        : fallbackPreferences.defaultTimeGranularity,
-    }
-  } catch {
-    return fallbackPreferences
-  }
+  return DEFAULT_DASHBOARD_CHART_PREFERENCES
 }
 
 export function saveChartPreferences(

+ 255 - 0
default/src/features/model-pricing/hooks/use-auto-upstream-sync.ts

@@ -0,0 +1,255 @@
+import { useQueryClient } from '@tanstack/react-query'
+import { useCallback, useEffect, useRef, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { toast } from 'sonner'
+
+import {
+  fetchUpstreamRatios,
+  getUpstreamChannels,
+  updateSystemOption,
+} from '@/features/system-settings/api'
+import {
+  DEFAULT_ENDPOINT,
+  MODELS_DEV_PRESET_ENDPOINT,
+  MODELS_DEV_PRESET_ID,
+  OFFICIAL_CHANNEL_ENDPOINT,
+  OFFICIAL_CHANNEL_ID,
+} from '@/features/system-settings/models/constants'
+import {
+  NUMERIC_SYNC_FIELDS,
+  RATIO_SYNC_FIELDS,
+  applyResolutionSelections,
+  type ResolutionSelection,
+} from '@/features/system-settings/models/upstream-ratio-sync-helpers'
+import type { DifferencesMap, RatioType, UpstreamConfig } from '@/features/system-settings/types'
+
+export type AutoSyncModelRatios = {
+  ModelPrice: string
+  ModelRatio: string
+  CompletionRatio: string
+  CacheRatio: string
+  CreateCacheRatio: string
+  ImageRatio: string
+  AudioRatio: string
+  AudioCompletionRatio: string
+  'billing_setting.billing_mode': string
+  'billing_setting.billing_expr': string
+}
+
+export type SyncState = 'idle' | 'syncing' | 'done' | 'error'
+
+function parseJsonRecord<T>(raw: string): Record<string, T> {
+  try {
+    return JSON.parse(raw || '{}') as Record<string, T>
+  } catch {
+    return {} as Record<string, T>
+  }
+}
+
+function optionKeyBySyncField(ratioType: string): string {
+  const explicit: Record<string, string> = {
+    billing_mode: 'billing_setting.billing_mode',
+    billing_expr: 'billing_setting.billing_expr',
+  }
+  if (explicit[ratioType]) return explicit[ratioType]
+  return ratioType
+    .split('_')
+    .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
+    .join('')
+}
+
+function getDefaultEndpointForChannel(channelId: number): string {
+  if (channelId === MODELS_DEV_PRESET_ID) return MODELS_DEV_PRESET_ENDPOINT
+  if (channelId === OFFICIAL_CHANNEL_ID) return OFFICIAL_CHANNEL_ENDPOINT
+  return DEFAULT_ENDPOINT
+}
+
+/**
+ * 进入页面时自动从上游预设(官方倍率 + models.dev)同步模型价格,
+ * 自动应用所有差异,完成后刷新系统选项。
+ */
+export function useAutoUpstreamSync(
+  modelRatios: AutoSyncModelRatios,
+  enabled: boolean
+) {
+  const { t } = useTranslation()
+  const queryClient = useQueryClient()
+  const [syncState, setSyncState] = useState<SyncState>('idle')
+  const syncStartedRef = useRef(false)
+
+  const doSync = useCallback(async () => {
+    if (syncStartedRef.current) return
+    syncStartedRef.current = true
+    setSyncState('syncing')
+
+    try {
+      // 1. 获取可同步的上游渠道
+      const channelsRes = await getUpstreamChannels()
+      const channels = channelsRes.data ?? []
+
+      // 2. 筛选内置预设(官方倍率 + models.dev)
+      const presetChannels = channels.filter(
+        (ch) =>
+          ch.id === OFFICIAL_CHANNEL_ID || ch.id === MODELS_DEV_PRESET_ID
+      )
+
+      if (presetChannels.length === 0) {
+        setSyncState('done')
+        return
+      }
+
+      // 3. 构建上游请求配置
+      const upstreams: UpstreamConfig[] = presetChannels.map((ch) => ({
+        id: ch.id,
+        name: ch.name,
+        base_url: ch.base_url,
+        endpoint: getDefaultEndpointForChannel(ch.id),
+      }))
+
+      // 4. 拉取上游价格差异
+      const fetchRes = await fetchUpstreamRatios({ upstreams, timeout: 15 })
+      if (!fetchRes.success) {
+        throw new Error(fetchRes.message || 'Failed to fetch upstream ratios')
+      }
+
+      const differences: DifferencesMap = fetchRes.data.differences
+
+      if (!differences || Object.keys(differences).length === 0) {
+        setSyncState('done')
+        return
+      }
+
+      // 5. 自动选择所有差异项(取第一个可用上游值)
+      const selections: ResolutionSelection[] = []
+      Object.entries(differences).forEach(([model, ratioTypes]) => {
+        Object.entries(ratioTypes).forEach(([ratioTypeStr, diff]) => {
+          if (!diff) return
+          const ratioType = ratioTypeStr as RatioType
+          for (const [sourceName, value] of Object.entries(
+            diff.upstreams
+          )) {
+            if (value !== 'same' && value !== null && value !== undefined) {
+              selections.push({
+                model,
+                ratioType,
+                value: value as number | string,
+                sourceName,
+              })
+              break
+            }
+          }
+        })
+      })
+
+      if (selections.length === 0) {
+        setSyncState('done')
+        return
+      }
+
+      // 6. 构建 resolutions 映射
+      const resolutions = applyResolutionSelections(
+        {},
+        differences,
+        selections
+      )
+
+      // 7. 解析当前本地价格
+      const parsedRatios = {
+        ModelRatio: parseJsonRecord<number>(modelRatios.ModelRatio),
+        CompletionRatio: parseJsonRecord<number>(modelRatios.CompletionRatio),
+        CacheRatio: parseJsonRecord<number>(modelRatios.CacheRatio),
+        CreateCacheRatio: parseJsonRecord<number>(
+          modelRatios.CreateCacheRatio
+        ),
+        ImageRatio: parseJsonRecord<number>(modelRatios.ImageRatio),
+        AudioRatio: parseJsonRecord<number>(modelRatios.AudioRatio),
+        AudioCompletionRatio: parseJsonRecord<number>(
+          modelRatios.AudioCompletionRatio
+        ),
+        ModelPrice: parseJsonRecord<number>(modelRatios.ModelPrice),
+        'billing_setting.billing_mode': parseJsonRecord<string>(
+          modelRatios['billing_setting.billing_mode']
+        ),
+        'billing_setting.billing_expr': parseJsonRecord<string>(
+          modelRatios['billing_setting.billing_expr']
+        ),
+      }
+
+      // 8. 合并 resolutions 到最终价格表
+      const finalRatios: Record<string, Record<string, number | string>> = {
+        ModelRatio: { ...parsedRatios.ModelRatio },
+        CompletionRatio: { ...parsedRatios.CompletionRatio },
+        CacheRatio: { ...parsedRatios.CacheRatio },
+        CreateCacheRatio: { ...parsedRatios.CreateCacheRatio },
+        ImageRatio: { ...parsedRatios.ImageRatio },
+        AudioRatio: { ...parsedRatios.AudioRatio },
+        AudioCompletionRatio: { ...parsedRatios.AudioCompletionRatio },
+        ModelPrice: { ...parsedRatios.ModelPrice },
+        'billing_setting.billing_mode': {
+          ...parsedRatios['billing_setting.billing_mode'],
+        },
+        'billing_setting.billing_expr': {
+          ...parsedRatios['billing_setting.billing_expr'],
+        },
+      }
+
+      Object.entries(resolutions).forEach(([model, ratios]) => {
+        const selectedTypes = Object.keys(ratios)
+        const hasPrice = selectedTypes.includes('model_price')
+        const hasRatio = selectedTypes.some((rt) =>
+          RATIO_SYNC_FIELDS.includes(rt as RatioType)
+        )
+
+        if (hasPrice) {
+          delete finalRatios.ModelRatio[model]
+          delete finalRatios.CompletionRatio[model]
+          delete finalRatios.CacheRatio[model]
+          delete finalRatios.CreateCacheRatio[model]
+          delete finalRatios.ImageRatio[model]
+          delete finalRatios.AudioRatio[model]
+          delete finalRatios.AudioCompletionRatio[model]
+        }
+        if (hasRatio) {
+          delete finalRatios.ModelPrice[model]
+        }
+
+        Object.entries(ratios).forEach(([ratioType, value]) => {
+          const optionKey = optionKeyBySyncField(ratioType)
+          finalRatios[optionKey][model] = NUMERIC_SYNC_FIELDS.has(ratioType)
+            ? Number(value)
+            : value
+        })
+      })
+
+      // 9. 写入系统选项
+      const updates = Object.entries(finalRatios).map(([key, value]) => ({
+        key,
+        value: JSON.stringify(value, null, 2),
+      }))
+
+      for (const update of updates) {
+        await updateSystemOption(update)
+      }
+
+      // 10. 刷新系统选项缓存
+      await queryClient.invalidateQueries({ queryKey: ['system-options'] })
+
+      toast.success(t('Upstream prices synced successfully'))
+      setSyncState('done')
+    } catch (error) {
+      const message = error instanceof Error ? error.message : String(error)
+      toast.error(
+        t('Auto-sync failed: {{message}}', { message })
+      )
+      setSyncState('error')
+    }
+  }, [modelRatios, queryClient, t])
+
+  useEffect(() => {
+    if (enabled) {
+      doSync()
+    }
+  }, [enabled, doSync])
+
+  return { syncState }
+}

+ 38 - 4
default/src/features/model-pricing/index.tsx

@@ -18,14 +18,16 @@ For commercial licensing, please contact support@quantumnous.com
 */
 import { useMemo } from 'react'
 import { useTranslation } from 'react-i18next'
+import { Loader2, RefreshCcw } from 'lucide-react'
 
 import { SectionPageLayout } from '@/components/layout'
 
-import { SettingsPageProvider } from '@/features/system-settings/components/settings-page-context'
 import { useSystemOptions, getOptionValue } from '@/features/system-settings/hooks/use-system-options'
 import { getBillingSectionContent, getBillingSectionMeta, BILLING_DEFAULT_SECTION } from '@/features/system-settings/billing/section-registry'
 import type { BillingSettings } from '@/features/system-settings/types'
 
+import { useAutoUpstreamSync } from './hooks/use-auto-upstream-sync'
+
 const defaultBillingSettings: BillingSettings = {
   QuotaForNewUser: 0,
   PreConsumedQuota: 0,
@@ -118,18 +120,50 @@ export function ModelPricingPage() {
     [data?.data]
   )
 
+  // 提取模型价格相关字段,供自动同步使用
+  const modelRatios = useMemo(
+    () => ({
+      ModelPrice: settings.ModelPrice,
+      ModelRatio: settings.ModelRatio,
+      CompletionRatio: settings.CompletionRatio,
+      CacheRatio: settings.CacheRatio,
+      CreateCacheRatio: settings.CreateCacheRatio,
+      ImageRatio: settings.ImageRatio,
+      AudioRatio: settings.AudioRatio,
+      AudioCompletionRatio: settings.AudioCompletionRatio,
+      'billing_setting.billing_mode': settings['billing_setting.billing_mode'],
+      'billing_setting.billing_expr': settings['billing_setting.billing_expr'],
+    }),
+    [settings]
+  )
+
+  // 系统选项加载完成后自动触发上游同步
+  const { syncState } = useAutoUpstreamSync(modelRatios, !isLoading)
+
   const sectionMeta = getBillingSectionMeta(BILLING_DEFAULT_SECTION)
 
   const content = getBillingSectionContent(BILLING_DEFAULT_SECTION, settings)
 
+  const showSyncing = !isLoading && syncState === 'syncing'
+
   return (
     <SectionPageLayout>
       <SectionPageLayout.Title>{t(sectionMeta.titleKey)}</SectionPageLayout.Title>
       <SectionPageLayout.Content>
         <div className='flex h-full min-h-0 w-full flex-col gap-4'>
-          {isLoading ? (
-            <div className='text-muted-foreground flex min-h-40 items-center justify-center text-sm'>
-              {t('Loading settings...')}
+          {isLoading || showSyncing ? (
+            <div className='text-muted-foreground flex min-h-40 flex-col items-center justify-center gap-3 text-sm'>
+              {showSyncing ? (
+                <>
+                  <RefreshCcw className='h-5 w-5 animate-spin' />
+                  {t('Syncing upstream model prices...')}
+                </>
+              ) : (
+                <>
+                  <Loader2 className='h-5 w-5 animate-spin' />
+                  {t('Loading settings...')}
+                </>
+              )}
             </div>
           ) : (
             content

+ 1 - 1
default/src/features/system-settings/billing/section-registry.tsx

@@ -48,7 +48,7 @@ function buildModelPricingSection(settings: BillingSettings) {
           settings['group_ratio_setting.group_special_usable_group'],
       }}
       toolPricesDefault={settings['tool_price_setting.prices']}
-      visibleTabs={['models', 'unset-models', 'tool-prices', 'upstream-sync']}
+      visibleTabs={['models']}
     />
   )
 }

+ 2 - 2
default/src/features/system-settings/components/settings-section.tsx

@@ -21,7 +21,7 @@ import { cn } from '@/lib/utils'
 import { useSuppressSettingsSectionHeader } from './settings-page-context'
 
 type SettingsSectionProps = {
-  title: string
+  title?: string
   titleProps?: React.HTMLAttributes<HTMLHeadingElement>
   children: React.ReactNode
   className?: string
@@ -37,7 +37,7 @@ export function SettingsSection({
 
   return (
     <section className={cn('flex flex-col gap-4', className)}>
-      {!suppressHeader && (
+      {!suppressHeader && title && (
         <div className='flex flex-col gap-1'>
           <h3
             {...titleProps}

+ 2 - 2
default/src/features/system-settings/models/model-pricing-inputs.tsx

@@ -38,7 +38,7 @@ export function PriceInput(props: {
 }) {
   return (
     <InputGroup>
-      <InputGroupAddon>$</InputGroupAddon>
+      <InputGroupAddon></InputGroupAddon>
       <InputGroupInput
         inputMode='decimal'
         value={props.value}
@@ -46,7 +46,7 @@ export function PriceInput(props: {
         disabled={props.disabled}
         onChange={(event) => props.onChange(event.target.value)}
       />
-      <InputGroupAddon align='inline-end'>$/1M</InputGroupAddon>
+      <InputGroupAddon align='inline-end'>/1M</InputGroupAddon>
     </InputGroup>
   )
 }

+ 1 - 1
default/src/features/system-settings/models/model-pricing-sheet.tsx

@@ -595,7 +595,7 @@ export const ModelPricingEditorPanel = forwardRef<
                               <FieldLabel>{t('Fixed price')}</FieldLabel>
                               <FormControl>
                                 <InputGroup>
-                                  <InputGroupAddon>$</InputGroupAddon>
+                                  <InputGroupAddon></InputGroupAddon>
                                   <InputGroupInput
                                     inputMode='decimal'
                                     placeholder='0.01'

+ 1 - 1
default/src/features/system-settings/models/ratio-settings-card.tsx

@@ -469,7 +469,7 @@ export function RatioSettingsCard({
   return (
     <>
       {visibleTabs.length === 1 ? (
-        <SettingsSection title={t(titleKey)}>
+        <SettingsSection>
           {renderTabContent(defaultTab)}
         </SettingsSection>
       ) : (

+ 3 - 3
default/src/features/system-settings/models/tiered-pricing-editor.tsx

@@ -101,7 +101,7 @@ import {
 } from '@/features/pricing/lib/tier-expr'
 import { cn } from '@/lib/utils'
 
-const PRICE_SUFFIX = '$/1M tokens'
+const PRICE_SUFFIX = '/1M tokens'
 const CACHE_PRICE_VARS = BILLING_EXTRA_VARS.filter(
   (variable) => variable.group === 'cache'
 )
@@ -1513,7 +1513,7 @@ Important: len is NOT affected by auto-exclusion. Tier conditions should use len
 
 ### Price Coefficients
 
-Numbers in the expression are $/1M tokens prices. For example, p * 2.5 means input $2.50/1M tokens.
+Numbers in the expression are ¥/1M tokens prices. For example, p * 2.5 means input ¥2.50/1M tokens.
 
 ## Expression Examples
 
@@ -1547,7 +1547,7 @@ len <= 128000
 2. Use English tier names, e.g. "base", "standard", "long_context"
 3. Use len for tier conditions (not p), supports <, <=, >, >=
 4. Multi-tier uses nested ternary: cond1 ? tier(...) : (cond2 ? tier(...) : tier(...))
-5. Price coefficients are the provider's official $/1M tokens prices
+5. Price coefficients are the provider's official /1M tokens prices
 6. If cache/image/audio don't need separate pricing, omit those variables; their tokens are included in p/c automatically
 
 Please generate a billing expression based on the model information and pricing requirements provided.`

+ 2 - 2
default/src/features/system-settings/models/tool-price-settings.tsx

@@ -198,7 +198,7 @@ export const ToolPriceSettings = memo(function ToolPriceSettings({
         <AlertDescription className='space-y-1 text-sm'>
           <div>
             {t(
-              'Configure per-tool unit prices ($/1K calls). Per-request models do not incur additional tool fees.'
+              'Configure per-tool unit prices (/1K calls). Per-request models do not incur additional tool fees.'
             )}
           </div>
           <div>
@@ -274,7 +274,7 @@ export const ToolPriceSettings = memo(function ToolPriceSettings({
             },
             {
               id: 'price',
-              header: t('Price ($/1K calls)'),
+              header: t('Price (/1K calls)'),
               className: 'w-[200px]',
               cell: (row) => (
                 <Input

+ 4 - 0
default/src/i18n/locales/_extras/fr.extras.json

@@ -0,0 +1,4 @@
+{
+  "translation.Configure per-tool unit prices ($/1K calls). Per-request models do not incur additional tool fees.": "Définissez le prix unitaire de chaque outil ($/1K appels). Les modèles facturés à la requête n'entraînent pas de frais d'outils supplémentaires.",
+  "translation.Price ($/1K calls)": "Prix ($/1K appels)"
+}

+ 4 - 0
default/src/i18n/locales/_extras/ja.extras.json

@@ -0,0 +1,4 @@
+{
+  "translation.Configure per-tool unit prices ($/1K calls). Per-request models do not incur additional tool fees.": "ツールごとの単価($/1K 回)を設定します。リクエスト課金モデルでは追加工具料金はかかりません。",
+  "translation.Price ($/1K calls)": "価格($/1K 回)"
+}

+ 4 - 0
default/src/i18n/locales/_extras/ru.extras.json

@@ -0,0 +1,4 @@
+{
+  "translation.Configure per-tool unit prices ($/1K calls). Per-request models do not incur additional tool fees.": "Настройте стоимость единицы на инструмент ($/1K вызовов). Для моделей с оплатой за запрос доп. плата за инструменты не взимается.",
+  "translation.Price ($/1K calls)": "Цена ($/1K вызовов)"
+}

+ 4 - 0
default/src/i18n/locales/_extras/vi.extras.json

@@ -0,0 +1,4 @@
+{
+  "translation.Configure per-tool unit prices ($/1K calls). Per-request models do not incur additional tool fees.": "Cấu hình giá theo từng công cụ ($/1K lần gọi). Mô hình tính phí theo request không phát sinh thêm phí công cụ.",
+  "translation.Price ($/1K calls)": "Giá ($/1K lượt gọi)"
+}

+ 4 - 0
default/src/i18n/locales/_extras/zh-TW.extras.json

@@ -0,0 +1,4 @@
+{
+  "translation.Configure per-tool unit prices ($/1K calls). Per-request models do not incur additional tool fees.": "為每個工具設定單價($/1K 次呼叫)。按請求收費的模型不額外收取工具費用。",
+  "translation.Price ($/1K calls)": "價格($/1K 次)"
+}

+ 15 - 15
default/src/i18n/locales/_reports/_sync-report.json

@@ -9,39 +9,39 @@
     },
     "fr": {
       "file": "fr.json",
-      "missingCount": 0,
-      "extrasCount": 0,
-      "untranslatedCount": 0
+      "missingCount": 2,
+      "extrasCount": 2,
+      "untranslatedCount": 59
     },
     "ja": {
       "file": "ja.json",
-      "missingCount": 0,
-      "extrasCount": 0,
-      "untranslatedCount": 0
+      "missingCount": 2,
+      "extrasCount": 2,
+      "untranslatedCount": 221
     },
     "ru": {
       "file": "ru.json",
-      "missingCount": 0,
-      "extrasCount": 0,
-      "untranslatedCount": 0
+      "missingCount": 2,
+      "extrasCount": 2,
+      "untranslatedCount": 221
     },
     "vi": {
       "file": "vi.json",
-      "missingCount": 0,
-      "extrasCount": 0,
-      "untranslatedCount": 0
+      "missingCount": 2,
+      "extrasCount": 2,
+      "untranslatedCount": 59
     },
     "zh-TW": {
       "file": "zh-TW.json",
-      "missingCount": 0,
-      "extrasCount": 0,
+      "missingCount": 2,
+      "extrasCount": 2,
       "untranslatedCount": 0
     },
     "zh": {
       "file": "zh.json",
       "missingCount": 0,
       "extrasCount": 0,
-      "untranslatedCount": 0
+      "untranslatedCount": 3
     }
   }
 }

+ 61 - 0
default/src/i18n/locales/_reports/fr.untranslated.json

@@ -0,0 +1,61 @@
+{
+  "Already have an account? Back to login": "Already have an account? Back to login",
+  "Are you sure you want to delete group": "Are you sure you want to delete group",
+  "Click adjust to modify user quota": "Click adjust to modify user quota",
+  "Complete registration and enter": "Complete registration and enter",
+  "Filter models by vendor, group and tags.": "Filter models by vendor, group and tags.",
+  "Go to sign in": "Go to sign in",
+  "Set the price multiplier for models in this group.": "Set the price multiplier for models in this group.",
+  "Click to select or deselect models.": "Click to select or deselect models.",
+  "Failed to load groups": "Failed to load groups",
+  "No groups available. Add your first group to get started.": "No groups available. Add your first group to get started.",
+  "Search model name, provider, or tags...": "Search model name, provider, or tags...",
+  "Select user groups and models for this account": "Select user groups and models for this account",
+  "Username can only contain letters, numbers, and underscores": "Username can only contain letters, numbers, and underscores",
+  "Welcome to register": "Welcome to register",
+  "Welcome to register · {{tenantName}}": "Welcome to register · {{tenantName}}",
+  "You are invited by the institution to join the platform. Simply set an account and password to complete registration. After signing in, you will automatically enter the menus and permissions assigned by this institution.": "You are invited by the institution to join the platform. Simply set an account and password to complete registration. After signing in, you will automatically enter the menus and permissions assigned by this institution.",
+  "You will see the accessible menus configured by this institution and have button-level permissions for the corresponding pages.": "You will see the accessible menus configured by this institution and have button-level permissions for the corresponding pages.",
+  "View role details and assigned permissions.": "View role details and assigned permissions.",
+  "Update the role by providing necessary info.": "Update the role by providing necessary info.",
+  "Failed to update role": "Failed to update role",
+  "Failed to create role": "Failed to create role",
+  "Failed to delete role": "Failed to delete role",
+  "Failed to load roles": "Failed to load roles",
+  "Full access to all platform management features": "Full access to all platform management features",
+  "Manage channels, models, users, and daily operations": "Manage channels, models, users, and daily operations",
+  "View billing, wallet, top-up, and financial reports": "View billing, wallet, top-up, and financial reports",
+  "Configure the role name, description, and availability.": "Configure the role name, description, and availability.",
+  "Configure the role name and description.": "Configure the role name and description.",
+  "View role name, description, and permission summary.": "View role name, description, and permission summary.",
+  "All permission modules and actions assigned to this role.": "All permission modules and actions assigned to this role.",
+  "Select available modules and actions for this role.": "Select available modules and actions for this role.",
+  "Select available modules and actions for this tenant.": "View available modules and actions for this tenant.",
+  "Manage channel list, test channels, and update channel settings": "Manage channel list, test channels, and update channel settings",
+  "Manage model metadata, pricing, and upstream model mappings": "Manage model metadata, pricing, and upstream model mappings",
+  "Manage platform users, quotas, groups, and user roles": "Manage platform users, quotas, groups, and user roles",
+  "View wallet, billing, top-up, redemption, and financial records": "View wallet, billing, top-up, redemption, and financial records",
+  "Are you sure you want to delete role {{name}}?": "Are you sure you want to delete role {{name}}?",
+  "Configure tenant identity and administrator information.": "Configure tenant identity and administrator information.",
+  "Manage status, quota limit and time range for this tenant.": "Manage status, quota limit and time range for this tenant.",
+  "Create a new tenant and assign initial resource settings.": "Create a new tenant and assign initial resource settings.",
+  "Update tenant information and resource settings.": "Update tenant information and resource settings.",
+  "Quota must be greater than or equal to 0": "Quota must be greater than or equal to 0",
+  "Filter by tenant name, code, group or administrator...": "Filter by tenant name, code, group or administrator...",
+  "Are you sure you want to delete tenant {{name}}?": "Are you sure you want to delete tenant {{name}}?",
+  "Invitation sent to {{email}}": "Invitation sent to {{email}}",
+  "Are you sure you want to disable tenant {{name}}?": "Are you sure you want to disable tenant {{name}}?",
+  "Are you sure you want to enable tenant {{name}}?": "Are you sure you want to enable tenant {{name}}?",
+  "View tenant information and administrator details.": "View tenant information and administrator details.",
+  "View tenant information and permission parameter details.": "View tenant information and permission parameter details.",
+  "Invite administrator to register": "Invite administrator to register",
+  "Permissions will be loaded from the API and displayed as a tree.": "Permissions will be loaded from the API and displayed as a tree.",
+  "Configure tenant identity and contact information.": "Configure tenant identity and contact information.",
+  "Manage quota limit and time range for this tenant.": "Manage quota limit and time range for this tenant.",
+  "Save and invite administrator": "Save and invite administrator",
+  "Send an invitation email to the tenant administrator.": "Send an invitation email to the tenant administrator.",
+  "Send the link below to the administrator of {{tenantName}}. After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.": "Send the link below to the administrator of {{tenantName}}. After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.",
+  "Send the link below to the administrator of {{tenantName}}": "Send the link below to the administrator of {{tenantName}}",
+  "After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.": "After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.",
+  "Failed to copy invitation link": "Failed to copy invitation link"
+}

+ 223 - 0
default/src/i18n/locales/_reports/ja.untranslated.json

@@ -0,0 +1,223 @@
+{
+  "Average Response Time": "Average Response Time",
+  "Average request duration": "Average request duration",
+  "Completion Tokens": "Completion Tokens",
+  "Consumed quota": "Consumed quota",
+  "Direct Sub-Tenant Ranking": "Direct Sub-Tenant Ranking",
+  "Fail Count": "Fail Count",
+  "Failed requests": "Failed requests",
+  "Model Distribution": "Model Distribution",
+  "Prompt Tokens": "Prompt Tokens",
+  "Quota Consumed": "Quota Consumed",
+  "Success Count": "Success Count",
+  "Successful requests": "Successful requests",
+  "Time Trend": "Time Trend",
+  "User Ranking": "User Ranking",
+  "Access Control": "Access Control",
+  "Account & Access": "Account & Access",
+  "All groups": "All groups",
+  "All tags": "All tags",
+  "All vendors": "All vendors",
+  "Already have an account? Back to login": "Already have an account? Back to login",
+  "API Logs": "API Logs",
+  "Are you sure you want to delete group": "Are you sure you want to delete group",
+  "Auto-sync failed: {{message}}": "Auto-sync failed: {{message}}",
+  "Click adjust to modify user quota": "Click adjust to modify user quota",
+  "Configure per-tool unit prices (¥/1K calls). Per-request models do not incur additional tool fees.": "Configure per-tool unit prices (¥/1K calls). Per-request models do not incur additional tool fees.",
+  "Complete registration and enter": "Complete registration and enter",
+  "Updated At": "Updated At",
+  "Delete Group": "Delete Group",
+  "Filter models by vendor, group and tags.": "Filter models by vendor, group and tags.",
+  "Go to sign in": "Go to sign in",
+  "Group Management": "Group Management",
+  "Group management usage guide": "Group management usage guide",
+  "Magnification": "Magnification",
+  "No Models": "No Models",
+  "Create Group": "Create Group",
+  "Edit Group": "Edit Group",
+  "Group Description": "Group Description",
+  "Enter group name": "Enter group name",
+  "Enter group description": "Enter group description",
+  "Set the price multiplier for models in this group.": "Set the price multiplier for models in this group.",
+  "Multiplier must be greater than 0.": "Multiplier must be greater than 0.",
+  "Model Configuration": "Model Configuration",
+  "Select available models for this group.": "Select available models for this group.",
+  "Loading available models...": "Loading available models...",
+  "No available models found.": "No available models found.",
+  "channels": "channels",
+  "Click to select or deselect models.": "Click to select or deselect models.",
+  "Group created successfully": "Group created successfully",
+  "Group deleted successfully": "Group deleted successfully",
+  "Group updated successfully": "Group updated successfully",
+  "Failed to load groups": "Failed to load groups",
+  "No Groups Found": "No Groups Found",
+  "No groups available. Add your first group to get started.": "No groups available. Add your first group to get started.",
+  "Original Group Name": "Original Group Name",
+  "New Group Name": "New Group Name",
+  "Update group information.": "Update group information.",
+  "Create a new group.": "Create a new group.",
+  "Model created successfully": "Model created successfully",
+  "Model updated successfully": "Model updated successfully",
+  "Monitoring & Logs": "Monitoring & Logs",
+  "Price (¥/1K calls)": "Price (¥/1K calls)",
+  "Provider Channels": "Provider Channels",
+  "Quota Management": "Quota Management",
+  "Recharge Price": "Recharge Price",
+  "Search model name, provider, or tags...": "Search model name, provider, or tags...",
+  "Select groups": "Select groups",
+  "Select models...": "Select models...",
+  "Select user groups and models for this account": "Select user groups and models for this account",
+  "Standard Price": "Standard Price",
+  "Syncing upstream model prices...": "Syncing upstream model prices...",
+  "Top Tenants": "Top Tenants",
+  "Upstream prices synced successfully": "Upstream prices synced successfully",
+  "Tenant Consumption Ranking": "Tenant Consumption Ranking",
+  "Tenant Consumption Trend": "Tenant Consumption Trend",
+  "Username can only contain letters, numbers, and underscores": "Username can only contain letters, numbers, and underscores",
+  "Username must be at least 3 characters": "Username must be at least 3 characters",
+  "Username must be at most {{max}} characters": "Username must be at most {{max}} characters",
+  "Welcome to register": "Welcome to register",
+  "Welcome to register · {{tenantName}}": "Welcome to register · {{tenantName}}",
+  "You are invited by the institution to join the platform. Simply set an account and password to complete registration. After signing in, you will automatically enter the menus and permissions assigned by this institution.": "You are invited by the institution to join the platform. Simply set an account and password to complete registration. After signing in, you will automatically enter the menus and permissions assigned by this institution.",
+  "Institution administrator identity is activated after registration": "Institution administrator identity is activated after registration",
+  "Login password": "Login password",
+  "You will see the accessible menus configured by this institution and have button-level permissions for the corresponding pages.": "You will see the accessible menus configured by this institution and have button-level permissions for the corresponding pages.",
+  "Platform Roles": "Platform Roles",
+  "Roles & Permissions": "Roles & Permissions",
+  "Role Name": "Role Name",
+  "Role Description": "Role Description",
+  "Permission Modules": "Permission Modules",
+  "Permission Actions": "Permission Actions",
+  "Create Role": "Create Role",
+  "Role Details": "Role Details",
+  "Edit Role": "Edit Role",
+  "Delete Role": "Delete Role",
+  "Filter by role name...": "Filter by role name...",
+  "No Roles Found": "No Roles Found",
+  "No roles available. Try adjusting your search.": "No roles available. Try adjusting your search.",
+  "Add a new platform role by providing necessary info.": "Add a new platform role by providing necessary info.",
+  "View role details and assigned permissions.": "View role details and assigned permissions.",
+  "Enter role name": "Enter role name",
+  "Enter role description": "Enter role description",
+  "Update the role by providing necessary info.": "Update the role by providing necessary info.",
+  "Role updated successfully": "Role updated successfully",
+  "Failed to update role": "Failed to update role",
+  "Role created successfully": "Role created successfully",
+  "Failed to create role": "Failed to create role",
+  "Role deleted successfully": "Role deleted successfully",
+  "Failed to delete role": "Failed to delete role",
+  "Failed to load roles": "Failed to load roles",
+  "Role name is required": "Role name is required",
+  "Super Administrator": "Super Administrator",
+  "Full access to all platform management features": "Full access to all platform management features",
+  "Operations Administrator": "Operations Administrator",
+  "Manage channels, models, users, and daily operations": "Manage channels, models, users, and daily operations",
+  "Finance Administrator": "Finance Administrator",
+  "View billing, wallet, top-up, and financial reports": "View billing, wallet, top-up, and financial reports",
+  "Read-only Auditor": "Read-only Auditor",
+  "View platform data without changing configurations": "View platform data without changing configurations",
+  "Configure the role name, description, and availability.": "Configure the role name, description, and availability.",
+  "Configure the role name and description.": "Configure the role name and description.",
+  "View role name, description, and permission summary.": "View role name, description, and permission summary.",
+  "Role Type": "Role Type",
+  "Role Status": "Role Status",
+  "Enable this role for assignment": "Enable this role for assignment",
+  "Data Scope": "Data Scope",
+  "Current platform data": "Current platform data",
+  "Permission Parameters": "Permission Parameters",
+  "All Permissions": "All Permissions",
+  "All permission modules and actions assigned to this role.": "All permission modules and actions assigned to this role.",
+  "No permissions assigned": "No permissions assigned",
+  "Select available modules and actions for this role.": "Select available modules and actions for this role.",
+  "Select available modules and actions for this tenant.": "View available modules and actions for this tenant.",
+  "Manage channel list, test channels, and update channel settings": "Manage channel list, test channels, and update channel settings",
+  "Model Management": "Model Management",
+  "Manage model metadata, pricing, and upstream model mappings": "Manage model metadata, pricing, and upstream model mappings",
+  "User Management": "User Management",
+  "Manage platform users, quotas, groups, and user roles": "Manage platform users, quotas, groups, and user roles",
+  "Finance Management": "Finance Management",
+  "View wallet, billing, top-up, redemption, and financial records": "View wallet, billing, top-up, redemption, and financial records",
+  "Export": "Export",
+  "Are you sure you want to delete role {{name}}?": "Are you sure you want to delete role {{name}}?",
+  "Tenant Management": "Tenant Management",
+  "Tenant List": "Tenant List",
+  "Tenants": "Tenants",
+  "Tenant Name": "Tenant Name",
+  "Tenant Code": "Tenant Code",
+  "Tenant Status": "Tenant Status",
+  "Administrator": "Administrator",
+  "Administrator Email": "Administrator Email",
+  "Administrator Status": "Administrator Status",
+  "Registered": "Registered",
+  "Unregistered": "Unregistered",
+  "Normal": "Normal",
+  "Quota Limit": "Quota Limit",
+  "Authorization Time": "Authorization Time",
+  "Time Range": "Time Range",
+  "Tenant Settings": "Tenant Settings",
+  "Start Date": "Start Date",
+  "End Date": "End Date",
+  "Create Tenant": "Create Tenant",
+  "Edit Tenant": "Edit Tenant",
+  "Delete Tenant": "Delete Tenant",
+  "Enter tenant name": "Enter tenant name",
+  "Enter tenant code": "Enter tenant code",
+  "Enter group": "Enter group",
+  "Enter administrator name": "Enter administrator name",
+  "Enter administrator email": "Enter administrator email",
+  "Enter remark": "Enter remark",
+  "Select status": "Select status",
+  "Select administrator status": "Select administrator status",
+  "Configure tenant identity and administrator information.": "Configure tenant identity and administrator information.",
+  "Manage status, quota limit and time range for this tenant.": "Manage status, quota limit and time range for this tenant.",
+  "Create a new tenant and assign initial resource settings.": "Create a new tenant and assign initial resource settings.",
+  "Update tenant information and resource settings.": "Update tenant information and resource settings.",
+  "Tenant name is required": "Tenant name is required",
+  "Tenant code is required": "Tenant code is required",
+  "Administrator is required": "Administrator is required",
+  "Quota must be greater than or equal to 0": "Quota must be greater than or equal to 0",
+  "Tenant updated successfully": "Tenant updated successfully",
+  "Tenant created successfully": "Tenant created successfully",
+  "Tenant deleted successfully": "Tenant deleted successfully",
+  "No Tenants Found": "No Tenants Found",
+  "No tenants available. Try adjusting your search.": "No tenants available. Try adjusting your search.",
+  "Filter by tenant name, code, group or administrator...": "Filter by tenant name, code, group or administrator...",
+  "Are you sure you want to delete tenant {{name}}?": "Are you sure you want to delete tenant {{name}}?",
+  "Invalid email address": "Invalid email address",
+  "End date cannot be earlier than start date": "End date cannot be earlier than start date",
+  "Invitation sent to {{email}}": "Invitation sent to {{email}}",
+  "Tenant enabled successfully": "Tenant enabled successfully",
+  "Tenant disabled successfully": "Tenant disabled successfully",
+  "Are you sure you want to disable tenant {{name}}?": "Are you sure you want to disable tenant {{name}}?",
+  "Are you sure you want to enable tenant {{name}}?": "Are you sure you want to enable tenant {{name}}?",
+  "View tenant information and administrator details.": "View tenant information and administrator details.",
+  "View tenant information and permission parameter details.": "View tenant information and permission parameter details.",
+  "Invite administrator to register": "Invite administrator to register",
+  "Tenant Details": "Tenant Details",
+  "Administrator Information": "Administrator Information",
+  "Resource Settings": "Resource Settings",
+  "No remark": "No remark",
+  "Tenant ID": "Tenant ID",
+  "Contact Person": "Contact Person",
+  "Contact Phone": "Contact Phone",
+  "Contact Email": "Contact Email",
+  "Enter contact person": "Enter contact person",
+  "Enter contact phone": "Enter contact phone",
+  "Enter contact email": "Enter contact email",
+  "Select group": "Select group",
+  "Permission Configuration": "Permission Configuration",
+  "Permissions will be loaded from the API and displayed as a tree.": "Permissions will be loaded from the API and displayed as a tree.",
+  "Configure tenant identity and contact information.": "Configure tenant identity and contact information.",
+  "Manage quota limit and time range for this tenant.": "Manage quota limit and time range for this tenant.",
+  "Save and invite administrator": "Save and invite administrator",
+  "Invite Administrator": "Invite Administrator",
+  "Send an invitation email to the tenant administrator.": "Send an invitation email to the tenant administrator.",
+  "Send Invitation": "Send Invitation",
+  "Administrator Registration": "Administrator Registration",
+  "Send the link below to the administrator of {{tenantName}}. After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.": "Send the link below to the administrator of {{tenantName}}. After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.",
+  "Send the link below to the administrator of {{tenantName}}": "Send the link below to the administrator of {{tenantName}}",
+  "After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.": "After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.",
+  "Copy invitation link": "Copy invitation link",
+  "Invitation link copied": "Invitation link copied",
+  "Failed to copy invitation link": "Failed to copy invitation link"
+}

+ 223 - 0
default/src/i18n/locales/_reports/ru.untranslated.json

@@ -0,0 +1,223 @@
+{
+  "Average Response Time": "Average Response Time",
+  "Average request duration": "Average request duration",
+  "Completion Tokens": "Completion Tokens",
+  "Consumed quota": "Consumed quota",
+  "Direct Sub-Tenant Ranking": "Direct Sub-Tenant Ranking",
+  "Fail Count": "Fail Count",
+  "Failed requests": "Failed requests",
+  "Model Distribution": "Model Distribution",
+  "Prompt Tokens": "Prompt Tokens",
+  "Quota Consumed": "Quota Consumed",
+  "Success Count": "Success Count",
+  "Successful requests": "Successful requests",
+  "Time Trend": "Time Trend",
+  "User Ranking": "User Ranking",
+  "Access Control": "Access Control",
+  "Account & Access": "Account & Access",
+  "All groups": "All groups",
+  "All tags": "All tags",
+  "All vendors": "All vendors",
+  "Already have an account? Back to login": "Already have an account? Back to login",
+  "API Logs": "API Logs",
+  "Are you sure you want to delete group": "Are you sure you want to delete group",
+  "Auto-sync failed: {{message}}": "Auto-sync failed: {{message}}",
+  "Click adjust to modify user quota": "Click adjust to modify user quota",
+  "Configure per-tool unit prices (¥/1K calls). Per-request models do not incur additional tool fees.": "Configure per-tool unit prices (¥/1K calls). Per-request models do not incur additional tool fees.",
+  "Complete registration and enter": "Complete registration and enter",
+  "Updated At": "Updated At",
+  "Delete Group": "Delete Group",
+  "Filter models by vendor, group and tags.": "Filter models by vendor, group and tags.",
+  "Go to sign in": "Go to sign in",
+  "Group Management": "Group Management",
+  "Group management usage guide": "Group management usage guide",
+  "Magnification": "Magnification",
+  "No Models": "No Models",
+  "Create Group": "Create Group",
+  "Edit Group": "Edit Group",
+  "Group Description": "Group Description",
+  "Enter group name": "Enter group name",
+  "Enter group description": "Enter group description",
+  "Set the price multiplier for models in this group.": "Set the price multiplier for models in this group.",
+  "Multiplier must be greater than 0.": "Multiplier must be greater than 0.",
+  "Model Configuration": "Model Configuration",
+  "Select available models for this group.": "Select available models for this group.",
+  "Loading available models...": "Loading available models...",
+  "No available models found.": "No available models found.",
+  "channels": "channels",
+  "Click to select or deselect models.": "Click to select or deselect models.",
+  "Group created successfully": "Group created successfully",
+  "Group deleted successfully": "Group deleted successfully",
+  "Group updated successfully": "Group updated successfully",
+  "Failed to load groups": "Failed to load groups",
+  "No Groups Found": "No Groups Found",
+  "No groups available. Add your first group to get started.": "No groups available. Add your first group to get started.",
+  "Original Group Name": "Original Group Name",
+  "New Group Name": "New Group Name",
+  "Update group information.": "Update group information.",
+  "Create a new group.": "Create a new group.",
+  "Model created successfully": "Model created successfully",
+  "Model updated successfully": "Model updated successfully",
+  "Monitoring & Logs": "Monitoring & Logs",
+  "Price (¥/1K calls)": "Price (¥/1K calls)",
+  "Provider Channels": "Provider Channels",
+  "Quota Management": "Quota Management",
+  "Recharge Price": "Recharge Price",
+  "Search model name, provider, or tags...": "Search model name, provider, or tags...",
+  "Select groups": "Select groups",
+  "Select models...": "Select models...",
+  "Select user groups and models for this account": "Select user groups and models for this account",
+  "Standard Price": "Standard Price",
+  "Syncing upstream model prices...": "Syncing upstream model prices...",
+  "Top Tenants": "Top Tenants",
+  "Upstream prices synced successfully": "Upstream prices synced successfully",
+  "Tenant Consumption Ranking": "Tenant Consumption Ranking",
+  "Tenant Consumption Trend": "Tenant Consumption Trend",
+  "Username can only contain letters, numbers, and underscores": "Username can only contain letters, numbers, and underscores",
+  "Username must be at least 3 characters": "Username must be at least 3 characters",
+  "Username must be at most {{max}} characters": "Username must be at most {{max}} characters",
+  "Welcome to register": "Welcome to register",
+  "Welcome to register · {{tenantName}}": "Welcome to register · {{tenantName}}",
+  "You are invited by the institution to join the platform. Simply set an account and password to complete registration. After signing in, you will automatically enter the menus and permissions assigned by this institution.": "You are invited by the institution to join the platform. Simply set an account and password to complete registration. After signing in, you will automatically enter the menus and permissions assigned by this institution.",
+  "Institution administrator identity is activated after registration": "Institution administrator identity is activated after registration",
+  "Login password": "Login password",
+  "You will see the accessible menus configured by this institution and have button-level permissions for the corresponding pages.": "You will see the accessible menus configured by this institution and have button-level permissions for the corresponding pages.",
+  "Platform Roles": "Platform Roles",
+  "Roles & Permissions": "Roles & Permissions",
+  "Role Name": "Role Name",
+  "Role Description": "Role Description",
+  "Permission Modules": "Permission Modules",
+  "Permission Actions": "Permission Actions",
+  "Create Role": "Create Role",
+  "Role Details": "Role Details",
+  "Edit Role": "Edit Role",
+  "Delete Role": "Delete Role",
+  "Filter by role name...": "Filter by role name...",
+  "No Roles Found": "No Roles Found",
+  "No roles available. Try adjusting your search.": "No roles available. Try adjusting your search.",
+  "Add a new platform role by providing necessary info.": "Add a new platform role by providing necessary info.",
+  "View role details and assigned permissions.": "View role details and assigned permissions.",
+  "Enter role name": "Enter role name",
+  "Enter role description": "Enter role description",
+  "Update the role by providing necessary info.": "Update the role by providing necessary info.",
+  "Role updated successfully": "Role updated successfully",
+  "Failed to update role": "Failed to update role",
+  "Role created successfully": "Role created successfully",
+  "Failed to create role": "Failed to create role",
+  "Role deleted successfully": "Role deleted successfully",
+  "Failed to delete role": "Failed to delete role",
+  "Failed to load roles": "Failed to load roles",
+  "Role name is required": "Role name is required",
+  "Super Administrator": "Super Administrator",
+  "Full access to all platform management features": "Full access to all platform management features",
+  "Operations Administrator": "Operations Administrator",
+  "Manage channels, models, users, and daily operations": "Manage channels, models, users, and daily operations",
+  "Finance Administrator": "Finance Administrator",
+  "View billing, wallet, top-up, and financial reports": "View billing, wallet, top-up, and financial reports",
+  "Read-only Auditor": "Read-only Auditor",
+  "View platform data without changing configurations": "View platform data without changing configurations",
+  "Configure the role name, description, and availability.": "Configure the role name, description, and availability.",
+  "Configure the role name and description.": "Configure the role name and description.",
+  "View role name, description, and permission summary.": "View role name, description, and permission summary.",
+  "Role Type": "Role Type",
+  "Role Status": "Role Status",
+  "Enable this role for assignment": "Enable this role for assignment",
+  "Data Scope": "Data Scope",
+  "Current platform data": "Current platform data",
+  "Permission Parameters": "Permission Parameters",
+  "All Permissions": "All Permissions",
+  "All permission modules and actions assigned to this role.": "All permission modules and actions assigned to this role.",
+  "No permissions assigned": "No permissions assigned",
+  "Select available modules and actions for this role.": "Select available modules and actions for this role.",
+  "Select available modules and actions for this tenant.": "View available modules and actions for this tenant.",
+  "Manage channel list, test channels, and update channel settings": "Manage channel list, test channels, and update channel settings",
+  "Model Management": "Model Management",
+  "Manage model metadata, pricing, and upstream model mappings": "Manage model metadata, pricing, and upstream model mappings",
+  "User Management": "User Management",
+  "Manage platform users, quotas, groups, and user roles": "Manage platform users, quotas, groups, and user roles",
+  "Finance Management": "Finance Management",
+  "View wallet, billing, top-up, redemption, and financial records": "View wallet, billing, top-up, redemption, and financial records",
+  "Export": "Export",
+  "Are you sure you want to delete role {{name}}?": "Are you sure you want to delete role {{name}}?",
+  "Tenant Management": "Tenant Management",
+  "Tenant List": "Tenant List",
+  "Tenants": "Tenants",
+  "Tenant Name": "Tenant Name",
+  "Tenant Code": "Tenant Code",
+  "Tenant Status": "Tenant Status",
+  "Administrator": "Administrator",
+  "Administrator Email": "Administrator Email",
+  "Administrator Status": "Administrator Status",
+  "Registered": "Registered",
+  "Unregistered": "Unregistered",
+  "Normal": "Normal",
+  "Quota Limit": "Quota Limit",
+  "Authorization Time": "Authorization Time",
+  "Time Range": "Time Range",
+  "Tenant Settings": "Tenant Settings",
+  "Start Date": "Start Date",
+  "End Date": "End Date",
+  "Create Tenant": "Create Tenant",
+  "Edit Tenant": "Edit Tenant",
+  "Delete Tenant": "Delete Tenant",
+  "Enter tenant name": "Enter tenant name",
+  "Enter tenant code": "Enter tenant code",
+  "Enter group": "Enter group",
+  "Enter administrator name": "Enter administrator name",
+  "Enter administrator email": "Enter administrator email",
+  "Enter remark": "Enter remark",
+  "Select status": "Select status",
+  "Select administrator status": "Select administrator status",
+  "Configure tenant identity and administrator information.": "Configure tenant identity and administrator information.",
+  "Manage status, quota limit and time range for this tenant.": "Manage status, quota limit and time range for this tenant.",
+  "Create a new tenant and assign initial resource settings.": "Create a new tenant and assign initial resource settings.",
+  "Update tenant information and resource settings.": "Update tenant information and resource settings.",
+  "Tenant name is required": "Tenant name is required",
+  "Tenant code is required": "Tenant code is required",
+  "Administrator is required": "Administrator is required",
+  "Quota must be greater than or equal to 0": "Quota must be greater than or equal to 0",
+  "Tenant updated successfully": "Tenant updated successfully",
+  "Tenant created successfully": "Tenant created successfully",
+  "Tenant deleted successfully": "Tenant deleted successfully",
+  "No Tenants Found": "No Tenants Found",
+  "No tenants available. Try adjusting your search.": "No tenants available. Try adjusting your search.",
+  "Filter by tenant name, code, group or administrator...": "Filter by tenant name, code, group or administrator...",
+  "Are you sure you want to delete tenant {{name}}?": "Are you sure you want to delete tenant {{name}}?",
+  "Invalid email address": "Invalid email address",
+  "End date cannot be earlier than start date": "End date cannot be earlier than start date",
+  "Invitation sent to {{email}}": "Invitation sent to {{email}}",
+  "Tenant enabled successfully": "Tenant enabled successfully",
+  "Tenant disabled successfully": "Tenant disabled successfully",
+  "Are you sure you want to disable tenant {{name}}?": "Are you sure you want to disable tenant {{name}}?",
+  "Are you sure you want to enable tenant {{name}}?": "Are you sure you want to enable tenant {{name}}?",
+  "View tenant information and administrator details.": "View tenant information and administrator details.",
+  "View tenant information and permission parameter details.": "View tenant information and permission parameter details.",
+  "Invite administrator to register": "Invite administrator to register",
+  "Tenant Details": "Tenant Details",
+  "Administrator Information": "Administrator Information",
+  "Resource Settings": "Resource Settings",
+  "No remark": "No remark",
+  "Tenant ID": "Tenant ID",
+  "Contact Person": "Contact Person",
+  "Contact Phone": "Contact Phone",
+  "Contact Email": "Contact Email",
+  "Enter contact person": "Enter contact person",
+  "Enter contact phone": "Enter contact phone",
+  "Enter contact email": "Enter contact email",
+  "Select group": "Select group",
+  "Permission Configuration": "Permission Configuration",
+  "Permissions will be loaded from the API and displayed as a tree.": "Permissions will be loaded from the API and displayed as a tree.",
+  "Configure tenant identity and contact information.": "Configure tenant identity and contact information.",
+  "Manage quota limit and time range for this tenant.": "Manage quota limit and time range for this tenant.",
+  "Save and invite administrator": "Save and invite administrator",
+  "Invite Administrator": "Invite Administrator",
+  "Send an invitation email to the tenant administrator.": "Send an invitation email to the tenant administrator.",
+  "Send Invitation": "Send Invitation",
+  "Administrator Registration": "Administrator Registration",
+  "Send the link below to the administrator of {{tenantName}}. After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.": "Send the link below to the administrator of {{tenantName}}. After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.",
+  "Send the link below to the administrator of {{tenantName}}": "Send the link below to the administrator of {{tenantName}}",
+  "After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.": "After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.",
+  "Copy invitation link": "Copy invitation link",
+  "Invitation link copied": "Invitation link copied",
+  "Failed to copy invitation link": "Failed to copy invitation link"
+}

+ 61 - 0
default/src/i18n/locales/_reports/vi.untranslated.json

@@ -0,0 +1,61 @@
+{
+  "Already have an account? Back to login": "Already have an account? Back to login",
+  "Are you sure you want to delete group": "Are you sure you want to delete group",
+  "Click adjust to modify user quota": "Click adjust to modify user quota",
+  "Complete registration and enter": "Complete registration and enter",
+  "Filter models by vendor, group and tags.": "Filter models by vendor, group and tags.",
+  "Go to sign in": "Go to sign in",
+  "Set the price multiplier for models in this group.": "Set the price multiplier for models in this group.",
+  "Click to select or deselect models.": "Click to select or deselect models.",
+  "Failed to load groups": "Failed to load groups",
+  "No groups available. Add your first group to get started.": "No groups available. Add your first group to get started.",
+  "Search model name, provider, or tags...": "Search model name, provider, or tags...",
+  "Select user groups and models for this account": "Select user groups and models for this account",
+  "Username can only contain letters, numbers, and underscores": "Username can only contain letters, numbers, and underscores",
+  "Welcome to register": "Welcome to register",
+  "Welcome to register · {{tenantName}}": "Welcome to register · {{tenantName}}",
+  "You are invited by the institution to join the platform. Simply set an account and password to complete registration. After signing in, you will automatically enter the menus and permissions assigned by this institution.": "You are invited by the institution to join the platform. Simply set an account and password to complete registration. After signing in, you will automatically enter the menus and permissions assigned by this institution.",
+  "You will see the accessible menus configured by this institution and have button-level permissions for the corresponding pages.": "You will see the accessible menus configured by this institution and have button-level permissions for the corresponding pages.",
+  "View role details and assigned permissions.": "View role details and assigned permissions.",
+  "Update the role by providing necessary info.": "Update the role by providing necessary info.",
+  "Failed to update role": "Failed to update role",
+  "Failed to create role": "Failed to create role",
+  "Failed to delete role": "Failed to delete role",
+  "Failed to load roles": "Failed to load roles",
+  "Full access to all platform management features": "Full access to all platform management features",
+  "Manage channels, models, users, and daily operations": "Manage channels, models, users, and daily operations",
+  "View billing, wallet, top-up, and financial reports": "View billing, wallet, top-up, and financial reports",
+  "Configure the role name, description, and availability.": "Configure the role name, description, and availability.",
+  "Configure the role name and description.": "Configure the role name and description.",
+  "View role name, description, and permission summary.": "View role name, description, and permission summary.",
+  "All permission modules and actions assigned to this role.": "All permission modules and actions assigned to this role.",
+  "Select available modules and actions for this role.": "Select available modules and actions for this role.",
+  "Select available modules and actions for this tenant.": "View available modules and actions for this tenant.",
+  "Manage channel list, test channels, and update channel settings": "Manage channel list, test channels, and update channel settings",
+  "Manage model metadata, pricing, and upstream model mappings": "Manage model metadata, pricing, and upstream model mappings",
+  "Manage platform users, quotas, groups, and user roles": "Manage platform users, quotas, groups, and user roles",
+  "View wallet, billing, top-up, redemption, and financial records": "View wallet, billing, top-up, redemption, and financial records",
+  "Are you sure you want to delete role {{name}}?": "Are you sure you want to delete role {{name}}?",
+  "Configure tenant identity and administrator information.": "Configure tenant identity and administrator information.",
+  "Manage status, quota limit and time range for this tenant.": "Manage status, quota limit and time range for this tenant.",
+  "Create a new tenant and assign initial resource settings.": "Create a new tenant and assign initial resource settings.",
+  "Update tenant information and resource settings.": "Update tenant information and resource settings.",
+  "Quota must be greater than or equal to 0": "Quota must be greater than or equal to 0",
+  "Filter by tenant name, code, group or administrator...": "Filter by tenant name, code, group or administrator...",
+  "Are you sure you want to delete tenant {{name}}?": "Are you sure you want to delete tenant {{name}}?",
+  "Invitation sent to {{email}}": "Invitation sent to {{email}}",
+  "Are you sure you want to disable tenant {{name}}?": "Are you sure you want to disable tenant {{name}}?",
+  "Are you sure you want to enable tenant {{name}}?": "Are you sure you want to enable tenant {{name}}?",
+  "View tenant information and administrator details.": "View tenant information and administrator details.",
+  "View tenant information and permission parameter details.": "View tenant information and permission parameter details.",
+  "Invite administrator to register": "Invite administrator to register",
+  "Permissions will be loaded from the API and displayed as a tree.": "Permissions will be loaded from the API and displayed as a tree.",
+  "Configure tenant identity and contact information.": "Configure tenant identity and contact information.",
+  "Manage quota limit and time range for this tenant.": "Manage quota limit and time range for this tenant.",
+  "Save and invite administrator": "Save and invite administrator",
+  "Send an invitation email to the tenant administrator.": "Send an invitation email to the tenant administrator.",
+  "Send the link below to the administrator of {{tenantName}}. After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.": "Send the link below to the administrator of {{tenantName}}. After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.",
+  "Send the link below to the administrator of {{tenantName}}": "Send the link below to the administrator of {{tenantName}}",
+  "After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.": "After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.",
+  "Failed to copy invitation link": "Failed to copy invitation link"
+}

+ 5 - 0
default/src/i18n/locales/_reports/zh.untranslated.json

@@ -0,0 +1,5 @@
+{
+  "All groups": "All groups",
+  "All tags": "All tags",
+  "All vendors": "All vendors"
+}

+ 5 - 5
default/src/i18n/locales/en.json

@@ -536,6 +536,7 @@
     "Auto-fill when one field exists and another is missing": "Auto-fill when one field exists and another is missing",
     "Auto-refreshing every {{seconds}}s": "Auto-refreshing every {{seconds}}s",
     "Auto-retry status codes": "Auto-retry status codes",
+    "Auto-sync failed: {{message}}": "Auto-sync failed: {{message}}",
     "Automatically disable channel on repeated failures": "Automatically disable channel on repeated failures",
     "Automatically disable channels exceeding this response time": "Automatically disable channels exceeding this response time",
     "Automatically disable channels when tests fail": "Automatically disable channels when tests fail",
@@ -996,7 +997,7 @@
     "Configure monitoring status page groups for the dashboard": "Configure monitoring status page groups for the dashboard",
     "Configure NODE_NAME": "Configure NODE_NAME",
     "Configure per-model ratio for image inputs or outputs.": "Configure per-model ratio for image inputs or outputs.",
-    "Configure per-tool unit prices ($/1K calls). Per-request models do not incur additional tool fees.": "Configure per-tool unit prices ($/1K calls). Per-request models do not incur additional tool fees.",
+    "Configure per-tool unit prices (/1K calls). Per-request models do not incur additional tool fees.": "Configure per-tool unit prices (/1K calls). Per-request models do not incur additional tool fees.",
     "Configure pricing ratios for a specific model.": "Configure pricing ratios for a specific model.",
     "Configure rate limiting rules for a specific user group.": "Configure rate limiting rules for a specific user group.",
     "Configure routes": "Configure routes",
@@ -3530,7 +3531,7 @@
     "Previous branch": "Previous branch",
     "Previous page": "Previous page",
     "Price": "Price",
-    "Price ($/1K calls)": "Price ($/1K calls)",
+    "Price (¥/1K calls)": "Price (¥/1K calls)",
     "Price (local currency / USD)": "Price (local currency / USD)",
     "Price display": "Price display",
     "Price display mode": "Price display mode",
@@ -4430,6 +4431,7 @@
     "Synced upstream models": "Synced upstream models",
     "Synchronize models and vendors from an upstream source": "Synchronize models and vendors from an upstream source",
     "Syncing prices, please wait...": "Syncing prices, please wait...",
+    "Syncing upstream model prices...": "Syncing upstream model prices...",
     "Syncing...": "Syncing...",
     "System": "System",
     "System Administration": "System Administration",
@@ -4915,6 +4917,7 @@
     "Upstream path must be a full URL or a path starting with /": "Upstream path must be a full URL or a path starting with /",
     "Upstream price sync": "Upstream price sync",
     "Upstream prices fetched successfully": "Upstream prices fetched successfully",
+    "Upstream prices synced successfully": "Upstream prices synced successfully",
     "Upstream ratios fetched successfully": "Upstream ratios fetched successfully",
     "Upstream Request ID": "Upstream Request ID",
     "Upstream Response": "Upstream Response",
@@ -5315,7 +5318,6 @@
     "Enable this role for assignment": "Enable this role for assignment",
     "Data Scope": "Data Scope",
     "Current platform data": "Current platform data",
-    "Platform": "Platform",
     "Tenant": "Tenant",
     "Permission Parameters": "Permission Parameters",
     "All Permissions": "All Permissions",
@@ -5323,7 +5325,6 @@
     "No permissions assigned": "No permissions assigned",
     "Select available modules and actions for this role.": "Select available modules and actions for this role.",
     "Select available modules and actions for this tenant.": "View available modules and actions for this tenant.",
-    "Channel Management": "Channel Management",
     "Manage channel list, test channels, and update channel settings": "Manage channel list, test channels, and update channel settings",
     "Model Management": "Model Management",
     "Manage model metadata, pricing, and upstream model mappings": "Manage model metadata, pricing, and upstream model mappings",
@@ -5342,7 +5343,6 @@
     "Tenant Name": "Tenant Name",
     "Tenant Code": "Tenant Code",
     "Tenant Status": "Tenant Status",
-    "Group is required": "Group is required",
     "Administrator": "Administrator",
     "Administrator Email": "Administrator Email",
     "Administrator Status": "Administrator Status",

+ 226 - 4
default/src/i18n/locales/fr.json

@@ -3,6 +3,20 @@
     "360": "360",
     "1000": "1000",
     "10000": "10000",
+    "Average Response Time": "Average Response Time",
+    "Average request duration": "Average request duration",
+    "Completion Tokens": "Completion Tokens",
+    "Consumed quota": "Consumed quota",
+    "Direct Sub-Tenant Ranking": "Direct Sub-Tenant Ranking",
+    "Fail Count": "Fail Count",
+    "Failed requests": "Failed requests",
+    "Model Distribution": "Model Distribution",
+    "Prompt Tokens": "Prompt Tokens",
+    "Quota Consumed": "Quota Consumed",
+    "Success Count": "Success Count",
+    "Successful requests": "Successful requests",
+    "Time Trend": "Time Trend",
+    "User Ranking": "User Ranking",
     "_copy": "_copie",
     ",": ", ",
     ", and": ", et",
@@ -125,12 +139,14 @@
     "Accepts a JSON array of model identifiers that support the Imagine API.": "Accepte un tableau JSON d'identifiants de modèles qui prennent en charge l'API Imagine.",
     "Accepts comma-separated status codes and inclusive ranges.": "Accepte les codes de statut séparés par des virgules et les plages inclusives.",
     "Access a vast selection of models via a standard, unified API protocol. Power AI applications, manage digital assets, and connect the Future.": "Accédez à une vaste sélection de modèles via un protocole API standard et unifié. Propulsez les applications d'IA, gérez les actifs numériques et connectez le futur.",
+    "Access Control": "Access Control",
     "Access Denied Message": "Message d'accès refusé",
     "Access Forbidden": "Accès interdit",
     "Access Policy (JSON)": "Politique d'accès (JSON)",
     "Access previous conversations and start new ones.": "Accéder aux conversations précédentes et en démarrer de nouvelles.",
     "Access Token": "Jeton d'accès",
     "AccessKey / SecretAccessKey": "AccessKey / SecretAccessKey",
+    "Account & Access": "Account & Access",
     "Account Binding Management": "Gestion des liaisons de compte",
     "Account Bindings": "Associations de compte",
     "Account created! Please sign in": "Compte créé ! Veuillez vous connecter",
@@ -140,6 +156,9 @@
     "Account used when authenticating with the SMTP server": "Compte utilisé lors de l'authentification auprès du serveur SMTP",
     "acknowledge the related legal risks": "reconnais les risques juridiques associés",
     "Across all groups": "Tous groupes confondus",
+    "All groups": "All groups",
+    "All tags": "All tags",
+    "All vendors": "All vendors",
     "Action": "Action",
     "Action confirmation": "Confirmation de l'action",
     "Actions": "Actions",
@@ -341,6 +360,7 @@
     "Allowed Origins": "Origines autorisées",
     "Allowed Ports": "Ports autorisés",
     "Already have an account?": "Vous avez déjà un compte ?",
+    "Already have an account? Back to login": "Already have an account? Back to login",
     "Always matches (default tier).": "Toujours appliqué (palier par défaut).",
     "Amount": "Montant",
     "Amount cannot be changed when editing.": "Le montant ne peut pas être modifié lors de la modification.",
@@ -398,6 +418,7 @@
     "API Key mode: use APIKey|Region": "Mode clé API : utiliser APIKey|Region",
     "API Key updated successfully": "Clé API mise à jour avec succès",
     "API Keys": "Clés API",
+    "API Logs": "API Logs",
     "API Private Key": "Clé privée de l'API",
     "API Requests": "Requêtes API",
     "API secret": "Secret API",
@@ -438,6 +459,7 @@
     "Are you sure you want to delete all auto-disabled keys? This action cannot be undone.": "Êtes-vous sûr de vouloir supprimer toutes les clés automatiquement désactivées ? Cette action ne peut pas être annulée.",
     "Are you sure you want to delete channel \"{{name}}\"? This action cannot be undone.": "Êtes-vous sûr de vouloir supprimer le canal \"{{name}}\" ? Cette action ne peut pas être annulée.",
     "Are you sure you want to delete deployment \"{{name}}\"? This action cannot be undone.": "Êtes-vous sûr de vouloir supprimer le déploiement \"{{name}}\" ? Cette action est irréversible.",
+    "Are you sure you want to delete group": "Are you sure you want to delete group",
     "Are you sure you want to delete group \"{{name}}\"? This action cannot be undone.": "Voulez-vous vraiment supprimer le groupe \"{{name}}\" ? Cette action est irréversible.",
     "Are you sure you want to delete model \"{{name}}\"? This action cannot be undone.": "Voulez-vous vraiment supprimer le modèle \"{{name}}\" ? Cette action est irréversible.",
     "Are you sure you want to delete this key? This action cannot be undone.": "Êtes-vous sûr de vouloir supprimer cette clé ? Cette action ne peut pas être annulée.",
@@ -514,6 +536,7 @@
     "Auto-fill when one field exists and another is missing": "Remplissage automatique si un champ existe et l'autre est manquant",
     "Auto-refreshing every {{seconds}}s": "Actualisation automatique toutes les {{seconds}} s",
     "Auto-retry status codes": "Codes de statut de nouvelle tentative auto",
+    "Auto-sync failed: {{message}}": "Auto-sync failed: {{message}}",
     "Automatically disable channel on repeated failures": "Désactiver automatiquement le canal en cas d'échecs répétés",
     "Automatically disable channels exceeding this response time": "Désactiver automatiquement les canaux dépassant ce temps de réponse",
     "Automatically disable channels when tests fail": "Désactiver automatiquement les canaux lorsque les tests échouent",
@@ -854,6 +877,7 @@
     "Click \"Create Plan\" to create your first subscription plan": "Cliquez sur « Créer un plan » pour créer votre premier abonnement",
     "Click \"Generate\" to create a token": "Cliquez sur \"Générer\" pour créer un jeton",
     "Click a stage to show or hide that column": "Cliquez sur une étape pour afficher ou masquer cette colonne",
+    "Click adjust to modify user quota": "Click adjust to modify user quota",
     "Click any category to drill into its models, apps, and trends": "Cliquez sur une catégorie pour explorer ses modèles, applications et tendances",
     "Click for details": "Cliquez pour les détails",
     "Click save when you're done.": "Cliquez sur Enregistrer lorsque vous avez terminé.",
@@ -973,7 +997,7 @@
     "Configure monitoring status page groups for the dashboard": "Configurer les groupes de pages d'état de surveillance pour le tableau de bord",
     "Configure NODE_NAME": "Configurer NODE_NAME",
     "Configure per-model ratio for image inputs or outputs.": "Configurer le ratio par modèle pour les entrées ou sorties d'images.",
-    "Configure per-tool unit prices ($/1K calls). Per-request models do not incur additional tool fees.": "Définissez le prix unitaire de chaque outil ($/1K appels). Les modèles facturés à la requête n'entraînent pas de frais d'outils supplémentaires.",
+    "Configure per-tool unit prices (¥/1K calls). Per-request models do not incur additional tool fees.": "Configure per-tool unit prices (¥/1K calls). Per-request models do not incur additional tool fees.",
     "Configure pricing ratios for a specific model.": "Configurer les ratios de tarification pour un modèle spécifique.",
     "Configure rate limiting rules for a specific user group.": "Configurer les règles de limitation de débit pour un groupe d'utilisateurs spécifique.",
     "Configure routes": "Configurer les routes",
@@ -1129,6 +1153,7 @@
     "Create a new user group to configure ratio overrides for.": "Créer un nouveau groupe d'utilisateurs pour configurer les remplacements de ratio.",
     "Create account": "Créer un compte",
     "Create an account": "Créer un compte",
+    "Complete registration and enter": "Complete registration and enter",
     "Create an API key to unlock the real request": "Créez une clé API pour débloquer la requête réelle",
     "Create and review invite or credit codes.": "Créer et examiner les codes d'invitation ou de crédit.",
     "Create API Key": "Créer une clé API",
@@ -1166,6 +1191,7 @@
     "Created a subscription plan": "Forfait d'abonnement créé",
     "Created a vendor": "Fournisseur créé",
     "Created At": "Créé le",
+    "Updated At": "Updated At",
     "Created channel {{name}} (type {{type}}, count {{count}})": "Canal {{name}} créé (type {{type}}, nombre {{count}})",
     "Created user {{username}} (role {{role}})": "Utilisateur {{username}} créé (rôle {{role}})",
     "Creates a Pancake product in the saved store using this plan’s title and price. Requires Waffo Pancake to be fully configured in Payment settings first.": "Crée un produit Pancake dans la boutique enregistrée avec le titre et le prix de ce forfait. Waffo Pancake doit d’abord être entièrement configuré dans les paramètres de paiement.",
@@ -1277,6 +1303,7 @@
     "Degraded performance recently": "Performances dégradées récemment",
     "Delete": "Supprimer",
     "Delete (": "Supprimer (",
+    "Delete Group": "Delete Group",
     "Delete {{count}} API key(s)?": "Supprimer {{count}} clé(s) API ?",
     "Delete {{count}} stale instance records? Online instances will not be deleted.": "Supprimer {{count}} enregistrement(s) d'instance expirée ? Les instances en ligne ne seront pas supprimées.",
     "Delete a runtime request header": "Supprimer un en-tête de requête à l'exécution",
@@ -1990,6 +2017,7 @@
     "Filter...": "Filtrer...",
     "Filters": "Filtres",
     "Filters active": "Filtres actifs",
+    "Filter models by vendor, group and tags.": "Filter models by vendor, group and tags.",
     "Final Consumed": "Consommation finale",
     "Final cost = base × multiplier when conditions match": "Coût final = base × multiplicateur lorsque les conditions correspondent",
     "Final price multiplier (0.95 = 5% discount": "Multiplicateur de prix final (0.95 = 5% de réduction",
@@ -2110,6 +2138,7 @@
     "Go Back": "Retour",
     "Go back and edit": "Retour et modifier",
     "Go to Dashboard": "Aller au tableau de bord",
+    "Go to sign in": "Go to sign in",
     "Go to first page": "Aller à la première page",
     "Go to home": "Retour à l'accueil",
     "Go to io.net API Keys": "Accéder aux clés API io.net",
@@ -2149,6 +2178,8 @@
     "Group Name": "Nom du groupe",
     "Group name cannot be changed when editing.": "Le nom du groupe ne peut pas être modifié lors de la modification.",
     "Group prices cannot be expanded because this expression is not a standard tiered pricing expression.": "Les prix par groupe ne peuvent pas être détaillés car cette expression n'est pas une expression tarifaire par paliers standard.",
+    "Group Management": "Group Management",
+    "Group management usage guide": "Group management usage guide",
     "Group Pricing": "Tarification des groupes",
     "Group pricing usage guide": "Guide d'utilisation des groupes tarifaires",
     "group ratio": "ratio de groupe",
@@ -2163,6 +2194,31 @@
     "Groups *": "Groupes *",
     "Please select at least one group": "Veuillez sélectionner au moins un groupe",
     "Groups that users can select when creating API keys.": "Groupes que les utilisateurs peuvent sélectionner lors de la création de clés API.",
+    "Magnification": "Magnification",
+    "No Models": "No Models",
+    "Create Group": "Create Group",
+    "Edit Group": "Edit Group",
+    "Group Description": "Group Description",
+    "Enter group name": "Enter group name",
+    "Enter group description": "Enter group description",
+    "Set the price multiplier for models in this group.": "Set the price multiplier for models in this group.",
+    "Multiplier must be greater than 0.": "Multiplier must be greater than 0.",
+    "Model Configuration": "Model Configuration",
+    "Select available models for this group.": "Select available models for this group.",
+    "Loading available models...": "Loading available models...",
+    "No available models found.": "No available models found.",
+    "channels": "channels",
+    "Click to select or deselect models.": "Click to select or deselect models.",
+    "Group created successfully": "Group created successfully",
+    "Group deleted successfully": "Group deleted successfully",
+    "Group updated successfully": "Group updated successfully",
+    "Failed to load groups": "Failed to load groups",
+    "No Groups Found": "No Groups Found",
+    "No groups available. Add your first group to get started.": "No groups available. Add your first group to get started.",
+    "Original Group Name": "Original Group Name",
+    "New Group Name": "New Group Name",
+    "Update group information.": "Update group information.",
+    "Create a new group.": "Create a new group.",
     "Growth": "Croissance",
     "Guardrails": "Garde-fous",
     "Guest": "Invité",
@@ -2655,6 +2711,7 @@
     "model billing support": "prise en charge de la facturation des modèles",
     "Model Call Analytics": "Analyse des appels",
     "Model context usage": "Utilisation du contexte du modèle",
+    "Model created successfully": "Model created successfully",
     "Model deleted": "Modèle supprimé",
     "Model deleted successfully": "Modèle supprimé avec succès",
     "Model Deployment": "Déploiement de modèles",
@@ -2700,6 +2757,7 @@
     "Model Tags": "Tags de modèle",
     "Model to use for testing": "Modèle à utiliser pour les tests",
     "Model to use when testing channel connectivity": "Modèle à utiliser lors du test de la connectivité du canal",
+    "Model updated successfully": "Model updated successfully",
     "Model Version *": "Version du modèle *",
     "Model-scoped only": "Modèles uniquement",
     "model(s) selected out of": "modèle(s) sélectionné(s) parmi",
@@ -2732,6 +2790,7 @@
     "Monitor balance, usage, and request volume": "Surveillez le solde, l'utilisation et le volume de requêtes",
     "Monitored relay requests": "Requêtes relais surveillées",
     "Monitoring & Alerts": "Surveillance & Alertes",
+    "Monitoring & Logs": "Monitoring & Logs",
     "Month": "Mois",
     "Month number": "Numéro du mois",
     "Monthly": "Mensuel",
@@ -3353,7 +3412,6 @@
     "Plan title is required": "Le titre du forfait est requis",
     "Planned maintenance on Friday at 22:00 UTC...": "Maintenance planifiée vendredi à 22:00 UTC...",
     "Platform": "Plateforme",
-    "Tenant": "Locataire",
     "Platform Management": "Gestion de la plateforme",
     "Platform Users": "Utilisateurs de la plateforme",
     "Personal Management": "Gestion personnelle",
@@ -3473,7 +3531,7 @@
     "Previous branch": "Branche précédente",
     "Previous page": "Page précédente",
     "Price": "Prix",
-    "Price ($/1K calls)": "Prix ($/1K appels)",
+    "Price (¥/1K calls)": "Price (¥/1K calls)",
     "Price (local currency / USD)": "Prix (devise locale / USD)",
     "Price display": "Affichage des prix",
     "Price display mode": "Mode d'affichage des prix",
@@ -3519,6 +3577,7 @@
     "Profile": "Profil",
     "Profile updated successfully": "Profil mis à jour avec succès",
     "Programming": "Programmation",
+    "Provider Channels": "Provider Channels",
     "Progress": "Progression",
     "Project": "Élément",
     "Promote": "Promouvoir",
@@ -3587,6 +3646,7 @@
     "Quota given to invited users ({{formattedQuota}})": "Quota attribué aux utilisateurs invités ({{formattedQuota}})",
     "Quota given to users who invite others": "Quota attribué aux utilisateurs qui invitent d'autres personnes",
     "Quota given to users who invite others ({{formattedQuota}})": "Quota attribué aux utilisateurs qui invitent d'autres personnes ({{formattedQuota}})",
+    "Quota Management": "Quota Management",
     "Quota must be a positive number": "Le quota doit être un nombre positif",
     "Quota must be zero or greater": "Le quota ne peut pas être négatif",
     "Quota Per Unit": "Quota par unité",
@@ -3640,6 +3700,7 @@
     "Recently launched models gaining traction": "Modèles récemment publiés et en forte progression",
     "Recharge": "Recharger",
     "Recharge Amount": "Montant de la recharge",
+    "Recharge Price": "Recharge Price",
     "Recharge Amount (USD)": "Montant de la recharge (USD)",
     "Recommended": "Recommandé",
     "Recommended actions": "Actions recommandées",
@@ -3992,6 +4053,7 @@
     "Search method identifiers...": "Rechercher des identifiants de modes...",
     "Search missing models": "Rechercher les modèles manquants",
     "Search model name, provider, endpoint, or tag...": "Rechercher un nom de modèle, fournisseur, endpoint ou tag...",
+    "Search model name, provider, or tags...": "Search model name, provider, or tags...",
     "Search model name...": "Rechercher le nom du modèle...",
     "Search models": "Rechercher des modèles",
     "Search models or fields...": "Rechercher des modèles ou des champs...",
@@ -4052,6 +4114,7 @@
     "Select end time": "Sélectionner l'heure de fin",
     "Select from presets or type custom identifier.": "Sélectionner parmi les préréglages ou saisir un identifiant personnalisé.",
     "Select granularity": "Sélectionner la granularité",
+    "Select groups": "Select groups",
     "Select groups (leave empty to keep current)": "Sélectionner les groupes (laisser vide pour conserver les groupes actuels)",
     "Select interface density": "Sélectionner la densité de l'interface",
     "Select items...": "Sélectionner des éléments...",
@@ -4062,6 +4125,7 @@
     "Select locations": "Sélectionner des emplacements",
     "Select Model": "Sélectionner le modèle",
     "Select model {{model}}": "Sélectionner le modèle {{model}}",
+    "Select models...": "Select models...",
     "Select models (empty for allow all)": "Sélectionner les modèles (vide pour autoriser tout)",
     "Select models and apply to channel models list.": "Sélectionnez les modèles et appliquez-les à la liste des modèles de canaux.",
     "Select models or add custom ones": "Sélectionner des modèles ou en ajouter des personnalisés",
@@ -4093,6 +4157,7 @@
     "Select time granularity": "Sélectionner la granularité temporelle",
     "Select type": "Sélectionner le type",
     "Select vendor": "Sélectionner le fournisseur",
+    "Select user groups and models for this account": "Select user groups and models for this account",
     "Selectable groups": "Groupes sélectionnables",
     "selected": "sélectionné",
     "Selected {{count}}": "{{count}} sélectionné(s)",
@@ -4247,6 +4312,7 @@
     "SSRF Protection": "Protection SSRF",
     "stale": "expiré",
     "Standard": "Standard",
+    "Standard Price": "Standard Price",
     "Standard price": "Prix standard",
     "Start": "Début",
     "Start a conversation to see messages here": "Démarrez une conversation pour voir les messages ici",
@@ -4365,6 +4431,7 @@
     "Synced upstream models": "Modèles en amont synchronisés",
     "Synchronize models and vendors from an upstream source": "Synchroniser les modèles et les fournisseurs à partir d'une source amont",
     "Syncing prices, please wait...": "Synchronisation des prix, veuillez patienter...",
+    "Syncing upstream model prices...": "Syncing upstream model prices...",
     "Syncing...": "Synchronisation...",
     "System": "Système",
     "System Administration": "Administration du système",
@@ -4671,6 +4738,7 @@
     "Top P": "Top P",
     "Top up balance and view billing history.": "Recharger le solde et consulter l'historique de facturation.",
     "Top Users": "Top utilisateurs",
+    "Top Tenants": "Top Tenants",
     "Top vendors": "Top fournisseurs",
     "Top-up": "Recharge",
     "Top-up amount options": "Options de montant de recharge",
@@ -4849,6 +4917,7 @@
     "Upstream path must be a full URL or a path starting with /": "Le chemin amont doit être une URL complète ou un chemin commençant par /",
     "Upstream price sync": "Synchronisation amont des prix",
     "Upstream prices fetched successfully": "Prix amont récupérés avec succès",
+    "Upstream prices synced successfully": "Upstream prices synced successfully",
     "Upstream ratios fetched successfully": "Ratios en amont récupérés avec succès",
     "Upstream Request ID": "ID de requête en amont",
     "Upstream Response": "Réponse amont",
@@ -4927,6 +4996,8 @@
     "User Analytics": "Statistiques utilisateur",
     "User Consumption Ranking": "Classement de consommation",
     "User Consumption Trend": "Tendance de consommation",
+    "Tenant Consumption Ranking": "Tenant Consumption Ranking",
+    "Tenant Consumption Trend": "Tenant Consumption Trend",
     "User created successfully": "Utilisateur créé avec succès",
     "User dashboard and quota controls.": "Tableau de bord utilisateur et contrôles de quotas.",
     "User deleted successfully": "Utilisateur supprimé avec succès",
@@ -4957,6 +5028,9 @@
     "Username": "Nom d'utilisateur",
     "Username confirmation does not match": "La confirmation du nom d'utilisateur ne correspond pas",
     "Username Field": "Champ nom d'utilisateur",
+    "Username can only contain letters, numbers, and underscores": "Username can only contain letters, numbers, and underscores",
+    "Username must be at least 3 characters": "Username must be at least 3 characters",
+    "Username must be at most {{max}} characters": "Username must be at most {{max}} characters",
     "Username or Email": "Nom d'utilisateur ou e-mail",
     "Users": "Utilisateurs",
     "Users call the model on the left. The platform forwards the request to the upstream model on the right.": "Les utilisateurs appellent le modèle à gauche. La plateforme transmet la requête au modèle amont à droite.",
@@ -5111,6 +5185,8 @@
     "Weight": "Poids",
     "Weighted by request count": "Pondéré par le nombre de requêtes",
     "Welcome back!": "Bienvenue de retour !",
+    "Welcome to register": "Welcome to register",
+    "Welcome to register · {{tenantName}}": "Welcome to register · {{tenantName}}",
     "Welcome to our New API...": "Bienvenue sur notre New API...",
     "Well-Known URL": "URL bien connue",
     "Well-Known URL must start with http:// or https://": "L'URL bien connue doit commencer par http:// ou https://",
@@ -5118,6 +5194,7 @@
     "When a token uses the auto group, the system tries groups from top to bottom until it finds an available group.": "Quand un jeton utilise le groupe auto, le système essaie les groupes de haut en bas jusqu’à trouver un groupe disponible.",
     "When billed as {{group}}": "Facturé sous {{group}}",
     "When conditions match, the final price is multiplied by X. Multiple matches multiply together; values < 1 act as discounts.": "Si les conditions sont remplies, le prix final est multiplié par X. Plusieurs correspondances se multiplient ; les valeurs < 1 agissent comme des remises.",
+    "You are invited by the institution to join the platform. Simply set an account and password to complete registration. After signing in, you will automatically enter the menus and permissions assigned by this institution.": "You are invited by the institution to join the platform. Simply set an account and password to complete registration. After signing in, you will automatically enter the menus and permissions assigned by this institution.",
     "When enabled, if channels in the current group fail, it will try channels in the next group in order.": "Lorsqu'elle est activée, si les canaux du groupe actuel échouent, le système essaiera les canaux du groupe suivant dans l'ordre.",
     "When enabled, keep the affinity entry even if the affinity channel is disabled or no longer usable for the current group/model. Leave it off to delete the entry and select another channel.": "Lorsque cette option est activée, conserver l'entrée d'affinité même si le canal affinitaire est désactivé ou n'est plus utilisable pour le groupe/modèle actuel. Laissez-la désactivée pour supprimer l'entrée et sélectionner un autre canal.",
     "When enabled, large request bodies are temporarily stored on disk instead of memory, significantly reducing memory usage. SSD recommended.": "Lorsqu'activé, les corps de requête volumineux sont temporairement stockés sur disque, réduisant considérablement l'utilisation mémoire. SSD recommandé.",
@@ -5126,6 +5203,9 @@
     "When enabled, prompts are scanned before reaching upstream models.": "Lorsqu'elle est activée, les invites sont scannées avant d'atteindre les modèles en amont.",
     "When enabled, the store field will be blocked": "Lorsqu'il est activé, le champ de la boutique sera bloqué",
     "When enabled, users can pick this group when creating tokens.": "Une fois activé, les utilisateurs peuvent choisir ce groupe lors de la création de jetons.",
+    "Institution administrator identity is activated after registration": "Institution administrator identity is activated after registration",
+    "Login password": "Login password",
+    "You will see the accessible menus configured by this institution and have button-level permissions for the corresponding pages.": "You will see the accessible menus configured by this institution and have button-level permissions for the corresponding pages.",
     "When enabled, violation requests will incur additional charges.": "Lorsqu'activé, les requêtes en violation entraîneront des frais supplémentaires.",
     "When enabled, zero-cost models also pre-consume quota before final settlement.": "Lorsqu'elle est activée, les modèles à coût zéro pré-consomment également du quota avant le règlement final.",
     "When no conditions are set, the operation always executes.": "Sans conditions, l'opération s'exécute toujours.",
@@ -5195,6 +5275,148 @@
     "Zero retention": "Aucune rétention",
     "Zhipu": "Zhipu",
     "Zhipu V4": "Zhipu V4",
-    "Zoom": "Zoom"
+    "Zoom": "Zoom",
+    "Platform Roles": "Platform Roles",
+    "Roles & Permissions": "Roles & Permissions",
+    "Role Name": "Role Name",
+    "Role Description": "Role Description",
+    "Permission Modules": "Permission Modules",
+    "Permission Actions": "Permission Actions",
+    "Create Role": "Create Role",
+    "Role Details": "Role Details",
+    "Edit Role": "Edit Role",
+    "Delete Role": "Delete Role",
+    "Filter by role name...": "Filter by role name...",
+    "No Roles Found": "No Roles Found",
+    "No roles available. Try adjusting your search.": "No roles available. Try adjusting your search.",
+    "Add a new platform role by providing necessary info.": "Add a new platform role by providing necessary info.",
+    "View role details and assigned permissions.": "View role details and assigned permissions.",
+    "Enter role name": "Enter role name",
+    "Enter role description": "Enter role description",
+    "Update the role by providing necessary info.": "Update the role by providing necessary info.",
+    "Role updated successfully": "Role updated successfully",
+    "Failed to update role": "Failed to update role",
+    "Role created successfully": "Role created successfully",
+    "Failed to create role": "Failed to create role",
+    "Role deleted successfully": "Role deleted successfully",
+    "Failed to delete role": "Failed to delete role",
+    "Failed to load roles": "Failed to load roles",
+    "Role name is required": "Role name is required",
+    "Super Administrator": "Super Administrator",
+    "Full access to all platform management features": "Full access to all platform management features",
+    "Operations Administrator": "Operations Administrator",
+    "Manage channels, models, users, and daily operations": "Manage channels, models, users, and daily operations",
+    "Finance Administrator": "Finance Administrator",
+    "View billing, wallet, top-up, and financial reports": "View billing, wallet, top-up, and financial reports",
+    "Read-only Auditor": "Read-only Auditor",
+    "View platform data without changing configurations": "View platform data without changing configurations",
+    "Configure the role name, description, and availability.": "Configure the role name, description, and availability.",
+    "Configure the role name and description.": "Configure the role name and description.",
+    "View role name, description, and permission summary.": "View role name, description, and permission summary.",
+    "Role Type": "Role Type",
+    "Role Status": "Role Status",
+    "Enable this role for assignment": "Enable this role for assignment",
+    "Data Scope": "Data Scope",
+    "Current platform data": "Current platform data",
+    "Tenant": "Locataire",
+    "Permission Parameters": "Permission Parameters",
+    "All Permissions": "All Permissions",
+    "All permission modules and actions assigned to this role.": "All permission modules and actions assigned to this role.",
+    "No permissions assigned": "No permissions assigned",
+    "Select available modules and actions for this role.": "Select available modules and actions for this role.",
+    "Select available modules and actions for this tenant.": "View available modules and actions for this tenant.",
+    "Manage channel list, test channels, and update channel settings": "Manage channel list, test channels, and update channel settings",
+    "Model Management": "Model Management",
+    "Manage model metadata, pricing, and upstream model mappings": "Manage model metadata, pricing, and upstream model mappings",
+    "User Management": "User Management",
+    "Manage platform users, quotas, groups, and user roles": "Manage platform users, quotas, groups, and user roles",
+    "Finance Management": "Finance Management",
+    "View wallet, billing, top-up, redemption, and financial records": "View wallet, billing, top-up, redemption, and financial records",
+    "Export": "Export",
+    "Audit": "Audit",
+    "Own": "Own",
+    "Are you sure you want to delete role {{name}}?": "Are you sure you want to delete role {{name}}?",
+    "Keys": "Keys",
+    "Tenant Management": "Tenant Management",
+    "Tenant List": "Tenant List",
+    "Tenants": "Tenants",
+    "Tenant Name": "Tenant Name",
+    "Tenant Code": "Tenant Code",
+    "Tenant Status": "Tenant Status",
+    "Administrator": "Administrator",
+    "Administrator Email": "Administrator Email",
+    "Administrator Status": "Administrator Status",
+    "Registered": "Registered",
+    "Unregistered": "Unregistered",
+    "Normal": "Normal",
+    "Quota Limit": "Quota Limit",
+    "Authorization Time": "Authorization Time",
+    "Time Range": "Time Range",
+    "Tenant Settings": "Tenant Settings",
+    "Start Date": "Start Date",
+    "End Date": "End Date",
+    "Create Tenant": "Create Tenant",
+    "Edit Tenant": "Edit Tenant",
+    "Delete Tenant": "Delete Tenant",
+    "Enter tenant name": "Enter tenant name",
+    "Enter tenant code": "Enter tenant code",
+    "Enter group": "Enter group",
+    "Enter administrator name": "Enter administrator name",
+    "Enter administrator email": "Enter administrator email",
+    "Enter remark": "Enter remark",
+    "Select status": "Select status",
+    "Select administrator status": "Select administrator status",
+    "Configure tenant identity and administrator information.": "Configure tenant identity and administrator information.",
+    "Manage status, quota limit and time range for this tenant.": "Manage status, quota limit and time range for this tenant.",
+    "Create a new tenant and assign initial resource settings.": "Create a new tenant and assign initial resource settings.",
+    "Update tenant information and resource settings.": "Update tenant information and resource settings.",
+    "Tenant name is required": "Tenant name is required",
+    "Tenant code is required": "Tenant code is required",
+    "Administrator is required": "Administrator is required",
+    "Quota must be greater than or equal to 0": "Quota must be greater than or equal to 0",
+    "Tenant updated successfully": "Tenant updated successfully",
+    "Tenant created successfully": "Tenant created successfully",
+    "Tenant deleted successfully": "Tenant deleted successfully",
+    "No Tenants Found": "No Tenants Found",
+    "No tenants available. Try adjusting your search.": "No tenants available. Try adjusting your search.",
+    "Filter by tenant name, code, group or administrator...": "Filter by tenant name, code, group or administrator...",
+    "Are you sure you want to delete tenant {{name}}?": "Are you sure you want to delete tenant {{name}}?",
+    "Invalid email address": "Invalid email address",
+    "End date cannot be earlier than start date": "End date cannot be earlier than start date",
+    "Invitation sent to {{email}}": "Invitation sent to {{email}}",
+    "Tenant enabled successfully": "Tenant enabled successfully",
+    "Tenant disabled successfully": "Tenant disabled successfully",
+    "Are you sure you want to disable tenant {{name}}?": "Are you sure you want to disable tenant {{name}}?",
+    "Are you sure you want to enable tenant {{name}}?": "Are you sure you want to enable tenant {{name}}?",
+    "View tenant information and administrator details.": "View tenant information and administrator details.",
+    "View tenant information and permission parameter details.": "View tenant information and permission parameter details.",
+    "Invite administrator to register": "Invite administrator to register",
+    "Tenant Details": "Tenant Details",
+    "Administrator Information": "Administrator Information",
+    "Resource Settings": "Resource Settings",
+    "No remark": "No remark",
+    "Tenant ID": "Tenant ID",
+    "Contact Person": "Contact Person",
+    "Contact Phone": "Contact Phone",
+    "Contact Email": "Contact Email",
+    "Enter contact person": "Enter contact person",
+    "Enter contact phone": "Enter contact phone",
+    "Enter contact email": "Enter contact email",
+    "Select group": "Select group",
+    "Permission Configuration": "Permission Configuration",
+    "Permissions will be loaded from the API and displayed as a tree.": "Permissions will be loaded from the API and displayed as a tree.",
+    "Configure tenant identity and contact information.": "Configure tenant identity and contact information.",
+    "Manage quota limit and time range for this tenant.": "Manage quota limit and time range for this tenant.",
+    "Save and invite administrator": "Save and invite administrator",
+    "Invite Administrator": "Invite Administrator",
+    "Send an invitation email to the tenant administrator.": "Send an invitation email to the tenant administrator.",
+    "Send Invitation": "Send Invitation",
+    "Administrator Registration": "Administrator Registration",
+    "Send the link below to the administrator of {{tenantName}}. After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.": "Send the link below to the administrator of {{tenantName}}. After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.",
+    "Send the link below to the administrator of {{tenantName}}": "Send the link below to the administrator of {{tenantName}}",
+    "After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.": "After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.",
+    "Copy invitation link": "Copy invitation link",
+    "Invitation link copied": "Invitation link copied",
+    "Failed to copy invitation link": "Failed to copy invitation link"
   }
 }

+ 226 - 4
default/src/i18n/locales/ja.json

@@ -3,6 +3,20 @@
     "360": "360",
     "1000": "1000",
     "10000": "10000",
+    "Average Response Time": "Average Response Time",
+    "Average request duration": "Average request duration",
+    "Completion Tokens": "Completion Tokens",
+    "Consumed quota": "Consumed quota",
+    "Direct Sub-Tenant Ranking": "Direct Sub-Tenant Ranking",
+    "Fail Count": "Fail Count",
+    "Failed requests": "Failed requests",
+    "Model Distribution": "Model Distribution",
+    "Prompt Tokens": "Prompt Tokens",
+    "Quota Consumed": "Quota Consumed",
+    "Success Count": "Success Count",
+    "Successful requests": "Successful requests",
+    "Time Trend": "Time Trend",
+    "User Ranking": "User Ranking",
     "_copy": "_copy",
     ",": "、",
     ", and": "、および",
@@ -125,12 +139,14 @@
     "Accepts a JSON array of model identifiers that support the Imagine API.": "Imagine APIをサポートするモデル識別子のJSON配列を受け入れます。",
     "Accepts comma-separated status codes and inclusive ranges.": "カンマ区切りのステータスコードと包含範囲を受け入れます。",
     "Access a vast selection of models via a standard, unified API protocol. Power AI applications, manage digital assets, and connect the Future.": "標準的で統一されたAPIプロトコルを介して、膨大なモデルにアクセス。AIアプリケーションを強化し、デジタル資産を管理し、未来へと繋げます。",
+    "Access Control": "Access Control",
     "Access Denied Message": "アクセス拒否メッセージ",
     "Access Forbidden": "アクセス禁止",
     "Access Policy (JSON)": "アクセスポリシー (JSON)",
     "Access previous conversations and start new ones.": "以前の会話にアクセスし、新しい会話を開始します。",
     "Access Token": "アクセストークン",
     "AccessKey / SecretAccessKey": "AccessKey/SecretAccessKey",
+    "Account & Access": "Account & Access",
     "Account Binding Management": "アカウント連携管理",
     "Account Bindings": "アカウントバインディング",
     "Account created! Please sign in": "アカウントが作成されました!ログインしてください",
@@ -140,6 +156,9 @@
     "Account used when authenticating with the SMTP server": "SMTPサーバーで認証する際に使用されるアカウント",
     "acknowledge the related legal risks": "関連する法的リスクを認識します",
     "Across all groups": "全グループを通じて",
+    "All groups": "All groups",
+    "All tags": "All tags",
+    "All vendors": "All vendors",
     "Action": "アクション",
     "Action confirmation": "操作確認",
     "Actions": "操作",
@@ -341,6 +360,7 @@
     "Allowed Origins": "許可するオリジン",
     "Allowed Ports": "許可するポート",
     "Already have an account?": "アカウントをお持ちの方?",
+    "Already have an account? Back to login": "Already have an account? Back to login",
     "Always matches (default tier).": "常に一致(デフォルト ティア)。",
     "Amount": "金額",
     "Amount cannot be changed when editing.": "編集時は金額を変更できません。",
@@ -398,6 +418,7 @@
     "API Key mode: use APIKey|Region": "APIキーモード: use APIKey | Region",
     "API Key updated successfully": "APIキーが正常に更新されました",
     "API Keys": "APIキー",
+    "API Logs": "API Logs",
     "API Private Key": "API 秘密鍵",
     "API Requests": "APIリクエスト",
     "API secret": "APIシークレット",
@@ -438,6 +459,7 @@
     "Are you sure you want to delete all auto-disabled keys? This action cannot be undone.": "すべての自動無効化されたキーを削除してもよろしいですか?この操作は元に戻せません。",
     "Are you sure you want to delete channel \"{{name}}\"? This action cannot be undone.": "チャネル \"{{name}}\" を削除してもよろしいですか?この操作は元に戻せません。",
     "Are you sure you want to delete deployment \"{{name}}\"? This action cannot be undone.": "デプロイ \"{{name}}\" を削除してもよろしいですか?この操作は元に戻せません。",
+    "Are you sure you want to delete group": "Are you sure you want to delete group",
     "Are you sure you want to delete group \"{{name}}\"? This action cannot be undone.": "グループ \"{{name}}\" を削除してもよろしいですか?この操作は元に戻せません。",
     "Are you sure you want to delete model \"{{name}}\"? This action cannot be undone.": "モデル \"{{name}}\" を削除してもよろしいですか?この操作は元に戻せません。",
     "Are you sure you want to delete this key? This action cannot be undone.": "このキーを削除してもよろしいですか?この操作は元に戻せません。",
@@ -514,6 +536,7 @@
     "Auto-fill when one field exists and another is missing": "一方のフィールドがあり他方が欠けている場合に自動補完",
     "Auto-refreshing every {{seconds}}s": "{{seconds}} 秒ごとに自動更新",
     "Auto-retry status codes": "自動リトライするステータスコード",
+    "Auto-sync failed: {{message}}": "Auto-sync failed: {{message}}",
     "Automatically disable channel on repeated failures": "繰り返しの失敗でチャネルを自動的に無効にする",
     "Automatically disable channels exceeding this response time": "この応答時間を超えるチャネルを自動的に無効にする",
     "Automatically disable channels when tests fail": "テストが失敗したときにチャネルを自動的に無効にする",
@@ -854,6 +877,7 @@
     "Click \"Create Plan\" to create your first subscription plan": "「プラン作成」をクリックして最初のプランを作成してください",
     "Click \"Generate\" to create a token": "「生成」をクリックしてトークンを作成",
     "Click a stage to show or hide that column": "ステージをクリックすると、その列を表示または非表示にできます",
+    "Click adjust to modify user quota": "Click adjust to modify user quota",
     "Click any category to drill into its models, apps, and trends": "カテゴリをクリックすると、そのモデル・アプリ・トレンドを掘り下げて確認できます",
     "Click for details": "クリックして詳細を表示",
     "Click save when you're done.": "完了したら「保存」をクリックしてください。",
@@ -973,7 +997,7 @@
     "Configure monitoring status page groups for the dashboard": "ダッシュボードの監視ステータスページグループを設定します。",
     "Configure NODE_NAME": "NODE_NAME を設定",
     "Configure per-model ratio for image inputs or outputs.": "画像の入力または出力のモデルごとの比率を設定します。",
-    "Configure per-tool unit prices ($/1K calls). Per-request models do not incur additional tool fees.": "ツールごとの単価($/1K 回)を設定します。リクエスト課金モデルでは追加工具料金はかかりません。",
+    "Configure per-tool unit prices (¥/1K calls). Per-request models do not incur additional tool fees.": "Configure per-tool unit prices (¥/1K calls). Per-request models do not incur additional tool fees.",
     "Configure pricing ratios for a specific model.": "特定のモデルの料金比率を設定します。",
     "Configure rate limiting rules for a specific user group.": "特定のユーザーグループのレート制限ルールを設定します。",
     "Configure routes": "ルートを設定",
@@ -1129,6 +1153,7 @@
     "Create a new user group to configure ratio overrides for.": "レートの上書きを設定するための新しいユーザーグループを作成します。",
     "Create account": "アカウントを作成",
     "Create an account": "アカウントを作成",
+    "Complete registration and enter": "Complete registration and enter",
     "Create an API key to unlock the real request": "実際のリクエストを使うには API キーを作成してください",
     "Create and review invite or credit codes.": "招待コードまたはクレジットコードを作成および確認。",
     "Create API Key": "APIキーを作成",
@@ -1166,6 +1191,7 @@
     "Created a subscription plan": "サブスクリプションプランを作成しました",
     "Created a vendor": "ベンダーを作成しました",
     "Created At": "作成日時",
+    "Updated At": "Updated At",
     "Created channel {{name}} (type {{type}}, count {{count}})": "チャネル {{name}} を作成しました(タイプ {{type}}、数 {{count}})",
     "Created user {{username}} (role {{role}})": "ユーザー {{username}} を作成しました(ロール {{role}})",
     "Creates a Pancake product in the saved store using this plan’s title and price. Requires Waffo Pancake to be fully configured in Payment settings first.": "保存済みストアに、このプランのタイトルと価格を使って Pancake 商品を作成します。事前に支払い設定で Waffo Pancake を完全に設定する必要があります。",
@@ -1277,6 +1303,7 @@
     "Degraded performance recently": "最近パフォーマンスが低下しています",
     "Delete": "削除",
     "Delete (": "削除 (",
+    "Delete Group": "Delete Group",
     "Delete {{count}} API key(s)?": "{{count}}個のAPIキーを削除しますか?",
     "Delete {{count}} stale instance records? Online instances will not be deleted.": "期限切れインスタンスレコードを {{count}} 件削除しますか?オンラインのインスタンスは削除されません。",
     "Delete a runtime request header": "ランタイムリクエストヘッダーを削除",
@@ -1990,6 +2017,7 @@
     "Filter...": "フィルター…",
     "Filters": "フィルター",
     "Filters active": "フィルター有効",
+    "Filter models by vendor, group and tags.": "Filter models by vendor, group and tags.",
     "Final Consumed": "最終消費",
     "Final cost = base × multiplier when conditions match": "条件に一致する場合 最終費用 = 基準 × 倍率",
     "Final price multiplier (0.95 = 5% discount": "最終価格乗数 (0.95 = 5%割引",
@@ -2110,6 +2138,7 @@
     "Go Back": "戻る",
     "Go back and edit": "戻って編集",
     "Go to Dashboard": "ダッシュボードへ移動",
+    "Go to sign in": "Go to sign in",
     "Go to first page": "最初のページへ移動",
     "Go to home": "ホームへ戻る",
     "Go to io.net API Keys": "io.net API キーへ移動",
@@ -2149,6 +2178,8 @@
     "Group Name": "グループ名",
     "Group name cannot be changed when editing.": "編集時はグループ名を変更できません。",
     "Group prices cannot be expanded because this expression is not a standard tiered pricing expression.": "この式は標準の段階制料金式ではないため、グループ別価格を展開できません。",
+    "Group Management": "Group Management",
+    "Group management usage guide": "Group management usage guide",
     "Group Pricing": "グループ料金",
     "Group pricing usage guide": "グループ料金の使用ガイド",
     "group ratio": "グループ倍率",
@@ -2163,6 +2194,31 @@
     "Groups *": "グループ *",
     "Please select at least one group": "少なくとも1つのグループを選択してください",
     "Groups that users can select when creating API keys.": "ユーザーが API キー作成時に選択できるグループ。",
+    "Magnification": "Magnification",
+    "No Models": "No Models",
+    "Create Group": "Create Group",
+    "Edit Group": "Edit Group",
+    "Group Description": "Group Description",
+    "Enter group name": "Enter group name",
+    "Enter group description": "Enter group description",
+    "Set the price multiplier for models in this group.": "Set the price multiplier for models in this group.",
+    "Multiplier must be greater than 0.": "Multiplier must be greater than 0.",
+    "Model Configuration": "Model Configuration",
+    "Select available models for this group.": "Select available models for this group.",
+    "Loading available models...": "Loading available models...",
+    "No available models found.": "No available models found.",
+    "channels": "channels",
+    "Click to select or deselect models.": "Click to select or deselect models.",
+    "Group created successfully": "Group created successfully",
+    "Group deleted successfully": "Group deleted successfully",
+    "Group updated successfully": "Group updated successfully",
+    "Failed to load groups": "Failed to load groups",
+    "No Groups Found": "No Groups Found",
+    "No groups available. Add your first group to get started.": "No groups available. Add your first group to get started.",
+    "Original Group Name": "Original Group Name",
+    "New Group Name": "New Group Name",
+    "Update group information.": "Update group information.",
+    "Create a new group.": "Create a new group.",
     "Growth": "成長",
     "Guardrails": "ガードレール",
     "Guest": "ゲスト",
@@ -2655,6 +2711,7 @@
     "model billing support": "モデル課金対応",
     "Model Call Analytics": "呼び出し分析",
     "Model context usage": "モデルのコンテキスト使用量",
+    "Model created successfully": "Model created successfully",
     "Model deleted": "モデルが削除されました",
     "Model deleted successfully": "モデルが正常に削除されました",
     "Model Deployment": "モデルデプロイ",
@@ -2700,6 +2757,7 @@
     "Model Tags": "モデルタグ",
     "Model to use for testing": "テストに使用するモデル",
     "Model to use when testing channel connectivity": "チャネル接続性をテストする際に使用するモデル",
+    "Model updated successfully": "Model updated successfully",
     "Model Version *": "モデルバージョン *",
     "Model-scoped only": "モデル指定のみ",
     "model(s) selected out of": "選択されたモデル",
@@ -2732,6 +2790,7 @@
     "Monitor balance, usage, and request volume": "残高、使用量、リクエスト数を監視",
     "Monitored relay requests": "監視対象のリレーリクエスト",
     "Monitoring & Alerts": "監視とアラート",
+    "Monitoring & Logs": "Monitoring & Logs",
     "Month": "月",
     "Month number": "月番号",
     "Monthly": "毎月",
@@ -3353,7 +3412,6 @@
     "Plan title is required": "プランタイトルは必須です",
     "Planned maintenance on Friday at 22:00 UTC...": "金曜日 22:00 UTC に計画メンテナンスがあります...",
     "Platform": "プラットフォーム",
-    "Tenant": "テナント",
     "Platform Management": "プラットフォーム管理",
     "Platform Users": "プラットフォームユーザー",
     "Personal Management": "個人管理",
@@ -3473,7 +3531,7 @@
     "Previous branch": "前のブランチ",
     "Previous page": "前のページ",
     "Price": "価格",
-    "Price ($/1K calls)": "価格($/1K 回)",
+    "Price (¥/1K calls)": "Price (¥/1K calls)",
     "Price (local currency / USD)": "価格 (現地通貨 / USD)",
     "Price display": "価格表示",
     "Price display mode": "価格表示モード",
@@ -3519,6 +3577,7 @@
     "Profile": "プロフィール",
     "Profile updated successfully": "プロフィールが正常に更新されました",
     "Programming": "プログラミング",
+    "Provider Channels": "Provider Channels",
     "Progress": "進捗",
     "Project": "プロジェクト",
     "Promote": "昇格",
@@ -3587,6 +3646,7 @@
     "Quota given to invited users ({{formattedQuota}})": "招待されたユーザーに付与されるクォータ({{formattedQuota}})",
     "Quota given to users who invite others": "他のユーザーを招待したユーザーに付与されるクォータ",
     "Quota given to users who invite others ({{formattedQuota}})": "他のユーザーを招待したユーザーに付与されるクォータ({{formattedQuota}})",
+    "Quota Management": "Quota Management",
     "Quota must be a positive number": "クォータは正の数である必要があります",
     "Quota must be zero or greater": "クォータは負の値にできません",
     "Quota Per Unit": "ユニットあたりのクォータ",
@@ -3640,6 +3700,7 @@
     "Recently launched models gaining traction": "最近リリースされ勢いのあるモデル",
     "Recharge": "チャージ",
     "Recharge Amount": "チャージ額",
+    "Recharge Price": "Recharge Price",
     "Recharge Amount (USD)": "チャージ額 (USD)",
     "Recommended": "推奨",
     "Recommended actions": "おすすめの操作",
@@ -3992,6 +4053,7 @@
     "Search method identifiers...": "決済方法の識別子を検索...",
     "Search missing models": "不足しているモデルを検索",
     "Search model name, provider, endpoint, or tag...": "モデル名、プロバイダー、エンドポイント、タグを検索...",
+    "Search model name, provider, or tags...": "Search model name, provider, or tags...",
     "Search model name...": "モデル名を検索...",
     "Search models": "モデルを検索",
     "Search models or fields...": "モデルまたはフィールドを検索...",
@@ -4052,6 +4114,7 @@
     "Select end time": "終了時間を選択",
     "Select from presets or type custom identifier.": "プリセットから選択するか、カスタム識別子を入力してください。",
     "Select granularity": "粒度を選択",
+    "Select groups": "Select groups",
     "Select groups (leave empty to keep current)": "グループを選択 (現在の設定を維持するには空のままにしてください)",
     "Select interface density": "インターフェイスの密度を選択",
     "Select items...": "項目を選択...",
@@ -4062,6 +4125,7 @@
     "Select locations": "ロケーションを選択",
     "Select Model": "モデルを選択",
     "Select model {{model}}": "モデル {{model}} を選択",
+    "Select models...": "Select models...",
     "Select models (empty for allow all)": "モデルを選択 (すべて許可する場合は空)",
     "Select models and apply to channel models list.": "モデルを選択し、チャネルモデルリストに適用します。",
     "Select models or add custom ones": "モデルを選択するか、カスタムモデルを追加",
@@ -4093,6 +4157,7 @@
     "Select time granularity": "時間の粒度を選択",
     "Select type": "タイプを選択",
     "Select vendor": "ベンダーを選択",
+    "Select user groups and models for this account": "Select user groups and models for this account",
     "Selectable groups": "選択可能なグループ",
     "selected": "選択済み",
     "Selected {{count}}": "{{count}} 件選択済み",
@@ -4247,6 +4312,7 @@
     "SSRF Protection": "SSRF保護",
     "stale": "期限切れ",
     "Standard": "標準",
+    "Standard Price": "Standard Price",
     "Standard price": "標準価格",
     "Start": "開始",
     "Start a conversation to see messages here": "会話を開始すると、ここにメッセージが表示されます",
@@ -4365,6 +4431,7 @@
     "Synced upstream models": "上流モデルを同期しました",
     "Synchronize models and vendors from an upstream source": "アップストリームソースからモデルとベンダーを同期",
     "Syncing prices, please wait...": "価格を同期中、しばらくお待ちください...",
+    "Syncing upstream model prices...": "Syncing upstream model prices...",
     "Syncing...": "同期中...",
     "System": "システム",
     "System Administration": "システム管理",
@@ -4671,6 +4738,7 @@
     "Top P": "Top P",
     "Top up balance and view billing history.": "残高をチャージし、請求履歴を確認。",
     "Top Users": "上位ユーザー",
+    "Top Tenants": "Top Tenants",
     "Top vendors": "人気ベンダー",
     "Top-up": "チャージ",
     "Top-up amount options": "トップアップ金額オプション",
@@ -4849,6 +4917,7 @@
     "Upstream path must be a full URL or a path starting with /": "上流パスは完全な URL、または / で始まるパスである必要があります",
     "Upstream price sync": "アップストリーム価格同期",
     "Upstream prices fetched successfully": "上流価格を正常に取得しました",
+    "Upstream prices synced successfully": "Upstream prices synced successfully",
     "Upstream ratios fetched successfully": "アップストリーム比率が正常に取得されました",
     "Upstream Request ID": "上流リクエストID",
     "Upstream Response": "アップストリームレスポンス",
@@ -4927,6 +4996,8 @@
     "User Analytics": "ユーザー統計",
     "User Consumption Ranking": "ユーザー消費ランキング",
     "User Consumption Trend": "ユーザー消費トレンド",
+    "Tenant Consumption Ranking": "Tenant Consumption Ranking",
+    "Tenant Consumption Trend": "Tenant Consumption Trend",
     "User created successfully": "ユーザーの作成に成功しました",
     "User dashboard and quota controls.": "ユーザーダッシュボードとクォータ制御。",
     "User deleted successfully": "ユーザーを削除しました",
@@ -4957,6 +5028,9 @@
     "Username": "ユーザー名",
     "Username confirmation does not match": "ユーザー名の確認が一致しません",
     "Username Field": "ユーザー名フィールド",
+    "Username can only contain letters, numbers, and underscores": "Username can only contain letters, numbers, and underscores",
+    "Username must be at least 3 characters": "Username must be at least 3 characters",
+    "Username must be at most {{max}} characters": "Username must be at most {{max}} characters",
     "Username or Email": "ユーザー名またはメールアドレス",
     "Users": "ユーザー",
     "Users call the model on the left. The platform forwards the request to the upstream model on the right.": "ユーザーは左側のモデルを呼び出します。プラットフォームはリクエストを右側のアップストリームモデルに転送します。",
@@ -5111,6 +5185,8 @@
     "Weight": "ウェイト",
     "Weighted by request count": "リクエスト数で加重",
     "Welcome back!": "おかえりなさい!",
+    "Welcome to register": "Welcome to register",
+    "Welcome to register · {{tenantName}}": "Welcome to register · {{tenantName}}",
     "Welcome to our New API...": "New API へようこそ...",
     "Well-Known URL": "よく知られたURL",
     "Well-Known URL must start with http:// or https://": "Well-Known URL は http:// または https:// で始まる必要があります",
@@ -5118,6 +5194,7 @@
     "When a token uses the auto group, the system tries groups from top to bottom until it finds an available group.": "トークンが auto グループを使用すると、システムは上から順に利用可能なグループを探します。",
     "When billed as {{group}}": "{{group}} として課金時",
     "When conditions match, the final price is multiplied by X. Multiple matches multiply together; values < 1 act as discounts.": "条件に一致したとき、最終価格に X を掛けます。複数一致は掛け合わさり、1 未満は割引として効きます。",
+    "You are invited by the institution to join the platform. Simply set an account and password to complete registration. After signing in, you will automatically enter the menus and permissions assigned by this institution.": "You are invited by the institution to join the platform. Simply set an account and password to complete registration. After signing in, you will automatically enter the menus and permissions assigned by this institution.",
     "When enabled, if channels in the current group fail, it will try channels in the next group in order.": "有効にすると、現在のグループのチャネルが失敗した場合、次のグループのチャネルを順番に試します。",
     "When enabled, keep the affinity entry even if the affinity channel is disabled or no longer usable for the current group/model. Leave it off to delete the entry and select another channel.": "有効にすると、アフィニティチャネルが無効化された、または現在のグループ/モデルで利用できなくなった場合でも、そのアフィニティエントリを保持します。無効のままにすると、エントリを削除して別のチャネルを選択します。",
     "When enabled, large request bodies are temporarily stored on disk instead of memory, significantly reducing memory usage. SSD recommended.": "有効にすると、大きなリクエストボディはメモリではなくディスクに一時保存され、メモリ使用量が大幅に削減されます。SSD環境での使用を推奨します。",
@@ -5126,6 +5203,9 @@
     "When enabled, prompts are scanned before reaching upstream models.": "有効にすると、プロンプトはアップストリームモデルに到達する前にスキャンされます。",
     "When enabled, the store field will be blocked": "有効にすると、ストアフィールドはブロックされます",
     "When enabled, users can pick this group when creating tokens.": "有効にすると、ユーザーはトークン作成時にこのグループを選択できます。",
+    "Institution administrator identity is activated after registration": "Institution administrator identity is activated after registration",
+    "Login password": "Login password",
+    "You will see the accessible menus configured by this institution and have button-level permissions for the corresponding pages.": "You will see the accessible menus configured by this institution and have button-level permissions for the corresponding pages.",
     "When enabled, violation requests will incur additional charges.": "有効にすると、違反リクエストに追加料金が発生します。",
     "When enabled, zero-cost models also pre-consume quota before final settlement.": "有効にすると、ゼロコストモデルも最終決済前にクォータを事前消費します。",
     "When no conditions are set, the operation always executes.": "条件が設定されていない場合、操作は常に実行されます。",
@@ -5195,6 +5275,148 @@
     "Zero retention": "データ保持なし",
     "Zhipu": "Zhipu",
     "Zhipu V4": "Zhipu V 4",
-    "Zoom": "ズーム"
+    "Zoom": "ズーム",
+    "Platform Roles": "Platform Roles",
+    "Roles & Permissions": "Roles & Permissions",
+    "Role Name": "Role Name",
+    "Role Description": "Role Description",
+    "Permission Modules": "Permission Modules",
+    "Permission Actions": "Permission Actions",
+    "Create Role": "Create Role",
+    "Role Details": "Role Details",
+    "Edit Role": "Edit Role",
+    "Delete Role": "Delete Role",
+    "Filter by role name...": "Filter by role name...",
+    "No Roles Found": "No Roles Found",
+    "No roles available. Try adjusting your search.": "No roles available. Try adjusting your search.",
+    "Add a new platform role by providing necessary info.": "Add a new platform role by providing necessary info.",
+    "View role details and assigned permissions.": "View role details and assigned permissions.",
+    "Enter role name": "Enter role name",
+    "Enter role description": "Enter role description",
+    "Update the role by providing necessary info.": "Update the role by providing necessary info.",
+    "Role updated successfully": "Role updated successfully",
+    "Failed to update role": "Failed to update role",
+    "Role created successfully": "Role created successfully",
+    "Failed to create role": "Failed to create role",
+    "Role deleted successfully": "Role deleted successfully",
+    "Failed to delete role": "Failed to delete role",
+    "Failed to load roles": "Failed to load roles",
+    "Role name is required": "Role name is required",
+    "Super Administrator": "Super Administrator",
+    "Full access to all platform management features": "Full access to all platform management features",
+    "Operations Administrator": "Operations Administrator",
+    "Manage channels, models, users, and daily operations": "Manage channels, models, users, and daily operations",
+    "Finance Administrator": "Finance Administrator",
+    "View billing, wallet, top-up, and financial reports": "View billing, wallet, top-up, and financial reports",
+    "Read-only Auditor": "Read-only Auditor",
+    "View platform data without changing configurations": "View platform data without changing configurations",
+    "Configure the role name, description, and availability.": "Configure the role name, description, and availability.",
+    "Configure the role name and description.": "Configure the role name and description.",
+    "View role name, description, and permission summary.": "View role name, description, and permission summary.",
+    "Role Type": "Role Type",
+    "Role Status": "Role Status",
+    "Enable this role for assignment": "Enable this role for assignment",
+    "Data Scope": "Data Scope",
+    "Current platform data": "Current platform data",
+    "Tenant": "テナント",
+    "Permission Parameters": "Permission Parameters",
+    "All Permissions": "All Permissions",
+    "All permission modules and actions assigned to this role.": "All permission modules and actions assigned to this role.",
+    "No permissions assigned": "No permissions assigned",
+    "Select available modules and actions for this role.": "Select available modules and actions for this role.",
+    "Select available modules and actions for this tenant.": "View available modules and actions for this tenant.",
+    "Manage channel list, test channels, and update channel settings": "Manage channel list, test channels, and update channel settings",
+    "Model Management": "Model Management",
+    "Manage model metadata, pricing, and upstream model mappings": "Manage model metadata, pricing, and upstream model mappings",
+    "User Management": "User Management",
+    "Manage platform users, quotas, groups, and user roles": "Manage platform users, quotas, groups, and user roles",
+    "Finance Management": "Finance Management",
+    "View wallet, billing, top-up, redemption, and financial records": "View wallet, billing, top-up, redemption, and financial records",
+    "Export": "Export",
+    "Audit": "Audit",
+    "Own": "Own",
+    "Are you sure you want to delete role {{name}}?": "Are you sure you want to delete role {{name}}?",
+    "Keys": "Keys",
+    "Tenant Management": "Tenant Management",
+    "Tenant List": "Tenant List",
+    "Tenants": "Tenants",
+    "Tenant Name": "Tenant Name",
+    "Tenant Code": "Tenant Code",
+    "Tenant Status": "Tenant Status",
+    "Administrator": "Administrator",
+    "Administrator Email": "Administrator Email",
+    "Administrator Status": "Administrator Status",
+    "Registered": "Registered",
+    "Unregistered": "Unregistered",
+    "Normal": "Normal",
+    "Quota Limit": "Quota Limit",
+    "Authorization Time": "Authorization Time",
+    "Time Range": "Time Range",
+    "Tenant Settings": "Tenant Settings",
+    "Start Date": "Start Date",
+    "End Date": "End Date",
+    "Create Tenant": "Create Tenant",
+    "Edit Tenant": "Edit Tenant",
+    "Delete Tenant": "Delete Tenant",
+    "Enter tenant name": "Enter tenant name",
+    "Enter tenant code": "Enter tenant code",
+    "Enter group": "Enter group",
+    "Enter administrator name": "Enter administrator name",
+    "Enter administrator email": "Enter administrator email",
+    "Enter remark": "Enter remark",
+    "Select status": "Select status",
+    "Select administrator status": "Select administrator status",
+    "Configure tenant identity and administrator information.": "Configure tenant identity and administrator information.",
+    "Manage status, quota limit and time range for this tenant.": "Manage status, quota limit and time range for this tenant.",
+    "Create a new tenant and assign initial resource settings.": "Create a new tenant and assign initial resource settings.",
+    "Update tenant information and resource settings.": "Update tenant information and resource settings.",
+    "Tenant name is required": "Tenant name is required",
+    "Tenant code is required": "Tenant code is required",
+    "Administrator is required": "Administrator is required",
+    "Quota must be greater than or equal to 0": "Quota must be greater than or equal to 0",
+    "Tenant updated successfully": "Tenant updated successfully",
+    "Tenant created successfully": "Tenant created successfully",
+    "Tenant deleted successfully": "Tenant deleted successfully",
+    "No Tenants Found": "No Tenants Found",
+    "No tenants available. Try adjusting your search.": "No tenants available. Try adjusting your search.",
+    "Filter by tenant name, code, group or administrator...": "Filter by tenant name, code, group or administrator...",
+    "Are you sure you want to delete tenant {{name}}?": "Are you sure you want to delete tenant {{name}}?",
+    "Invalid email address": "Invalid email address",
+    "End date cannot be earlier than start date": "End date cannot be earlier than start date",
+    "Invitation sent to {{email}}": "Invitation sent to {{email}}",
+    "Tenant enabled successfully": "Tenant enabled successfully",
+    "Tenant disabled successfully": "Tenant disabled successfully",
+    "Are you sure you want to disable tenant {{name}}?": "Are you sure you want to disable tenant {{name}}?",
+    "Are you sure you want to enable tenant {{name}}?": "Are you sure you want to enable tenant {{name}}?",
+    "View tenant information and administrator details.": "View tenant information and administrator details.",
+    "View tenant information and permission parameter details.": "View tenant information and permission parameter details.",
+    "Invite administrator to register": "Invite administrator to register",
+    "Tenant Details": "Tenant Details",
+    "Administrator Information": "Administrator Information",
+    "Resource Settings": "Resource Settings",
+    "No remark": "No remark",
+    "Tenant ID": "Tenant ID",
+    "Contact Person": "Contact Person",
+    "Contact Phone": "Contact Phone",
+    "Contact Email": "Contact Email",
+    "Enter contact person": "Enter contact person",
+    "Enter contact phone": "Enter contact phone",
+    "Enter contact email": "Enter contact email",
+    "Select group": "Select group",
+    "Permission Configuration": "Permission Configuration",
+    "Permissions will be loaded from the API and displayed as a tree.": "Permissions will be loaded from the API and displayed as a tree.",
+    "Configure tenant identity and contact information.": "Configure tenant identity and contact information.",
+    "Manage quota limit and time range for this tenant.": "Manage quota limit and time range for this tenant.",
+    "Save and invite administrator": "Save and invite administrator",
+    "Invite Administrator": "Invite Administrator",
+    "Send an invitation email to the tenant administrator.": "Send an invitation email to the tenant administrator.",
+    "Send Invitation": "Send Invitation",
+    "Administrator Registration": "Administrator Registration",
+    "Send the link below to the administrator of {{tenantName}}. After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.": "Send the link below to the administrator of {{tenantName}}. After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.",
+    "Send the link below to the administrator of {{tenantName}}": "Send the link below to the administrator of {{tenantName}}",
+    "After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.": "After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.",
+    "Copy invitation link": "Copy invitation link",
+    "Invitation link copied": "Invitation link copied",
+    "Failed to copy invitation link": "Failed to copy invitation link"
   }
 }

+ 226 - 4
default/src/i18n/locales/ru.json

@@ -3,6 +3,20 @@
     "360": "360",
     "1000": "1000",
     "10000": "10000",
+    "Average Response Time": "Average Response Time",
+    "Average request duration": "Average request duration",
+    "Completion Tokens": "Completion Tokens",
+    "Consumed quota": "Consumed quota",
+    "Direct Sub-Tenant Ranking": "Direct Sub-Tenant Ranking",
+    "Fail Count": "Fail Count",
+    "Failed requests": "Failed requests",
+    "Model Distribution": "Model Distribution",
+    "Prompt Tokens": "Prompt Tokens",
+    "Quota Consumed": "Quota Consumed",
+    "Success Count": "Success Count",
+    "Successful requests": "Successful requests",
+    "Time Trend": "Time Trend",
+    "User Ranking": "User Ranking",
     "_copy": "_копировать",
     ",": ", ",
     ", and": ", и",
@@ -125,12 +139,14 @@
     "Accepts a JSON array of model identifiers that support the Imagine API.": "Принимает JSON-массив идентификаторов моделей, поддерживающих Imagine API.",
     "Accepts comma-separated status codes and inclusive ranges.": "Принимает коды статуса, разделенные запятыми, и включающие диапазоны.",
     "Access a vast selection of models via a standard, unified API protocol. Power AI applications, manage digital assets, and connect the Future.": "Получите доступ к огромному выбору моделей через стандартный, единый протокол API. Развивайте приложения ИИ, управляйте цифровыми активами и соединяйте будущее.",
+    "Access Control": "Access Control",
     "Access Denied Message": "Сообщение об отказе в доступе",
     "Access Forbidden": "Доступ запрещен",
     "Access Policy (JSON)": "Политика доступа (JSON)",
     "Access previous conversations and start new ones.": "Доступ к предыдущим разговорам и начало новых.",
     "Access Token": "Токен доступа",
     "AccessKey / SecretAccessKey": "AccessKey / SecretAccessKey",
+    "Account & Access": "Account & Access",
     "Account Binding Management": "Управление привязкой аккаунта",
     "Account Bindings": "Привязки аккаунта",
     "Account created! Please sign in": "Аккаунт создан! Пожалуйста, войдите в систему",
@@ -140,6 +156,9 @@
     "Account used when authenticating with the SMTP server": "Учетная запись, используемая при аутентификации с SMTP-сервером",
     "acknowledge the related legal risks": "признаю связанные правовые риски",
     "Across all groups": "По всем группам",
+    "All groups": "All groups",
+    "All tags": "All tags",
+    "All vendors": "All vendors",
     "Action": "Действие",
     "Action confirmation": "Подтверждение действия",
     "Actions": "Операции",
@@ -341,6 +360,7 @@
     "Allowed Origins": "Разрешенные Origins",
     "Allowed Ports": "Разрешенные порты",
     "Already have an account?": "Уже есть аккаунт?",
+    "Already have an account? Back to login": "Already have an account? Back to login",
     "Always matches (default tier).": "Всегда совпадает (уровень по умолчанию).",
     "Amount": "Сумма",
     "Amount cannot be changed when editing.": "Количество нельзя изменить при редактировании.",
@@ -398,6 +418,7 @@
     "API Key mode: use APIKey|Region": "Режим API Key: use APIKey|Region",
     "API Key updated successfully": "API ключ успешно обновлен",
     "API Keys": "Ключи API",
+    "API Logs": "API Logs",
     "API Private Key": "Секретный ключ API",
     "API Requests": "Запросы API",
     "API secret": "Секрет API",
@@ -438,6 +459,7 @@
     "Are you sure you want to delete all auto-disabled keys? This action cannot be undone.": "Вы уверены, что хотите удалить все автоматически отключённые ключи? Это действие нельзя отменить.",
     "Are you sure you want to delete channel \"{{name}}\"? This action cannot be undone.": "Вы уверены, что хотите удалить канал \"{{name}}\"? Это действие нельзя отменить.",
     "Are you sure you want to delete deployment \"{{name}}\"? This action cannot be undone.": "Вы уверены, что хотите удалить развертывание \"{{name}}\"? Это действие нельзя отменить.",
+    "Are you sure you want to delete group": "Are you sure you want to delete group",
     "Are you sure you want to delete group \"{{name}}\"? This action cannot be undone.": "Удалить группу \"{{name}}\"? Это действие нельзя отменить.",
     "Are you sure you want to delete model \"{{name}}\"? This action cannot be undone.": "Удалить модель \"{{name}}\"? Это действие нельзя отменить.",
     "Are you sure you want to delete this key? This action cannot be undone.": "Вы уверены, что хотите удалить этот ключ? Это действие нельзя отменить.",
@@ -514,6 +536,7 @@
     "Auto-fill when one field exists and another is missing": "Автозаполнение, когда одно поле есть, а другое отсутствует",
     "Auto-refreshing every {{seconds}}s": "Автообновление каждые {{seconds}} с",
     "Auto-retry status codes": "Коды авто-повтора",
+    "Auto-sync failed: {{message}}": "Auto-sync failed: {{message}}",
     "Automatically disable channel on repeated failures": "Автоматически отключать канал при повторных неудачах",
     "Automatically disable channels exceeding this response time": "Автоматически отключать каналы, превышающие это время ответа",
     "Automatically disable channels when tests fail": "Автоматически отключать каналы при сбое тестов",
@@ -854,6 +877,7 @@
     "Click \"Create Plan\" to create your first subscription plan": "Нажмите «Создать план», чтобы создать первый план подписки",
     "Click \"Generate\" to create a token": "Нажмите \"Сгенерировать\", чтобы создать токен",
     "Click a stage to show or hide that column": "Нажмите на этап, чтобы показать или скрыть этот столбец",
+    "Click adjust to modify user quota": "Click adjust to modify user quota",
     "Click any category to drill into its models, apps, and trends": "Нажмите на категорию, чтобы изучить её модели, приложения и тренды",
     "Click for details": "Нажмите для подробностей",
     "Click save when you're done.": "Нажмите «Сохранить», когда закончите.",
@@ -973,7 +997,7 @@
     "Configure monitoring status page groups for the dashboard": "Настроить группы страниц состояния мониторинга для панели управления",
     "Configure NODE_NAME": "Настроить NODE_NAME",
     "Configure per-model ratio for image inputs or outputs.": "Настроить коэффициент для каждой модели для ввода или вывода изображений.",
-    "Configure per-tool unit prices ($/1K calls). Per-request models do not incur additional tool fees.": "Настройте стоимость единицы на инструмент ($/1K вызовов). Для моделей с оплатой за запрос доп. плата за инструменты не взимается.",
+    "Configure per-tool unit prices (¥/1K calls). Per-request models do not incur additional tool fees.": "Configure per-tool unit prices (¥/1K calls). Per-request models do not incur additional tool fees.",
     "Configure pricing ratios for a specific model.": "Настроить коэффициенты ценообразования для конкретной модели.",
     "Configure rate limiting rules for a specific user group.": "Настроить правила ограничения скорости для конкретной группы пользователей.",
     "Configure routes": "Настроить маршруты",
@@ -1129,6 +1153,7 @@
     "Create a new user group to configure ratio overrides for.": "Создайте новую группу пользователей для настройки переопределений соотношений.",
     "Create account": "Создать аккаунт",
     "Create an account": "Создать аккаунт",
+    "Complete registration and enter": "Complete registration and enter",
     "Create an API key to unlock the real request": "Создайте API-ключ, чтобы открыть реальный запрос",
     "Create and review invite or credit codes.": "Создать и просмотреть коды приглашений или кредитов.",
     "Create API Key": "Создать ключ API",
@@ -1166,6 +1191,7 @@
     "Created a subscription plan": "Создан тарифный план подписки",
     "Created a vendor": "Создан поставщик",
     "Created At": "Дата создания",
+    "Updated At": "Updated At",
     "Created channel {{name}} (type {{type}}, count {{count}})": "Создан канал {{name}} (тип {{type}}, количество {{count}})",
     "Created user {{username}} (role {{role}})": "Создан пользователь {{username}} (роль {{role}})",
     "Creates a Pancake product in the saved store using this plan’s title and price. Requires Waffo Pancake to be fully configured in Payment settings first.": "Создает продукт Pancake в сохраненном магазине с названием и ценой этого плана. Сначала необходимо полностью настроить Waffo Pancake в настройках платежей.",
@@ -1277,6 +1303,7 @@
     "Degraded performance recently": "Недавно наблюдалось снижение производительности",
     "Delete": "Удалить",
     "Delete (": "Удалить (",
+    "Delete Group": "Delete Group",
     "Delete {{count}} API key(s)?": "Удалить {{count}} API-ключ(а/ей)?",
     "Delete {{count}} stale instance records? Online instances will not be deleted.": "Удалить {{count}} записей устаревших экземпляров? Онлайн-экземпляры не будут удалены.",
     "Delete a runtime request header": "Удалить заголовок запроса во время выполнения",
@@ -1990,6 +2017,7 @@
     "Filter...": "Фильтр...",
     "Filters": "Фильтры",
     "Filters active": "Фильтры активны",
+    "Filter models by vendor, group and tags.": "Filter models by vendor, group and tags.",
     "Final Consumed": "Итоговое потребление",
     "Final cost = base × multiplier when conditions match": "Итоговая стоимость = база × множитель, если условия совпадают",
     "Final price multiplier (0.95 = 5% discount": "Конечный множитель цены (0.95 = скидка 5%",
@@ -2110,6 +2138,7 @@
     "Go Back": "Назад",
     "Go back and edit": "Вернуться и изменить",
     "Go to Dashboard": "Перейти в панель управления",
+    "Go to sign in": "Go to sign in",
     "Go to first page": "Перейти на первую страницу",
     "Go to home": "На главную",
     "Go to io.net API Keys": "Перейти к ключам API io.net",
@@ -2149,6 +2178,8 @@
     "Group Name": "Имя группы",
     "Group name cannot be changed when editing.": "Имя группы нельзя изменить при редактировании.",
     "Group prices cannot be expanded because this expression is not a standard tiered pricing expression.": "Цены по группам нельзя развернуть, потому что это не стандартное выражение тарифов по уровням.",
+    "Group Management": "Group Management",
+    "Group management usage guide": "Group management usage guide",
     "Group Pricing": "Тарификация групп",
     "Group pricing usage guide": "Руководство по групповой тарификации",
     "group ratio": "коэффициент группы",
@@ -2163,6 +2194,31 @@
     "Groups *": "Группы *",
     "Please select at least one group": "Пожалуйста, выберите хотя бы одну группу",
     "Groups that users can select when creating API keys.": "Группы, которые пользователи могут выбрать при создании ключей API.",
+    "Magnification": "Magnification",
+    "No Models": "No Models",
+    "Create Group": "Create Group",
+    "Edit Group": "Edit Group",
+    "Group Description": "Group Description",
+    "Enter group name": "Enter group name",
+    "Enter group description": "Enter group description",
+    "Set the price multiplier for models in this group.": "Set the price multiplier for models in this group.",
+    "Multiplier must be greater than 0.": "Multiplier must be greater than 0.",
+    "Model Configuration": "Model Configuration",
+    "Select available models for this group.": "Select available models for this group.",
+    "Loading available models...": "Loading available models...",
+    "No available models found.": "No available models found.",
+    "channels": "channels",
+    "Click to select or deselect models.": "Click to select or deselect models.",
+    "Group created successfully": "Group created successfully",
+    "Group deleted successfully": "Group deleted successfully",
+    "Group updated successfully": "Group updated successfully",
+    "Failed to load groups": "Failed to load groups",
+    "No Groups Found": "No Groups Found",
+    "No groups available. Add your first group to get started.": "No groups available. Add your first group to get started.",
+    "Original Group Name": "Original Group Name",
+    "New Group Name": "New Group Name",
+    "Update group information.": "Update group information.",
+    "Create a new group.": "Create a new group.",
     "Growth": "Рост",
     "Guardrails": "Ограничители",
     "Guest": "Гость",
@@ -2655,6 +2711,7 @@
     "model billing support": "поддержка биллинга моделей",
     "Model Call Analytics": "Аналитика вызовов",
     "Model context usage": "Использование контекста модели",
+    "Model created successfully": "Model created successfully",
     "Model deleted": "Модель удалена",
     "Model deleted successfully": "Модель успешно удалена",
     "Model Deployment": "Развертывание моделей",
@@ -2700,6 +2757,7 @@
     "Model Tags": "Теги моделей",
     "Model to use for testing": "Модель для использования при тестировании",
     "Model to use when testing channel connectivity": "Модель для использования при тестировании подключения канала",
+    "Model updated successfully": "Model updated successfully",
     "Model Version *": "Версия модели *",
     "Model-scoped only": "Только по моделям",
     "model(s) selected out of": "модель(и) выбрано из",
@@ -2732,6 +2790,7 @@
     "Monitor balance, usage, and request volume": "Отслеживайте баланс, расход и объем запросов",
     "Monitored relay requests": "Отслеживаемые ретрансляционные запросы",
     "Monitoring & Alerts": "Мониторинг и оповещения",
+    "Monitoring & Logs": "Monitoring & Logs",
     "Month": "Месяц",
     "Month number": "Номер месяца",
     "Monthly": "Ежемесячно",
@@ -3353,7 +3412,6 @@
     "Plan title is required": "Название плана обязательно",
     "Planned maintenance on Friday at 22:00 UTC...": "Запланированное обслуживание в пятницу в 22:00 UTC...",
     "Platform": "Платформа",
-    "Tenant": "Арендатор",
     "Platform Management": "Управление платформой",
     "Platform Users": "Пользователи платформы",
     "Personal Management": "Личное управление",
@@ -3473,7 +3531,7 @@
     "Previous branch": "Предыдущая ветка",
     "Previous page": "Предыдущая страница",
     "Price": "Цена",
-    "Price ($/1K calls)": "Цена ($/1K вызовов)",
+    "Price (¥/1K calls)": "Price (¥/1K calls)",
     "Price (local currency / USD)": "Цена (местная валюта / USD)",
     "Price display": "Отображение цены",
     "Price display mode": "Режим отображения цены",
@@ -3519,6 +3577,7 @@
     "Profile": "Профиль",
     "Profile updated successfully": "Профиль успешно обновлён",
     "Programming": "Программирование",
+    "Provider Channels": "Provider Channels",
     "Progress": "Прогресс",
     "Project": "Проект",
     "Promote": "Повысить",
@@ -3587,6 +3646,7 @@
     "Quota given to invited users ({{formattedQuota}})": "Квота, предоставляемая приглашенным пользователям ({{formattedQuota}})",
     "Quota given to users who invite others": "Квота, предоставляемая пользователям, которые приглашают других",
     "Quota given to users who invite others ({{formattedQuota}})": "Квота, предоставляемая пользователям, которые приглашают других ({{formattedQuota}})",
+    "Quota Management": "Quota Management",
     "Quota must be a positive number": "Квота должна быть положительным числом",
     "Quota must be zero or greater": "Квота не может быть отрицательной",
     "Quota Per Unit": "Квота на единицу",
@@ -3640,6 +3700,7 @@
     "Recently launched models gaining traction": "Недавно вышедшие модели, набирающие популярность",
     "Recharge": "Пополнение",
     "Recharge Amount": "Сумма пополнения",
+    "Recharge Price": "Recharge Price",
     "Recharge Amount (USD)": "Сумма пополнения (USD)",
     "Recommended": "Рекомендуется",
     "Recommended actions": "Рекомендуемые действия",
@@ -3992,6 +4053,7 @@
     "Search method identifiers...": "Поиск идентификаторов способов...",
     "Search missing models": "Поиск отсутствующих моделей",
     "Search model name, provider, endpoint, or tag...": "Поиск по названию модели, поставщику, endpoint или тегу...",
+    "Search model name, provider, or tags...": "Search model name, provider, or tags...",
     "Search model name...": "Поиск имени модели...",
     "Search models": "Поиск моделей",
     "Search models or fields...": "Поиск моделей или полей...",
@@ -4052,6 +4114,7 @@
     "Select end time": "Выбрать время окончания",
     "Select from presets or type custom identifier.": "Выберите из предустановок или введите пользовательский идентификатор.",
     "Select granularity": "Выбрать детализацию",
+    "Select groups": "Select groups",
     "Select groups (leave empty to keep current)": "Выбрать группы (оставьте пустым, чтобы сохранить текущие)",
     "Select interface density": "Выберите плотность интерфейса",
     "Select items...": "Выберите элементы...",
@@ -4062,6 +4125,7 @@
     "Select locations": "Выбрать локации",
     "Select Model": "Выбрать модель",
     "Select model {{model}}": "Выбрать модель {{model}}",
+    "Select models...": "Select models...",
     "Select models (empty for allow all)": "Выбрать модели (пусто для разрешения всех)",
     "Select models and apply to channel models list.": "Выберите модели и примените к списку моделей каналов.",
     "Select models or add custom ones": "Выбрать модели или добавить пользовательские",
@@ -4093,6 +4157,7 @@
     "Select time granularity": "Выбрать детализацию времени",
     "Select type": "Выберите тип",
     "Select vendor": "Выбрать поставщика",
+    "Select user groups and models for this account": "Select user groups and models for this account",
     "Selectable groups": "Выбираемые группы",
     "selected": "выбрано",
     "Selected {{count}}": "Выбрано: {{count}}",
@@ -4247,6 +4312,7 @@
     "SSRF Protection": "Защита от SSRF",
     "stale": "устарел",
     "Standard": "Стандартный",
+    "Standard Price": "Standard Price",
     "Standard price": "Стандартная цена",
     "Start": "Начало",
     "Start a conversation to see messages here": "Начните разговор, чтобы увидеть сообщения здесь",
@@ -4365,6 +4431,7 @@
     "Synced upstream models": "Вышестоящие модели синхронизированы",
     "Synchronize models and vendors from an upstream source": "Синхронизировать модели и поставщиков из upstream источника",
     "Syncing prices, please wait...": "Синхронизация цен, подождите...",
+    "Syncing upstream model prices...": "Syncing upstream model prices...",
     "Syncing...": "Синхронизация...",
     "System": "Система",
     "System Administration": "Администрирование системы",
@@ -4671,6 +4738,7 @@
     "Top P": "Top P",
     "Top up balance and view billing history.": "Пополнить баланс и просмотреть историю платежей.",
     "Top Users": "Лучшие пользователи",
+    "Top Tenants": "Top Tenants",
     "Top vendors": "Топ поставщиков",
     "Top-up": "Пополнение",
     "Top-up amount options": "Варианты суммы пополнения",
@@ -4849,6 +4917,7 @@
     "Upstream path must be a full URL or a path starting with /": "Путь upstream должен быть полным URL или путем, начинающимся с /",
     "Upstream price sync": "Синхронизация цен upstream",
     "Upstream prices fetched successfully": "Цены провайдера успешно получены",
+    "Upstream prices synced successfully": "Upstream prices synced successfully",
     "Upstream ratios fetched successfully": "Коэффициенты upstream успешно получены",
     "Upstream Request ID": "ID вышестоящего запроса",
     "Upstream Response": "Ответ Upstream",
@@ -4927,6 +4996,8 @@
     "User Analytics": "Аналитика пользователей",
     "User Consumption Ranking": "Рейтинг потребления",
     "User Consumption Trend": "Тренд потребления",
+    "Tenant Consumption Ranking": "Tenant Consumption Ranking",
+    "Tenant Consumption Trend": "Tenant Consumption Trend",
     "User created successfully": "Пользователь успешно создан",
     "User dashboard and quota controls.": "Панель пользователя и управление квотами.",
     "User deleted successfully": "Пользователь успешно удален",
@@ -4957,6 +5028,9 @@
     "Username": "Имя пользователя",
     "Username confirmation does not match": "Подтверждение имени пользователя не совпадает",
     "Username Field": "Поле имени пользователя",
+    "Username can only contain letters, numbers, and underscores": "Username can only contain letters, numbers, and underscores",
+    "Username must be at least 3 characters": "Username must be at least 3 characters",
+    "Username must be at most {{max}} characters": "Username must be at most {{max}} characters",
     "Username or Email": "Имя пользователя или Email",
     "Users": "Пользователи",
     "Users call the model on the left. The platform forwards the request to the upstream model on the right.": "Пользователи вызывают модель слева. Платформа перенаправляет запрос вышестоящей модели справа.",
@@ -5111,6 +5185,8 @@
     "Weight": "Вес",
     "Weighted by request count": "Взвешено по количеству запросов",
     "Welcome back!": "Добро пожаловать обратно!",
+    "Welcome to register": "Welcome to register",
+    "Welcome to register · {{tenantName}}": "Welcome to register · {{tenantName}}",
     "Welcome to our New API...": "Добро пожаловать в наш New API...",
     "Well-Known URL": "Известный эксперт",
     "Well-Known URL must start with http:// or https://": "Well-Known URL должен начинаться с http:// или https://",
@@ -5118,6 +5194,7 @@
     "When a token uses the auto group, the system tries groups from top to bottom until it finds an available group.": "Когда токен использует группу auto, система перебирает группы сверху вниз, пока не найдёт доступную.",
     "When billed as {{group}}": "При тарификации по {{group}}",
     "When conditions match, the final price is multiplied by X. Multiple matches multiply together; values < 1 act as discounts.": "При совпадении условий итоговая цена умножается на X. Несколько совпадений умножаются вместе; значения < 1 действуют как скидки.",
+    "You are invited by the institution to join the platform. Simply set an account and password to complete registration. After signing in, you will automatically enter the menus and permissions assigned by this institution.": "You are invited by the institution to join the platform. Simply set an account and password to complete registration. After signing in, you will automatically enter the menus and permissions assigned by this institution.",
     "When enabled, if channels in the current group fail, it will try channels in the next group in order.": "Если включено, при сбое каналов в текущей группе система попробует каналы следующей группы по порядку.",
     "When enabled, keep the affinity entry even if the affinity channel is disabled or no longer usable for the current group/model. Leave it off to delete the entry and select another channel.": "Если включено, запись привязки сохраняется, даже когда привязанный канал отключён или больше не подходит для текущей группы/модели. Оставьте выключенным, чтобы удалять запись и выбирать другой канал.",
     "When enabled, large request bodies are temporarily stored on disk instead of memory, significantly reducing memory usage. SSD recommended.": "При включении большие тела запросов временно сохраняются на диске, что значительно снижает использование памяти. Рекомендуется SSD.",
@@ -5126,6 +5203,9 @@
     "When enabled, prompts are scanned before reaching upstream models.": "При включении запросы сканируются перед достижением вышестоящих моделей.",
     "When enabled, the store field will be blocked": "Если включено, поле магазина будет заблокировано",
     "When enabled, users can pick this group when creating tokens.": "Если включено, пользователи могут выбрать эту группу при создании токенов.",
+    "Institution administrator identity is activated after registration": "Institution administrator identity is activated after registration",
+    "Login password": "Login password",
+    "You will see the accessible menus configured by this institution and have button-level permissions for the corresponding pages.": "You will see the accessible menus configured by this institution and have button-level permissions for the corresponding pages.",
     "When enabled, violation requests will incur additional charges.": "При включении за нарушения будут начисляться дополнительные расходы.",
     "When enabled, zero-cost models also pre-consume quota before final settlement.": "При включении бесплатные модели также предварительно потребляют квоту до окончательного расчета.",
     "When no conditions are set, the operation always executes.": "Без условий операция выполняется всегда.",
@@ -5195,6 +5275,148 @@
     "Zero retention": "Без хранения данных",
     "Zhipu": "Zhipu",
     "Zhipu V4": "Zhipu V4",
-    "Zoom": "Zoom"
+    "Zoom": "Zoom",
+    "Platform Roles": "Platform Roles",
+    "Roles & Permissions": "Roles & Permissions",
+    "Role Name": "Role Name",
+    "Role Description": "Role Description",
+    "Permission Modules": "Permission Modules",
+    "Permission Actions": "Permission Actions",
+    "Create Role": "Create Role",
+    "Role Details": "Role Details",
+    "Edit Role": "Edit Role",
+    "Delete Role": "Delete Role",
+    "Filter by role name...": "Filter by role name...",
+    "No Roles Found": "No Roles Found",
+    "No roles available. Try adjusting your search.": "No roles available. Try adjusting your search.",
+    "Add a new platform role by providing necessary info.": "Add a new platform role by providing necessary info.",
+    "View role details and assigned permissions.": "View role details and assigned permissions.",
+    "Enter role name": "Enter role name",
+    "Enter role description": "Enter role description",
+    "Update the role by providing necessary info.": "Update the role by providing necessary info.",
+    "Role updated successfully": "Role updated successfully",
+    "Failed to update role": "Failed to update role",
+    "Role created successfully": "Role created successfully",
+    "Failed to create role": "Failed to create role",
+    "Role deleted successfully": "Role deleted successfully",
+    "Failed to delete role": "Failed to delete role",
+    "Failed to load roles": "Failed to load roles",
+    "Role name is required": "Role name is required",
+    "Super Administrator": "Super Administrator",
+    "Full access to all platform management features": "Full access to all platform management features",
+    "Operations Administrator": "Operations Administrator",
+    "Manage channels, models, users, and daily operations": "Manage channels, models, users, and daily operations",
+    "Finance Administrator": "Finance Administrator",
+    "View billing, wallet, top-up, and financial reports": "View billing, wallet, top-up, and financial reports",
+    "Read-only Auditor": "Read-only Auditor",
+    "View platform data without changing configurations": "View platform data without changing configurations",
+    "Configure the role name, description, and availability.": "Configure the role name, description, and availability.",
+    "Configure the role name and description.": "Configure the role name and description.",
+    "View role name, description, and permission summary.": "View role name, description, and permission summary.",
+    "Role Type": "Role Type",
+    "Role Status": "Role Status",
+    "Enable this role for assignment": "Enable this role for assignment",
+    "Data Scope": "Data Scope",
+    "Current platform data": "Current platform data",
+    "Tenant": "Арендатор",
+    "Permission Parameters": "Permission Parameters",
+    "All Permissions": "All Permissions",
+    "All permission modules and actions assigned to this role.": "All permission modules and actions assigned to this role.",
+    "No permissions assigned": "No permissions assigned",
+    "Select available modules and actions for this role.": "Select available modules and actions for this role.",
+    "Select available modules and actions for this tenant.": "View available modules and actions for this tenant.",
+    "Manage channel list, test channels, and update channel settings": "Manage channel list, test channels, and update channel settings",
+    "Model Management": "Model Management",
+    "Manage model metadata, pricing, and upstream model mappings": "Manage model metadata, pricing, and upstream model mappings",
+    "User Management": "User Management",
+    "Manage platform users, quotas, groups, and user roles": "Manage platform users, quotas, groups, and user roles",
+    "Finance Management": "Finance Management",
+    "View wallet, billing, top-up, redemption, and financial records": "View wallet, billing, top-up, redemption, and financial records",
+    "Export": "Export",
+    "Audit": "Audit",
+    "Own": "Own",
+    "Are you sure you want to delete role {{name}}?": "Are you sure you want to delete role {{name}}?",
+    "Keys": "Keys",
+    "Tenant Management": "Tenant Management",
+    "Tenant List": "Tenant List",
+    "Tenants": "Tenants",
+    "Tenant Name": "Tenant Name",
+    "Tenant Code": "Tenant Code",
+    "Tenant Status": "Tenant Status",
+    "Administrator": "Administrator",
+    "Administrator Email": "Administrator Email",
+    "Administrator Status": "Administrator Status",
+    "Registered": "Registered",
+    "Unregistered": "Unregistered",
+    "Normal": "Normal",
+    "Quota Limit": "Quota Limit",
+    "Authorization Time": "Authorization Time",
+    "Time Range": "Time Range",
+    "Tenant Settings": "Tenant Settings",
+    "Start Date": "Start Date",
+    "End Date": "End Date",
+    "Create Tenant": "Create Tenant",
+    "Edit Tenant": "Edit Tenant",
+    "Delete Tenant": "Delete Tenant",
+    "Enter tenant name": "Enter tenant name",
+    "Enter tenant code": "Enter tenant code",
+    "Enter group": "Enter group",
+    "Enter administrator name": "Enter administrator name",
+    "Enter administrator email": "Enter administrator email",
+    "Enter remark": "Enter remark",
+    "Select status": "Select status",
+    "Select administrator status": "Select administrator status",
+    "Configure tenant identity and administrator information.": "Configure tenant identity and administrator information.",
+    "Manage status, quota limit and time range for this tenant.": "Manage status, quota limit and time range for this tenant.",
+    "Create a new tenant and assign initial resource settings.": "Create a new tenant and assign initial resource settings.",
+    "Update tenant information and resource settings.": "Update tenant information and resource settings.",
+    "Tenant name is required": "Tenant name is required",
+    "Tenant code is required": "Tenant code is required",
+    "Administrator is required": "Administrator is required",
+    "Quota must be greater than or equal to 0": "Quota must be greater than or equal to 0",
+    "Tenant updated successfully": "Tenant updated successfully",
+    "Tenant created successfully": "Tenant created successfully",
+    "Tenant deleted successfully": "Tenant deleted successfully",
+    "No Tenants Found": "No Tenants Found",
+    "No tenants available. Try adjusting your search.": "No tenants available. Try adjusting your search.",
+    "Filter by tenant name, code, group or administrator...": "Filter by tenant name, code, group or administrator...",
+    "Are you sure you want to delete tenant {{name}}?": "Are you sure you want to delete tenant {{name}}?",
+    "Invalid email address": "Invalid email address",
+    "End date cannot be earlier than start date": "End date cannot be earlier than start date",
+    "Invitation sent to {{email}}": "Invitation sent to {{email}}",
+    "Tenant enabled successfully": "Tenant enabled successfully",
+    "Tenant disabled successfully": "Tenant disabled successfully",
+    "Are you sure you want to disable tenant {{name}}?": "Are you sure you want to disable tenant {{name}}?",
+    "Are you sure you want to enable tenant {{name}}?": "Are you sure you want to enable tenant {{name}}?",
+    "View tenant information and administrator details.": "View tenant information and administrator details.",
+    "View tenant information and permission parameter details.": "View tenant information and permission parameter details.",
+    "Invite administrator to register": "Invite administrator to register",
+    "Tenant Details": "Tenant Details",
+    "Administrator Information": "Administrator Information",
+    "Resource Settings": "Resource Settings",
+    "No remark": "No remark",
+    "Tenant ID": "Tenant ID",
+    "Contact Person": "Contact Person",
+    "Contact Phone": "Contact Phone",
+    "Contact Email": "Contact Email",
+    "Enter contact person": "Enter contact person",
+    "Enter contact phone": "Enter contact phone",
+    "Enter contact email": "Enter contact email",
+    "Select group": "Select group",
+    "Permission Configuration": "Permission Configuration",
+    "Permissions will be loaded from the API and displayed as a tree.": "Permissions will be loaded from the API and displayed as a tree.",
+    "Configure tenant identity and contact information.": "Configure tenant identity and contact information.",
+    "Manage quota limit and time range for this tenant.": "Manage quota limit and time range for this tenant.",
+    "Save and invite administrator": "Save and invite administrator",
+    "Invite Administrator": "Invite Administrator",
+    "Send an invitation email to the tenant administrator.": "Send an invitation email to the tenant administrator.",
+    "Send Invitation": "Send Invitation",
+    "Administrator Registration": "Administrator Registration",
+    "Send the link below to the administrator of {{tenantName}}. After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.": "Send the link below to the administrator of {{tenantName}}. After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.",
+    "Send the link below to the administrator of {{tenantName}}": "Send the link below to the administrator of {{tenantName}}",
+    "After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.": "After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.",
+    "Copy invitation link": "Copy invitation link",
+    "Invitation link copied": "Invitation link copied",
+    "Failed to copy invitation link": "Failed to copy invitation link"
   }
 }

+ 226 - 4
default/src/i18n/locales/vi.json

@@ -3,6 +3,20 @@
     "360": "360",
     "1000": "1000",
     "10000": "10000",
+    "Average Response Time": "Average Response Time",
+    "Average request duration": "Average request duration",
+    "Completion Tokens": "Completion Tokens",
+    "Consumed quota": "Consumed quota",
+    "Direct Sub-Tenant Ranking": "Direct Sub-Tenant Ranking",
+    "Fail Count": "Fail Count",
+    "Failed requests": "Failed requests",
+    "Model Distribution": "Model Distribution",
+    "Prompt Tokens": "Prompt Tokens",
+    "Quota Consumed": "Quota Consumed",
+    "Success Count": "Success Count",
+    "Successful requests": "Successful requests",
+    "Time Trend": "Time Trend",
+    "User Ranking": "User Ranking",
     "_copy": "_bản sao",
     ",": ", ",
     ", and": ", và",
@@ -125,12 +139,14 @@
     "Accepts a JSON array of model identifiers that support the Imagine API.": "Chấp nhận một mảng JSON gồm các mã định danh mô hình hỗ trợ API Imagine.",
     "Accepts comma-separated status codes and inclusive ranges.": "Chấp nhận mã trạng thái phân cách bằng dấu phẩy và phạm vi bao gồm.",
     "Access a vast selection of models via a standard, unified API protocol. Power AI applications, manage digital assets, and connect the Future.": "Truy cập số lượng lớn các mô hình thông qua giao thức API chuẩn hóa và thống nhất. Thúc đẩy các ứng dụng AI, quản lý tài sản kỹ thuật số và kết nối tương lai.",
+    "Access Control": "Access Control",
     "Access Denied Message": "Thông báo từ chối truy cập",
     "Access Forbidden": "Truy cập bị cấm",
     "Access Policy (JSON)": "Chính sách truy cập (JSON)",
     "Access previous conversations and start new ones.": "Truy cập các cuộc trò chuyện trước đó và bắt đầu các cuộc trò chuyện mới.",
     "Access Token": "Token truy cập",
     "AccessKey / SecretAccessKey": "AccessKey / SecretAccessKey",
+    "Account & Access": "Account & Access",
     "Account Binding Management": "Quản lý liên kết tài khoản",
     "Account Bindings": "Liên kết tài khoản",
     "Account created! Please sign in": "Tài khoản đã được tạo! Vui lòng đăng nhập",
@@ -140,6 +156,9 @@
     "Account used when authenticating with the SMTP server": "Tài khoản được sử dụng khi xác thực với máy chủ SMTP",
     "acknowledge the related legal risks": "thừa nhận các rủi ro pháp lý liên quan",
     "Across all groups": "Trên mọi nhóm",
+    "All groups": "All groups",
+    "All tags": "All tags",
+    "All vendors": "All vendors",
     "Action": "Hành động",
     "Action confirmation": "Xác nhận hành động",
     "Actions": "Hành động",
@@ -341,6 +360,7 @@
     "Allowed Origins": "Nguồn gốc được phép",
     "Allowed Ports": "Cổng được phép",
     "Already have an account?": "Đã có tài khoản?",
+    "Already have an account? Back to login": "Already have an account? Back to login",
     "Always matches (default tier).": "Luôn khớp (bậc mặc định).",
     "Amount": "Số lượng",
     "Amount cannot be changed when editing.": "Số tiền không thể thay đổi khi chỉnh sửa.",
@@ -398,6 +418,7 @@
     "API Key mode: use APIKey|Region": "Chế độ khóa API: sử dụng APIKey|Region",
     "API Key updated successfully": "API Key đã được cập nhật thành công",
     "API Keys": "Khóa API",
+    "API Logs": "API Logs",
     "API Private Key": "Khóa riêng API",
     "API Requests": "Yêu cầu API",
     "API secret": "Bí mật API",
@@ -438,6 +459,7 @@
     "Are you sure you want to delete all auto-disabled keys? This action cannot be undone.": "Bạn có chắc chắn muốn xóa tất cả các khóa bị tắt tự động? Hành động này không thể hoàn tác.",
     "Are you sure you want to delete channel \"{{name}}\"? This action cannot be undone.": "Bạn có chắc muốn xóa kênh \"{{name}}\" không? Hành động này không thể hoàn tác.",
     "Are you sure you want to delete deployment \"{{name}}\"? This action cannot be undone.": "Bạn có chắc muốn xóa triển khai \"{{name}}\" không? Hành động này không thể hoàn tác.",
+    "Are you sure you want to delete group": "Are you sure you want to delete group",
     "Are you sure you want to delete group \"{{name}}\"? This action cannot be undone.": "Bạn có chắc muốn xóa nhóm \"{{name}}\" không? Không thể hoàn tác thao tác này.",
     "Are you sure you want to delete model \"{{name}}\"? This action cannot be undone.": "Bạn có chắc muốn xóa mô hình \"{{name}}\" không? Không thể hoàn tác thao tác này.",
     "Are you sure you want to delete this key? This action cannot be undone.": "Bạn có chắc chắn muốn xóa khóa này? Hành động này không thể hoàn tác.",
@@ -514,6 +536,7 @@
     "Auto-fill when one field exists and another is missing": "Tự động điền khi một trường có giá trị và trường khác thiếu",
     "Auto-refreshing every {{seconds}}s": "Tự động làm mới mỗi {{seconds}} giây",
     "Auto-retry status codes": "Mã trạng thái tự thử lại",
+    "Auto-sync failed: {{message}}": "Auto-sync failed: {{message}}",
     "Automatically disable channel on repeated failures": "Tự động vô hiệu hóa kênh khi xảy ra lỗi lặp lại",
     "Automatically disable channels exceeding this response time": "Tự động vô hiệu hóa các kênh vượt quá thời gian phản hồi này",
     "Automatically disable channels when tests fail": "Tự động vô hiệu hóa các kênh khi kiểm thử thất bại",
@@ -854,6 +877,7 @@
     "Click \"Create Plan\" to create your first subscription plan": "Nhấp \"Tạo gói\" để tạo gói đăng ký đầu tiên",
     "Click \"Generate\" to create a token": "Nhấp \"Tạo\" để tạo một token",
     "Click a stage to show or hide that column": "Nhấp vào một giai đoạn để hiện hoặc ẩn cột đó",
+    "Click adjust to modify user quota": "Click adjust to modify user quota",
     "Click any category to drill into its models, apps, and trends": "Bấm vào danh mục để xem chi tiết mô hình, ứng dụng và xu hướng",
     "Click for details": "Nhấp để xem chi tiết",
     "Click save when you're done.": "Nhấn lưu khi bạn hoàn tất.",
@@ -973,7 +997,7 @@
     "Configure monitoring status page groups for the dashboard": "Cấu hình các nhóm trang trạng thái giám sát cho bảng điều khiển",
     "Configure NODE_NAME": "Cấu hình NODE_NAME",
     "Configure per-model ratio for image inputs or outputs.": "Cấu hình tỷ lệ theo mô hình cho đầu vào hoặc đầu ra hình ảnh.",
-    "Configure per-tool unit prices ($/1K calls). Per-request models do not incur additional tool fees.": "Cấu hình giá theo từng công cụ ($/1K lần gọi). Mô hình tính phí theo request không phát sinh thêm phí công cụ.",
+    "Configure per-tool unit prices (¥/1K calls). Per-request models do not incur additional tool fees.": "Configure per-tool unit prices (¥/1K calls). Per-request models do not incur additional tool fees.",
     "Configure pricing ratios for a specific model.": "Cấu hình tỷ lệ định giá cho một mô hình cụ thể.",
     "Configure rate limiting rules for a specific user group.": "Cấu hình quy tắc giới hạn tốc độ cho một nhóm người dùng cụ thể.",
     "Configure routes": "Cấu hình route",
@@ -1129,6 +1153,7 @@
     "Create a new user group to configure ratio overrides for.": "Tạo một nhóm người dùng mới để cấu hình ghi đè tỷ lệ.",
     "Create account": "Tạo tài khoản",
     "Create an account": "Tạo tài khoản",
+    "Complete registration and enter": "Complete registration and enter",
     "Create an API key to unlock the real request": "Tạo khóa API để mở yêu cầu thật",
     "Create and review invite or credit codes.": "Tạo và xem xét mã mời hoặc mã tín dụng.",
     "Create API Key": "Tạo Khóa API",
@@ -1166,6 +1191,7 @@
     "Created a subscription plan": "Đã tạo một gói đăng ký",
     "Created a vendor": "Đã tạo một nhà cung cấp",
     "Created At": "Ngày tạo",
+    "Updated At": "Updated At",
     "Created channel {{name}} (type {{type}}, count {{count}})": "Đã tạo kênh {{name}} (loại {{type}}, số lượng {{count}})",
     "Created user {{username}} (role {{role}})": "Đã tạo người dùng {{username}} (vai trò {{role}})",
     "Creates a Pancake product in the saved store using this plan’s title and price. Requires Waffo Pancake to be fully configured in Payment settings first.": "Tạo một sản phẩm Pancake trong cửa hàng đã lưu bằng tiêu đề và giá của gói này. Trước tiên cần cấu hình đầy đủ Waffo Pancake trong cài đặt Thanh toán.",
@@ -1277,6 +1303,7 @@
     "Degraded performance recently": "Hiệu năng gần đây bị giảm",
     "Delete": "Xóa",
     "Delete (": "Xóa (",
+    "Delete Group": "Delete Group",
     "Delete {{count}} API key(s)?": "Xóa {{count}} khóa API?",
     "Delete {{count}} stale instance records? Online instances will not be deleted.": "Xóa {{count}} bản ghi phiên bản mất kết nối? Các phiên bản đang trực tuyến sẽ không bị xóa.",
     "Delete a runtime request header": "Xóa header yêu cầu runtime",
@@ -1990,6 +2017,7 @@
     "Filter...": "Lọc...",
     "Filters": "Bộ lọc",
     "Filters active": "Bộ lọc đang bật",
+    "Filter models by vendor, group and tags.": "Filter models by vendor, group and tags.",
     "Final Consumed": "Tiêu thụ cuối cùng",
     "Final cost = base × multiplier when conditions match": "Chi phí cuối = cơ sở × hệ số khi thỏa điều kiện",
     "Final price multiplier (0.95 = 5% discount": "Hệ số nhân giá cuối cùng (0.95 = giảm giá 5%)",
@@ -2110,6 +2138,7 @@
     "Go Back": "Quay lại",
     "Go back and edit": "Quay lại và chỉnh sửa",
     "Go to Dashboard": "Truy cập Dashboard",
+    "Go to sign in": "Go to sign in",
     "Go to first page": "Đi đến trang đầu tiên",
     "Go to home": "Về trang chủ",
     "Go to io.net API Keys": "Đi đến Khóa API io.net",
@@ -2149,6 +2178,8 @@
     "Group Name": "Tên Nhóm",
     "Group name cannot be changed when editing.": "Tên nhóm không thể thay đổi khi chỉnh sửa.",
     "Group prices cannot be expanded because this expression is not a standard tiered pricing expression.": "Không thể mở rộng giá theo nhóm vì biểu thức này không phải là biểu thức giá theo bậc tiêu chuẩn.",
+    "Group Management": "Group Management",
+    "Group management usage guide": "Group management usage guide",
     "Group Pricing": "Định giá nhóm",
     "Group pricing usage guide": "Hướng dẫn sử dụng định giá theo nhóm",
     "group ratio": "tỷ lệ nhóm",
@@ -2163,6 +2194,31 @@
     "Groups *": "Nhóm *",
     "Please select at least one group": "Vui lòng chọn ít nhất một nhóm",
     "Groups that users can select when creating API keys.": "Các nhóm mà người dùng có thể chọn khi tạo khóa API.",
+    "Magnification": "Magnification",
+    "No Models": "No Models",
+    "Create Group": "Create Group",
+    "Edit Group": "Edit Group",
+    "Group Description": "Group Description",
+    "Enter group name": "Enter group name",
+    "Enter group description": "Enter group description",
+    "Set the price multiplier for models in this group.": "Set the price multiplier for models in this group.",
+    "Multiplier must be greater than 0.": "Multiplier must be greater than 0.",
+    "Model Configuration": "Model Configuration",
+    "Select available models for this group.": "Select available models for this group.",
+    "Loading available models...": "Loading available models...",
+    "No available models found.": "No available models found.",
+    "channels": "channels",
+    "Click to select or deselect models.": "Click to select or deselect models.",
+    "Group created successfully": "Group created successfully",
+    "Group deleted successfully": "Group deleted successfully",
+    "Group updated successfully": "Group updated successfully",
+    "Failed to load groups": "Failed to load groups",
+    "No Groups Found": "No Groups Found",
+    "No groups available. Add your first group to get started.": "No groups available. Add your first group to get started.",
+    "Original Group Name": "Original Group Name",
+    "New Group Name": "New Group Name",
+    "Update group information.": "Update group information.",
+    "Create a new group.": "Create a new group.",
     "Growth": "Tăng trưởng",
     "Guardrails": "Hàng rào bảo vệ",
     "Guest": "Khách",
@@ -2655,6 +2711,7 @@
     "model billing support": "hỗ trợ tính phí mô hình",
     "Model Call Analytics": "Phân tích lượt gọi",
     "Model context usage": "Sử dụng ngữ cảnh mô hình",
+    "Model created successfully": "Model created successfully",
     "Model deleted": "Đã xóa mô hình",
     "Model deleted successfully": "Model đã được xóa thành công",
     "Model Deployment": "Triển khai mô hình",
@@ -2700,6 +2757,7 @@
     "Model Tags": "Thẻ mô hình",
     "Model to use for testing": "Mô hình dùng để kiểm thử",
     "Model to use when testing channel connectivity": "Mô hình để sử dụng khi kiểm tra kết nối kênh",
+    "Model updated successfully": "Model updated successfully",
     "Model Version *": "Phiên bản mô hình *",
     "Model-scoped only": "Chỉ theo mô hình",
     "model(s) selected out of": "mô hình(s) được chọn trong số",
@@ -2732,6 +2790,7 @@
     "Monitor balance, usage, and request volume": "Theo dõi số dư, mức dùng và số lượng yêu cầu",
     "Monitored relay requests": "Yêu cầu relay được giám sát",
     "Monitoring & Alerts": "Giám sát & Cảnh báo",
+    "Monitoring & Logs": "Monitoring & Logs",
     "Month": "Tháng",
     "Month number": "Số tháng",
     "Monthly": "Hàng tháng",
@@ -3353,7 +3412,6 @@
     "Plan title is required": "Tiêu đề gói là bắt buộc",
     "Planned maintenance on Friday at 22:00 UTC...": "Bảo trì theo kế hoạch vào thứ Sáu lúc 22:00 UTC...",
     "Platform": "Nền tảng",
-    "Tenant": "Người thuê",
     "Platform Management": "Quản lý nền tảng",
     "Platform Users": "Người dùng nền tảng",
     "Personal Management": "Quản lý cá nhân",
@@ -3473,7 +3531,7 @@
     "Previous branch": "Nhánh trước",
     "Previous page": "Trang trước",
     "Price": "Giá",
-    "Price ($/1K calls)": "Giá ($/1K lượt gọi)",
+    "Price (¥/1K calls)": "Price (¥/1K calls)",
     "Price (local currency / USD)": "Giá (tiền tệ địa phương / USD)",
     "Price display": "Hiển thị giá",
     "Price display mode": "Chế độ hiển thị giá",
@@ -3519,6 +3577,7 @@
     "Profile": "Hồ sơ",
     "Profile updated successfully": "Hồ sơ đã được cập nhật thành công",
     "Programming": "Lập trình",
+    "Provider Channels": "Provider Channels",
     "Progress": "Tiến độ",
     "Project": "Dự án",
     "Promote": "Thúc đẩy",
@@ -3587,6 +3646,7 @@
     "Quota given to invited users ({{formattedQuota}})": "Hạn mức cấp cho người dùng được mời ({{formattedQuota}})",
     "Quota given to users who invite others": "Limit for users inviting others",
     "Quota given to users who invite others ({{formattedQuota}})": "Hạn mức cấp cho người dùng mời người khác ({{formattedQuota}})",
+    "Quota Management": "Quota Management",
     "Quota must be a positive number": "Hạn mức phải là một số dương",
     "Quota must be zero or greater": "Hạn mức không được âm",
     "Quota Per Unit": "Định mức mỗi đơn vị",
@@ -3640,6 +3700,7 @@
     "Recently launched models gaining traction": "Mô hình mới phát hành đang được ưa chuộng",
     "Recharge": "Nạp lại",
     "Recharge Amount": "Số tiền nạp",
+    "Recharge Price": "Recharge Price",
     "Recharge Amount (USD)": "Số tiền nạp (USD)",
     "Recommended": "Đề xuất",
     "Recommended actions": "Hành động đề xuất",
@@ -3992,6 +4053,7 @@
     "Search method identifiers...": "Tìm mã định danh phương thức...",
     "Search missing models": "Tìm kiếm mô hình bị thiếu",
     "Search model name, provider, endpoint, or tag...": "Tìm tên mô hình, nhà cung cấp, endpoint hoặc thẻ...",
+    "Search model name, provider, or tags...": "Search model name, provider, or tags...",
     "Search model name...": "Tìm kiếm tên mẫu...",
     "Search models": "Tìm kiếm mô hình",
     "Search models or fields...": "Tìm kiếm mô hình hoặc trường...",
@@ -4052,6 +4114,7 @@
     "Select end time": "Chọn thời gian kết thúc",
     "Select from presets or type custom identifier.": "Chọn từ các cài đặt sẵn hoặc nhập mã định danh tùy chỉnh.",
     "Select granularity": "Select detail level",
+    "Select groups": "Select groups",
     "Select groups (leave empty to keep current)": "Chọn nhóm (để trống để giữ nguyên hiện tại)",
     "Select interface density": "Chọn mật độ giao diện",
     "Select items...": "Chọn các mục...",
@@ -4062,6 +4125,7 @@
     "Select locations": "Chọn vị trí",
     "Select Model": "Chọn mẫu",
     "Select model {{model}}": "Chọn mô hình {{model}}",
+    "Select models...": "Select models...",
     "Select models (empty for allow all)": "Chọn model (để trống nếu muốn cho",
     "Select models and apply to channel models list.": "Chọn mô hình và áp dụng cho danh sách mô hình kênh.",
     "Select models or add custom ones": "Chọn các mô hình hoặc thêm các mô hình tùy chỉnh",
@@ -4093,6 +4157,7 @@
     "Select time granularity": "Chọn độ chi tiết thời gian",
     "Select type": "Chọn loại",
     "Select vendor": "Chọn nhà cung cấp",
+    "Select user groups and models for this account": "Select user groups and models for this account",
     "Selectable groups": "Nhóm có thể chọn",
     "selected": "đã chọn",
     "Selected {{count}}": "Đã chọn {{count}}",
@@ -4247,6 +4312,7 @@
     "SSRF Protection": "Bảo vệ SSRF",
     "stale": "mất kết nối",
     "Standard": "Tiêu chuẩn",
+    "Standard Price": "Standard Price",
     "Standard price": "Giá tiêu chuẩn",
     "Start": "Bắt đầu",
     "Start a conversation to see messages here": "Bắt đầu một cuộc trò chuyện để xem tin nhắn tại đây",
@@ -4365,6 +4431,7 @@
     "Synced upstream models": "Đã đồng bộ mô hình thượng nguồn",
     "Synchronize models and vendors from an upstream source": "Đồng bộ hóa các mô hình và nhà cung cấp từ một nguồn thượng nguồn",
     "Syncing prices, please wait...": "Đang đồng bộ giá, vui lòng đợi...",
+    "Syncing upstream model prices...": "Syncing upstream model prices...",
     "Syncing...": "Đang đồng bộ...",
     "System": "Hệ thống",
     "System Administration": "Quản trị hệ thống",
@@ -4671,6 +4738,7 @@
     "Top P": "Top P",
     "Top up balance and view billing history.": "Nạp tiền vào tài khoản và xem lịch sử thanh toán.",
     "Top Users": "Người dùng hàng đầu",
+    "Top Tenants": "Top Tenants",
     "Top vendors": "Nhà cung cấp hàng đầu",
     "Top-up": "Nạp tiền",
     "Top-up amount options": "Tùy chọn số tiền nạp",
@@ -4849,6 +4917,7 @@
     "Upstream path must be a full URL or a path starting with /": "Đường dẫn upstream phải là URL đầy đủ hoặc đường dẫn bắt đầu bằng /",
     "Upstream price sync": "Đồng bộ giá thượng nguồn",
     "Upstream prices fetched successfully": "Lấy giá upstream thành công",
+    "Upstream prices synced successfully": "Upstream prices synced successfully",
     "Upstream ratios fetched successfully": "Đã lấy tỷ lệ upstream thành công",
     "Upstream Request ID": "ID yêu cầu thượng nguồn",
     "Upstream Response": "Upstream feedback",
@@ -4927,6 +4996,8 @@
     "User Analytics": "Thống kê người dùng",
     "User Consumption Ranking": "Xếp hạng tiêu thụ",
     "User Consumption Trend": "Xu hướng tiêu thụ",
+    "Tenant Consumption Ranking": "Tenant Consumption Ranking",
+    "Tenant Consumption Trend": "Tenant Consumption Trend",
     "User created successfully": "Tạo người dùng thành công",
     "User dashboard and quota controls.": "Bảng điều khiển người dùng và kiểm soát hạn ngạch.",
     "User deleted successfully": "Xóa người dùng thành công",
@@ -4957,6 +5028,9 @@
     "Username": "Tên người dùng",
     "Username confirmation does not match": "Xác nhận tên người dùng không khớp",
     "Username Field": "Trường Tên người dùng",
+    "Username can only contain letters, numbers, and underscores": "Username can only contain letters, numbers, and underscores",
+    "Username must be at least 3 characters": "Username must be at least 3 characters",
+    "Username must be at most {{max}} characters": "Username must be at most {{max}} characters",
     "Username or Email": "Tên đăng nhập hoặc Email",
     "Users": "Người dùng",
     "Users call the model on the left. The platform forwards the request to the upstream model on the right.": "Người dùng gọi mô hình bên trái. Nền tảng chuyển tiếp yêu cầu đến mô hình thượng nguồn bên phải.",
@@ -5111,6 +5185,8 @@
     "Weight": "Trọng lượng",
     "Weighted by request count": "Có trọng số theo số yêu cầu",
     "Welcome back!": "Chào mừng trở lại!",
+    "Welcome to register": "Welcome to register",
+    "Welcome to register · {{tenantName}}": "Welcome to register · {{tenantName}}",
     "Welcome to our New API...": "Chào mừng bạn đến với API mới của chúng tôi...",
     "Well-Known URL": "URL đã biết",
     "Well-Known URL must start with http:// or https://": "URL Well-Known phải bắt đầu bằng http:// hoặc https://",
@@ -5118,6 +5194,7 @@
     "When a token uses the auto group, the system tries groups from top to bottom until it finds an available group.": "Khi token dùng nhóm auto, hệ thống thử các nhóm từ trên xuống dưới cho đến khi tìm được nhóm khả dụng.",
     "When billed as {{group}}": "Khi tính phí theo {{group}}",
     "When conditions match, the final price is multiplied by X. Multiple matches multiply together; values < 1 act as discounts.": "Khi thỏa điều kiện, giá cuối nhân với X. Nhiều điều kiện khớp nhân lại với nhau; giá trị < 1 hoạt động như giảm giá.",
+    "You are invited by the institution to join the platform. Simply set an account and password to complete registration. After signing in, you will automatically enter the menus and permissions assigned by this institution.": "You are invited by the institution to join the platform. Simply set an account and password to complete registration. After signing in, you will automatically enter the menus and permissions assigned by this institution.",
     "When enabled, if channels in the current group fail, it will try channels in the next group in order.": "Khi được bật, nếu các kênh trong nhóm hiện tại thất bại, hệ thống sẽ thử các kênh của nhóm tiếp theo theo thứ tự.",
     "When enabled, keep the affinity entry even if the affinity channel is disabled or no longer usable for the current group/model. Leave it off to delete the entry and select another channel.": "Khi bật, giữ mục ưu tiên ngay cả khi kênh ưu tiên bị tắt hoặc không còn dùng được cho nhóm/mô hình hiện tại. Để tắt để xóa mục đó và chọn kênh khác.",
     "When enabled, large request bodies are temporarily stored on disk instead of memory, significantly reducing memory usage. SSD recommended.": "Khi bật, nội dung yêu cầu lớn sẽ được lưu tạm trên đĩa thay vì bộ nhớ, giảm đáng kể việc sử dụng bộ nhớ. Khuyến nghị dùng SSD.",
@@ -5126,6 +5203,9 @@
     "When enabled, prompts are scanned before reaching upstream models.": "Khi được bật,",
     "When enabled, the store field will be blocked": "Khi được bật, trường store sẽ bị chặn",
     "When enabled, users can pick this group when creating tokens.": "Khi bật, người dùng có thể chọn nhóm này khi tạo token.",
+    "Institution administrator identity is activated after registration": "Institution administrator identity is activated after registration",
+    "Login password": "Login password",
+    "You will see the accessible menus configured by this institution and have button-level permissions for the corresponding pages.": "You will see the accessible menus configured by this institution and have button-level permissions for the corresponding pages.",
     "When enabled, violation requests will incur additional charges.": "Khi bật, các yêu cầu vi phạm sẽ phải chịu phí bổ sung.",
     "When enabled, zero-cost models also pre-consume quota before final settlement.": "Khi được bật, các mô hình không tốn phí cũng trừ trước hạn mức trước khi quyết toán cuối cùng.",
     "When no conditions are set, the operation always executes.": "Khi không có điều kiện, thao tác luôn được thực thi.",
@@ -5195,6 +5275,148 @@
     "Zero retention": "Không lưu dữ liệu",
     "Zhipu": "Zhipu",
     "Zhipu V4": "Zhipu V4",
-    "Zoom": "Zoom"
+    "Zoom": "Zoom",
+    "Platform Roles": "Platform Roles",
+    "Roles & Permissions": "Roles & Permissions",
+    "Role Name": "Role Name",
+    "Role Description": "Role Description",
+    "Permission Modules": "Permission Modules",
+    "Permission Actions": "Permission Actions",
+    "Create Role": "Create Role",
+    "Role Details": "Role Details",
+    "Edit Role": "Edit Role",
+    "Delete Role": "Delete Role",
+    "Filter by role name...": "Filter by role name...",
+    "No Roles Found": "No Roles Found",
+    "No roles available. Try adjusting your search.": "No roles available. Try adjusting your search.",
+    "Add a new platform role by providing necessary info.": "Add a new platform role by providing necessary info.",
+    "View role details and assigned permissions.": "View role details and assigned permissions.",
+    "Enter role name": "Enter role name",
+    "Enter role description": "Enter role description",
+    "Update the role by providing necessary info.": "Update the role by providing necessary info.",
+    "Role updated successfully": "Role updated successfully",
+    "Failed to update role": "Failed to update role",
+    "Role created successfully": "Role created successfully",
+    "Failed to create role": "Failed to create role",
+    "Role deleted successfully": "Role deleted successfully",
+    "Failed to delete role": "Failed to delete role",
+    "Failed to load roles": "Failed to load roles",
+    "Role name is required": "Role name is required",
+    "Super Administrator": "Super Administrator",
+    "Full access to all platform management features": "Full access to all platform management features",
+    "Operations Administrator": "Operations Administrator",
+    "Manage channels, models, users, and daily operations": "Manage channels, models, users, and daily operations",
+    "Finance Administrator": "Finance Administrator",
+    "View billing, wallet, top-up, and financial reports": "View billing, wallet, top-up, and financial reports",
+    "Read-only Auditor": "Read-only Auditor",
+    "View platform data without changing configurations": "View platform data without changing configurations",
+    "Configure the role name, description, and availability.": "Configure the role name, description, and availability.",
+    "Configure the role name and description.": "Configure the role name and description.",
+    "View role name, description, and permission summary.": "View role name, description, and permission summary.",
+    "Role Type": "Role Type",
+    "Role Status": "Role Status",
+    "Enable this role for assignment": "Enable this role for assignment",
+    "Data Scope": "Data Scope",
+    "Current platform data": "Current platform data",
+    "Tenant": "Người thuê",
+    "Permission Parameters": "Permission Parameters",
+    "All Permissions": "All Permissions",
+    "All permission modules and actions assigned to this role.": "All permission modules and actions assigned to this role.",
+    "No permissions assigned": "No permissions assigned",
+    "Select available modules and actions for this role.": "Select available modules and actions for this role.",
+    "Select available modules and actions for this tenant.": "View available modules and actions for this tenant.",
+    "Manage channel list, test channels, and update channel settings": "Manage channel list, test channels, and update channel settings",
+    "Model Management": "Model Management",
+    "Manage model metadata, pricing, and upstream model mappings": "Manage model metadata, pricing, and upstream model mappings",
+    "User Management": "User Management",
+    "Manage platform users, quotas, groups, and user roles": "Manage platform users, quotas, groups, and user roles",
+    "Finance Management": "Finance Management",
+    "View wallet, billing, top-up, redemption, and financial records": "View wallet, billing, top-up, redemption, and financial records",
+    "Export": "Export",
+    "Audit": "Audit",
+    "Own": "Own",
+    "Are you sure you want to delete role {{name}}?": "Are you sure you want to delete role {{name}}?",
+    "Keys": "Keys",
+    "Tenant Management": "Tenant Management",
+    "Tenant List": "Tenant List",
+    "Tenants": "Tenants",
+    "Tenant Name": "Tenant Name",
+    "Tenant Code": "Tenant Code",
+    "Tenant Status": "Tenant Status",
+    "Administrator": "Administrator",
+    "Administrator Email": "Administrator Email",
+    "Administrator Status": "Administrator Status",
+    "Registered": "Registered",
+    "Unregistered": "Unregistered",
+    "Normal": "Normal",
+    "Quota Limit": "Quota Limit",
+    "Authorization Time": "Authorization Time",
+    "Time Range": "Time Range",
+    "Tenant Settings": "Tenant Settings",
+    "Start Date": "Start Date",
+    "End Date": "End Date",
+    "Create Tenant": "Create Tenant",
+    "Edit Tenant": "Edit Tenant",
+    "Delete Tenant": "Delete Tenant",
+    "Enter tenant name": "Enter tenant name",
+    "Enter tenant code": "Enter tenant code",
+    "Enter group": "Enter group",
+    "Enter administrator name": "Enter administrator name",
+    "Enter administrator email": "Enter administrator email",
+    "Enter remark": "Enter remark",
+    "Select status": "Select status",
+    "Select administrator status": "Select administrator status",
+    "Configure tenant identity and administrator information.": "Configure tenant identity and administrator information.",
+    "Manage status, quota limit and time range for this tenant.": "Manage status, quota limit and time range for this tenant.",
+    "Create a new tenant and assign initial resource settings.": "Create a new tenant and assign initial resource settings.",
+    "Update tenant information and resource settings.": "Update tenant information and resource settings.",
+    "Tenant name is required": "Tenant name is required",
+    "Tenant code is required": "Tenant code is required",
+    "Administrator is required": "Administrator is required",
+    "Quota must be greater than or equal to 0": "Quota must be greater than or equal to 0",
+    "Tenant updated successfully": "Tenant updated successfully",
+    "Tenant created successfully": "Tenant created successfully",
+    "Tenant deleted successfully": "Tenant deleted successfully",
+    "No Tenants Found": "No Tenants Found",
+    "No tenants available. Try adjusting your search.": "No tenants available. Try adjusting your search.",
+    "Filter by tenant name, code, group or administrator...": "Filter by tenant name, code, group or administrator...",
+    "Are you sure you want to delete tenant {{name}}?": "Are you sure you want to delete tenant {{name}}?",
+    "Invalid email address": "Invalid email address",
+    "End date cannot be earlier than start date": "End date cannot be earlier than start date",
+    "Invitation sent to {{email}}": "Invitation sent to {{email}}",
+    "Tenant enabled successfully": "Tenant enabled successfully",
+    "Tenant disabled successfully": "Tenant disabled successfully",
+    "Are you sure you want to disable tenant {{name}}?": "Are you sure you want to disable tenant {{name}}?",
+    "Are you sure you want to enable tenant {{name}}?": "Are you sure you want to enable tenant {{name}}?",
+    "View tenant information and administrator details.": "View tenant information and administrator details.",
+    "View tenant information and permission parameter details.": "View tenant information and permission parameter details.",
+    "Invite administrator to register": "Invite administrator to register",
+    "Tenant Details": "Tenant Details",
+    "Administrator Information": "Administrator Information",
+    "Resource Settings": "Resource Settings",
+    "No remark": "No remark",
+    "Tenant ID": "Tenant ID",
+    "Contact Person": "Contact Person",
+    "Contact Phone": "Contact Phone",
+    "Contact Email": "Contact Email",
+    "Enter contact person": "Enter contact person",
+    "Enter contact phone": "Enter contact phone",
+    "Enter contact email": "Enter contact email",
+    "Select group": "Select group",
+    "Permission Configuration": "Permission Configuration",
+    "Permissions will be loaded from the API and displayed as a tree.": "Permissions will be loaded from the API and displayed as a tree.",
+    "Configure tenant identity and contact information.": "Configure tenant identity and contact information.",
+    "Manage quota limit and time range for this tenant.": "Manage quota limit and time range for this tenant.",
+    "Save and invite administrator": "Save and invite administrator",
+    "Invite Administrator": "Invite Administrator",
+    "Send an invitation email to the tenant administrator.": "Send an invitation email to the tenant administrator.",
+    "Send Invitation": "Send Invitation",
+    "Administrator Registration": "Administrator Registration",
+    "Send the link below to the administrator of {{tenantName}}. After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.": "Send the link below to the administrator of {{tenantName}}. After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.",
+    "Send the link below to the administrator of {{tenantName}}": "Send the link below to the administrator of {{tenantName}}",
+    "After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.": "After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.",
+    "Copy invitation link": "Copy invitation link",
+    "Invitation link copied": "Invitation link copied",
+    "Failed to copy invitation link": "Failed to copy invitation link"
   }
 }

+ 226 - 5
default/src/i18n/locales/zh-TW.json

@@ -3,6 +3,20 @@
     "360": "360",
     "1000": "1000",
     "10000": "10000",
+    "Average Response Time": "Average Response Time",
+    "Average request duration": "Average request duration",
+    "Completion Tokens": "Completion Tokens",
+    "Consumed quota": "Consumed quota",
+    "Direct Sub-Tenant Ranking": "Direct Sub-Tenant Ranking",
+    "Fail Count": "Fail Count",
+    "Failed requests": "Failed requests",
+    "Model Distribution": "Model Distribution",
+    "Prompt Tokens": "Prompt Tokens",
+    "Quota Consumed": "Quota Consumed",
+    "Success Count": "Success Count",
+    "Successful requests": "Successful requests",
+    "Time Trend": "Time Trend",
+    "User Ranking": "User Ranking",
     "_copy": "_複製",
     ",": ",",
     ", and": ",和",
@@ -125,12 +139,14 @@
     "Accepts a JSON array of model identifiers that support the Imagine API.": "接受支援 Imagine API 的模型標識符的 JSON 陣列。",
     "Accepts comma-separated status codes and inclusive ranges.": "接受逗號分隔的狀態碼和包含性範圍。",
     "Access a vast selection of models via a standard, unified API protocol. Power AI applications, manage digital assets, and connect the Future.": "透過統一、標準的介面協定接入海量模型。承載 AI 套用,高效管理數位資產,連接未來。",
+    "Access Control": "Access Control",
     "Access Denied Message": "存取被拒訊息",
     "Access Forbidden": "禁止存取",
     "Access Policy (JSON)": "存取政策 (JSON)",
     "Access previous conversations and start new ones.": "存取之前的對話並開始新的對話。",
     "Access Token": "存取令牌",
     "AccessKey / SecretAccessKey": "AccessKey / SecretAccessKey",
+    "Account & Access": "Account & Access",
     "Account Binding Management": "用戶連結管理",
     "Account Bindings": "用戶連結",
     "Account created! Please sign in": "用戶已建立!請登入",
@@ -140,6 +156,9 @@
     "Account used when authenticating with the SMTP server": "用於與 SMTP 伺服器進行身份驗證的用戶",
     "acknowledge the related legal risks": "確認相關法律風險",
     "Across all groups": "跨所有分組",
+    "All groups": "All groups",
+    "All tags": "All tags",
+    "All vendors": "All vendors",
     "Action": "操作",
     "Action confirmation": "操作確認",
     "Actions": "操作",
@@ -341,6 +360,7 @@
     "Allowed Origins": "允許的 Origins",
     "Allowed Ports": "允許的端口",
     "Already have an account?": "已有用戶?",
+    "Already have an account? Back to login": "Already have an account? Back to login",
     "Always matches (default tier).": "始終匹配(預設檔位)。",
     "Amount": "金額",
     "Amount cannot be changed when editing.": "編輯時無法更改數量。",
@@ -398,6 +418,7 @@
     "API Key mode: use APIKey|Region": "API Key 模式:使用 APIKey|Region",
     "API Key updated successfully": "API 金鑰更新成功",
     "API Keys": "API 金鑰",
+    "API Logs": "API Logs",
     "API Private Key": "API 私鑰",
     "API Requests": "API 請求",
     "API secret": "API 密鑰",
@@ -438,6 +459,7 @@
     "Are you sure you want to delete all auto-disabled keys? This action cannot be undone.": "您確定要刪除所有自動停用的金鑰嗎?此操作無法撤銷。",
     "Are you sure you want to delete channel \"{{name}}\"? This action cannot be undone.": "確定要刪除渠道「{{name}}」嗎?此操作無法撤銷。",
     "Are you sure you want to delete deployment \"{{name}}\"? This action cannot be undone.": "確定要刪除部署「{{name}}」嗎?此操作不可撤銷。",
+    "Are you sure you want to delete group": "Are you sure you want to delete group",
     "Are you sure you want to delete group \"{{name}}\"? This action cannot be undone.": "確定要刪除分組「{{name}}」嗎?此操作無法撤銷。",
     "Are you sure you want to delete model \"{{name}}\"? This action cannot be undone.": "確定要刪除模型「{{name}}」嗎?此操作無法撤銷。",
     "Are you sure you want to delete this key? This action cannot be undone.": "您確定要刪除此金鑰嗎?此操作無法撤銷。",
@@ -514,6 +536,7 @@
     "Auto-fill when one field exists and another is missing": "在一個欄位有值、另一個缺失時自動補齊",
     "Auto-refreshing every {{seconds}}s": "每 {{seconds}} 秒自動重新整理",
     "Auto-retry status codes": "自動重試狀態碼",
+    "Auto-sync failed: {{message}}": "Auto-sync failed: {{message}}",
     "Automatically disable channel on repeated failures": "重複失敗時自動停用渠道",
     "Automatically disable channels exceeding this response time": "自動停用超出此回應時間的渠道",
     "Automatically disable channels when tests fail": "當測試失敗時自動停用渠道",
@@ -854,6 +877,7 @@
     "Click \"Create Plan\" to create your first subscription plan": "點擊「新建套餐」建立您的第一個訂閱套餐",
     "Click \"Generate\" to create a token": "點擊「生成」以建立令牌",
     "Click a stage to show or hide that column": "點擊某個階段可顯示或隱藏對應的列",
+    "Click adjust to modify user quota": "Click adjust to modify user quota",
     "Click any category to drill into its models, apps, and trends": "點擊任意分類可下鑽查看其模型、套用與趨勢",
     "Click for details": "點擊查看詳情",
     "Click save when you're done.": "完成後點擊儲存。",
@@ -973,7 +997,7 @@
     "Configure monitoring status page groups for the dashboard": "設定用於儀表板的監控狀態頁面分組",
     "Configure NODE_NAME": "設定 NODE_NAME",
     "Configure per-model ratio for image inputs or outputs.": "設定圖像輸入或輸出的每模型比例。",
-    "Configure per-tool unit prices ($/1K calls). Per-request models do not incur additional tool fees.": "為每個工具設定單價($/1K 次呼叫)。按請求收費的模型不額外收取工具費用。",
+    "Configure per-tool unit prices (¥/1K calls). Per-request models do not incur additional tool fees.": "Configure per-tool unit prices (¥/1K calls). Per-request models do not incur additional tool fees.",
     "Configure pricing ratios for a specific model.": "設定特定模型的定價比例。",
     "Configure rate limiting rules for a specific user group.": "設定特定用戶分組的速率限制規則。",
     "Configure routes": "設定路由",
@@ -1129,6 +1153,7 @@
     "Create a new user group to configure ratio overrides for.": "建立一個新的用戶分組來設定比例覆蓋。",
     "Create account": "建立用戶",
     "Create an account": "建立一個用戶",
+    "Complete registration and enter": "Complete registration and enter",
     "Create an API key to unlock the real request": "建立 API 金鑰以解鎖真實請求",
     "Create and review invite or credit codes.": "建立和審查邀請或信用代碼。",
     "Create API Key": "建立 API 金鑰",
@@ -1166,6 +1191,7 @@
     "Created a subscription plan": "建立了一個訂閱計劃",
     "Created a vendor": "建立了一個供應商",
     "Created At": "建立時間",
+    "Updated At": "Updated At",
     "Created channel {{name}} (type {{type}}, count {{count}})": "建立渠道 {{name}}(類型 {{type}},數量 {{count}})",
     "Created user {{username}} (role {{role}})": "建立用戶 {{username}}(角色 {{role}})",
     "Creates a Pancake product in the saved store using this plan’s title and price. Requires Waffo Pancake to be fully configured in Payment settings first.": "使用此套餐的標題和價格,在已儲存的店鋪中建立 Pancake 產品。需要先在支付設定中完整設定 Waffo Pancake。",
@@ -1277,6 +1303,7 @@
     "Degraded performance recently": "近期性能有所下降",
     "Delete": "刪除",
     "Delete (": "刪除 (",
+    "Delete Group": "Delete Group",
     "Delete {{count}} API key(s)?": "刪除 {{count}} 個 API 金鑰?",
     "Delete {{count}} stale instance records? Online instances will not be deleted.": "刪除 {{count}} 筆失聯實例記錄?線上實例不會被刪除。",
     "Delete a runtime request header": "刪除運行期請求頭",
@@ -1990,6 +2017,7 @@
     "Filter...": "篩選...",
     "Filters": "篩選器",
     "Filters active": "篩選已啟用",
+    "Filter models by vendor, group and tags.": "Filter models by vendor, group and tags.",
     "Final Consumed": "最終消耗",
     "Final cost = base × multiplier when conditions match": "匹配條件時,最終費用 = 基礎費用 × 倍率",
     "Final price multiplier (0.95 = 5% discount": "最終價格乘數 (0.95 = 5% 折扣",
@@ -2110,6 +2138,7 @@
     "Go Back": "返回",
     "Go back and edit": "返回修改",
     "Go to Dashboard": "前往儀表板",
+    "Go to sign in": "Go to sign in",
     "Go to first page": "前往首頁",
     "Go to home": "返回主頁",
     "Go to io.net API Keys": "前往 io.net API 金鑰",
@@ -2149,6 +2178,8 @@
     "Group Name": "分組名稱",
     "Group name cannot be changed when editing.": "編輯時無法更改組名稱。",
     "Group prices cannot be expanded because this expression is not a standard tiered pricing expression.": "該表達式不是標準分檔收費表達式,無法展開分組價格。",
+    "Group Management": "Group Management",
+    "Group management usage guide": "Group management usage guide",
     "Group Pricing": "分組定價",
     "Group pricing usage guide": "分組定價使用教學",
     "group ratio": "分組倍率",
@@ -2163,6 +2194,31 @@
     "Groups *": "分組 *",
     "Please select at least one group": "請至少選擇一個分組",
     "Groups that users can select when creating API keys.": "用戶在建立 API 金鑰時可以選擇的分組。",
+    "Magnification": "Magnification",
+    "No Models": "No Models",
+    "Create Group": "Create Group",
+    "Edit Group": "Edit Group",
+    "Group Description": "Group Description",
+    "Enter group name": "Enter group name",
+    "Enter group description": "Enter group description",
+    "Set the price multiplier for models in this group.": "Set the price multiplier for models in this group.",
+    "Multiplier must be greater than 0.": "Multiplier must be greater than 0.",
+    "Model Configuration": "Model Configuration",
+    "Select available models for this group.": "Select available models for this group.",
+    "Loading available models...": "Loading available models...",
+    "No available models found.": "No available models found.",
+    "channels": "channels",
+    "Click to select or deselect models.": "Click to select or deselect models.",
+    "Group created successfully": "Group created successfully",
+    "Group deleted successfully": "Group deleted successfully",
+    "Group updated successfully": "Group updated successfully",
+    "Failed to load groups": "Failed to load groups",
+    "No Groups Found": "No Groups Found",
+    "No groups available. Add your first group to get started.": "No groups available. Add your first group to get started.",
+    "Original Group Name": "Original Group Name",
+    "New Group Name": "New Group Name",
+    "Update group information.": "Update group information.",
+    "Create a new group.": "Create a new group.",
     "Growth": "增長",
     "Guardrails": "安全護欄",
     "Guest": "訪客",
@@ -2412,7 +2468,6 @@
     "Key Sources": "Key 來源",
     "Key Summary": "Key 摘要",
     "Key Update Mode": "金鑰更新模式",
-    "Keys": "API 金鑰",
     "Keys, OAuth credentials, and multi-key update behavior.": "管理金鑰、OAuth 憑證和多金鑰更新行為。",
     "Kind": "類型",
     "Kling": "Kling",
@@ -2656,6 +2711,7 @@
     "model billing support": "模型收費支援",
     "Model Call Analytics": "呼叫分析",
     "Model context usage": "模型上下文用量",
+    "Model created successfully": "Model created successfully",
     "Model deleted": "模型已刪除",
     "Model deleted successfully": "模型刪除成功",
     "Model Deployment": "模型部署",
@@ -2701,6 +2757,7 @@
     "Model Tags": "模型標籤",
     "Model to use for testing": "用於測試的模型",
     "Model to use when testing channel connectivity": "測試渠道連接時使用的模型",
+    "Model updated successfully": "Model updated successfully",
     "Model Version *": "模型版本 *",
     "Model-scoped only": "僅模型分流",
     "model(s) selected out of": "已選模型(共)",
@@ -2733,6 +2790,7 @@
     "Monitor balance, usage, and request volume": "監控餘額、用量和請求量",
     "Monitored relay requests": "已監控的中繼請求",
     "Monitoring & Alerts": "監控與警報",
+    "Monitoring & Logs": "Monitoring & Logs",
     "Month": "本月",
     "Month number": "月份",
     "Monthly": "每月",
@@ -3354,7 +3412,6 @@
     "Plan title is required": "套餐標題為必填項",
     "Planned maintenance on Friday at 22:00 UTC...": "計劃於週五 22:00 UTC 進行維護...",
     "Platform": "平台",
-    "Tenant": "租戶",
     "Platform Management": "平台管理",
     "Platform Users": "平台用戶",
     "Personal Management": "個人管理",
@@ -3474,7 +3531,7 @@
     "Previous branch": "上一分支",
     "Previous page": "上一頁",
     "Price": "價格",
-    "Price ($/1K calls)": "價格($/1K 次)",
+    "Price (¥/1K calls)": "Price (¥/1K calls)",
     "Price (local currency / USD)": "價格(本地貨幣/美元)",
     "Price display": "價格顯示",
     "Price display mode": "價格顯示模式",
@@ -3520,6 +3577,7 @@
     "Profile": "個人資料",
     "Profile updated successfully": "個人資料更新成功",
     "Programming": "編程",
+    "Provider Channels": "Provider Channels",
     "Progress": "進度",
     "Project": "項目",
     "Promote": "提升",
@@ -3588,6 +3646,7 @@
     "Quota given to invited users ({{formattedQuota}})": "授予被邀請用戶的配額({{formattedQuota}})",
     "Quota given to users who invite others": "授予邀請其他用戶的配額",
     "Quota given to users who invite others ({{formattedQuota}})": "授予邀請其他用戶的配額({{formattedQuota}})",
+    "Quota Management": "Quota Management",
     "Quota must be a positive number": "配額必須是正數",
     "Quota must be zero or greater": "額度不能為負數",
     "Quota Per Unit": "每單位配額",
@@ -3641,6 +3700,7 @@
     "Recently launched models gaining traction": "近期發佈並快速增長的模型",
     "Recharge": "儲值",
     "Recharge Amount": "儲值金額",
+    "Recharge Price": "Recharge Price",
     "Recharge Amount (USD)": "儲值金額 (USD)",
     "Recommended": "推薦",
     "Recommended actions": "推薦操作",
@@ -3993,6 +4053,7 @@
     "Search method identifiers...": "搜尋支付方式標識...",
     "Search missing models": "搜尋缺失的模型",
     "Search model name, provider, endpoint, or tag...": "搜尋模型名稱、供應商、端點或標籤...",
+    "Search model name, provider, or tags...": "Search model name, provider, or tags...",
     "Search model name...": "搜尋模型名稱...",
     "Search models": "搜尋模型",
     "Search models or fields...": "搜尋模型或欄位...",
@@ -4053,6 +4114,7 @@
     "Select end time": "選擇結束時間",
     "Select from presets or type custom identifier.": "從預設中選擇或輸入自訂標識符。",
     "Select granularity": "選擇粒度",
+    "Select groups": "Select groups",
     "Select groups (leave empty to keep current)": "選擇分組(留空以保持目前設定)",
     "Select interface density": "選擇介面密度",
     "Select items...": "選擇項目...",
@@ -4063,6 +4125,7 @@
     "Select locations": "選擇位置",
     "Select Model": "選擇模型",
     "Select model {{model}}": "選擇模型 {{model}}",
+    "Select models...": "Select models...",
     "Select models (empty for allow all)": "選擇模型(留空表示允許所有)",
     "Select models and apply to channel models list.": "選擇模型並套用到渠道模型清單。",
     "Select models or add custom ones": "選擇模型或新增自訂模型",
@@ -4094,6 +4157,7 @@
     "Select time granularity": "選擇時間粒度",
     "Select type": "選擇類型",
     "Select vendor": "選擇供應商",
+    "Select user groups and models for this account": "Select user groups and models for this account",
     "Selectable groups": "可選分組",
     "selected": "已選擇",
     "Selected {{count}}": "已選 {{count}} 個",
@@ -4248,6 +4312,7 @@
     "SSRF Protection": "SSRF 保護",
     "stale": "失聯",
     "Standard": "標準",
+    "Standard Price": "Standard Price",
     "Standard price": "標準價格",
     "Start": "開始",
     "Start a conversation to see messages here": "開始對話以在此處查看訊息",
@@ -4366,6 +4431,7 @@
     "Synced upstream models": "同步上游模型",
     "Synchronize models and vendors from an upstream source": "從上游源同步模型和供應商",
     "Syncing prices, please wait...": "正在同步價格,請稍候...",
+    "Syncing upstream model prices...": "Syncing upstream model prices...",
     "Syncing...": "同步中...",
     "System": "系統",
     "System Administration": "系統管理",
@@ -4672,6 +4738,7 @@
     "Top P": "Top P",
     "Top up balance and view billing history.": "儲值餘額並查看賬單歷史。",
     "Top Users": "熱門用戶",
+    "Top Tenants": "Top Tenants",
     "Top vendors": "熱門廠商",
     "Top-up": "儲值",
     "Top-up amount options": "儲值金額選項",
@@ -4850,6 +4917,7 @@
     "Upstream path must be a full URL or a path starting with /": "上游路徑必須是完整 URL,或以 / 開頭的路徑",
     "Upstream price sync": "上游價格同步",
     "Upstream prices fetched successfully": "已成功獲取上游價格",
+    "Upstream prices synced successfully": "Upstream prices synced successfully",
     "Upstream ratios fetched successfully": "上游比率獲取成功",
     "Upstream Request ID": "上游請求 ID",
     "Upstream Response": "上游返回",
@@ -4928,6 +4996,8 @@
     "User Analytics": "用戶統計",
     "User Consumption Ranking": "用戶消耗排行",
     "User Consumption Trend": "用戶消耗趨勢",
+    "Tenant Consumption Ranking": "Tenant Consumption Ranking",
+    "Tenant Consumption Trend": "Tenant Consumption Trend",
     "User created successfully": "用戶建立成功",
     "User dashboard and quota controls.": "用戶儀表板和配額控制。",
     "User deleted successfully": "用戶刪除成功",
@@ -4958,6 +5028,9 @@
     "Username": "用戶名",
     "Username confirmation does not match": "用戶名確認不匹配",
     "Username Field": "用戶名欄位",
+    "Username can only contain letters, numbers, and underscores": "Username can only contain letters, numbers, and underscores",
+    "Username must be at least 3 characters": "Username must be at least 3 characters",
+    "Username must be at most {{max}} characters": "Username must be at most {{max}} characters",
     "Username or Email": "用戶名或電郵",
     "Users": "用戶",
     "Users call the model on the left. The platform forwards the request to the upstream model on the right.": "用戶呼叫左側的模型。平台將請求轉發給右側的上游模型。",
@@ -5112,6 +5185,8 @@
     "Weight": "權重",
     "Weighted by request count": "按請求數加權",
     "Welcome back!": "歡迎回來!",
+    "Welcome to register": "Welcome to register",
+    "Welcome to register · {{tenantName}}": "Welcome to register · {{tenantName}}",
     "Welcome to our New API...": "歡迎使用我們的 New API...",
     "Well-Known URL": "Well-Known URL",
     "Well-Known URL must start with http:// or https://": "知名 URL 必須以 http:// 或 https:// 開頭",
@@ -5119,6 +5194,7 @@
     "When a token uses the auto group, the system tries groups from top to bottom until it finds an available group.": "當令牌使用 auto 分組時,系統會按從上到下的順序嘗試,直到找到可用分組。",
     "When billed as {{group}}": "按 {{group}} 收費時",
     "When conditions match, the final price is multiplied by X. Multiple matches multiply together; values < 1 act as discounts.": "條件滿足時,最終價格乘以 X;多條命中的倍率會相乘;小於 1 的值為折扣。",
+    "You are invited by the institution to join the platform. Simply set an account and password to complete registration. After signing in, you will automatically enter the menus and permissions assigned by this institution.": "You are invited by the institution to join the platform. Simply set an account and password to complete registration. After signing in, you will automatically enter the menus and permissions assigned by this institution.",
     "When enabled, if channels in the current group fail, it will try channels in the next group in order.": "開啟後,目前分組渠道失敗時會按順序嘗試下一個分組的渠道。",
     "When enabled, keep the affinity entry even if the affinity channel is disabled or no longer usable for the current group/model. Leave it off to delete the entry and select another channel.": "開啟後,親和到的渠道被停用,或不再適用於目前分組/模型時,仍保留這條親和;關閉時會刪除並重新選擇渠道。",
     "When enabled, large request bodies are temporarily stored on disk instead of memory, significantly reducing memory usage. SSD recommended.": "啟用磁碟緩存後,大請求體將臨時儲存到磁碟而非記憶體,可顯著降低記憶體佔用。建議在 SSD 環境下使用。",
@@ -5127,6 +5203,9 @@
     "When enabled, prompts are scanned before reaching upstream models.": "啟用後,提示將在到達上游模型之前被掃描。",
     "When enabled, the store field will be blocked": "開啟後將阻止 store 欄位透傳",
     "When enabled, users can pick this group when creating tokens.": "啟用後,用戶建立令牌時可以選擇該分組。",
+    "Institution administrator identity is activated after registration": "Institution administrator identity is activated after registration",
+    "Login password": "Login password",
+    "You will see the accessible menus configured by this institution and have button-level permissions for the corresponding pages.": "You will see the accessible menus configured by this institution and have button-level permissions for the corresponding pages.",
     "When enabled, violation requests will incur additional charges.": "開啟後,違規請求將額外扣費。",
     "When enabled, zero-cost models also pre-consume quota before final settlement.": "啟用後,零成本模型也會在最終結算前預先消耗配額。",
     "When no conditions are set, the operation always executes.": "沒有條件時,預設總是執行該操作。",
@@ -5196,6 +5275,148 @@
     "Zero retention": "零數據保留",
     "Zhipu": "智譜",
     "Zhipu V4": "智譜 V4",
-    "Zoom": "縮放"
+    "Zoom": "縮放",
+    "Platform Roles": "Platform Roles",
+    "Roles & Permissions": "Roles & Permissions",
+    "Role Name": "Role Name",
+    "Role Description": "Role Description",
+    "Permission Modules": "Permission Modules",
+    "Permission Actions": "Permission Actions",
+    "Create Role": "Create Role",
+    "Role Details": "Role Details",
+    "Edit Role": "Edit Role",
+    "Delete Role": "Delete Role",
+    "Filter by role name...": "Filter by role name...",
+    "No Roles Found": "No Roles Found",
+    "No roles available. Try adjusting your search.": "No roles available. Try adjusting your search.",
+    "Add a new platform role by providing necessary info.": "Add a new platform role by providing necessary info.",
+    "View role details and assigned permissions.": "View role details and assigned permissions.",
+    "Enter role name": "Enter role name",
+    "Enter role description": "Enter role description",
+    "Update the role by providing necessary info.": "Update the role by providing necessary info.",
+    "Role updated successfully": "Role updated successfully",
+    "Failed to update role": "Failed to update role",
+    "Role created successfully": "Role created successfully",
+    "Failed to create role": "Failed to create role",
+    "Role deleted successfully": "Role deleted successfully",
+    "Failed to delete role": "Failed to delete role",
+    "Failed to load roles": "Failed to load roles",
+    "Role name is required": "Role name is required",
+    "Super Administrator": "Super Administrator",
+    "Full access to all platform management features": "Full access to all platform management features",
+    "Operations Administrator": "Operations Administrator",
+    "Manage channels, models, users, and daily operations": "Manage channels, models, users, and daily operations",
+    "Finance Administrator": "Finance Administrator",
+    "View billing, wallet, top-up, and financial reports": "View billing, wallet, top-up, and financial reports",
+    "Read-only Auditor": "Read-only Auditor",
+    "View platform data without changing configurations": "View platform data without changing configurations",
+    "Configure the role name, description, and availability.": "Configure the role name, description, and availability.",
+    "Configure the role name and description.": "Configure the role name and description.",
+    "View role name, description, and permission summary.": "View role name, description, and permission summary.",
+    "Role Type": "Role Type",
+    "Role Status": "Role Status",
+    "Enable this role for assignment": "Enable this role for assignment",
+    "Data Scope": "Data Scope",
+    "Current platform data": "Current platform data",
+    "Tenant": "租戶",
+    "Permission Parameters": "Permission Parameters",
+    "All Permissions": "All Permissions",
+    "All permission modules and actions assigned to this role.": "All permission modules and actions assigned to this role.",
+    "No permissions assigned": "No permissions assigned",
+    "Select available modules and actions for this role.": "Select available modules and actions for this role.",
+    "Select available modules and actions for this tenant.": "View available modules and actions for this tenant.",
+    "Manage channel list, test channels, and update channel settings": "Manage channel list, test channels, and update channel settings",
+    "Model Management": "Model Management",
+    "Manage model metadata, pricing, and upstream model mappings": "Manage model metadata, pricing, and upstream model mappings",
+    "User Management": "User Management",
+    "Manage platform users, quotas, groups, and user roles": "Manage platform users, quotas, groups, and user roles",
+    "Finance Management": "Finance Management",
+    "View wallet, billing, top-up, redemption, and financial records": "View wallet, billing, top-up, redemption, and financial records",
+    "Export": "Export",
+    "Audit": "Audit",
+    "Own": "Own",
+    "Are you sure you want to delete role {{name}}?": "Are you sure you want to delete role {{name}}?",
+    "Keys": "API 金鑰",
+    "Tenant Management": "Tenant Management",
+    "Tenant List": "Tenant List",
+    "Tenants": "Tenants",
+    "Tenant Name": "Tenant Name",
+    "Tenant Code": "Tenant Code",
+    "Tenant Status": "Tenant Status",
+    "Administrator": "Administrator",
+    "Administrator Email": "Administrator Email",
+    "Administrator Status": "Administrator Status",
+    "Registered": "Registered",
+    "Unregistered": "Unregistered",
+    "Normal": "Normal",
+    "Quota Limit": "Quota Limit",
+    "Authorization Time": "Authorization Time",
+    "Time Range": "Time Range",
+    "Tenant Settings": "Tenant Settings",
+    "Start Date": "Start Date",
+    "End Date": "End Date",
+    "Create Tenant": "Create Tenant",
+    "Edit Tenant": "Edit Tenant",
+    "Delete Tenant": "Delete Tenant",
+    "Enter tenant name": "Enter tenant name",
+    "Enter tenant code": "Enter tenant code",
+    "Enter group": "Enter group",
+    "Enter administrator name": "Enter administrator name",
+    "Enter administrator email": "Enter administrator email",
+    "Enter remark": "Enter remark",
+    "Select status": "Select status",
+    "Select administrator status": "Select administrator status",
+    "Configure tenant identity and administrator information.": "Configure tenant identity and administrator information.",
+    "Manage status, quota limit and time range for this tenant.": "Manage status, quota limit and time range for this tenant.",
+    "Create a new tenant and assign initial resource settings.": "Create a new tenant and assign initial resource settings.",
+    "Update tenant information and resource settings.": "Update tenant information and resource settings.",
+    "Tenant name is required": "Tenant name is required",
+    "Tenant code is required": "Tenant code is required",
+    "Administrator is required": "Administrator is required",
+    "Quota must be greater than or equal to 0": "Quota must be greater than or equal to 0",
+    "Tenant updated successfully": "Tenant updated successfully",
+    "Tenant created successfully": "Tenant created successfully",
+    "Tenant deleted successfully": "Tenant deleted successfully",
+    "No Tenants Found": "No Tenants Found",
+    "No tenants available. Try adjusting your search.": "No tenants available. Try adjusting your search.",
+    "Filter by tenant name, code, group or administrator...": "Filter by tenant name, code, group or administrator...",
+    "Are you sure you want to delete tenant {{name}}?": "Are you sure you want to delete tenant {{name}}?",
+    "Invalid email address": "Invalid email address",
+    "End date cannot be earlier than start date": "End date cannot be earlier than start date",
+    "Invitation sent to {{email}}": "Invitation sent to {{email}}",
+    "Tenant enabled successfully": "Tenant enabled successfully",
+    "Tenant disabled successfully": "Tenant disabled successfully",
+    "Are you sure you want to disable tenant {{name}}?": "Are you sure you want to disable tenant {{name}}?",
+    "Are you sure you want to enable tenant {{name}}?": "Are you sure you want to enable tenant {{name}}?",
+    "View tenant information and administrator details.": "View tenant information and administrator details.",
+    "View tenant information and permission parameter details.": "View tenant information and permission parameter details.",
+    "Invite administrator to register": "Invite administrator to register",
+    "Tenant Details": "Tenant Details",
+    "Administrator Information": "Administrator Information",
+    "Resource Settings": "Resource Settings",
+    "No remark": "No remark",
+    "Tenant ID": "Tenant ID",
+    "Contact Person": "Contact Person",
+    "Contact Phone": "Contact Phone",
+    "Contact Email": "Contact Email",
+    "Enter contact person": "Enter contact person",
+    "Enter contact phone": "Enter contact phone",
+    "Enter contact email": "Enter contact email",
+    "Select group": "Select group",
+    "Permission Configuration": "Permission Configuration",
+    "Permissions will be loaded from the API and displayed as a tree.": "Permissions will be loaded from the API and displayed as a tree.",
+    "Configure tenant identity and contact information.": "Configure tenant identity and contact information.",
+    "Manage quota limit and time range for this tenant.": "Manage quota limit and time range for this tenant.",
+    "Save and invite administrator": "Save and invite administrator",
+    "Invite Administrator": "Invite Administrator",
+    "Send an invitation email to the tenant administrator.": "Send an invitation email to the tenant administrator.",
+    "Send Invitation": "Send Invitation",
+    "Administrator Registration": "Administrator Registration",
+    "Send the link below to the administrator of {{tenantName}}. After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.": "Send the link below to the administrator of {{tenantName}}. After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.",
+    "Send the link below to the administrator of {{tenantName}}": "Send the link below to the administrator of {{tenantName}}",
+    "After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.": "After opening the link, the administrator enters the welcome registration page and only needs to fill in the account and password to complete registration and enter the institution portal. They will automatically see the menu and button permissions you assigned.",
+    "Copy invitation link": "Copy invitation link",
+    "Invitation link copied": "Invitation link copied",
+    "Failed to copy invitation link": "Failed to copy invitation link"
   }
 }

+ 9 - 7
default/src/i18n/locales/zh.json

@@ -156,6 +156,9 @@
     "Account used when authenticating with the SMTP server": "用于与 SMTP 服务器进行身份验证的账户",
     "acknowledge the related legal risks": "确认相关法律风险",
     "Across all groups": "跨所有分组",
+    "All groups": "All groups",
+    "All tags": "All tags",
+    "All vendors": "All vendors",
     "Action": "操作",
     "Action confirmation": "操作确认",
     "Actions": "操作",
@@ -533,6 +536,7 @@
     "Auto-fill when one field exists and another is missing": "在一个字段有值、另一个缺失时自动补齐",
     "Auto-refreshing every {{seconds}}s": "每 {{seconds}} 秒自动刷新",
     "Auto-retry status codes": "自动重试状态码",
+    "Auto-sync failed: {{message}}": "自动同步失败:{{message}}",
     "Automatically disable channel on repeated failures": "重复失败时自动禁用渠道",
     "Automatically disable channels exceeding this response time": "自动禁用超出此响应时间的渠道",
     "Automatically disable channels when tests fail": "当测试失败时自动禁用渠道",
@@ -993,7 +997,7 @@
     "Configure monitoring status page groups for the dashboard": "配置用于仪表板的监控状态页面分组",
     "Configure NODE_NAME": "配置 NODE_NAME",
     "Configure per-model ratio for image inputs or outputs.": "配置图像输入或输出的每模型比例。",
-    "Configure per-tool unit prices ($/1K calls). Per-request models do not incur additional tool fees.": "为每个工具配置单价($/1K 次调用)。按请求计费的模型不额外收取工具费用。",
+    "Configure per-tool unit prices (¥/1K calls). Per-request models do not incur additional tool fees.": "为每个工具配置单价(¥/1K 次调用)。按请求计费的模型不额外收取工具费用。",
     "Configure pricing ratios for a specific model.": "配置特定模型的定价比例。",
     "Configure rate limiting rules for a specific user group.": "配置特定用户分组的速率限制规则。",
     "Configure routes": "配置路由",
@@ -2169,7 +2173,7 @@
     "Group description": "分组描述",
     "Group details": "分组详情",
     "Group identifier": "分组标识符",
-    "Group is required": "组是必需的",
+    "Group is required": "分组不能为空",
     "Group name": "分组名称",
     "Group Name": "分组名称",
     "Group name cannot be changed when editing.": "编辑时无法更改组名称。",
@@ -2760,7 +2764,6 @@
     "model(s)? This action cannot be undone.": "模型?此操作无法撤销。",
     "models": "个模型",
     "Models": "模型列表",
-    "Models management": "模型管理",
     "Models *": "模型 *",
     "Models & Groups": "模型与分组",
     "Models & Routing": "模型与路由",
@@ -3528,7 +3531,7 @@
     "Previous branch": "上一分支",
     "Previous page": "上一页",
     "Price": "价格",
-    "Price ($/1K calls)": "价格($/1K 次)",
+    "Price (¥/1K calls)": "价格(¥/1K 次)",
     "Price (local currency / USD)": "价格(本地货币/美元)",
     "Price display": "价格显示",
     "Price display mode": "价格显示模式",
@@ -4428,6 +4431,7 @@
     "Synced upstream models": "同步上游模型",
     "Synchronize models and vendors from an upstream source": "从上游源同步模型和供应商",
     "Syncing prices, please wait...": "正在同步价格,请稍候...",
+    "Syncing upstream model prices...": "正在同步上游模型价格...",
     "Syncing...": "同步中...",
     "System": "系统",
     "System Administration": "系统管理",
@@ -4913,6 +4917,7 @@
     "Upstream path must be a full URL or a path starting with /": "上游路径必须是完整 URL,或以 / 开头的路径",
     "Upstream price sync": "上游价格同步",
     "Upstream prices fetched successfully": "已成功获取上游价格",
+    "Upstream prices synced successfully": "上游价格同步成功",
     "Upstream ratios fetched successfully": "上游比率获取成功",
     "Upstream Request ID": "上游请求 ID",
     "Upstream Response": "上游返回",
@@ -5313,7 +5318,6 @@
     "Enable this role for assignment": "允许将该角色分配给用户",
     "Data Scope": "数据范围",
     "Current platform data": "当前平台数据",
-    "Platform": "平台",
     "Tenant": "租户",
     "Permission Parameters": "权限参数",
     "All Permissions": "全部权限",
@@ -5321,7 +5325,6 @@
     "No permissions assigned": "未分配权限",
     "Select available modules and actions for this role.": "选择该角色可用的模块和操作权限。",
     "Select available modules and actions for this tenant.": "查看该租户可用的模块和操作权限。",
-    "Channel Management": "渠道管理",
     "Manage channel list, test channels, and update channel settings": "管理渠道列表、测试渠道和更新渠道设置",
     "Model Management": "模型管理",
     "Manage model metadata, pricing, and upstream model mappings": "管理模型元数据、价格和上游模型映射",
@@ -5340,7 +5343,6 @@
     "Tenant Name": "租户名称",
     "Tenant Code": "租户编码",
     "Tenant Status": "租户状态",
-    "Group is required": "分组不能为空",
     "Administrator": "管理员",
     "Administrator Email": "管理员邮箱",
     "Administrator Status": "管理员状态",