-
@@ -306,90 +304,6 @@ function PresetConfig() {
)
}
-/**
- * Font options shown in the theme drawer.
- *
- * Each option renders a live "Aa" preview in the font it represents.
- * `Auto` deliberately leaves `fontFamily` undefined so the preview inherits
- * the currently active body font — that way the user sees what `Auto` will
- * actually look like for the active preset (Anthropic → serif glyphs,
- * everything else → sans glyphs) without us having to duplicate the
- * preset-default mapping in the UI.
- */
-const FONT_OPTIONS: {
- value: ThemeFont
- label: string
- // CSS font-family applied to the "Aa" preview. `undefined` = inherit
- // from the current theme (used by the `default` option).
- preview?: string
-}[] = [
- { value: 'default', label: 'Auto', preview: undefined },
- { value: 'sans', label: 'Sans', preview: 'var(--font-sans)' },
- { value: 'serif', label: 'Serif', preview: 'var(--font-serif)' },
-]
-
-function FontConfig() {
- const { t } = useTranslation()
- const { defaults, customization, setFont } = useThemeCustomization()
- return (
-
@@ -504,7 +417,7 @@ function ScaleConfig() {
setScale(v as ThemeScale)}
- className='grid w-full grid-cols-4 gap-3'
+ className='grid w-full grid-cols-3 gap-4'
aria-label={t('Select interface density')}
>
{scaleOptions.map((option) => (
diff --git a/web/default/src/components/content-language-select.tsx b/web/default/src/components/content-language-select.tsx
new file mode 100644
index 000000000000..92f0128f8f0f
--- /dev/null
+++ b/web/default/src/components/content-language-select.tsx
@@ -0,0 +1,73 @@
+/*
+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 .
+
+For commercial licensing, please contact support@quantumnous.com
+*/
+import { useTranslation } from 'react-i18next'
+
+import { FormLabel } from '@/components/ui/form'
+import {
+ Select,
+ SelectContent,
+ SelectGroup,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from '@/components/ui/select'
+import {
+ INTERFACE_LANGUAGE_OPTIONS,
+ type InterfaceLanguageCode,
+} from '@/i18n/languages'
+
+export type EditableContentLocale = 'default' | InterfaceLanguageCode
+
+interface ContentLanguageSelectProps {
+ value: EditableContentLocale
+ onValueChange: (value: EditableContentLocale) => void
+}
+
+export function ContentLanguageSelect({
+ value,
+ onValueChange,
+}: ContentLanguageSelectProps) {
+ const { t } = useTranslation()
+
+ return (
+
- {t('Unified API Gateway for')}
-
-
- {t('Vast Range of AI Models')}
-
-
-
- {t(
- 'Access a vast selection of models via a standard, unified API protocol. Power AI applications, manage digital assets, and connect the Future.'
- )}
-
+
)
}
diff --git a/web/default/src/features/home/components/sections/how-it-works.tsx b/web/default/src/features/home/components/sections/how-it-works.tsx
index 2959fd8785c1..b4f7fb285f27 100644
--- a/web/default/src/features/home/components/sections/how-it-works.tsx
+++ b/web/default/src/features/home/components/sections/how-it-works.tsx
@@ -18,7 +18,6 @@ For commercial licensing, please contact support@quantumnous.com
*/
import { Settings, Zap, BarChart3 } from 'lucide-react'
import { useTranslation } from 'react-i18next'
-
import { AnimateInView } from '@/components/animate-in-view'
export function HowItWorks() {
diff --git a/web/default/src/features/home/components/sections/model-pricing.tsx b/web/default/src/features/home/components/sections/model-pricing.tsx
new file mode 100644
index 000000000000..d37f30e25b3c
--- /dev/null
+++ b/web/default/src/features/home/components/sections/model-pricing.tsx
@@ -0,0 +1,67 @@
+/*
+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 .
+
+For commercial licensing, please contact support@quantumnous.com
+*/
+import { useTranslation } from 'react-i18next'
+import { AnimateInView } from '@/components/animate-in-view'
+import { modelPricingConfig } from '../../model-pricing-config'
+
+interface ModelPricingProps {
+ className?: string
+}
+
+export function ModelPricing(_props: ModelPricingProps) {
+ const { t } = useTranslation()
+
+ return (
+
+
+
+
+ {t('Model Pricing')}
+
+
+ {t('Mainstream model prices at a glance')}
+
+
+ {t('Official price, current price, and discount are dynamically calculated from backend pricing configuration.')}
+
diff --git a/web/default/src/hooks/use-top-nav-links.ts b/web/default/src/hooks/use-top-nav-links.ts
index 5a5baa2db98b..dd666472a8c8 100644
--- a/web/default/src/hooks/use-top-nav-links.ts
+++ b/web/default/src/hooks/use-top-nav-links.ts
@@ -79,6 +79,8 @@ export function useTopNavLinks(): TopNavLink[] {
links.push({ title: t('Model Square'), href: '/pricing', requiresAuth })
}
+ links.push({ title: t('Discount Plans'), href: '/plans' })
+
// Rankings
const rankings = modules?.rankings
if (rankings && typeof rankings === 'object' && rankings.enabled) {
diff --git a/web/default/src/i18n/config.ts b/web/default/src/i18n/config.ts
index 42ec7dc5ef81..a349459a7069 100644
--- a/web/default/src/i18n/config.ts
+++ b/web/default/src/i18n/config.ts
@@ -53,10 +53,9 @@ i18n
escapeValue: false, // not needed for react as it escapes by default
},
detection: {
- order: ['localStorage', 'navigator'],
+ order: ['localStorage'],
caches: ['localStorage'],
- // Browsers report `zh-CN`/`zh-TW`/`zh`; map them onto our `zhCN`/`zhTW`
- // codes (non-Chinese codes pass through for normal supportedLngs matching).
+ // Normalize previously stored Chinese locale codes onto `zhCN`/`zhTW`.
convertDetectedLanguage,
},
})
diff --git a/web/default/src/i18n/locales/en.json b/web/default/src/i18n/locales/en.json
index 539df00f2741..d5c006bd072b 100644
--- a/web/default/src/i18n/locales/en.json
+++ b/web/default/src/i18n/locales/en.json
@@ -28,6 +28,7 @@
"[{\"ChatGPT\":\"https://chat.openai.com\"},{\"Lobe Chat\":\"https://chat-preview.lobehub.com/?settings={...}\"}]": "[{\"ChatGPT\":\"https://chat.openai.com\"},{\"Lobe Chat\":\"https://chat-preview.lobehub.com/?settings={...}\"}]",
"[{\"name\":\"支付宝\",\"type\":\"alipay\",\"color\":\"#1677FF\"}]": "[{\"name\":\"Alipay\",\"type\":\"alipay\",\"color\":\"#1677FF\"}]",
"[{\"name\":\"支付宝\",\"type\":\"alipay\",\"icon\":\"SiAlipay\"}]": "[{\"name\":\"Alipay\",\"type\":\"alipay\",\"icon\":\"SiAlipay\"}]",
+ "[Telegram group](https://t.me/+36iGYj-hkkFkOWRl)": "[Telegram group](https://t.me/+36iGYj-hkkFkOWRl)",
"{\"original-model\": \"replacement-model\"}": "{\"original-model\": \"replacement-model\"}",
"{{category}} Models": "{{category}} Models",
"{{completed}}/{{total}} completed": "{{completed}}/{{total}} completed",
@@ -52,6 +53,7 @@
"{{count}} models": "{{count}} models",
"{{count}} months ago": "{{count}} months ago",
"{{count}} override": "{{count}} override",
+ "{{count}} plans available": "{{count}} plans available",
"{{count}} selected targets available for bulk copy.": "{{count}} selected targets available for bulk copy.",
"{{count}} tiers": "{{count}} tiers",
"{{count}} Uptime Kuma groups will be removed from the list.": "{{count}} Uptime Kuma groups will be removed from the list.",
@@ -63,6 +65,7 @@
"{{modality}} not supported": "{{modality}} not supported",
"{{modality}} supported": "{{modality}} supported",
"{{n}} model(s) selected": "{{n}} model(s) selected",
+ "{{plan}} Token capacity": "{{plan}} Token capacity",
"{{processed}} of {{total}} log entries processed.": "{{processed}} of {{total}} log entries processed.",
"{{success}} succeeded, {{failed}} failed": "{{success}} succeeded, {{failed}} failed",
"{{target}} test failed": "{{target}} test failed",
@@ -118,6 +121,12 @@
"80,443,8080": "80,443,8080",
"A billing multiplier. Lower ratios mean lower API call costs.": "A billing multiplier. Lower ratios mean lower API call costs.",
"A focused home for keys, balance, routing, and service health.": "A focused home for keys, balance, routing, and service health.",
+ "A high-capacity credit plan for heavy API usage.": "A high-capacity credit plan for heavy API usage.",
+ "A higher weekly allowance for demanding workflows.": "A higher weekly allowance for demanding workflows.",
+ "A larger monthly allowance for frequent professional use.": "A larger monthly allowance for frequent professional use.",
+ "A one-time low-cost trial for testing core models.": "A one-time low-cost trial for testing core models.",
+ "A predictable weekly budget for light, consistent usage.": "A predictable weekly budget for light, consistent usage.",
+ "A small credit pack for light, short-term usage.": "A small credit pack for light, short-term usage.",
"About": "About",
"About {{days}} days left": "About {{days}} days left",
"Accept Unpriced Models": "Accept Unpriced Models",
@@ -680,6 +689,7 @@
"Cache Directory Disk Space": "Cache Directory Disk Space",
"Cache Directory Info": "Cache Directory Info",
"Cache Entries": "Cache Entries",
+ "Cache Hit": "Cache Hit",
"Cache mode": "Cache mode",
"Cache pricing": "Cache pricing",
"Cache ratio": "Cache ratio",
@@ -792,6 +802,7 @@
"checkout.session.completed": "checkout.session.completed",
"checkout.session.expired": "checkout.session.expired",
"Chinese": "Chinese",
+ "Choose a plan and estimate model usage": "Choose a plan and estimate model usage",
"Choose a username": "Choose a username",
"Choose an amount and payment method": "Choose an amount and payment method",
"Choose between default expanded, compact icon-only, or full layout mode": "Choose between default expanded, compact icon-only, or full layout mode",
@@ -930,6 +941,7 @@
"Compliance confirmed": "Compliance confirmed",
"Compliance confirmed successfully": "Compliance confirmed successfully",
"Concatenate channel system prompt with user's prompt": "Concatenate channel system prompt with user's prompt",
+ "Concurrency & Cache Hit Rate": "Concurrency & Cache Hit Rate",
"Condition Path": "Condition Path",
"Condition Settings": "Condition Settings",
"Condition Value": "Condition Value",
@@ -1022,6 +1034,7 @@
"Console Content": "Console Content",
"Consume": "Consume",
"Consumed in the last 24 hours": "Consumed in the last 24 hours",
+ "Contact Us": "Contact Us",
"Container": "Container",
"Container name": "Container name",
"Containers": "Containers",
@@ -1164,7 +1177,12 @@
"Credentials": "Credentials",
"Credentials verification failed": "Credentials verification failed",
"Credentials verification failed — double-check Merchant ID and API private key.": "Credentials verification failed — double-check Merchant ID and API private key.",
+ "Credit Business": "Credit Business",
+ "Credit Plans": "Credit Plans",
+ "Credit Power": "Credit Power",
+ "Credit Pro": "Credit Pro",
"Credit remaining": "Credit remaining",
+ "Credit Starter": "Credit Starter",
"Creem API key (leave blank unless updating)": "Creem API key (leave blank unless updating)",
"Creem Gateway": "Creem Gateway",
"Creem Payment": "Creem Payment",
@@ -1250,6 +1268,7 @@
"Default API version for this channel": "Default API version for this channel",
"Default Bearer": "Default Bearer",
"Default Collapse Sidebar": "Default Collapse Sidebar",
+ "Default concurrency is 500, with cache hit rate around 90%.": "Default concurrency is 500, with cache hit rate around 90%.",
"Default consumption chart": "Default consumption chart",
"Default Max Tokens": "Default Max Tokens",
"Default model call chart": "Default model call chart",
@@ -1352,6 +1371,7 @@
"Detected high-risk status code redirect rules": "The following high-risk status code redirect rules were detected:",
"Detection complete: {{add}} to add, {{remove}} to remove": "Detection complete: {{add}} to add, {{remove}} to remove",
"Detection failed": "Detection failed",
+ "Detection Results Are Not 100%": "Detection Results Are Not 100%",
"Determines how this group is applied elsewhere.": "Determines how this group is applied elsewhere.",
"Deterministic sampling seed (best-effort)": "Deterministic sampling seed (best-effort)",
"Developer Friendly": "Developer Friendly",
@@ -1359,6 +1379,8 @@
"Dify": "Dify",
"Dify channels only support chatflow and agent, and agent does not support images": "Dify channels only support chatflow and agent, and agent does not support images",
"Digest:": "Digest:",
+ "Direct access to official providers": "Direct access to official providers",
+ "Direct official access": "Direct official access",
"Direction": "Direction",
"Directory File Count": "Directory File Count",
"Directory Total Size": "Directory Total Size",
@@ -1384,6 +1406,7 @@
"Discord": "Discord",
"Discount": "Discount",
"Discount map by recharge amount (JSON object)": "Discount map by recharge amount (JSON object)",
+ "Discount Plans": "Discount Plans",
"Discount Rate": "Discount Rate",
"Discount rate must be ≤ 1": "Discount rate must be ≤ 1",
"Discount rate must be greater than 0": "Discount rate must be greater than 0",
@@ -1451,6 +1474,7 @@
"Duration Settings": "Duration Settings",
"Duration Unit": "Duration Unit",
"Duration Value": "Duration Value",
+ "Dynamic pricing": "Dynamic pricing",
"Dynamic Pricing": "Dynamic Pricing",
"e.g. ¥ or HK$": "e.g. ¥ or HK$",
"e.g. 401, 403, 429, 500-599": "e.g. 401, 403, 429, 500-599",
@@ -1686,6 +1710,7 @@
"Enter your username": "Enter your username",
"Enter your username or email": "Enter your username or email",
"Enterprise Account": "Enterprise Account",
+ "Enterprise-grade API gateway": "Enterprise-grade API gateway",
"Enterprise-grade security with comprehensive permission management": "Enterprise-grade security with comprehensive permission management",
"Entrypoint (space separated)": "Entrypoint (space separated)",
"Env (JSON object)": "Env (JSON object)",
@@ -1709,6 +1734,7 @@
"Error Type (optional)": "Error Type (optional)",
"Estimated cost": "Estimated cost",
"Estimated quota cost": "Estimated quota cost",
+ "Estimates assume the selected model is used exclusively. Actual usage may vary with cache, tools, media, or dynamic pricing.": "Estimates assume the selected model is used exclusively. Actual usage may vary with cache, tools, media, or dynamic pricing.",
"Every group name in the pricing table can be used in two places: on a user (the user group, assigned by admins) and on a token (the token group, chosen when creating the token). Same name pool, two different jobs.": "Every group name in the pricing table can be used in two places: on a user (the user group, assigned by admins) and on a token (the token group, chosen when creating the token). Same name pool, two different jobs.",
"Everything configured for this group, in one place.": "Everything configured for this group, in one place.",
"Exact": "Exact",
@@ -1981,6 +2007,7 @@
"Fixed price": "Fixed price",
"Fixed price (USD)": "Fixed price (USD)",
"Fixed request price": "Fixed request price",
+ "Flexible monthly credits for occasional users.": "Flexible monthly credits for occasional users.",
"Floating": "Floating",
"Flow": "Flow",
"Flow Filters": "Flow Filters",
@@ -2070,6 +2097,7 @@
"Generation was interrupted": "Generation was interrupted",
"Generic cache": "Generic cache",
"Get advice": "Get advice",
+ "Get API Key": "Get API Key",
"Get notified when balance falls below this value": "Get notified when balance falls below this value",
"Get one here": "Get one here",
"Get started": "Get started",
@@ -2244,10 +2272,12 @@
"Ignore": "Ignore",
"Ignored upstream models": "Ignored upstream models",
"Image": "Image",
+ "Image API URL": "Image API URL",
"Image Generation": "Image Generation",
"Image In": "Image In",
"Image input": "Image input",
"Image input price": "Image input price",
+ "Image Models": "Image Models",
"Image not available": "Image not available",
"Image Out": "Image Out",
"Image output price": "Image output price",
@@ -2255,6 +2285,7 @@
"Image ratio": "Image ratio",
"Image to Video": "Image to Video",
"Image Tokens": "Image Tokens",
+ "Image Type": "Image Type",
"Imagine the pricing table has three groups: default (ratio 1.0), premium (ratio 0.5), and vip (ratio 0.8). Users whose account is in the vip group get user-level perks, and premium is a cheaper channel pool that users can pick for their tokens.": "Imagine the pricing table has three groups: default (ratio 1.0), premium (ratio 0.5), and vip (ratio 0.8). Users whose account is in the vip group get user-level perks, and premium is a cheaper channel pool that users can pick for their tokens.",
"Import to CC Switch": "Import to CC Switch",
"Important": "Important",
@@ -2286,6 +2317,7 @@
"Initializing…": "Initializing…",
"Inpaint": "Inpaint",
"Input": "Input",
+ "Input (1M)": "Input (1M)",
"Input mode": "Input mode",
"Input price": "Input price",
"Input price is required before saving dependent prices.": "Input price is required before saving dependent prices.",
@@ -2556,10 +2588,14 @@
"Maximum 200 characters": "Maximum 200 characters",
"Maximum 500 characters. Supports Markdown and HTML.": "Maximum 500 characters. Supports Markdown and HTML.",
"Maximum check-in quota": "Maximum check-in quota",
+ "Maximum input Tokens": "Maximum input Tokens",
"Maximum input window": "Maximum input window",
"Maximum number of tokens each user can create. Default 1000. Setting too large may affect performance.": "Maximum number of tokens each user can create. Default 1000. Setting too large may affect performance.",
"Maximum number of tokens in the response": "Maximum number of tokens in the response",
+ "Maximum output Tokens": "Maximum output Tokens",
"Maximum quota amount awarded for check-in": "Maximum quota amount awarded for check-in",
+ "Maximum standalone usage across the full plan validity period.": "Maximum standalone usage across the full plan validity period.",
+ "Maximum standalone usage within each {{period}} reset period.": "Maximum standalone usage within each {{period}} reset period.",
"Maximum tokens including hidden reasoning tokens": "Maximum tokens including hidden reasoning tokens",
"Maximum tokens per response": "Maximum tokens per response",
"Maximum tokens per user": "Maximum tokens per user",
@@ -2579,9 +2615,12 @@
"min downtime": "min downtime",
"Min Top-up": "Min Top-up",
"Min Top-up:": "Min Top-up:",
+ "Mini": "Mini",
"MiniMax": "MiniMax",
"Minimum check-in quota": "Minimum check-in quota",
+ "Minimum Input (1M)": "Minimum Input (1M)",
"Minimum LinuxDO trust level required": "Minimum LinuxDO trust level required",
+ "Minimum Output (1M)": "Minimum Output (1M)",
"Minimum quota amount awarded for check-in": "Minimum quota amount awarded for check-in",
"Minimum recharge amount in USD": "Minimum recharge amount in USD",
"Minimum recharge amount to qualify for this discount.": "Minimum recharge amount to qualify for this discount.",
@@ -2612,6 +2651,7 @@
"Model Analytics": "Model Analytics",
"Model Analytics Defaults": "Model Analytics Defaults",
"Model Analytics Filters": "Model Analytics Filters",
+ "Model Authenticity": "Model Authenticity",
"model billing support": "model billing support",
"Model Call Analytics": "Model Call Analytics",
"Model context usage": "Model context usage",
@@ -2642,6 +2682,7 @@
"Model not found": "Model not found",
"Model performance metrics": "Model performance metrics",
"Model Price": "Model Price",
+ "Model Price Comparison": "Model Price Comparison",
"Model price is not configured. Please complete model pricing in settings.": "Model price is not configured. Please complete model pricing in settings.",
"Model Price Not Configured": "Model Price Not Configured",
"Model prices": "Model prices",
@@ -2654,7 +2695,7 @@
"Model Regex": "Model Regex",
"Model Regex (one per line)": "Model Regex (one per line)",
"Model selected": "Model selected",
- "Model Square": "Model Square",
+ "Model Square": "Model Pricing",
"Model Tags": "Model Tags",
"Model to use for testing": "Model to use for testing",
"Model to use when testing channel connectivity": "Model to use when testing channel connectivity",
@@ -2696,7 +2737,9 @@
"months": "months",
"Moonshot": "Moonshot",
"More": "More",
+ "More affordable routes are available. For stable access, replace BaseUrl with:": "More affordable routes are available. For stable access, replace BaseUrl with:",
"More Apps": "More Apps",
+ "More credits for regular chat, coding, and daily use.": "More credits for regular chat, coding, and daily use.",
"more mapping": "more mapping",
"More templates...": "More templates...",
"More than 999 days left": "More than 999 days left",
@@ -2865,6 +2908,7 @@
"No matching token and channel usage was found.": "No matching token and channel usage was found.",
"No messages yet": "No messages yet",
"No missing models found.": "No missing models found.",
+ "No model downgrades or substitutions": "No model downgrades or substitutions",
"No model found.": "No model found.",
"No model mappings configured. Click \"Add Mapping\" to get started.": "No model mappings configured. Click \"Add Mapping\" to get started.",
"No model price changes to save": "No model price changes to save",
@@ -2901,6 +2945,7 @@
"No preference": "No preference",
"No prefill groups yet": "No prefill groups yet",
"No price differences found": "No price differences found",
+ "No pricing data available": "No pricing data available",
"No processable upstream model updates for this channel": "No processable upstream model updates for this channel",
"No products configured. Click \"Add product\" to get started.": "No products configured. Click \"Add product\" to get started.",
"No products match your search": "No products match your search",
@@ -3006,12 +3051,14 @@
"Official documentation": "Official documentation",
"Official Gemini from OpenAI Chat": "Official Gemini from OpenAI Chat",
"Official Gemini Native": "Official Gemini Native",
+ "Official Input / Output (1M)": "Official Input / Output (1M)",
"Official OpenAI Chat": "Official OpenAI Chat",
"Official OpenAI Embeddings": "Official OpenAI Embeddings",
"Official OpenAI Images": "Official OpenAI Images",
"Official OpenAI Responses": "Official OpenAI Responses",
"Official Repository": "Official Repository",
"Official Sync": "Official Sync",
+ "Officially funded accounts": "Officially funded accounts",
"OhMyGPT": "OhMyGPT",
"OIDC": "OIDC",
"OIDC Client ID": "OIDC Client ID",
@@ -3125,6 +3172,7 @@
"Other users": "Other users",
"Outage": "Outage",
"Output": "Output",
+ "Output (1M)": "Output (1M)",
"Output aspect ratio": "Output aspect ratio",
"Output image size": "Output image size",
"Output price": "Output price",
@@ -3274,6 +3322,7 @@
"Performance Settings": "Performance Settings",
"Performed {{action}} on user {{username}} (ID: {{id}})": "Performed {{action}} on user {{username}} (ID: {{id}})",
"Period": "Period",
+ "Period Quota": "Period Quota",
"Periodically check for upstream model changes": "Periodically check for upstream model changes",
"Periodically send ping frames to keep streaming connections active.": "Periodically send ping frames to keep streaming connections active.",
"Permanently delete your account and all data": "Permanently delete your account and all data",
@@ -3340,6 +3389,7 @@
"Please fix JSON errors before saving": "Please fix JSON errors before saving",
"Please fix the highlighted fields before saving": "Please fix the highlighted fields before saving",
"Please log in with the appropriate credentials": "Please log in with the appropriate credentials",
+ "Please refresh the page and try again.": "Please refresh the page and try again.",
"Please select a container": "Please select a container",
"Please select a payment method": "Please select a payment method",
"Please select a primary model": "Please select a primary model",
@@ -3439,6 +3489,7 @@
"Pricing mode": "Pricing mode",
"Pricing Ratios": "Pricing Ratios",
"Pricing Type": "Pricing Type",
+ "Pricing unavailable": "Pricing unavailable",
"Primary Model": "Primary Model",
"Prioritize reusing the last successful channel based on keys extracted from request context (sticky routing)": "Prioritize reusing the last successful channel based on keys extracted from request context (sticky routing)",
"Priority": "Priority",
@@ -3765,6 +3816,7 @@
"Reset Passkey for {{username}}? The user will need to register a new Passkey before using passwordless login.": "Reset Passkey for {{username}}? The user will need to register a new Passkey before using passwordless login.",
"Reset password": "Reset password",
"Reset Period": "Reset Period",
+ "Reset Plans": "Reset Plans",
"Reset prices": "Reset prices",
"Reset quota": "Reset quota",
"Reset ratios": "Reset ratios",
@@ -3953,6 +4005,8 @@
"Select a group": "Select a group",
"Select a group type": "Select a group type",
"Select a model to edit pricing": "Select a model to edit pricing",
+ "Select a plan": "Select a plan",
+ "Select a plan to see the maximum standalone input or output Token capacity for each model.": "Select a plan to see the maximum standalone input or output Token capacity for each model.",
"Select a preset...": "Select a preset...",
"Select a product": "Select a product",
"Select a role": "Select a role",
@@ -4095,6 +4149,8 @@
"Show": "Show",
"Show All": "Show All",
"Show all providers including unbound": "Show all providers including unbound",
+ "Show Less": "Show Less",
+ "Show More": "Show More",
"Show only bound providers": "Show only bound providers",
"Show or hide flow columns": "Show or hide flow columns",
"Show preview": "Show preview",
@@ -4175,6 +4231,7 @@
"SQLite stores all data in a single file. Make sure that file is persisted when running in containers.": "SQLite stores all data in a single file. Make sure that file is persisted when running in containers.",
"SSL/TLS": "SSL/TLS",
"SSRF Protection": "SSRF Protection",
+ "Stable high concurrency": "Stable high concurrency",
"stale": "stale",
"Standard": "Standard",
"Standard price": "Standard price",
@@ -4182,6 +4239,7 @@
"Start a conversation to see messages here": "Start a conversation to see messages here",
"Start a playground chat": "Start a playground chat",
"Start collecting payments globally without registering a company. Built for indie developers, OPC sole proprietorships, and startups. Waffo Pancake acts as your Merchant of Record, taking on the compliance burden of global payment collection — consumption tax, invoicing, subscription management, refunds, and chargebacks. Solo developers can launch fast and stay focused on product instead of compliance. Onboard in minutes — one prompt to a full integration.": "Start collecting payments globally without registering a company. Built for indie developers, OPC sole proprietorships, and startups. Waffo Pancake acts as your Merchant of Record, taking on the compliance burden of global payment collection — consumption tax, invoicing, subscription management, refunds, and chargebacks. Solo developers can launch fast and stay focused on product instead of compliance. Onboard in minutes — one prompt to a full integration.",
+ "Start for Free": "Start for Free",
"Start for free with generous limits. No credit card required.": "Start for free with generous limits. No credit card required.",
"Start Time": "Start Time",
"Started": "Started",
@@ -4520,6 +4578,7 @@
"Timing": "Timing",
"Tip": "Tip",
"to access this resource.": "to access this resource.",
+ "To avoid account bans, we add simulated prompt words in the requests, which may result in the score not reaching 100%.": "To avoid account bans, we add simulated prompt words in the requests, which may result in the score not reaching 100%.",
"to confirm": "to confirm",
"To Lower": "To Lower",
"To Lowercase": "To Lowercase",
@@ -4636,6 +4695,7 @@
"Trend": "Trend",
"Trending down": "Trending down",
"Trending up": "Trending up",
+ "Trial": "Trial",
"Triggered garbage collection": "Triggered garbage collection",
"Trim leading/trailing whitespace": "Trim leading/trailing whitespace",
"Trim Prefix": "Trim Prefix",
@@ -4674,6 +4734,7 @@
"Unable to load groups": "Unable to load groups",
"Unable to load rankings": "Unable to load rankings",
"Unable to load rankings data": "Unable to load rankings data",
+ "Unable to load subscription plans": "Unable to load subscription plans",
"Unable to open chat": "Unable to open chat",
"Unable to parse structured pricing": "Unable to parse structured pricing",
"Unable to prepare chat link. Please ensure you have an enabled API key.": "Unable to prepare chat link. Please ensure you have an enabled API key.",
@@ -4987,6 +5048,7 @@
"We could not load instances.": "We could not load instances.",
"We could not load system tasks.": "We could not load system tasks.",
"We could not load the setup status.": "We could not load the setup status.",
+ "We provide 100% official full-performance models. Requests are routed directly to the official address via the official client channel. If certain detection items (such as forced structured output) show as unsupported, this is because the channel itself does not support that capability — not because the model has been replaced or downgraded.": "We provide 100% official full-performance models. Requests are routed directly to the official address via the official client channel. If certain detection items (such as forced structured output) show as unsupported, this is because the channel itself does not support that capability — not because the model has been replaced or downgraded.",
"We will prompt your device to confirm using biometrics or your hardware key.": "We will prompt your device to confirm using biometrics or your hardware key.",
"We'll be back online shortly.": "We'll be back online shortly.",
"Web search": "Web search",
@@ -5012,6 +5074,10 @@
"Week": "Week",
"Weekday": "Weekday",
"Weekly": "Weekly",
+ "Weekly Business": "Weekly Business",
+ "Weekly credits for regular users with a controlled budget.": "Weekly credits for regular users with a controlled budget.",
+ "Weekly Pro": "Weekly Pro",
+ "Weekly Starter": "Weekly Starter",
"Weekly token usage by model across the past few weeks": "Weekly token usage by model across the past few weeks",
"Weekly token usage by model across the past year": "Weekly token usage by model across the past year",
"Weekly token usage by model since launch": "Weekly token usage by model since launch",
diff --git a/web/default/src/i18n/locales/fr.json b/web/default/src/i18n/locales/fr.json
index 2d84f89add8e..2d3868b1b484 100644
--- a/web/default/src/i18n/locales/fr.json
+++ b/web/default/src/i18n/locales/fr.json
@@ -28,6 +28,7 @@
"[{\"ChatGPT\":\"https://chat.openai.com\"},{\"Lobe Chat\":\"https://chat-preview.lobehub.com/?settings={...}\"}]": "[{\"ChatGPT\":\"https://chat.openai.com\"},{\"Lobe Chat\":\"https://chat-preview.lobehub.com/?settings={...}\"}]",
"[{\"name\":\"支付宝\",\"type\":\"alipay\",\"color\":\"#1677FF\"}]": "[{\"name\":\"Alipay\",\"type\":\"alipay\",\"color\":\"#1677FF\"}]",
"[{\"name\":\"支付宝\",\"type\":\"alipay\",\"icon\":\"SiAlipay\"}]": "[{\"name\":\"Alipay\",\"type\":\"alipay\",\"icon\":\"SiAlipay\"}]",
+ "[Telegram group](https://t.me/+36iGYj-hkkFkOWRl)": "[Groupe Telegram](https://t.me/+36iGYj-hkkFkOWRl)",
"{\"original-model\": \"replacement-model\"}": "{\"original-model\": \"replacement-model\"}",
"{{category}} Models": "Modèles {{category}}",
"{{completed}}/{{total}} completed": "{{completed}}/{{total}} terminé(s)",
@@ -52,6 +53,7 @@
"{{count}} models": "{{count}} modèles",
"{{count}} months ago": "il y a {{count}} mois",
"{{count}} override": "{{count}} remplacement",
+ "{{count}} plans available": "{{count}} forfaits disponibles",
"{{count}} selected targets available for bulk copy.": "{{count}} cibles sélectionnées disponibles pour la copie en lot.",
"{{count}} tiers": "{{count}} paliers",
"{{count}} Uptime Kuma groups will be removed from the list.": "{{count}} groupes Uptime Kuma seront retirés de la liste.",
@@ -63,6 +65,7 @@
"{{modality}} not supported": "{{modality}} non pris en charge",
"{{modality}} supported": "{{modality}} pris en charge",
"{{n}} model(s) selected": "{{n}} modèle(s) sélectionné(s)",
+ "{{plan}} Token capacity": "Capacité en Tokens de {{plan}}",
"{{processed}} of {{total}} log entries processed.": "{{processed}} sur {{total}} entrées de journal traitées.",
"{{success}} succeeded, {{failed}} failed": "{{success}} réussi(s), {{failed}} échoué(s)",
"{{target}} test failed": "Échec du test de {{target}}",
@@ -118,6 +121,12 @@
"80,443,8080": "80,443,8080",
"A billing multiplier. Lower ratios mean lower API call costs.": "Un multiplicateur de facturation. Plus le ratio est faible, plus le coût des appels API est bas.",
"A focused home for keys, balance, routing, and service health.": "Un accueil dédié aux clés, au solde, au routage et à l'état du service.",
+ "A high-capacity credit plan for heavy API usage.": "Un forfait de crédits haute capacité pour un usage intensif de l’API.",
+ "A higher weekly allowance for demanding workflows.": "Une allocation hebdomadaire plus élevée pour les flux exigeants.",
+ "A larger monthly allowance for frequent professional use.": "Une allocation mensuelle plus élevée pour un usage professionnel fréquent.",
+ "A one-time low-cost trial for testing core models.": "Un essai unique à petit prix pour tester les modèles principaux.",
+ "A predictable weekly budget for light, consistent usage.": "Un budget hebdomadaire prévisible pour un usage léger et régulier.",
+ "A small credit pack for light, short-term usage.": "Un petit pack de crédits pour un usage léger et ponctuel.",
"About": "À propos",
"About {{days}} days left": "Environ {{days}} jours restants",
"Accept Unpriced Models": "Accepter les modèles non tarifés",
@@ -680,6 +689,7 @@
"Cache Directory Disk Space": "Espace disque du répertoire de cache",
"Cache Directory Info": "Infos du répertoire de cache",
"Cache Entries": "Entrées de cache",
+ "Cache Hit": "Succès du cache",
"Cache mode": "Mode de cache",
"Cache pricing": "Tarification du cache",
"Cache ratio": "Ratio de cache",
@@ -792,6 +802,7 @@
"checkout.session.completed": "checkout.session.completed",
"checkout.session.expired": "checkout.session.expired",
"Chinese": "Chinois",
+ "Choose a plan and estimate model usage": "Choisissez un forfait et estimez l'utilisation",
"Choose a username": "Choisir un nom d'utilisateur",
"Choose an amount and payment method": "Choisir un montant et un mode de paiement",
"Choose between default expanded, compact icon-only, or full layout mode": "Choisissez entre le mode d'affichage étendu par défaut, compact (icône uniquement) ou complet",
@@ -930,6 +941,7 @@
"Compliance confirmed": "Conformité confirmée",
"Compliance confirmed successfully": "Conformité confirmée avec succès",
"Concatenate channel system prompt with user's prompt": "Concaténer l'invite système du canal avec l'invite de l'utilisateur",
+ "Concurrency & Cache Hit Rate": "Concurrence et taux de cache",
"Condition Path": "Chemin de condition",
"Condition Settings": "Paramètres de condition",
"Condition Value": "Valeur de condition",
@@ -1022,6 +1034,7 @@
"Console Content": "Contenu de la console",
"Consume": "Consommation",
"Consumed in the last 24 hours": "Consommé dans les dernières 24 heures",
+ "Contact Us": "Nous contacter",
"Container": "Conteneur",
"Container name": "Nom du conteneur",
"Containers": "Conteneurs",
@@ -1164,7 +1177,12 @@
"Credentials": "Identifiants",
"Credentials verification failed": "Échec de la vérification des identifiants",
"Credentials verification failed — double-check Merchant ID and API private key.": "Échec de la vérification des identifiants — vérifiez l’ID marchand et la clé privée API.",
+ "Credit Business": "Crédits Business",
+ "Credit Plans": "Forfaits de crédits",
+ "Credit Power": "Crédits Puissance",
+ "Credit Pro": "Crédits Pro",
"Credit remaining": "Crédit restant",
+ "Credit Starter": "Crédits Découverte",
"Creem API key (leave blank unless updating)": "Clé API Creem (laissez vide sauf si mise à jour)",
"Creem Gateway": "Passerelle Creem",
"Creem Payment": "Paiement Creem",
@@ -1250,6 +1268,7 @@
"Default API version for this channel": "Version API par défaut pour ce canal",
"Default Bearer": "Bearer par defaut",
"Default Collapse Sidebar": "Réduire la barre latérale par défaut",
+ "Default concurrency is 500, with cache hit rate around 90%.": "La concurrence par défaut est de 500, avec un taux de cache d’environ 90 %.",
"Default consumption chart": "Graphique de consommation par défaut",
"Default Max Tokens": "Jetons max par défaut",
"Default model call chart": "Graphique d'appels de modèle par défaut",
@@ -1352,6 +1371,7 @@
"Detected high-risk status code redirect rules": "Les règles de redirection de codes d'état à haut risque suivantes ont été détectées :",
"Detection complete: {{add}} to add, {{remove}} to remove": "Détection terminée : {{add}} à ajouter, {{remove}} à supprimer",
"Detection failed": "Échec de la détection",
+ "Detection Results Are Not 100%": "Résultats de détection non garantis à 100 %",
"Determines how this group is applied elsewhere.": "Détermine comment ce groupe est appliqué ailleurs.",
"Deterministic sampling seed (best-effort)": "Graine d'échantillonnage déterministe (meilleur effort)",
"Developer Friendly": "Convivial pour les développeurs",
@@ -1359,6 +1379,8 @@
"Dify": "Dify",
"Dify channels only support chatflow and agent, and agent does not support images": "Les canaux Dify ne prennent en charge que les chatflow et les agents, et les agents ne prennent pas en charge les images",
"Digest:": "Digest :",
+ "Direct access to official providers": "Accès direct aux fournisseurs officiels",
+ "Direct official access": "Accès officiel direct",
"Direction": "Direction",
"Directory File Count": "Nombre de fichiers du répertoire",
"Directory Total Size": "Taille totale du répertoire",
@@ -1384,6 +1406,7 @@
"Discord": "Discord",
"Discount": "Remise",
"Discount map by recharge amount (JSON object)": "Mappage des réductions par montant de recharge (objet JSON)",
+ "Discount Plans": "Forfaits réduits",
"Discount Rate": "Taux de réduction",
"Discount rate must be ≤ 1": "Le taux de remise doit être ≤ 1",
"Discount rate must be greater than 0": "Le taux de remise doit être supérieur à 0",
@@ -1451,6 +1474,7 @@
"Duration Settings": "Paramètres de durée",
"Duration Unit": "Unité de durée",
"Duration Value": "Valeur de durée",
+ "Dynamic pricing": "Tarification dynamique",
"Dynamic Pricing": "Tarification dynamique",
"e.g. ¥ or HK$": "par ex. ¥ ou HK$",
"e.g. 401, 403, 429, 500-599": "ex. 401, 403, 429, 500-599",
@@ -1686,6 +1710,7 @@
"Enter your username": "Saisir votre nom d'utilisateur",
"Enter your username or email": "Saisir votre nom d'utilisateur ou votre e-mail",
"Enterprise Account": "Compte d'entreprise",
+ "Enterprise-grade API gateway": "Passerelle API de niveau entreprise",
"Enterprise-grade security with comprehensive permission management": "Sécurité de niveau entreprise avec gestion complète des autorisations",
"Entrypoint (space separated)": "Point d'entrée (séparés par des espaces)",
"Env (JSON object)": "Env (objet JSON)",
@@ -1709,6 +1734,7 @@
"Error Type (optional)": "Type d'erreur (optionnel)",
"Estimated cost": "Coût estimé",
"Estimated quota cost": "Coût de quota estimé",
+ "Estimates assume the selected model is used exclusively. Actual usage may vary with cache, tools, media, or dynamic pricing.": "L'estimation suppose un usage exclusif du modèle. L'utilisation réelle varie selon le cache, les outils, les médias ou la tarification dynamique.",
"Every group name in the pricing table can be used in two places: on a user (the user group, assigned by admins) and on a token (the token group, chosen when creating the token). Same name pool, two different jobs.": "Chaque nom de groupe du tableau tarifaire peut être utilisé à deux endroits : sur un utilisateur (groupe d’utilisateurs, attribué par les admins) et sur un jeton (groupe de jetons, choisi à la création du jeton). Même ensemble de noms, deux rôles différents.",
"Everything configured for this group, in one place.": "Toute la configuration de ce groupe, au même endroit.",
"Exact": "Exact",
@@ -1981,6 +2007,7 @@
"Fixed price": "Prix fixe",
"Fixed price (USD)": "Prix fixe (USD)",
"Fixed request price": "Prix fixe par requête",
+ "Flexible monthly credits for occasional users.": "Crédits mensuels souples pour les utilisateurs occasionnels.",
"Floating": "Flottant",
"Flow": "Flux",
"Flow Filters": "Filtres de flux",
@@ -2070,6 +2097,7 @@
"Generation was interrupted": "La génération a été interrompue",
"Generic cache": "Cache générique",
"Get advice": "Obtenir des conseils",
+ "Get API Key": "Obtenir une clé API",
"Get notified when balance falls below this value": "Recevoir une notification lorsque le solde tombe en dessous de cette valeur",
"Get one here": "Obtenir ici",
"Get started": "Commencer",
@@ -2244,10 +2272,12 @@
"Ignore": "Ignorer",
"Ignored upstream models": "Modèles amont ignorés",
"Image": "Image",
+ "Image API URL": "URL d'API d'image",
"Image Generation": "Génération d'images",
"Image In": "Entrée d’image",
"Image input": "Entrée image",
"Image input price": "Prix d’entrée image",
+ "Image Models": "Modèles d'image",
"Image not available": "Image indisponible",
"Image Out": "Sortie d’image",
"Image output price": "Prix de sortie image",
@@ -2255,6 +2285,7 @@
"Image ratio": "Ratio d'image",
"Image to Video": "Image vers vidéo",
"Image Tokens": "Tokens image",
+ "Image Type": "Type d'image",
"Imagine the pricing table has three groups: default (ratio 1.0), premium (ratio 0.5), and vip (ratio 0.8). Users whose account is in the vip group get user-level perks, and premium is a cheaper channel pool that users can pick for their tokens.": "Imaginez que le tableau tarifaire contient trois groupes : default (taux 1,0), premium (taux 0,5) et vip (taux 0,8). Les utilisateurs du groupe vip bénéficient d’avantages au niveau du compte, et premium est un pool de canaux moins cher que les utilisateurs peuvent choisir pour leurs jetons.",
"Import to CC Switch": "Importer vers CC Switch",
"Important": "Important",
@@ -2286,6 +2317,7 @@
"Initializing…": "Initialisation…",
"Inpaint": "Inpainting",
"Input": "Entrée",
+ "Input (1M)": "Entrée (1M)",
"Input mode": "Mode d'entrée",
"Input price": "Prix d’entrée",
"Input price is required before saving dependent prices.": "Le prix d’entrée est requis avant d’enregistrer les prix dépendants.",
@@ -2556,10 +2588,14 @@
"Maximum 200 characters": "Maximum 200 caractères",
"Maximum 500 characters. Supports Markdown and HTML.": "Maximum 500 caractères. Prend en charge Markdown et HTML.",
"Maximum check-in quota": "Quota maximum de connexion",
+ "Maximum input Tokens": "Tokens d'entrée maximum",
"Maximum input window": "Fenêtre d'entrée maximale",
"Maximum number of tokens each user can create. Default 1000. Setting too large may affect performance.": "Nombre maximum de jetons que chaque utilisateur peut créer. Par défaut 1000. Une valeur trop élevée peut affecter les performances.",
"Maximum number of tokens in the response": "Nombre maximum de jetons dans la réponse",
+ "Maximum output Tokens": "Tokens de sortie maximum",
"Maximum quota amount awarded for check-in": "Montant maximum de quota attribué pour la connexion",
+ "Maximum standalone usage across the full plan validity period.": "Utilisation autonome maximale sur toute la durée du forfait.",
+ "Maximum standalone usage within each {{period}} reset period.": "Utilisation autonome maximale pour chaque période de réinitialisation {{period}}.",
"Maximum tokens including hidden reasoning tokens": "Jetons maximum, y compris les jetons de raisonnement masqués",
"Maximum tokens per response": "Nombre maximal de jetons par réponse",
"Maximum tokens per user": "Nombre maximum de jetons par utilisateur",
@@ -2579,9 +2615,12 @@
"min downtime": "min d'interruption",
"Min Top-up": "Recharge min.",
"Min Top-up:": "Recharge min. :",
+ "Mini": "Mini",
"MiniMax": "MiniMax",
"Minimum check-in quota": "Quota minimum de connexion",
+ "Minimum Input (1M)": "Entrée minimale (1M)",
"Minimum LinuxDO trust level required": "Niveau de confiance minimum LinuxDO requis",
+ "Minimum Output (1M)": "Sortie minimale (1M)",
"Minimum quota amount awarded for check-in": "Montant minimum de quota attribué pour la connexion",
"Minimum recharge amount in USD": "Montant de recharge minimum en USD",
"Minimum recharge amount to qualify for this discount.": "Montant minimum de recharge pour bénéficier de cette remise.",
@@ -2612,6 +2651,7 @@
"Model Analytics": "Analyse des modèles",
"Model Analytics Defaults": "Paramètres par défaut de l’analyse des modèles",
"Model Analytics Filters": "Filtres d’analyse des modèles",
+ "Model Authenticity": "Authenticité des modèles",
"model billing support": "prise en charge de la facturation des modèles",
"Model Call Analytics": "Analyse des appels de modèles",
"Model context usage": "Utilisation du contexte du modèle",
@@ -2642,6 +2682,7 @@
"Model not found": "Modèle introuvable",
"Model performance metrics": "Indicateurs de performance des modèles",
"Model Price": "Prix du modèle",
+ "Model Price Comparison": "Comparaison des prix des modèles",
"Model price is not configured. Please complete model pricing in settings.": "Le prix du modèle n'est pas configuré. Veuillez compléter la tarification du modèle dans les paramètres.",
"Model Price Not Configured": "Prix du modèle non configuré",
"Model prices": "Prix des modèles",
@@ -2654,7 +2695,7 @@
"Model Regex": "Regex du modèle",
"Model Regex (one per line)": "Regex du modèle (un par ligne)",
"Model selected": "Modèle sélectionné",
- "Model Square": "Place des modèles",
+ "Model Square": "Tarification des modèles",
"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",
@@ -2696,7 +2737,9 @@
"months": "mois",
"Moonshot": "Moonshot",
"More": "Plus",
+ "More affordable routes are available. For stable access, replace BaseUrl with:": "D'autres routes économiques sont disponibles. Pour un accès stable, remplacez BaseUrl par :",
"More Apps": "Plus",
+ "More credits for regular chat, coding, and daily use.": "Plus de crédits pour le chat, le code et l’usage quotidien.",
"more mapping": "plus de mappage",
"More templates...": "Autres modèles…",
"More than 999 days left": "Plus de 999 jours restants",
@@ -2865,6 +2908,7 @@
"No matching token and channel usage was found.": "Aucune utilisation correspondante par jeton et canal n'a été trouvée.",
"No messages yet": "Pas encore de messages",
"No missing models found.": "Aucun modèle manquant trouvé.",
+ "No model downgrades or substitutions": "Aucune dégradation ni substitution de modèle",
"No model found.": "Aucun modèle trouvé.",
"No model mappings configured. Click \"Add Mapping\" to get started.": "Aucun mappage de modèle configuré. Cliquez sur « Ajouter un mappage » pour commencer.",
"No model price changes to save": "Aucun changement de prix de modèle à sauvegarder",
@@ -2901,6 +2945,7 @@
"No preference": "Aucune préférence",
"No prefill groups yet": "Aucun groupe de préremplissage pour l'instant",
"No price differences found": "Aucune différence de prix trouvée",
+ "No pricing data available": "Aucune donnée tarifaire disponible",
"No processable upstream model updates for this channel": "Aucune mise à jour de modèle en amont traitable pour ce canal",
"No products configured. Click \"Add product\" to get started.": "Aucun produit configuré. Cliquez sur \"Ajouter un produit\" pour commencer.",
"No products match your search": "Aucun produit ne correspond à votre recherche",
@@ -3006,12 +3051,14 @@
"Official documentation": "Documentation officielle",
"Official Gemini from OpenAI Chat": "Gemini officiel depuis OpenAI Chat",
"Official Gemini Native": "Gemini natif officiel",
+ "Official Input / Output (1M)": "Entrée / sortie officielle (1M)",
"Official OpenAI Chat": "OpenAI Chat officiel",
"Official OpenAI Embeddings": "Embeddings OpenAI officiels",
"Official OpenAI Images": "Images OpenAI officielles",
"Official OpenAI Responses": "Responses OpenAI officiel",
"Official Repository": "Dépôt officiel",
"Official Sync": "Synchronisation Officielle",
+ "Officially funded accounts": "Comptes approvisionnés officiellement",
"OhMyGPT": "OhMyGPT",
"OIDC": "OIDC",
"OIDC Client ID": "ID Client OIDC",
@@ -3125,6 +3172,7 @@
"Other users": "Autres utilisateurs",
"Outage": "Interruption",
"Output": "Sortie",
+ "Output (1M)": "Sortie (1M)",
"Output aspect ratio": "Format d'image de sortie",
"Output image size": "Taille de l'image de sortie",
"Output price": "Prix de sortie",
@@ -3274,6 +3322,7 @@
"Performance Settings": "Paramètres de performances",
"Performed {{action}} on user {{username}} (ID: {{id}})": "Action {{action}} effectuée sur l'utilisateur {{username}} (ID : {{id}})",
"Period": "Période",
+ "Period Quota": "Quota par période",
"Periodically check for upstream model changes": "Vérifier périodiquement les changements de modèles en amont",
"Periodically send ping frames to keep streaming connections active.": "Envoyer périodiquement des trames ping pour maintenir les connexions de streaming actives.",
"Permanently delete your account and all data": "Supprimer définitivement votre compte et toutes les données",
@@ -3340,6 +3389,7 @@
"Please fix JSON errors before saving": "Veuillez corriger les erreurs JSON avant d’enregistrer",
"Please fix the highlighted fields before saving": "Veuillez corriger les champs en surbrillance avant d’enregistrer",
"Please log in with the appropriate credentials": "Veuillez vous connecter avec les identifiants appropriés",
+ "Please refresh the page and try again.": "Actualisez la page et réessayez.",
"Please select a container": "Veuillez sélectionner un conteneur",
"Please select a payment method": "Veuillez sélectionner un mode de paiement",
"Please select a primary model": "Veuillez sélectionner un modèle principal",
@@ -3439,6 +3489,7 @@
"Pricing mode": "Mode de tarification",
"Pricing Ratios": "Ratios de tarification",
"Pricing Type": "Type de tarification",
+ "Pricing unavailable": "Tarif indisponible",
"Primary Model": "Modèle principal",
"Prioritize reusing the last successful channel based on keys extracted from request context (sticky routing)": "Priorise la réutilisation du dernier canal ayant réussi, basé sur les clés extraites du contexte de la requête (routage persistant)",
"Priority": "Priorité",
@@ -3765,6 +3816,7 @@
"Reset Passkey for {{username}}? The user will need to register a new Passkey before using passwordless login.": "Réinitialiser la Passkey de {{username}} ? L’utilisateur devra enregistrer une nouvelle Passkey avant d’utiliser la connexion sans mot de passe.",
"Reset password": "Réinitialiser le mot de passe",
"Reset Period": "Période de réinitialisation",
+ "Reset Plans": "Forfaits réinitialisables",
"Reset prices": "Réinitialiser les prix",
"Reset quota": "Réinitialiser le quota",
"Reset ratios": "Réinitialiser les ratios",
@@ -3953,6 +4005,8 @@
"Select a group": "Sélectionner un groupe",
"Select a group type": "Sélectionner un type de groupe",
"Select a model to edit pricing": "Sélectionnez un modèle pour modifier sa tarification",
+ "Select a plan": "Sélectionnez un forfait",
+ "Select a plan to see the maximum standalone input or output Token capacity for each model.": "Sélectionnez un forfait pour connaître le maximum de Tokens d'entrée ou de sortie de chaque modèle utilisé seul.",
"Select a preset...": "Sélectionner un préréglage...",
"Select a product": "Sélectionner un produit",
"Select a role": "Sélectionner un rôle",
@@ -4095,6 +4149,8 @@
"Show": "Afficher",
"Show All": "Tout afficher",
"Show all providers including unbound": "Afficher tous les fournisseurs (y compris non liés)",
+ "Show Less": "Afficher moins",
+ "Show More": "Afficher plus",
"Show only bound providers": "Afficher uniquement les fournisseurs liés",
"Show or hide flow columns": "Afficher ou masquer les colonnes du flux",
"Show preview": "Afficher l'apercu",
@@ -4175,6 +4231,7 @@
"SQLite stores all data in a single file. Make sure that file is persisted when running in containers.": "SQLite stocke toutes les données dans un seul fichier. Assurez-vous que ce fichier est persisté lors de l'exécution dans des conteneurs.",
"SSL/TLS": "SSL/TLS",
"SSRF Protection": "Protection SSRF",
+ "Stable high concurrency": "Haute concurrence stable",
"stale": "expiré",
"Standard": "Standard",
"Standard price": "Prix standard",
@@ -4182,6 +4239,7 @@
"Start a conversation to see messages here": "Démarrez une conversation pour voir les messages ici",
"Start a playground chat": "Démarrer une conversation dans le playground",
"Start collecting payments globally without registering a company. Built for indie developers, OPC sole proprietorships, and startups. Waffo Pancake acts as your Merchant of Record, taking on the compliance burden of global payment collection — consumption tax, invoicing, subscription management, refunds, and chargebacks. Solo developers can launch fast and stay focused on product instead of compliance. Onboard in minutes — one prompt to a full integration.": "Commencez à encaisser des paiements dans le monde entier sans créer de société. Conçu pour les développeurs indépendants, les entrepreneurs individuels OPC et les startups. Waffo Pancake agit comme Merchant of Record et prend en charge la conformité liée à l’encaissement mondial : taxes à la consommation, facturation, gestion des abonnements, remboursements et rétrofacturations. Les développeurs solo peuvent lancer rapidement leur produit et rester concentrés sur celui-ci plutôt que sur la conformité. Intégration en quelques minutes, d’une seule invite à une intégration complète.",
+ "Start for Free": "Commencer gratuitement",
"Start for free with generous limits. No credit card required.": "Commencez gratuitement avec des limites généreuses. Aucune carte de crédit requise.",
"Start Time": "Heure de début",
"Started": "Démarré",
@@ -4520,6 +4578,7 @@
"Timing": "Durée",
"Tip": "Astuce",
"to access this resource.": "pour accéder à cette ressource.",
+ "To avoid account bans, we add simulated prompt words in the requests, which may result in the score not reaching 100%.": "Pour éviter la suspension des comptes, nous ajoutons des invites simulées aux requêtes, ce qui peut empêcher le score d'atteindre 100 %.",
"to confirm": "pour confirmer",
"To Lower": "En minuscules",
"To Lowercase": "En minuscules",
@@ -4636,6 +4695,7 @@
"Trend": "Tendance",
"Trending down": "En baisse",
"Trending up": "En hausse",
+ "Trial": "Essai",
"Triggered garbage collection": "Collecte des déchets déclenchée",
"Trim leading/trailing whitespace": "Supprimer les espaces en début/fin",
"Trim Prefix": "Supprimer le préfixe",
@@ -4674,6 +4734,7 @@
"Unable to load groups": "Impossible de charger les groupes",
"Unable to load rankings": "Impossible de charger les classements",
"Unable to load rankings data": "Impossible de charger les données des classements",
+ "Unable to load subscription plans": "Impossible de charger les forfaits",
"Unable to open chat": "Impossible d'ouvrir la discussion",
"Unable to parse structured pricing": "Impossible d'analyser la tarification structurée",
"Unable to prepare chat link. Please ensure you have an enabled API key.": "Impossible de préparer le lien de chat. Veuillez vous assurer d'avoir une clé API activée.",
@@ -4987,6 +5048,7 @@
"We could not load instances.": "Impossible de charger les instances.",
"We could not load system tasks.": "Impossible de charger les tâches système.",
"We could not load the setup status.": "Nous n'avons pas pu charger l'état de la configuration.",
+ "We provide 100% official full-performance models. Requests are routed directly to the official address via the official client channel. If certain detection items (such as forced structured output) show as unsupported, this is because the channel itself does not support that capability — not because the model has been replaced or downgraded.": "Nous fournissons des modèles officiels à pleine capacité. Les requêtes sont acheminées directement vers l'adresse officielle via le canal client officiel. Si certains tests, comme la sortie structurée forcée, indiquent une fonction non prise en charge, c'est le canal qui ne la prend pas en charge, et non un remplacement ou une dégradation du modèle.",
"We will prompt your device to confirm using biometrics or your hardware key.": "Nous allons demander à votre appareil de confirmer en utilisant la biométrie ou votre clé matérielle.",
"We'll be back online shortly.": "Nous serons de retour en ligne sous peu.",
"Web search": "Recherche web",
@@ -5012,6 +5074,10 @@
"Week": "Semaine",
"Weekday": "Jour de la semaine",
"Weekly": "Hebdomadaire",
+ "Weekly Business": "Hebdo Business",
+ "Weekly credits for regular users with a controlled budget.": "Des crédits hebdomadaires pour les utilisateurs réguliers au budget maîtrisé.",
+ "Weekly Pro": "Hebdo Pro",
+ "Weekly Starter": "Hebdo Découverte",
"Weekly token usage by model across the past few weeks": "Utilisation hebdomadaire des tokens par modèle au cours des dernières semaines",
"Weekly token usage by model across the past year": "Utilisation hebdomadaire de tokens par modèle sur l’année écoulée",
"Weekly token usage by model since launch": "Utilisation hebdomadaire de tokens par modèle depuis le lancement",
diff --git a/web/default/src/i18n/locales/ja.json b/web/default/src/i18n/locales/ja.json
index f47e02bb0ad6..db8245390f57 100644
--- a/web/default/src/i18n/locales/ja.json
+++ b/web/default/src/i18n/locales/ja.json
@@ -28,6 +28,7 @@
"[{\"ChatGPT\":\"https://chat.openai.com\"},{\"Lobe Chat\":\"https://chat-preview.lobehub.com/?settings={...}\"}]": "[{\"ChatGPT\":\"https://chat.openai.com\"},{\"Lobe Chat\":\"https://chat-preview.lobehub.com/?settings={...}\"}]",
"[{\"name\":\"支付宝\",\"type\":\"alipay\",\"color\":\"#1677FF\"}]": "[{\"name\":\"Alipay\",\"type\":\"alipay\",\"color\":\"#1677FF\"}]",
"[{\"name\":\"支付宝\",\"type\":\"alipay\",\"icon\":\"SiAlipay\"}]": "[{\"name\":\"Alipay\",\"type\":\"alipay\",\"icon\":\"SiAlipay\"}]",
+ "[Telegram group](https://t.me/+36iGYj-hkkFkOWRl)": "[Telegram グループ](https://t.me/+36iGYj-hkkFkOWRl)",
"{\"original-model\": \"replacement-model\"}": "{\" original - model \":\" replacement - model \"}",
"{{category}} Models": "{{category}} モデル",
"{{completed}}/{{total}} completed": "{{completed}}/{{total}} 完了",
@@ -52,6 +53,7 @@
"{{count}} models": "{{count}} モデル",
"{{count}} months ago": "{{count}} ヶ月前",
"{{count}} override": "{{count}} 個のオーバーライド",
+ "{{count}} plans available": "{{count}}件のプラン",
"{{count}} selected targets available for bulk copy.": "一括コピーに使用できる対象が {{count}} 個選択されています。",
"{{count}} tiers": "{{count}} 段階",
"{{count}} Uptime Kuma groups will be removed from the list.": "{{count}} 件の Uptime Kuma グループがリストから削除されます。",
@@ -63,6 +65,7 @@
"{{modality}} not supported": "{{modality}} はサポートされていません",
"{{modality}} supported": "{{modality}} をサポート",
"{{n}} model(s) selected": "{{n}} 件のモデルを選択済み",
+ "{{plan}} Token capacity": "{{plan}} のToken容量",
"{{processed}} of {{total}} log entries processed.": "{{total}} 件中 {{processed}} 件のログを処理しました。",
"{{success}} succeeded, {{failed}} failed": "{{success}} 件成功、{{failed}} 件失敗",
"{{target}} test failed": "{{target}} のテストに失敗しました",
@@ -118,6 +121,12 @@
"80,443,8080": "80,443,8080",
"A billing multiplier. Lower ratios mean lower API call costs.": "課金倍率です。倍率が低いほど API 呼び出しコストは低くなります。",
"A focused home for keys, balance, routing, and service health.": "キー、残高、ルーティング、サービス状態を集約したホームです。",
+ "A high-capacity credit plan for heavy API usage.": "大量の API 利用に対応する大容量クレジットプランです。",
+ "A higher weekly allowance for demanding workflows.": "要求の高いワークフロー向けの、より大きな週次クレジットです。",
+ "A larger monthly allowance for frequent professional use.": "頻繁なプロ用途に向けた大きめの月額クレジットです。",
+ "A one-time low-cost trial for testing core models.": "主要モデルを試すための、一回限りの低価格トライアルです。",
+ "A predictable weekly budget for light, consistent usage.": "軽量かつ継続的な利用に適した、予測しやすい週次予算です。",
+ "A small credit pack for light, short-term usage.": "軽量かつ短期間の利用に適した小容量クレジットパックです。",
"About": "このサービスについて",
"About {{days}} days left": "約 {{days}} 日分",
"Accept Unpriced Models": "価格設定されていないモデルを許可",
@@ -680,6 +689,7 @@
"Cache Directory Disk Space": "キャッシュディレクトリのディスク容量",
"Cache Directory Info": "キャッシュディレクトリ情報",
"Cache Entries": "キャッシュエントリ",
+ "Cache Hit": "キャッシュヒット",
"Cache mode": "キャッシュモード",
"Cache pricing": "キャッシュ料金",
"Cache ratio": "キャッシュ倍率",
@@ -792,6 +802,7 @@
"checkout.session.completed": "checkout.session.completed",
"checkout.session.expired": "checkout.session.expired",
"Chinese": "中国語",
+ "Choose a plan and estimate model usage": "プランを選んでモデル使用量を見積もる",
"Choose a username": "ユーザー名を選択",
"Choose an amount and payment method": "金額と支払い方法を選択してください",
"Choose between default expanded, compact icon-only, or full layout mode": "デフォルトの展開表示、コンパクトなアイコンのみ、またはフルレイアウトモードから選択します",
@@ -930,6 +941,7 @@
"Compliance confirmed": "コンプライアンス確認済み",
"Compliance confirmed successfully": "コンプライアンス確認が完了しました",
"Concatenate channel system prompt with user's prompt": "チャネルのシステムプロンプトをユーザーのプロンプトと連結する",
+ "Concurrency & Cache Hit Rate": "同時実行数とキャッシュヒット率",
"Condition Path": "条件パス",
"Condition Settings": "条件設定",
"Condition Value": "条件値",
@@ -1022,6 +1034,7 @@
"Console Content": "コンソールコンテンツ",
"Consume": "消費",
"Consumed in the last 24 hours": "直近24時間の消費量",
+ "Contact Us": "お問い合わせ",
"Container": "コンテナ",
"Container name": "コンテナ名",
"Containers": "コンテナ",
@@ -1164,7 +1177,12 @@
"Credentials": "認証情報",
"Credentials verification failed": "認証情報の検証に失敗しました",
"Credentials verification failed — double-check Merchant ID and API private key.": "認証情報の検証に失敗しました。Merchant ID と API 秘密鍵を再確認してください。",
+ "Credit Business": "ビジネスクレジット",
+ "Credit Plans": "クレジットプラン",
+ "Credit Power": "パワークレジット",
+ "Credit Pro": "プロクレジット",
"Credit remaining": "残りクレジット",
+ "Credit Starter": "スタータークレジット",
"Creem API key (leave blank unless updating)": "Creem API キー (更新しない限り空白のまま)",
"Creem Gateway": "Creem ゲートウェイ",
"Creem Payment": "Creem 決済",
@@ -1250,6 +1268,7 @@
"Default API version for this channel": "このチャネルのデフォルトのAPIバージョン",
"Default Bearer": "既定の Bearer",
"Default Collapse Sidebar": "デフォルトのサイドバー折りたたみ",
+ "Default concurrency is 500, with cache hit rate around 90%.": "デフォルトの同時実行数は 500、キャッシュヒット率は約 90% です。",
"Default consumption chart": "デフォルトの消費チャート",
"Default Max Tokens": "デフォルトの最大トークン",
"Default model call chart": "デフォルトのモデル呼び出しチャート",
@@ -1352,6 +1371,7 @@
"Detected high-risk status code redirect rules": "以下の高リスクステータスコードリダイレクトルールが検出されました:",
"Detection complete: {{add}} to add, {{remove}} to remove": "検出完了:{{add}} 個追加、{{remove}} 個削除",
"Detection failed": "検出に失敗しました",
+ "Detection Results Are Not 100%": "検出結果が 100% にならない場合があります",
"Determines how this group is applied elsewhere.": "このグループが他の場所でどのように適用されるかを決定します。",
"Deterministic sampling seed (best-effort)": "可能な限り再現性のあるサンプリングシード",
"Developer Friendly": "開発者向け",
@@ -1359,6 +1379,8 @@
"Dify": "Dify",
"Dify channels only support chatflow and agent, and agent does not support images": "Dify チャネルは chatflow と agent のみサポートしており、agent は画像をサポートしていません",
"Digest:": "ダイジェスト:",
+ "Direct access to official providers": "公式プロバイダーに直接接続",
+ "Direct official access": "公式サービスへ直接接続",
"Direction": "方向",
"Directory File Count": "ディレクトリファイル数",
"Directory Total Size": "ディレクトリ合計サイズ",
@@ -1384,6 +1406,7 @@
"Discord": "Discord",
"Discount": "特典",
"Discount map by recharge amount (JSON object)": "リチャージ額による割引マップ(JSONオブジェクト)",
+ "Discount Plans": "割引プラン",
"Discount Rate": "割引率",
"Discount rate must be ≤ 1": "割引率は 1 以下でなければなりません",
"Discount rate must be greater than 0": "割引率は 0 より大きくなければなりません",
@@ -1451,6 +1474,7 @@
"Duration Settings": "有効期間設定",
"Duration Unit": "期間単位",
"Duration Value": "期間値",
+ "Dynamic pricing": "動的料金",
"Dynamic Pricing": "ダイナミック価格設定",
"e.g. ¥ or HK$": "例: ¥ または HK$",
"e.g. 401, 403, 429, 500-599": "例:401, 403, 429, 500-599",
@@ -1686,6 +1710,7 @@
"Enter your username": "ユーザー名を入力",
"Enter your username or email": "ユーザー名またはメールアドレスを入力",
"Enterprise Account": "エンタープライズアカウント",
+ "Enterprise-grade API gateway": "エンタープライズ向けAPIゲートウェイ",
"Enterprise-grade security with comprehensive permission management": "包括的な権限管理を備えたエンタープライズグレードのセキュリティ",
"Entrypoint (space separated)": "Entrypoint (スペース区切り)",
"Env (JSON object)": "Env (JSON オブジェクト)",
@@ -1709,6 +1734,7 @@
"Error Type (optional)": "エラータイプ(任意)",
"Estimated cost": "推定コスト",
"Estimated quota cost": "想定クォートコスト",
+ "Estimates assume the selected model is used exclusively. Actual usage may vary with cache, tools, media, or dynamic pricing.": "選択したモデルのみを使用する前提の見積もりです。実際の使用量はキャッシュ、ツール、メディア、動的料金により異なります。",
"Every group name in the pricing table can be used in two places: on a user (the user group, assigned by admins) and on a token (the token group, chosen when creating the token). Same name pool, two different jobs.": "料金表の各グループ名は2つの場所で使えます。ユーザー側(ユーザーグループ、管理者が割り当て)とトークン側(トークングループ、トークン作成時に選択)です。同じ名前プールで、役割は2つです。",
"Everything configured for this group, in one place.": "このグループのすべての設定を一か所で確認できます。",
"Exact": "完全一致",
@@ -1981,6 +2007,7 @@
"Fixed price": "固定価格",
"Fixed price (USD)": "固定価格 (USD)",
"Fixed request price": "固定リクエスト価格",
+ "Flexible monthly credits for occasional users.": "時々利用するユーザー向けの柔軟な月額クレジットです。",
"Floating": "フローティング",
"Flow": "フロー",
"Flow Filters": "フローフィルター",
@@ -2070,6 +2097,7 @@
"Generation was interrupted": "生成が中断されました",
"Generic cache": "汎用キャッシュ",
"Get advice": "アドバイスを得る",
+ "Get API Key": "APIキーを取得",
"Get notified when balance falls below this value": "残高がこの値を下回ったときに通知を受け取る",
"Get one here": "こちらから取得",
"Get started": "はじめる",
@@ -2244,10 +2272,12 @@
"Ignore": "無視",
"Ignored upstream models": "無視する上流モデル",
"Image": "画像",
+ "Image API URL": "画像生成専用 URL",
"Image Generation": "画像生成",
"Image In": "画像入力",
"Image input": "画像入力",
"Image input price": "画像入力価格",
+ "Image Models": "画像モデル",
"Image not available": "画像を利用できません",
"Image Out": "画像出力",
"Image output price": "画像出力価格",
@@ -2255,6 +2285,7 @@
"Image ratio": "画像倍率",
"Image to Video": "画像から動画",
"Image Tokens": "画像トークン",
+ "Image Type": "画像タイプ",
"Imagine the pricing table has three groups: default (ratio 1.0), premium (ratio 0.5), and vip (ratio 0.8). Users whose account is in the vip group get user-level perks, and premium is a cheaper channel pool that users can pick for their tokens.": "料金表に3つのグループがあるとします:default(倍率 1.0)、premium(倍率 0.5)、vip(倍率 0.8)。アカウントが vip グループのユーザーはユーザーレベルの特典を受けられ、premium はユーザーがトークン用に選べる安いチャネルプールです。",
"Import to CC Switch": "CC Switch にインポート",
"Important": "重要",
@@ -2286,6 +2317,7 @@
"Initializing…": "初期化中…",
"Inpaint": "インペイント",
"Input": "入力",
+ "Input (1M)": "入力(1M)",
"Input mode": "入力モード",
"Input price": "入力価格",
"Input price is required before saving dependent prices.": "依存する価格を保存する前に入力価格が必要です。",
@@ -2556,10 +2588,14 @@
"Maximum 200 characters": "最大200文字",
"Maximum 500 characters. Supports Markdown and HTML.": "最大500文字。MarkdownとHTMLをサポートしています。",
"Maximum check-in quota": "最大チェックインクォータ",
+ "Maximum input Tokens": "最大入力Token",
"Maximum input window": "最大入力ウィンドウ",
"Maximum number of tokens each user can create. Default 1000. Setting too large may affect performance.": "各ユーザーが作成できる最大トークン数。デフォルトは 1000。大きすぎる値はパフォーマンスに影響を与える可能性があります。",
"Maximum number of tokens in the response": "レスポンスの最大トークン数",
+ "Maximum output Tokens": "最大出力Token",
"Maximum quota amount awarded for check-in": "チェックインで付与される最大クォータ量",
+ "Maximum standalone usage across the full plan validity period.": "プランの全有効期間における単独利用の最大量です。",
+ "Maximum standalone usage within each {{period}} reset period.": "各{{period}}リセット期間における単独利用の最大量です。",
"Maximum tokens including hidden reasoning tokens": "隠れ推論トークンを含む最大トークン数",
"Maximum tokens per response": "1 回の応答あたりの最大トークン数",
"Maximum tokens per user": "ユーザーあたりの最大トークン数",
@@ -2579,9 +2615,12 @@
"min downtime": "分のダウンタイム",
"Min Top-up": "最低チャージ額",
"Min Top-up:": "最小チャージ額:",
+ "Mini": "ミニ",
"MiniMax": "MiniMax",
"Minimum check-in quota": "最小チェックインクォータ",
+ "Minimum Input (1M)": "最低入力 (1M)",
"Minimum LinuxDO trust level required": "必要な最小LinuxDOトラストレベル",
+ "Minimum Output (1M)": "最低出力 (1M)",
"Minimum quota amount awarded for check-in": "チェックインで付与される最小クォータ量",
"Minimum recharge amount in USD": "米ドルでの最小リチャージ額",
"Minimum recharge amount to qualify for this discount.": "この割引の対象となる最小チャージ額。",
@@ -2612,6 +2651,7 @@
"Model Analytics": "モデル分析",
"Model Analytics Defaults": "モデル分析のデフォルト設定",
"Model Analytics Filters": "モデル分析フィルター",
+ "Model Authenticity": "モデルの信頼性",
"model billing support": "モデル課金対応",
"Model Call Analytics": "モデル呼び出し分析",
"Model context usage": "モデルのコンテキスト使用量",
@@ -2642,6 +2682,7 @@
"Model not found": "モデルが見つかりません",
"Model performance metrics": "モデル性能メトリクス",
"Model Price": "モデル価格",
+ "Model Price Comparison": "モデル料金比較",
"Model price is not configured. Please complete model pricing in settings.": "モデル価格が未設定です。設定でモデル料金を補完してください。",
"Model Price Not Configured": "モデル価格が未設定",
"Model prices": "モデル価格",
@@ -2654,7 +2695,7 @@
"Model Regex": "モデル正規表現",
"Model Regex (one per line)": "モデル正規表現(1行に1つ)",
"Model selected": "選択済みモデル",
- "Model Square": "モデル広場",
+ "Model Square": "モデル料金",
"Model Tags": "モデルタグ",
"Model to use for testing": "テストに使用するモデル",
"Model to use when testing channel connectivity": "チャネル接続性をテストする際に使用するモデル",
@@ -2696,7 +2737,9 @@
"months": "ヶ月",
"Moonshot": "Moonshot",
"More": "もっと見る",
+ "More affordable routes are available. For stable access, replace BaseUrl with:": "より低価格なルートも利用できます。安定したアクセスには、BaseUrlを次に置き換えてください:",
"More Apps": "さらに",
+ "More credits for regular chat, coding, and daily use.": "日常のチャット、コーディング、利用に適した多めのクレジットです。",
"more mapping": "さらにマッピング",
"More templates...": "ほかのテンプレート…",
"More than 999 days left": "999日以上",
@@ -2865,6 +2908,7 @@
"No matching token and channel usage was found.": "一致するトークンとチャネルの使用量が見つかりませんでした。",
"No messages yet": "まだメッセージがありません",
"No missing models found.": "不足しているモデルは見つかりません。",
+ "No model downgrades or substitutions": "モデルの劣化・偽装なし",
"No model found.": "モデルが見つかりません。",
"No model mappings configured. Click \"Add Mapping\" to get started.": "モデルマッピングは設定されていません。「マッピングを追加」をクリックして開始してください。",
"No model price changes to save": "保存するモデル価格の変更はありません",
@@ -2901,6 +2945,7 @@
"No preference": "設定なし",
"No prefill groups yet": "まだ事前入力グループはありません",
"No price differences found": "価格差異は見つかりませんでした",
+ "No pricing data available": "料金データがありません",
"No processable upstream model updates for this channel": "このチャネルには処理可能な上流モデル更新がありません",
"No products configured. Click \"Add product\" to get started.": "製品が設定されていません。「製品を追加」をクリックして開始してください。",
"No products match your search": "検索に一致する製品がありません",
@@ -3006,12 +3051,14 @@
"Official documentation": "公式ドキュメント",
"Official Gemini from OpenAI Chat": "OpenAI Chat から公式 Gemini",
"Official Gemini Native": "公式 Gemini ネイティブ",
+ "Official Input / Output (1M)": "公式入力/出力(1M)",
"Official OpenAI Chat": "公式 OpenAI Chat",
"Official OpenAI Embeddings": "公式 OpenAI Embeddings",
"Official OpenAI Images": "公式 OpenAI Images",
"Official OpenAI Responses": "公式 OpenAI Responses",
"Official Repository": "公式リポジトリ",
"Official Sync": "公式同期",
+ "Officially funded accounts": "正規にチャージされたアカウント",
"OhMyGPT": "OhMyGPT",
"OIDC": "OIDC",
"OIDC Client ID": "OIDCクライアントID",
@@ -3125,6 +3172,7 @@
"Other users": "その他のユーザー",
"Outage": "ダウンタイム",
"Output": "出力",
+ "Output (1M)": "出力(1M)",
"Output aspect ratio": "出力アスペクト比",
"Output image size": "出力画像サイズ",
"Output price": "出力価格",
@@ -3274,6 +3322,7 @@
"Performance Settings": "パフォーマンス設定",
"Performed {{action}} on user {{username}} (ID: {{id}})": "ユーザー {{username}}(ID: {{id}})に対して {{action}} を実行しました",
"Period": "期間",
+ "Period Quota": "期間クォータ",
"Periodically check for upstream model changes": "アップストリームモデルの変更を定期的にチェック",
"Periodically send ping frames to keep streaming connections active.": "ストリーミング接続をアクティブに保つために、定期的にpingフレームを送信します。",
"Permanently delete your account and all data": "アカウントとすべてのデータを永久に削除",
@@ -3340,6 +3389,7 @@
"Please fix JSON errors before saving": "保存する前に JSON エラーを直してください",
"Please fix the highlighted fields before saving": "保存する前に強調表示された項目を修正してください",
"Please log in with the appropriate credentials": "適切な認証情報でログインしてください",
+ "Please refresh the page and try again.": "ページを再読み込みしてもう一度お試しください。",
"Please select a container": "コンテナを選択してください",
"Please select a payment method": "お支払い方法を選択してください",
"Please select a primary model": "プライマリモデルを選択してください",
@@ -3439,6 +3489,7 @@
"Pricing mode": "価格モード",
"Pricing Ratios": "価格比率",
"Pricing Type": "価格タイプ",
+ "Pricing unavailable": "料金情報なし",
"Primary Model": "プライマリモデル",
"Prioritize reusing the last successful channel based on keys extracted from request context (sticky routing)": "リクエストコンテキストから抽出したキーに基づいて、前回成功したチャネルを優先的に再利用します(スティッキールーティング)",
"Priority": "優先度",
@@ -3765,6 +3816,7 @@
"Reset Passkey for {{username}}? The user will need to register a new Passkey before using passwordless login.": "{{username}} の Passkey をリセットしますか?パスワードレスログインを使用するには、新しい Passkey の登録が必要です。",
"Reset password": "パスワードをリセット",
"Reset Period": "リセット期間",
+ "Reset Plans": "リセットプラン",
"Reset prices": "価格をリセット",
"Reset quota": "クォータをリセット",
"Reset ratios": "比率をリセット",
@@ -3953,6 +4005,8 @@
"Select a group": "グループを選択",
"Select a group type": "グループタイプを選択",
"Select a model to edit pricing": "料金を編集するモデルを選択",
+ "Select a plan": "プランを選択",
+ "Select a plan to see the maximum standalone input or output Token capacity for each model.": "プランを選択すると、各モデルを入力または出力のみに使用した場合の最大Token数を確認できます。",
"Select a preset...": "プリセットを選択...",
"Select a product": "商品を選択",
"Select a role": "ロールを選択",
@@ -4095,6 +4149,8 @@
"Show": "表示",
"Show All": "すべて表示",
"Show all providers including unbound": "未バインドを含むすべてのプロバイダーを表示",
+ "Show Less": "折りたたむ",
+ "Show More": "さらに表示",
"Show only bound providers": "バインド済みのプロバイダーのみ表示",
"Show or hide flow columns": "フロー列の表示・非表示",
"Show preview": "プレビューを表示",
@@ -4175,6 +4231,7 @@
"SQLite stores all data in a single file. Make sure that file is persisted when running in containers.": "SQLite はすべてのデータを単一ファイルに保存します。コンテナで実行する場合は、ファイルが永続化されていることを確認してください。",
"SSL/TLS": "SSL/TLS",
"SSRF Protection": "SSRF保護",
+ "Stable high concurrency": "安定した高同時実行性能",
"stale": "期限切れ",
"Standard": "標準",
"Standard price": "標準価格",
@@ -4182,6 +4239,7 @@
"Start a conversation to see messages here": "会話を開始すると、ここにメッセージが表示されます",
"Start a playground chat": "Playground でチャットを開始",
"Start collecting payments globally without registering a company. Built for indie developers, OPC sole proprietorships, and startups. Waffo Pancake acts as your Merchant of Record, taking on the compliance burden of global payment collection — consumption tax, invoicing, subscription management, refunds, and chargebacks. Solo developers can launch fast and stay focused on product instead of compliance. Onboard in minutes — one prompt to a full integration.": "法人を設立せずに世界中で決済を受け付けられます。個人開発者、OPC 個人事業主、スタートアップ向けに設計されています。Waffo Pancake は Merchant of Record として、消費税、請求書、サブスクリプション管理、返金、チャージバックなど、グローバル決済のコンプライアンス負担を引き受けます。個人開発者はコンプライアンスではなくプロダクトに集中しながら素早くローンチできます。数分でオンボーディングし、1 つのプロンプトから完全な統合まで進められます。",
+ "Start for Free": "無料で利用開始",
"Start for free with generous limits. No credit card required.": "豊富な無料枠で始められます。クレジットカードは不要です。",
"Start Time": "開始時間",
"Started": "起動時刻",
@@ -4520,6 +4578,7 @@
"Timing": "所要時間",
"Tip": "ヒント",
"to access this resource.": "このリソースにアクセスするには。",
+ "To avoid account bans, we add simulated prompt words in the requests, which may result in the score not reaching 100%.": "アカウント停止を避けるため、リクエストに疑似プロンプトを追加しています。そのため、スコアが 100% に達しない場合があります。",
"to confirm": "確認する",
"To Lower": "小文字に変換",
"To Lowercase": "小文字化",
@@ -4636,6 +4695,7 @@
"Trend": "トレンド",
"Trending down": "下降中",
"Trending up": "上昇中",
+ "Trial": "トライアル",
"Triggered garbage collection": "ガベージコレクションを実行しました",
"Trim leading/trailing whitespace": "先頭/末尾の空白を除去",
"Trim Prefix": "プレフィックス削除",
@@ -4674,6 +4734,7 @@
"Unable to load groups": "グループをロードできません",
"Unable to load rankings": "ランキングを読み込めません",
"Unable to load rankings data": "ランキングデータを読み込めません",
+ "Unable to load subscription plans": "サブスクリプションプランを読み込めません",
"Unable to open chat": "チャットを開けません",
"Unable to parse structured pricing": "構造化された価格を解析できません",
"Unable to prepare chat link. Please ensure you have an enabled API key.": "チャットリンクを準備できません。有効な API キーが設定されていることを確認してください。",
@@ -4987,6 +5048,7 @@
"We could not load instances.": "インスタンス情報を読み込めませんでした。",
"We could not load system tasks.": "システムタスクを読み込めませんでした。",
"We could not load the setup status.": "セットアップステータスを読み込めませんでした。",
+ "We provide 100% official full-performance models. Requests are routed directly to the official address via the official client channel. If certain detection items (such as forced structured output) show as unsupported, this is because the channel itself does not support that capability — not because the model has been replaced or downgraded.": "100% 公式のフル性能モデルを提供しています。リクエストは公式クライアント経由で公式アドレスへ直接送信されます。強制構造化出力など一部の検出項目が未対応と表示される場合は、チャネル自体がその機能をサポートしていないためであり、モデルの置換や性能低下ではありません。",
"We will prompt your device to confirm using biometrics or your hardware key.": "生体認証またはハードウェアキーを使用して確認するよう、デバイスにプロンプトが表示されます。",
"We'll be back online shortly.": "まもなくオンラインに戻ります。",
"Web search": "ウェブ検索",
@@ -5012,6 +5074,10 @@
"Week": "週",
"Weekday": "曜日",
"Weekly": "毎週",
+ "Weekly Business": "週間ビジネス",
+ "Weekly credits for regular users with a controlled budget.": "予算を管理しやすい、通常利用者向けの週次クレジットです。",
+ "Weekly Pro": "週間プロ",
+ "Weekly Starter": "週間スターター",
"Weekly token usage by model across the past few weeks": "過去数週間にわたるモデル別の週次トークン使用量",
"Weekly token usage by model across the past year": "過去1年のモデル別週次トークン使用量",
"Weekly token usage by model since launch": "ローンチ以降のモデル別週次トークン使用量",
diff --git a/web/default/src/i18n/locales/ru.json b/web/default/src/i18n/locales/ru.json
index 521b1d57d1bc..26025ad8d654 100644
--- a/web/default/src/i18n/locales/ru.json
+++ b/web/default/src/i18n/locales/ru.json
@@ -28,6 +28,7 @@
"[{\"ChatGPT\":\"https://chat.openai.com\"},{\"Lobe Chat\":\"https://chat-preview.lobehub.com/?settings={...}\"}]": "[{\"ChatGPT\":\"https://chat.openai.com\"},{\"Lobe Chat\":\"https://chat-preview.lobehub.com/?settings={...}\"}]",
"[{\"name\":\"支付宝\",\"type\":\"alipay\",\"color\":\"#1677FF\"}]": "[{\"name\":\"Alipay\",\"type\":\"alipay\",\"color\":\"#1677FF\"}]",
"[{\"name\":\"支付宝\",\"type\":\"alipay\",\"icon\":\"SiAlipay\"}]": "[{\"name\":\"Alipay\",\"type\":\"alipay\",\"icon\":\"SiAlipay\"}]",
+ "[Telegram group](https://t.me/+36iGYj-hkkFkOWRl)": "[Группа Telegram](https://t.me/+36iGYj-hkkFkOWRl)",
"{\"original-model\": \"replacement-model\"}": "{\"original-model\": \"replacement-model\"}",
"{{category}} Models": "Модели {{category}}",
"{{completed}}/{{total}} completed": "{{completed}}/{{total}} завершено",
@@ -52,6 +53,7 @@
"{{count}} models": "моделей: {{count}}",
"{{count}} months ago": "{{count}} месяцев назад",
"{{count}} override": "{{count}} переопределений",
+ "{{count}} plans available": "Доступно планов: {{count}}",
"{{count}} selected targets available for bulk copy.": "Для массового копирования выбрано целей: {{count}}.",
"{{count}} tiers": "{{count}} уровней",
"{{count}} Uptime Kuma groups will be removed from the list.": "{{count}} групп Uptime Kuma будут удалены из списка.",
@@ -63,6 +65,7 @@
"{{modality}} not supported": "{{modality}} не поддерживается",
"{{modality}} supported": "{{modality}} поддерживается",
"{{n}} model(s) selected": "Выбрано моделей: {{n}}",
+ "{{plan}} Token capacity": "Лимит Token для {{plan}}",
"{{processed}} of {{total}} log entries processed.": "Обработано {{processed}} из {{total}} записей журнала.",
"{{success}} succeeded, {{failed}} failed": "{{success}} успешно, {{failed}} с ошибкой",
"{{target}} test failed": "Тест {{target}} не выполнен",
@@ -118,6 +121,12 @@
"80,443,8080": "80,443,8080",
"A billing multiplier. Lower ratios mean lower API call costs.": "Множитель тарификации. Чем ниже коэффициент, тем ниже стоимость вызовов API.",
"A focused home for keys, balance, routing, and service health.": "Единый экран для ключей, баланса, маршрутов и состояния сервиса.",
+ "A high-capacity credit plan for heavy API usage.": "Высокоемкий план кредитов для интенсивного использования API.",
+ "A higher weekly allowance for demanding workflows.": "Повышенный недельный лимит для требовательных рабочих процессов.",
+ "A larger monthly allowance for frequent professional use.": "Более крупный ежемесячный лимит для частого профессионального использования.",
+ "A one-time low-cost trial for testing core models.": "Одноразовый недорогой пробный доступ для тестирования основных моделей.",
+ "A predictable weekly budget for light, consistent usage.": "Предсказуемый недельный бюджет для легкого и регулярного использования.",
+ "A small credit pack for light, short-term usage.": "Небольшой пакет кредитов для легкого краткосрочного использования.",
"About": "О проекте",
"About {{days}} days left": "Примерно {{days}} дней",
"Accept Unpriced Models": "Принимать модели без цены",
@@ -680,6 +689,7 @@
"Cache Directory Disk Space": "Дисковое пространство каталога кэша",
"Cache Directory Info": "Информация о каталоге кэша",
"Cache Entries": "Записи кэша",
+ "Cache Hit": "Попадание в кэш",
"Cache mode": "Режим кэша",
"Cache pricing": "Цены кэша",
"Cache ratio": "Коэффициент кэша",
@@ -792,6 +802,7 @@
"checkout.session.completed": "checkout.session.completed",
"checkout.session.expired": "checkout.session.expired",
"Chinese": "Китайский",
+ "Choose a plan and estimate model usage": "Выберите план и оцените использование моделей",
"Choose a username": "Выберите имя пользователя",
"Choose an amount and payment method": "Выберите сумму и способ оплаты",
"Choose between default expanded, compact icon-only, or full layout mode": "Выберите между развернутым по умолчанию, компактным (только иконки) или полным режимом макета",
@@ -930,6 +941,7 @@
"Compliance confirmed": "Соответствие подтверждено",
"Compliance confirmed successfully": "Соответствие успешно подтверждено",
"Concatenate channel system prompt with user's prompt": "Объединить системный промпт канала с промптом пользователя",
+ "Concurrency & Cache Hit Rate": "Параллельность и попадания в кэш",
"Condition Path": "Путь условия",
"Condition Settings": "Настройки условия",
"Condition Value": "Значение условия",
@@ -1022,6 +1034,7 @@
"Console Content": "Содержимое консоли",
"Consume": "Расход",
"Consumed in the last 24 hours": "Потреблено за последние 24 часа",
+ "Contact Us": "Связаться с нами",
"Container": "Контейнер",
"Container name": "Имя контейнера",
"Containers": "Контейнеры",
@@ -1164,7 +1177,12 @@
"Credentials": "Учетные данные",
"Credentials verification failed": "Не удалось проверить учетные данные",
"Credentials verification failed — double-check Merchant ID and API private key.": "Не удалось проверить учетные данные — проверьте Merchant ID и приватный ключ API.",
+ "Credit Business": "Бизнес-кредиты",
+ "Credit Plans": "Пакеты кредитов",
+ "Credit Power": "Мощные кредиты",
+ "Credit Pro": "Профессиональные кредиты",
"Credit remaining": "Остаток средств",
+ "Credit Starter": "Стартовые кредиты",
"Creem API key (leave blank unless updating)": "Ключ API Creem (оставьте пустым, если не обновляете)",
"Creem Gateway": "Шлюз Creem",
"Creem Payment": "Платеж Creem",
@@ -1250,6 +1268,7 @@
"Default API version for this channel": "Версия API по умолчанию для этого канала",
"Default Bearer": "Bearer по умолчанию",
"Default Collapse Sidebar": "Сворачивать боковую панель по умолчанию",
+ "Default concurrency is 500, with cache hit rate around 90%.": "Параллельность по умолчанию: 500, доля попаданий в кэш около 90 %.",
"Default consumption chart": "График потребления по умолчанию",
"Default Max Tokens": "Максимальное количество токенов по умолчанию",
"Default model call chart": "График вызовов моделей по умолчанию",
@@ -1352,6 +1371,7 @@
"Detected high-risk status code redirect rules": "Обнаружены следующие правила перенаправления кодов состояния высокого риска:",
"Detection complete: {{add}} to add, {{remove}} to remove": "Обнаружение завершено: {{add}} для добавления, {{remove}} для удаления",
"Detection failed": "Обнаружение не удалось",
+ "Detection Results Are Not 100%": "Результаты проверки не на 100 %",
"Determines how this group is applied elsewhere.": "Определяет, как эта группа применяется в других местах.",
"Deterministic sampling seed (best-effort)": "Сид детерминированного сэмплирования (по возможности)",
"Developer Friendly": "Удобно для разработчиков",
@@ -1359,6 +1379,8 @@
"Dify": "Dify",
"Dify channels only support chatflow and agent, and agent does not support images": "Каналы Dify поддерживают только chatflow и agent, а agent не поддерживает изображения",
"Digest:": "Дайджест:",
+ "Direct access to official providers": "Прямое подключение к официальным провайдерам",
+ "Direct official access": "Прямой доступ к официальным сервисам",
"Direction": "Направление",
"Directory File Count": "Файлов в каталоге",
"Directory Total Size": "Общий размер каталога",
@@ -1384,6 +1406,7 @@
"Discord": "Discord",
"Discount": "Скидка",
"Discount map by recharge amount (JSON object)": "Карта скидок по сумме пополнения (объект JSON)",
+ "Discount Plans": "Планы со скидкой",
"Discount Rate": "Ставка скидки",
"Discount rate must be ≤ 1": "Ставка скидки должна быть ≤ 1",
"Discount rate must be greater than 0": "Ставка скидки должна быть больше 0",
@@ -1451,6 +1474,7 @@
"Duration Settings": "Настройки срока действия",
"Duration Unit": "Единица срока",
"Duration Value": "Значение срока",
+ "Dynamic pricing": "Динамическая тарификация",
"Dynamic Pricing": "Динамическое ценообразование",
"e.g. ¥ or HK$": "напр. ¥ или HK$",
"e.g. 401, 403, 429, 500-599": "напр. 401, 403, 429, 500-599",
@@ -1686,6 +1710,7 @@
"Enter your username": "Введите ваше имя пользователя",
"Enter your username or email": "Введите ваше имя пользователя или адрес электронной почты",
"Enterprise Account": "Корпоративная учетная запись",
+ "Enterprise-grade API gateway": "API-шлюз корпоративного уровня",
"Enterprise-grade security with comprehensive permission management": "Безопасность корпоративного уровня с комплексным управлением разрешениями",
"Entrypoint (space separated)": "Точка входа (через пробелы)",
"Env (JSON object)": "Env (объект JSON)",
@@ -1709,6 +1734,7 @@
"Error Type (optional)": "Тип ошибки (необязательно)",
"Estimated cost": "Примерная стоимость",
"Estimated quota cost": "Ориентир стоимости квоты",
+ "Estimates assume the selected model is used exclusively. Actual usage may vary with cache, tools, media, or dynamic pricing.": "Расчёт предполагает использование только выбранной модели. Фактический расход зависит от кэша, инструментов, медиа и динамической тарификации.",
"Every group name in the pricing table can be used in two places: on a user (the user group, assigned by admins) and on a token (the token group, chosen when creating the token). Same name pool, two different jobs.": "Каждое имя группы из таблицы тарифов используется в двух местах: у пользователя (группа пользователя, назначается администратором) и у токена (группа токена, выбирается при создании). Один набор имён — две разные роли.",
"Everything configured for this group, in one place.": "Все настройки этой группы в одном месте.",
"Exact": "Точное",
@@ -1981,6 +2007,7 @@
"Fixed price": "Фиксированная цена",
"Fixed price (USD)": "Фиксированная цена (USD)",
"Fixed request price": "Фиксированная цена запроса",
+ "Flexible monthly credits for occasional users.": "Гибкие ежемесячные кредиты для редкого использования.",
"Floating": "Плавающая",
"Flow": "Поток",
"Flow Filters": "Фильтры потока",
@@ -2070,6 +2097,7 @@
"Generation was interrupted": "Генерация была прервана",
"Generic cache": "Общий кэш",
"Get advice": "Получить совет",
+ "Get API Key": "Получить API-ключ",
"Get notified when balance falls below this value": "Получать уведомления, когда баланс опускается ниже этого значения",
"Get one here": "Получить здесь",
"Get started": "Начало работы",
@@ -2244,10 +2272,12 @@
"Ignore": "Игнорировать",
"Ignored upstream models": "Игнорируемые upstream-модели",
"Image": "Изображение",
+ "Image API URL": "URL API для изображений",
"Image Generation": "Генерация изображений",
"Image In": "Вход изображения",
"Image input": "Ввод изображения",
"Image input price": "Цена входного изображения",
+ "Image Models": "Модели изображений",
"Image not available": "Изображение недоступно",
"Image Out": "Выход изображения",
"Image output price": "Цена выходного изображения",
@@ -2255,6 +2285,7 @@
"Image ratio": "Коэффициент изображения",
"Image to Video": "Изображение в видео",
"Image Tokens": "Токены изображений",
+ "Image Type": "Тип изображения",
"Imagine the pricing table has three groups: default (ratio 1.0), premium (ratio 0.5), and vip (ratio 0.8). Users whose account is in the vip group get user-level perks, and premium is a cheaper channel pool that users can pick for their tokens.": "Представьте, что в таблице тарифов три группы: default (коэффициент 1,0), premium (коэффициент 0,5) и vip (коэффициент 0,8). Пользователи из группы vip получают привилегии на уровне аккаунта, а premium — более дешёвый пул каналов, который пользователи могут выбирать для своих токенов.",
"Import to CC Switch": "Импорт в CC Switch",
"Important": "Важно",
@@ -2286,6 +2317,7 @@
"Initializing…": "Инициализация…",
"Inpaint": "Инпейнтинг",
"Input": "Ввод",
+ "Input (1M)": "Ввод (1M)",
"Input mode": "Режим ввода",
"Input price": "Цена входа",
"Input price is required before saving dependent prices.": "Перед сохранением зависимых цен укажите входную цену.",
@@ -2556,10 +2588,14 @@
"Maximum 200 characters": "Максимум 200 символов",
"Maximum 500 characters. Supports Markdown and HTML.": "Максимум 500 символов. Поддерживает Markdown и HTML.",
"Maximum check-in quota": "Максимальная квота регистрации",
+ "Maximum input Tokens": "Максимум входных Token",
"Maximum input window": "Максимальное окно ввода",
"Maximum number of tokens each user can create. Default 1000. Setting too large may affect performance.": "Максимальное количество токенов, которое может создать каждый пользователь. По умолчанию 1000. Слишком большое значение может повлиять на производительность.",
"Maximum number of tokens in the response": "Максимальное число токенов в ответе",
+ "Maximum output Tokens": "Максимум выходных Token",
"Maximum quota amount awarded for check-in": "Максимальная сумма квоты, присуждаемая за регистрацию",
+ "Maximum standalone usage across the full plan validity period.": "Максимальный объём отдельного использования за весь срок действия плана.",
+ "Maximum standalone usage within each {{period}} reset period.": "Максимальный объём отдельного использования за каждый период сброса {{period}}.",
"Maximum tokens including hidden reasoning tokens": "Максимум токенов с учётом скрытых reasoning-токенов",
"Maximum tokens per response": "Максимум токенов на ответ",
"Maximum tokens per user": "Максимальное количество токенов на пользователя",
@@ -2579,9 +2615,12 @@
"min downtime": "мин простоя",
"Min Top-up": "Мин. пополнение",
"Min Top-up:": "Мин. пополнение:",
+ "Mini": "Мини",
"MiniMax": "MiniMax",
"Minimum check-in quota": "Минимальная квота регистрации",
+ "Minimum Input (1M)": "Минимальный ввод (1M)",
"Minimum LinuxDO trust level required": "Требуемый минимальный уровень доверия LinuxDO",
+ "Minimum Output (1M)": "Минимальный вывод (1M)",
"Minimum quota amount awarded for check-in": "Минимальная сумма квоты, присуждаемая за регистрацию",
"Minimum recharge amount in USD": "Минимальная сумма пополнения в USD",
"Minimum recharge amount to qualify for this discount.": "Минимальная сумма пополнения для получения этой скидки.",
@@ -2612,6 +2651,7 @@
"Model Analytics": "Аналитика моделей",
"Model Analytics Defaults": "Настройки аналитики моделей по умолчанию",
"Model Analytics Filters": "Фильтры аналитики моделей",
+ "Model Authenticity": "Аутентичность моделей",
"model billing support": "поддержка биллинга моделей",
"Model Call Analytics": "Аналитика вызовов моделей",
"Model context usage": "Использование контекста модели",
@@ -2642,6 +2682,7 @@
"Model not found": "Модель не найдена",
"Model performance metrics": "Метрики производительности моделей",
"Model Price": "Цена модели",
+ "Model Price Comparison": "Сравнение цен моделей",
"Model price is not configured. Please complete model pricing in settings.": "Цена модели не настроена. Заполните тарификацию модели в настройках.",
"Model Price Not Configured": "Цена модели не настроена",
"Model prices": "Цены моделей",
@@ -2654,7 +2695,7 @@
"Model Regex": "Регулярное выражение модели",
"Model Regex (one per line)": "Регулярное выражение модели (по одному на строку)",
"Model selected": "Модель выбрана",
- "Model Square": "Витрина моделей",
+ "Model Square": "Цены на модели",
"Model Tags": "Теги моделей",
"Model to use for testing": "Модель для использования при тестировании",
"Model to use when testing channel connectivity": "Модель для использования при тестировании подключения канала",
@@ -2696,7 +2737,9 @@
"months": "месяцев",
"Moonshot": "Moonshot",
"More": "Ещё",
+ "More affordable routes are available. For stable access, replace BaseUrl with:": "Доступны более выгодные маршруты. Для стабильного доступа замените BaseUrl на:",
"More Apps": "Еще",
+ "More credits for regular chat, coding, and daily use.": "Больше кредитов для чатов, разработки и ежедневного использования.",
"more mapping": "больше сопоставлений",
"More templates...": "Другие шаблоны…",
"More than 999 days left": "Более 999 дней",
@@ -2865,6 +2908,7 @@
"No matching token and channel usage was found.": "Подходящее использование токенов и каналов не найдено.",
"No messages yet": "Сообщений пока нет",
"No missing models found.": "Недостающие модели не найдены.",
+ "No model downgrades or substitutions": "Без понижения уровня и подмены моделей",
"No model found.": "Модель не найдена.",
"No model mappings configured. Click \"Add Mapping\" to get started.": "Не настроены сопоставления моделей. Нажмите \"Добавить сопоставление\", чтобы начать.",
"No model price changes to save": "Нет изменений цен моделей для сохранения",
@@ -2901,6 +2945,7 @@
"No preference": "Без предпочтений",
"No prefill groups yet": "Пока нет групп предзаполнения",
"No price differences found": "Различий в ценах не найдено",
+ "No pricing data available": "Нет данных о ценах",
"No processable upstream model updates for this channel": "Нет обрабатываемых обновлений моделей для этого канала",
"No products configured. Click \"Add product\" to get started.": "Продукты не настроены. Нажмите \"Добавить продукт\", чтобы начать.",
"No products match your search": "Нет продуктов, соответствующих вашему поиску",
@@ -3006,12 +3051,14 @@
"Official documentation": "Официальная документация",
"Official Gemini from OpenAI Chat": "Официальный Gemini из OpenAI Chat",
"Official Gemini Native": "Официальный Gemini Native",
+ "Official Input / Output (1M)": "Официальный ввод / вывод (1M)",
"Official OpenAI Chat": "Официальный OpenAI Chat",
"Official OpenAI Embeddings": "Официальные OpenAI Embeddings",
"Official OpenAI Images": "Официальные OpenAI Images",
"Official OpenAI Responses": "Официальный OpenAI Responses",
"Official Repository": "Официальный репозиторий",
"Official Sync": "Официальная синхронизация",
+ "Officially funded accounts": "Официально пополненные аккаунты",
"OhMyGPT": "OhMyGPT",
"OIDC": "OIDC",
"OIDC Client ID": "ID клиента OIDC",
@@ -3125,6 +3172,7 @@
"Other users": "Другие пользователи",
"Outage": "Простой",
"Output": "Вывод",
+ "Output (1M)": "Вывод (1M)",
"Output aspect ratio": "Соотношение сторон",
"Output image size": "Размер выходного изображения",
"Output price": "Цена выхода",
@@ -3274,6 +3322,7 @@
"Performance Settings": "Настройки производительности",
"Performed {{action}} on user {{username}} (ID: {{id}})": "Выполнено действие {{action}} над пользователем {{username}} (ID: {{id}})",
"Period": "Период",
+ "Period Quota": "Квота за период",
"Periodically check for upstream model changes": "Периодически проверять изменения моделей провайдера",
"Periodically send ping frames to keep streaming connections active.": "Периодически отправлять пинг-кадры для поддержания активности потоковых соединений.",
"Permanently delete your account and all data": "Безвозвратно удалить ваш аккаунт и все данные",
@@ -3340,6 +3389,7 @@
"Please fix JSON errors before saving": "Исправьте ошибки JSON перед сохранением",
"Please fix the highlighted fields before saving": "Исправьте выделенные поля перед сохранением",
"Please log in with the appropriate credentials": "Пожалуйста, войдите с соответствующими учетными данными",
+ "Please refresh the page and try again.": "Обновите страницу и повторите попытку.",
"Please select a container": "Пожалуйста, выберите контейнер",
"Please select a payment method": "Пожалуйста, выберите способ оплаты",
"Please select a primary model": "Пожалуйста, выберите основную модель",
@@ -3439,6 +3489,7 @@
"Pricing mode": "Режим ценообразования",
"Pricing Ratios": "Коэффициенты ценообразования",
"Pricing Type": "Тип ценообразования",
+ "Pricing unavailable": "Цена недоступна",
"Primary Model": "Основная модель",
"Prioritize reusing the last successful channel based on keys extracted from request context (sticky routing)": "Приоритет повторного использования последнего успешного канала на основе ключей из контекста запроса (липкая маршрутизация)",
"Priority": "Приоритет",
@@ -3765,6 +3816,7 @@
"Reset Passkey for {{username}}? The user will need to register a new Passkey before using passwordless login.": "Сбросить Passkey для {{username}}? Пользователю нужно будет зарегистрировать новый Passkey перед входом без пароля.",
"Reset password": "Сбросить пароль",
"Reset Period": "Период сброса",
+ "Reset Plans": "Планы со сбросом",
"Reset prices": "Сбросить цены",
"Reset quota": "Сбросить квоту",
"Reset ratios": "Сбросить соотношения",
@@ -3953,6 +4005,8 @@
"Select a group": "Выбрать группу",
"Select a group type": "Выбрать тип группы",
"Select a model to edit pricing": "Выберите модель для редактирования тарифа",
+ "Select a plan": "Выберите план",
+ "Select a plan to see the maximum standalone input or output Token capacity for each model.": "Выберите план, чтобы увидеть максимум входных или выходных Token при отдельном использовании каждой модели.",
"Select a preset...": "Выберите предустановку...",
"Select a product": "Выберите продукт",
"Select a role": "Выбрать роль",
@@ -4095,6 +4149,8 @@
"Show": "Показать",
"Show All": "Показать все",
"Show all providers including unbound": "Показать всех провайдеров (включая непривязанные)",
+ "Show Less": "Свернуть",
+ "Show More": "Показать больше",
"Show only bound providers": "Показать только привязанных провайдеров",
"Show or hide flow columns": "Показать или скрыть столбцы потока",
"Show preview": "Показать предпросмотр",
@@ -4175,6 +4231,7 @@
"SQLite stores all data in a single file. Make sure that file is persisted when running in containers.": "SQLite хранит все данные в одном файле. Убедитесь, что файл сохраняется при работе в контейнерах.",
"SSL/TLS": "SSL/TLS",
"SSRF Protection": "Защита от SSRF",
+ "Stable high concurrency": "Стабильная высокая параллельность",
"stale": "устарел",
"Standard": "Стандартный",
"Standard price": "Стандартная цена",
@@ -4182,6 +4239,7 @@
"Start a conversation to see messages here": "Начните разговор, чтобы увидеть сообщения здесь",
"Start a playground chat": "Начните чат в Playground",
"Start collecting payments globally without registering a company. Built for indie developers, OPC sole proprietorships, and startups. Waffo Pancake acts as your Merchant of Record, taking on the compliance burden of global payment collection — consumption tax, invoicing, subscription management, refunds, and chargebacks. Solo developers can launch fast and stay focused on product instead of compliance. Onboard in minutes — one prompt to a full integration.": "Начните принимать платежи по всему миру без регистрации компании. Подходит для независимых разработчиков, индивидуальных предпринимателей OPC и стартапов. Waffo Pancake выступает как Merchant of Record и берет на себя комплаенс глобального приема платежей: потребительские налоги, выставление счетов, управление подписками, возвраты и чарджбеки. Одиночные разработчики могут быстро запуститься и сосредоточиться на продукте, а не на комплаенсе. Подключение за минуты — от одного запроса до полной интеграции.",
+ "Start for Free": "Начать бесплатно",
"Start for free with generous limits. No credit card required.": "Начните бесплатно с щедрыми лимитами. Кредитная карта не требуется.",
"Start Time": "Время начала",
"Started": "Запущен",
@@ -4520,6 +4578,7 @@
"Timing": "Время",
"Tip": "Совет",
"to access this resource.": "для доступа к этому ресурсу.",
+ "To avoid account bans, we add simulated prompt words in the requests, which may result in the score not reaching 100%.": "Чтобы избежать блокировки аккаунтов, мы добавляем в запросы имитированные подсказки, поэтому оценка может быть ниже 100 %.",
"to confirm": "для подтверждения",
"To Lower": "В нижний регистр",
"To Lowercase": "В нижний регистр",
@@ -4636,6 +4695,7 @@
"Trend": "Тренд",
"Trending down": "Падают",
"Trending up": "Растут",
+ "Trial": "Пробный",
"Triggered garbage collection": "Запущена сборка мусора",
"Trim leading/trailing whitespace": "Удалить пробелы в начале/конце",
"Trim Prefix": "Обрезать префикс",
@@ -4674,6 +4734,7 @@
"Unable to load groups": "Не удалось загрузить группы",
"Unable to load rankings": "Не удалось загрузить рейтинги",
"Unable to load rankings data": "Не удалось загрузить данные рейтингов",
+ "Unable to load subscription plans": "Не удалось загрузить планы подписки",
"Unable to open chat": "Не удалось открыть чат",
"Unable to parse structured pricing": "Не удалось разобрать структурированные цены",
"Unable to prepare chat link. Please ensure you have an enabled API key.": "Не удается подготовить ссылку для чата. Убедитесь, что у вас есть активированный API-ключ.",
@@ -4987,6 +5048,7 @@
"We could not load instances.": "Не удалось загрузить экземпляры.",
"We could not load system tasks.": "Не удалось загрузить системные задачи.",
"We could not load the setup status.": "Не удалось загрузить статус настройки.",
+ "We provide 100% official full-performance models. Requests are routed directly to the official address via the official client channel. If certain detection items (such as forced structured output) show as unsupported, this is because the channel itself does not support that capability — not because the model has been replaced or downgraded.": "Мы предоставляем 100% официальные модели с полной производительностью. Запросы направляются напрямую на официальный адрес через официальный клиентский канал. Если некоторые проверки, например принудительный структурированный вывод, показывают отсутствие поддержки, это связано с ограничениями самого канала, а не с заменой или ухудшением модели.",
"We will prompt your device to confirm using biometrics or your hardware key.": "Мы предложим вашему устройству подтвердить действие с помощью биометрии или аппаратного ключа.",
"We'll be back online shortly.": "Мы скоро вернемся в сеть.",
"Web search": "Веб-поиск",
@@ -5012,6 +5074,10 @@
"Week": "Неделя",
"Weekday": "День недели",
"Weekly": "Еженедельно",
+ "Weekly Business": "Недельный Бизнес",
+ "Weekly credits for regular users with a controlled budget.": "Недельные кредиты для регулярных пользователей с контролируемым бюджетом.",
+ "Weekly Pro": "Недельный Pro",
+ "Weekly Starter": "Недельный старт",
"Weekly token usage by model across the past few weeks": "Еженедельное использование токенов по моделям за последние недели",
"Weekly token usage by model across the past year": "Еженедельное использование токенов по моделям за последний год",
"Weekly token usage by model since launch": "Еженедельное использование токенов по моделям с момента запуска",
diff --git a/web/default/src/i18n/locales/vi.json b/web/default/src/i18n/locales/vi.json
index 2d062b7dfa33..a449fc43df74 100644
--- a/web/default/src/i18n/locales/vi.json
+++ b/web/default/src/i18n/locales/vi.json
@@ -28,6 +28,7 @@
"[{\"ChatGPT\":\"https://chat.openai.com\"},{\"Lobe Chat\":\"https://chat-preview.lobehub.com/?settings={...}\"}]": "[{\"ChatGPT\":\"https://chat.openai.com\"},{\"Lobe Chat\":\"https://chat-preview.lobehub.com/?settings={...}\"}]",
"[{\"name\":\"支付宝\",\"type\":\"alipay\",\"color\":\"#1677FF\"}]": "[{\"name\":\"Alipay\",\"type\":\"alipay\",\"color\":\"#1677FF\"}]",
"[{\"name\":\"支付宝\",\"type\":\"alipay\",\"icon\":\"SiAlipay\"}]": "[{\"name\":\"Alipay\",\"type\":\"alipay\",\"icon\":\"SiAlipay\"}]",
+ "[Telegram group](https://t.me/+36iGYj-hkkFkOWRl)": "[Nhóm Telegram](https://t.me/+36iGYj-hkkFkOWRl)",
"{\"original-model\": \"replacement-model\"}": "{\"original-model\": \"replacement-model\"}",
"{{category}} Models": "Mô hình {{category}}",
"{{completed}}/{{total}} completed": "Đã hoàn tất {{completed}}/{{total}}",
@@ -52,6 +53,7 @@
"{{count}} models": "{{count}} mô hình",
"{{count}} months ago": "{{count}} tháng trước",
"{{count}} override": "{{count}} ghi đè",
+ "{{count}} plans available": "Có {{count}} gói",
"{{count}} selected targets available for bulk copy.": "Có {{count}} mục tiêu đã chọn để sao chép hàng loạt.",
"{{count}} tiers": "{{count}} bậc",
"{{count}} Uptime Kuma groups will be removed from the list.": "{{count}} nhóm Uptime Kuma sẽ bị xóa khỏi danh sách.",
@@ -63,6 +65,7 @@
"{{modality}} not supported": "Không hỗ trợ {{modality}}",
"{{modality}} supported": "Hỗ trợ {{modality}}",
"{{n}} model(s) selected": "Đã chọn {{n}} model",
+ "{{plan}} Token capacity": "Dung lượng Token của {{plan}}",
"{{processed}} of {{total}} log entries processed.": "Đã xử lý {{processed}}/{{total}} mục nhật ký.",
"{{success}} succeeded, {{failed}} failed": "{{success}} thành công, {{failed}} thất bại",
"{{target}} test failed": "Kiểm tra {{target}} thất bại",
@@ -118,6 +121,12 @@
"80,443,8080": "80,443,8080",
"A billing multiplier. Lower ratios mean lower API call costs.": "Hệ số tính phí. Tỷ lệ càng thấp thì chi phí gọi API càng thấp.",
"A focused home for keys, balance, routing, and service health.": "Trang tổng quan tập trung cho khóa, số dư, định tuyến và trạng thái dịch vụ.",
+ "A high-capacity credit plan for heavy API usage.": "Gói tín dụng dung lượng cao cho nhu cầu sử dụng API lớn.",
+ "A higher weekly allowance for demanding workflows.": "Hạn mức hằng tuần cao hơn cho các quy trình công việc đòi hỏi cao.",
+ "A larger monthly allowance for frequent professional use.": "Hạn mức hàng tháng lớn hơn cho nhu cầu chuyên nghiệp thường xuyên.",
+ "A one-time low-cost trial for testing core models.": "Gói dùng thử một lần, chi phí thấp để kiểm tra các mô hình cốt lõi.",
+ "A predictable weekly budget for light, consistent usage.": "Ngân sách hằng tuần dễ dự đoán cho nhu cầu sử dụng nhẹ và ổn định.",
+ "A small credit pack for light, short-term usage.": "Gói tín dụng nhỏ cho nhu cầu sử dụng nhẹ, ngắn hạn.",
"About": "Giới thiệu",
"About {{days}} days left": "Còn khoảng {{days}} ngày",
"Accept Unpriced Models": "Chấp nhận các Mô hình chưa định giá",
@@ -680,6 +689,7 @@
"Cache Directory Disk Space": "Dung lượng đĩa thư mục bộ nhớ đệm",
"Cache Directory Info": "Thông tin thư mục bộ nhớ đệm",
"Cache Entries": "Mục bộ nhớ đệm",
+ "Cache Hit": "Trúng bộ nhớ đệm",
"Cache mode": "Chế độ bộ đệm",
"Cache pricing": "Giá bộ nhớ đệm",
"Cache ratio": "Tỷ lệ bộ nhớ đệm",
@@ -792,6 +802,7 @@
"checkout.session.completed": "thanh toán.phiên.hoàn thành",
"checkout.session.expired": "Phiên thanh toán đã hết hạn.",
"Chinese": "Tiếng Trung",
+ "Choose a plan and estimate model usage": "Chọn gói và ước tính mức dùng mô hình",
"Choose a username": "Chọn tên người dùng",
"Choose an amount and payment method": "Chọn số tiền và phương thức thanh toán",
"Choose between default expanded, compact icon-only, or full layout mode": "Chọn giữa chế độ mở rộng mặc định, chế độ chỉ biểu tượng thu gọn, hoặc chế độ bố cục đầy đủ",
@@ -930,6 +941,7 @@
"Compliance confirmed": "Đã xác nhận tuân thủ",
"Compliance confirmed successfully": "Xác nhận tuân thủ thành công",
"Concatenate channel system prompt with user's prompt": "Nối lời nhắc hệ thống kênh với lời nhắc của người dùng",
+ "Concurrency & Cache Hit Rate": "Đồng thời và tỷ lệ trúng bộ nhớ đệm",
"Condition Path": "Đường dẫn điều kiện",
"Condition Settings": "Cài đặt điều kiện",
"Condition Value": "Giá trị điều kiện",
@@ -1022,6 +1034,7 @@
"Console Content": "Nội dung bảng điều khiển",
"Consume": "Tiêu thụ",
"Consumed in the last 24 hours": "Đã tiêu thụ trong 24 giờ qua",
+ "Contact Us": "Liên hệ",
"Container": "Thùng chứa",
"Container name": "Tên container",
"Containers": "Các thùng chứa",
@@ -1164,7 +1177,12 @@
"Credentials": "Thông tin xác thực",
"Credentials verification failed": "Xác minh thông tin xác thực thất bại",
"Credentials verification failed — double-check Merchant ID and API private key.": "Xác minh thông tin xác thực thất bại — hãy kiểm tra lại Merchant ID và khóa riêng API.",
+ "Credit Business": "Gói tín dụng Doanh nghiệp",
+ "Credit Plans": "Gói tín dụng",
+ "Credit Power": "Gói tín dụng Cao cấp",
+ "Credit Pro": "Gói tín dụng Pro",
"Credit remaining": "Tín dụng còn lại",
+ "Credit Starter": "Gói tín dụng Khởi đầu",
"Creem API key (leave blank unless updating)": "Khóa API Creem (để trống trừ khi cập nhật)",
"Creem Gateway": "Cổng Creem",
"Creem Payment": "Thanh toán Creem",
@@ -1250,6 +1268,7 @@
"Default API version for this channel": "Phiên bản API mặc định cho kênh này",
"Default Bearer": "Bearer mặc định",
"Default Collapse Sidebar": "Mặc định Thu gọn Thanh bên",
+ "Default concurrency is 500, with cache hit rate around 90%.": "Mức đồng thời mặc định là 500, tỷ lệ trúng bộ nhớ đệm khoảng 90%.",
"Default consumption chart": "Biểu đồ tiêu thụ mặc định",
"Default Max Tokens": "Tokens Tối đa Mặc định",
"Default model call chart": "Biểu đồ lượt gọi mô hình mặc định",
@@ -1352,6 +1371,7 @@
"Detected high-risk status code redirect rules": "Phát hiện các quy tắc chuyển hướng mã trạng thái rủi ro cao sau:",
"Detection complete: {{add}} to add, {{remove}} to remove": "Phát hiện hoàn tất: {{add}} để thêm, {{remove}} để xóa",
"Detection failed": "Phát hiện thất bại",
+ "Detection Results Are Not 100%": "Kết quả kiểm tra không đạt 100%",
"Determines how this group is applied elsewhere.": "Xác định cách nhóm này được áp dụng ở nơi khác.",
"Deterministic sampling seed (best-effort)": "Hạt giống lấy mẫu xác định (cố gắng tốt nhất)",
"Developer Friendly": "Thân thiện với nhà phát triển",
@@ -1359,6 +1379,8 @@
"Dify": "Dify",
"Dify channels only support chatflow and agent, and agent does not support images": "Kênh Dify chỉ hỗ trợ chatflow và agent, và agent không hỗ trợ hình ảnh",
"Digest:": "Tóm tắt:",
+ "Direct access to official providers": "Kết nối trực tiếp nhà cung cấp chính thức",
+ "Direct official access": "Kết nối trực tiếp dịch vụ chính thức",
"Direction": "Hướng",
"Directory File Count": "Số tệp trong thư mục",
"Directory Total Size": "Tổng dung lượng thư mục",
@@ -1384,6 +1406,7 @@
"Discord": "Discord",
"Discount": "Giảm giá",
"Discount map by recharge amount (JSON object)": "Ánh xạ giảm giá theo số tiền nạp (đối tượng JSON)",
+ "Discount Plans": "Gói ưu đãi",
"Discount Rate": "Tỷ lệ chiết khấu",
"Discount rate must be ≤ 1": "Tỷ lệ giảm giá phải ≤ 1",
"Discount rate must be greater than 0": "Tỷ lệ giảm giá phải lớn hơn 0",
@@ -1451,6 +1474,7 @@
"Duration Settings": "Cài đặt thời lượng",
"Duration Unit": "Đơn vị thời lượng",
"Duration Value": "Giá trị thời lượng",
+ "Dynamic pricing": "Giá động",
"Dynamic Pricing": "Giá linh hoạt",
"e.g. ¥ or HK$": "ví dụ ¥ hoặc HK$",
"e.g. 401, 403, 429, 500-599": "vd. 401, 403, 429, 500-599",
@@ -1686,6 +1710,7 @@
"Enter your username": "Nhập tên đăng nhập của bạn",
"Enter your username or email": "Nhập tên đăng nhập hoặc email của bạn",
"Enterprise Account": "Business account",
+ "Enterprise-grade API gateway": "Cổng API cấp doanh nghiệp",
"Enterprise-grade security with comprehensive permission management": "Bảo mật cấp doanh nghiệp với quản lý quyền toàn diện",
"Entrypoint (space separated)": "Entrypoint (cách nhau bằng dấu cách)",
"Env (JSON object)": "Env (đối tượng JSON)",
@@ -1709,6 +1734,7 @@
"Error Type (optional)": "Loại lỗi (tùy chọn)",
"Estimated cost": "Chi phí ước tính",
"Estimated quota cost": "Ước tính chi phí hạn mức",
+ "Estimates assume the selected model is used exclusively. Actual usage may vary with cache, tools, media, or dynamic pricing.": "Ước tính giả định chỉ dùng mô hình đã chọn. Mức dùng thực tế có thể thay đổi do bộ nhớ đệm, công cụ, phương tiện hoặc giá động.",
"Every group name in the pricing table can be used in two places: on a user (the user group, assigned by admins) and on a token (the token group, chosen when creating the token). Same name pool, two different jobs.": "Mỗi tên nhóm trong bảng định giá có thể dùng ở hai nơi: trên người dùng (nhóm người dùng, do quản trị viên gán) và trên token (nhóm token, chọn khi tạo token). Cùng một bộ tên, hai vai trò khác nhau.",
"Everything configured for this group, in one place.": "Toàn bộ cấu hình của nhóm này, tại một nơi.",
"Exact": "Chính xác",
@@ -1981,6 +2007,7 @@
"Fixed price": "Giá cố định",
"Fixed price (USD)": "Giá cố định (USD)",
"Fixed request price": "Giá cố định theo yêu cầu",
+ "Flexible monthly credits for occasional users.": "Tín dụng hàng tháng linh hoạt cho người dùng thỉnh thoảng.",
"Floating": "Nổi",
"Flow": "Luồng",
"Flow Filters": "Bộ lọc luồng",
@@ -2070,6 +2097,7 @@
"Generation was interrupted": "Quá trình tạo đã bị gián đoạn",
"Generic cache": "Bộ đệm chung",
"Get advice": "Nhận lời khuyên",
+ "Get API Key": "Lấy khóa API",
"Get notified when balance falls below this value": "Nhận thông báo khi số dư giảm xuống dưới giá trị này",
"Get one here": "Nhận tại đây",
"Get started": "Bắt đầu",
@@ -2244,10 +2272,12 @@
"Ignore": "Bỏ qua",
"Ignored upstream models": "Mô hình upstream bị bỏ qua",
"Image": "Hình ảnh",
+ "Image API URL": "URL API tạo ảnh",
"Image Generation": "Tạo hình ảnh",
"Image In": "Ảnh vào",
"Image input": "Đầu vào hình ảnh",
"Image input price": "Giá đầu vào hình ảnh",
+ "Image Models": "Mô hình hình ảnh",
"Image not available": "Hình ảnh không khả dụng",
"Image Out": "Ảnh ra",
"Image output price": "Giá đầu ra hình ảnh",
@@ -2255,6 +2285,7 @@
"Image ratio": "Tỷ lệ hình ảnh",
"Image to Video": "Ảnh sang video",
"Image Tokens": "Token hình ảnh",
+ "Image Type": "Loại hình ảnh",
"Imagine the pricing table has three groups: default (ratio 1.0), premium (ratio 0.5), and vip (ratio 0.8). Users whose account is in the vip group get user-level perks, and premium is a cheaper channel pool that users can pick for their tokens.": "Giả sử bảng định giá có ba nhóm: default (hệ số 1.0), premium (hệ số 0.5) và vip (hệ số 0.8). Người dùng có tài khoản thuộc nhóm vip nhận ưu đãi cấp người dùng, còn premium là một nhóm kênh rẻ hơn mà người dùng có thể chọn cho token của mình.",
"Import to CC Switch": "Nhập vào CC Switch",
"Important": "Quan trọng",
@@ -2286,6 +2317,7 @@
"Initializing…": "Đang khởi tạo…",
"Inpaint": "Inpaint",
"Input": "Đầu vào",
+ "Input (1M)": "Đầu vào (1M)",
"Input mode": "Chế độ nhập",
"Input price": "Giá đầu vào",
"Input price is required before saving dependent prices.": "Cần có giá đầu vào trước khi lưu các giá phụ thuộc.",
@@ -2556,10 +2588,14 @@
"Maximum 200 characters": "Tối đa 200 ký tự",
"Maximum 500 characters. Supports Markdown and HTML.": "Tối đa 500 ký tự. Hỗ trợ Markdown và HTML.",
"Maximum check-in quota": "Hạn ngạch điểm danh tối đa",
+ "Maximum input Tokens": "Token đầu vào tối đa",
"Maximum input window": "Cửa sổ nhập tối đa",
"Maximum number of tokens each user can create. Default 1000. Setting too large may affect performance.": "Số lượng token tối đa mỗi người dùng có thể tạo. Mặc định là 1000. Đặt quá lớn có thể ảnh hưởng đến hiệu suất.",
"Maximum number of tokens in the response": "Số token tối đa trong phản hồi",
+ "Maximum output Tokens": "Token đầu ra tối đa",
"Maximum quota amount awarded for check-in": "Số lượng hạn ngạch tối đa được trao cho điểm danh",
+ "Maximum standalone usage across the full plan validity period.": "Mức dùng riêng tối đa trong toàn bộ thời hạn của gói.",
+ "Maximum standalone usage within each {{period}} reset period.": "Mức dùng riêng tối đa trong mỗi kỳ đặt lại {{period}}.",
"Maximum tokens including hidden reasoning tokens": "Số token tối đa bao gồm token suy luận ẩn",
"Maximum tokens per response": "Số token tối đa mỗi phản hồi",
"Maximum tokens per user": "Số token tối đa trên mỗi người dùng",
@@ -2579,9 +2615,12 @@
"min downtime": "phút gián đoạn",
"Min Top-up": "Nạp tối thiểu",
"Min Top-up:": "Nạp tối thiểu:",
+ "Mini": "Mini",
"MiniMax": "MiniMax",
"Minimum check-in quota": "Hạn ngạch điểm danh tối thiểu",
+ "Minimum Input (1M)": "Đầu vào tối thiểu (1M)",
"Minimum LinuxDO trust level required": "Yêu cầu mức độ tin cậy {{LinuxDO}} tối thiểu",
+ "Minimum Output (1M)": "Đầu ra tối thiểu (1M)",
"Minimum quota amount awarded for check-in": "Số lượng hạn ngạch tối thiểu được trao cho điểm danh",
"Minimum recharge amount in USD": "Số tiền nạp tối thiểu bằng USD",
"Minimum recharge amount to qualify for this discount.": "Số tiền nạp tối thiểu để đủ điều kiện nhận chiết khấu này.",
@@ -2612,6 +2651,7 @@
"Model Analytics": "Phân tích mô hình",
"Model Analytics Defaults": "Mặc định phân tích mô hình",
"Model Analytics Filters": "Bộ lọc phân tích mô hình",
+ "Model Authenticity": "Tính xác thực của mô hình",
"model billing support": "hỗ trợ tính phí mô hình",
"Model Call Analytics": "Phân tích lượt gọi mô hình",
"Model context usage": "Sử dụng ngữ cảnh mô hình",
@@ -2642,6 +2682,7 @@
"Model not found": "Không tìm thấy mô hình",
"Model performance metrics": "Chỉ số hiệu năng mô hình",
"Model Price": "Giá mô hình",
+ "Model Price Comparison": "So sánh giá mô hình",
"Model price is not configured. Please complete model pricing in settings.": "Giá mô hình chưa được cấu hình. Vui lòng hoàn tất định giá mô hình trong cài đặt.",
"Model Price Not Configured": "Giá mô hình chưa được cấu hình",
"Model prices": "Giá mô hình",
@@ -2654,7 +2695,7 @@
"Model Regex": "Regex mô hình",
"Model Regex (one per line)": "Regex mô hình (mỗi dòng một mục)",
"Model selected": "Đã chọn mô hình",
- "Model Square": "Quảng trường mô hình",
+ "Model Square": "Giá mô hình",
"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",
@@ -2696,7 +2737,9 @@
"months": "tháng",
"Moonshot": "Dự án táo bạo",
"More": "Thêm",
+ "More affordable routes are available. For stable access, replace BaseUrl with:": "Có thêm các tuyến giá thấp. Để truy cập ổn định, hãy thay BaseUrl bằng:",
"More Apps": "Thêm",
+ "More credits for regular chat, coding, and daily use.": "Nhiều tín dụng hơn cho trò chuyện, lập trình và sử dụng hằng ngày.",
"more mapping": "thêm lập bản đồ",
"More templates...": "Thêm mẫu...",
"More than 999 days left": "Hơn 999 ngày",
@@ -2865,6 +2908,7 @@
"No matching token and channel usage was found.": "Không tìm thấy mức sử dụng token và kênh phù hợp.",
"No messages yet": "Chưa có tin nhắn",
"No missing models found.": "Không tìm thấy mô hình nào bị thiếu.",
+ "No model downgrades or substitutions": "Không hạ cấp hoặc thay thế mô hình",
"No model found.": "Không tìm thấy mô hình.",
"No model mappings configured. Click \"Add Mapping\" to get started.": "Chưa có ánh xạ mô hình nào được cấu hình. Nhấp vào \"Thêm ánh xạ\" để bắt đầu.",
"No model price changes to save": "Không có thay đổi giá mô hình nào cần lưu",
@@ -2901,6 +2945,7 @@
"No preference": "Không có ưu tiên",
"No prefill groups yet": "Chưa có nhóm điền sẵn nào",
"No price differences found": "Không tìm thấy sự khác biệt về giá",
+ "No pricing data available": "Chưa có dữ liệu giá",
"No processable upstream model updates for this channel": "Không có cập nhật mô hình upstream có thể xử lý cho kênh này",
"No products configured. Click \"Add product\" to get started.": "Chưa cấu hình sản phẩm nào. Nhấp \"Thêm sản phẩm\" để bắt đầu.",
"No products match your search": "Không có sản phẩm nào khớp với tìm kiếm của bạn",
@@ -3006,12 +3051,14 @@
"Official documentation": "Tài liệu chính thức",
"Official Gemini from OpenAI Chat": "Gemini chính thức từ OpenAI Chat",
"Official Gemini Native": "Gemini native chính thức",
+ "Official Input / Output (1M)": "Đầu vào / đầu ra chính thức (1M)",
"Official OpenAI Chat": "OpenAI Chat chính thức",
"Official OpenAI Embeddings": "OpenAI Embeddings chính thức",
"Official OpenAI Images": "OpenAI Images chính thức",
"Official OpenAI Responses": "OpenAI Responses chính thức",
"Official Repository": "Kho lưu trữ chính thức",
"Official Sync": "Official sync",
+ "Officially funded accounts": "Tài khoản được nạp chính thức",
"OhMyGPT": "OhMyGPT",
"OIDC": "OIDC",
"OIDC Client ID": "Mã máy khách OIDC",
@@ -3125,6 +3172,7 @@
"Other users": "Người dùng khác",
"Outage": "Gián đoạn",
"Output": "Đầu ra",
+ "Output (1M)": "Đầu ra (1M)",
"Output aspect ratio": "Tỉ lệ khung hình",
"Output image size": "Kích thước ảnh đầu ra",
"Output price": "Giá đầu ra",
@@ -3274,6 +3322,7 @@
"Performance Settings": "Cài đặt hiệu suất",
"Performed {{action}} on user {{username}} (ID: {{id}})": "Đã thực hiện {{action}} trên người dùng {{username}} (ID: {{id}})",
"Period": "Khoảng thời gian",
+ "Period Quota": "Hạn mức theo kỳ",
"Periodically check for upstream model changes": "Kiểm tra định kỳ các thay đổi mô hình nguồn",
"Periodically send ping frames to keep streaming connections active.": "Định kỳ gửi các khung ping để duy trì các kết nối truyền phát hoạt động.",
"Permanently delete your account and all data": "Xóa vĩnh viễn tài khoản của bạn và tất cả dữ liệu",
@@ -3340,6 +3389,7 @@
"Please fix JSON errors before saving": "Vui lòng sửa lỗi JSON trước khi lưu",
"Please fix the highlighted fields before saving": "Vui lòng sửa các trường được đánh dấu trước khi lưu",
"Please log in with the appropriate credentials": "Vui lòng đăng nhập bằng thông tin xác thực phù hợp",
+ "Please refresh the page and try again.": "Vui lòng tải lại trang và thử lại.",
"Please select a container": "Vui lòng chọn một container",
"Please select a payment method": "Vui lòng chọn phương thức thanh toán",
"Please select a primary model": "Vui lòng chọn một mô hình chính",
@@ -3439,6 +3489,7 @@
"Pricing mode": "Chế độ định giá",
"Pricing Ratios": "Tỷ lệ định giá",
"Pricing Type": "Price type",
+ "Pricing unavailable": "Chưa có giá",
"Primary Model": "Mô hình chính",
"Prioritize reusing the last successful channel based on keys extracted from request context (sticky routing)": "Ưu tiên sử dụng lại kênh thành công gần nhất dựa trên các khóa trích xuất từ ngữ cảnh yêu cầu (định tuyến dính)",
"Priority": "Ưu tiên",
@@ -3765,6 +3816,7 @@
"Reset Passkey for {{username}}? The user will need to register a new Passkey before using passwordless login.": "Đặt lại Passkey cho {{username}}? Người dùng cần đăng ký Passkey mới trước khi dùng đăng nhập không mật khẩu.",
"Reset password": "Đặt lại mật khẩu",
"Reset Period": "Chu kỳ đặt lại",
+ "Reset Plans": "Gói đặt lại",
"Reset prices": "Đặt lại giá",
"Reset quota": "Đặt lại hạn mức",
"Reset ratios": "Đặt lại tỷ lệ",
@@ -3953,6 +4005,8 @@
"Select a group": "Chọn một nhóm",
"Select a group type": "Chọn loại nhóm",
"Select a model to edit pricing": "Chọn mô hình để chỉnh sửa giá",
+ "Select a plan": "Chọn gói",
+ "Select a plan to see the maximum standalone input or output Token capacity for each model.": "Chọn một gói để xem số Token đầu vào hoặc đầu ra tối đa khi chỉ dùng từng mô hình.",
"Select a preset...": "Chọn cấu hình sẵn...",
"Select a product": "Chọn sản phẩm",
"Select a role": "Chọn vai trò",
@@ -4095,6 +4149,8 @@
"Show": "Hiển thị",
"Show All": "Hiển thị tất cả",
"Show all providers including unbound": "Hiển thị tất cả nhà cung cấp (bao gồm chưa liên kết)",
+ "Show Less": "Thu gọn",
+ "Show More": "Hiển thị thêm",
"Show only bound providers": "Chỉ hiển thị nhà cung cấp đã liên kết",
"Show or hide flow columns": "Hiện hoặc ẩn các cột luồng",
"Show preview": "Hiển thị bản xem trước",
@@ -4175,6 +4231,7 @@
"SQLite stores all data in a single file. Make sure that file is persisted when running in containers.": "SQLite lưu trữ tất cả dữ liệu trong một tệp duy nhất. Đảm bảo tệp được lưu trữ lâu dài khi chạy trong container.",
"SSL/TLS": "SSL/TLS",
"SSRF Protection": "Bảo vệ SSRF",
+ "Stable high concurrency": "Xử lý đồng thời cao và ổn định",
"stale": "mất kết nối",
"Standard": "Tiêu chuẩn",
"Standard price": "Giá tiêu chuẩn",
@@ -4182,6 +4239,7 @@
"Start a conversation to see messages here": "Bắt đầu một cuộc trò chuyện để xem tin nhắn tại đây",
"Start a playground chat": "Bắt đầu cuộc trò chuyện trong playground",
"Start collecting payments globally without registering a company. Built for indie developers, OPC sole proprietorships, and startups. Waffo Pancake acts as your Merchant of Record, taking on the compliance burden of global payment collection — consumption tax, invoicing, subscription management, refunds, and chargebacks. Solo developers can launch fast and stay focused on product instead of compliance. Onboard in minutes — one prompt to a full integration.": "Bắt đầu thu thanh toán toàn cầu mà không cần đăng ký công ty. Dành cho lập trình viên độc lập, chủ sở hữu OPC và startup. Waffo Pancake đóng vai trò Merchant of Record, chịu trách nhiệm tuân thủ cho việc thu thanh toán toàn cầu — thuế tiêu dùng, hóa đơn, quản lý đăng ký, hoàn tiền và tranh chấp thanh toán. Lập trình viên cá nhân có thể ra mắt nhanh và tập trung vào sản phẩm thay vì tuân thủ. Onboard trong vài phút — từ một prompt đến tích hợp hoàn chỉnh.",
+ "Start for Free": "Bắt đầu miễn phí",
"Start for free with generous limits. No credit card required.": "Bắt đầu miễn phí với giới hạn hào phóng. Không cần thẻ tín dụng.",
"Start Time": "Thời gian bắt đầu",
"Started": "Đã khởi động",
@@ -4520,6 +4578,7 @@
"Timing": "Thời gian",
"Tip": "Mẹo",
"to access this resource.": "để truy cập tài nguyên này.",
+ "To avoid account bans, we add simulated prompt words in the requests, which may result in the score not reaching 100%.": "Để tránh bị khóa tài khoản, chúng tôi thêm các prompt mô phỏng vào yêu cầu, vì vậy điểm số có thể không đạt 100%.",
"to confirm": "Chờ xác nhận",
"To Lower": "Chữ thường",
"To Lowercase": "Chuyển chữ thường",
@@ -4636,6 +4695,7 @@
"Trend": "Xu hướng",
"Trending down": "Đang giảm",
"Trending up": "Đang tăng",
+ "Trial": "Dùng thử",
"Triggered garbage collection": "Đã kích hoạt thu gom rác",
"Trim leading/trailing whitespace": "Xóa khoảng trắng đầu/cuối",
"Trim Prefix": "Cắt tiền tố",
@@ -4674,6 +4734,7 @@
"Unable to load groups": "Không thể tải nhóm",
"Unable to load rankings": "Không thể tải bảng xếp hạng",
"Unable to load rankings data": "Không thể tải dữ liệu bảng xếp hạng",
+ "Unable to load subscription plans": "Không thể tải các gói đăng ký",
"Unable to open chat": "Không thể mở trò chuyện",
"Unable to parse structured pricing": "Không thể phân tích giá có cấu trúc",
"Unable to prepare chat link. Please ensure you have an enabled API key.": "Không thể chuẩn bị liên kết chat. Vui lòng đảm bảo bạn có khóa API được kích hoạt.",
@@ -4987,6 +5048,7 @@
"We could not load instances.": "Không thể tải danh sách phiên bản.",
"We could not load system tasks.": "Không thể tải tác vụ hệ thống.",
"We could not load the setup status.": "Chúng tôi không thể tải trạng thái thiết lập.",
+ "We provide 100% official full-performance models. Requests are routed directly to the official address via the official client channel. If certain detection items (such as forced structured output) show as unsupported, this is because the channel itself does not support that capability — not because the model has been replaced or downgraded.": "Chúng tôi cung cấp các mô hình chính thức với hiệu năng đầy đủ 100%. Yêu cầu được định tuyến trực tiếp tới địa chỉ chính thức qua kênh ứng dụng khách chính thức. Nếu một số mục kiểm tra, chẳng hạn đầu ra có cấu trúc bắt buộc, hiển thị không được hỗ trợ, đó là do chính kênh không hỗ trợ khả năng này, không phải vì mô hình đã bị thay thế hoặc hạ cấp.",
"We will prompt your device to confirm using biometrics or your hardware key.": "Chúng tôi sẽ yêu cầu thiết bị của bạn xác nhận bằng cách sử dụng sinh trắc học hoặc khóa bảo mật phần cứng của bạn.",
"We'll be back online shortly.": "Chúng tôi sẽ sớm trực tuyến trở lại.",
"Web search": "Tìm kiếm web",
@@ -5012,6 +5074,10 @@
"Week": "Tuần",
"Weekday": "Thứ trong tuần",
"Weekly": "Hàng tuần",
+ "Weekly Business": "Gói tuần Doanh nghiệp",
+ "Weekly credits for regular users with a controlled budget.": "Tín dụng hằng tuần cho người dùng thường xuyên với ngân sách được kiểm soát.",
+ "Weekly Pro": "Gói tuần Pro",
+ "Weekly Starter": "Gói tuần Khởi đầu",
"Weekly token usage by model across the past few weeks": "Sử dụng token hàng tuần của từng mô hình trong vài tuần qua",
"Weekly token usage by model across the past year": "Sử dụng token theo mô hình hàng tuần trong năm qua",
"Weekly token usage by model since launch": "Sử dụng token theo mô hình hàng tuần kể từ khi ra mắt",
diff --git a/web/default/src/i18n/locales/zh-TW.json b/web/default/src/i18n/locales/zh-TW.json
index 5c8175d73c7a..e904d04b9ae6 100644
--- a/web/default/src/i18n/locales/zh-TW.json
+++ b/web/default/src/i18n/locales/zh-TW.json
@@ -28,6 +28,7 @@
"[{\"ChatGPT\":\"https://chat.openai.com\"},{\"Lobe Chat\":\"https://chat-preview.lobehub.com/?settings={...}\"}]": "[{\"ChatGPT\":\"https://chat.openai.com\"},{\"Lobe Chat\":\"https://chat-preview.lobehub.com/?settings={...}\"}]",
"[{\"name\":\"支付宝\",\"type\":\"alipay\",\"color\":\"#1677FF\"}]": "[{\"name\":\"支付寶\",\"type\":\"alipay\",\"color\":\"#1677FF\"}]",
"[{\"name\":\"支付宝\",\"type\":\"alipay\",\"icon\":\"SiAlipay\"}]": "[{\"name\":\"支付寶\",\"type\":\"alipay\",\"icon\":\"SiAlipay\"}]",
+ "[Telegram group](https://t.me/+36iGYj-hkkFkOWRl)": "[Telegram 群組](https://t.me/+36iGYj-hkkFkOWRl)",
"{\"original-model\": \"replacement-model\"}": "{\"original-model\": \"replacement-model\"}",
"{{category}} Models": "{{category}} 模型",
"{{completed}}/{{total}} completed": "已完成 {{completed}}/{{total}}",
@@ -52,6 +53,7 @@
"{{count}} models": "{{count}} 個模型",
"{{count}} months ago": "{{count}} 個月前",
"{{count}} override": "{{count}} 個覆蓋",
+ "{{count}} plans available": "共 {{count}} 個方案",
"{{count}} selected targets available for bulk copy.": "已選擇 {{count}} 個目標,可用於大量複製。",
"{{count}} tiers": "{{count}} 檔",
"{{count}} Uptime Kuma groups will be removed from the list.": "將從列表中移除 {{count}} 個 Uptime Kuma 分組。",
@@ -63,6 +65,7 @@
"{{modality}} not supported": "不支援 {{modality}}",
"{{modality}} supported": "支援 {{modality}}",
"{{n}} model(s) selected": "已選 {{n}} 個模型",
+ "{{plan}} Token capacity": "{{plan}} Token 用量",
"{{processed}} of {{total}} log entries processed.": "已處理 {{processed}} / {{total}} 條日誌。",
"{{success}} succeeded, {{failed}} failed": "{{success}} 個成功,{{failed}} 個失敗",
"{{target}} test failed": "{{target}} 測試失敗",
@@ -118,6 +121,12 @@
"80,443,8080": "80,443,8080",
"A billing multiplier. Lower ratios mean lower API call costs.": "收費乘數,倍率越低,API 呼叫費用越低。",
"A focused home for keys, balance, routing, and service health.": "集中展示金鑰、餘額、路由和服務健康狀態。",
+ "A high-capacity credit plan for heavy API usage.": "大額度套餐,適合高頻 API 使用。",
+ "A higher weekly allowance for demanding workflows.": "更高的週度額度,適合要求更高的工作流程。",
+ "A larger monthly allowance for frequent professional use.": "更大的月度額度,適合高頻專業使用。",
+ "A one-time low-cost trial for testing core models.": "一次性低價試用,用於測試核心模型。",
+ "A predictable weekly budget for light, consistent usage.": "可預期的週度預算,適合輕量且穩定的使用。",
+ "A small credit pack for light, short-term usage.": "小額度套餐,適合輕量、短期使用。",
"About": "關於",
"About {{days}} days left": "約剩 {{days}} 日",
"Accept Unpriced Models": "接受未定價模型",
@@ -680,6 +689,7 @@
"Cache Directory Disk Space": "緩存目錄磁碟空間",
"Cache Directory Info": "緩存目錄資訊",
"Cache Entries": "緩存條目",
+ "Cache Hit": "快取命中",
"Cache mode": "緩存模式",
"Cache pricing": "緩存定價",
"Cache ratio": "緩存倍率",
@@ -792,6 +802,7 @@
"checkout.session.completed": "checkout.session.completed",
"checkout.session.expired": "checkout.session.expired",
"Chinese": "中文",
+ "Choose a plan and estimate model usage": "選擇方案並估算模型用量",
"Choose a username": "選擇一個用戶名",
"Choose an amount and payment method": "選擇金額和支付方式",
"Choose between default expanded, compact icon-only, or full layout mode": "選擇預設展開、緊湊圖標模式或完整佈局模式",
@@ -930,6 +941,7 @@
"Compliance confirmed": "合規已確認",
"Compliance confirmed successfully": "合規確認成功",
"Concatenate channel system prompt with user's prompt": "將渠道系統提示與用戶的提示連接起來",
+ "Concurrency & Cache Hit Rate": "並發與快取命中率",
"Condition Path": "條件路徑",
"Condition Settings": "條件項設定",
"Condition Value": "條件值",
@@ -1022,6 +1034,7 @@
"Console Content": "控制台內容",
"Consume": "消耗",
"Consumed in the last 24 hours": "近 24 小時消耗量",
+ "Contact Us": "聯絡我們",
"Container": "容器",
"Container name": "容器名稱",
"Containers": "容器",
@@ -1164,7 +1177,12 @@
"Credentials": "憑證",
"Credentials verification failed": "憑證驗證失敗",
"Credentials verification failed — double-check Merchant ID and API private key.": "憑證驗證失敗,請檢查 Merchant ID 和 API 私鑰。",
+ "Credit Business": "商務額度包",
+ "Credit Plans": "額度套餐",
+ "Credit Power": "高容量額度包",
+ "Credit Pro": "專業額度包",
"Credit remaining": "剩餘額度",
+ "Credit Starter": "入門額度包",
"Creem API key (leave blank unless updating)": "Creem API 金鑰(除非更新,否則留空)",
"Creem Gateway": "Creem 閘道",
"Creem Payment": "Creem 支付",
@@ -1250,6 +1268,7 @@
"Default API version for this channel": "此渠道的預設 API 版本",
"Default Bearer": "預設 Bearer",
"Default Collapse Sidebar": "預設摺疊側邊欄",
+ "Default concurrency is 500, with cache hit rate around 90%.": "預設並發為 500,快取命中率約為 90%。",
"Default consumption chart": "預設消耗分佈圖",
"Default Max Tokens": "預設最大 Token 數",
"Default model call chart": "預設模型呼叫圖",
@@ -1352,6 +1371,7 @@
"Detected high-risk status code redirect rules": "偵測到以下高危狀態碼重新導向規則:",
"Detection complete: {{add}} to add, {{remove}} to remove": "偵測完成:新增 {{add}} 個,刪除 {{remove}} 個",
"Detection failed": "偵測失敗",
+ "Detection Results Are Not 100%": "檢測結果並非 100%",
"Determines how this group is applied elsewhere.": "確定此分組在其他地方的套用方式。",
"Deterministic sampling seed (best-effort)": "盡量保證可復現的採樣種子",
"Developer Friendly": "開發者友好",
@@ -1359,6 +1379,8 @@
"Dify": "Dify",
"Dify channels only support chatflow and agent, and agent does not support images": "Dify 渠道僅支援 chatflow 和 agent,agent 不支援圖像",
"Digest:": "摘要:",
+ "Direct access to official providers": "直連官方的",
+ "Direct official access": "直連官方",
"Direction": "方向",
"Directory File Count": "目錄檔案數",
"Directory Total Size": "目錄總大小",
@@ -1384,6 +1406,7 @@
"Discord": "Discord",
"Discount": "優惠",
"Discount map by recharge amount (JSON object)": "按儲值金額的折扣映射 (JSON 物件)",
+ "Discount Plans": "折扣方案",
"Discount Rate": "折扣率",
"Discount rate must be ≤ 1": "折扣率必須 ≤ 1",
"Discount rate must be greater than 0": "折扣率必須大於 0",
@@ -1451,6 +1474,7 @@
"Duration Settings": "有效期設定",
"Duration Unit": "有效期單位",
"Duration Value": "有效期數值",
+ "Dynamic pricing": "動態計費",
"Dynamic Pricing": "動態收費",
"e.g. ¥ or HK$": "例如,¥ 或 HK$",
"e.g. 401, 403, 429, 500-599": "例如 401、403、429、500-599",
@@ -1686,6 +1710,7 @@
"Enter your username": "輸入您的用戶名",
"Enter your username or email": "輸入您的用戶名或電郵",
"Enterprise Account": "企業用戶",
+ "Enterprise-grade API gateway": "企業級 API 閘道",
"Enterprise-grade security with comprehensive permission management": "企業級安全性,提供全面的權限管理",
"Entrypoint (space separated)": "入口點 (空格分隔)",
"Env (JSON object)": "環境變數 (JSON 物件)",
@@ -1709,6 +1734,7 @@
"Error Type (optional)": "錯誤類型(可選)",
"Estimated cost": "預計成本",
"Estimated quota cost": "估算配額費用",
+ "Estimates assume the selected model is used exclusively. Actual usage may vary with cache, tools, media, or dynamic pricing.": "估算按單獨使用所選模型計算,實際用量可能因快取、工具、媒體或動態計費而有所不同。",
"Every group name in the pricing table can be used in two places: on a user (the user group, assigned by admins) and on a token (the token group, chosen when creating the token). Same name pool, two different jobs.": "定價表中的每個分組名可用在兩個地方:用戶身上(用戶分組,由管理員分配)和令牌身上(令牌分組,建立令牌時選擇)。同一批名字,兩種不同職責。",
"Everything configured for this group, in one place.": "該分組的全部設定,一處看全。",
"Exact": "精確",
@@ -1981,6 +2007,7 @@
"Fixed price": "固定價格",
"Fixed price (USD)": "固定價格 (USD)",
"Fixed request price": "固定按次價格",
+ "Flexible monthly credits for occasional users.": "靈活的月度額度,適合偶爾使用。",
"Floating": "浮動",
"Flow": "分流",
"Flow Filters": "分流篩選",
@@ -2070,6 +2097,7 @@
"Generation was interrupted": "生成已中斷",
"Generic cache": "通用緩存",
"Get advice": "獲取建議",
+ "Get API Key": "取得 API 金鑰",
"Get notified when balance falls below this value": "當餘額低於此值時接收通知",
"Get one here": "點此獲取",
"Get started": "開始使用",
@@ -2244,10 +2272,12 @@
"Ignore": "忽略",
"Ignored upstream models": "已忽略上游模型",
"Image": "圖片",
+ "Image API URL": "生圖專用Url",
"Image Generation": "圖片生成",
"Image In": "圖像輸入",
"Image input": "圖片輸入",
"Image input price": "圖像輸入價格",
+ "Image Models": "圖像模型",
"Image not available": "圖片不可用",
"Image Out": "圖像輸出",
"Image output price": "圖像輸出價格",
@@ -2255,6 +2285,7 @@
"Image ratio": "圖片倍率",
"Image to Video": "圖生影片",
"Image Tokens": "圖像 Token",
+ "Image Type": "圖像類型",
"Imagine the pricing table has three groups: default (ratio 1.0), premium (ratio 0.5), and vip (ratio 0.8). Users whose account is in the vip group get user-level perks, and premium is a cheaper channel pool that users can pick for their tokens.": "假設定價分組表裡有三個分組:default(倍率 1.0)、premium(倍率 0.5)、vip(倍率 0.8)。賬號在 vip 分組的用戶享受用戶級待遇,premium 則是一個更便宜的渠道池,用戶建令牌時可以選它。",
"Import to CC Switch": "填入 CC Switch",
"Important": "重要",
@@ -2286,6 +2317,7 @@
"Initializing…": "正在初始化…",
"Inpaint": "局部重繪",
"Input": "輸入",
+ "Input (1M)": "輸入(1M)",
"Input mode": "輸入模式",
"Input price": "輸入價格",
"Input price is required before saving dependent prices.": "儲存依賴價格前必須先填寫輸入價格。",
@@ -2556,10 +2588,14 @@
"Maximum 200 characters": "最多 200 個字元",
"Maximum 500 characters. Supports Markdown and HTML.": "最多 500 個字元。支援 Markdown 和 HTML。",
"Maximum check-in quota": "簽到最大額度",
+ "Maximum input Tokens": "最多輸入 Token",
"Maximum input window": "最大輸入窗口",
"Maximum number of tokens each user can create. Default 1000. Setting too large may affect performance.": "每個用戶可建立的最大令牌數量。預設 1000。設定過大可能會影響效能。",
"Maximum number of tokens in the response": "回應中最大 token 數",
+ "Maximum output Tokens": "最多輸出 Token",
"Maximum quota amount awarded for check-in": "簽到獎勵的最大額度",
+ "Maximum standalone usage across the full plan validity period.": "方案整個有效期內單獨使用該模型的最大用量。",
+ "Maximum standalone usage within each {{period}} reset period.": "每個重置週期({{period}})內單獨使用該模型的最大用量。",
"Maximum tokens including hidden reasoning tokens": "最大 token 數(含隱藏的推理 token)",
"Maximum tokens per response": "單次回應最大 token 數",
"Maximum tokens per user": "每個用戶的最大令牌數",
@@ -2579,9 +2615,12 @@
"min downtime": "分鐘停機",
"Min Top-up": "最低儲值",
"Min Top-up:": "最低儲值:",
+ "Mini": "迷你包",
"MiniMax": "MiniMax",
"Minimum check-in quota": "簽到最小額度",
+ "Minimum Input (1M)": "最低輸入(1M)",
"Minimum LinuxDO trust level required": "所需的最低 LinuxDO 信任級別",
+ "Minimum Output (1M)": "最低輸出(1M)",
"Minimum quota amount awarded for check-in": "簽到獎勵的最小額度",
"Minimum recharge amount in USD": "最低儲值金額(美元)",
"Minimum recharge amount to qualify for this discount.": "符合此折扣的最低儲值金額。",
@@ -2612,6 +2651,7 @@
"Model Analytics": "模型數據分析",
"Model Analytics Defaults": "模型分析預設設定",
"Model Analytics Filters": "模型分析篩選",
+ "Model Authenticity": "模型真實性",
"model billing support": "模型收費支援",
"Model Call Analytics": "模型呼叫分析",
"Model context usage": "模型上下文用量",
@@ -2642,6 +2682,7 @@
"Model not found": "模型未找到",
"Model performance metrics": "模型效能指標",
"Model Price": "模型價格",
+ "Model Price Comparison": "模型價格比較",
"Model price is not configured. Please complete model pricing in settings.": "模型價格未設定,請前往設定補充模型價格。",
"Model Price Not Configured": "模型價格未設定",
"Model prices": "模型價格",
@@ -2654,7 +2695,7 @@
"Model Regex": "模型正則",
"Model Regex (one per line)": "模型正則(每行一個)",
"Model selected": "已選擇模型",
- "Model Square": "模型廣場",
+ "Model Square": "模型定價",
"Model Tags": "模型標籤",
"Model to use for testing": "用於測試的模型",
"Model to use when testing channel connectivity": "測試渠道連接時使用的模型",
@@ -2696,7 +2737,9 @@
"months": "個月",
"Moonshot": "Moonshot",
"More": "更多",
+ "More affordable routes are available. For stable access, replace BaseUrl with:": "還有更多低價路由,穩定流暢,只需將 BaseUrl 替換為:",
"More Apps": "更多",
+ "More credits for regular chat, coding, and daily use.": "更多額度,適合日常對話、程式設計和使用。",
"more mapping": "更多映射",
"More templates...": "更多模板...",
"More than 999 days left": "剩餘超過 999 日",
@@ -2865,6 +2908,7 @@
"No matching token and channel usage was found.": "未找到匹配的令牌與渠道用量。",
"No messages yet": "暫無訊息",
"No missing models found.": "未找到缺失的模型。",
+ "No model downgrades or substitutions": "不降智、不造假",
"No model found.": "未找到模型。",
"No model mappings configured. Click \"Add Mapping\" to get started.": "未設定模型映射。點擊「新增映射」即可開始使用。",
"No model price changes to save": "沒有模型價格變更需要儲存",
@@ -2901,6 +2945,7 @@
"No preference": "無偏好",
"No prefill groups yet": "暫無預填充分組",
"No price differences found": "未發現價格差異",
+ "No pricing data available": "暫無價格資料",
"No processable upstream model updates for this channel": "該渠道暫無可處理的上游模型更新",
"No products configured. Click \"Add product\" to get started.": "未設定產品。點擊「新增產品」開始。",
"No products match your search": "沒有產品匹配您的搜尋",
@@ -3006,12 +3051,14 @@
"Official documentation": "官方說明",
"Official Gemini from OpenAI Chat": "官方 Gemini(OpenAI Chat 入口)",
"Official Gemini Native": "官方 Gemini 原生",
+ "Official Input / Output (1M)": "官方輸入/輸出(1M)",
"Official OpenAI Chat": "官方 OpenAI Chat",
"Official OpenAI Embeddings": "官方 OpenAI Embeddings",
"Official OpenAI Images": "官方 OpenAI Images",
"Official OpenAI Responses": "官方 OpenAI Responses",
"Official Repository": "官方倉庫",
"Official Sync": "官方同步",
+ "Officially funded accounts": "正規儲值帳號",
"OhMyGPT": "OhMyGPT",
"OIDC": "OIDC",
"OIDC Client ID": "OIDC 用戶端 ID",
@@ -3125,6 +3172,7 @@
"Other users": "其他用戶",
"Outage": "中斷",
"Output": "輸出",
+ "Output (1M)": "輸出(1M)",
"Output aspect ratio": "輸出寬高比",
"Output image size": "輸出圖像尺寸",
"Output price": "輸出價格",
@@ -3274,6 +3322,7 @@
"Performance Settings": "效能設定",
"Performed {{action}} on user {{username}} (ID: {{id}})": "對用戶 {{username}}(ID: {{id}})執行 {{action}}",
"Period": "時間範圍",
+ "Period Quota": "週期額度",
"Periodically check for upstream model changes": "定期檢查上游模型是否有變更",
"Periodically send ping frames to keep streaming connections active.": "定期發送 ping 幀以保持串流連接處於活動狀態。",
"Permanently delete your account and all data": "永久刪除您的用戶和所有數據",
@@ -3340,6 +3389,7 @@
"Please fix JSON errors before saving": "請先修復 JSON 錯誤再儲存",
"Please fix the highlighted fields before saving": "請先修復高亮欄位後再儲存",
"Please log in with the appropriate credentials": "請使用適當的憑證登入",
+ "Please refresh the page and try again.": "請重新整理頁面後再試。",
"Please select a container": "請選擇一個容器",
"Please select a payment method": "請選擇支付方式",
"Please select a primary model": "請選擇主模型",
@@ -3439,6 +3489,7 @@
"Pricing mode": "定價模式",
"Pricing Ratios": "定價比例",
"Pricing Type": "定價類型",
+ "Pricing unavailable": "暫無價格",
"Primary Model": "主模型",
"Prioritize reusing the last successful channel based on keys extracted from request context (sticky routing)": "基於請求上下文提取的 Key,優先複用上一次成功的渠道(粘滯選路)",
"Priority": "優先級",
@@ -3765,6 +3816,7 @@
"Reset Passkey for {{username}}? The user will need to register a new Passkey before using passwordless login.": "要重置 {{username}} 的 Passkey 嗎?該用戶需要重新註冊 Passkey 後才能使用無密碼登入。",
"Reset password": "重設密碼",
"Reset Period": "重置週期",
+ "Reset Plans": "重置套餐",
"Reset prices": "重置價格",
"Reset quota": "重置額度",
"Reset ratios": "重置比例",
@@ -3953,6 +4005,8 @@
"Select a group": "選擇一個分組",
"Select a group type": "選擇分組類型",
"Select a model to edit pricing": "選擇一個模型編輯定價",
+ "Select a plan": "選擇方案",
+ "Select a plan to see the maximum standalone input or output Token capacity for each model.": "選擇方案,查看每個模型單獨用於輸入或輸出時最多可使用的 Token。",
"Select a preset...": "選擇一個預設...",
"Select a product": "選擇產品",
"Select a role": "選擇角色",
@@ -4095,6 +4149,8 @@
"Show": "顯示",
"Show All": "顯示全部",
"Show all providers including unbound": "顯示所有供應商(包括未連結)",
+ "Show Less": "收起",
+ "Show More": "顯示更多",
"Show only bound providers": "僅顯示已連結的供應商",
"Show or hide flow columns": "顯示或隱藏分流列",
"Show preview": "顯示預覽",
@@ -4175,6 +4231,7 @@
"SQLite stores all data in a single file. Make sure that file is persisted when running in containers.": "SQLite 將所有數據儲存在單個檔案中。在容器中執行時請確保該檔案已持久化。",
"SSL/TLS": "SSL/TLS",
"SSRF Protection": "SSRF 保護",
+ "Stable high concurrency": "穩定高併發",
"stale": "失聯",
"Standard": "標準",
"Standard price": "標準價格",
@@ -4182,6 +4239,7 @@
"Start a conversation to see messages here": "開始對話以在此處查看訊息",
"Start a playground chat": "開始一場遊樂場對話",
"Start collecting payments globally without registering a company. Built for indie developers, OPC sole proprietorships, and startups. Waffo Pancake acts as your Merchant of Record, taking on the compliance burden of global payment collection — consumption tax, invoicing, subscription management, refunds, and chargebacks. Solo developers can launch fast and stay focused on product instead of compliance. Onboard in minutes — one prompt to a full integration.": "無需註冊公司即可開始全球收款。面向獨立開發者、OPC 個體經營者和初創團隊構建。Waffo Pancake 作為你的登記商戶(Merchant of Record),承擔全球收款相關的合規負擔,包括消費稅、開票、訂閱管理、退款和拒付。個人開發者可以快速上線,專注產品而不是合規事務。幾分鐘即可完成入駐,從一個提示詞到完整整合。",
+ "Start for Free": "免費接入",
"Start for free with generous limits. No credit card required.": "免費開始使用,額度充足,無需連結信用卡。",
"Start Time": "起始時間",
"Started": "啟動時間",
@@ -4520,6 +4578,7 @@
"Timing": "耗時",
"Tip": "提示",
"to access this resource.": "存取此資源。",
+ "To avoid account bans, we add simulated prompt words in the requests, which may result in the score not reaching 100%.": "為避免帳號遭封禁,我們會在請求中加入模擬提示詞,因此評分可能無法達到 100%。",
"to confirm": "以確認",
"To Lower": "轉小寫",
"To Lowercase": "轉小寫",
@@ -4636,6 +4695,7 @@
"Trend": "趨勢",
"Trending down": "下降趨勢",
"Trending up": "上升趨勢",
+ "Trial": "試用包",
"Triggered garbage collection": "觸發垃圾回收",
"Trim leading/trailing whitespace": "去掉字串頭尾空白",
"Trim Prefix": "裁剪前綴",
@@ -4674,6 +4734,7 @@
"Unable to load groups": "無法載入分組",
"Unable to load rankings": "無法載入排行榜",
"Unable to load rankings data": "無法載入排行榜數據",
+ "Unable to load subscription plans": "無法載入訂閱方案",
"Unable to open chat": "無法打開聊天",
"Unable to parse structured pricing": "無法解析為結構化價格",
"Unable to prepare chat link. Please ensure you have an enabled API key.": "無法準備聊天連結。請確保您有一個已啟用的 API 金鑰。",
@@ -4987,6 +5048,7 @@
"We could not load instances.": "無法載入實例資訊。",
"We could not load system tasks.": "無法載入系統任務。",
"We could not load the setup status.": "我們無法載入設定狀態。",
+ "We provide 100% official full-performance models. Requests are routed directly to the official address via the official client channel. If certain detection items (such as forced structured output) show as unsupported, this is because the channel itself does not support that capability — not because the model has been replaced or downgraded.": "我們提供 100% 官方滿血模型。請求會透過官方客戶端渠道直連官方地址。若部分檢測項(例如強制結構化輸出)顯示不支援,是因為該渠道本身不具備該能力,並非模型被替換或降級。",
"We will prompt your device to confirm using biometrics or your hardware key.": "我們將提示您的設備使用生物識別或硬件金鑰進行確認。",
"We'll be back online shortly.": "我們將很快恢復在線。",
"Web search": "網絡搜尋",
@@ -5012,6 +5074,10 @@
"Week": "本週",
"Weekday": "星期",
"Weekly": "每週",
+ "Weekly Business": "週度商務包",
+ "Weekly credits for regular users with a controlled budget.": "面向常規使用者的週度額度,預算更可控。",
+ "Weekly Pro": "週度專業包",
+ "Weekly Starter": "週度入門包",
"Weekly token usage by model across the past few weeks": "最近幾週內各模型的每週 Token 用量",
"Weekly token usage by model across the past year": "過去一年內按模型分佈的每週 Token 使用量",
"Weekly token usage by model since launch": "自上線以來按模型分佈的每週 Token 使用量",
diff --git a/web/default/src/i18n/locales/zh.json b/web/default/src/i18n/locales/zh.json
index 71ddb799a813..8a195ea43d97 100644
--- a/web/default/src/i18n/locales/zh.json
+++ b/web/default/src/i18n/locales/zh.json
@@ -28,6 +28,7 @@
"[{\"ChatGPT\":\"https://chat.openai.com\"},{\"Lobe Chat\":\"https://chat-preview.lobehub.com/?settings={...}\"}]": "[{\"ChatGPT\":\"https://chat.openai.com\"},{\"Lobe Chat\":\"https://chat-preview.lobehub.com/?settings={...}\"}]",
"[{\"name\":\"支付宝\",\"type\":\"alipay\",\"color\":\"#1677FF\"}]": "[{\"name\":\"支付宝\",\"type\":\"alipay\",\"color\":\"#1677FF\"}]",
"[{\"name\":\"支付宝\",\"type\":\"alipay\",\"icon\":\"SiAlipay\"}]": "[{\"name\":\"支付宝\",\"type\":\"alipay\",\"icon\":\"SiAlipay\"}]",
+ "[Telegram group](https://t.me/+36iGYj-hkkFkOWRl)": "[Telegram 群组](https://t.me/+36iGYj-hkkFkOWRl)",
"{\"original-model\": \"replacement-model\"}": "{\"original-model\": \"replacement-model\"}",
"{{category}} Models": "{{category}} 模型",
"{{completed}}/{{total}} completed": "已完成 {{completed}}/{{total}}",
@@ -52,6 +53,7 @@
"{{count}} models": "{{count}} 个模型",
"{{count}} months ago": "{{count}} 个月前",
"{{count}} override": "{{count}} 个覆盖",
+ "{{count}} plans available": "共 {{count}} 个套餐",
"{{count}} selected targets available for bulk copy.": "已选择 {{count}} 个目标,可用于批量复制。",
"{{count}} tiers": "{{count}} 档",
"{{count}} Uptime Kuma groups will be removed from the list.": "将从列表中移除 {{count}} 个 Uptime Kuma 分组。",
@@ -63,6 +65,7 @@
"{{modality}} not supported": "不支持 {{modality}}",
"{{modality}} supported": "支持 {{modality}}",
"{{n}} model(s) selected": "已选 {{n}} 个模型",
+ "{{plan}} Token capacity": "{{plan}} Token 用量",
"{{processed}} of {{total}} log entries processed.": "已处理 {{processed}} / {{total}} 条日志。",
"{{success}} succeeded, {{failed}} failed": "{{success}} 个成功,{{failed}} 个失败",
"{{target}} test failed": "{{target}} 测试失败",
@@ -118,6 +121,12 @@
"80,443,8080": "80,443,8080",
"A billing multiplier. Lower ratios mean lower API call costs.": "计费乘数,倍率越低,API 调用费用越低。",
"A focused home for keys, balance, routing, and service health.": "集中展示密钥、余额、路由和服务健康状态。",
+ "A high-capacity credit plan for heavy API usage.": "大额度套餐,适合高频 API 使用。",
+ "A higher weekly allowance for demanding workflows.": "更高的周度额度,适合要求更高的工作流。",
+ "A larger monthly allowance for frequent professional use.": "更大的月度额度,适合高频专业使用。",
+ "A one-time low-cost trial for testing core models.": "一次性低价试用,用于测试核心模型。",
+ "A predictable weekly budget for light, consistent usage.": "可预期的周度预算,适合轻量且稳定的使用。",
+ "A small credit pack for light, short-term usage.": "小额度套餐,适合轻量、短期使用。",
"About": "关于",
"About {{days}} days left": "约剩 {{days}} 天",
"Accept Unpriced Models": "接受未定价模型",
@@ -680,6 +689,7 @@
"Cache Directory Disk Space": "缓存目录磁盘空间",
"Cache Directory Info": "缓存目录信息",
"Cache Entries": "缓存条目",
+ "Cache Hit": "缓存命中",
"Cache mode": "缓存模式",
"Cache pricing": "缓存定价",
"Cache ratio": "缓存倍率",
@@ -792,6 +802,7 @@
"checkout.session.completed": "checkout.session.completed",
"checkout.session.expired": "checkout.session.expired",
"Chinese": "中文",
+ "Choose a plan and estimate model usage": "选择套餐并估算模型用量",
"Choose a username": "选择一个用户名",
"Choose an amount and payment method": "选择金额和支付方式",
"Choose between default expanded, compact icon-only, or full layout mode": "选择默认展开、紧凑图标模式或完整布局模式",
@@ -930,6 +941,7 @@
"Compliance confirmed": "合规已确认",
"Compliance confirmed successfully": "合规确认成功",
"Concatenate channel system prompt with user's prompt": "将渠道系统提示与用户的提示连接起来",
+ "Concurrency & Cache Hit Rate": "并发与缓存命中率",
"Condition Path": "条件路径",
"Condition Settings": "条件项设置",
"Condition Value": "条件值",
@@ -1022,6 +1034,7 @@
"Console Content": "控制台内容",
"Consume": "消耗",
"Consumed in the last 24 hours": "近 24 小时消耗量",
+ "Contact Us": "联系我们",
"Container": "容器",
"Container name": "容器名称",
"Containers": "容器",
@@ -1164,7 +1177,12 @@
"Credentials": "凭证",
"Credentials verification failed": "凭证验证失败",
"Credentials verification failed — double-check Merchant ID and API private key.": "凭证验证失败,请检查 Merchant ID 和 API 私钥。",
+ "Credit Business": "商务额度包",
+ "Credit Plans": "额度套餐",
+ "Credit Power": "高容量额度包",
+ "Credit Pro": "专业额度包",
"Credit remaining": "剩余额度",
+ "Credit Starter": "入门额度包",
"Creem API key (leave blank unless updating)": "Creem API 密钥(除非更新,否则留空)",
"Creem Gateway": "Creem 网关",
"Creem Payment": "Creem 支付",
@@ -1250,6 +1268,7 @@
"Default API version for this channel": "此渠道的默认 API 版本",
"Default Bearer": "默认 Bearer",
"Default Collapse Sidebar": "默认折叠侧边栏",
+ "Default concurrency is 500, with cache hit rate around 90%.": "默认并发为 500,缓存命中率约为 90%。",
"Default consumption chart": "默认消耗分布图",
"Default Max Tokens": "默认最大 Token 数",
"Default model call chart": "默认模型调用图",
@@ -1352,6 +1371,7 @@
"Detected high-risk status code redirect rules": "检测到以下高危状态码重定向规则:",
"Detection complete: {{add}} to add, {{remove}} to remove": "检测完成:新增 {{add}} 个,删除 {{remove}} 个",
"Detection failed": "检测失败",
+ "Detection Results Are Not 100%": "检测结果并非 100%",
"Determines how this group is applied elsewhere.": "确定此分组在其他地方的应用方式。",
"Deterministic sampling seed (best-effort)": "尽量保证可复现的采样种子",
"Developer Friendly": "开发者友好",
@@ -1359,6 +1379,8 @@
"Dify": "Dify",
"Dify channels only support chatflow and agent, and agent does not support images": "Dify 渠道仅支持 chatflow 和 agent,agent 不支持图像",
"Digest:": "摘要:",
+ "Direct access to official providers": "直连官方的",
+ "Direct official access": "直连官方",
"Direction": "方向",
"Directory File Count": "目录文件数",
"Directory Total Size": "目录总大小",
@@ -1384,6 +1406,7 @@
"Discord": "Discord",
"Discount": "优惠",
"Discount map by recharge amount (JSON object)": "按充值金额的折扣映射 (JSON 对象)",
+ "Discount Plans": "折扣套餐",
"Discount Rate": "折扣率",
"Discount rate must be ≤ 1": "折扣率必须 ≤ 1",
"Discount rate must be greater than 0": "折扣率必须大于 0",
@@ -1451,6 +1474,7 @@
"Duration Settings": "有效期设置",
"Duration Unit": "有效期单位",
"Duration Value": "有效期数值",
+ "Dynamic pricing": "动态计费",
"Dynamic Pricing": "动态计费",
"e.g. ¥ or HK$": "例如,¥ 或 HK$",
"e.g. 401, 403, 429, 500-599": "例如 401、403、429、500-599",
@@ -1686,6 +1710,7 @@
"Enter your username": "输入您的用户名",
"Enter your username or email": "输入您的用户名或电子邮件",
"Enterprise Account": "企业账户",
+ "Enterprise-grade API gateway": "企业级接口网关",
"Enterprise-grade security with comprehensive permission management": "企业级安全性,提供全面的权限管理",
"Entrypoint (space separated)": "入口点 (空格分隔)",
"Env (JSON object)": "环境变量 (JSON 对象)",
@@ -1709,6 +1734,7 @@
"Error Type (optional)": "错误类型(可选)",
"Estimated cost": "预计成本",
"Estimated quota cost": "估算配额费用",
+ "Estimates assume the selected model is used exclusively. Actual usage may vary with cache, tools, media, or dynamic pricing.": "估算按单独使用所选模型计算,实际用量可能因缓存、工具、媒体或动态计费而有所不同。",
"Every group name in the pricing table can be used in two places: on a user (the user group, assigned by admins) and on a token (the token group, chosen when creating the token). Same name pool, two different jobs.": "定价表中的每个分组名可用在两个地方:用户身上(用户分组,由管理员分配)和令牌身上(令牌分组,创建令牌时选择)。同一批名字,两种不同职责。",
"Everything configured for this group, in one place.": "该分组的全部配置,一处看全。",
"Exact": "精确",
@@ -1981,6 +2007,7 @@
"Fixed price": "固定价格",
"Fixed price (USD)": "固定价格 (USD)",
"Fixed request price": "固定按次价格",
+ "Flexible monthly credits for occasional users.": "灵活的月度额度,适合偶尔使用。",
"Floating": "浮动",
"Flow": "分流",
"Flow Filters": "分流筛选",
@@ -2070,6 +2097,7 @@
"Generation was interrupted": "生成已中断",
"Generic cache": "通用缓存",
"Get advice": "获取建议",
+ "Get API Key": "获取密钥",
"Get notified when balance falls below this value": "当余额低于此值时接收通知",
"Get one here": "点此获取",
"Get started": "开始使用",
@@ -2244,10 +2272,12 @@
"Ignore": "忽略",
"Ignored upstream models": "已忽略上游模型",
"Image": "图片",
+ "Image API URL": "生图专用Url",
"Image Generation": "图片生成",
"Image In": "图像输入",
"Image input": "图片输入",
"Image input price": "图像输入价格",
+ "Image Models": "图像模型",
"Image not available": "图片不可用",
"Image Out": "图像输出",
"Image output price": "图像输出价格",
@@ -2255,6 +2285,7 @@
"Image ratio": "图片倍率",
"Image to Video": "图生视频",
"Image Tokens": "图像 Token",
+ "Image Type": "图像类型",
"Imagine the pricing table has three groups: default (ratio 1.0), premium (ratio 0.5), and vip (ratio 0.8). Users whose account is in the vip group get user-level perks, and premium is a cheaper channel pool that users can pick for their tokens.": "假设定价分组表里有三个分组:default(倍率 1.0)、premium(倍率 0.5)、vip(倍率 0.8)。账号在 vip 分组的用户享受用户级待遇,premium 则是一个更便宜的渠道池,用户建令牌时可以选它。",
"Import to CC Switch": "填入 CC Switch",
"Important": "重要",
@@ -2286,6 +2317,7 @@
"Initializing…": "正在初始化…",
"Inpaint": "局部重绘",
"Input": "输入",
+ "Input (1M)": "输入(1M)",
"Input mode": "输入模式",
"Input price": "输入价格",
"Input price is required before saving dependent prices.": "保存依赖价格前必须先填写输入价格。",
@@ -2556,10 +2588,14 @@
"Maximum 200 characters": "最多 200 个字符",
"Maximum 500 characters. Supports Markdown and HTML.": "最多 500 个字符。支持 Markdown 和 HTML。",
"Maximum check-in quota": "签到最大额度",
+ "Maximum input Tokens": "最多输入 Token",
"Maximum input window": "最大输入窗口",
"Maximum number of tokens each user can create. Default 1000. Setting too large may affect performance.": "每个用户可创建的最大令牌数量。默认 1000。设置过大可能会影响性能。",
"Maximum number of tokens in the response": "响应中最大 token 数",
+ "Maximum output Tokens": "最多输出 Token",
"Maximum quota amount awarded for check-in": "签到奖励的最大额度",
+ "Maximum standalone usage across the full plan validity period.": "套餐整个有效期内单独使用该模型的最大用量。",
+ "Maximum standalone usage within each {{period}} reset period.": "每个重置周期({{period}})内单独使用该模型的最大用量。",
"Maximum tokens including hidden reasoning tokens": "最大 token 数(含隐藏的推理 token)",
"Maximum tokens per response": "单次响应最大 token 数",
"Maximum tokens per user": "每个用户的最大令牌数",
@@ -2579,9 +2615,12 @@
"min downtime": "分钟停机",
"Min Top-up": "最低充值",
"Min Top-up:": "最低充值:",
+ "Mini": "迷你包",
"MiniMax": "MiniMax",
"Minimum check-in quota": "签到最小额度",
+ "Minimum Input (1M)": "最低输入(1M)",
"Minimum LinuxDO trust level required": "所需的最低 LinuxDO 信任级别",
+ "Minimum Output (1M)": "最低输出(1M)",
"Minimum quota amount awarded for check-in": "签到奖励的最小额度",
"Minimum recharge amount in USD": "最低充值金额(美元)",
"Minimum recharge amount to qualify for this discount.": "符合此折扣的最低充值金额。",
@@ -2612,6 +2651,7 @@
"Model Analytics": "模型数据分析",
"Model Analytics Defaults": "模型分析默认设置",
"Model Analytics Filters": "模型分析筛选",
+ "Model Authenticity": "模型真实性",
"model billing support": "模型计费支持",
"Model Call Analytics": "模型调用分析",
"Model context usage": "模型上下文用量",
@@ -2642,6 +2682,7 @@
"Model not found": "模型未找到",
"Model performance metrics": "模型性能指标",
"Model Price": "模型价格",
+ "Model Price Comparison": "模型价格对比",
"Model price is not configured. Please complete model pricing in settings.": "模型价格未配置,请前往设置补充模型价格。",
"Model Price Not Configured": "模型价格未配置",
"Model prices": "模型价格",
@@ -2654,7 +2695,7 @@
"Model Regex": "模型正则",
"Model Regex (one per line)": "模型正则(每行一个)",
"Model selected": "已选择模型",
- "Model Square": "模型广场",
+ "Model Square": "模型定价",
"Model Tags": "模型标签",
"Model to use for testing": "用于测试的模型",
"Model to use when testing channel connectivity": "测试渠道连接时使用的模型",
@@ -2696,7 +2737,9 @@
"months": "个月",
"Moonshot": "Moonshot",
"More": "更多",
+ "More affordable routes are available. For stable access, replace BaseUrl with:": "还有更多低价渠道,稳定流畅,只需要将BaseUrl替换为:",
"More Apps": "更多",
+ "More credits for regular chat, coding, and daily use.": "更多额度,适合日常对话、编程和使用。",
"more mapping": "更多映射",
"More templates...": "更多模板...",
"More than 999 days left": "剩余超过 999 天",
@@ -2865,6 +2908,7 @@
"No matching token and channel usage was found.": "未找到匹配的令牌与渠道用量。",
"No messages yet": "暂无消息",
"No missing models found.": "未找到缺失的模型。",
+ "No model downgrades or substitutions": "不降智不造假",
"No model found.": "未找到模型。",
"No model mappings configured. Click \"Add Mapping\" to get started.": "未配置模型映射。点击“添加映射”即可开始使用。",
"No model price changes to save": "没有模型价格变更需要保存",
@@ -2901,6 +2945,7 @@
"No preference": "无偏好",
"No prefill groups yet": "暂无预填充分组",
"No price differences found": "未发现价格差异",
+ "No pricing data available": "暂无价格数据",
"No processable upstream model updates for this channel": "该渠道暂无可处理的上游模型更新",
"No products configured. Click \"Add product\" to get started.": "未配置产品。点击 \"添加产品\" 开始。",
"No products match your search": "没有产品匹配您的搜索",
@@ -3006,12 +3051,14 @@
"Official documentation": "官方说明",
"Official Gemini from OpenAI Chat": "官方 Gemini(OpenAI Chat 入口)",
"Official Gemini Native": "官方 Gemini 原生",
+ "Official Input / Output (1M)": "官方输入/输出(1M)",
"Official OpenAI Chat": "官方 OpenAI Chat",
"Official OpenAI Embeddings": "官方 OpenAI Embeddings",
"Official OpenAI Images": "官方 OpenAI Images",
"Official OpenAI Responses": "官方 OpenAI Responses",
"Official Repository": "官方仓库",
"Official Sync": "官方同步",
+ "Officially funded accounts": "正规充值账号",
"OhMyGPT": "OhMyGPT",
"OIDC": "OIDC",
"OIDC Client ID": "OIDC 客户端 ID",
@@ -3125,6 +3172,7 @@
"Other users": "其他用户",
"Outage": "中断",
"Output": "输出",
+ "Output (1M)": "输出(1M)",
"Output aspect ratio": "输出宽高比",
"Output image size": "输出图像尺寸",
"Output price": "输出价格",
@@ -3274,6 +3322,7 @@
"Performance Settings": "性能设置",
"Performed {{action}} on user {{username}} (ID: {{id}})": "对用户 {{username}}(ID: {{id}})执行 {{action}}",
"Period": "时间范围",
+ "Period Quota": "周期额度",
"Periodically check for upstream model changes": "定期检查上游模型是否有变更",
"Periodically send ping frames to keep streaming connections active.": "定期发送 ping 帧以保持流连接处于活动状态。",
"Permanently delete your account and all data": "永久删除您的帐户和所有数据",
@@ -3340,6 +3389,7 @@
"Please fix JSON errors before saving": "请先修复 JSON 错误再保存",
"Please fix the highlighted fields before saving": "请先修复高亮字段后再保存",
"Please log in with the appropriate credentials": "请使用适当的凭据登录",
+ "Please refresh the page and try again.": "请刷新页面后重试。",
"Please select a container": "请选择一个容器",
"Please select a payment method": "请选择支付方式",
"Please select a primary model": "请选择主模型",
@@ -3439,6 +3489,7 @@
"Pricing mode": "定价模式",
"Pricing Ratios": "定价比例",
"Pricing Type": "定价类型",
+ "Pricing unavailable": "暂无价格",
"Primary Model": "主模型",
"Prioritize reusing the last successful channel based on keys extracted from request context (sticky routing)": "基于请求上下文提取的 Key,优先复用上一次成功的渠道(粘滞选路)",
"Priority": "优先级",
@@ -3765,6 +3816,7 @@
"Reset Passkey for {{username}}? The user will need to register a new Passkey before using passwordless login.": "要重置 {{username}} 的 Passkey 吗?该用户需要重新注册 Passkey 后才能使用无密码登录。",
"Reset password": "重置密码",
"Reset Period": "重置周期",
+ "Reset Plans": "重置套餐",
"Reset prices": "重置价格",
"Reset quota": "重置额度",
"Reset ratios": "重置比例",
@@ -3953,6 +4005,8 @@
"Select a group": "选择一个分组",
"Select a group type": "选择分组类型",
"Select a model to edit pricing": "选择一个模型编辑定价",
+ "Select a plan": "选择套餐",
+ "Select a plan to see the maximum standalone input or output Token capacity for each model.": "选择套餐,查看每个模型单独用于输入或输出时最多可使用的 Token。",
"Select a preset...": "选择一个预设...",
"Select a product": "选择产品",
"Select a role": "选择角色",
@@ -4095,6 +4149,8 @@
"Show": "显示",
"Show All": "显示全部",
"Show all providers including unbound": "显示所有提供商(包括未绑定)",
+ "Show Less": "收起",
+ "Show More": "显示更多",
"Show only bound providers": "仅显示已绑定的提供商",
"Show or hide flow columns": "显示或隐藏分流列",
"Show preview": "显示预览",
@@ -4175,6 +4231,7 @@
"SQLite stores all data in a single file. Make sure that file is persisted when running in containers.": "SQLite 将所有数据存储在单个文件中。在容器中运行时请确保该文件已持久化。",
"SSL/TLS": "SSL/TLS",
"SSRF Protection": "SSRF 保护",
+ "Stable high concurrency": "稳定高并发",
"stale": "失联",
"Standard": "标准",
"Standard price": "标准价格",
@@ -4182,6 +4239,7 @@
"Start a conversation to see messages here": "开始对话以在此处查看消息",
"Start a playground chat": "开始一场游乐场对话",
"Start collecting payments globally without registering a company. Built for indie developers, OPC sole proprietorships, and startups. Waffo Pancake acts as your Merchant of Record, taking on the compliance burden of global payment collection — consumption tax, invoicing, subscription management, refunds, and chargebacks. Solo developers can launch fast and stay focused on product instead of compliance. Onboard in minutes — one prompt to a full integration.": "无需注册公司即可开始全球收款。面向独立开发者、OPC 个体经营者和初创团队构建。Waffo Pancake 作为你的登记商户(Merchant of Record),承担全球收款相关的合规负担,包括消费税、开票、订阅管理、退款和拒付。个人开发者可以快速上线,专注产品而不是合规事务。几分钟即可完成入驻,从一个提示词到完整集成。",
+ "Start for Free": "免费接入",
"Start for free with generous limits. No credit card required.": "免费开始使用,额度充足,无需绑定信用卡。",
"Start Time": "起始时间",
"Started": "启动时间",
@@ -4520,6 +4578,7 @@
"Timing": "耗时",
"Tip": "提示",
"to access this resource.": "访问此资源。",
+ "To avoid account bans, we add simulated prompt words in the requests, which may result in the score not reaching 100%.": "为避免账号被封禁,我们会在请求中加入模拟提示词,因此评分可能无法达到 100%。",
"to confirm": "以确认",
"To Lower": "转小写",
"To Lowercase": "转小写",
@@ -4636,6 +4695,7 @@
"Trend": "趋势",
"Trending down": "下降趋势",
"Trending up": "上升趋势",
+ "Trial": "试用包",
"Triggered garbage collection": "触发垃圾回收",
"Trim leading/trailing whitespace": "去掉字符串头尾空白",
"Trim Prefix": "裁剪前缀",
@@ -4674,6 +4734,7 @@
"Unable to load groups": "无法加载分组",
"Unable to load rankings": "无法加载排行榜",
"Unable to load rankings data": "无法加载排行榜数据",
+ "Unable to load subscription plans": "无法加载订阅套餐",
"Unable to open chat": "无法打开聊天",
"Unable to parse structured pricing": "无法解析为结构化价格",
"Unable to prepare chat link. Please ensure you have an enabled API key.": "无法准备聊天链接。请确保您有一个已启用的 API 密钥。",
@@ -4987,6 +5048,7 @@
"We could not load instances.": "无法加载实例信息。",
"We could not load system tasks.": "无法加载系统任务。",
"We could not load the setup status.": "我们无法加载设置状态。",
+ "We provide 100% official full-performance models. Requests are routed directly to the official address via the official client channel. If certain detection items (such as forced structured output) show as unsupported, this is because the channel itself does not support that capability — not because the model has been replaced or downgraded.": "我们提供 100% 官方满血模型。请求会通过官方客户端渠道直连官方地址。如部分检测项(例如强制结构化输出)显示不支持,是因为该渠道本身不具备该能力,并非模型被替换或降级。",
"We will prompt your device to confirm using biometrics or your hardware key.": "我们将提示您的设备使用生物识别或硬件密钥进行确认。",
"We'll be back online shortly.": "我们将很快恢复在线。",
"Web search": "网络搜索",
@@ -5012,6 +5074,10 @@
"Week": "本周",
"Weekday": "星期",
"Weekly": "每周",
+ "Weekly Business": "周度商务包",
+ "Weekly credits for regular users with a controlled budget.": "面向常规用户的周度额度,预算更可控。",
+ "Weekly Pro": "周度专业包",
+ "Weekly Starter": "周度入门包",
"Weekly token usage by model across the past few weeks": "最近几周内各模型的每周 Token 用量",
"Weekly token usage by model across the past year": "过去一年内按模型分布的每周 Token 使用量",
"Weekly token usage by model since launch": "自上线以来按模型分布的每周 Token 使用量",
diff --git a/web/default/src/i18n/static-keys.ts b/web/default/src/i18n/static-keys.ts
index dcf070c3d710..587bbdaae084 100644
--- a/web/default/src/i18n/static-keys.ts
+++ b/web/default/src/i18n/static-keys.ts
@@ -173,6 +173,50 @@ export const STATIC_I18N_KEYS = [
'Multi-user management with flexible permission allocation',
'Technical Support',
'Professional team providing 24/7 technical support',
+ 'Input (1M)',
+ 'Output (1M)',
+ 'Minimum Input (1M)',
+ 'Minimum Output (1M)',
+ 'Officially funded accounts',
+ 'Direct official access',
+ 'Stable high concurrency',
+ 'No model downgrades or substitutions',
+ 'Zero retention',
+ 'Official Input / Output (1M)',
+ 'Discount',
+ 'Show More',
+ 'Show Less',
+ 'Cache Hit',
+ 'Model Name',
+ 'Image Type',
+
+ // Configured FAQ and subscription plan content resolved at runtime.
+ 'Model Authenticity',
+ 'We provide 100% official full-performance models. Requests are routed directly to the official address via the official client channel. If certain detection items (such as forced structured output) show as unsupported, this is because the channel itself does not support that capability — not because the model has been replaced or downgraded.',
+ 'Detection Results Are Not 100%',
+ 'To avoid account bans, we add simulated prompt words in the requests, which may result in the score not reaching 100%.',
+ 'Contact Us',
+ '[Telegram group](https://t.me/+36iGYj-hkkFkOWRl)',
+ 'Concurrency & Cache Hit Rate',
+ 'Default concurrency is 500, with cache hit rate around 90%.',
+ 'Credit Starter',
+ 'Flexible monthly credits for occasional users.',
+ 'Credit Pro',
+ 'More credits for regular chat, coding, and daily use.',
+ 'Credit Business',
+ 'A larger monthly allowance for frequent professional use.',
+ 'Credit Power',
+ 'A high-capacity credit plan for heavy API usage.',
+ 'Weekly Starter',
+ 'A predictable weekly budget for light, consistent usage.',
+ 'Weekly Pro',
+ 'Weekly credits for regular users with a controlled budget.',
+ 'Trial',
+ 'A one-time low-cost trial for testing core models.',
+ 'Weekly Business',
+ 'A higher weekly allowance for demanding workflows.',
+ 'Mini',
+ 'A small credit pack for light, short-term usage.',
// User management (interpolated keys)
'Remaining Quota ({{currency}})',
diff --git a/web/default/src/lib/currency.ts b/web/default/src/lib/currency.ts
index ae5729615d29..f7a074eabb25 100644
--- a/web/default/src/lib/currency.ts
+++ b/web/default/src/lib/currency.ts
@@ -615,3 +615,16 @@ export function formatLocalCurrencyAmount(
return formatCurrencyValue(amount, merged, meta)
}
+
+/** Format a locally configured subscription amount as its USD-equivalent price. */
+export function formatSubscriptionPlanPrice(
+ amount: number | null | undefined,
+ options?: CurrencyFormatOptions
+): string {
+ if (amount == null || Number.isNaN(amount)) return '-'
+
+ const { config } = getCurrencyDisplay()
+ const exchangeRate = config.usdExchangeRate > 0 ? config.usdExchangeRate : 1
+
+ return formatLocalCurrencyAmount(amount / exchangeRate, options)
+}
diff --git a/web/default/src/lib/localized-content.ts b/web/default/src/lib/localized-content.ts
new file mode 100644
index 000000000000..2197d78beb86
--- /dev/null
+++ b/web/default/src/lib/localized-content.ts
@@ -0,0 +1,52 @@
+/*
+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 .
+
+For commercial licensing, please contact support@quantumnous.com
+*/
+import { normalizeInterfaceLanguage } from '@/i18n/languages'
+
+export type ContentTranslations = Record<
+ string,
+ Record | undefined
+>
+
+export interface TranslatableContent {
+ translations?: ContentTranslations
+}
+
+type Translate = (key: string) => string
+
+export function getLocalizedField<
+ Item extends object,
+ Field extends keyof Item,
+>(
+ item: Item,
+ field: Field,
+ language?: string | null,
+ translate?: Translate
+): string {
+ const locale = normalizeInterfaceLanguage(language)
+ const translations = (item as TranslatableContent).translations
+ const requested = translations?.[locale]?.[String(field)]?.trim()
+ if (requested) return requested
+
+ const english = translations?.en?.[String(field)]?.trim()
+ if (english) return english
+
+ const fallback = item[field]
+ if (typeof fallback !== 'string') return ''
+ return translate ? translate(fallback) : fallback
+}
diff --git a/web/default/src/lib/theme-customization.ts b/web/default/src/lib/theme-customization.ts
index b668033845bb..4039954de2dc 100644
--- a/web/default/src/lib/theme-customization.ts
+++ b/web/default/src/lib/theme-customization.ts
@@ -29,19 +29,6 @@ export const THEME_PRESETS = [
name: 'Default',
swatches: ['oklch(0.13 0 0)', 'oklch(0.95 0 0)'],
},
- {
- // Inspired by Anthropic's official brand language: warm cream canvas
- // (#faf9f5) paired with clay/coral (#d97757) as the single accent.
- // Swatches preview the canvas → accent gradient that defines the system.
- value: 'anthropic',
- name: 'Anthropic',
- swatches: ['oklch(0.984 0.005 95)', 'oklch(0.685 0.142 38)'],
- },
- {
- value: 'simple-large',
- name: 'Simple Large-font',
- swatches: ['oklch(0.15 0 0)', 'oklch(0.99 0 0)'],
- },
{
value: 'underground',
name: 'Underground',
@@ -81,35 +68,11 @@ export const THEME_PRESETS = [
export type ThemePreset = (typeof THEME_PRESETS)[number]['value']
export type ThemeRadius = 'default' | 'none' | 'sm' | 'md' | 'lg' | 'xl'
-export type ThemeScale = 'default' | 'sm' | 'lg' | 'xl'
+export type ThemeScale = 'default' | 'sm' | 'lg'
export type ContentLayout = 'full' | 'centered'
-/**
- * Font axis for the theme.
- *
- * - `default` — resolve at runtime from the active preset
- * (see `PRESET_DEFAULT_FONT`). The shipped `default` and `anthropic`
- * presets resolve to serif; other named color presets fall back to
- * sans unless they list a different choice. Mirrors how
- * `radius: 'default'` defers to a per-preset hint.
- * - `sans` — humanist sans (Public Sans), the project's UI fallback.
- * - `serif` — editorial serif (Lora + CJK fallbacks), the project's
- * "soul" typography. Inherits across the whole UI; monospace contexts
- * keep their own family via Tailwind preflight and `.font-mono`.
- */
-export type ThemeFont = 'default' | 'sans' | 'serif'
-
-/**
- * The resolved (non-`default`) font value applied to the DOM. The provider
- * always sets `data-theme-font` to one of these concrete values so CSS only
- * needs simple attribute selectors (no `:not()` gymnastics, no per-preset
- * font branches).
- */
-export type ResolvedThemeFont = Exclude
-
export type ThemeCustomization = {
preset: ThemePreset
- font: ThemeFont
radius: ThemeRadius
scale: ThemeScale
contentLayout: ContentLayout
@@ -117,7 +80,6 @@ export type ThemeCustomization = {
export const DEFAULT_THEME_CUSTOMIZATION: ThemeCustomization = {
preset: 'default',
- font: 'default',
radius: 'default',
scale: 'default',
contentLayout: 'full',
@@ -127,12 +89,6 @@ export const THEME_PRESET_VALUES = new Set(
THEME_PRESETS.map((p) => p.value)
) as ReadonlySet
-export const THEME_FONT_VALUES: ReadonlySet = new Set([
- 'default',
- 'sans',
- 'serif',
-])
-
export const THEME_RADIUS_VALUES: ReadonlySet = new Set([
'default',
'none',
@@ -146,7 +102,6 @@ export const THEME_SCALE_VALUES: ReadonlySet = new Set([
'default',
'sm',
'lg',
- 'xl',
])
export const CONTENT_LAYOUT_VALUES: ReadonlySet = new Set([
@@ -156,42 +111,7 @@ export const CONTENT_LAYOUT_VALUES: ReadonlySet = new Set([
export const THEME_COOKIE_KEYS = {
preset: 'theme_preset',
- font: 'theme_font',
radius: 'theme_radius',
scale: 'theme_scale',
contentLayout: 'theme_content_layout',
} as const
-
-/**
- * Preset → default font mapping. Used by the provider to resolve the user's
- * `font: 'default'` preference against the active preset.
- *
- * Co-located with the preset registry so a preset's signature typography
- * is declared in one place. Presets not listed here fall back to the
- * `resolveThemeFont` default of `sans`. The shipped `default` preset
- * opts into serif so the editorial Lora voice is the out-of-the-box
- * experience; vivid color presets stay on the humanist sans so their
- * accents read clearly without competing with the body type.
- */
-export const PRESET_DEFAULT_FONT: Partial<
- Record
-> = {
- default: 'sans',
- anthropic: 'serif',
-}
-
-/**
- * Resolve a user font preference + active preset into the concrete font that
- * should drive the DOM. Pure function so it's safe to call inside both the
- * effect that applies the attribute and the UI preview that hints at what
- * `default` will render as.
- */
-export function resolveThemeFont(
- font: ThemeFont,
- preset: ThemePreset
-): ResolvedThemeFont {
- if (font === 'default') {
- return PRESET_DEFAULT_FONT[preset] ?? 'sans'
- }
- return font
-}
diff --git a/web/default/src/routeTree.gen.ts b/web/default/src/routeTree.gen.ts
index e0add2a9b93d..019393c31836 100644
--- a/web/default/src/routeTree.gen.ts
+++ b/web/default/src/routeTree.gen.ts
@@ -11,6 +11,7 @@
import { Route as rootRouteImport } from './routes/__root'
import { Route as UserAgreementRouteImport } from './routes/user-agreement'
import { Route as PrivacyPolicyRouteImport } from './routes/privacy-policy'
+import { Route as PlansRouteImport } from './routes/plans'
import { Route as AuthenticatedRouteRouteImport } from './routes/_authenticated/route'
import { Route as authRouteRouteImport } from './routes/(auth)/route'
import { Route as IndexRouteImport } from './routes/index'
@@ -80,6 +81,11 @@ const PrivacyPolicyRoute = PrivacyPolicyRouteImport.update({
path: '/privacy-policy',
getParentRoute: () => rootRouteImport,
} as any)
+const PlansRoute = PlansRouteImport.update({
+ id: '/plans',
+ path: '/plans',
+ getParentRoute: () => rootRouteImport,
+} as any)
const AuthenticatedRouteRoute = AuthenticatedRouteRouteImport.update({
id: '/_authenticated',
getParentRoute: () => rootRouteImport,
@@ -401,6 +407,7 @@ const AuthenticatedSystemSettingsAuthSectionRoute =
export interface FileRoutesByFullPath {
'/': typeof IndexRoute
+ '/plans': typeof PlansRoute
'/privacy-policy': typeof PrivacyPolicyRoute
'/user-agreement': typeof UserAgreementRoute
'/system-settings': typeof AuthenticatedSystemSettingsRouteRouteWithChildren
@@ -461,6 +468,7 @@ export interface FileRoutesByFullPath {
}
export interface FileRoutesByTo {
'/': typeof IndexRoute
+ '/plans': typeof PlansRoute
'/privacy-policy': typeof PrivacyPolicyRoute
'/user-agreement': typeof UserAgreementRoute
'/forgot-password': typeof authForgotPasswordRoute
@@ -523,6 +531,7 @@ export interface FileRoutesById {
'/': typeof IndexRoute
'/(auth)': typeof authRouteRouteWithChildren
'/_authenticated': typeof AuthenticatedRouteRouteWithChildren
+ '/plans': typeof PlansRoute
'/privacy-policy': typeof PrivacyPolicyRoute
'/user-agreement': typeof UserAgreementRoute
'/_authenticated/system-settings': typeof AuthenticatedSystemSettingsRouteRouteWithChildren
@@ -585,6 +594,7 @@ export interface FileRouteTypes {
fileRoutesByFullPath: FileRoutesByFullPath
fullPaths:
| '/'
+ | '/plans'
| '/privacy-policy'
| '/user-agreement'
| '/system-settings'
@@ -645,6 +655,7 @@ export interface FileRouteTypes {
fileRoutesByTo: FileRoutesByTo
to:
| '/'
+ | '/plans'
| '/privacy-policy'
| '/user-agreement'
| '/forgot-password'
@@ -706,6 +717,7 @@ export interface FileRouteTypes {
| '/'
| '/(auth)'
| '/_authenticated'
+ | '/plans'
| '/privacy-policy'
| '/user-agreement'
| '/_authenticated/system-settings'
@@ -769,6 +781,7 @@ export interface RootRouteChildren {
IndexRoute: typeof IndexRoute
authRouteRoute: typeof authRouteRouteWithChildren
AuthenticatedRouteRoute: typeof AuthenticatedRouteRouteWithChildren
+ PlansRoute: typeof PlansRoute
PrivacyPolicyRoute: typeof PrivacyPolicyRoute
UserAgreementRoute: typeof UserAgreementRoute
errors401Route: typeof errors401Route
@@ -802,6 +815,13 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof PrivacyPolicyRouteImport
parentRoute: typeof rootRouteImport
}
+ '/plans': {
+ id: '/plans'
+ path: '/plans'
+ fullPath: '/plans'
+ preLoaderRoute: typeof PlansRouteImport
+ parentRoute: typeof rootRouteImport
+ }
'/_authenticated': {
id: '/_authenticated'
path: ''
@@ -1347,6 +1367,7 @@ const rootRouteChildren: RootRouteChildren = {
IndexRoute: IndexRoute,
authRouteRoute: authRouteRouteWithChildren,
AuthenticatedRouteRoute: AuthenticatedRouteRouteWithChildren,
+ PlansRoute: PlansRoute,
PrivacyPolicyRoute: PrivacyPolicyRoute,
UserAgreementRoute: UserAgreementRoute,
errors401Route: errors401Route,
diff --git a/web/default/src/routes/index.tsx b/web/default/src/routes/index.tsx
index 1fe03393d6aa..0255e357eb7c 100644
--- a/web/default/src/routes/index.tsx
+++ b/web/default/src/routes/index.tsx
@@ -17,7 +17,6 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute } from '@tanstack/react-router'
-
import { Home } from '@/features/home'
export const Route = createFileRoute('/')({
diff --git a/web/default/src/routes/plans.tsx b/web/default/src/routes/plans.tsx
new file mode 100644
index 000000000000..480aa47e8659
--- /dev/null
+++ b/web/default/src/routes/plans.tsx
@@ -0,0 +1,25 @@
+/*
+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 .
+
+For commercial licensing, please contact support@quantumnous.com
+*/
+import { createFileRoute } from '@tanstack/react-router'
+
+import { Plans } from '@/features/subscription-plan-estimator'
+
+export const Route = createFileRoute('/plans')({
+ component: Plans,
+})
diff --git a/web/default/src/styles/index.css b/web/default/src/styles/index.css
index 8e44e5b8f867..0e9097438cc0 100644
--- a/web/default/src/styles/index.css
+++ b/web/default/src/styles/index.css
@@ -20,25 +20,12 @@ For commercial licensing, please contact support@quantumnous.com
@import 'tw-animate-css';
@import 'shadcn/tailwind.css';
@import '@fontsource-variable/public-sans';
-/* Editorial serif (Lora) backing the `serif` font axis and the Anthropic
- * preset's default typography. See `--font-serif` in theme.css for the
- * full Latin + CJK fallback stack and `theme-presets.css` for the cascade
- * that activates it. Loaded globally so font-switching is instantaneous
- * with no FOUT once the variable is fetched. */
-@import '@fontsource-variable/lora';
@import './theme.css';
@import './theme-presets.css';
/* Shiki dual themes: token colors follow dark theme (pre background stays `bg-background` on the block) */
@layer components {
- .shiki span {
- color: var(--shiki-light) !important;
- font-style: var(--shiki-light-font-style) !important;
- font-weight: var(--shiki-light-font-weight) !important;
- text-decoration: var(--shiki-light-text-decoration) !important;
- }
-
.dark .shiki span {
color: var(--shiki-dark) !important;
font-style: var(--shiki-dark-font-style) !important;
@@ -57,11 +44,11 @@ For commercial licensing, please contact support@quantumnous.com
@apply overflow-x-hidden font-sans;
}
body {
- @apply bg-background text-foreground has-[div[data-variant='inset']]:bg-sidebar min-h-svh w-full;
- /* Font is driven by the theme's font axis via `--font-body`
- * (defined in theme.css, swapped by `[data-theme-font='...']` blocks
- * in theme-presets.css). Defaults to the project's humanist sans. */
- font-family: var(--font-body);
+ @apply bg-background text-foreground has-[div[data-variant='inset']]:bg-sidebar min-h-svh w-full font-sans;
+ background-image:
+ radial-gradient(circle at 14% 8%, oklch(0.96 0.025 68 / 65%), transparent 38%),
+ radial-gradient(circle at 86% 0%, oklch(0.93 0.04 48 / 35%), transparent 42%);
+ background-attachment: fixed;
}
/* Keep sticky headers stable while primitives lock body scrolling. */
@@ -85,6 +72,23 @@ For commercial licensing, please contact support@quantumnous.com
}
}
+@layer components {
+ [data-slot='sidebar-inset'] {
+ background: linear-gradient(
+ 180deg,
+ color-mix(in oklch, var(--card) 90%, var(--background) 10%) 0%,
+ color-mix(in oklch, var(--card) 82%, var(--background) 18%) 100%
+ );
+ box-shadow: 0 18px 46px -28px color-mix(in oklch, var(--foreground) 18%, transparent);
+ }
+
+ [data-slot='header'] {
+ backdrop-filter: blur(10px);
+ background-color: color-mix(in oklch, var(--background) 82%, transparent);
+ border-bottom: 1px solid color-mix(in oklch, var(--border) 70%, transparent);
+ }
+}
+
/* Vercel Geist-style skeleton shimmer */
.skeleton-shimmer {
background: linear-gradient(
@@ -153,18 +157,6 @@ For commercial licensing, please contact support@quantumnous.com
scrollbar-width: none; /* Firefox */
}
-/* Tooltip content can still scroll, but should not show a distracting axis. */
-[data-slot='tooltip-content'],
-[data-slot='tooltip-content'] * {
- -ms-overflow-style: none;
- scrollbar-width: none;
-}
-
-[data-slot='tooltip-content']::-webkit-scrollbar,
-[data-slot='tooltip-content'] *::-webkit-scrollbar {
- display: none;
-}
-
@utility hover-scrollbar {
/* Hide scrollbar by default */
scrollbar-width: thin;
@@ -484,19 +476,19 @@ For commercial licensing, please contact support@quantumnous.com
/* Micro-interactions — Vercel-style subtle hover/active feedback */
@media (prefers-reduced-motion: no-preference) {
- [data-slot='card']:not([data-card-hover='false']) {
+ [data-slot='card'] {
transition:
transform 150ms ease,
box-shadow 150ms ease;
}
@media (min-width: 641px) {
- [data-slot='card']:not([data-card-hover='false']):hover {
+ [data-slot='card']:hover {
transform: translateY(-1px);
box-shadow: 0 4px 12px rgb(0 0 0 / 0.06);
}
- .dark [data-slot='card']:not([data-card-hover='false']):hover {
+ .dark [data-slot='card']:hover {
box-shadow: 0 4px 12px rgb(0 0 0 / 0.3);
}
}
@@ -612,3 +604,83 @@ For commercial licensing, please contact support@quantumnous.com
animation: none !important;
}
}
+
+/* ==================== Home page classic styles ==================== */
+.home-claude {
+ background:
+ radial-gradient(circle at 8% 12%, rgba(246, 236, 221, 0.95), transparent 36%),
+ radial-gradient(circle at 92% 10%, rgba(238, 224, 204, 0.78), transparent 40%),
+ linear-gradient(180deg, #fbf6ef 0%, #f7efe2 55%, #f3e9db 100%);
+}
+
+.dark .home-claude {
+ background:
+ radial-gradient(circle at 8% 12%, rgba(60, 50, 35, 0.6), transparent 36%),
+ radial-gradient(circle at 92% 10%, rgba(55, 45, 30, 0.5), transparent 40%),
+ linear-gradient(180deg, #1a1712 0%, #161410 55%, #12100c 100%);
+}
+
+.home-claude .blur-ball-indigo {
+ background: radial-gradient(circle, rgba(221, 193, 162, 0.42) 0%, rgba(221, 193, 162, 0) 72%);
+}
+
+.dark .home-claude .blur-ball-indigo {
+ background: radial-gradient(circle, rgba(180, 150, 110, 0.3) 0%, rgba(180, 150, 110, 0) 72%);
+}
+
+.home-claude .blur-ball-teal {
+ background: radial-gradient(circle, rgba(204, 176, 142, 0.38) 0%, rgba(204, 176, 142, 0) 70%);
+}
+
+.dark .home-claude .blur-ball-teal {
+ background: radial-gradient(circle, rgba(160, 140, 100, 0.28) 0%, rgba(160, 140, 100, 0) 70%);
+}
+
+.home-claude .shine-text {
+ background: linear-gradient(96deg, #7e4a2f 0%, #9d5f3a 45%, #6d3f28 100%);
+ -webkit-background-clip: text;
+ background-clip: text;
+ color: transparent;
+ text-shadow: none;
+}
+
+.dark .home-claude .shine-text {
+ background: linear-gradient(96deg, #c49a6c 0%, #d4a87a 45%, #b08a5e 100%);
+ -webkit-background-clip: text;
+ background-clip: text;
+ color: transparent;
+}
+
+/* Banner background blur balls */
+.blur-ball {
+ position: absolute;
+ width: 360px;
+ height: 360px;
+ border-radius: 50%;
+ filter: blur(120px);
+ pointer-events: none;
+ z-index: -1;
+}
+
+.blur-ball-indigo {
+ background: #6366f1;
+ top: 40px;
+ left: 50%;
+ transform: translateX(-50%);
+ opacity: 0.5;
+}
+
+.blur-ball-teal {
+ background: #14b8a6;
+ top: 200px;
+ left: 30%;
+ opacity: 0.4;
+}
+
+html:not(.dark) .blur-ball-indigo {
+ opacity: 0.25;
+}
+
+html:not(.dark) .blur-ball-teal {
+ opacity: 0.2;
+}
diff --git a/web/default/src/styles/theme-presets.css b/web/default/src/styles/theme-presets.css
index d96033322d20..7f9b18b3b731 100644
--- a/web/default/src/styles/theme-presets.css
+++ b/web/default/src/styles/theme-presets.css
@@ -291,136 +291,11 @@ For commercial licensing, please contact support@quantumnous.com
--sidebar-ring: oklch(0.6359 0.1699 307.95);
}
-/* ── Simple Large-font ────────────────────────────────────────────────── */
-[data-theme-preset='simple-large'] {
- --background: oklch(0.99 0 0);
- --foreground: oklch(0.15 0 0);
- --card: oklch(1 0 0);
- --card-foreground: oklch(0.15 0 0);
- --popover: oklch(1 0 0);
- --popover-foreground: oklch(0.15 0 0);
-
- --primary: oklch(0.22 0 0);
- --primary-foreground: oklch(1 0 0);
- --secondary: oklch(0.93 0 0);
- --secondary-foreground: oklch(0.15 0 0);
- --muted: oklch(0.95 0 0);
- --muted-foreground: oklch(0.36 0 0);
- --accent: oklch(0.91 0 0);
- --accent-foreground: oklch(0.15 0 0);
-
- --destructive: oklch(0.55 0.2 28);
- --destructive-foreground: oklch(1 0 0);
- --success: oklch(0.45 0.12 145);
- --success-foreground: oklch(1 0 0);
- --warning: oklch(0.72 0.14 75);
- --warning-foreground: oklch(0.15 0 0);
- --info: oklch(0.48 0.13 250);
- --info-foreground: oklch(1 0 0);
- --neutral: oklch(0.36 0 0);
- --neutral-foreground: oklch(1 0 0);
-
- --border: oklch(0.82 0 0);
- --input: oklch(0.82 0 0);
- --ring: oklch(0.22 0 0);
-
- --chart-1: oklch(0.22 0 0);
- --chart-2: oklch(0.45 0.12 145);
- --chart-3: oklch(0.48 0.13 250);
- --chart-4: oklch(0.72 0.14 75);
- --chart-5: oklch(0.55 0.2 28);
-
- --sidebar: oklch(0.96 0 0);
- --sidebar-foreground: oklch(0.15 0 0);
- --sidebar-primary: oklch(0.22 0 0);
- --sidebar-primary-foreground: oklch(1 0 0);
- --sidebar-accent: oklch(0.9 0 0);
- --sidebar-accent-foreground: oklch(0.15 0 0);
- --sidebar-border: oklch(0.82 0 0);
- --sidebar-ring: oklch(0.22 0 0);
-
- --skeleton-base: oklch(0.9 0 0);
- --skeleton-highlight: oklch(0.97 0 0);
-
- --radius: 0.5rem;
- --text-xs: 0.9rem;
- --text-sm: 1rem;
- --text-base: 1.125rem;
- --text-lg: 1.25rem;
- --text-xl: 1.45rem;
- --text-2xl: 1.75rem;
- --text-3xl: 2.15rem;
- --spacing: 0.3rem;
-}
-.dark [data-theme-preset='simple-large'] {
- --background: oklch(0.215 0 0);
- --foreground: oklch(0.97 0 0);
- --card: oklch(0.27 0 0);
- --card-foreground: oklch(0.97 0 0);
- --popover: oklch(0.29 0 0);
- --popover-foreground: oklch(0.97 0 0);
-
- --primary: oklch(0.94 0 0);
- --primary-foreground: oklch(0.145 0 0);
- --secondary: oklch(0.315 0 0);
- --secondary-foreground: oklch(0.97 0 0);
- --muted: oklch(0.315 0 0);
- --muted-foreground: oklch(0.82 0 0);
- --accent: oklch(0.36 0 0);
- --accent-foreground: oklch(0.98 0 0);
-
- --destructive: oklch(0.68 0.19 25);
- --destructive-foreground: oklch(0.98 0 0);
- --success: oklch(0.72 0.13 145);
- --success-foreground: oklch(0.145 0 0);
- --warning: oklch(0.82 0.13 75);
- --warning-foreground: oklch(0.145 0 0);
- --info: oklch(0.72 0.12 250);
- --info-foreground: oklch(0.145 0 0);
- --neutral: oklch(0.82 0 0);
- --neutral-foreground: oklch(0.145 0 0);
-
- --border: oklch(1 0 0 / 18%);
- --input: oklch(1 0 0 / 24%);
- --ring: oklch(0.94 0 0);
-
- --chart-1: oklch(0.94 0 0);
- --chart-2: oklch(0.72 0.13 145);
- --chart-3: oklch(0.72 0.12 250);
- --chart-4: oklch(0.82 0.13 75);
- --chart-5: oklch(0.68 0.19 25);
-
- --sidebar: oklch(0.205 0 0);
- --sidebar-foreground: oklch(0.97 0 0);
- --sidebar-primary: oklch(0.94 0 0);
- --sidebar-primary-foreground: oklch(0.145 0 0);
- --sidebar-accent: oklch(0.34 0 0);
- --sidebar-accent-foreground: oklch(0.98 0 0);
- --sidebar-border: oklch(1 0 0 / 18%);
- --sidebar-ring: oklch(0.94 0 0);
-
- --skeleton-base: oklch(0.315 0 0);
- --skeleton-highlight: oklch(0.415 0 0);
-}
-
/* ── Semantic surface bridge ──────────────────────────────────────────── */
/* Color presets should tint the surfaces most components actually use, not
* only primary buttons. These derived tokens keep the app theme-aware without
- * duplicating per-component dark-mode overrides.
- *
- * NOTE: `:not()` contributes its argument's specificity, so this selector
- * resolves to (0,3,0). Presets that define bespoke surfaces below need to
- * either match that specificity or opt out here — the latter is cleaner.
- *
- * Opt-outs:
- * - `default`: keeps neutral surfaces from :root.
- * - `anthropic`: warm cream surfaces are a brand choice, NOT a primary-mix
- * derivation (the Anthropic system deliberately uses warm neutrals for
- * cards/borders rather than tinting them with the clay accent).
- * - `simple-large`: keeps intentionally neutral, high-contrast surfaces. */
-[data-theme-preset]:not([data-theme-preset='default']):not(
- [data-theme-preset='anthropic']
- ):not([data-theme-preset='simple-large']) {
+ * duplicating per-component dark-mode overrides. */
+[data-theme-preset]:not([data-theme-preset='default']) {
--card: color-mix(in oklch, var(--primary) 3%, var(--background));
--popover: color-mix(in oklch, var(--primary) 5%, var(--background));
--muted: color-mix(in oklch, var(--primary) 7%, var(--background));
@@ -442,10 +317,7 @@ For commercial licensing, please contact support@quantumnous.com
--info: var(--chart-1);
--neutral: var(--muted-foreground);
}
-.dark
- [data-theme-preset]:not([data-theme-preset='default']):not(
- [data-theme-preset='anthropic']
- ):not([data-theme-preset='simple-large']) {
+.dark [data-theme-preset]:not([data-theme-preset='default']) {
--card: color-mix(in oklch, var(--primary) 8%, var(--background));
--popover: color-mix(in oklch, var(--primary) 12%, var(--background));
--muted: color-mix(in oklch, var(--primary) 12%, var(--background));
@@ -462,213 +334,6 @@ For commercial licensing, please contact support@quantumnous.com
--sidebar-border: color-mix(in oklch, var(--primary) 22%, var(--background));
}
-/* ── Anthropic ────────────────────────────────────────────────────────── */
-/*
- * Inspired by Anthropic's official brand language: warm cream canvas
- * (#faf9f5) on warm slate ink (#141413), with clay/coral (#d97757) as the
- * single primary accent. The dormant accent palette (olive, sky, fig,
- * cactus) is wired into chart and semantic tokens.
- *
- * Defining counter-positioning: a tinted (non-white) canvas with warm
- * neutral cards and borders — NOT primary-tinted surfaces. This is the
- * brand's deliberate counter-positioning against every cool-gray AI tool.
- *
- * Anthropic is opted out of the semantic surface bridge above so these
- * bespoke warm-neutral surface tokens win the cascade. Without the opt-out,
- * the bridge selector (specificity 0,3,0 because of `:not()`) would override
- * this block (specificity 0,1,0) and tint every surface with the clay
- * accent — producing the peach/pink look that doesn't match Anthropic.
- *
- * OKLCH hue 95 = warm yellow-cream (matches #faf9f5 family);
- * OKLCH hue 60 = warm slate (matches #141413 family);
- * OKLCH hue 38 = clay/coral (matches #d97757).
- */
-[data-theme-preset='anthropic'] {
- /* Canvas + ink — the defining pair. */
- --background: oklch(0.984 0.004 95); /* ≈ #faf9f5 cream */
- --foreground: oklch(0.205 0.005 60); /* ≈ #141413 ink */
-
- /* Warm-neutral surfaces (NOT primary-tinted). Stepped opacity matches
- * the Anthropic surface ladder: canvas → secondary → card → strong. */
- --card: oklch(0.945 0.008 92); /* ≈ #efe9de */
- --card-foreground: oklch(0.205 0.005 60);
- --popover: oklch(0.97 0.006 92); /* slight cream lift */
- --popover-foreground: oklch(0.205 0.005 60);
-
- /* Clay/coral — Anthropic's signature accent, used scarcely on CTAs. */
- --primary: oklch(0.685 0.142 38); /* ≈ #d97757 */
- --primary-foreground: oklch(0.99 0.005 95);
-
- --secondary: oklch(0.925 0.008 92);
- --secondary-foreground: oklch(0.255 0.005 60);
-
- --muted: oklch(0.94 0.007 92);
- --muted-foreground: oklch(0.51 0.006 75); /* ≈ #5e5d59 warm gray */
- --accent: oklch(0.92 0.009 92);
- --accent-foreground: oklch(0.205 0.005 60);
-
- --destructive: oklch(0.55 0.18 27);
- --destructive-foreground: oklch(0.985 0 0);
- --success: oklch(0.59 0.082 130); /* olive #788c5d */
- --success-foreground: oklch(0.985 0 0);
- --warning: oklch(0.78 0.13 70); /* kraft amber */
- --warning-foreground: oklch(0.205 0.005 60);
- --info: oklch(0.67 0.075 248); /* sky #6a9bcc */
- --info-foreground: oklch(0.985 0 0);
- --neutral: oklch(0.51 0.006 75);
- --neutral-foreground: oklch(0.205 0.005 60);
-
- /* Hairline borders — warm gray, not coral. */
- --border: oklch(0.895 0.008 92); /* ≈ #e8e6dc */
- --input: oklch(0.895 0.008 92);
- --ring: oklch(0.685 0.142 38);
-
- /* Chart palette uses Anthropic's dormant accent swatches. */
- --chart-1: oklch(0.685 0.142 38); /* clay */
- --chart-2: oklch(0.59 0.082 130); /* olive */
- --chart-3: oklch(0.67 0.075 248); /* sky */
- --chart-4: oklch(0.7 0.115 0); /* fig */
- --chart-5: oklch(0.83 0.027 175); /* cactus */
-
- --sidebar: oklch(0.955 0.008 92);
- --sidebar-foreground: oklch(0.255 0.005 60);
- --sidebar-primary: oklch(0.685 0.142 38);
- --sidebar-primary-foreground: oklch(0.99 0.005 95);
- --sidebar-accent: oklch(0.915 0.009 92);
- --sidebar-accent-foreground: oklch(0.205 0.005 60);
- --sidebar-border: oklch(0.895 0.008 92);
- --sidebar-ring: oklch(0.685 0.142 38);
-
- --skeleton-base: oklch(0.93 0.008 92);
- --skeleton-highlight: oklch(0.96 0.006 92);
-
- --radius: 0.625rem;
-
- /* Default typography for the Anthropic preset is the editorial serif.
- * Users can override this with the Font axis (`data-theme-font='sans'`).
- * The `--font-serif` token itself is declared once in theme.css. */
- --font-body: var(--font-serif);
-}
-.dark [data-theme-preset='anthropic'] {
- /* Warm near-black product surfaces, not pure black — keeps the editorial
- * personality even when inverted. Coral lifts slightly for legibility. */
- --background: oklch(0.215 0.004 60);
- --foreground: oklch(0.965 0.005 92);
- --card: oklch(0.255 0.004 60);
- --card-foreground: oklch(0.965 0.005 92);
- --popover: oklch(0.275 0.004 60);
- --popover-foreground: oklch(0.965 0.005 92);
-
- --primary: oklch(0.72 0.135 40);
- --primary-foreground: oklch(0.18 0.005 60);
- --secondary: oklch(0.305 0.004 60);
- --secondary-foreground: oklch(0.945 0.005 92);
-
- --muted: oklch(0.285 0.004 60);
- --muted-foreground: oklch(0.76 0.006 75);
- --accent: oklch(0.33 0.006 60);
- --accent-foreground: oklch(0.985 0.005 92);
-
- --destructive: oklch(0.7 0.19 22);
- --destructive-foreground: oklch(0.985 0 0);
- --success: oklch(0.7 0.105 135);
- --success-foreground: oklch(0.18 0.005 60);
- --warning: oklch(0.78 0.13 70);
- --warning-foreground: oklch(0.18 0.005 60);
- --info: oklch(0.72 0.085 248);
- --info-foreground: oklch(0.18 0.005 60);
- --neutral: oklch(0.76 0.006 75);
- --neutral-foreground: oklch(0.18 0.005 60);
-
- --border: oklch(1 0 0 / 10%);
- --input: oklch(1 0 0 / 16%);
- --ring: oklch(0.72 0.135 40);
-
- --chart-1: oklch(0.72 0.135 40);
- --chart-2: oklch(0.7 0.105 135);
- --chart-3: oklch(0.72 0.085 248);
- --chart-4: oklch(0.78 0.13 0);
- --chart-5: oklch(0.83 0.027 175);
-
- --sidebar: oklch(0.205 0.004 60);
- --sidebar-foreground: oklch(0.95 0.005 92);
- --sidebar-primary: oklch(0.72 0.135 40);
- --sidebar-primary-foreground: oklch(0.18 0.005 60);
- --sidebar-accent: oklch(0.32 0.006 60);
- --sidebar-accent-foreground: oklch(0.985 0.005 92);
- --sidebar-border: oklch(1 0 0 / 11%);
- --sidebar-ring: oklch(0.72 0.135 40);
-
- --skeleton-base: oklch(0.305 0.004 60);
- --skeleton-highlight: oklch(0.41 0.004 60);
-}
-
-/* ── Font axis ────────────────────────────────────────────────────────────
- * Mirrors how `data-theme-radius` overrides a preset's default radius:
- * presets may set `--font-body` (Anthropic → serif), and the user's
- * explicit Font choice wins because these blocks sit AFTER preset blocks.
- *
- * The provider resolves `font: 'default'` → `'sans' | 'serif'` against the
- * active preset before writing the attribute, so the DOM always carries a
- * concrete value and CSS only needs the simple `[data-theme-font='serif']`
- * selector below (no `:not()`, no per-preset branches). */
-[data-theme-font='sans'] {
- --font-body: var(--font-sans);
-}
-[data-theme-font='serif'] {
- --font-body: var(--font-serif);
-}
-
-/* ── Serif typography refinements ────────────────────────────────────────
- * When the body runs in serif, three things happen:
- * 1. Editorial OpenType features (kern/liga + tabular numerals so numeric
- * columns stay grid-aligned even with proportional serif glyphs).
- * 2. Every UI surface inherits the editorial voice — buttons, inputs,
- * tabs, sidebar, table headers, badges, pagination, popovers — all
- * through Tailwind preflight's `button, input, ... { font: inherit }`
- * rule plus natural HTML inheritance. We intentionally do NOT carry
- * a per-slot opt-out list: it adds maintenance cost and only blunts
- * the Anthropic editorial intent. Monospace contexts are excluded
- * automatically because:
- * - ``, ``, `