Merge branch 'langgenius:main' into fix-tool-panel-error

pull/18523/head
GuanMu 1 year ago committed by GitHub
commit e953572d71
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -62,13 +62,13 @@ const SettingsModal: FC<SettingsModalProps> = ({
const { notify } = useToastContext() const { notify } = useToastContext()
const ref = useRef(null) const ref = useRef(null)
const isExternal = currentDataset.provider === 'external' const isExternal = currentDataset.provider === 'external'
const [topK, setTopK] = useState(currentDataset?.external_retrieval_model.top_k ?? 2)
const [scoreThreshold, setScoreThreshold] = useState(currentDataset?.external_retrieval_model.score_threshold ?? 0.5)
const [scoreThresholdEnabled, setScoreThresholdEnabled] = useState(currentDataset?.external_retrieval_model.score_threshold_enabled ?? false)
const { setShowAccountSettingModal } = useModalContext() const { setShowAccountSettingModal } = useModalContext()
const [loading, setLoading] = useState(false) const [loading, setLoading] = useState(false)
const { isCurrentWorkspaceDatasetOperator } = useAppContext() const { isCurrentWorkspaceDatasetOperator } = useAppContext()
const [localeCurrentDataset, setLocaleCurrentDataset] = useState({ ...currentDataset }) const [localeCurrentDataset, setLocaleCurrentDataset] = useState({ ...currentDataset })
const [topK, setTopK] = useState(localeCurrentDataset?.external_retrieval_model.top_k ?? 2)
const [scoreThreshold, setScoreThreshold] = useState(localeCurrentDataset?.external_retrieval_model.score_threshold ?? 0.5)
const [scoreThresholdEnabled, setScoreThresholdEnabled] = useState(localeCurrentDataset?.external_retrieval_model.score_threshold_enabled ?? false)
const [selectedMemberIDs, setSelectedMemberIDs] = useState<string[]>(currentDataset.partial_member_list || []) const [selectedMemberIDs, setSelectedMemberIDs] = useState<string[]>(currentDataset.partial_member_list || [])
const [memberList, setMemberList] = useState<Member[]>([]) const [memberList, setMemberList] = useState<Member[]>([])
@ -88,6 +88,14 @@ const SettingsModal: FC<SettingsModalProps> = ({
setScoreThreshold(data.score_threshold) setScoreThreshold(data.score_threshold)
if (data.score_threshold_enabled !== undefined) if (data.score_threshold_enabled !== undefined)
setScoreThresholdEnabled(data.score_threshold_enabled) setScoreThresholdEnabled(data.score_threshold_enabled)
setLocaleCurrentDataset({
...localeCurrentDataset,
external_retrieval_model: {
...localeCurrentDataset?.external_retrieval_model,
...data,
},
})
} }
const handleSave = async () => { const handleSave = async () => {

@ -80,8 +80,30 @@ export const useEmbeddedChatbot = () => {
}, []) }, [])
useEffect(() => { useEffect(() => {
if (appInfo?.site.default_language) const setLanguageFromParams = async () => {
changeLanguage(appInfo.site.default_language) // Check URL parameters for language override
const urlParams = new URLSearchParams(window.location.search)
const localeParam = urlParams.get('locale')
// Check for encoded system variables
const systemVariables = await getProcessedSystemVariablesFromUrlParams()
const localeFromSysVar = systemVariables.locale
if (localeParam) {
// If locale parameter exists in URL, use it instead of default
changeLanguage(localeParam)
}
else if (localeFromSysVar) {
// If locale is set as a system variable, use that
changeLanguage(localeFromSysVar)
}
else if (appInfo?.site.default_language) {
// Otherwise use the default from app config
changeLanguage(appInfo.site.default_language)
}
}
setLanguageFromParams()
}, [appInfo]) }, [appInfo])
const [conversationIdInfo, setConversationIdInfo] = useLocalStorageState<Record<string, Record<string, string>>>(CONVERSATION_ID_INFO, { const [conversationIdInfo, setConversationIdInfo] = useLocalStorageState<Record<string, Record<string, string>>>(CONVERSATION_ID_INFO, {

@ -31,6 +31,7 @@ import { useOptions } from './hooks'
import type { PickerBlockMenuOption } from './menu' import type { PickerBlockMenuOption } from './menu'
import VarReferenceVars from '@/app/components/workflow/nodes/_base/components/variable/var-reference-vars' import VarReferenceVars from '@/app/components/workflow/nodes/_base/components/variable/var-reference-vars'
import { useEventEmitterContextContext } from '@/context/event-emitter' import { useEventEmitterContextContext } from '@/context/event-emitter'
import { KEY_ESCAPE_COMMAND } from 'lexical'
type ComponentPickerProps = { type ComponentPickerProps = {
triggerString: string triggerString: string
@ -118,6 +119,13 @@ const ComponentPicker = ({
editor.dispatchCommand(INSERT_WORKFLOW_VARIABLE_BLOCK_COMMAND, variables) editor.dispatchCommand(INSERT_WORKFLOW_VARIABLE_BLOCK_COMMAND, variables)
}, [editor, checkForTriggerMatch, triggerString]) }, [editor, checkForTriggerMatch, triggerString])
const handleClose = useCallback(() => {
ReactDOM.flushSync(() => {
const escapeEvent = new KeyboardEvent('keydown', { key: 'Escape' })
editor.dispatchCommand(KEY_ESCAPE_COMMAND, escapeEvent)
})
}, [editor])
const renderMenu = useCallback<MenuRenderFn<PickerBlockMenuOption>>(( const renderMenu = useCallback<MenuRenderFn<PickerBlockMenuOption>>((
anchorElementRef, anchorElementRef,
{ options, selectedIndex, selectOptionAndCleanUp, setHighlightedIndex }, { options, selectedIndex, selectOptionAndCleanUp, setHighlightedIndex },
@ -141,51 +149,54 @@ const ComponentPicker = ({
visibility: isPositioned ? 'visible' : 'hidden', visibility: isPositioned ? 'visible' : 'hidden',
}} }}
ref={refs.setFloating} ref={refs.setFloating}
data-testid="component-picker-container"
> >
{ {
options.map((option, index) => ( workflowVariableBlock?.show && (
<Fragment key={option.key}> <div className='p-1'>
{ <VarReferenceVars
// Divider searchBoxClassName='mt-1'
index !== 0 && options.at(index - 1)?.group !== option.group && ( vars={workflowVariableOptions}
<div className='my-1 h-px w-full -translate-x-1 bg-divider-subtle'></div> onChange={(variables: string[]) => {
) handleSelectWorkflowVariable(variables)
} }}
{option.renderMenuOption({ maxHeightClass='max-h-[34vh]'
queryString, isSupportFileVar={isSupportFileVar}
isSelected: selectedIndex === index, onClose={handleClose}
onSelect: () => { onBlur={handleClose}
selectOptionAndCleanUp(option) />
}, </div>
onSetHighlight: () => { )
setHighlightedIndex(index)
},
})}
</Fragment>
))
} }
{ {
workflowVariableBlock?.show && ( workflowVariableBlock?.show && !!options.length && (
<> <div className='my-1 h-px w-full -translate-x-1 bg-divider-subtle'></div>
{
(!!options.length) && (
<div className='my-1 h-px w-full -translate-x-1 bg-divider-subtle'></div>
)
}
<div className='p-1'>
<VarReferenceVars
hideSearch
vars={workflowVariableOptions}
onChange={(variables: string[]) => {
handleSelectWorkflowVariable(variables)
}}
maxHeightClass='max-h-[34vh]'
isSupportFileVar={isSupportFileVar}
/>
</div>
</>
) )
} }
<div data-testid="options-list">
{
options.map((option, index) => (
<Fragment key={option.key}>
{
// Divider
index !== 0 && options.at(index - 1)?.group !== option.group && (
<div className='my-1 h-px w-full -translate-x-1 bg-divider-subtle'></div>
)
}
{option.renderMenuOption({
queryString,
isSelected: selectedIndex === index,
onSelect: () => {
selectOptionAndCleanUp(option)
},
onSetHighlight: () => {
setHighlightedIndex(index)
},
})}
</Fragment>
))
}
</div>
</div> </div>
</div>, </div>,
anchorElementRef.current, anchorElementRef.current,
@ -193,7 +204,7 @@ const ComponentPicker = ({
} }
</> </>
) )
}, [allFlattenOptions.length, workflowVariableBlock?.show, refs, isPositioned, floatingStyles, queryString, workflowVariableOptions, handleSelectWorkflowVariable]) }, [allFlattenOptions.length, workflowVariableBlock?.show, refs, isPositioned, floatingStyles, queryString, workflowVariableOptions, handleSelectWorkflowVariable, handleClose, isSupportFileVar])
return ( return (
<LexicalTypeaheadMenuPlugin <LexicalTypeaheadMenuPlugin

@ -37,14 +37,16 @@ const OnBlurBlock: FC<OnBlurBlockProps> = ({
), ),
editor.registerCommand( editor.registerCommand(
BLUR_COMMAND, BLUR_COMMAND,
() => { (event) => {
ref.current = setTimeout(() => { // Check if the clicked target element is var-search-input
editor.dispatchCommand(KEY_ESCAPE_COMMAND, new KeyboardEvent('keydown', { key: 'Escape' })) const target = event?.relatedTarget as HTMLElement
}, 200) if (!target?.classList?.contains('var-search-input')) {
ref.current = setTimeout(() => {
if (onBlur) editor.dispatchCommand(KEY_ESCAPE_COMMAND, new KeyboardEvent('keydown', { key: 'Escape' }))
onBlur() }, 200)
if (onBlur)
onBlur()
}
return true return true
}, },
COMMAND_PRIORITY_EDITOR, COMMAND_PRIORITY_EDITOR,

@ -74,7 +74,7 @@ const Popup: FC<PopupProps> = ({
/> />
<input <input
className='block h-[18px] grow appearance-none bg-transparent text-[13px] text-text-primary outline-none' className='block h-[18px] grow appearance-none bg-transparent text-[13px] text-text-primary outline-none'
placeholder='Search model' placeholder={t('datasetSettings.form.searchModel') || ''}
value={searchText} value={searchText}
onChange={e => setSearchText(e.target.value)} onChange={e => setSearchText(e.target.value)}
/> />

@ -258,6 +258,8 @@ type Props = {
onChange: (value: ValueSelector, item: Var) => void onChange: (value: ValueSelector, item: Var) => void
itemWidth?: number itemWidth?: number
maxHeightClass?: string maxHeightClass?: string
onClose?: () => void
onBlur?: () => void
} }
const VarReferenceVars: FC<Props> = ({ const VarReferenceVars: FC<Props> = ({
hideSearch, hideSearch,
@ -267,10 +269,19 @@ const VarReferenceVars: FC<Props> = ({
onChange, onChange,
itemWidth, itemWidth,
maxHeightClass, maxHeightClass,
onClose,
onBlur,
}) => { }) => {
const { t } = useTranslation() const { t } = useTranslation()
const [searchText, setSearchText] = useState('') const [searchText, setSearchText] = useState('')
const handleKeyDown = (e: React.KeyboardEvent) => {
if (e.key === 'Escape') {
e.preventDefault()
onClose?.()
}
}
const filteredVars = vars.filter((v) => { const filteredVars = vars.filter((v) => {
const children = v.vars.filter(v => checkKeys([v.variable], false).isValid || v.variable.startsWith('sys.') || v.variable.startsWith('env.') || v.variable.startsWith('conversation.')) const children = v.vars.filter(v => checkKeys([v.variable], false).isValid || v.variable.startsWith('sys.') || v.variable.startsWith('env.') || v.variable.startsWith('conversation.'))
return children.length > 0 return children.length > 0
@ -301,14 +312,17 @@ const VarReferenceVars: FC<Props> = ({
{ {
!hideSearch && ( !hideSearch && (
<> <>
<div className={cn('mx-2 mb-1 mt-2', searchBoxClassName)} onClick={e => e.stopPropagation()}> <div className={cn('var-search-input-wrapper mx-2 mb-1 mt-2', searchBoxClassName)} onClick={e => e.stopPropagation()}>
<Input <Input
className='var-search-input'
showLeftIcon showLeftIcon
showClearIcon showClearIcon
value={searchText} value={searchText}
placeholder={t('workflow.common.searchVar') || ''} placeholder={t('workflow.common.searchVar') || ''}
onChange={e => setSearchText(e.target.value)} onChange={e => setSearchText(e.target.value)}
onKeyDown={handleKeyDown}
onClear={() => setSearchText('')} onClear={() => setSearchText('')}
onBlur={onBlur}
autoFocus autoFocus
/> />
</div> </div>

@ -35,6 +35,7 @@ const translation = {
upgradeHighQualityTip: 'Nach dem Upgrade auf den Modus "Hohe Qualität" ist das Zurücksetzen auf den Modus "Wirtschaftlich" nicht mehr möglich', upgradeHighQualityTip: 'Nach dem Upgrade auf den Modus "Hohe Qualität" ist das Zurücksetzen auf den Modus "Wirtschaftlich" nicht mehr möglich',
helpText: 'Erfahren Sie, wie Sie eine gute Datensatzbeschreibung schreiben.', helpText: 'Erfahren Sie, wie Sie eine gute Datensatzbeschreibung schreiben.',
indexMethodChangeToEconomyDisabledTip: 'Nicht verfügbar für ein Downgrade von HQ auf ECO', indexMethodChangeToEconomyDisabledTip: 'Nicht verfügbar für ein Downgrade von HQ auf ECO',
searchModel: 'Modell suchen',
}, },
} }

@ -36,6 +36,7 @@ const translation = {
retrievalSettings: 'Retrieval Settings', retrievalSettings: 'Retrieval Settings',
save: 'Save', save: 'Save',
indexMethodChangeToEconomyDisabledTip: 'Not available for downgrading from HQ to ECO', indexMethodChangeToEconomyDisabledTip: 'Not available for downgrading from HQ to ECO',
searchModel: 'Search model',
}, },
} }

@ -35,6 +35,7 @@ const translation = {
indexMethodChangeToEconomyDisabledTip: 'No disponible para degradar de HQ a ECO', indexMethodChangeToEconomyDisabledTip: 'No disponible para degradar de HQ a ECO',
helpText: 'Aprenda a escribir una buena descripción del conjunto de datos.', helpText: 'Aprenda a escribir una buena descripción del conjunto de datos.',
upgradeHighQualityTip: 'Una vez que se actualiza al modo de alta calidad, no está disponible volver al modo económico', upgradeHighQualityTip: 'Una vez que se actualiza al modo de alta calidad, no está disponible volver al modo económico',
searchModel: 'Buscar modelo',
}, },
} }

@ -35,6 +35,7 @@ const translation = {
indexMethodChangeToEconomyDisabledTip: 'برای تنزل رتبه از HQ به ECO در دسترس نیست', indexMethodChangeToEconomyDisabledTip: 'برای تنزل رتبه از HQ به ECO در دسترس نیست',
helpText: 'یاد بگیرید که چگونه یک توضیحات مجموعه داده خوب بنویسید.', helpText: 'یاد بگیرید که چگونه یک توضیحات مجموعه داده خوب بنویسید.',
upgradeHighQualityTip: 'پس از ارتقاء به حالت کیفیت بالا، بازگشت به حالت اقتصادی در دسترس نیست', upgradeHighQualityTip: 'پس از ارتقاء به حالت کیفیت بالا، بازگشت به حالت اقتصادی در دسترس نیست',
searchModel: 'جستجوی مدل',
}, },
} }

@ -35,6 +35,7 @@ const translation = {
indexMethodChangeToEconomyDisabledTip: 'Non disponible pour le déclassement de HQ à ECO', indexMethodChangeToEconomyDisabledTip: 'Non disponible pour le déclassement de HQ à ECO',
upgradeHighQualityTip: 'Une fois la mise à niveau vers le mode Haute Qualité, il nest pas possible de revenir au mode Économique', upgradeHighQualityTip: 'Une fois la mise à niveau vers le mode Haute Qualité, il nest pas possible de revenir au mode Économique',
helpText: 'Apprenez à rédiger une bonne description de jeu de données.', helpText: 'Apprenez à rédiger une bonne description de jeu de données.',
searchModel: 'Rechercher un modèle',
}, },
} }

@ -40,6 +40,7 @@ const translation = {
indexMethodChangeToEconomyDisabledTip: 'मुख्यालय से ईसीओ में डाउनग्रेड करने के लिए उपलब्ध नहीं है', indexMethodChangeToEconomyDisabledTip: 'मुख्यालय से ईसीओ में डाउनग्रेड करने के लिए उपलब्ध नहीं है',
helpText: 'एक अच्छा डेटासेट विवरण लिखना सीखें।', helpText: 'एक अच्छा डेटासेट विवरण लिखना सीखें।',
upgradeHighQualityTip: 'एक बार उच्च गुणवत्ता मोड में अपग्रेड करने के बाद, किफायती मोड में वापस जाना उपलब्ध नहीं है', upgradeHighQualityTip: 'एक बार उच्च गुणवत्ता मोड में अपग्रेड करने के बाद, किफायती मोड में वापस जाना उपलब्ध नहीं है',
searchModel: 'मॉडल खोजें',
}, },
} }

@ -40,6 +40,7 @@ const translation = {
helpText: 'Scopri come scrivere una buona descrizione del set di dati.', helpText: 'Scopri come scrivere una buona descrizione del set di dati.',
upgradeHighQualityTip: 'Una volta effettuato l\'aggiornamento alla modalità Alta qualità, il ripristino della modalità Risparmio non è disponibile', upgradeHighQualityTip: 'Una volta effettuato l\'aggiornamento alla modalità Alta qualità, il ripristino della modalità Risparmio non è disponibile',
indexMethodChangeToEconomyDisabledTip: 'Non disponibile per il downgrade da HQ a ECO', indexMethodChangeToEconomyDisabledTip: 'Non disponibile per il downgrade da HQ a ECO',
searchModel: 'Cerca modello',
}, },
} }

