diff --git a/dto/channel_settings.go b/dto/channel_settings.go index b6a1ab9f7138..f46f4f07e7f7 100644 --- a/dto/channel_settings.go +++ b/dto/channel_settings.go @@ -41,6 +41,7 @@ type ChannelOtherSettings struct { UpstreamModelUpdateLastDetectedModels []string `json:"upstream_model_update_last_detected_models,omitempty"` // 上次检测到的可加入模型 UpstreamModelUpdateLastRemovedModels []string `json:"upstream_model_update_last_removed_models,omitempty"` // 上次检测到的可删除模型 UpstreamModelUpdateIgnoredModels []string `json:"upstream_model_update_ignored_models,omitempty"` // 手动忽略的模型 + UseFullURL bool `json:"use_full_url,omitempty"` // 是否使用完整请求URL(不拼接路径) } func (s *ChannelOtherSettings) IsOpenRouterEnterprise() bool { diff --git a/relay/channel/api_request.go b/relay/channel/api_request.go index 8dfb61d40093..20d1cb428f86 100644 --- a/relay/channel/api_request.go +++ b/relay/channel/api_request.go @@ -288,9 +288,15 @@ func applyHeaderOverrideToRequest(req *http.Request, headerOverride map[string]s } func DoApiRequest(a Adaptor, c *gin.Context, info *common.RelayInfo, requestBody io.Reader) (*http.Response, error) { - fullRequestURL, err := a.GetRequestURL(info) - if err != nil { - return nil, fmt.Errorf("get request url failed: %w", err) + var fullRequestURL string + var err error + if info.ChannelMeta.ChannelOtherSettings.UseFullURL { + fullRequestURL = info.ChannelBaseUrl + } else { + fullRequestURL, err = a.GetRequestURL(info) + if err != nil { + return nil, fmt.Errorf("get request url failed: %w", err) + } } if common2.DebugEnabled { println("fullRequestURL:", fullRequestURL) @@ -319,9 +325,15 @@ func DoApiRequest(a Adaptor, c *gin.Context, info *common.RelayInfo, requestBody } func DoFormRequest(a Adaptor, c *gin.Context, info *common.RelayInfo, requestBody io.Reader) (*http.Response, error) { - fullRequestURL, err := a.GetRequestURL(info) - if err != nil { - return nil, fmt.Errorf("get request url failed: %w", err) + var fullRequestURL string + var err error + if info.ChannelMeta.ChannelOtherSettings.UseFullURL { + fullRequestURL = info.ChannelBaseUrl + } else { + fullRequestURL, err = a.GetRequestURL(info) + if err != nil { + return nil, fmt.Errorf("get request url failed: %w", err) + } } if common2.DebugEnabled { println("fullRequestURL:", fullRequestURL) @@ -352,9 +364,15 @@ func DoFormRequest(a Adaptor, c *gin.Context, info *common.RelayInfo, requestBod } func DoWssRequest(a Adaptor, c *gin.Context, info *common.RelayInfo, requestBody io.Reader) (*websocket.Conn, error) { - fullRequestURL, err := a.GetRequestURL(info) - if err != nil { - return nil, fmt.Errorf("get request url failed: %w", err) + var fullRequestURL string + var err error + if info.ChannelMeta.ChannelOtherSettings.UseFullURL { + fullRequestURL = info.ChannelBaseUrl + } else { + fullRequestURL, err = a.GetRequestURL(info) + if err != nil { + return nil, fmt.Errorf("get request url failed: %w", err) + } } targetHeader := http.Header{} err = a.SetupRequestHeader(c, &targetHeader, info) diff --git a/web/default/src/components/ui/combobox-input.tsx b/web/default/src/components/ui/combobox-input.tsx index 1cd80874f71d..69aefb3b18eb 100644 --- a/web/default/src/components/ui/combobox-input.tsx +++ b/web/default/src/components/ui/combobox-input.tsx @@ -50,19 +50,33 @@ export function ComboboxInput({ const { t } = useTranslation() const [open, setOpen] = React.useState(false) const [highlightedIndex, setHighlightedIndex] = React.useState(-1) + const [editValue, setEditValue] = React.useState('') + const [isEditing, setIsEditing] = React.useState(false) const containerRef = React.useRef(null) const inputRef = React.useRef(null) const listRef = React.useRef(null) + const selectedOption = React.useMemo( + () => options.find((option) => option.value === value), + [options, value] + ) + + const displayValue = isEditing ? editValue : (selectedOption?.label ?? value) + + React.useEffect(() => { + setIsEditing(false) + }, [value]) + const filteredOptions = React.useMemo(() => { - if (!value.trim()) return options - const search = value.toLowerCase().trim() + if (!isEditing) return options + const search = editValue.toLowerCase().trim() + if (!search) return options return options.filter( (option) => option.label.toLowerCase().includes(search) || option.value.toLowerCase().includes(search) ) - }, [options, value]) + }, [options, editValue, isEditing]) // Reset highlight when filtered options change React.useEffect(() => { @@ -87,9 +101,11 @@ export function ComboboxInput({ }, [open]) const handleSelect = (selectedValue: string) => { + setEditValue('') + setIsEditing(false) onValueChange(selectedValue) setOpen(false) - inputRef.current?.focus() + inputRef.current?.blur() } const handleKeyDown = (e: React.KeyboardEvent) => { @@ -117,8 +133,12 @@ export function ComboboxInput({ e.preventDefault() if (highlightedIndex >= 0 && filteredOptions[highlightedIndex]) { handleSelect(filteredOptions[highlightedIndex].value) + } else if (isEditing && editValue.trim()) { + setEditValue('') + setIsEditing(false) + onValueChange(editValue.trim()) + setOpen(false) } else { - // No highlighted option, just close the dropdown and keep current value setOpen(false) } break @@ -136,7 +156,7 @@ export function ComboboxInput({ item?.scrollIntoView({ block: 'nearest' }) }, [highlightedIndex]) - const showDropdown = open && (filteredOptions.length > 0 || value.trim()) + const showDropdown = open && (filteredOptions.length > 0 || (isEditing && editValue.trim())) return (
@@ -150,9 +170,10 @@ export function ComboboxInput({ aria-autocomplete='list' autoComplete='off' placeholder={placeholder} - value={value} + value={displayValue} onChange={(e) => { - onValueChange(e.target.value) + setEditValue(e.target.value) + if (!isEditing) setIsEditing(true) if (!open) setOpen(true) }} onFocus={() => setOpen(true)} @@ -201,9 +222,9 @@ export function ComboboxInput({ ) : (
{emptyText} - {value.trim() && ( + {isEditing && editValue.trim() && (
- {t('Press Enter to use "{{value}}"', { value: value.trim() })} + {t('Press Enter to use "{{value}}"', { value: editValue.trim() })}
)}
diff --git a/web/default/src/features/channels/components/drawers/channel-mutate-drawer.tsx b/web/default/src/features/channels/components/drawers/channel-mutate-drawer.tsx index 899dd42c1faa..4793fe84f3b9 100644 --- a/web/default/src/features/channels/components/drawers/channel-mutate-drawer.tsx +++ b/web/default/src/features/channels/components/drawers/channel-mutate-drawer.tsx @@ -400,6 +400,7 @@ export function ChannelMutateDrawer({ 'upstream_model_update_check_enabled' ) const currentSettings = form.watch('settings') + const useFullURL = form.watch('use_full_url') const { unlocked: doubaoApiEditUnlocked, handleClick: handleApiConfigSecretClick, @@ -1248,17 +1249,42 @@ export function ChannelMutateDrawer({ name='base_url' render={({ field }) => ( - {t('AZURE_OPENAI_ENDPOINT *')} +
+ + {useFullURL + ? t('Full Request URL *') + : t('AZURE_OPENAI_ENDPOINT *')} + + ( +
+ + {t('Use Full URL')} + + +
+ )} + /> +
- {t('Your Azure OpenAI endpoint URL')} + {useFullURL + ? t('Enter the complete request URL. The system will use this URL directly without appending any path.') + : t('Your Azure OpenAI endpoint URL')}
@@ -1463,19 +1489,44 @@ export function ChannelMutateDrawer({ name='base_url' render={({ field }) => ( - {t('Private Deployment URL')} +
+ + {useFullURL + ? t('Full Request URL') + : t('Private Deployment URL')} + + ( +
+ + {t('Use Full URL')} + + +
+ )} + /> +
- {t( - 'For private deployments, format: https://fastgpt.run/api/openapi' - )} + {useFullURL + ? t('Enter the complete request URL. The system will use this URL directly without appending any path.') + : t( + 'For private deployments, format: https://fastgpt.run/api/openapi' + )}
@@ -1490,21 +1541,46 @@ export function ChannelMutateDrawer({ name='base_url' render={({ field }) => ( - - {t('API Base URL (Important: Not Chat API) *')} - +
+ + {useFullURL + ? t('Full Request URL') + : t('API Base URL (Important: Not Chat API) *')} + + ( +
+ + {t('Use Full URL')} + + +
+ )} + /> +
- {t( - 'Enter the path before /suno, usually just the domain' - )} + {useFullURL + ? t('Enter the complete request URL. The system will use this URL directly without appending any path.') + : t( + 'Enter the path before /suno, usually just the domain' + )}
@@ -1701,55 +1777,91 @@ export function ChannelMutateDrawer({ name='base_url' render={({ field }) => ( - - {t('API Base URL *')} - - - - - - {t('https://ark.cn-beijing.volces.com')} - - - {t('https://ark.ap-southeast.bytepluses.com')} - - - {t('Doubao Coding Plan')} - - - - + ) : ( + + )} - {t('Select the API endpoint region')} + {useFullURL + ? t('Enter the complete request URL. The system will use this URL directly without appending any path.') + : t('Select the API endpoint region')} @@ -1764,17 +1876,42 @@ export function ChannelMutateDrawer({ name='base_url' render={({ field }) => ( - {t('API Base URL *')} +
+ + {useFullURL + ? t('Full Request URL *') + : t('API Base URL *')} + + ( +
+ + {t('Use Full URL')} + + +
+ )} + /> +
- {t('Enter custom API endpoint URL')} + {useFullURL + ? t('Enter the complete request URL. The system will use this URL directly without appending any path.') + : t('Enter custom API endpoint URL')}
@@ -1812,17 +1949,46 @@ export function ChannelMutateDrawer({ name='base_url' render={({ field }) => ( - {t('Base URL')} +
+ + {useFullURL + ? t('Full Request URL') + : t('Base URL')} + + ( +
+ + {t('Use Full URL')} + + +
+ )} + /> +
- {t( - 'Custom API base URL. For official channels, New API has built-in addresses. Only fill this for third-party proxy sites or special endpoints. Do not add /v1 or trailing slash.' - )} + {useFullURL + ? t( + 'Enter the complete API request URL. The system will use this URL directly without appending any path.' + ) + : t( + 'Custom API base URL. For official channels, New API has built-in addresses. Only fill this for third-party proxy sites or special endpoints. Do not add /v1 or trailing slash.' + )}
diff --git a/web/default/src/features/channels/lib/channel-form.ts b/web/default/src/features/channels/lib/channel-form.ts index e05da96d23ca..28bd236b6785 100644 --- a/web/default/src/features/channels/lib/channel-form.ts +++ b/web/default/src/features/channels/lib/channel-form.ts @@ -78,6 +78,7 @@ export const channelFormSchema = z.object({ upstream_model_update_check_enabled: z.boolean().optional(), upstream_model_update_auto_sync_enabled: z.boolean().optional(), upstream_model_update_ignored_models: z.string().optional(), + use_full_url: z.boolean().optional(), }) export type ChannelFormValues = z.infer @@ -135,6 +136,7 @@ export const CHANNEL_FORM_DEFAULT_VALUES: ChannelFormValues = { upstream_model_update_check_enabled: false, upstream_model_update_auto_sync_enabled: false, upstream_model_update_ignored_models: '', + use_full_url: false, } // ============================================================================ @@ -189,6 +191,7 @@ export function transformChannelToFormDefaults( let upstreamModelUpdateCheckEnabled = false let upstreamModelUpdateAutoSyncEnabled = false let upstreamModelUpdateIgnoredModels = '' + let useFullURL = false if (channel.settings) { try { @@ -213,6 +216,7 @@ export function transformChannelToFormDefaults( ) ? parsed.upstream_model_update_ignored_models.join(',') : '' + useFullURL = parsed.use_full_url === true } catch (error) { // eslint-disable-next-line no-console console.error('Failed to parse channel settings:', error) @@ -262,6 +266,7 @@ export function transformChannelToFormDefaults( upstream_model_update_check_enabled: upstreamModelUpdateCheckEnabled, upstream_model_update_auto_sync_enabled: upstreamModelUpdateAutoSyncEnabled, upstream_model_update_ignored_models: upstreamModelUpdateIgnoredModels, + use_full_url: useFullURL, } } @@ -386,6 +391,9 @@ function buildSettingsJSON(formData: ChannelFormValues): string { } } + // Use full URL setting — applies to all channel types + settingsObj.use_full_url = formData.use_full_url === true + return JSON.stringify(settingsObj) } diff --git a/web/default/src/features/channels/types.ts b/web/default/src/features/channels/types.ts index a282053a3a95..ae1d8ee43d0b 100644 --- a/web/default/src/features/channels/types.ts +++ b/web/default/src/features/channels/types.ts @@ -105,6 +105,7 @@ export interface ChannelOtherSettings { upstream_model_update_ignored_models?: string[] upstream_model_update_last_check_time?: number upstream_model_update_last_detected_models?: string[] + use_full_url?: boolean } // ============================================================================ diff --git a/web/default/src/i18n/locales/_reports/_sync-report.json b/web/default/src/i18n/locales/_reports/_sync-report.json index 9f4616fabf70..92af95352ec4 100644 --- a/web/default/src/i18n/locales/_reports/_sync-report.json +++ b/web/default/src/i18n/locales/_reports/_sync-report.json @@ -35,7 +35,7 @@ "file": "zh.json", "missingCount": 0, "extrasCount": 0, - "untranslatedCount": 99 + "untranslatedCount": 100 } } } diff --git a/web/default/src/i18n/locales/_reports/zh.untranslated.json b/web/default/src/i18n/locales/_reports/zh.untranslated.json index d7475254074d..d0473724f9e4 100644 --- a/web/default/src/i18n/locales/_reports/zh.untranslated.json +++ b/web/default/src/i18n/locales/_reports/zh.untranslated.json @@ -21,6 +21,7 @@ "DeepSeek": "DeepSeek", "Discord": "Discord", "DoubaoVideo": "DoubaoVideo", + "e.g., https://api.example.com/v1/chat/completions": "e.g., https://api.example.com/v1/chat/completions", "edit_this": "edit_this", "example.com blocked-site.com": "example.com blocked-site.com", "example.com company.com": "example.com company.com", diff --git a/web/default/src/i18n/locales/en.json b/web/default/src/i18n/locales/en.json index 05e8c5bd4296..bf263107fc9a 100644 --- a/web/default/src/i18n/locales/en.json +++ b/web/default/src/i18n/locales/en.json @@ -1284,10 +1284,15 @@ "e.g., gpt-4, claude-3": "e.g., gpt-4, claude-3", "e.g., gpt-4.1-nano,regex:^claude-.*$,regex:^sora-.*$": "e.g., gpt-4.1-nano,regex:^claude-.*$,regex:^sora-.*$", "e.g., https://api.example.com (path before /suno)": "e.g., https://api.example.com (path before /suno)", + "e.g., https://api.example.com/suno/submit": "e.g., https://api.example.com/suno/submit", + "e.g., https://api.example.com/v1/chat/completions": "e.g., https://api.example.com/v1/chat/completions", "e.g., https://api.openai.com/v1/chat/completions": "e.g., https://api.openai.com/v1/chat/completions", "e.g., https://ark.cn-beijing.volces.com": "e.g., https://ark.cn-beijing.volces.com", + "e.g., https://ark.cn-beijing.volces.com/api/v3/chat/completions": "e.g., https://ark.cn-beijing.volces.com/api/v3/chat/completions", "e.g., https://docs-test-001.openai.azure.com": "e.g., https://docs-test-001.openai.azure.com", + "e.g., https://docs-test-001.openai.azure.com/openai/deployments/model/chat/completions?api-version=2025-04-01-preview": "e.g., https://docs-test-001.openai.azure.com/openai/deployments/model/chat/completions?api-version=2025-04-01-preview", "e.g., https://fastgpt.run/api/openapi": "e.g., https://fastgpt.run/api/openapi", + "e.g., https://fastgpt.run/api/openapi/v1/chat/completions": "e.g., https://fastgpt.run/api/openapi/v1/chat/completions", "e.g., OpenAI GPT-4 Production": "e.g., OpenAI GPT-4 Production", "e.g., preview": "e.g., preview", "e.g., prod_xxx": "e.g., prod_xxx", @@ -1455,6 +1460,8 @@ "Enter tag name (optional)": "Enter tag name (optional)", "Enter the 6-digit code from your authenticator app": "Enter the 6-digit code from your authenticator app", "Enter the 6-digit Time-based One-Time Password or 8-character backup code from your authenticator app.": "Enter the 6-digit Time-based One-Time Password or 8-character backup code from your authenticator app.", + "Enter the complete API request URL. The system will use this URL directly without appending any path.": "Enter the complete API request URL. The system will use this URL directly without appending any path.", + "Enter the complete request URL. The system will use this URL directly without appending any path.": "Enter the complete request URL. The system will use this URL directly without appending any path.", "Enter the complete URL, supports": "Enter the complete URL, supports", "Enter the Coze agent ID": "Enter the Coze agent ID", "Enter the full URL of your Gotify server": "Enter the full URL of your Gotify server", @@ -1752,7 +1759,7 @@ "footer.columns.related.links.oneApi": "One API", "footer.columns.related.title": "Related Projects", "footer.defaultCopyright": "All rights reserved.", - "footer.new\u0061pi.projectAttributionSuffix": "All rights reserved. Designed and developed by the project contributors.", + "footer.newapi.projectAttributionSuffix": "All rights reserved. Designed and developed by the project contributors.", "For channels added after May 10, 2025, no need to remove \".\" from model names during deployment": "For channels added after May 10, 2025, no need to remove \".\" from model names during deployment", "For private deployments, format: https://fastgpt.run/api/openapi": "For private deployments, format: https://fastgpt.run/api/openapi", "Force a syntactically valid JSON response": "Force a syntactically valid JSON response", @@ -1788,6 +1795,8 @@ "Full Code": "Full Code", "Full input length": "Full input length", "Full layout": "Full layout", + "Full Request URL": "Full Request URL", + "Full Request URL *": "Full Request URL *", "Full width": "Full width", "Function calling": "Function calling", "Functions": "Functions", @@ -2371,6 +2380,7 @@ "MokaAI": "MokaAI", "Monitor": "Monitor", "Monitor balance, usage, and request volume": "Monitor balance, usage, and request volume", + "Monitored relay requests": "Monitored relay requests", "Monitoring & Alerts": "Monitoring & Alerts", "Month": "Month", "Month number": "Month number", @@ -2383,7 +2393,6 @@ "More templates...": "More templates...", "More...": "More...", "Most-used models in the selected period and category": "Most-used models in the selected period and category", - "Monitored relay requests": "Monitored relay requests", "Move": "Move", "Move a request header": "Move a request header", "Move affiliate rewards to your main balance": "Move affiliate rewards to your main balance", @@ -4150,10 +4159,12 @@ "USD price per 1M tokens.": "USD price per 1M tokens.", "Use +: to add a group, -: to remove a default selectable group, or no prefix to append a group.": "Use +: to add a group, -: to remove a default selectable group, or no prefix to append a group.", "Use a compatible browser or device with biometric authentication or a security key to register a Passkey.": "Use a compatible browser or device with biometric authentication or a security key to register a Passkey.", + "Use a complete request URL without path concatenation, e.g. https://api.example.com/v1/chat/completions": "Use a complete request URL without path concatenation, e.g. https://api.example.com/v1/chat/completions", "Use authenticator code": "Use authenticator code", "Use backup code": "Use backup code", "Use disk cache when request body exceeds this size": "Use disk cache when request body exceeds this size", "Use external tools to extend capabilities": "Use external tools to extend capabilities", + "Use Full URL": "Use Full URL", "Use our unified OpenAI-compatible endpoint in your applications": "Use our unified OpenAI-compatible endpoint in your applications", "Use Passkey to sign in without entering your password.": "Use Passkey to sign in without entering your password.", "Use secure connection when sending emails": "Use secure connection when sending emails", diff --git a/web/default/src/i18n/locales/fr.json b/web/default/src/i18n/locales/fr.json index f13d1b8bf368..e43632d77e8c 100644 --- a/web/default/src/i18n/locales/fr.json +++ b/web/default/src/i18n/locales/fr.json @@ -1284,10 +1284,15 @@ "e.g., gpt-4, claude-3": "ex. gpt-4, claude-3", "e.g., gpt-4.1-nano,regex:^claude-.*$,regex:^sora-.*$": "ex. : gpt-4.1-nano,regex:^claude-.*$,regex:^sora-.*$", "e.g., https://api.example.com (path before /suno)": "par ex., https://api.example.com (chemin avant /suno)", + "e.g., https://api.example.com/suno/submit": "", + "e.g., https://api.example.com/v1/chat/completions": "", "e.g., https://api.openai.com/v1/chat/completions": "par ex., https://api.openai.com/v1/chat/completions", "e.g., https://ark.cn-beijing.volces.com": "p. ex., https://ark.cn-beijing.volces.com", + "e.g., https://ark.cn-beijing.volces.com/api/v3/chat/completions": "", "e.g., https://docs-test-001.openai.azure.com": "par ex., https://docs-test-001.openai.azure.com", + "e.g., https://docs-test-001.openai.azure.com/openai/deployments/model/chat/completions?api-version=2025-04-01-preview": "", "e.g., https://fastgpt.run/api/openapi": "par ex., https://fastgpt.run/api/openapi", + "e.g., https://fastgpt.run/api/openapi/v1/chat/completions": "", "e.g., OpenAI GPT-4 Production": "p. ex., OpenAI GPT-4 Production", "e.g., preview": "par ex., prévisualisation", "e.g., prod_xxx": "p. ex., prod_xxx", @@ -1455,6 +1460,8 @@ "Enter tag name (optional)": "Saisir le nom du tag (facultatif)", "Enter the 6-digit code from your authenticator app": "Saisir le code à 6 chiffres de votre application d'authentification", "Enter the 6-digit Time-based One-Time Password or 8-character backup code from your authenticator app.": "Saisir le mot de passe à usage unique basé sur le temps à 6 chiffres ou le code de secours à 8 caractères de votre application d'authentification.", + "Enter the complete API request URL. The system will use this URL directly without appending any path.": "", + "Enter the complete request URL. The system will use this URL directly without appending any path.": "", "Enter the complete URL, supports": "Saisir l'URL complète, prend en charge", "Enter the Coze agent ID": "Saisir l'ID de l'agent Coze", "Enter the full URL of your Gotify server": "Saisir l'URL complète de votre serveur Gotify", @@ -1752,7 +1759,7 @@ "footer.columns.related.links.oneApi": "One API", "footer.columns.related.title": "Projets liés", "footer.defaultCopyright": "Tous droits réservés.", - "footer.new\u0061pi.projectAttributionSuffix": "Tous droits réservés. Conçu et développé par les contributeurs du projet.", + "footer.newapi.projectAttributionSuffix": "Tous droits réservés. Conçu et développé par les contributeurs du projet.", "For channels added after May 10, 2025, no need to remove \".\" from model names during deployment": "Pour les canaux ajoutés après le 10 mai 2025, pas besoin de supprimer \".\" des noms de modèles lors du déploiement", "For private deployments, format: https://fastgpt.run/api/openapi": "Pour les déploiements privés, format : https://fastgpt.run/api/openapi", "Force a syntactically valid JSON response": "Imposer une réponse JSON syntaxiquement valide", @@ -1788,6 +1795,8 @@ "Full Code": "Code complet", "Full input length": "Longueur complète de l’entrée", "Full layout": "Disposition complète", + "Full Request URL": "", + "Full Request URL *": "", "Full width": "Pleine largeur", "Function calling": "Appel de fonction", "Functions": "Fonctions", @@ -2371,6 +2380,7 @@ "MokaAI": "MokaAI", "Monitor": "Surveiller", "Monitor balance, usage, and request volume": "Surveillez le solde, l'utilisation et le volume de requêtes", + "Monitored relay requests": "Requêtes relais surveillées", "Monitoring & Alerts": "Surveillance & Alertes", "Month": "Mois", "Month number": "Numéro du mois", @@ -2383,7 +2393,6 @@ "More templates...": "Autres modèles…", "More...": "Plus...", "Most-used models in the selected period and category": "Modèles les plus utilisés dans la période et catégorie choisies", - "Monitored relay requests": "Requêtes relais surveillées", "Move": "Déplacer", "Move a request header": "Déplacer un en-tête de requête", "Move affiliate rewards to your main balance": "Transférer les récompenses d'affiliation vers votre solde principal", @@ -4150,10 +4159,12 @@ "USD price per 1M tokens.": "Prix en USD par million de tokens.", "Use +: to add a group, -: to remove a default selectable group, or no prefix to append a group.": "Utilisez +: pour ajouter un groupe, -: pour supprimer un groupe sélectionnable par défaut, ou aucun préfixe pour annexer un groupe.", "Use a compatible browser or device with biometric authentication or a security key to register a Passkey.": "Utilisez un navigateur ou un appareil compatible avec l'authentification biométrique ou une clé de sécurité pour enregistrer une clé d'accès (Passkey).", + "Use a complete request URL without path concatenation, e.g. https://api.example.com/v1/chat/completions": "", "Use authenticator code": "Utiliser le code de l'authentificateur", "Use backup code": "Utiliser un code de secours", "Use disk cache when request body exceeds this size": "Utiliser le cache disque quand le corps de requête dépasse cette taille", "Use external tools to extend capabilities": "Utiliser des outils externes pour étendre les capacités", + "Use Full URL": "", "Use our unified OpenAI-compatible endpoint in your applications": "Utilisez notre point de terminaison unifié compatible OpenAI dans vos applications", "Use Passkey to sign in without entering your password.": "Utilisez une clé d'accès (Passkey) pour vous connecter sans saisir votre mot de passe.", "Use secure connection when sending emails": "Utiliser une connexion sécurisée lors de l'envoi d'e-mails", diff --git a/web/default/src/i18n/locales/ja.json b/web/default/src/i18n/locales/ja.json index 7a17e1cd5f91..2bc7cf2cc1e6 100644 --- a/web/default/src/i18n/locales/ja.json +++ b/web/default/src/i18n/locales/ja.json @@ -1284,10 +1284,15 @@ "e.g., gpt-4, claude-3": "例:gpt-4、claude-3", "e.g., gpt-4.1-nano,regex:^claude-.*$,regex:^sora-.*$": "例: gpt-4.1-nano,regex:^claude-.*$,regex:^sora-.*$", "e.g., https://api.example.com (path before /suno)": "例: https://api.example.com (/suno の前のパス)", + "e.g., https://api.example.com/suno/submit": "", + "e.g., https://api.example.com/v1/chat/completions": "", "e.g., https://api.openai.com/v1/chat/completions": "例: https://api.openai.com/v1/chat/completions", "e.g., https://ark.cn-beijing.volces.com": "例: https://ark.cn-beijing.volces.com", + "e.g., https://ark.cn-beijing.volces.com/api/v3/chat/completions": "", "e.g., https://docs-test-001.openai.azure.com": "例: https://docs-test-001.openai.azure.com", + "e.g., https://docs-test-001.openai.azure.com/openai/deployments/model/chat/completions?api-version=2025-04-01-preview": "", "e.g., https://fastgpt.run/api/openapi": "例: https://fastgpt.run/api/openapi", + "e.g., https://fastgpt.run/api/openapi/v1/chat/completions": "", "e.g., OpenAI GPT-4 Production": "例: OpenAI GPT -4 Production", "e.g., preview": "例: preview", "e.g., prod_xxx": "例: prod_xxx", @@ -1455,6 +1460,8 @@ "Enter tag name (optional)": "タグ名を入力 (オプション)", "Enter the 6-digit code from your authenticator app": "認証アプリからの6桁のコードを入力", "Enter the 6-digit Time-based One-Time Password or 8-character backup code from your authenticator app.": "認証アプリからの6桁のワンタイムパスワードまたは8文字のバックアップコードを入力してください。", + "Enter the complete API request URL. The system will use this URL directly without appending any path.": "", + "Enter the complete request URL. The system will use this URL directly without appending any path.": "", "Enter the complete URL, supports": "完全なURLを入力、サポート", "Enter the Coze agent ID": "CozeエージェントIDを入力", "Enter the full URL of your Gotify server": "Gotifyサーバーの完全なURLを入力", @@ -1752,7 +1759,7 @@ "footer.columns.related.links.oneApi": "1つのAPI", "footer.columns.related.title": "関連プロジェクト", "footer.defaultCopyright": "すべての権利を留保します。", - "footer.new\u0061pi.projectAttributionSuffix": "すべての権利を留保します。プロジェクトコントリビューターにより設計・開発されています。", + "footer.newapi.projectAttributionSuffix": "すべての権利を留保します。プロジェクトコントリビューターにより設計・開発されています。", "For channels added after May 10, 2025, no need to remove \".\" from model names during deployment": "2025 年 5 月 10 日以降に追加されたチャネルの場合、デプロイ時にモデル名から「.」を削除する必要はありません", "For private deployments, format: https://fastgpt.run/api/openapi": "プライベートデプロイメントの場合、形式: https://fastgpt.run/api/openapi", "Force a syntactically valid JSON response": "構文的に有効な JSON 応答を強制", @@ -1788,6 +1795,8 @@ "Full Code": "完全なコード", "Full input length": "完全な入力長", "Full layout": "フルレイアウト", + "Full Request URL": "", + "Full Request URL *": "", "Full width": "全幅", "Function calling": "関数呼び出し", "Functions": "関数", @@ -2371,6 +2380,7 @@ "MokaAI": "MokaAI", "Monitor": "モニタリング", "Monitor balance, usage, and request volume": "残高、使用量、リクエスト数を監視", + "Monitored relay requests": "監視対象のリレーリクエスト", "Monitoring & Alerts": "監視とアラート", "Month": "月", "Month number": "月番号", @@ -2383,7 +2393,6 @@ "More templates...": "ほかのテンプレート…", "More...": "その他...", "Most-used models in the selected period and category": "選択した期間とカテゴリで最も使われているモデル", - "Monitored relay requests": "監視対象のリレーリクエスト", "Move": "移動", "Move a request header": "リクエストヘッダーを移動", "Move affiliate rewards to your main balance": "アフィリエイト報酬をメイン残高に移動する", @@ -4150,10 +4159,12 @@ "USD price per 1M tokens.": "100万トークンあたりのUSD価格。", "Use +: to add a group, -: to remove a default selectable group, or no prefix to append a group.": "+: はグループ追加、-: はデフォルト選択可能グループの削除、接頭辞なしはグループ追記に使います。", "Use a compatible browser or device with biometric authentication or a security key to register a Passkey.": "生体認証またはセキュリティキーを備えた互換性のあるブラウザまたはデバイスを使用して、パスキーを登録してください。", + "Use a complete request URL without path concatenation, e.g. https://api.example.com/v1/chat/completions": "", "Use authenticator code": "認証コードを使用", "Use backup code": "バックアップコードを使用", "Use disk cache when request body exceeds this size": "リクエストボディがこのサイズを超えた場合にディスクキャッシュを使用", "Use external tools to extend capabilities": "外部ツールを利用して機能を拡張", + "Use Full URL": "", "Use our unified OpenAI-compatible endpoint in your applications": "アプリケーションでOpenAI互換の統一エンドポイントを使用", "Use Passkey to sign in without entering your password.": "パスワードを入力せずにサインインするには、パスキーを使用してください。", "Use secure connection when sending emails": "メール送信時に安全な接続を使用する", diff --git a/web/default/src/i18n/locales/ru.json b/web/default/src/i18n/locales/ru.json index 91f8030ee433..70a0903a90a8 100644 --- a/web/default/src/i18n/locales/ru.json +++ b/web/default/src/i18n/locales/ru.json @@ -1284,10 +1284,15 @@ "e.g., gpt-4, claude-3": "напр. gpt-4, claude-3", "e.g., gpt-4.1-nano,regex:^claude-.*$,regex:^sora-.*$": "например: gpt-4.1-nano,regex:^claude-.*$,regex:^sora-.*$", "e.g., https://api.example.com (path before /suno)": "например, https://api.example.com (путь до /suno)", + "e.g., https://api.example.com/suno/submit": "", + "e.g., https://api.example.com/v1/chat/completions": "", "e.g., https://api.openai.com/v1/chat/completions": "например, https://api.openai.com/v1/chat/completions", "e.g., https://ark.cn-beijing.volces.com": "например, https://ark.cn-beijing.volces.com", + "e.g., https://ark.cn-beijing.volces.com/api/v3/chat/completions": "", "e.g., https://docs-test-001.openai.azure.com": "например, https://docs-test-001.openai.azure.com", + "e.g., https://docs-test-001.openai.azure.com/openai/deployments/model/chat/completions?api-version=2025-04-01-preview": "", "e.g., https://fastgpt.run/api/openapi": "например, https://fastgpt.run/api/openapi", + "e.g., https://fastgpt.run/api/openapi/v1/chat/completions": "", "e.g., OpenAI GPT-4 Production": "напр., OpenAI GPT-4 Production", "e.g., preview": "например, preview", "e.g., prod_xxx": "напр., prod_xxx", @@ -1455,6 +1460,8 @@ "Enter tag name (optional)": "Введите имя тега (необязательно)", "Enter the 6-digit code from your authenticator app": "Введите 6-значный код из вашего приложения-аутентификатора", "Enter the 6-digit Time-based One-Time Password or 8-character backup code from your authenticator app.": "Введите 6-значный одноразовый пароль на основе времени или 8-значный резервный код из вашего приложения-аутентификатора.", + "Enter the complete API request URL. The system will use this URL directly without appending any path.": "", + "Enter the complete request URL. The system will use this URL directly without appending any path.": "", "Enter the complete URL, supports": "Введите полный URL, поддерживает", "Enter the Coze agent ID": "Введите ID агента Coze", "Enter the full URL of your Gotify server": "Введите полный URL вашего сервера Gotify", @@ -1752,7 +1759,7 @@ "footer.columns.related.links.oneApi": "Один API", "footer.columns.related.title": "Связанные проекты", "footer.defaultCopyright": "Все права защищены.", - "footer.new\u0061pi.projectAttributionSuffix": "Все права защищены. Разработано участниками проекта.", + "footer.newapi.projectAttributionSuffix": "Все права защищены. Разработано участниками проекта.", "For channels added after May 10, 2025, no need to remove \".\" from model names during deployment": "Для каналов, добавленных после 10 мая 2025 г., не нужно удалять \".\" из имён моделей при развёртывании", "For private deployments, format: https://fastgpt.run/api/openapi": "Для частных развертываний, формат: https://fastgpt.run/api/openapi", "Force a syntactically valid JSON response": "Принудительно возвращать синтаксически корректный JSON", @@ -1788,6 +1795,8 @@ "Full Code": "Полный код", "Full input length": "Полная длина входа", "Full layout": "Полная разметка", + "Full Request URL": "", + "Full Request URL *": "", "Full width": "Полная ширина", "Function calling": "Вызов функций", "Functions": "Функции", @@ -2371,6 +2380,7 @@ "MokaAI": "MokaAI", "Monitor": "Мониторинг", "Monitor balance, usage, and request volume": "Отслеживайте баланс, расход и объем запросов", + "Monitored relay requests": "Отслеживаемые ретрансляционные запросы", "Monitoring & Alerts": "Мониторинг и оповещения", "Month": "Месяц", "Month number": "Номер месяца", @@ -2383,7 +2393,6 @@ "More templates...": "Другие шаблоны…", "More...": "Подробнее...", "Most-used models in the selected period and category": "Самые используемые модели в выбранном периоде и категории", - "Monitored relay requests": "Отслеживаемые ретрансляционные запросы", "Move": "Переместить", "Move a request header": "Переместить заголовок запроса", "Move affiliate rewards to your main balance": "Перевести партнерские вознаграждения на основной баланс", @@ -4150,10 +4159,12 @@ "USD price per 1M tokens.": "Цена в USD за 1 млн токенов.", "Use +: to add a group, -: to remove a default selectable group, or no prefix to append a group.": "Используйте +: для добавления группы, -: для удаления выбираемой по умолчанию группы, без префикса — для добавления в конец.", "Use a compatible browser or device with biometric authentication or a security key to register a Passkey.": "Используйте совместимый браузер или устройство с биометрической аутентификацией или ключ безопасности для регистрации ключа доступа.", + "Use a complete request URL without path concatenation, e.g. https://api.example.com/v1/chat/completions": "", "Use authenticator code": "Использовать код аутентификатора", "Use backup code": "Использовать резервный код", "Use disk cache when request body exceeds this size": "Использовать дисковый кэш, когда тело запроса превышает этот размер", "Use external tools to extend capabilities": "Использовать внешние инструменты для расширения возможностей", + "Use Full URL": "", "Use our unified OpenAI-compatible endpoint in your applications": "Используйте наш единый OpenAI-совместимый эндпоинт в ваших приложениях", "Use Passkey to sign in without entering your password.": "Используйте ключ доступа для входа без ввода пароля.", "Use secure connection when sending emails": "Использовать безопасное соединение при отправке электронных писем", diff --git a/web/default/src/i18n/locales/vi.json b/web/default/src/i18n/locales/vi.json index 1e5fede3bf27..7732c5f92da0 100644 --- a/web/default/src/i18n/locales/vi.json +++ b/web/default/src/i18n/locales/vi.json @@ -1284,10 +1284,15 @@ "e.g., gpt-4, claude-3": "vd: gpt-4, claude-3", "e.g., gpt-4.1-nano,regex:^claude-.*$,regex:^sora-.*$": "ví dụ: gpt-4.1-nano,regex:^claude-.*$,regex:^sora-.*$", "e.g., https://api.example.com (path before /suno)": "ví dụ: https://api.example.com (đường dẫn trước /suno)", + "e.g., https://api.example.com/suno/submit": "", + "e.g., https://api.example.com/v1/chat/completions": "", "e.g., https://api.openai.com/v1/chat/completions": "ví dụ: https://api.openai.com/v1/chat/completions", "e.g., https://ark.cn-beijing.volces.com": "ví dụ, https://ark.cn-beijing.volces.com", + "e.g., https://ark.cn-beijing.volces.com/api/v3/chat/completions": "", "e.g., https://docs-test-001.openai.azure.com": "ví dụ: https://docs-test-001.openai.azure.com", + "e.g., https://docs-test-001.openai.azure.com/openai/deployments/model/chat/completions?api-version=2025-04-01-preview": "", "e.g., https://fastgpt.run/api/openapi": "ví dụ: https://fastgpt.run/api/openapi", + "e.g., https://fastgpt.run/api/openapi/v1/chat/completions": "", "e.g., OpenAI GPT-4 Production": "ví dụ: OpenAI GPT-4 Sản xuất", "e.g., preview": "ví dụ: xem trước", "e.g., prod_xxx": "ví dụ, prod_xxx", @@ -1455,6 +1460,8 @@ "Enter tag name (optional)": "Nhập tên thẻ (tùy chọn)", "Enter the 6-digit code from your authenticator app": "Nhập mã 6 chữ số từ ứng dụng xác thực của bạn", "Enter the 6-digit Time-based One-Time Password or 8-character backup code from your authenticator app.": "Nhập Mật khẩu dùng một lần dựa trên thời gian gồm 6 chữ số hoặc mã dự phòng gồm 8 ký tự từ ứng dụng xác thực của bạn.", + "Enter the complete API request URL. The system will use this URL directly without appending any path.": "", + "Enter the complete request URL. The system will use this URL directly without appending any path.": "", "Enter the complete URL, supports": "Nhập địa chỉ URL hoàn chỉnh, hỗ trợ", "Enter the Coze agent ID": "Nhập ID tác nhân Coze", "Enter the full URL of your Gotify server": "Nhập URL đầy đủ của máy chủ Gotify của bạn", @@ -1752,7 +1759,7 @@ "footer.columns.related.links.oneApi": "One API", "footer.columns.related.title": "Các Dự Án Liên Quan", "footer.defaultCopyright": "Bản quyền được bảo lưu.", - "footer.new\u0061pi.projectAttributionSuffix": "Bản quyền được bảo lưu. Được thiết kế và phát triển bởi các cộng tác viên dự án.", + "footer.newapi.projectAttributionSuffix": "Bản quyền được bảo lưu. Được thiết kế và phát triển bởi các cộng tác viên dự án.", "For channels added after May 10, 2025, no need to remove \".\" from model names during deployment": "Đối với các kênh được thêm sau ngày 10 tháng 5 năm 2025, không cần loại bỏ \".\" khỏi tên mô hình trong quá trình triển khai", "For private deployments, format: https://fastgpt.run/api/openapi": "Đối với các triển khai riêng tư, định dạng: https://fastgpt.run/api/openapi", "Force a syntactically valid JSON response": "Buộc phản hồi JSON hợp lệ về cú pháp", @@ -1788,6 +1795,8 @@ "Full Code": "Mã đầy đủ", "Full input length": "Độ dài đầu vào đầy đủ", "Full layout": "Bố cục đầy đủ", + "Full Request URL": "", + "Full Request URL *": "", "Full width": "Toàn chiều rộng", "Function calling": "Gọi hàm", "Functions": "Hàm", @@ -2371,6 +2380,7 @@ "MokaAI": "MokaAI", "Monitor": "Giám sát", "Monitor balance, usage, and request volume": "Theo dõi số dư, mức dùng và số lượng yêu cầu", + "Monitored relay requests": "Yêu cầu relay được giám sát", "Monitoring & Alerts": "Giám sát & Cảnh báo", "Month": "Tháng", "Month number": "Số tháng", @@ -2383,7 +2393,6 @@ "More templates...": "Thêm mẫu...", "More...": "Thêm...", "Most-used models in the selected period and category": "Mô hình được dùng nhiều nhất trong khoảng thời gian và danh mục đã chọn", - "Monitored relay requests": "Yêu cầu relay được giám sát", "Move": "Di chuyển", "Move a request header": "Di chuyển header yêu cầu", "Move affiliate rewards to your main balance": "Chuyển phần thưởng liên kết vào số dư chính của bạn", @@ -4150,10 +4159,12 @@ "USD price per 1M tokens.": "Giá USD cho mỗi 1 triệu token.", "Use +: to add a group, -: to remove a default selectable group, or no prefix to append a group.": "Dùng +: để thêm nhóm, -: để xóa nhóm có thể chọn mặc định, hoặc không có tiền tố để nối nhóm.", "Use a compatible browser or device with biometric authentication or a security key to register a Passkey.": "Sử dụng trình duyệt hoặc thiết bị tương thích có xác thực sinh trắc học hoặc khóa bảo mật để đăng ký Khóa truy cập.", + "Use a complete request URL without path concatenation, e.g. https://api.example.com/v1/chat/completions": "", "Use authenticator code": "Sử dụng mã xác thực", "Use backup code": "Sử dụng mã dự phòng", "Use disk cache when request body exceeds this size": "Sử dụng bộ nhớ đệm đĩa khi nội dung yêu cầu vượt quá kích thước này", "Use external tools to extend capabilities": "Sử dụng công cụ ngoài để mở rộng khả năng", + "Use Full URL": "", "Use our unified OpenAI-compatible endpoint in your applications": "Sử dụng endpoint thống nhất tương thích OpenAI trong ứng dụng của bạn", "Use Passkey to sign in without entering your password.": "Sử dụng Khóa truy cập để đăng nhập mà không cần nhập mật khẩu của bạn.", "Use secure connection when sending emails": "Sử dụng kết nối an toàn khi gửi email", diff --git a/web/default/src/i18n/locales/zh.json b/web/default/src/i18n/locales/zh.json index 5d3014ce7408..32229caf4bd6 100644 --- a/web/default/src/i18n/locales/zh.json +++ b/web/default/src/i18n/locales/zh.json @@ -1284,10 +1284,15 @@ "e.g., gpt-4, claude-3": "例如:gpt-4、claude-3", "e.g., gpt-4.1-nano,regex:^claude-.*$,regex:^sora-.*$": "例如:gpt-4.1-nano,regex:^claude-.*$,regex:^sora-.*$", "e.g., https://api.example.com (path before /suno)": "例如,https://api.example.com (在 /suno 之前的路径)", + "e.g., https://api.example.com/suno/submit": "e.g., https://api.example.com/suno/submit", + "e.g., https://api.example.com/v1/chat/completions": "e.g., https://api.example.com/v1/chat/completions", "e.g., https://api.openai.com/v1/chat/completions": "例如,https://api.openai.com/v1/chat/completions", "e.g., https://ark.cn-beijing.volces.com": "例如,https://ark.cn-beijing.volces.com", + "e.g., https://ark.cn-beijing.volces.com/api/v3/chat/completions": "e.g., https://ark.cn-beijing.volces.com/api/v3/chat/completions", "e.g., https://docs-test-001.openai.azure.com": "例如,https://docs-test-001.openai.azure.com", + "e.g., https://docs-test-001.openai.azure.com/openai/deployments/model/chat/completions?api-version=2025-04-01-preview": "e.g., https://docs-test-001.openai.azure.com/openai/deployments/model/chat/completions?api-version=2025-04-01-preview", "e.g., https://fastgpt.run/api/openapi": "例如,https://fastgpt.run/api/openapi", + "e.g., https://fastgpt.run/api/openapi/v1/chat/completions": "e.g., https://fastgpt.run/api/openapi/v1/chat/completions", "e.g., OpenAI GPT-4 Production": "例如,OpenAI GPT-4 生产环境", "e.g., preview": "例如,preview", "e.g., prod_xxx": "例如,prod_xxx", @@ -1455,6 +1460,8 @@ "Enter tag name (optional)": "输入标签名称(可选)", "Enter the 6-digit code from your authenticator app": "输入来自身份验证器应用的 6 位代码", "Enter the 6-digit Time-based One-Time Password or 8-character backup code from your authenticator app.": "输入来自身份验证器应用的 6 位基于时间的单次密码或 8 位备份代码。", + "Enter the complete API request URL. The system will use this URL directly without appending any path.": "输入完整的API请求URL,系统将直接使用此URL,不拼接任何路径", + "Enter the complete request URL. The system will use this URL directly without appending any path.": "输入完整的请求URL,系统将直接使用此URL,不拼接任何路径", "Enter the complete URL, supports": "输入完整的 URL,支持", "Enter the Coze agent ID": "输入 Coze 代理 ID", "Enter the full URL of your Gotify server": "输入您的 Gotify 服务器的完整 URL", @@ -1752,7 +1759,7 @@ "footer.columns.related.links.oneApi": "One API", "footer.columns.related.title": "相关项目", "footer.defaultCopyright": "版权所有。", - "footer.new\u0061pi.projectAttributionSuffix": "版权所有,由项目贡献者设计与开发。", + "footer.newapi.projectAttributionSuffix": "版权所有,由项目贡献者设计与开发。", "For channels added after May 10, 2025, no need to remove \".\" from model names during deployment": "对于 2025 年 5 月 10 日之后添加的渠道,在部署时无需从模型名称中移除 \".\"", "For private deployments, format: https://fastgpt.run/api/openapi": "对于私有部署,格式为:https://fastgpt.run/api/openapi", "Force a syntactically valid JSON response": "强制返回语法合法的 JSON", @@ -1788,6 +1795,8 @@ "Full Code": "完整代码", "Full input length": "完整输入长度", "Full layout": "全屏布局", + "Full Request URL": "完整请求 URL", + "Full Request URL *": "完整请求 URL *", "Full width": "全宽", "Function calling": "函数调用", "Functions": "函数", @@ -2371,6 +2380,7 @@ "MokaAI": "MokaAI", "Monitor": "监控", "Monitor balance, usage, and request volume": "监控余额、用量和请求量", + "Monitored relay requests": "已监控的中继请求", "Monitoring & Alerts": "监控与警报", "Month": "本月", "Month number": "月份", @@ -2383,7 +2393,6 @@ "More templates...": "更多模板...", "More...": "更多...", "Most-used models in the selected period and category": "所选时间范围与分类下使用率最高的模型", - "Monitored relay requests": "已监控的中继请求", "Move": "移动", "Move a request header": "移动请求头", "Move affiliate rewards to your main balance": "将推广奖励转移到您的主余额", @@ -4150,10 +4159,12 @@ "USD price per 1M tokens.": "每 100 万 token 的美元价格。", "Use +: to add a group, -: to remove a default selectable group, or no prefix to append a group.": "使用 +: 添加分组,使用 -: 移除默认可选分组,不加前缀则追加分组。", "Use a compatible browser or device with biometric authentication or a security key to register a Passkey.": "请使用支持生物识别认证或安全密钥的兼容浏览器或设备来注册通行密钥。", + "Use a complete request URL without path concatenation, e.g. https://api.example.com/v1/chat/completions": "使用完整请求URL,不拼接路径,例如 https://api.example.com/v1/chat/completions", "Use authenticator code": "使用验证器代码", "Use backup code": "使用备用代码", "Use disk cache when request body exceeds this size": "请求体超过此大小时使用磁盘缓存", "Use external tools to extend capabilities": "通过外部工具扩展能力", + "Use Full URL": "使用完整 URL", "Use our unified OpenAI-compatible endpoint in your applications": "在应用中使用我们兼容 OpenAI 的统一接口", "Use Passkey to sign in without entering your password.": "使用通行密钥登录,无需输入密码。", "Use secure connection when sending emails": "发送电子邮件时使用安全连接",