From c5e26597715b9082fc3c40c044ba5d4dce350074 Mon Sep 17 00:00:00 2001 From: crazywoola <100913391+crazywoola@users.noreply.github.com> Date: Mon, 29 Apr 2024 17:55:52 +0800 Subject: [PATCH] Feat/install process refinement (#3982) --- .../[datasetId]/layout.tsx | 496 ++++---- web/app/activate/activateForm.tsx | 2 +- web/app/signin/enterpriseSSOForm.tsx | 2 +- web/app/signin/forms.tsx | 2 +- web/app/signin/normalForm.tsx | 11 +- web/app/signin/page.tsx | 2 +- web/context/i18n.ts | 4 +- web/i18n/de-DE/common.ts | 1046 +++++++++-------- web/i18n/de-DE/login.ts | 119 +- web/i18n/en-US/common.ts | 2 + web/i18n/en-US/login.ts | 1 + web/i18n/fr-FR/common.ts | 2 + web/i18n/fr-FR/login.ts | 1 + web/i18n/index.ts | 4 - web/i18n/ja-JP/common.ts | 2 + web/i18n/ja-JP/login.ts | 1 + web/i18n/pt-BR/common.ts | 2 + web/i18n/pt-BR/login.ts | 1 + web/i18n/uk-UA/common.ts | 2 + web/i18n/uk-UA/login.ts | 1 + web/i18n/vi-VN/common.ts | 1 + web/i18n/vi-VN/login.ts | 1 + web/i18n/zh-Hans/common.ts | 2 + web/i18n/zh-Hans/login.ts | 1 + web/i18n/zh-Hant/common.ts | 2 + web/i18n/zh-Hant/login.ts | 1 + 26 files changed, 871 insertions(+), 840 deletions(-) diff --git a/web/app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/layout.tsx b/web/app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/layout.tsx index f113693fbf..d8e97aac22 100644 --- a/web/app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/layout.tsx +++ b/web/app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/layout.tsx @@ -1,248 +1,248 @@ -'use client' -import type { FC, SVGProps } from 'react' -import React, { useEffect } from 'react' -import { usePathname } from 'next/navigation' -import useSWR from 'swr' -import { useTranslation } from 'react-i18next' -import classNames from 'classnames' -import { useBoolean } from 'ahooks' -import { - Cog8ToothIcon, - // CommandLineIcon, - Squares2X2Icon, - // eslint-disable-next-line sort-imports - PuzzlePieceIcon, - DocumentTextIcon, - PaperClipIcon, - QuestionMarkCircleIcon, -} from '@heroicons/react/24/outline' -import { - Cog8ToothIcon as Cog8ToothSolidIcon, - // CommandLineIcon as CommandLineSolidIcon, - DocumentTextIcon as DocumentTextSolidIcon, -} from '@heroicons/react/24/solid' -import Link from 'next/link' -import s from './style.module.css' -import { fetchDatasetDetail, fetchDatasetRelatedApps } from '@/service/datasets' -import type { RelatedApp, RelatedAppResponse } from '@/models/datasets' -import { getLocaleOnClient } from '@/i18n' -import AppSideBar from '@/app/components/app-sidebar' -import Divider from '@/app/components/base/divider' -import AppIcon from '@/app/components/base/app-icon' -import Loading from '@/app/components/base/loading' -import FloatPopoverContainer from '@/app/components/base/float-popover-container' -import DatasetDetailContext from '@/context/dataset-detail' -import { DataSourceType } from '@/models/datasets' -import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints' -import { LanguagesSupported } from '@/i18n/language' -import { useStore } from '@/app/components/app/store' -import { AiText, ChatBot, CuteRobote } from '@/app/components/base/icons/src/vender/solid/communication' -import { Route } from '@/app/components/base/icons/src/vender/solid/mapsAndTravel' - -export type IAppDetailLayoutProps = { - children: React.ReactNode - params: { datasetId: string } -} - -type ILikedItemProps = { - type?: 'plugin' | 'app' - appStatus?: boolean - detail: RelatedApp - isMobile: boolean -} - -const LikedItem = ({ - type = 'app', - detail, - isMobile, -}: ILikedItemProps) => { - return ( - -
- - {type === 'app' && ( - - {detail.mode === 'advanced-chat' && ( - - )} - {detail.mode === 'agent-chat' && ( - - )} - {detail.mode === 'chat' && ( - - )} - {detail.mode === 'completion' && ( - - )} - {detail.mode === 'workflow' && ( - - )} - - )} -
- {!isMobile &&
{detail?.name || '--'}
} - - ) -} - -const TargetIcon = ({ className }: SVGProps) => { - return - - - - - - - - - -} - -const TargetSolidIcon = ({ className }: SVGProps) => { - return - - - - -} - -const BookOpenIcon = ({ className }: SVGProps) => { - return - - - -} - -type IExtraInfoProps = { - isMobile: boolean - relatedApps?: RelatedAppResponse -} - -const ExtraInfo = ({ isMobile, relatedApps }: IExtraInfoProps) => { - const locale = getLocaleOnClient() - const [isShowTips, { toggle: toggleTips, set: setShowTips }] = useBoolean(!isMobile) - const { t } = useTranslation() - - useEffect(() => { - setShowTips(!isMobile) - }, [isMobile, setShowTips]) - - return
- - {(relatedApps?.data && relatedApps?.data?.length > 0) && ( - <> - {!isMobile &&
{relatedApps?.total || '--'} {t('common.datasetMenus.relatedApp')}
} - {isMobile &&
- {relatedApps?.total || '--'} - -
} - {relatedApps?.data?.map((item, index) => ())} - - )} - {!relatedApps?.data?.length && ( - - -
- } - > -
-
-
- -
-
- -
-
-
{t('common.datasetMenus.emptyTip')}
- - - {t('common.datasetMenus.viewDoc')} - -
- - )} - -} - -const DatasetDetailLayout: FC = (props) => { - const { - children, - params: { datasetId }, - } = props - const pathname = usePathname() - const hideSideBar = /documents\/create$/.test(pathname) - const { t } = useTranslation() - - const media = useBreakpoints() - const isMobile = media === MediaType.mobile - - const { data: datasetRes, error, mutate: mutateDatasetRes } = useSWR({ - url: 'fetchDatasetDetail', - datasetId, - }, apiParams => fetchDatasetDetail(apiParams.datasetId)) - - const { data: relatedApps } = useSWR({ - action: 'fetchDatasetRelatedApps', - datasetId, - }, apiParams => fetchDatasetRelatedApps(apiParams.datasetId)) - - const navigation = [ - { name: t('common.datasetMenus.documents'), href: `/datasets/${datasetId}/documents`, icon: DocumentTextIcon, selectedIcon: DocumentTextSolidIcon }, - { name: t('common.datasetMenus.hitTesting'), href: `/datasets/${datasetId}/hitTesting`, icon: TargetIcon, selectedIcon: TargetSolidIcon }, - // { name: 'api & webhook', href: `/datasets/${datasetId}/api`, icon: CommandLineIcon, selectedIcon: CommandLineSolidIcon }, - { name: t('common.datasetMenus.settings'), href: `/datasets/${datasetId}/settings`, icon: Cog8ToothIcon, selectedIcon: Cog8ToothSolidIcon }, - ] - - useEffect(() => { - if (datasetRes) - document.title = `${datasetRes.name || 'Dataset'} - Dify` - }, [datasetRes]) - - const setAppSiderbarExpand = useStore(state => state.setAppSiderbarExpand) - - useEffect(() => { - const localeMode = localStorage.getItem('app-detail-collapse-or-expand') || 'expand' - const mode = isMobile ? 'collapse' : 'expand' - setAppSiderbarExpand(isMobile ? mode : localeMode) - }, [isMobile, setAppSiderbarExpand]) - - if (!datasetRes && !error) - return - - return ( -
- {!hideSideBar && } - iconType={datasetRes?.data_source_type === DataSourceType.NOTION ? 'notion' : 'dataset'} - />} - mutateDatasetRes(), - }}> -
{children}
-
-
- ) -} -export default React.memo(DatasetDetailLayout) +'use client' +import type { FC, SVGProps } from 'react' +import React, { useEffect } from 'react' +import { usePathname } from 'next/navigation' +import useSWR from 'swr' +import { useTranslation } from 'react-i18next' +import classNames from 'classnames' +import { useBoolean } from 'ahooks' +import { + Cog8ToothIcon, + // CommandLineIcon, + Squares2X2Icon, + // eslint-disable-next-line sort-imports + PuzzlePieceIcon, + DocumentTextIcon, + PaperClipIcon, + QuestionMarkCircleIcon, +} from '@heroicons/react/24/outline' +import { + Cog8ToothIcon as Cog8ToothSolidIcon, + // CommandLineIcon as CommandLineSolidIcon, + DocumentTextIcon as DocumentTextSolidIcon, +} from '@heroicons/react/24/solid' +import Link from 'next/link' +import s from './style.module.css' +import { fetchDatasetDetail, fetchDatasetRelatedApps } from '@/service/datasets' +import type { RelatedApp, RelatedAppResponse } from '@/models/datasets' +import AppSideBar from '@/app/components/app-sidebar' +import Divider from '@/app/components/base/divider' +import AppIcon from '@/app/components/base/app-icon' +import Loading from '@/app/components/base/loading' +import FloatPopoverContainer from '@/app/components/base/float-popover-container' +import DatasetDetailContext from '@/context/dataset-detail' +import { DataSourceType } from '@/models/datasets' +import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints' +import { LanguagesSupported } from '@/i18n/language' +import { useStore } from '@/app/components/app/store' +import { AiText, ChatBot, CuteRobote } from '@/app/components/base/icons/src/vender/solid/communication' +import { Route } from '@/app/components/base/icons/src/vender/solid/mapsAndTravel' +import { getLocaleOnServer } from '@/i18n/server' + +export type IAppDetailLayoutProps = { + children: React.ReactNode + params: { datasetId: string } +} + +type ILikedItemProps = { + type?: 'plugin' | 'app' + appStatus?: boolean + detail: RelatedApp + isMobile: boolean +} + +const LikedItem = ({ + type = 'app', + detail, + isMobile, +}: ILikedItemProps) => { + return ( + +
+ + {type === 'app' && ( + + {detail.mode === 'advanced-chat' && ( + + )} + {detail.mode === 'agent-chat' && ( + + )} + {detail.mode === 'chat' && ( + + )} + {detail.mode === 'completion' && ( + + )} + {detail.mode === 'workflow' && ( + + )} + + )} +
+ {!isMobile &&
{detail?.name || '--'}
} + + ) +} + +const TargetIcon = ({ className }: SVGProps) => { + return + + + + + + + + + +} + +const TargetSolidIcon = ({ className }: SVGProps) => { + return + + + + +} + +const BookOpenIcon = ({ className }: SVGProps) => { + return + + + +} + +type IExtraInfoProps = { + isMobile: boolean + relatedApps?: RelatedAppResponse +} + +const ExtraInfo = ({ isMobile, relatedApps }: IExtraInfoProps) => { + const locale = getLocaleOnServer() + const [isShowTips, { toggle: toggleTips, set: setShowTips }] = useBoolean(!isMobile) + const { t } = useTranslation() + + useEffect(() => { + setShowTips(!isMobile) + }, [isMobile, setShowTips]) + + return
+ + {(relatedApps?.data && relatedApps?.data?.length > 0) && ( + <> + {!isMobile &&
{relatedApps?.total || '--'} {t('common.datasetMenus.relatedApp')}
} + {isMobile &&
+ {relatedApps?.total || '--'} + +
} + {relatedApps?.data?.map((item, index) => ())} + + )} + {!relatedApps?.data?.length && ( + + +
+ } + > +
+
+
+ +
+
+ +
+
+
{t('common.datasetMenus.emptyTip')}
+ + + {t('common.datasetMenus.viewDoc')} + +
+ + )} + +} + +const DatasetDetailLayout: FC = (props) => { + const { + children, + params: { datasetId }, + } = props + const pathname = usePathname() + const hideSideBar = /documents\/create$/.test(pathname) + const { t } = useTranslation() + + const media = useBreakpoints() + const isMobile = media === MediaType.mobile + + const { data: datasetRes, error, mutate: mutateDatasetRes } = useSWR({ + url: 'fetchDatasetDetail', + datasetId, + }, apiParams => fetchDatasetDetail(apiParams.datasetId)) + + const { data: relatedApps } = useSWR({ + action: 'fetchDatasetRelatedApps', + datasetId, + }, apiParams => fetchDatasetRelatedApps(apiParams.datasetId)) + + const navigation = [ + { name: t('common.datasetMenus.documents'), href: `/datasets/${datasetId}/documents`, icon: DocumentTextIcon, selectedIcon: DocumentTextSolidIcon }, + { name: t('common.datasetMenus.hitTesting'), href: `/datasets/${datasetId}/hitTesting`, icon: TargetIcon, selectedIcon: TargetSolidIcon }, + // { name: 'api & webhook', href: `/datasets/${datasetId}/api`, icon: CommandLineIcon, selectedIcon: CommandLineSolidIcon }, + { name: t('common.datasetMenus.settings'), href: `/datasets/${datasetId}/settings`, icon: Cog8ToothIcon, selectedIcon: Cog8ToothSolidIcon }, + ] + + useEffect(() => { + if (datasetRes) + document.title = `${datasetRes.name || 'Dataset'} - Dify` + }, [datasetRes]) + + const setAppSiderbarExpand = useStore(state => state.setAppSiderbarExpand) + + useEffect(() => { + const localeMode = localStorage.getItem('app-detail-collapse-or-expand') || 'expand' + const mode = isMobile ? 'collapse' : 'expand' + setAppSiderbarExpand(isMobile ? mode : localeMode) + }, [isMobile, setAppSiderbarExpand]) + + if (!datasetRes && !error) + return + + return ( +
+ {!hideSideBar && } + iconType={datasetRes?.data_source_type === DataSourceType.NOTION ? 'notion' : 'dataset'} + />} + mutateDatasetRes(), + }}> +
{children}
+
+
+ ) +} +export default React.memo(DatasetDetailLayout) diff --git a/web/app/activate/activateForm.tsx b/web/app/activate/activateForm.tsx index eaaa86988c..7d0404d69d 100644 --- a/web/app/activate/activateForm.tsx +++ b/web/app/activate/activateForm.tsx @@ -86,7 +86,7 @@ const ActivateForm = () => { timezone, }, }) - setLocaleOnClient(language.startsWith('en') ? 'en' : 'zh-Hans', false) + setLocaleOnClient(language.startsWith('en') ? 'en-US' : 'zh-Hans', false) setShowSuccess(true) } catch { diff --git a/web/app/signin/enterpriseSSOForm.tsx b/web/app/signin/enterpriseSSOForm.tsx index 059810b83d..747f2aa478 100644 --- a/web/app/signin/enterpriseSSOForm.tsx +++ b/web/app/signin/enterpriseSSOForm.tsx @@ -60,7 +60,7 @@ const EnterpriseSSOForm: FC = ({ return (
{ } return
{ {t('login.forget')} */} -
+
{ >{t('login.pp')}
+ {IS_CE_EDITION &&
+ {t('login.goToInit')} +   + {t('login.setAdminAccount')} +
} +
diff --git a/web/app/signin/page.tsx b/web/app/signin/page.tsx index fc348e89be..8abb656c2e 100644 --- a/web/app/signin/page.tsx +++ b/web/app/signin/page.tsx @@ -61,7 +61,7 @@ gtag('config', 'AW-11217955271"'); {loading && (
- setLocaleOnClient: (locale: Locale, reloadPage?: boolean) => void + setLocaleOnClient: (_lang: Locale, _reloadPage?: boolean) => void } const I18NContext = createContext({ locale: 'en-US', i18n: {}, - setLocaleOnClient: (lang: Locale, reloadPage?: boolean) => { }, + setLocaleOnClient: (_lang: Locale, _reloadPage?: boolean) => { }, }) export const useI18N = () => useContext(I18NContext) diff --git a/web/i18n/de-DE/common.ts b/web/i18n/de-DE/common.ts index 44b72173fd..776224233c 100644 --- a/web/i18n/de-DE/common.ts +++ b/web/i18n/de-DE/common.ts @@ -1,522 +1,524 @@ -const translation = { - api: { - success: 'Erfolg', - actionSuccess: 'Aktion erfolgreich', - saved: 'Gespeichert', - create: 'Erstellt', - remove: 'Entfernt', - }, - operation: { - create: 'Erstellen', - confirm: 'Bestätigen', - cancel: 'Abbrechen', - clear: 'Leeren', - save: 'Speichern', - edit: 'Bearbeiten', - add: 'Hinzufügen', - added: 'Hinzugefügt', - refresh: 'Neustart', - reset: 'Zurücksetzen', - search: 'Suchen', - change: 'Ändern', - remove: 'Entfernen', - send: 'Senden', - copy: 'Kopieren', - lineBreak: 'Zeilenumbruch', - sure: 'Ich bin sicher', - download: 'Herunterladen', - delete: 'Löschen', - settings: 'Einstellungen', - setup: 'Einrichten', - getForFree: 'Kostenlos erhalten', - reload: 'Neu laden', - ok: 'OK', - log: 'Protokoll', - learnMore: 'Mehr erfahren', - params: 'Parameter', - duplicate: 'Duplikat', - rename: 'Umbenennen', - }, - placeholder: { - input: 'Bitte eingeben', - select: 'Bitte auswählen', - }, - voice: { - language: { - zhHans: 'Chinesisch', - enUS: 'Englisch', - deDE: 'Deutsch', - frFR: 'Französisch', - esES: 'Spanisch', - itIT: 'Italienisch', - thTH: 'Thailändisch', - idID: 'Indonesisch', - jaJP: 'Japanisch', - koKR: 'Koreanisch', - ptBR: 'Portugiesisch', - ruRU: 'Russisch', - ukUA: 'Ukrainisch', - }, - }, - unit: { - char: 'Zeichen', - }, - actionMsg: { - noModification: 'Im Moment keine Änderungen.', - modifiedSuccessfully: 'Erfolgreich geändert', - modifiedUnsuccessfully: 'Änderung nicht erfolgreich', - copySuccessfully: 'Erfolgreich kopiert', - paySucceeded: 'Zahlung erfolgreich', - payCancelled: 'Zahlung abgebrochen', - generatedSuccessfully: 'Erfolgreich generiert', - generatedUnsuccessfully: 'Generierung nicht erfolgreich', - }, - model: { - params: { - temperature: 'Temperatur', - temperatureTip: - 'Kontrolliert Zufälligkeit: Eine niedrigere Temperatur führt zu weniger zufälligen Ergebnissen. Nähert sich die Temperatur null, wird das Modell deterministisch und repetitiv.', - top_p: 'Top P', - top_pTip: - 'Kontrolliert Diversität über Nukleus-Sampling: 0,5 bedeutet, dass die Hälfte aller wahrscheinlichkeitsgewichteten Optionen berücksichtigt wird.', - presence_penalty: 'Präsenz-Strafe', - presence_penaltyTip: - 'Wie stark neue Tokens basierend darauf bestraft werden, ob sie bereits im Text erschienen sind.\nErhöht die Wahrscheinlichkeit des Modells, über neue Themen zu sprechen.', - frequency_penalty: 'Häufigkeitsstrafe', - frequency_penaltyTip: - 'Wie stark neue Tokens basierend auf ihrer bisherigen Häufigkeit im Text bestraft werden.\nVerringert die Wahrscheinlichkeit des Modells, denselben Satz wortwörtlich zu wiederholen.', - max_tokens: 'Maximale Token', - max_tokensTip: - 'Begrenzt die maximale Länge der Antwort in Token. \nGrößere Werte können den Platz für Eingabeaufforderungen, Chat-Logs und Wissen begrenzen. \nEs wird empfohlen, dies unter zwei Dritteln zu setzen\ngpt-4-1106-Vorschau, gpt-4-vision-Vorschau maximale Token (Eingabe 128k Ausgabe 4k)', - maxTokenSettingTip: 'Ihre Einstellung für maximale Token ist hoch, was den Platz für Eingabeaufforderungen, Abfragen und Daten potenziell begrenzen kann. Erwägen Sie, dies unter 2/3 zu setzen.', - setToCurrentModelMaxTokenTip: 'Maximale Token auf 80 % der maximalen Token des aktuellen Modells {{maxToken}} aktualisiert.', - stop_sequences: 'Stop-Sequenzen', - stop_sequencesTip: 'Bis zu vier Sequenzen, bei denen die API die Generierung weiterer Token stoppt. Der zurückgegebene Text wird die Stop-Sequenz nicht enthalten.', - stop_sequencesPlaceholder: 'Sequenz eingeben und Tab drücken', - }, - tone: { - Creative: 'Kreativ', - Balanced: 'Ausgewogen', - Precise: 'Präzise', - Custom: 'Benutzerdefiniert', - }, - addMoreModel: 'Gehen Sie zu den Einstellungen, um mehr Modelle hinzuzufügen', - }, - menus: { - status: 'Beta', - explore: 'Erkunden', - apps: 'Studio', - plugins: 'Plugins', - pluginsTips: 'Integrieren Sie Plugins von Drittanbietern oder erstellen Sie ChatGPT-kompatible KI-Plugins.', - datasets: 'Wissen', - datasetsTips: 'BALD VERFÜGBAR: Importieren Sie Ihre eigenen Textdaten oder schreiben Sie Daten in Echtzeit über Webhook, um den LLM-Kontext zu verbessern.', - newApp: 'Neue App', - newDataset: 'Wissen erstellen', - tools: 'Werkzeuge', - }, - userProfile: { - settings: 'Einstellungen', - workspace: 'Arbeitsbereich', - createWorkspace: 'Arbeitsbereich erstellen', - helpCenter: 'Hilfe', - roadmapAndFeedback: 'Feedback', - community: 'Gemeinschaft', - about: 'Über', - logout: 'Abmelden', - }, - settings: { - accountGroup: 'KONTO', - workplaceGroup: 'ARBEITSBEREICH', - account: 'Mein Konto', - members: 'Mitglieder', - billing: 'Abrechnung', - integrations: 'Integrationen', - language: 'Sprache', - provider: 'Modellanbieter', - dataSource: 'Datenquelle', - plugin: 'Plugins', - apiBasedExtension: 'API-Erweiterung', - }, - account: { - avatar: 'Avatar', - name: 'Name', - email: 'E-Mail', - password: 'Passwort', - passwordTip: 'Sie können ein dauerhaftes Passwort festlegen, wenn Sie keine temporären Anmeldecodes verwenden möchten', - setPassword: 'Ein Passwort festlegen', - resetPassword: 'Passwort zurücksetzen', - currentPassword: 'Aktuelles Passwort', - newPassword: 'Neues Passwort', - confirmPassword: 'Passwort bestätigen', - notEqual: 'Die Passwörter sind unterschiedlich.', - langGeniusAccount: 'Dify-Konto', - langGeniusAccountTip: 'Ihr Dify-Konto und zugehörige Benutzerdaten.', - editName: 'Namen bearbeiten', - showAppLength: '{{length}} Apps anzeigen', - }, - members: { - team: 'Team', - invite: 'Hinzufügen', - name: 'NAME', - lastActive: 'ZULETZT AKTIV', - role: 'ROLLEN', - pending: 'Ausstehend...', - owner: 'Eigentümer', - admin: 'Admin', - adminTip: 'Kann Apps erstellen & Team-Einstellungen verwalten', - normal: 'Normal', - normalTip: 'Kann nur Apps verwenden, kann keine Apps erstellen', - inviteTeamMember: 'Teammitglied hinzufügen', - inviteTeamMemberTip: 'Sie können direkt nach der Anmeldung auf Ihre Teamdaten zugreifen.', - email: 'E-Mail', - emailInvalid: 'Ungültiges E-Mail-Format', - emailPlaceholder: 'Bitte E-Mails eingeben', - sendInvite: 'Einladung senden', - invitedAsRole: 'Eingeladen als {{role}}-Benutzer', - invitationSent: 'Einladung gesendet', - invitationSentTip: 'Einladung gesendet, und sie können sich bei Dify anmelden, um auf Ihre Teamdaten zuzugreifen.', - invitationLink: 'Einladungslink', - failedinvitationEmails: 'Die folgenden Benutzer wurden nicht erfolgreich eingeladen', - ok: 'OK', - removeFromTeam: 'Vom Team entfernen', - removeFromTeamTip: 'Wird den Teamzugang entfernen', - setAdmin: 'Als Administrator einstellen', - setMember: 'Als normales Mitglied einstellen', - disinvite: 'Einladung widerrufen', - deleteMember: 'Mitglied löschen', - you: '(Du)', - }, - integrations: { - connected: 'Verbunden', - google: 'Google', - googleAccount: 'Mit Google-Konto anmelden', - github: 'GitHub', - githubAccount: 'Mit GitHub-Konto anmelden', - connect: 'Verbinden', - }, - language: { - displayLanguage: 'Anzeigesprache', - timezone: 'Zeitzone', - }, - provider: { - apiKey: 'API-Schlüssel', - enterYourKey: 'Geben Sie hier Ihren API-Schlüssel ein', - invalidKey: 'Ungültiger OpenAI API-Schlüssel', - validatedError: 'Validierung fehlgeschlagen: ', - validating: 'Schlüssel wird validiert...', - saveFailed: 'API-Schlüssel speichern fehlgeschlagen', - apiKeyExceedBill: 'Dieser API-SCHLÜSSEL verfügt über kein verfügbares Kontingent, bitte lesen', - addKey: 'Schlüssel hinzufügen', - comingSoon: 'Demnächst verfügbar', - editKey: 'Bearbeiten', - invalidApiKey: 'Ungültiger API-Schlüssel', - azure: { - apiBase: 'API-Basis', - apiBasePlaceholder: 'Die API-Basis-URL Ihres Azure OpenAI-Endpunkts.', - apiKey: 'API-Schlüssel', - apiKeyPlaceholder: 'Geben Sie hier Ihren API-Schlüssel ein', - helpTip: 'Azure OpenAI Service kennenlernen', - }, - openaiHosted: { - openaiHosted: 'Gehostetes OpenAI', - onTrial: 'IN PROBE', - exhausted: 'KONTINGENT ERSCHÖPFT', - desc: 'Der OpenAI-Hostingdienst von Dify ermöglicht es Ihnen, Modelle wie GPT-3.5 zu verwenden. Bevor Ihr Probe-Kontingent aufgebraucht ist, müssen Sie andere Modellanbieter einrichten.', - callTimes: 'Anrufzeiten', - usedUp: 'Probe-Kontingent aufgebraucht. Eigenen Modellanbieter hinzufügen.', - useYourModel: 'Derzeit wird eigener Modellanbieter verwendet.', - close: 'Schließen', - }, - anthropicHosted: { - anthropicHosted: 'Anthropic Claude', - onTrial: 'IN PROBE', - exhausted: 'KONTINGENT ERSCHÖPFT', - desc: 'Leistungsstarkes Modell, das bei einer Vielzahl von Aufgaben von anspruchsvollen Dialogen und kreativer Inhalteerstellung bis hin zu detaillierten Anweisungen hervorragend ist.', - callTimes: 'Anrufzeiten', - usedUp: 'Testkontingent aufgebraucht. Eigenen Modellanbieter hinzufügen.', - useYourModel: 'Derzeit wird eigener Modellanbieter verwendet.', - close: 'Schließen', - }, - anthropic: { - using: 'Die Einbettungsfähigkeit verwendet', - enableTip: 'Um das Anthropische Modell zu aktivieren, müssen Sie sich zuerst mit OpenAI oder Azure OpenAI Service verbinden.', - notEnabled: 'Nicht aktiviert', - keyFrom: 'Holen Sie Ihren API-Schlüssel von Anthropic', - }, - encrypted: { - front: 'Ihr API-SCHLÜSSEL wird verschlüsselt und mit', - back: ' Technologie gespeichert.', - }, - }, - modelProvider: { - notConfigured: 'Das Systemmodell wurde noch nicht vollständig konfiguriert, und einige Funktionen sind möglicherweise nicht verfügbar.', - systemModelSettings: 'Systemmodell-Einstellungen', - systemModelSettingsLink: 'Warum ist es notwendig, ein Systemmodell einzurichten?', - selectModel: 'Wählen Sie Ihr Modell', - setupModelFirst: 'Bitte richten Sie zuerst Ihr Modell ein', - systemReasoningModel: { - key: 'System-Reasoning-Modell', - tip: 'Legen Sie das Standardinferenzmodell fest, das für die Erstellung von Anwendungen verwendet wird, sowie Funktionen wie die Generierung von Dialognamen und die Vorschlagserstellung für die nächste Frage, die auch das Standardinferenzmodell verwenden.', - }, - embeddingModel: { - key: 'Einbettungsmodell', - tip: 'Legen Sie das Standardmodell für die Dokumenteneinbettungsverarbeitung des Wissens fest, sowohl die Wiederherstellung als auch der Import des Wissens verwenden dieses Einbettungsmodell für die Vektorisierungsverarbeitung. Ein Wechsel wird dazu führen, dass die Vektordimension zwischen dem importierten Wissen und der Frage inkonsistent ist, was zu einem Wiederherstellungsfehler führt. Um einen Wiederherstellungsfehler zu vermeiden, wechseln Sie dieses Modell bitte nicht willkürlich.', - required: 'Einbettungsmodell ist erforderlich', - }, - speechToTextModel: { - key: 'Sprach-zu-Text-Modell', - tip: 'Legen Sie das Standardmodell für die Spracheingabe in Konversationen fest.', - }, - ttsModel: { - key: 'Text-zu-Sprache-Modell', - tip: 'Legen Sie das Standardmodell für die Text-zu-Sprache-Eingabe in Konversationen fest.', - }, - rerankModel: { - key: 'Rerank-Modell', - tip: 'Rerank-Modell wird die Kandidatendokumentenliste basierend auf der semantischen Übereinstimmung mit der Benutzeranfrage neu ordnen und die Ergebnisse der semantischen Rangordnung verbessern', - }, - quota: 'Kontingent', - searchModel: 'Suchmodell', - noModelFound: 'Kein Modell für {{model}} gefunden', - models: 'Modelle', - showMoreModelProvider: 'Zeige mehr Modellanbieter', - selector: { - tip: 'Dieses Modell wurde entfernt. Bitte fügen Sie ein Modell hinzu oder wählen Sie ein anderes Modell.', - emptyTip: 'Keine verfügbaren Modelle', - emptySetting: 'Bitte gehen Sie zu den Einstellungen, um zu konfigurieren', - rerankTip: 'Bitte richten Sie das Rerank-Modell ein', - }, - card: { - quota: 'KONTINGENT', - onTrial: 'In Probe', - paid: 'Bezahlt', - quotaExhausted: 'Kontingent erschöpft', - callTimes: 'Anrufzeiten', - tokens: 'Token', - buyQuota: 'Kontingent kaufen', - priorityUse: 'Priorisierte Nutzung', - removeKey: 'API-Schlüssel entfernen', - tip: 'Der bezahlten Kontingent wird Vorrang gegeben. Das Testkontingent wird nach dem Verbrauch des bezahlten Kontingents verwendet.', - }, - item: { - deleteDesc: '{{modelName}} werden als System-Reasoning-Modelle verwendet. Einige Funktionen stehen nach der Entfernung nicht zur Verfügung. Bitte bestätigen.', - freeQuota: 'KOSTENLOSES KONTINGENT', - }, - addApiKey: 'Fügen Sie Ihren API-Schlüssel hinzu', - invalidApiKey: 'Ungültiger API-Schlüssel', - encrypted: { - front: 'Ihr API-SCHLÜSSEL wird verschlüsselt und mit', - back: ' Technologie gespeichert.', - }, - freeQuota: { - howToEarn: 'Wie zu verdienen', - }, - addMoreModelProvider: 'MEHR MODELLANBIETER HINZUFÜGEN', - addModel: 'Modell hinzufügen', - modelsNum: '{{num}} Modelle', - showModels: 'Modelle anzeigen', - showModelsNum: 'Zeige {{num}} Modelle', - collapse: 'Einklappen', - config: 'Konfigurieren', - modelAndParameters: 'Modell und Parameter', - model: 'Modell', - featureSupported: '{{feature}} unterstützt', - callTimes: 'Anrufzeiten', - credits: 'Nachrichtenguthaben', - buyQuota: 'Kontingent kaufen', - getFreeTokens: 'Kostenlose Token erhalten', - priorityUsing: 'Bevorzugte Nutzung', - deprecated: 'Veraltet', - confirmDelete: 'Löschung bestätigen?', - quotaTip: 'Verbleibende verfügbare kostenlose Token', - loadPresets: 'Voreinstellungen laden', - parameters: 'PARAMETER', - }, - dataSource: { - add: 'Eine Datenquelle hinzufügen', - connect: 'Verbinden', - notion: { - title: 'Notion', - description: 'Notion als Datenquelle für das Wissen verwenden.', - connectedWorkspace: 'Verbundener Arbeitsbereich', - addWorkspace: 'Arbeitsbereich hinzufügen', - connected: 'Verbunden', - disconnected: 'Getrennt', - changeAuthorizedPages: 'Autorisierte Seiten ändern', - pagesAuthorized: 'Autorisierte Seiten', - sync: 'Synchronisieren', - remove: 'Entfernen', - selector: { - pageSelected: 'Ausgewählte Seiten', - searchPages: 'Seiten suchen...', - noSearchResult: 'Keine Suchergebnisse', - addPages: 'Seiten hinzufügen', - preview: 'VORSCHAU', - }, - }, - }, - plugin: { - serpapi: { - apiKey: 'API-Schlüssel', - apiKeyPlaceholder: 'Geben Sie Ihren API-Schlüssel ein', - keyFrom: 'Holen Sie Ihren SerpAPI-Schlüssel von der SerpAPI-Kontoseite', - }, - }, - apiBasedExtension: { - title: 'API-Erweiterungen bieten zentralisiertes API-Management und vereinfachen die Konfiguration für eine einfache Verwendung in Difys Anwendungen.', - link: 'Erfahren Sie, wie Sie Ihre eigene API-Erweiterung entwickeln.', - linkUrl: 'https://docs.dify.ai/features/extension/api_based_extension', - add: 'API-Erweiterung hinzufügen', - selector: { - title: 'API-Erweiterung', - placeholder: 'Bitte wählen Sie API-Erweiterung', - manage: 'API-Erweiterung verwalten', - }, - modal: { - title: 'API-Erweiterung hinzufügen', - editTitle: 'API-Erweiterung bearbeiten', - name: { - title: 'Name', - placeholder: 'Bitte geben Sie den Namen ein', - }, - apiEndpoint: { - title: 'API-Endpunkt', - placeholder: 'Bitte geben Sie den API-Endpunkt ein', - }, - apiKey: { - title: 'API-Schlüssel', - placeholder: 'Bitte geben Sie den API-Schlüssel ein', - lengthError: 'Die Länge des API-Schlüssels darf nicht weniger als 5 Zeichen betragen', - }, - }, - type: 'Typ', - }, - about: { - changeLog: 'Änderungsprotokoll', - updateNow: 'Jetzt aktualisieren', - nowAvailable: 'Dify {{version}} ist jetzt verfügbar.', - latestAvailable: 'Dify {{version}} ist die neueste verfügbare Version.', - }, - appMenus: { - overview: 'Übersicht', - promptEng: 'Orchestrieren', - apiAccess: 'API-Zugriff', - logAndAnn: 'Protokolle & Ank.', - }, - environment: { - testing: 'TESTEN', - development: 'ENTWICKLUNG', - }, - appModes: { - completionApp: 'Textgenerator', - chatApp: 'Chat-App', - }, - datasetMenus: { - documents: 'Dokumente', - hitTesting: 'Wiederherstellungstest', - settings: 'Einstellungen', - emptyTip: 'Das Wissen wurde nicht zugeordnet, bitte gehen Sie zur Anwendung oder zum Plug-in, um die Zuordnung abzuschließen.', - viewDoc: 'Dokumentation anzeigen', - relatedApp: 'verbundene Apps', - }, - voiceInput: { - speaking: 'Sprechen Sie jetzt...', - converting: 'Umwandlung in Text...', - notAllow: 'Mikrofon nicht autorisiert', - }, - modelName: { - 'gpt-3.5-turbo': 'GPT-3.5-Turbo', - 'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16K', - 'gpt-4': 'GPT-4', - 'gpt-4-32k': 'GPT-4-32K', - 'text-davinci-003': 'Text-Davinci-003', - 'text-embedding-ada-002': 'Text-Embedding-Ada-002', - 'whisper-1': 'Flüstern-1', - 'claude-instant-1': 'Claude-Instant', - 'claude-2': 'Claude-2', - }, - chat: { - renameConversation: 'Konversation umbenennen', - conversationName: 'Konversationsname', - conversationNamePlaceholder: 'Bitte geben Sie den Konversationsnamen ein', - conversationNameCanNotEmpty: 'Konversationsname erforderlich', - citation: { - title: 'ZITIERUNGEN', - linkToDataset: 'Link zum Wissen', - characters: 'Zeichen:', - hitCount: 'Abrufanzahl:', - vectorHash: 'Vektorhash:', - hitScore: 'Abrufwertung:', - }, - }, - promptEditor: { - placeholder: 'Schreiben Sie hier Ihr Aufforderungswort, geben Sie \'{\' ein, um eine Variable einzufügen, geben Sie \'/\' ein, um einen Aufforderungs-Inhaltsblock einzufügen', - context: { - item: { - title: 'Kontext', - desc: 'Kontextvorlage einfügen', - }, - modal: { - title: '{{num}} Wissen im Kontext', - add: 'Kontext hinzufügen', - footer: 'Sie können Kontexte im unten stehenden Kontextabschnitt verwalten.', - }, - }, - history: { - item: { - title: 'Konversationsgeschichte', - desc: 'Vorlage für historische Nachricht einfügen', - }, - modal: { - title: 'BEISPIEL', - user: 'Hallo', - assistant: 'Hallo! Wie kann ich Ihnen heute helfen?', - edit: 'Konversationsrollennamen bearbeiten', - }, - }, - variable: { - item: { - title: 'Variablen & Externe Werkzeuge', - desc: 'Variablen & Externe Werkzeuge einfügen', - }, - modal: { - add: 'Neue Variable', - addTool: 'Neues Werkzeug', - }, - }, - query: { - item: { - title: 'Abfrage', - desc: 'Benutzerabfragevorlage einfügen', - }, - }, - existed: 'Bereits im Aufforderungstext vorhanden', - }, - imageUploader: { - uploadFromComputer: 'Vom Computer hochladen', - uploadFromComputerReadError: 'Bildlesung fehlgeschlagen, bitte versuchen Sie es erneut.', - uploadFromComputerUploadError: 'Bildupload fehlgeschlagen, bitte erneut hochladen.', - uploadFromComputerLimit: 'Hochgeladene Bilder dürfen {{size}} MB nicht überschreiten', - pasteImageLink: 'Bildlink einfügen', - pasteImageLinkInputPlaceholder: 'Bildlink hier einfügen', - pasteImageLinkInvalid: 'Ungültiger Bildlink', - imageUpload: 'Bild-Upload', - }, - tag: { - placeholder: 'Alle Tags', - addNew: 'Neues Tag hinzufügen', - noTag: 'Keine Tags', - noTagYet: 'Noch keine Tags', - addTag: 'Tags hinzufügen', - editTag: 'Tags bearbeiten', - manageTags: 'Tags verwalten', - selectorPlaceholder: 'Typ zum Suchen oder Erstellen', - create: 'Erstellen', - delete: 'Tag löschen', - deleteTip: 'Das Tag wird verwendet, löschen?', - created: 'Tag erfolgreich erstellt', - failed: 'Tag-Erstellung fehlgeschlagen', - }, -} - -export default translation +const translation = { + api: { + success: 'Erfolg', + actionSuccess: 'Aktion erfolgreich', + saved: 'Gespeichert', + create: 'Erstellt', + remove: 'Entfernt', + }, + operation: { + create: 'Erstellen', + confirm: 'Bestätigen', + cancel: 'Abbrechen', + clear: 'Leeren', + save: 'Speichern', + edit: 'Bearbeiten', + add: 'Hinzufügen', + added: 'Hinzugefügt', + refresh: 'Neustart', + reset: 'Zurücksetzen', + search: 'Suchen', + change: 'Ändern', + remove: 'Entfernen', + send: 'Senden', + copy: 'Kopieren', + lineBreak: 'Zeilenumbruch', + sure: 'Ich bin sicher', + download: 'Herunterladen', + delete: 'Löschen', + settings: 'Einstellungen', + setup: 'Einrichten', + getForFree: 'Kostenlos erhalten', + reload: 'Neu laden', + ok: 'OK', + log: 'Protokoll', + learnMore: 'Mehr erfahren', + params: 'Parameter', + duplicate: 'Duplikat', + rename: 'Umbenennen', + }, + placeholder: { + input: 'Bitte eingeben', + select: 'Bitte auswählen', + }, + voice: { + language: { + zhHans: 'Chinesisch', + zhHant: 'Chinesisch (traditionell)', + enUS: 'Englisch', + deDE: 'Deutsch', + frFR: 'Französisch', + esES: 'Spanisch', + itIT: 'Italienisch', + thTH: 'Thailändisch', + idID: 'Indonesisch', + jaJP: 'Japanisch', + koKR: 'Koreanisch', + ptBR: 'Portugiesisch', + ruRU: 'Russisch', + ukUA: 'Ukrainisch', + viVN: 'Vietnamesisch', + }, + }, + unit: { + char: 'Zeichen', + }, + actionMsg: { + noModification: 'Im Moment keine Änderungen.', + modifiedSuccessfully: 'Erfolgreich geändert', + modifiedUnsuccessfully: 'Änderung nicht erfolgreich', + copySuccessfully: 'Erfolgreich kopiert', + paySucceeded: 'Zahlung erfolgreich', + payCancelled: 'Zahlung abgebrochen', + generatedSuccessfully: 'Erfolgreich generiert', + generatedUnsuccessfully: 'Generierung nicht erfolgreich', + }, + model: { + params: { + temperature: 'Temperatur', + temperatureTip: + 'Kontrolliert Zufälligkeit: Eine niedrigere Temperatur führt zu weniger zufälligen Ergebnissen. Nähert sich die Temperatur null, wird das Modell deterministisch und repetitiv.', + top_p: 'Top P', + top_pTip: + 'Kontrolliert Diversität über Nukleus-Sampling: 0,5 bedeutet, dass die Hälfte aller wahrscheinlichkeitsgewichteten Optionen berücksichtigt wird.', + presence_penalty: 'Präsenz-Strafe', + presence_penaltyTip: + 'Wie stark neue Tokens basierend darauf bestraft werden, ob sie bereits im Text erschienen sind.\nErhöht die Wahrscheinlichkeit des Modells, über neue Themen zu sprechen.', + frequency_penalty: 'Häufigkeitsstrafe', + frequency_penaltyTip: + 'Wie stark neue Tokens basierend auf ihrer bisherigen Häufigkeit im Text bestraft werden.\nVerringert die Wahrscheinlichkeit des Modells, denselben Satz wortwörtlich zu wiederholen.', + max_tokens: 'Maximale Token', + max_tokensTip: + 'Begrenzt die maximale Länge der Antwort in Token. \nGrößere Werte können den Platz für Eingabeaufforderungen, Chat-Logs und Wissen begrenzen. \nEs wird empfohlen, dies unter zwei Dritteln zu setzen\ngpt-4-1106-Vorschau, gpt-4-vision-Vorschau maximale Token (Eingabe 128k Ausgabe 4k)', + maxTokenSettingTip: 'Ihre Einstellung für maximale Token ist hoch, was den Platz für Eingabeaufforderungen, Abfragen und Daten potenziell begrenzen kann. Erwägen Sie, dies unter 2/3 zu setzen.', + setToCurrentModelMaxTokenTip: 'Maximale Token auf 80 % der maximalen Token des aktuellen Modells {{maxToken}} aktualisiert.', + stop_sequences: 'Stop-Sequenzen', + stop_sequencesTip: 'Bis zu vier Sequenzen, bei denen die API die Generierung weiterer Token stoppt. Der zurückgegebene Text wird die Stop-Sequenz nicht enthalten.', + stop_sequencesPlaceholder: 'Sequenz eingeben und Tab drücken', + }, + tone: { + Creative: 'Kreativ', + Balanced: 'Ausgewogen', + Precise: 'Präzise', + Custom: 'Benutzerdefiniert', + }, + addMoreModel: 'Gehen Sie zu den Einstellungen, um mehr Modelle hinzuzufügen', + }, + menus: { + status: 'Beta', + explore: 'Erkunden', + apps: 'Studio', + plugins: 'Plugins', + pluginsTips: 'Integrieren Sie Plugins von Drittanbietern oder erstellen Sie ChatGPT-kompatible KI-Plugins.', + datasets: 'Wissen', + datasetsTips: 'BALD VERFÜGBAR: Importieren Sie Ihre eigenen Textdaten oder schreiben Sie Daten in Echtzeit über Webhook, um den LLM-Kontext zu verbessern.', + newApp: 'Neue App', + newDataset: 'Wissen erstellen', + tools: 'Werkzeuge', + }, + userProfile: { + settings: 'Einstellungen', + workspace: 'Arbeitsbereich', + createWorkspace: 'Arbeitsbereich erstellen', + helpCenter: 'Hilfe', + roadmapAndFeedback: 'Feedback', + community: 'Gemeinschaft', + about: 'Über', + logout: 'Abmelden', + }, + settings: { + accountGroup: 'KONTO', + workplaceGroup: 'ARBEITSBEREICH', + account: 'Mein Konto', + members: 'Mitglieder', + billing: 'Abrechnung', + integrations: 'Integrationen', + language: 'Sprache', + provider: 'Modellanbieter', + dataSource: 'Datenquelle', + plugin: 'Plugins', + apiBasedExtension: 'API-Erweiterung', + }, + account: { + avatar: 'Avatar', + name: 'Name', + email: 'E-Mail', + password: 'Passwort', + passwordTip: 'Sie können ein dauerhaftes Passwort festlegen, wenn Sie keine temporären Anmeldecodes verwenden möchten', + setPassword: 'Ein Passwort festlegen', + resetPassword: 'Passwort zurücksetzen', + currentPassword: 'Aktuelles Passwort', + newPassword: 'Neues Passwort', + confirmPassword: 'Passwort bestätigen', + notEqual: 'Die Passwörter sind unterschiedlich.', + langGeniusAccount: 'Dify-Konto', + langGeniusAccountTip: 'Ihr Dify-Konto und zugehörige Benutzerdaten.', + editName: 'Namen bearbeiten', + showAppLength: '{{length}} Apps anzeigen', + }, + members: { + team: 'Team', + invite: 'Hinzufügen', + name: 'NAME', + lastActive: 'ZULETZT AKTIV', + role: 'ROLLEN', + pending: 'Ausstehend...', + owner: 'Eigentümer', + admin: 'Admin', + adminTip: 'Kann Apps erstellen & Team-Einstellungen verwalten', + normal: 'Normal', + normalTip: 'Kann nur Apps verwenden, kann keine Apps erstellen', + inviteTeamMember: 'Teammitglied hinzufügen', + inviteTeamMemberTip: 'Sie können direkt nach der Anmeldung auf Ihre Teamdaten zugreifen.', + email: 'E-Mail', + emailInvalid: 'Ungültiges E-Mail-Format', + emailPlaceholder: 'Bitte E-Mails eingeben', + sendInvite: 'Einladung senden', + invitedAsRole: 'Eingeladen als {{role}}-Benutzer', + invitationSent: 'Einladung gesendet', + invitationSentTip: 'Einladung gesendet, und sie können sich bei Dify anmelden, um auf Ihre Teamdaten zuzugreifen.', + invitationLink: 'Einladungslink', + failedinvitationEmails: 'Die folgenden Benutzer wurden nicht erfolgreich eingeladen', + ok: 'OK', + removeFromTeam: 'Vom Team entfernen', + removeFromTeamTip: 'Wird den Teamzugang entfernen', + setAdmin: 'Als Administrator einstellen', + setMember: 'Als normales Mitglied einstellen', + disinvite: 'Einladung widerrufen', + deleteMember: 'Mitglied löschen', + you: '(Du)', + }, + integrations: { + connected: 'Verbunden', + google: 'Google', + googleAccount: 'Mit Google-Konto anmelden', + github: 'GitHub', + githubAccount: 'Mit GitHub-Konto anmelden', + connect: 'Verbinden', + }, + language: { + displayLanguage: 'Anzeigesprache', + timezone: 'Zeitzone', + }, + provider: { + apiKey: 'API-Schlüssel', + enterYourKey: 'Geben Sie hier Ihren API-Schlüssel ein', + invalidKey: 'Ungültiger OpenAI API-Schlüssel', + validatedError: 'Validierung fehlgeschlagen: ', + validating: 'Schlüssel wird validiert...', + saveFailed: 'API-Schlüssel speichern fehlgeschlagen', + apiKeyExceedBill: 'Dieser API-SCHLÜSSEL verfügt über kein verfügbares Kontingent, bitte lesen', + addKey: 'Schlüssel hinzufügen', + comingSoon: 'Demnächst verfügbar', + editKey: 'Bearbeiten', + invalidApiKey: 'Ungültiger API-Schlüssel', + azure: { + apiBase: 'API-Basis', + apiBasePlaceholder: 'Die API-Basis-URL Ihres Azure OpenAI-Endpunkts.', + apiKey: 'API-Schlüssel', + apiKeyPlaceholder: 'Geben Sie hier Ihren API-Schlüssel ein', + helpTip: 'Azure OpenAI Service kennenlernen', + }, + openaiHosted: { + openaiHosted: 'Gehostetes OpenAI', + onTrial: 'IN PROBE', + exhausted: 'KONTINGENT ERSCHÖPFT', + desc: 'Der OpenAI-Hostingdienst von Dify ermöglicht es Ihnen, Modelle wie GPT-3.5 zu verwenden. Bevor Ihr Probe-Kontingent aufgebraucht ist, müssen Sie andere Modellanbieter einrichten.', + callTimes: 'Anrufzeiten', + usedUp: 'Probe-Kontingent aufgebraucht. Eigenen Modellanbieter hinzufügen.', + useYourModel: 'Derzeit wird eigener Modellanbieter verwendet.', + close: 'Schließen', + }, + anthropicHosted: { + anthropicHosted: 'Anthropic Claude', + onTrial: 'IN PROBE', + exhausted: 'KONTINGENT ERSCHÖPFT', + desc: 'Leistungsstarkes Modell, das bei einer Vielzahl von Aufgaben von anspruchsvollen Dialogen und kreativer Inhalteerstellung bis hin zu detaillierten Anweisungen hervorragend ist.', + callTimes: 'Anrufzeiten', + usedUp: 'Testkontingent aufgebraucht. Eigenen Modellanbieter hinzufügen.', + useYourModel: 'Derzeit wird eigener Modellanbieter verwendet.', + close: 'Schließen', + }, + anthropic: { + using: 'Die Einbettungsfähigkeit verwendet', + enableTip: 'Um das Anthropische Modell zu aktivieren, müssen Sie sich zuerst mit OpenAI oder Azure OpenAI Service verbinden.', + notEnabled: 'Nicht aktiviert', + keyFrom: 'Holen Sie Ihren API-Schlüssel von Anthropic', + }, + encrypted: { + front: 'Ihr API-SCHLÜSSEL wird verschlüsselt und mit', + back: ' Technologie gespeichert.', + }, + }, + modelProvider: { + notConfigured: 'Das Systemmodell wurde noch nicht vollständig konfiguriert, und einige Funktionen sind möglicherweise nicht verfügbar.', + systemModelSettings: 'Systemmodell-Einstellungen', + systemModelSettingsLink: 'Warum ist es notwendig, ein Systemmodell einzurichten?', + selectModel: 'Wählen Sie Ihr Modell', + setupModelFirst: 'Bitte richten Sie zuerst Ihr Modell ein', + systemReasoningModel: { + key: 'System-Reasoning-Modell', + tip: 'Legen Sie das Standardinferenzmodell fest, das für die Erstellung von Anwendungen verwendet wird, sowie Funktionen wie die Generierung von Dialognamen und die Vorschlagserstellung für die nächste Frage, die auch das Standardinferenzmodell verwenden.', + }, + embeddingModel: { + key: 'Einbettungsmodell', + tip: 'Legen Sie das Standardmodell für die Dokumenteneinbettungsverarbeitung des Wissens fest, sowohl die Wiederherstellung als auch der Import des Wissens verwenden dieses Einbettungsmodell für die Vektorisierungsverarbeitung. Ein Wechsel wird dazu führen, dass die Vektordimension zwischen dem importierten Wissen und der Frage inkonsistent ist, was zu einem Wiederherstellungsfehler führt. Um einen Wiederherstellungsfehler zu vermeiden, wechseln Sie dieses Modell bitte nicht willkürlich.', + required: 'Einbettungsmodell ist erforderlich', + }, + speechToTextModel: { + key: 'Sprach-zu-Text-Modell', + tip: 'Legen Sie das Standardmodell für die Spracheingabe in Konversationen fest.', + }, + ttsModel: { + key: 'Text-zu-Sprache-Modell', + tip: 'Legen Sie das Standardmodell für die Text-zu-Sprache-Eingabe in Konversationen fest.', + }, + rerankModel: { + key: 'Rerank-Modell', + tip: 'Rerank-Modell wird die Kandidatendokumentenliste basierend auf der semantischen Übereinstimmung mit der Benutzeranfrage neu ordnen und die Ergebnisse der semantischen Rangordnung verbessern', + }, + quota: 'Kontingent', + searchModel: 'Suchmodell', + noModelFound: 'Kein Modell für {{model}} gefunden', + models: 'Modelle', + showMoreModelProvider: 'Zeige mehr Modellanbieter', + selector: { + tip: 'Dieses Modell wurde entfernt. Bitte fügen Sie ein Modell hinzu oder wählen Sie ein anderes Modell.', + emptyTip: 'Keine verfügbaren Modelle', + emptySetting: 'Bitte gehen Sie zu den Einstellungen, um zu konfigurieren', + rerankTip: 'Bitte richten Sie das Rerank-Modell ein', + }, + card: { + quota: 'KONTINGENT', + onTrial: 'In Probe', + paid: 'Bezahlt', + quotaExhausted: 'Kontingent erschöpft', + callTimes: 'Anrufzeiten', + tokens: 'Token', + buyQuota: 'Kontingent kaufen', + priorityUse: 'Priorisierte Nutzung', + removeKey: 'API-Schlüssel entfernen', + tip: 'Der bezahlten Kontingent wird Vorrang gegeben. Das Testkontingent wird nach dem Verbrauch des bezahlten Kontingents verwendet.', + }, + item: { + deleteDesc: '{{modelName}} werden als System-Reasoning-Modelle verwendet. Einige Funktionen stehen nach der Entfernung nicht zur Verfügung. Bitte bestätigen.', + freeQuota: 'KOSTENLOSES KONTINGENT', + }, + addApiKey: 'Fügen Sie Ihren API-Schlüssel hinzu', + invalidApiKey: 'Ungültiger API-Schlüssel', + encrypted: { + front: 'Ihr API-SCHLÜSSEL wird verschlüsselt und mit', + back: ' Technologie gespeichert.', + }, + freeQuota: { + howToEarn: 'Wie zu verdienen', + }, + addMoreModelProvider: 'MEHR MODELLANBIETER HINZUFÜGEN', + addModel: 'Modell hinzufügen', + modelsNum: '{{num}} Modelle', + showModels: 'Modelle anzeigen', + showModelsNum: 'Zeige {{num}} Modelle', + collapse: 'Einklappen', + config: 'Konfigurieren', + modelAndParameters: 'Modell und Parameter', + model: 'Modell', + featureSupported: '{{feature}} unterstützt', + callTimes: 'Anrufzeiten', + credits: 'Nachrichtenguthaben', + buyQuota: 'Kontingent kaufen', + getFreeTokens: 'Kostenlose Token erhalten', + priorityUsing: 'Bevorzugte Nutzung', + deprecated: 'Veraltet', + confirmDelete: 'Löschung bestätigen?', + quotaTip: 'Verbleibende verfügbare kostenlose Token', + loadPresets: 'Voreinstellungen laden', + parameters: 'PARAMETER', + }, + dataSource: { + add: 'Eine Datenquelle hinzufügen', + connect: 'Verbinden', + notion: { + title: 'Notion', + description: 'Notion als Datenquelle für das Wissen verwenden.', + connectedWorkspace: 'Verbundener Arbeitsbereich', + addWorkspace: 'Arbeitsbereich hinzufügen', + connected: 'Verbunden', + disconnected: 'Getrennt', + changeAuthorizedPages: 'Autorisierte Seiten ändern', + pagesAuthorized: 'Autorisierte Seiten', + sync: 'Synchronisieren', + remove: 'Entfernen', + selector: { + pageSelected: 'Ausgewählte Seiten', + searchPages: 'Seiten suchen...', + noSearchResult: 'Keine Suchergebnisse', + addPages: 'Seiten hinzufügen', + preview: 'VORSCHAU', + }, + }, + }, + plugin: { + serpapi: { + apiKey: 'API-Schlüssel', + apiKeyPlaceholder: 'Geben Sie Ihren API-Schlüssel ein', + keyFrom: 'Holen Sie Ihren SerpAPI-Schlüssel von der SerpAPI-Kontoseite', + }, + }, + apiBasedExtension: { + title: 'API-Erweiterungen bieten zentralisiertes API-Management und vereinfachen die Konfiguration für eine einfache Verwendung in Difys Anwendungen.', + link: 'Erfahren Sie, wie Sie Ihre eigene API-Erweiterung entwickeln.', + linkUrl: 'https://docs.dify.ai/features/extension/api_based_extension', + add: 'API-Erweiterung hinzufügen', + selector: { + title: 'API-Erweiterung', + placeholder: 'Bitte wählen Sie API-Erweiterung', + manage: 'API-Erweiterung verwalten', + }, + modal: { + title: 'API-Erweiterung hinzufügen', + editTitle: 'API-Erweiterung bearbeiten', + name: { + title: 'Name', + placeholder: 'Bitte geben Sie den Namen ein', + }, + apiEndpoint: { + title: 'API-Endpunkt', + placeholder: 'Bitte geben Sie den API-Endpunkt ein', + }, + apiKey: { + title: 'API-Schlüssel', + placeholder: 'Bitte geben Sie den API-Schlüssel ein', + lengthError: 'Die Länge des API-Schlüssels darf nicht weniger als 5 Zeichen betragen', + }, + }, + type: 'Typ', + }, + about: { + changeLog: 'Änderungsprotokoll', + updateNow: 'Jetzt aktualisieren', + nowAvailable: 'Dify {{version}} ist jetzt verfügbar.', + latestAvailable: 'Dify {{version}} ist die neueste verfügbare Version.', + }, + appMenus: { + overview: 'Übersicht', + promptEng: 'Orchestrieren', + apiAccess: 'API-Zugriff', + logAndAnn: 'Protokolle & Ank.', + }, + environment: { + testing: 'TESTEN', + development: 'ENTWICKLUNG', + }, + appModes: { + completionApp: 'Textgenerator', + chatApp: 'Chat-App', + }, + datasetMenus: { + documents: 'Dokumente', + hitTesting: 'Wiederherstellungstest', + settings: 'Einstellungen', + emptyTip: 'Das Wissen wurde nicht zugeordnet, bitte gehen Sie zur Anwendung oder zum Plug-in, um die Zuordnung abzuschließen.', + viewDoc: 'Dokumentation anzeigen', + relatedApp: 'verbundene Apps', + }, + voiceInput: { + speaking: 'Sprechen Sie jetzt...', + converting: 'Umwandlung in Text...', + notAllow: 'Mikrofon nicht autorisiert', + }, + modelName: { + 'gpt-3.5-turbo': 'GPT-3.5-Turbo', + 'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16K', + 'gpt-4': 'GPT-4', + 'gpt-4-32k': 'GPT-4-32K', + 'text-davinci-003': 'Text-Davinci-003', + 'text-embedding-ada-002': 'Text-Embedding-Ada-002', + 'whisper-1': 'Flüstern-1', + 'claude-instant-1': 'Claude-Instant', + 'claude-2': 'Claude-2', + }, + chat: { + renameConversation: 'Konversation umbenennen', + conversationName: 'Konversationsname', + conversationNamePlaceholder: 'Bitte geben Sie den Konversationsnamen ein', + conversationNameCanNotEmpty: 'Konversationsname erforderlich', + citation: { + title: 'ZITIERUNGEN', + linkToDataset: 'Link zum Wissen', + characters: 'Zeichen:', + hitCount: 'Abrufanzahl:', + vectorHash: 'Vektorhash:', + hitScore: 'Abrufwertung:', + }, + }, + promptEditor: { + placeholder: 'Schreiben Sie hier Ihr Aufforderungswort, geben Sie \'{\' ein, um eine Variable einzufügen, geben Sie \'/\' ein, um einen Aufforderungs-Inhaltsblock einzufügen', + context: { + item: { + title: 'Kontext', + desc: 'Kontextvorlage einfügen', + }, + modal: { + title: '{{num}} Wissen im Kontext', + add: 'Kontext hinzufügen', + footer: 'Sie können Kontexte im unten stehenden Kontextabschnitt verwalten.', + }, + }, + history: { + item: { + title: 'Konversationsgeschichte', + desc: 'Vorlage für historische Nachricht einfügen', + }, + modal: { + title: 'BEISPIEL', + user: 'Hallo', + assistant: 'Hallo! Wie kann ich Ihnen heute helfen?', + edit: 'Konversationsrollennamen bearbeiten', + }, + }, + variable: { + item: { + title: 'Variablen & Externe Werkzeuge', + desc: 'Variablen & Externe Werkzeuge einfügen', + }, + modal: { + add: 'Neue Variable', + addTool: 'Neues Werkzeug', + }, + }, + query: { + item: { + title: 'Abfrage', + desc: 'Benutzerabfragevorlage einfügen', + }, + }, + existed: 'Bereits im Aufforderungstext vorhanden', + }, + imageUploader: { + uploadFromComputer: 'Vom Computer hochladen', + uploadFromComputerReadError: 'Bildlesung fehlgeschlagen, bitte versuchen Sie es erneut.', + uploadFromComputerUploadError: 'Bildupload fehlgeschlagen, bitte erneut hochladen.', + uploadFromComputerLimit: 'Hochgeladene Bilder dürfen {{size}} MB nicht überschreiten', + pasteImageLink: 'Bildlink einfügen', + pasteImageLinkInputPlaceholder: 'Bildlink hier einfügen', + pasteImageLinkInvalid: 'Ungültiger Bildlink', + imageUpload: 'Bild-Upload', + }, + tag: { + placeholder: 'Alle Tags', + addNew: 'Neues Tag hinzufügen', + noTag: 'Keine Tags', + noTagYet: 'Noch keine Tags', + addTag: 'Tags hinzufügen', + editTag: 'Tags bearbeiten', + manageTags: 'Tags verwalten', + selectorPlaceholder: 'Typ zum Suchen oder Erstellen', + create: 'Erstellen', + delete: 'Tag löschen', + deleteTip: 'Das Tag wird verwendet, löschen?', + created: 'Tag erfolgreich erstellt', + failed: 'Tag-Erstellung fehlgeschlagen', + }, +} + +export default translation diff --git a/web/i18n/de-DE/login.ts b/web/i18n/de-DE/login.ts index 560a8f65b5..06f9d6366d 100644 --- a/web/i18n/de-DE/login.ts +++ b/web/i18n/de-DE/login.ts @@ -1,59 +1,60 @@ -const translation = { - pageTitle: 'Hey, lass uns anfangen!👋', - welcome: 'Willkommen bei Dify, bitte melde dich an, um fortzufahren.', - email: 'E-Mail-Adresse', - emailPlaceholder: 'Deine E-Mail', - password: 'Passwort', - passwordPlaceholder: 'Dein Passwort', - name: 'Benutzername', - namePlaceholder: 'Dein Benutzername', - forget: 'Passwort vergessen?', - signBtn: 'Anmelden', - installBtn: 'Einrichten', - setAdminAccount: 'Admin-Konto einrichten', - setAdminAccountDesc: 'Maximale Berechtigungen für das Admin-Konto, das verwendet werden kann, um Anwendungen zu erstellen und LLM-Anbieter usw. zu verwalten.', - createAndSignIn: 'Erstellen und anmelden', - oneMoreStep: 'Nur noch ein Schritt', - createSample: 'Basierend auf diesen Informationen erstellen wir eine Beispielanwendung für dich', - invitationCode: 'Einladungscode', - invitationCodePlaceholder: 'Dein Einladungscode', - interfaceLanguage: 'Oberflächensprache', - timezone: 'Zeitzone', - go: 'Zu Dify gehen', - sendUsMail: 'Sende uns deine Vorstellung per E-Mail, und wir bearbeiten die Einladungsanfrage.', - acceptPP: 'Ich habe die Datenschutzbestimmungen gelesen und akzeptiere sie', - reset: 'Bitte führe den folgenden Befehl aus, um dein Passwort zurückzusetzen', - withGitHub: 'Mit GitHub fortfahren', - withGoogle: 'Mit Google fortfahren', - rightTitle: 'Das volle Potenzial von LLM ausschöpfen', - rightDesc: 'Mühelos optisch ansprechende, bedienbare und verbesserbare KI-Anwendungen erstellen.', - tos: 'Nutzungsbedingungen', - pp: 'Datenschutzbestimmungen', - tosDesc: 'Mit der Anmeldung stimmst du unseren', - donthave: 'Hast du nicht?', - invalidInvitationCode: 'Ungültiger Einladungscode', - accountAlreadyInited: 'Konto bereits initialisiert', - error: { - emailEmpty: 'E-Mail-Adresse wird benötigt', - emailInValid: 'Bitte gib eine gültige E-Mail-Adresse ein', - nameEmpty: 'Name wird benötigt', - passwordEmpty: 'Passwort wird benötigt', - passwordInvalid: 'Das Passwort muss Buchstaben und Zahlen enthalten und länger als 8 Zeichen sein', - }, - license: { - tip: 'Bevor du mit Dify Community Edition beginnst, lies die', - link: 'Open-Source-Lizenz', - }, - join: 'Beitreten', - joinTipStart: 'Lade dich ein, dem', - joinTipEnd: 'Team auf Dify beizutreten', - invalid: 'Der Link ist abgelaufen', - explore: 'Dify erkunden', - activatedTipStart: 'Du bist dem', - activatedTipEnd: 'Team beigetreten', - activated: 'Jetzt anmelden', - adminInitPassword: 'Admin-Initialpasswort', - validate: 'Validieren', -} - -export default translation +const translation = { + pageTitle: 'Hey, lass uns anfangen!👋', + welcome: 'Willkommen bei Dify, bitte melde dich an, um fortzufahren.', + email: 'E-Mail-Adresse', + emailPlaceholder: 'Deine E-Mail', + password: 'Passwort', + passwordPlaceholder: 'Dein Passwort', + name: 'Benutzername', + namePlaceholder: 'Dein Benutzername', + forget: 'Passwort vergessen?', + signBtn: 'Anmelden', + installBtn: 'Einrichten', + setAdminAccount: 'Admin-Konto einrichten', + setAdminAccountDesc: 'Maximale Berechtigungen für das Admin-Konto, das verwendet werden kann, um Anwendungen zu erstellen und LLM-Anbieter usw. zu verwalten.', + createAndSignIn: 'Erstellen und anmelden', + oneMoreStep: 'Nur noch ein Schritt', + createSample: 'Basierend auf diesen Informationen erstellen wir eine Beispielanwendung für dich', + invitationCode: 'Einladungscode', + invitationCodePlaceholder: 'Dein Einladungscode', + interfaceLanguage: 'Oberflächensprache', + timezone: 'Zeitzone', + go: 'Zu Dify gehen', + sendUsMail: 'Sende uns deine Vorstellung per E-Mail, und wir bearbeiten die Einladungsanfrage.', + acceptPP: 'Ich habe die Datenschutzbestimmungen gelesen und akzeptiere sie', + reset: 'Bitte führe den folgenden Befehl aus, um dein Passwort zurückzusetzen', + withGitHub: 'Mit GitHub fortfahren', + withGoogle: 'Mit Google fortfahren', + rightTitle: 'Das volle Potenzial von LLM ausschöpfen', + rightDesc: 'Mühelos optisch ansprechende, bedienbare und verbesserbare KI-Anwendungen erstellen.', + tos: 'Nutzungsbedingungen', + pp: 'Datenschutzbestimmungen', + tosDesc: 'Mit der Anmeldung stimmst du unseren', + goToInit: 'Wenn du das Konto noch nicht initialisiert hast, gehe bitte zur Initialisierungsseite', + donthave: 'Hast du nicht?', + invalidInvitationCode: 'Ungültiger Einladungscode', + accountAlreadyInited: 'Konto bereits initialisiert', + error: { + emailEmpty: 'E-Mail-Adresse wird benötigt', + emailInValid: 'Bitte gib eine gültige E-Mail-Adresse ein', + nameEmpty: 'Name wird benötigt', + passwordEmpty: 'Passwort wird benötigt', + passwordInvalid: 'Das Passwort muss Buchstaben und Zahlen enthalten und länger als 8 Zeichen sein', + }, + license: { + tip: 'Bevor du mit Dify Community Edition beginnst, lies die', + link: 'Open-Source-Lizenz', + }, + join: 'Beitreten', + joinTipStart: 'Lade dich ein, dem', + joinTipEnd: 'Team auf Dify beizutreten', + invalid: 'Der Link ist abgelaufen', + explore: 'Dify erkunden', + activatedTipStart: 'Du bist dem', + activatedTipEnd: 'Team beigetreten', + activated: 'Jetzt anmelden', + adminInitPassword: 'Admin-Initialpasswort', + validate: 'Validieren', +} + +export default translation diff --git a/web/i18n/en-US/common.ts b/web/i18n/en-US/common.ts index e3339d8e8c..d227f7aee4 100644 --- a/web/i18n/en-US/common.ts +++ b/web/i18n/en-US/common.ts @@ -44,6 +44,7 @@ const translation = { voice: { language: { zhHans: 'Chinese', + zhHant: 'Traditional Chinese', enUS: 'English', deDE: 'German', frFR: 'French', @@ -56,6 +57,7 @@ const translation = { ptBR: 'Portuguese', ruRU: 'Russian', ukUA: 'Ukrainian', + viVN: 'Vietnamese', }, }, unit: { diff --git a/web/i18n/en-US/login.ts b/web/i18n/en-US/login.ts index e8fdfce5ba..594935ece9 100644 --- a/web/i18n/en-US/login.ts +++ b/web/i18n/en-US/login.ts @@ -31,6 +31,7 @@ const translation = { tos: 'Terms of Service', pp: 'Privacy Policy', tosDesc: 'By signing up, you agree to our', + goToInit: 'If you have not initialized the account, please go to the initialization page', donthave: 'Don\'t have?', invalidInvitationCode: 'Invalid invitation code', accountAlreadyInited: 'Account already initialized', diff --git a/web/i18n/fr-FR/common.ts b/web/i18n/fr-FR/common.ts index 12abb61335..c6ede9b773 100644 --- a/web/i18n/fr-FR/common.ts +++ b/web/i18n/fr-FR/common.ts @@ -44,6 +44,7 @@ const translation = { voice: { language: { zhHans: 'Chinois', + zhHant: 'Chinois (traditionnel)', enUS: 'Anglais', deDE: 'Allemand', frFR: 'Français', @@ -56,6 +57,7 @@ const translation = { ptBR: 'Portugais', ruRU: 'Russe', ukUA: 'Ukrainien', + viVN: 'Vietnamien', }, }, unit: { diff --git a/web/i18n/fr-FR/login.ts b/web/i18n/fr-FR/login.ts index 38e4da2b18..71cc15f61a 100644 --- a/web/i18n/fr-FR/login.ts +++ b/web/i18n/fr-FR/login.ts @@ -30,6 +30,7 @@ const translation = { tos: 'Conditions de Service', pp: 'Politique de Confidentialité', tosDesc: 'En vous inscrivant, vous acceptez nos', + goToInit: 'Si vous n\'avez pas initialisé le compte, veuillez vous rendre sur la page d\'initialisation', donthave: 'Vous n\'avez pas ?', invalidInvitationCode: 'Code d\'invitation invalide', accountAlreadyInited: 'Compte déjà initialisé', diff --git a/web/i18n/index.ts b/web/i18n/index.ts index 976a3765ab..5af93035db 100644 --- a/web/i18n/index.ts +++ b/web/i18n/index.ts @@ -11,10 +11,6 @@ export const i18n = { export type Locale = typeof i18n['locales'][number] -export const getLocaleOnClient = (): Locale => { - return Cookies.get(LOCALE_COOKIE_NAME) as Locale || i18n.defaultLocale -} - export const setLocaleOnClient = (locale: Locale, reloadPage = true) => { Cookies.set(LOCALE_COOKIE_NAME, locale) changeLanguage(locale) diff --git a/web/i18n/ja-JP/common.ts b/web/i18n/ja-JP/common.ts index 060cbe30d1..5ae47dc474 100644 --- a/web/i18n/ja-JP/common.ts +++ b/web/i18n/ja-JP/common.ts @@ -44,6 +44,7 @@ const translation = { voice: { language: { zhHans: '中国語', + zhHant: '繁体字中国語', enUS: '英語', deDE: 'ドイツ語', frFR: 'フランス語', @@ -56,6 +57,7 @@ const translation = { ptBR: 'ポルトガル語', ruRU: 'ロシア語', ukUA: 'ウクライナ語', + viVN: 'ベトナム語', }, }, unit: { diff --git a/web/i18n/ja-JP/login.ts b/web/i18n/ja-JP/login.ts index 2ab862b8b6..ef87dd3df6 100644 --- a/web/i18n/ja-JP/login.ts +++ b/web/i18n/ja-JP/login.ts @@ -30,6 +30,7 @@ const translation = { tos: '利用規約', pp: 'プライバシーポリシー', tosDesc: 'サインアップすることで、以下に同意するものとします', + goToInit: 'アカウントを初期化していない場合は、初期化ページに移動してください', donthave: 'お持ちでない場合', invalidInvitationCode: '無効な招待コード', accountAlreadyInited: 'アカウントは既に初期化されています', diff --git a/web/i18n/pt-BR/common.ts b/web/i18n/pt-BR/common.ts index d74bb8317a..fa6168ebaf 100644 --- a/web/i18n/pt-BR/common.ts +++ b/web/i18n/pt-BR/common.ts @@ -44,6 +44,7 @@ const translation = { voice: { language: { zhHans: 'Chinês', + zhHant: 'Chinês Tradicional', enUS: 'Inglês', deDE: 'Alemão', frFR: 'Francês', @@ -56,6 +57,7 @@ const translation = { ptBR: 'Português', ruRU: 'Russo', ukUA: 'Ucraniano', + viVN: 'Vietnamita', }, }, unit: { diff --git a/web/i18n/pt-BR/login.ts b/web/i18n/pt-BR/login.ts index 11c88851a4..722c7eecf2 100644 --- a/web/i18n/pt-BR/login.ts +++ b/web/i18n/pt-BR/login.ts @@ -30,6 +30,7 @@ const translation = { tos: 'Termos de Serviço', pp: 'Política de Privacidade', tosDesc: 'Ao se inscrever, você concorda com nossos', + goToInit: 'Se você não inicializou a conta, vá para a página de inicialização', donthave: 'Não tem?', invalidInvitationCode: 'Código de convite inválido', accountAlreadyInited: 'Conta já iniciada', diff --git a/web/i18n/uk-UA/common.ts b/web/i18n/uk-UA/common.ts index 2203ae674a..1d344e4e26 100644 --- a/web/i18n/uk-UA/common.ts +++ b/web/i18n/uk-UA/common.ts @@ -44,6 +44,7 @@ const translation = { voice: { language: { zhHans: 'Китайська', + zhHant: 'Китайська (традиційна)', enUS: 'Англійська', deDE: 'Німецька', frFR: 'Французька', @@ -56,6 +57,7 @@ const translation = { ptBR: 'Португальська', ruRU: 'Російська', ukUA: 'Українська', + viVN: 'В\'є тнамська', }, }, unit: { diff --git a/web/i18n/uk-UA/login.ts b/web/i18n/uk-UA/login.ts index 78f8c92812..95bb7ccfea 100644 --- a/web/i18n/uk-UA/login.ts +++ b/web/i18n/uk-UA/login.ts @@ -30,6 +30,7 @@ const translation = { tos: 'Умови обслуговування', pp: 'Політика конфіденційності', tosDesc: 'Реєструючись, ви приймаєте наші', + goToInit: 'Якщо ви ще не ініціалізували обліковий запис, перейдіть на сторінку ініціалізації', donthave: 'Не маєте?', invalidInvitationCode: 'Недійсний код запрошення', accountAlreadyInited: 'Обліковий запис уже ініціалізовано', diff --git a/web/i18n/vi-VN/common.ts b/web/i18n/vi-VN/common.ts index db7a3e53cd..fe920a5b58 100644 --- a/web/i18n/vi-VN/common.ts +++ b/web/i18n/vi-VN/common.ts @@ -56,6 +56,7 @@ const translation = { ptBR: 'Tiếng Bồ Đào Nha', ruRU: 'Tiếng Nga', ukUA: 'Tiếng Ukraina', + viVN: 'Tiếng Việt', }, }, unit: { diff --git a/web/i18n/vi-VN/login.ts b/web/i18n/vi-VN/login.ts index 9f60027aa9..b8ae56a017 100644 --- a/web/i18n/vi-VN/login.ts +++ b/web/i18n/vi-VN/login.ts @@ -30,6 +30,7 @@ const translation = { tos: 'Điều khoản dịch vụ', pp: 'Chính sách bảo mật', tosDesc: 'Bằng cách đăng ký, bạn đồng ý với', + goToInit: 'Nếu bạn chưa khởi tạo tài khoản, vui lòng đi đến trang khởi tạo', donthave: 'Chưa có?', invalidInvitationCode: 'Mã mời không hợp lệ', accountAlreadyInited: 'Tài khoản đã được khởi tạo', diff --git a/web/i18n/zh-Hans/common.ts b/web/i18n/zh-Hans/common.ts index 2fa61fdbdb..655c395675 100644 --- a/web/i18n/zh-Hans/common.ts +++ b/web/i18n/zh-Hans/common.ts @@ -44,6 +44,7 @@ const translation = { voice: { language: { zhHans: '中文', + zhHant: '繁体中文', enUS: '英语', deDE: '德语', frFR: '法语', @@ -56,6 +57,7 @@ const translation = { ptBR: '葡萄牙语', ruRU: '俄语', ukUA: '乌克兰语', + viVN: '越南语', }, }, unit: { diff --git a/web/i18n/zh-Hans/login.ts b/web/i18n/zh-Hans/login.ts index 71051e6476..10c5ee4497 100644 --- a/web/i18n/zh-Hans/login.ts +++ b/web/i18n/zh-Hans/login.ts @@ -30,6 +30,7 @@ const translation = { tos: '使用协议', pp: '隐私政策', tosDesc: '使用即代表你并同意我们的', + goToInit: '如果您还没有初始化账户,请前往初始化页面', donthave: '还没有邀请码?', invalidInvitationCode: '无效的邀请码', accountAlreadyInited: '账户已经初始化', diff --git a/web/i18n/zh-Hant/common.ts b/web/i18n/zh-Hant/common.ts index d657e387d3..4a271a6985 100644 --- a/web/i18n/zh-Hant/common.ts +++ b/web/i18n/zh-Hant/common.ts @@ -44,6 +44,7 @@ const translation = { voice: { language: { zhHans: '中文', + zhHant: '繁體中文', enUS: '英語', deDE: '德語', frFR: '法語', @@ -56,6 +57,7 @@ const translation = { ptBR: '葡萄牙語', ruRU: '俄語', ukUA: '烏克蘭語', + viVN: '越南語', }, }, unit: { diff --git a/web/i18n/zh-Hant/login.ts b/web/i18n/zh-Hant/login.ts index d2092f2c7a..3b8a986fd0 100644 --- a/web/i18n/zh-Hant/login.ts +++ b/web/i18n/zh-Hant/login.ts @@ -30,6 +30,7 @@ const translation = { tos: '使用協議', pp: '隱私政策', tosDesc: '使用即代表你並同意我們的', + goToInit: '如果您還沒有初始化賬戶,請前往初始化頁面', donthave: '還沒有邀請碼?', invalidInvitationCode: '無效的邀請碼', accountAlreadyInited: '賬戶已經初始化',