@ -36,6 +36,7 @@ const translation = {
retrievalSettings: '取得設定', retrievalSettings: '取得設定',
externalKnowledgeAPI: '外部ナレッジベースAPI', externalKnowledgeAPI: '外部ナレッジベースAPI',
indexMethodChangeToEconomyDisabledTip: 'HQからECOへのダウングレードはできません。', indexMethodChangeToEconomyDisabledTip: 'HQからECOへのダウングレードはできません。',
searchModel: 'モデル検索',
}, },
} }

@ -35,6 +35,7 @@ const translation = {
upgradeHighQualityTip: '고품질 모드로 업그레이드한 후에는 경제적 모드로 되돌릴 수 없습니다.', upgradeHighQualityTip: '고품질 모드로 업그레이드한 후에는 경제적 모드로 되돌릴 수 없습니다.',
indexMethodChangeToEconomyDisabledTip: 'HQ에서 ECO로 다운그레이드할 수 없습니다.', indexMethodChangeToEconomyDisabledTip: 'HQ에서 ECO로 다운그레이드할 수 없습니다.',
helpText: '좋은 데이터 세트 설명을 작성하는 방법을 알아보세요.', helpText: '좋은 데이터 세트 설명을 작성하는 방법을 알아보세요.',
searchModel: '모델 검색',
}, },
} }

@ -40,6 +40,7 @@ const translation = {
helpText: 'Dowiedz się, jak napisać dobry opis zestawu danych.', helpText: 'Dowiedz się, jak napisać dobry opis zestawu danych.',
upgradeHighQualityTip: 'Po uaktualnieniu do trybu wysokiej jakości powrót do trybu ekonomicznego nie jest dostępny', upgradeHighQualityTip: 'Po uaktualnieniu do trybu wysokiej jakości powrót do trybu ekonomicznego nie jest dostępny',
indexMethodChangeToEconomyDisabledTip: 'Niedostępne w przypadku zmiany z HQ na ECO', indexMethodChangeToEconomyDisabledTip: 'Niedostępne w przypadku zmiany z HQ na ECO',
searchModel: 'Szukaj modelu',
}, },
} }

@ -35,6 +35,7 @@ const translation = {
indexMethodChangeToEconomyDisabledTip: 'Não disponível para rebaixamento de HQ para ECO', indexMethodChangeToEconomyDisabledTip: 'Não disponível para rebaixamento de HQ para ECO',
helpText: 'Aprenda a escrever uma boa descrição do conjunto de dados.', helpText: 'Aprenda a escrever uma boa descrição do conjunto de dados.',
upgradeHighQualityTip: 'Depois de atualizar para o modo de alta qualidade, reverter para o modo econômico não está disponível', upgradeHighQualityTip: 'Depois de atualizar para o modo de alta qualidade, reverter para o modo econômico não está disponível',
searchModel: 'Pesquisar modelo',
}, },
} }

@ -35,6 +35,7 @@ const translation = {
indexMethodChangeToEconomyDisabledTip: 'Nu este disponibil pentru retrogradarea de la HQ la ECO', indexMethodChangeToEconomyDisabledTip: 'Nu este disponibil pentru retrogradarea de la HQ la ECO',
upgradeHighQualityTip: 'După ce faceți upgrade la modul Înaltă calitate, revenirea la modul Economic nu este disponibilă', upgradeHighQualityTip: 'După ce faceți upgrade la modul Înaltă calitate, revenirea la modul Economic nu este disponibilă',
helpText: 'Aflați cum să scrieți o descriere bună a setului de date.', helpText: 'Aflați cum să scrieți o descriere bună a setului de date.',
searchModel: 'Căutare model',
}, },
} }

@ -35,6 +35,7 @@ const translation = {
helpText: 'Узнайте, как написать хорошее описание набора данных.', helpText: 'Узнайте, как написать хорошее описание набора данных.',
upgradeHighQualityTip: 'После обновления до режима «Высокое качество» возврат к экономичному режиму невозможен', upgradeHighQualityTip: 'После обновления до режима «Высокое качество» возврат к экономичному режиму невозможен',
indexMethodChangeToEconomyDisabledTip: 'Недоступно для понижения уровня с HQ до ECO', indexMethodChangeToEconomyDisabledTip: 'Недоступно для понижения уровня с HQ до ECO',
searchModel: 'Поиск модели',
}, },
} }

@ -35,6 +35,7 @@ const translation = {
indexMethodChangeToEconomyDisabledTip: 'Ni na voljo za pregradnjo iz HQ v ECO', indexMethodChangeToEconomyDisabledTip: 'Ni na voljo za pregradnjo iz HQ v ECO',
upgradeHighQualityTip: 'Ko nadgradite na način visoke kakovosti, vrnitev v ekonomični način ni na voljo', upgradeHighQualityTip: 'Ko nadgradite na način visoke kakovosti, vrnitev v ekonomični način ni na voljo',
helpText: 'Naučite se napisati dober opis nabora podatkov.', helpText: 'Naučite se napisati dober opis nabora podatkov.',
searchModel: 'Išči model',
}, },
} }

@ -35,6 +35,7 @@ const translation = {
indexMethodChangeToEconomyDisabledTip: 'ไม่สามารถดาวน์เกรดจาก HQ เป็น ECO ได้', indexMethodChangeToEconomyDisabledTip: 'ไม่สามารถดาวน์เกรดจาก HQ เป็น ECO ได้',
helpText: 'เรียนรู้วิธีเขียนคําอธิบายชุดข้อมูลที่ดี', helpText: 'เรียนรู้วิธีเขียนคําอธิบายชุดข้อมูลที่ดี',
upgradeHighQualityTip: 'เมื่ออัปเกรดเป็นโหมดคุณภาพสูงแล้ว จะไม่สามารถเปลี่ยนกลับเป็นโหมดประหยัดได้', upgradeHighQualityTip: 'เมื่ออัปเกรดเป็นโหมดคุณภาพสูงแล้ว จะไม่สามารถเปลี่ยนกลับเป็นโหมดประหยัดได้',
searchModel: 'ค้นหารุ่น',
}, },
} }

@ -35,6 +35,7 @@ const translation = {
upgradeHighQualityTip: 'Yüksek Kalite moduna yükselttikten sonra Ekonomik moda geri dönülemez', upgradeHighQualityTip: 'Yüksek Kalite moduna yükselttikten sonra Ekonomik moda geri dönülemez',
indexMethodChangeToEconomyDisabledTip: 'Genel Merkezden ECO\'ya düşürme için mevcut değil', indexMethodChangeToEconomyDisabledTip: 'Genel Merkezden ECO\'ya düşürme için mevcut değil',
helpText: 'İyi bir veri kümesi açıklamasının nasıl yazılacağını öğrenin.', helpText: 'İyi bir veri kümesi açıklamasının nasıl yazılacağını öğrenin.',
searchModel: 'Model Ara',
}, },
} }

@ -35,6 +35,7 @@ const translation = {
helpText: 'Дізнайтеся, як написати хороший опис набору даних.', helpText: 'Дізнайтеся, як написати хороший опис набору даних.',
indexMethodChangeToEconomyDisabledTip: 'Недоступно для пониження з HQ до ECO', indexMethodChangeToEconomyDisabledTip: 'Недоступно для пониження з HQ до ECO',
upgradeHighQualityTip: 'Після оновлення до режиму високої якості повернення до економного режиму недоступне', upgradeHighQualityTip: 'Після оновлення до режиму високої якості повернення до економного режиму недоступне',
searchModel: 'Пошук моделі',
}, },
} }

@ -35,6 +35,7 @@ const translation = {
helpText: 'Tìm hiểu cách viết mô tả tập dữ liệu tốt.', helpText: 'Tìm hiểu cách viết mô tả tập dữ liệu tốt.',
indexMethodChangeToEconomyDisabledTip: 'Không khả dụng để hạ cấp từ HQ xuống ECO', indexMethodChangeToEconomyDisabledTip: 'Không khả dụng để hạ cấp từ HQ xuống ECO',
upgradeHighQualityTip: 'Sau khi nâng cấp lên chế độ Chất lượng cao, không thể hoàn nguyên về chế độ Tiết kiệm', upgradeHighQualityTip: 'Sau khi nâng cấp lên chế độ Chất lượng cao, không thể hoàn nguyên về chế độ Tiết kiệm',
searchModel: 'Tìm kiếm mô hình',
}, },
} }

@ -36,6 +36,7 @@ const translation = {
save: '保存', save: '保存',
retrievalSettings: '检索设置', retrievalSettings: '检索设置',
indexMethodChangeToEconomyDisabledTip: '无法从高质量降级为经济', indexMethodChangeToEconomyDisabledTip: '无法从高质量降级为经济',
searchModel: '搜索模型',
}, },
} }

@ -35,6 +35,7 @@ const translation = {
indexMethodChangeToEconomyDisabledTip: '不適用於從 HQ 降級到 ECO', indexMethodChangeToEconomyDisabledTip: '不適用於從 HQ 降級到 ECO',
upgradeHighQualityTip: '升級到高品質模式后,無法恢復到經濟模式', upgradeHighQualityTip: '升級到高品質模式后,無法恢復到經濟模式',
helpText: '瞭解如何編寫良好的數據集描述。', helpText: '瞭解如何編寫良好的數據集描述。',
searchModel: '搜索模型',
}, },
} }

Loading…
Cancel
Save