Compare commits

...
35 changed files with 671 additions and 381 deletions
+1
View File
@@ -297,6 +297,7 @@ OCEANBASE_VECTOR_USER=root@test
OCEANBASE_VECTOR_PASSWORD=difyai123456
OCEANBASE_VECTOR_DATABASE=test
OCEANBASE_MEMORY_LIMIT=6G
OCEANBASE_ENABLE_HYBRID_SEARCH=false
# openGauss configuration
OPENGAUSS_HOST=127.0.0.1
@@ -33,3 +33,9 @@ class OceanBaseVectorConfig(BaseSettings):
description="Name of the OceanBase Vector database to connect to",
default=None,
)
OCEANBASE_ENABLE_HYBRID_SEARCH: bool = Field(
description="Enable hybrid search features (requires OceanBase >= 4.3.5.1). Set to false for compatibility "
"with older versions",
default=False,
)
+2 -2
View File
@@ -646,7 +646,6 @@ class DatasetRetrievalSettingApi(Resource):
| VectorType.BAIDU
| VectorType.VIKINGDB
| VectorType.UPSTASH
| VectorType.OCEANBASE
):
return {"retrieval_method": [RetrievalMethod.SEMANTIC_SEARCH.value]}
case (
@@ -664,6 +663,7 @@ class DatasetRetrievalSettingApi(Resource):
| VectorType.COUCHBASE
| VectorType.MILVUS
| VectorType.OPENGAUSS
| VectorType.OCEANBASE
):
return {
"retrieval_method": [
@@ -692,7 +692,6 @@ class DatasetRetrievalSettingMockApi(Resource):
| VectorType.BAIDU
| VectorType.VIKINGDB
| VectorType.UPSTASH
| VectorType.OCEANBASE
):
return {"retrieval_method": [RetrievalMethod.SEMANTIC_SEARCH.value]}
case (
@@ -708,6 +707,7 @@ class DatasetRetrievalSettingMockApi(Resource):
| VectorType.PGVECTOR
| VectorType.LINDORM
| VectorType.OPENGAUSS
| VectorType.OCEANBASE
):
return {
"retrieval_method": [
+1 -1
View File
@@ -187,7 +187,7 @@ class IndexingRunner:
},
)
if dataset_document.doc_form == IndexType.PARENT_CHILD_INDEX:
child_chunks = document_segment.child_chunks
child_chunks = document_segment.get_child_chunks()
if child_chunks:
child_documents = []
for child_chunk in child_chunks:
+1 -1
View File
@@ -1,6 +1,6 @@
# Written by YORKI MINAKO🤡, Edited by Xiaoyi
CONVERSATION_TITLE_PROMPT = """You need to decompose the user's input into "subject" and "intention" in order to accurately figure out what the user's input language actually is.
Notice: the language type user use could be diverse, which can be English, Chinese, Español, Arabic, Japanese, French, and etc.
Notice: the language type user use could be diverse, which can be English, Chinese, Italian, Español, Arabic, Japanese, French, and etc.
MAKE SURE your output is the SAME language as the user's input!
Your output is restricted only to: (Input language) Intention + Subject(short as possible)
Your output MUST be a valid JSON.
@@ -231,8 +231,8 @@ class MilvusVector(BaseVector):
document_ids_filter = kwargs.get("document_ids_filter")
filter = ""
if document_ids_filter:
document_ids = ", ".join(f"'{id}'" for id in document_ids_filter)
filter = f'metadata["document_id"] in ({document_ids})'
document_ids = ", ".join(f'"{id}"' for id in document_ids_filter)
filter = f'metadata["document_id"] in [{document_ids}]'
results = self._client.search(
collection_name=self._collection_name,
data=[query_vector],
@@ -259,7 +259,7 @@ class MilvusVector(BaseVector):
filter = ""
if document_ids_filter:
document_ids = ", ".join(f"'{id}'" for id in document_ids_filter)
filter = f'metadata["document_id"] in ({document_ids})'
filter = f'metadata["document_id"] in [{document_ids}]'
results = self._client.search(
collection_name=self._collection_name,
@@ -31,6 +31,7 @@ class OceanBaseVectorConfig(BaseModel):
user: str
password: str
database: str
enable_hybrid_search: bool = False
@model_validator(mode="before")
@classmethod
@@ -57,6 +58,7 @@ class OceanBaseVector(BaseVector):
password=self._config.password,
db_name=self._config.database,
)
self._hybrid_search_enabled = self._check_hybrid_search_support() # Check if hybrid search is supported
def get_type(self) -> str:
return VectorType.OCEANBASE
@@ -98,6 +100,16 @@ class OceanBaseVector(BaseVector):
columns=cols,
vidxs=vidx_params,
)
try:
if self._hybrid_search_enabled:
self._client.perform_raw_text_sql(f"""ALTER TABLE {self._collection_name}
ADD FULLTEXT INDEX fulltext_index_for_col_text (text) WITH PARSER ik""")
except Exception as e:
raise Exception(
"Failed to add fulltext index to the target table, your OceanBase version must be 4.3.5.1 or above "
+ "to support fulltext index and vector index in the same table",
e,
)
vals = []
params = self._client.perform_raw_text_sql("SHOW PARAMETERS LIKE '%ob_vector_memory_limit_percentage%'")
for row in params:
@@ -116,6 +128,27 @@ class OceanBaseVector(BaseVector):
)
redis_client.set(collection_exist_cache_key, 1, ex=3600)
def _check_hybrid_search_support(self) -> bool:
"""
Check if the current OceanBase version supports hybrid search.
Returns True if the version is >= 4.3.5.1, otherwise False.
"""
if not self._config.enable_hybrid_search:
return False
try:
from packaging import version
# return OceanBase_CE 4.3.5.1 (r101000042025031818-bxxxx) (Built Mar 18 2025 18:13:36)
result = self._client.perform_raw_text_sql("SELECT @@version_comment AS version")
ob_full_version = result.fetchone()[0]
ob_version = ob_full_version.split()[1]
logger.debug("Current OceanBase version is %s", ob_version)
return version.parse(ob_version).base_version >= version.parse("4.3.5.1").base_version
except Exception as e:
logger.warning(f"Failed to check OceanBase version: {str(e)}. Disabling hybrid search.")
return False
def add_texts(self, documents: list[Document], embeddings: list[list[float]], **kwargs):
ids = self._get_uuids(documents)
for id, doc, emb in zip(ids, documents, embeddings):
@@ -130,7 +163,7 @@ class OceanBaseVector(BaseVector):
)
def text_exists(self, id: str) -> bool:
cur = self._client.get(table_name=self._collection_name, id=id)
cur = self._client.get(table_name=self._collection_name, ids=id)
return bool(cur.rowcount != 0)
def delete_by_ids(self, ids: list[str]) -> None:
@@ -139,9 +172,12 @@ class OceanBaseVector(BaseVector):
self._client.delete(table_name=self._collection_name, ids=ids)
def get_ids_by_metadata_field(self, key: str, value: str) -> list[str]:
from sqlalchemy import text
cur = self._client.get(
table_name=self._collection_name,
where_clause=f"metadata->>'$.{key}' = '{value}'",
ids=None,
where_clause=[text(f"metadata->>'$.{key}' = '{value}'")],
output_column_name=["id"],
)
return [row[0] for row in cur]
@@ -151,36 +187,84 @@ class OceanBaseVector(BaseVector):
self.delete_by_ids(ids)
def search_by_full_text(self, query: str, **kwargs: Any) -> list[Document]:
return []
if not self._hybrid_search_enabled:
return []
try:
top_k = kwargs.get("top_k", 5)
if not isinstance(top_k, int) or top_k <= 0:
raise ValueError("top_k must be a positive integer")
document_ids_filter = kwargs.get("document_ids_filter")
where_clause = ""
if document_ids_filter:
document_ids = ", ".join(f"'{id}'" for id in document_ids_filter)
where_clause = f" AND metadata->>'$.document_id' IN ({document_ids})"
full_sql = f"""SELECT metadata, text, MATCH (text) AGAINST (:query) AS score
FROM {self._collection_name}
WHERE MATCH (text) AGAINST (:query) > 0
{where_clause}
ORDER BY score DESC
LIMIT {top_k}"""
with self._client.engine.connect() as conn:
with conn.begin():
from sqlalchemy import text
result = conn.execute(text(full_sql), {"query": query})
rows = result.fetchall()
docs = []
for row in rows:
metadata_str, _text, score = row
try:
metadata = json.loads(metadata_str)
except json.JSONDecodeError:
print(f"Invalid JSON metadata: {metadata_str}")
metadata = {}
metadata["score"] = score
docs.append(Document(page_content=_text, metadata=metadata))
return docs
except Exception as e:
logger.warning(f"Failed to fulltext search: {str(e)}.")
return []
def search_by_vector(self, query_vector: list[float], **kwargs: Any) -> list[Document]:
document_ids_filter = kwargs.get("document_ids_filter")
where_clause = None
_where_clause = None
if document_ids_filter:
document_ids = ", ".join(f"'{id}'" for id in document_ids_filter)
where_clause = f"metadata->>'$.document_id' in ({document_ids})"
from sqlalchemy import text
_where_clause = [text(where_clause)]
ef_search = kwargs.get("ef_search", self._hnsw_ef_search)
if ef_search != self._hnsw_ef_search:
self._client.set_ob_hnsw_ef_search(ef_search)
self._hnsw_ef_search = ef_search
topk = kwargs.get("top_k", 10)
cur = self._client.ann_search(
table_name=self._collection_name,
vec_column_name="vector",
vec_data=query_vector,
topk=topk,
distance_func=func.l2_distance,
output_column_names=["text", "metadata"],
with_dist=True,
where_clause=where_clause,
)
try:
cur = self._client.ann_search(
table_name=self._collection_name,
vec_column_name="vector",
vec_data=query_vector,
topk=topk,
distance_func=func.l2_distance,
output_column_names=["text", "metadata"],
with_dist=True,
where_clause=_where_clause,
)
except Exception as e:
raise Exception("Failed to search by vector. ", e)
docs = []
for text, metadata, distance in cur:
for _text, metadata, distance in cur:
metadata = json.loads(metadata)
metadata["score"] = 1 - distance / math.sqrt(2)
docs.append(
Document(
page_content=text,
page_content=_text,
metadata=metadata,
)
)
+17
View File
@@ -720,6 +720,23 @@ class DocumentSegment(db.Model): # type: ignore[name-defined]
else:
return []
def get_child_chunks(self):
process_rule = self.document.dataset_process_rule
if process_rule.mode == "hierarchical":
rules = Rule(**process_rule.rules_dict)
if rules.parent_mode:
child_chunks = (
db.session.query(ChildChunk)
.filter(ChildChunk.segment_id == self.id)
.order_by(ChildChunk.position.asc())
.all()
)
return child_chunks or []
else:
return []
else:
return []
@property
def sign_content(self):
return self.get_sign_content()
@@ -95,7 +95,7 @@ class WeightKeywordSetting(BaseModel):
class WeightModel(BaseModel):
weight_type: str
weight_type: Optional[str] = None
vector_setting: Optional[WeightVectorSetting] = None
keyword_setting: Optional[WeightKeywordSetting] = None
+1 -1
View File
@@ -59,7 +59,7 @@ def add_document_to_index_task(dataset_document_id: str):
},
)
if dataset_document.doc_form == IndexType.PARENT_CHILD_INDEX:
child_chunks = segment.child_chunks
child_chunks = segment.get_child_chunks()
if child_chunks:
child_documents = []
for child_chunk in child_chunks:
+1 -1
View File
@@ -130,7 +130,7 @@ def deal_dataset_vector_index_task(dataset_id: str, action: str):
},
)
if dataset_document.doc_form == IndexType.PARENT_CHILD_INDEX:
child_chunks = segment.child_chunks
child_chunks = segment.get_child_chunks()
if child_chunks:
child_documents = []
for child_chunk in child_chunks:
+1 -1
View File
@@ -63,7 +63,7 @@ def enable_segment_to_index_task(segment_id: str):
index_processor = IndexProcessorFactory(dataset_document.doc_form).init_index_processor()
if dataset_document.doc_form == IndexType.PARENT_CHILD_INDEX:
child_chunks = segment.child_chunks
child_chunks = segment.get_child_chunks()
if child_chunks:
child_documents = []
for child_chunk in child_chunks:
+1 -1
View File
@@ -67,7 +67,7 @@ def enable_segments_to_index_task(segment_ids: list, dataset_id: str, document_i
)
if dataset_document.doc_form == IndexType.PARENT_CHILD_INDEX:
child_chunks = segment.child_chunks
child_chunks = segment.get_child_chunks()
if child_chunks:
child_documents = []
for child_chunk in child_chunks:
+1
View File
@@ -554,6 +554,7 @@ OCEANBASE_VECTOR_PASSWORD=difyai123456
OCEANBASE_VECTOR_DATABASE=test
OCEANBASE_CLUSTER_NAME=difyai
OCEANBASE_MEMORY_LIMIT=6G
OCEANBASE_ENABLE_HYBRID_SEARCH=false
# opengauss configurations, only available when VECTOR_STORE is `opengauss`
OPENGAUSS_HOST=opengauss
+5 -2
View File
@@ -373,7 +373,8 @@ services:
# OceanBase vector database
oceanbase:
image: quay.io/oceanbase/oceanbase-ce:4.3.3.0-100000142024101215
image: oceanbase/oceanbase-ce:4.3.5.1-101000042025031818
container_name: oceanbase
profiles:
- oceanbase
restart: always
@@ -386,7 +387,9 @@ services:
OB_SYS_PASSWORD: ${OCEANBASE_VECTOR_PASSWORD:-difyai123456}
OB_TENANT_PASSWORD: ${OCEANBASE_VECTOR_PASSWORD:-difyai123456}
OB_CLUSTER_NAME: ${OCEANBASE_CLUSTER_NAME:-difyai}
OB_SERVER_IP: '127.0.0.1'
MODE: MINI
ports:
- "${OCEANBASE_VECTOR_PORT:-2881}:2881"
# Oracle vector database
oracle:
+6 -2
View File
@@ -252,6 +252,7 @@ x-shared-env: &shared-api-worker-env
OCEANBASE_VECTOR_DATABASE: ${OCEANBASE_VECTOR_DATABASE:-test}
OCEANBASE_CLUSTER_NAME: ${OCEANBASE_CLUSTER_NAME:-difyai}
OCEANBASE_MEMORY_LIMIT: ${OCEANBASE_MEMORY_LIMIT:-6G}
OCEANBASE_ENABLE_HYBRID_SEARCH: ${OCEANBASE_ENABLE_HYBRID_SEARCH:-false}
OPENGAUSS_HOST: ${OPENGAUSS_HOST:-opengauss}
OPENGAUSS_PORT: ${OPENGAUSS_PORT:-6600}
OPENGAUSS_USER: ${OPENGAUSS_USER:-postgres}
@@ -804,7 +805,8 @@ services:
# OceanBase vector database
oceanbase:
image: quay.io/oceanbase/oceanbase-ce:4.3.3.0-100000142024101215
image: oceanbase/oceanbase-ce:4.3.5.1-101000042025031818
container_name: oceanbase
profiles:
- oceanbase
restart: always
@@ -817,7 +819,9 @@ services:
OB_SYS_PASSWORD: ${OCEANBASE_VECTOR_PASSWORD:-difyai123456}
OB_TENANT_PASSWORD: ${OCEANBASE_VECTOR_PASSWORD:-difyai123456}
OB_CLUSTER_NAME: ${OCEANBASE_CLUSTER_NAME:-difyai}
OB_SERVER_IP: '127.0.0.1'
MODE: MINI
ports:
- "${OCEANBASE_VECTOR_PORT:-2881}:2881"
# Oracle vector database
oracle:
+3 -2
View File
@@ -1,9 +1,10 @@
import path from 'node:path'
import { access, appendFile, mkdir, open, readdir, rm, writeFile } from 'node:fs/promises'
import { fileURLToPath } from 'node:url'
import { parseXml } from '@rgrove/parse-xml'
import { camelCase, template } from 'lodash-es'
const __dirname = path.dirname(new URL(import.meta.url).pathname)
const __dirname = path.dirname(fileURLToPath(import.meta.url))
const generateDir = async (currentPath) => {
try {
@@ -105,7 +106,7 @@ const generateImageComponent = async (entry, pathList) => {
}
`.trim())
await writeFile(path.resolve(currentPath, `${fileName}.module.css`), `${componentCSSRender({ assetPath: path.join('~@/app/components/base/icons/assets', ...pathList.slice(2), entry) })}\n`)
await writeFile(path.resolve(currentPath, `${fileName}.module.css`), `${componentCSSRender({ assetPath: path.posix.join('~@/app/components/base/icons/assets', ...pathList.slice(2), entry) })}\n`)
const componentRender = template(`
// GENERATE BY script
+12 -2
View File
@@ -66,12 +66,22 @@ const preprocessLaTeX = (content: string) => {
if (typeof content !== 'string')
return content
return flow([
const codeBlockRegex = /```[\s\S]*?```/g
const codeBlocks = content.match(codeBlockRegex) || []
let processedContent = content.replace(codeBlockRegex, 'CODE_BLOCK_PLACEHOLDER')
processedContent = flow([
(str: string) => str.replace(/\\\[(.*?)\\\]/g, (_, equation) => `$$${equation}$$`),
(str: string) => str.replace(/\\\[(.*?)\\\]/gs, (_, equation) => `$$${equation}$$`),
(str: string) => str.replace(/\\\((.*?)\\\)/g, (_, equation) => `$$${equation}$$`),
(str: string) => str.replace(/(^|[^\\])\$(.+?)\$/g, (_, prefix, equation) => `${prefix}$${equation}$`),
])(content)
])(processedContent)
codeBlocks.forEach((block) => {
processedContent = processedContent.replace('CODE_BLOCK_PLACEHOLDER', block)
})
return processedContent
}
const preprocessThinkTag = (content: string) => {
+3 -3
View File
@@ -9,7 +9,7 @@ export type HtmlContentProps = {
type IPopover = {
className?: string
htmlContent: React.ReactNode<HtmlContentProps>
htmlContent: React.ReactNode
popupClassName?: string
trigger?: 'click' | 'hover'
position?: 'bottom' | 'br' | 'bl'
@@ -90,7 +90,7 @@ export default function CustomPopover({
>
{({ close }) => (
<div
className={cn('w-fit min-w-[130px] overflow-hidden rounded-lg bg-components-panel-bg shadow-lg ring-1 ring-black ring-opacity-5', popupClassName)}
className={cn('w-fit min-w-[130px] overflow-hidden rounded-lg bg-components-panel-bg shadow-lg ring-1 ring-black/5', popupClassName)}
{...(trigger !== 'hover'
? {}
: {
@@ -99,7 +99,7 @@ export default function CustomPopover({
})
}
>
{cloneElement(htmlContent as React.ReactNode<HtmlContentProps>, {
{cloneElement(htmlContent as React.ReactElement, {
onClose: () => onMouseLeave(open),
...(manualClose
? {
@@ -103,13 +103,16 @@ const SegmentAdd: FC<ISegmentAddProps> = ({
manualClose
trigger='click'
htmlContent={
<button
type='button'
className='system-md-regular flex w-full items-center rounded-lg px-2 py-1.5 text-text-secondary'
onClick={showBatchModal}
>
{t('datasetDocuments.list.action.batchAdd')}
</button>
// need to wrapper the button with div when manualClose is true
<div className='w-full p-1'>
<button
type='button'
className='system-md-regular flex w-full items-center rounded-lg px-2 py-1.5 text-text-secondary'
onClick={showBatchModal}
>
{t('datasetDocuments.list.action.batchAdd')}
</button>
</div>
}
btnElement={
<div className='flex items-center justify-center' >
+1
View File
@@ -70,6 +70,7 @@ const translation = {
noHitHistory: 'ヒット履歴はありません',
},
hitHistoryTable: {
question: '質問',
query: 'クエリ',
match: '一致',
response: '応答',
+1 -2
View File
@@ -26,10 +26,9 @@ const translation = {
appDeleteFailed: 'アプリの削除に失敗しました',
join: 'コミュニティに参加する',
communityIntro:
'さまざまなチャンネルでチームメンバーや貢献者、開発者と議論します。',
'さまざまなチャンネルでチームメンバーや貢献者、開発者と議論します。',
roadmap: 'ロードマップを見る',
newApp: {
// this comment is to recreate PR
startFromBlank: '最初から作成',
startFromTemplate: 'テンプレートから作成',
captionAppType: 'どのタイプのアプリを作成しますか?',
+6
View File
@@ -101,18 +101,22 @@ const translation = {
plans: {
sandbox: {
name: 'Sandbox',
for: '核心能力的免费试用',
description: 'コア機能を無料で試す',
},
professional: {
name: 'Professional',
for: '核心能力的免费试用',
description: '独立した開発者/小規模チーム向け',
},
team: {
name: 'Team',
for: '核心能力的免费试用',
description: '中規模チーム向け',
},
community: {
name: 'Community',
for: '核心能力的免费试用',
description: '個人ユーザー、小規模チーム、または非営利プロジェクト向け',
price: '無料',
btnText: 'コミュニティを始めましょう',
@@ -125,6 +129,7 @@ const translation = {
},
premium: {
name: 'Premium',
for: '核心能力的免费试用',
description: '中規模の組織やチーム向け',
price: 'スケーラブル',
priceTip: 'クラウドマーケットプレイスに基づく',
@@ -140,6 +145,7 @@ const translation = {
},
enterprise: {
name: 'Enterprise',
for: '核心能力的免费试用',
description: 'エンタープライズグレードのセキュリティ、コンプライアンス、拡張性、制御、およびより高度な機能を必要とする企業向け',
price: 'カスタム',
priceTip: '年間契約のみ',
+12
View File
@@ -26,6 +26,8 @@ const translation = {
lineBreak: '改行',
sure: '確認済み',
download: 'ダウンロード',
downloadSuccess: '下载完毕',
downloadFailed: '下载失败,请稍后重试。',
delete: '削除',
settings: '設定',
setup: 'セットアップ',
@@ -152,12 +154,22 @@ const translation = {
workspace: 'ワークスペース',
createWorkspace: 'ワークスペースを作成',
helpCenter: 'ヘルプ',
support: '支持',
compliance: '合规',
communityFeedback: 'フィードバック',
roadmap: 'ロードマップ',
community: 'コミュニティ',
about: 'Difyについて',
logout: 'ログアウト',
},
compliance: {
soc2Type1: 'SOC 2 Type I Report',
soc2Type2: 'SOC 2 Type II Report',
iso27001: 'ISO 27001:2022 Certification',
gdpr: 'GDPR DPA',
sandboxUpgradeTooltip: '仅适用于 Professional 或 Team 版计划。',
professionalUpgradeTooltip: '仅适用于 Team 版计划或以上。',
},
settings: {
accountGroup: 'アカウント',
workplaceGroup: 'ワークスペース',
+2
View File
@@ -1,6 +1,8 @@
const translation = {
custom: 'カスタマイズ',
upgradeTip: {
title: '升级您的计划',
des: '升级您的计划来定制您的品牌。',
prefix: 'プランをアップグレードして',
suffix: 'ブランドをカスタマイズしましょう。',
},
+25 -25
View File
@@ -1,16 +1,14 @@
const translation = {
steps: {
header: {
creation: 'ナレッジの作成',
update: 'データの追加',
fallbackRoute: '知識',
fallbackRoute: 'ナレッジベース',
},
one: 'データソース',
two: 'テキスト進行中',
three: '実行と完成',
},
error: {
unavailable: 'このナレッジは利用できません',
unavailable: 'このナレッジベースは利用できません',
},
firecrawl: {
configFirecrawl: '🔥Firecrawlの設定',
@@ -50,11 +48,11 @@ const translation = {
connect: '接続する',
cancel: 'キャンセル',
button: '次へ',
emptyDatasetCreation: '空のナレッジを作成します',
emptyDatasetCreation: '空のナレッジベースを作成します',
modal: {
title: '空のナレッジを作成',
tip: '空のナレッジにはドキュメントが含まれず、いつでもドキュメントをアップロードできます。',
input: 'ナレッジ',
title: '空のナレッジベースを作成',
tip: '空のナレッジベースにはドキュメントが含まれず、いつでもドキュメントをアップロードできます。',
input: 'ナレッジベースの名称',
placeholder: '入力してください',
nameNotEmpty: '名前は空にできません',
nameLengthInvalid: '名前は1〜40文字である必要があります',
@@ -63,13 +61,23 @@ const translation = {
failed: '作成に失敗しました',
},
website: {
chooseProvider: 'プロバイダーを選択する',
fireCrawlNotConfigured: 'Firecrawlが設定されていません',
fireCrawlNotConfiguredDescription: 'Firecrawl を使用するには、Firecrawl の API キーを設定してください。',
jinaReaderNotConfigured: 'Jina Reader が設定されていません',
jinaReaderNotConfiguredDescription: '無料のAPIキーを入力して、Jina Readerを設定します。',
configure: '設定',
configureFirecrawl: '配置 Firecrawl',
configureJinaReader: '配置 Jina Reader',
run: '実行',
firecrawlTitle: '🔥Firecrawlを使っでウエブコンテンツを抽出',
firecrawlDoc: 'Firecrawlドキュメント',
firecrawlDocLink: 'https://docs.dify.ai/guides/knowledge-base/sync-from-website',
jinaReaderTitle: 'サイト全体をMarkdownに変換する',
jinaReaderDoc: 'Jina Readerの詳細',
jinaReaderDocLink: 'https://jina.ai/reader',
useSitemap: 'sitemap(サイトマップ)を使用する',
useSitemapTooltip: 'サイトマップに沿ってサイトをクロールします。そうでない場合、Jina Readerはページの関連性に基づいて繰り返しクロールし、ページ数は少なくなりますが、高品質のページが得られます。',
options: 'オプション',
crawlSubPage: 'サブページをクロールする',
limit: '制限',
@@ -85,14 +93,6 @@ const translation = {
scrapTimeInfo: '{{time}} 秒以内に合計 {{total}} ページをスクレイピングしました',
preview: 'プレビュー',
maxDepthTooltip: '入力されたURLを基にしたクローリング作業での設定可能な最大深度について説明します。深度0は入力されたURL自体のページを対象としたスクレイピングを意味します。深度1では、元のURLの直下にあるページ(URLに続く最初の"/"以降の内容)もスクレイピングの対象になります。この深度は指定した数値まで増加させることができ、それに応じてスクレイピングの範囲も広がっていきます。',
jinaReaderDocLink: 'https://jina.ai/reader',
useSitemap: 'サイトマップを使用する',
jinaReaderNotConfigured: 'Jina Reader が設定されていません',
jinaReaderDoc: 'Jina Readerの詳細',
jinaReaderTitle: 'サイト全体をMarkdownに変換する',
chooseProvider: 'プロバイダーを選択する',
jinaReaderNotConfiguredDescription: '無料のAPIキーを入力してJina Readerを設定します。',
useSitemapTooltip: 'サイトマップに沿ってサイトをクロールします。そうでない場合、Jina Readerはページの関連性に基づいて繰り返しクロールし、ページ数は少なくなりますが、高品質のページが得られます。',
},
},
stepTwo: {
@@ -112,7 +112,7 @@ const translation = {
fullDoc: '全文',
fullDocTip: 'ドキュメント全体を親チャンクとして使用し、直接検索します。パフォーマンス上の理由から、10000トークンを超えるテキストは自動的に切り捨てられます。',
separator: 'チャンク識別子',
separatorPlaceholder: '例えば改行(\\\\n)や特殊なセパレータ(例:「***」)',
separatorPlaceholder: '例えば改行(\\n\\n)や特殊なセパレータ(例:「***」)',
maxLength: '最大チャンク長',
overlap: 'チャンクのオーバーラップ',
overlapTip: 'チャンクのオーバーラップを設定することで、それらの間の意味的な関連性を維持し、検索効果を向上させることができます。最大チャンクサイズの10%〜25%を設定することをおすすめします。',
@@ -155,7 +155,7 @@ const translation = {
sideTipTitle: 'なぜチャンクと前処理が必要なのか',
sideTipP1: 'テキストデータを処理する際、チャンクとクリーニングは2つの重要な前処理ステップです。',
sideTipP2: 'セグメンテーションは長いテキストを段落に分割し、モデルがより理解しやすくします。これにより、モデルの結果の品質と関連性が向上します。',
sideTipP3: 'クリーニングは不要な文字や書式を削除し、ナレッジをよりクリーンで解析しやすいものにします。',
sideTipP3: 'クリーニングは不要な文字や書式を削除し、ナレッジベースをよりクリーンで解析しやすいものにします。',
sideTipP4: '適切なチャンクとクリーニングはモデルのパフォーマンスを向上させ、より正確で価値のある結果を提供します。',
previewTitle: 'プレビュー',
previewTitleButton: 'プレビュー',
@@ -165,7 +165,7 @@ const translation = {
characters: '文字',
indexSettingTip: 'インデックス方法を変更するには、',
retrievalSettingTip: '検索方法を変更するには、',
datasetSettingLink: 'ナレッジ設定',
datasetSettingLink: 'ナレッジベース設定',
separatorTip: '区切り文字は、テキストを区切るために使用される文字です。\\n\\n と \\n は、段落と行を区切るために一般的に使用される区切り記号です。カンマ (\\n\\n,\\n) と組み合わせると、最大チャンク長を超えると、段落は行で区切られます。自分で定義した特別な区切り文字を使用することもできます(例:***)。',
maxLengthCheck: 'チャンクの最大長は {{limit}} 未満にする必要があります',
previewChunkTip: 'プレビューを読み込むには、左側の \'チャンクをプレビュー\' ボタンをクリックしてください',
@@ -179,17 +179,17 @@ const translation = {
parentChildChunkDelimiterTip: '区切り文字とは、テキストを分割するために使用される文字です。\\n は、親チャンクを小さな子チャンクに分割する際におすすめです。独自の区切り文字も使用できます。',
},
stepThree: {
creationTitle: '🎉 ナレッジが作成されました',
creationContent: 'ナレッジの名前は自動的に設定されましたが、いつでも変更できます。',
label: 'ナレッジ名',
creationTitle: '🎉 ナレッジベースが作成されました',
creationContent: 'ナレッジベースの名前は自動的に設定されましたが、自由に変更できます。',
label: 'ナレッジベース名',
additionTitle: '🎉 ドキュメントがアップロードされました',
additionP1: 'ドキュメントはナレッジにアップロードされました',
additionP2: '、ナレッジのドキュメントリストで見つけることができます。',
additionP1: 'ドキュメントはナレッジベースにアップロードされました',
additionP2: '、ナレッジベースのドキュメントリストで見つけることができます。',
stop: '処理を停止',
resume: '処理を再開',
navTo: 'ドキュメントに移動',
sideTipTitle: '次は何ですか',
sideTipContent: 'ドキュメントのインデックスが完了したら、ナレッジをアプリケーションのコンテキストとして統合することができます。プロンプトオーケストレーションページでコンテキスト設定を見つけることができます。また、独立したChatGPTインデックスプラグインとしてリリースすることもできます。',
sideTipContent: 'ドキュメントのインデックスが完了したら、ナレッジベースをアプリケーションのコンテキストとして統合することができます。プロンプトオーケストレーションページでコンテキスト設定を見つけることができます。また、独立したChatGPTインデックスプラグインとしてリリースすることもできます。',
modelTitle: '埋め込みを停止してもよろしいですか?',
modelContent: '後で処理を再開する必要がある場合は、中断した場所から続行します。',
modelButtonConfirm: '確認',
+1 -1
View File
@@ -1,7 +1,7 @@
const translation = {
list: {
title: 'ドキュメント',
desc: 'ナレッジのすべてのファイルがここに表示され、ナレッジ全体がDifyの引用やチャットプラグインを介してリンクされるか、インデックス化されることができます。',
desc: 'すべてのファイルがここに表示され、ナレッジベース全体がDifyの引用やチャットプラグインを介してリンクされるか、インデックス化されることができます。',
learnMore: '詳細はこちら',
addFile: 'ファイルを追加',
addPages: 'ページを追加',
+11 -10
View File
@@ -1,15 +1,15 @@
const translation = {
title: 'ナレッジの設定',
desc: 'ここではナレッジのプロパティと動作方法を変更できます。',
title: 'ナレッジベースの設定',
desc: 'ここではナレッジベースのプロパティと動作方法を変更できます。',
form: {
name: 'ナレッジ名',
namePlaceholder: 'ナレッジ名を入力してください',
name: 'ナレッジベース名',
namePlaceholder: 'ナレッジベース名を入力してください',
nameError: '名前は空にできません',
desc: 'ナレッジの説明',
descInfo: 'ナレッジの内容を概説するための明確なテキストの説明を書いてください。この説明は、複数のナレッジから推論を選択する際の基準として使用されます。',
desc: 'ナレッジベースの説明',
descInfo: 'ナレッジベースの内容を概説するための明確なテキストの説明を書いてください。この説明は、複数のナレッジから推論を選択する際の基準として使用されます。',
descPlaceholder: 'このデータセットの内容を記述してください。詳細に記述することで、AIがデータセットの内容に迅速にアクセスできるようになります。空欄の場合、LangGeniusはデフォルトの検索方法を使用します。',
helpText: '適切なデータセットの説明を作成する方法を学びましょう。',
descWrite: '良いナレッジの説明の書き方を学ぶ。',
descWrite: '良いナレッジベースの説明の書き方を学ぶ。',
permissions: '権限',
permissionsOnlyMe: '自分のみ',
permissionsAllMember: 'すべてのチームメンバー',
@@ -26,14 +26,15 @@ const translation = {
embeddingModelTipLink: '設定',
retrievalSetting: {
title: '検索設定',
method: '検索方法',
learnMore: '詳細はこちら',
description: ' 検索方法についての詳細',
longDescription: ' 検索方法についての詳細については、いつでもナレッジの設定で変更できます。',
longDescription: ' 検索方法についての詳細については、いつでもナレッジベースの設定で変更できます。',
},
save: '保存',
externalKnowledgeID: '外部ナレッジID',
externalKnowledgeID: '外部ナレッジベースID',
retrievalSettings: '取得設定',
externalKnowledgeAPI: '外部ナレッジAPI',
externalKnowledgeAPI: '外部ナレッジベースAPI',
indexMethodChangeToEconomyDisabledTip: 'HQからECOへのダウングレードはできません。',
},
}
+82 -34
View File
@@ -1,7 +1,7 @@
const translation = {
knowledge: 'ナレッジ',
knowledge: 'ナレッジベース',
chunkingMode: {
general: '一般',
general: '汎用',
parentChild: '親子',
},
parentMode: {
@@ -10,33 +10,33 @@ const translation = {
},
externalTag: '外部',
externalAPI: '外部API',
externalAPIPanelTitle: '外部ナレッジ連携API',
externalKnowledgeId: '外部ナレッジID',
externalKnowledgeName: '外部ナレッジ名',
externalKnowledgeDescription: 'ナレッジの説明',
externalKnowledgeIdPlaceholder: 'ナレッジIDを入力',
externalAPIPanelTitle: '外部ナレッジベース連携API',
externalKnowledgeId: '外部ナレッジベースID',
externalKnowledgeName: '外部ナレッジベース名',
externalKnowledgeDescription: 'ナレッジベースの説明',
externalKnowledgeIdPlaceholder: 'ナレッジベースIDを入力',
externalKnowledgeNamePlaceholder: 'ナレッジベース名を入力',
externalKnowledgeDescriptionPlaceholder: 'このナレッジベースの説明(任意)',
learnHowToWriteGoodKnowledgeDescription: '効果的なナレッジの説明の書き方',
externalAPIPanelDescription: '外部ナレッジ連携APIは、Dify外のナレッジベースと連携し、そこからナレッジを取得するために使用します。',
externalAPIPanelDocumentation: '外部ナレッジ連携APIの作成方法',
learnHowToWriteGoodKnowledgeDescription: '効果的なナレッジベースの説明の書き方',
externalAPIPanelDescription: '外部ナレッジベース連携APIは、Dify外のナレッジベースと連携し、そこからナレッジベースを取得するために使用します。',
externalAPIPanelDocumentation: '外部ナレッジベース連携APIの作成方法',
localDocs: 'ローカルドキュメント',
documentCount: ' ドキュメント',
wordCount: ' k 単語',
appCount: ' リンクされたアプリ',
createDataset: 'ナレッジを作成',
createNewExternalAPI: '新しい外部ナレッジ連携APIを作成',
noExternalKnowledge: '外部ナレッジ連携APIがありません。ここをクリックして作成してください',
createExternalAPI: '外部ナレッジ連携APIを追加',
editExternalAPIFormTitle: '外部ナレッジ連携APIを編集',
editExternalAPITooltipTitle: '連携中のナレッジ',
createDataset: 'ナレッジベースを作成',
createNewExternalAPI: '新しい外部ナレッジベース連携APIを作成',
noExternalKnowledge: '外部ナレッジベース連携APIがありません。ここをクリックして作成してください',
createExternalAPI: '外部ナレッジベース連携APIを追加',
editExternalAPIFormTitle: '外部ナレッジベース連携APIを編集',
editExternalAPITooltipTitle: '連携中のナレッジベース',
editExternalAPIConfirmWarningContent: {
front: 'この外部ナレッジ連携APIは',
end: '件の外部ナレッジと連携しており、この変更はすべてに適用されます。変更を保存しますか?',
front: 'この外部ナレッジベース連携APIは',
end: '件の外部ナレッジベースと連携しており、この変更はすべてに適用されます。変更を保存しますか?',
},
editExternalAPIFormWarning: {
front: 'この外部APIは',
end: '件の外部ナレッジと連携しています',
end: '件の外部ナレッジベースと連携しています',
},
deleteExternalAPIConfirmWarningContent: {
title: {
@@ -44,13 +44,13 @@ const translation = {
end: 'しますか?',
},
content: {
front: 'この外部ナレッジ連携APIは',
end: '件の外部ナレッジと連携しています。このAPIを削除すると、すべて無効になります。このAPIを削除しますか?',
front: 'この外部ナレッジベース連携APIは',
end: '件の外部ナレッジベースと連携しています。このAPIを削除すると、すべて無効になります。このAPIを削除しますか?',
},
noConnectionContent: 'このAPIを削除しますか?',
},
selectExternalKnowledgeAPI: {
placeholder: '外部ナレッジ連携APIを選択',
placeholder: '外部ナレッジベース連携APIを選択',
},
connectDataset: '外部ナレッジベースと連携',
connectDatasetIntro: {
@@ -58,7 +58,7 @@ const translation = {
content: {
front: '外部ナレッジベースと連携するには、まず外部APIを作成する必要があります。以下の手順を参照し、',
link: '外部APIの作成方法',
end: 'をご確認ください。次に、対応するナレッジIDを左側のフォームに入力してください。すべての情報が正しければ、連携ボタンをクリックすると、自動的にナレッジベースの検索テストに移動します。',
end: 'をご確認ください。次に、対応するナレッジベースIDを左側のフォームに入力してください。すべての情報が正しければ、連携ボタンをクリックすると、自動的にナレッジベースの検索テストに移動します。',
},
learnMore: '詳細はこちら',
},
@@ -70,14 +70,14 @@ const translation = {
helper5: 'をよくお読みください。',
},
createDatasetIntro: '独自のテキストデータをインポートするか、LLMコンテキストの強化のためにWebhookを介してリアルタイムでデータを書き込むことができます。',
deleteDatasetConfirmTitle: 'このナレッジを削除しますか?',
deleteDatasetConfirmTitle: 'このナレッジベースを削除しますか?',
deleteDatasetConfirmContent:
'ナレッジを削除すると元に戻すことはできません。ユーザーはもはやあなた様のナレッジにアクセスできず、すべてのプロンプトの設定とログが永久に削除されます。',
datasetUsedByApp: 'このナレッジは一部のアプリによって使用されています。アプリはこのナレッジを使用できなくなり、すべてのプロンプト設定とログは永久に削除されます。',
datasetDeleted: 'ナレッジが削除されました',
datasetDeleteFailed: 'ナレッジの削除に失敗しました',
'ナレッジベースを削除すると元に戻すことはできません。ユーザーはもはやあなた様のナレッジベースにアクセスできず、すべてのプロンプトの設定とログが永久に削除されます。',
datasetUsedByApp: 'このナレッジベースは一部のアプリによって使用されています。アプリはこのナレッジベースを使用できなくなり、すべてのプロンプト設定とログは永久に削除されます。',
datasetDeleted: 'ナレッジベースが削除されました',
datasetDeleteFailed: 'ナレッジベースの削除に失敗しました',
didYouKnow: 'ご存知ですか?',
intro1: 'ナレッジはDifyアプリケーションに統合することができます',
intro1: 'ナレッジベースはDifyアプリケーションに統合することができます',
intro2: 'コンテキストとして',
intro3: '、',
intro4: 'または',
@@ -85,7 +85,7 @@ const translation = {
intro6: '単体のChatGPTインデックスプラグインとして公開するために',
unavailable: '利用不可',
unavailableTip: '埋め込みモデルが利用できません。デフォルトの埋め込みモデルを設定する必要があります',
datasets: 'ナレッジ',
datasets: 'ナレッジベース',
datasetsApi: 'API ACCESS',
externalKnowledgeForm: {
connect: '連携',
@@ -141,8 +141,8 @@ const translation = {
defaultRetrievalTip: 'デフォルトでは、マルチパス検索が使用されます。複数のナレッジベースから情報を取得した後、再ランキングを行います。',
mixtureHighQualityAndEconomicTip: '高品質なナレッジベースとコスト重視のナレッジベースを混在させるには、Rerankモデルが必要です。',
inconsistentEmbeddingModelTip: '選択されたナレッジベースの埋め込みモデルに一貫性がない場合、Rerankモデルが必要です。',
mixtureInternalAndExternalTip: '内部ナレッジと外部ナレッジを混在させるには、Rerankモデルが必要です。',
allExternalTip: '外部ナレッジのみを使用する場合、Rerankモデルを有効にするかを選択できます。有効にしない場合、検索結果はスコアに基づいてソートされます。異なるナレッジベースで検索戦略が一貫していないと、結果が不正確になる可能性があります。',
mixtureInternalAndExternalTip: '内部と外部ナレッジベースを混在させる場合、Rerankモデルが必要です。',
allExternalTip: '外部ナレッジベースのみを使用する場合、Rerankモデルを有効にするかを選択できます。有効にしない場合、検索結果はスコアに基づいてソートされます。異なるナレッジベースで検索戦略が一貫していないと、結果が不正確になる可能性があります。',
retrievalSettings: '検索設定',
rerankSettings: 'Rerank設定',
weightedScore: {
@@ -166,8 +166,56 @@ const translation = {
cancel: 'キャンセル',
},
preprocessDocument: '{{num}}件のドキュメントを前処理',
allKnowledge: 'すべての知識',
allKnowledgeDescription: 'このワークスペースにすべてのナレッジを表示する場合に選択します。ワークスペースのオーナーのみがすべてのナレッジを管理できます。',
allKnowledge: 'ナレッジベース全体',
allKnowledgeDescription: 'このワークスペースにナレッジベース全体を表示する場合に選択します。ワークスペースのオーナーのみがすべてのナレッジベースを管理できます。',
embeddingModelNotAvailable: 'Embeddingモデル不可用。',
metadata: {
metadata: 'メタデータ',
addMetadata: 'メタデータを追加',
chooseTime: '時間を選択',
createMetadata: {
title: '新規メタデータ',
back: '戻る',
type: 'タイプ',
name: '名称',
namePlaceholder: 'メタデータ名を入力',
},
checkName: {
empty: 'メタデータ名を入力してください',
invalid: 'メタデータ名は小文字、数字、アンダースコアのみを使用し、小文字で始める必要があります',
},
batchEditMetadata: {
editMetadata: 'メタデータを編集',
editDocumentsNum: '{{num}}件のドキュメントを編集',
applyToAllSelectDocument: '選択したすべてのドキュメントに適用',
applyToAllSelectDocumentTip: '上記の編集と新しいメタデータを選択したすべてのドキュメントに自動的に適用します。チェックしない場合、既にメタデータを持つドキュメントにのみ編集が適用されます。',
multipleValue: '複数の値',
},
selectMetadata: {
search: 'メタデータを検索',
newAction: '新規メタデータ',
manageAction: '管理',
},
datasetMetadata: {
description: 'メタデータはドキュメントに関する情報で、ドキュメントの属性を説明するために使用されます。メタデータを活用することで、ドキュメントをより効率的に整理・管理できます。',
addMetaData: 'メタデータを追加',
values: '{{num}}個の値',
disabled: '無効',
rename: '名前変更',
name: '名称',
namePlaceholder: 'メタデータ名',
builtIn: '組み込み',
builtInDescription: '組み込みメタデータはシステムによって事前定義されたメタデータです。ここで組み込みメタデータの表示と管理ができます。',
deleteTitle: '削除の確認',
deleteContent: 'メタデータ「{{name}}」を削除してもよろしいですか?',
},
documentMetadata: {
metadataToolTip: 'メタデータはドキュメントに関する情報で、ドキュメントの属性を説明するために使用されます。メタデータを活用することで、ドキュメントをより効率的に整理・管理できます。',
startLabeling: 'ラベリングを開始',
documentInformation: 'ドキュメント情報',
technicalParameters: '技術パラメータ',
},
},
}
export default translation
+1
View File
@@ -37,6 +37,7 @@ const translation = {
HR: '人事',
Workflow: 'ワークフロー',
Agent: 'エージェント',
Entertainment: 'エンターテイメント',
},
}
+17 -15
View File
@@ -21,7 +21,7 @@ const translation = {
marketplace: 'マーケットプレイスからインストール',
},
noInstalled: 'プラグインはインストールされていません',
notFound: 'プラグインが見つかりませんでした',
notFound: 'プラグインが見つかりません',
},
source: {
github: 'GitHub',
@@ -160,26 +160,28 @@ const translation = {
upgrade: 'インストール',
},
error: {
fetchReleasesError: 'リリースを取得できませんでした。後でもう一度お試しください。',
fetchReleasesError: 'リリースを取得できません。後でもう一度お試しください。',
inValidGitHubUrl: '無効なGitHub URLです。有効なURLを次の形式で入力してください: https://github.com/owner/repo',
noReleasesFound: 'リリースは見つかりませんでした。GitHubリポジトリまたは入力URLを確認してください。',
noReleasesFound: 'リリースは見つかりません。GitHubリポジトリまたは入力URLを確認してください。',
},
marketplace: {
sortOption: {
mostPopular: '最も人気のある',
recentlyUpdated: '最近更新されました',
newlyReleased: '新発売',
firstReleased: '最初にリリースされた',
},
sortBy: '黒い街',
empower: 'AI開発をサポートする',
discover: '探索',
and: 'と',
pluginsResult: '{{num}} 件の結果',
noPluginFound: 'プラグインが見つかりませんでした',
moreFrom: 'マーケットプレイスからのさらなる情報',
difyMarketplace: 'Difyマーケットプレイス',
moreFrom: 'マーケットプレイスからのさらなる情報',
noPluginFound: 'プラグインが見つかりません',
pluginsResult: '{{num}} 件の結果',
sortBy: '並べ替え',
sortOption: {
mostPopular: '人気順',
recentlyUpdated: '最近更新順',
newlyReleased: '新着順',
firstReleased: 'リリース順',
},
viewMore: 'もっと見る',
discover: '発見する',
empower: 'AI開発を強化する',
verifiedTip: 'このプラグインはDifyによって認証されています',
partnerTip: 'このプラグインはDifyのパートナーによって認証されています',
},
task: {
installError: '{{errorLength}} プラグインのインストールに失敗しました。表示するにはクリックしてください。',
+15 -15
View File
@@ -1,31 +1,31 @@
const translation = {
input: '入力',
result: '結果',
detail: '詳細',
tracing: 'トレース',
detail: '詳細情報',
tracing: '実行追跡',
resultPanel: {
status: 'ステータス',
time: '経過時間',
tokens: 'トークンの合計',
time: '処理時間',
tokens: 'トークン総数',
},
meta: {
title: 'メタデータ',
status: 'ステータス',
status: '状態',
version: 'バージョン',
executor: '実行者',
startTime: '開始時',
time: '経過時間',
tokens: 'トークンの合計',
steps: '実行ステップ',
startTime: '開始時',
time: '総処理時間',
tokens: 'トークン総数',
steps: '処理ステップ',
},
resultEmpty: {
title: 'の実行では JSON 形式のみが出力されま',
tipLeft: 'にアクセスしてください',
link: '詳細パネル',
tipRight: '表示します。',
title: '今回の実行ではJSON形式のみが出力されました',
tipLeft: '詳細を確認するには',
link: '詳細情報パネル',
tipRight: 'へ移動してください',
},
circularInvocationTip: '現在のワークフローには、ツール/ノードの循環的な呼び出しがあります。',
actionLogs: 'アクションログ',
actionLogs: '操作ログ',
circularInvocationTip: '現在のワークフローにツール/ノードの循環呼び出しが検出されました',
}
export default translation
+48 -46
View File
@@ -1,72 +1,74 @@
const translation = {
common: {
welcome: '',
appUnavailable: 'アプリ利用できません',
appUnknownError: 'アプリ利用できません',
appUnavailable: 'アプリケーションは利用できません',
appUnknownError: 'アプリケーションは利用できません',
},
chat: {
newChat: '新しいチャット',
pinnedTitle: 'ピン留めされた',
unpinnedTitle: 'チャット',
newChatDefaultName: '新しい会話',
resetChat: '会話をリセット',
newChat: '新チャット',
newChatTip: '新規チャットが開始されています',
chatSettingsTitle: 'チャット設定',
chatFormTip: 'チャット開始後は設定を変更できません',
pinnedTitle: 'ピン留め済み',
unpinnedTitle: 'チャットリスト',
newChatDefaultName: '新規チャット',
resetChat: 'チャットをリセット',
viewChatSettings: '設定を確認',
poweredBy: 'Powered by',
prompt: 'プロンプト',
privatePromptConfigTitle: '会話の設定',
publicPromptConfigTitle: '初期プロンプト',
configStatusDes: '開始前に、会話の設定を変更できます',
configDisabled:
'前回のセッションの設定がこのセッションで使用されました。',
privatePromptConfigTitle: '個別設定',
publicPromptConfigTitle: '共通プロンプト設定',
configStatusDes: '開始前に設定を変更できます',
configDisabled: '前回の設定を適用中です',
startChat: 'チャットを開始',
privacyPolicyLeft:
'アプリ開発者が提供する',
privacyPolicyMiddle:
'プライバシーポリシー',
privacyPolicyRight:
'をお読みください。',
privacyPolicyLeft: '本アプリの',
privacyPolicyMiddle: 'プライバシーポリシー',
privacyPolicyRight: 'に同意の上ご利用ください',
deleteConversation: {
title: '会話を削除する',
content: 'この会話を削除してもよろしいですか?',
title: 'チャットの削除',
content: 'このチャットを削除しますか?',
},
tryToSolve: '解決しようとしています',
temporarySystemIssue: '申し訳ありません、一時的なシステムの問題が発生しました。',
tryToSolve: '問題を解決する',
temporarySystemIssue: 'システムに一時的な問題が発生しています',
},
generation: {
tabs: {
create: '一度だけ実行',
create: '1回実行',
batch: '一括実行',
saved: '保存済み',
},
savedNoData: {
title: 'まだ結果が保存されていません',
description: 'コンテンツ生成を開始し、保存された結果をこちらで見つけてください。',
startCreateContent: 'コンテンツの作成を開始',
title: '保存済みデータがありません',
description: 'コンテンツ生成後に結果がここに表示されます',
startCreateContent: '成を開始',
},
title: 'AI Completion',
queryTitle: 'コンテンツのクエリ',
completionResult: 'Completion 結果',
queryPlaceholder: 'クエリコンテンツを書いてください...',
title: 'AI文章作成',
queryTitle: '入力内容',
completionResult: '生成結果',
queryPlaceholder: '入力してください',
run: '実行',
execution: '処理中',
executions: '{{num}}回実行',
copy: 'コピー',
resultTitle: 'AI Completion',
noData: 'AIはここで必要なものを提供します',
csvUploadTitle: 'CSVファイルをここにドラッグアンドドロップするか',
browse: '参照',
csvStructureTitle: 'CSVファイルは以下の構造に準拠する必要があります:',
downloadTemplate: 'こちらからテンプレートをダウンロード',
field: 'フィールド',
resultTitle: 'AI生成結果',
noData: 'AIがコンテンツを生成します',
csvUploadTitle: 'CSVファイルをドロップするか',
browse: 'ファイルを選択',
csvStructureTitle: 'CSV形式要件:',
downloadTemplate: 'テンプレートを取得',
field: '',
batchFailed: {
info: '{{num}} 回の実行が失敗しました',
retry: '再行',
outputPlaceholder: '出力コンテンツなし',
info: '{{num}}件の失敗',
retry: '再行',
outputPlaceholder: '出力なし',
},
errorMsg: {
empty: 'アップロードされたファイルにコンテンツを入力してください。',
fileStructNotMatch: 'アップロードされたCSVファイルが構造と一致しません。',
emptyLine: '{{rowIndex}} が空です',
invalidLine: '{{rowIndex}}: {{varName}} の値は空にできません',
moreThanMaxLengthLine: '{{rowIndex}}: {{varName}} の値は {{maxLength}} 文字を超えることはできません',
atLeastOne: 'アップロードされたファイルには少なくとも1行の入力が必要です',
empty: 'ファイル内容が空です',
fileStructNotMatch: 'ファイル形式が不正です',
emptyLine: '{{rowIndex}}行目: 内容が空です',
invalidLine: '{{rowIndex}}行目: {{varName}}の入力が必要です',
moreThanMaxLengthLine: '{{rowIndex}}行目: {{varName}}が制限長({{maxLength}})を超過',
atLeastOne: '1行以上のデータが必要です',
},
},
}
+2 -2
View File
@@ -4,7 +4,7 @@ const translation = {
customToolTip: 'Difyカスタムツールの詳細',
type: {
all: 'すべて',
builtIn: '組み込み',
builtIn: 'ツール',
custom: 'カスタム',
workflow: 'ワークフロー',
},
@@ -13,7 +13,7 @@ const translation = {
line2: 'Difyへのツールの貢献に興味があります。',
viewGuide: 'ガイドを見る',
},
author: '著者',
author: '著者',
auth: {
unauthorized: '認証する',
authorized: '認証済み',
+271 -185
View File
@@ -8,6 +8,7 @@ const translation = {
published: '公開済み',
publish: '公開する',
update: '更新',
publishUpdate: '更新を公開',
run: '実行',
running: '実行中',
inRunMode: '実行モード中',
@@ -19,48 +20,50 @@ const translation = {
goBackToEdit: '編集に戻る',
conversationLog: '会話ログ',
features: '機能',
featuresDescription: 'Webアプリのユーザーエクスペリエンスを強化する',
ImageUploadLegacyTip: '開始フォームでファイルタイプ変数作成できるようになりました。まもなく、画像アップロード機能サポート終了いたします。',
fileUploadTip: '画像アップロード機能がファイルアップロード機能にアップグレードされました',
featuresDocLink: '詳細はこちら',
featuresDescription: 'Webアプリの操作性を向上させる機能',
ImageUploadLegacyTip: '開始フォームでファイル変数作成可能になりました。画像アップロード機能は今後サポート終了となります。',
fileUploadTip: '画像アップロード機能がファイルアップロードに拡張されました',
featuresDocLink: '詳細を見る',
debugAndPreview: 'プレビュー',
restart: '再起動',
currentDraft: '現在の下書き',
currentDraftUnpublished: '現在の下書き(未公開)',
latestPublished: '最新公開済み',
latestPublished: '最新公開',
publishedAt: '公開日時',
restore: '復元',
versionHistory: 'バージョン履歴',
exitVersions: 'バージョン履歴を閉じる',
runApp: 'アプリを実行',
batchRunApp: 'バッチでアプリを実行',
openInExplore: '"探索" で開く',
accessAPIReference: 'APIリファレンスにアクセス',
batchRunApp: 'アプリを一括実行',
openInExplore: '探索ページで開く',
accessAPIReference: 'APIリファレンス',
embedIntoSite: 'サイトに埋め込む',
addTitle: 'タイトルを追加...',
addDescription: '説明を追加...',
noVar: '変数なし',
noVar: '変数がありません',
searchVar: '変数を検索',
variableNamePlaceholder: '変数名',
setVarValuePlaceholder: '変数を設定',
needConnectTip: 'このステップは何にも接続されていません',
maxTreeDepth: 'ブランチごとの最大制限は{{depth}}ノードです',
variableNamePlaceholder: '変数名を入力',
setVarValuePlaceholder: '変数を設定',
needConnectTip: '接続されていないステップがあります',
maxTreeDepth: '1ブランチあたりの最大ノード数:{{depth}}',
needEndNode: '終了ブロックを追加する必要があります',
needAnswerNode: '回答ブロックを追加する必要があります',
workflowProcess: 'ワークフロー処理',
notRunning: 'まだ実行されていません',
previewPlaceholder: 'チャットボットのデバッグを開始するには、以下のボックスにコンテンツを入力してください',
previewPlaceholder: '入力欄にテキストを入力してチャットボットのデバッグを開始',
effectVarConfirm: {
title: '変数削除',
title: '変数削除',
content: '他のノードで変数が使用されています。それでも削除しますか?',
},
insertVarTip: 'クイック挿入のために\'/\'キーを押します',
insertVarTip: '"/"キーで変数を挿入',
processData: 'データ処理',
input: '入力',
output: '出力',
jinjaEditorPlaceholder: '変数を挿入するには「/」または「{」を入力してください',
viewOnly: '表示のみ',
jinjaEditorPlaceholder: '「/」または 「{」で変数挿入',
viewOnly: '閲覧のみ',
showRunHistory: '実行履歴を表示',
enableJinja: 'Jinjaテンプレートのサポートを有効にする',
learnMore: '詳細はこちら',
enableJinja: 'Jinjaテンプレートを有効化',
learnMore: '詳細を見る',
copy: 'コピー',
duplicate: '複製',
addBlock: 'ブロックを追加',
@@ -68,44 +71,44 @@ const translation = {
pointerMode: 'ポインターモード',
handMode: 'ハンドモード',
model: 'モデル',
workflowAsTool: 'ツールとしてのワークフロー',
workflowAsTool: 'ワークフローをツールどして公開する',
configureRequired: '設定が必要',
configure: '設定',
manageInTools: 'ツールで管理',
workflowAsToolTip: 'ワークフロー更新後ツールの再設定が必要です',
manageInTools: 'ツールページで管理',
workflowAsToolTip: 'ワークフロー更新後ツールの再設定が必要です',
viewDetailInTracingPanel: '詳細を表示',
syncingData: 'データ同期中,数秒程度で終わります。',
syncingData: 'データ同期中。。。',
importDSL: 'DSLをインポート',
importDSLTip: '現在のドラフトは上書きされますので、インポートする際は、事前にワークフローをバックアップしてエクスポートいただきますよう、お願い申し上げます。',
backupCurrentDraft: '現在のドラフトをバックアップ',
importDSLTip: '現在の下書きは上書きされますインポート前にワークフローをエクスポートしてバックアップしてください',
backupCurrentDraft: '現在の下書きをバックアップ',
chooseDSL: 'DSL(yml)ファイルを選択',
overwriteAndImport: 'オーバライトとインポート',
overwriteAndImport: '上書きしてインポート',
importFailure: 'インポート失敗',
importWarning: '注意事項',
importWarningDetails: 'DSLバージョンの違いにより機能に影響が出る可能性があります',
importSuccess: 'インポート成功',
parallelRun: '並列実行',
parallelTip: {
click: {
title: 'クリック',
desc: '追加する',
desc: '追加',
},
drag: {
title: 'ドラッグ',
desc: '接続するには',
desc: '接続',
},
limit: '並列処理は {{num}} ブランチに制限されています。',
depthLimit: '{{num}}レイヤーの平行ネストレイヤーの制限',
limit: '並列処理可能ブランチ数:{{num}}',
depthLimit: '並列ネスト最大階層数:{{num}}',
},
parallelRun: 'パラレルラン',
disconnect: '切る',
jumpToNode: 'このノードにジャンプします',
disconnect: '接続解除',
jumpToNode: 'このノードに移動',
addParallelNode: '並列ノードを追加',
parallel: '並列',
branch: 'ブランチ',
importWarning: '注意',
importWarningDetails: 'DSL のバージョンの違いが特定の機能に影響を与える場合があります',
onFailure: '失敗時',
addFailureBranch: '失敗ブランチを追加',
noHistory: '履歴なし',
loadMore: 'より多くのワークフローをロードする',
loadMore: 'さらに読み込む',
noHistory: '履歴がありません',
},
env: {
envPanelTitle: '環境変数',
@@ -115,36 +118,36 @@ const translation = {
title: '環境変数を追加',
editTitle: '環境変数を編集',
type: 'タイプ',
name: '名',
namePlaceholder: '変数名',
name: '変数名',
namePlaceholder: '変数名を入力',
value: '値',
valuePlaceholder: '変数値',
secretTip: 'このような機密情報やデータは、定義に使用され、DSLの設定は情報漏洩を防ぐために特別に構成されています。',
valuePlaceholder: '変数値を入力',
secretTip: 'この変数は機密情報やデータを定義するために使用されます。DSL をエクスポートするときに漏洩防止メカニズムを設定されます。',
},
export: {
title: 'シークレット環境変数をエクスポートしますか?',
checkbox: 'シークレット値をエクスポート',
checkbox: 'シークレット値を含む',
ignore: 'DSLをエクスポート',
export: 'シークレット値を含むDSLをエクスポート',
export: 'シークレット値付きでエクスポート',
},
},
chatVariable: {
panelTitle: '会話変数',
panelDescription: '会話変数は、LLMが記憶すべき対話情報を保存するために使用されます。この情報には、対話の履歴、アップロードされたファイルユーザーの好みなどが含まれます。読み書きが可能です。',
docLink: '詳しくはドキュメントをご覧ください。',
panelDescription: '対話情報を保存・管理(会話履歴/ファイル/ユーザー設定など)。書き換えができます。',
docLink: '詳ドキュメント',
button: '変数を追加',
modal: {
title: '会話変数を追加',
editTitle: '会話変数を編集',
name: '名',
namePlaceholder: '変数名',
name: '変数名',
namePlaceholder: '変数名を入力',
type: 'タイプ',
value: 'デフォルト値',
valuePlaceholder: 'デフォルト値、設定しない場合は空白にしでください',
description: '説明',
descriptionPlaceholder: '変数の説明',
editInJSON: 'JSONで編集する',
oneByOne: '次々に追加する',
descriptionPlaceholder: '変数の説明を入力',
editInJSON: 'JSONで編集',
oneByOne: '個別追加',
editInForm: 'フォームで編集',
arrayValue: '値',
addArrayValue: '値を追加',
@@ -152,19 +155,19 @@ const translation = {
objectType: 'タイプ',
objectValue: 'デフォルト値',
},
storedContent: '保存されたコンテンツ',
updatedAt: '更新日は',
storedContent: '保存内容',
updatedAt: '最終更新:',
},
changeHistory: {
title: '変更履歴',
placeholder: 'まだ何も変更ていません',
placeholder: 'まだ何も変更されていません',
clearHistory: '履歴をクリア',
hint: 'ヒント',
hintText: '編集アクションは変更履歴に記録され、このセッションの間にデバイスに保存されます。エディターを終了すると、この履歴は消去されます。',
stepBackward_one: '{{count}} ステップ後退',
stepBackward_other: '{{count}} ステップ後退',
stepForward_one: '{{count}} ステップ進',
stepForward_other: '{{count}} ステップ進',
hintText: 'エディターでの編集操作は、エディターを離れるまで、お使いのデバイスに記録されます。この履歴は、エディターを離れると消去されます。',
stepBackward_one: '{{count}} ステップ戻る',
stepBackward_other: '{{count}} ステップ戻る',
stepForward_one: '{{count}} ステップ進',
stepForward_other: '{{count}} ステップ進',
sessionStart: 'セッション開始',
currentState: '現在の状態',
nodeTitleChange: 'ブロックのタイトルが変更されました',
@@ -175,16 +178,17 @@ const translation = {
nodePaste: 'ブロックが貼り付けられました',
nodeDelete: 'ブロックが削除されました',
nodeAdd: 'ブロックが追加されました',
nodeResize: 'ブロックがリサイズされました',
noteAdd: 'ノートが追加されました',
noteChange: 'ノートが変更されました',
noteDelete: 'ノートが削除されました',
edgeDelete: 'ブロックが切断されました',
nodeResize: 'ブロックサイズが変更されました',
noteAdd: '注釈が追加されました',
noteChange: '注釈が変更されました',
noteDelete: '注釈が削除されました',
edgeDelete: 'ブロックの接続が解除されました',
},
errorMsg: {
fieldRequired: '{{field}}は必須です',
fieldRequired: '{{field}} は必須です',
rerankModelRequired: 'Rerank モデルが設定されていません',
authRequired: '認証が必要です',
invalidJson: '{{field}}は無効です',
invalidJson: '{{field}} は無効な JSON です',
fields: {
variable: '変数名',
variableValue: '変数値',
@@ -193,33 +197,33 @@ const translation = {
rerankModel: 'Rerankモデル',
visionVariable: 'ビジョン変数',
},
invalidVariable: '無効な変数',
rerankModelRequired: 'モデルの再ランク付けをオンにする前に、モデルが設定で正常に構成されていることを確認してください。',
invalidVariable: '無効な変数です',
noValidTool: '{{field}} に利用可能なツールがありません',
toolParameterRequired: '{{field}}: パラメータ [{{param}}] は必須です',
noValidTool: '{{field}} 有効なツールが選択されていません',
},
singleRun: {
testRun: 'テスト実行',
startRun: '実行開始',
startRun: '実行開始',
running: '実行中',
testRunIteration: 'テスト実行イテレーション',
testRunIteration: 'テスト実行イテレーション',
testRunLoop: 'テスト実行(ループ)',
back: '戻る',
iteration: 'イテレーション',
loop: 'ループ',
},
tabs: {
'searchBlock': 'ブロック検索',
'searchBlock': 'ブロック検索',
'blocks': 'ブロック',
'searchTool': '検索ツール',
'searchTool': 'ツール検索',
'tools': 'ツール',
'allTool': 'すべて',
'workflowTool': 'ワークフロー',
'builtInTool': '組み込み',
'customTool': 'カスタム',
'question-understand': '質問の理解',
'workflowTool': 'ワークフロー',
'question-understand': '問題理解',
'logic': 'ロジック',
'transform': '変換',
'utilities': 'ユーティリティ',
'noResult': '一致するものが見つかりませんでした',
'utilities': 'ツール',
'noResult': '該当なし',
'plugin': 'プラグイン',
'agent': 'エージェント戦略',
},
@@ -228,10 +232,10 @@ const translation = {
'end': '終了',
'answer': '回答',
'llm': 'LLM',
'knowledge-retrieval': '知識取得',
'knowledge-retrieval': '知識検索',
'question-classifier': '質問分類器',
'if-else': 'IF/ELSE',
'code': 'コード',
'code': 'コード実行',
'template-transform': 'テンプレート',
'http-request': 'HTTPリクエスト',
'variable-assigner': '変数代入器',
@@ -239,54 +243,64 @@ const translation = {
'assigner': '変数代入',
'iteration-start': 'イテレーション開始',
'iteration': 'イテレーション',
'parameter-extractor': 'パラメータ抽出',
'document-extractor': 'テキスト抽出ツール',
'parameter-extractor': 'パラメータ抽出',
'document-extractor': 'テキスト抽出',
'list-operator': 'リスト処理',
'agent': 'エージェント',
'loop-start': 'ループ開始',
'loop': 'ループ',
},
blocksAbout: {
'start': 'ワークフロー開始に必要なパラメータを定義します',
'end': 'ワークフローの終了と結果のタイプを定義します',
'answer': 'チャット会話の応答内容を定義します',
'llm': '大規模言語モデルを呼び出して質問回答したり、自然言語処理したりします',
'knowledge-retrieval': 'ユーザー質問に関連するテキストコンテンツを知識からクエリできるようにします',
'question-classifier': 'ユーザーの質問の分類条件を定義し、LLM分類記述に基づいて会話がどのように進行するかを定義できます',
'if-else': 'IF/ELSE条件に基づいてワークフローを2つのブランチに分割できます',
'code': 'カスタムロジックを実装するためにPythonまたはNodeJSコードを実行します',
'template-transform': 'Jinjaテンプレート構文を使用してデータを文字列に変換します',
'http-request': 'HTTPプロトコル経由でサーバーリクエストを送信できます',
'variable-assigner': '複数のブランチの変数を1つの変数に集約し、下流ノードに対して統一された設定を行います。',
'assigner': '変数代入ノードは、書き込み可能な変数(例えば、会話変数)に値を割り当てるために使用されます。',
'variable-aggregator': '複数のブランチの変数を1つの変数に集約し、下流ノードに対して統一された設定を行います。',
'iteration': 'リストオブジェクトに対して複数のステップを実行し、すべての結果出力されるまで繰り返します。',
'parameter-extractor': '自然言語からツールの呼び出しやHTTPリクエストのための構造化されたパラメーターを抽出するためにLLMを使用します。',
'document-extractor': 'アップロードされたドキュメントを LLM で簡単に理解できるテキストのコンテンツに解析するために使用されます。',
'list-operator': '配列のコンテンツをフィルタリングまたはソートするために使用されます。',
'agent': '大規模言語モデルを呼び出して質問に答えたり自然言語を処理したりする',
'start': 'ワークフロー開始時の初期パラメータを定義します',
'end': 'ワークフローの終了条件と結果のタイプを定義します',
'answer': 'チャットダイアログの返答内容を定義します',
'llm': '大規模言語モデルを呼び出して質問回答自然言語処理を実行します',
'knowledge-retrieval': 'ナレッジベースからユーザー質問に関連するテキストを検索します',
'question-classifier': '質問の分類条件を定義し、LLM分類に基づいて対話フローを制御します',
'if-else': 'if/else条件でワークフローを2つの分岐に分割ます',
'code': 'Python/NodeJSコードを実行してカスタムロジックを実装します',
'template-transform': 'Jinjaテンプレート構文データを文字列に変換します',
'http-request': 'HTTPリクエストを送信できます',
'variable-assigner': '複数分岐の変数を集約し、下流ノードの設定を統一します。',
'assigner': '書き込み可能な変数(例会話変数)への値の割り当てを行います。',
'variable-aggregator': '複数分岐の変数を集約し、下流ノードの設定を統一します。',
'iteration': 'リスト要素に対して反復処理を実行し全結果出力します。',
'loop': '終了条件達成まで、または最大反復回数までロジックを繰り返します。',
'parameter-extractor': '自然言語から構造化パラメータを抽出し、後続処理で利用します。',
'document-extractor': 'アップロード文書をLLM処理用に最適化されたテキストに変換します。',
'list-operator': '配列のフィルタリングやソート処理を行います。',
'agent': '大規模言語モデルを活用した質問応答や自然言語処理を実行します。',
},
operator: {
zoomIn: '拡大',
zoomOut: '縮小',
zoomTo50: '50%にズーム',
zoomTo100: '100%にズーム',
zoomToFit: 'フィットにズーム',
zoomTo50: '50%サイズ',
zoomTo100: '等倍表示',
zoomToFit: '画面に合わせる',
},
variableReference: {
noAvailableVars: '利用可能な変数がありません',
noVarsForOperation: 'この操作に割り当て可能な変数が存在しません。',
noAssignedVars: '割り当て可能な変数がありません',
assignedVarsDescription: '書き込み可能な変数(例:',
conversationVars: '会話変数',
},
panel: {
userInputField: 'ユーザー入力フィールド',
changeBlock: 'ブロックを変更',
userInputField: 'ユーザー入力',
changeBlock: 'ノード変更',
helpLink: 'ヘルプリンク',
about: '情報',
createdBy: '作成者 ',
about: '詳細',
createdBy: '作成者',
nextStep: '次のステップ',
addNextStep: 'このワークフローで次のブロックを追加',
selectNextStep: '次のブロックを選択',
runThisStep: 'このステップ実行',
addNextStep: 'このワークフローで次ノードを追加',
selectNextStep: '次ノード選択',
runThisStep: 'このステップ実行',
checklist: 'チェックリスト',
checklistTip: '公開する前にすべての問題が解決されていることを確認してください',
checklistResolved: 'すべての問題が解決されました',
organizeBlocks: 'ブロックを整理',
checklistTip: '公開前に全ての項目を確認してください',
checklistResolved: '全てのチェックが完了しました',
organizeBlocks: 'ノード整理',
change: '変更',
optional: '(オプション)',
optional: '(任意)',
},
nodes: {
common: {
@@ -295,54 +309,54 @@ const translation = {
memory: {
memory: 'メモリ',
memoryTip: 'チャットメモリ設定',
windowSize: 'ウィンドウサイズ',
windowSize: 'メモリウィンドウサイズ',
conversationRoleName: '会話ロール名',
user: 'ユーザー接頭辞',
assistant: 'アシスタント接頭辞',
},
memories: {
title: 'メモリ',
tip: 'チャットメモリ',
tip: 'チャットの記憶管理',
builtIn: '組み込み',
},
errorHandle: {
title: '例外処理',
tip: 'ノード例外発生時の処理ポリシーを設定',
none: {
title: '処理なし',
desc: '例外発生して処理されない場合、ノードは実行を停止します',
desc: '例外発生時に処理を停止',
},
defaultValue: {
title: 'デフォルト値',
desc: '例外発生した場合は、デフォルト出力コンテンツを指定します。',
tip: '例外発生した場合は、以下の値を返します。',
inLog: 'ノード例外デフォルト値に従って出力します。',
output: '出力デフォルト値',
desc: '例外発生時のデフォルト出力',
tip: '例外発生時に返される値:',
inLog: 'ノード例外 - デフォルト値を出力',
output: 'デフォルト値出力',
},
failBranch: {
title: 'エラーブランチ',
customize: 'キャンバスに移動して、エラーブランチのロジックをカスタマイズします。',
inLog: '例外が発生した場合は、エラーしたブランチを自動的に実行します。ノード出力は、エラータイプとエラーメッセージを返し、それらをダウンストリームに渡します。',
desc: '例外発生した場合は、エラーブランチを実行します',
customizeTip: 'エラーブランチがアクティブになっても、ノードによってスローされた例外はプロセスを終了させません。代わりに、事前定義された エラーブランチが自動的に実行されるため、エラーメッセージ、レポート、修正アクション、またはスキップアクションを柔軟に提供できます。',
title: '例外分岐',
desc: '例外発生時に分岐を実行',
customize: '失敗分岐ロジックをカスタマイズ',
customizeTip: '例外発生時、失敗分岐でエラー処理を柔軟に設定可能(エラーログ表示/修復処理/操作スキップ等)',
inLog: 'ノード例外 - 失敗分岐を実行。エラー情報を下流に伝播',
},
partialSucceeded: {
tip: 'プロセスに{{num}}ノード異常に動作していますので、トレースに移動してログを確認してください。',
tip: '{{num}}個のノード異常発生。ログはトレース画面で確認可能',
},
title: 'エラー処理',
tip: 'ノードが例外を検出したときにトリガーされる例外処理戦略。',
},
retry: {
retry: '再試行',
retryOnFailure: '失敗時再試行',
maxRetries: '最大試行回数',
retryOnFailure: '失敗時再試行',
maxRetries: '最大試行回数',
retryInterval: '再試行間隔',
retrying: '再試行。。。',
retryFailed: '再試行に失敗しました',
retryTimes: '失敗時 {{times}}回再試行',
retrying: '再試行中...',
retrySuccessful: '再試行成功',
retryFailed: '再試行失敗',
retryFailedTimes: '{{times}}回再試行失敗',
times: '回',
ms: 'ms',
retryTimes: '失敗時に{{times}}回再試行',
retrySuccessful: '再試行に成功しました',
retries: '{{num}} 回の再試行',
retryFailedTimes: '{{times}}回の再試行が失敗しました',
ms: 'ミリ秒',
retries: '再試行回数: {{num}}',
},
},
start: {
@@ -353,17 +367,17 @@ const translation = {
query: 'ユーザー入力',
memories: {
des: '会話履歴',
type: 'メッセージタイプ',
type: 'メッセージ種別',
content: 'メッセージ内容',
},
files: 'ファイルリスト',
files: 'ファイル一覧',
},
noVarTip: 'ワークフローで使用できる入力を設定します',
noVarTip: '入力設定はワークフロー内で利用可能',
},
end: {
outputs: '出力',
outputs: '出力設定',
output: {
type: '出力タイプ',
type: '出力形式',
variable: '出力変数',
},
type: {
@@ -373,75 +387,106 @@ const translation = {
},
},
answer: {
answer: '答',
answer: '答',
outputVars: '出力変数',
},
llm: {
model: 'モデル',
model: 'AIモデル',
variables: '変数',
context: 'コンテキスト',
contextTooltip: 'コンテキストとして知識をインポートできます',
notSetContextInPromptTip: 'コンテキスト機能を有効にするには、PROMPTにコンテキスト変数を記してください',
contextTooltip: 'ナレッジベースをコンテキストとして利用',
notSetContextInPromptTip: 'コンテキスト利用時はプロンプトに変数を記してください',
prompt: 'プロンプト',
addMessage: 'メッセージ追加',
roleDescription: {
system: '話の高レベルな命令を与えます',
user: 'モデルへの指示、クエリ、またはテキストベースの入力を提供します',
assistant: 'ユーザーメッセージに基づいてモデルの応答',
system: '話の基本動作を定義',
user: '指示/質問を入力',
assistant: 'ユーザー入力への応答',
},
addMessage: 'メッセージを追加',
vision: 'ビジョン',
files: 'ファイル',
resolution: {
name: '解像度',
high: '高',
low: '低',
high: '高',
low: '低',
},
outputVars: {
output: 'コンテンツを生成',
usage: 'モデル使用情報',
output: '生成内容',
usage: 'モデル使用',
},
singleRun: {
variable: '変数',
},
sysQueryInUser: 'ユーザーメッセージにsys.queryが必要です',
sysQueryInUser: 'ユーザーメッセージにsys.queryを含めてください',
},
knowledgeRetrieval: {
queryVariable: 'クエリ変数',
knowledge: 'ナレッジ',
queryVariable: '検索変数',
knowledge: 'ナレッジベース',
outputVars: {
output: '検索されたセグメント化されたデータ',
content: 'セグメント化されたコンテンツ',
title: 'セグメント化されたタイトル',
icon: 'セグメント化されたアイコン',
url: 'セグメント化されたURL',
metadata: 'その他のメタデータ',
output: '検索結果セグメント',
content: 'セグメント内容',
title: 'セグメントタイトル',
icon: 'セグメントアイコン',
url: 'セグメントURL',
metadata: 'メタデータ',
},
metadata: {
title: 'メタデータフィルタ',
tip: 'タグ/カテゴリ等の属性で検索を絞り込み',
options: {
disabled: {
title: '無効',
subTitle: 'フィルタリング不使用',
},
automatic: {
title: '自動生成',
subTitle: '検索履歴からフィルタ条件を自動生成',
desc: 'Query Variable(検索変数)に基づきフィルタ条件を自動生成',
},
manual: {
title: '手動設定',
subTitle: 'メタデータの条件を手動で追加',
},
},
panel: {
title: 'メタデータのフィルタ条件',
conditions: '条件一覧',
add: '条件追加',
search: 'メタデータ検索',
placeholder: '値を入力',
datePlaceholder: '日付選択...',
select: '変数選択...',
},
},
},
http: {
inputVars: '入力変数',
api: 'API',
apiPlaceholder: 'URLを入力、「/」を入力して変数を挿入',
notStartWithHttp: 'APIはhttp://またはhttps://で始まる必要があります',
apiPlaceholder: 'URLを入力(変数使用時は"/"を入力)',
extractListPlaceholder: 'リスト番号を入力(変数使用時は"/"を入力)',
notStartWithHttp: 'APIは http:// または https:// で始まってください',
key: 'キー',
type: 'タイプ',
value: '値',
bulkEdit: '一括編集',
keyValueEdit: 'キー-値の編集',
keyValueEdit: 'キーバリュー編集',
headers: 'ヘッダー',
params: 'パラメータ',
body: 'ボディ',
binaryFileVariable: 'バイナリファイル変数',
outputVars: {
body: 'レスポンスコンテンツ',
statusCode: 'レスポンスステータスコード',
headers: 'レスポンスヘッダーリストJSON',
files: 'ファイルリスト',
headers: 'レスポンスヘッダJSON',
files: 'ファイル一覧',
},
authorization: {
'authorization': '認証',
'authorizationType': '認証タイプ',
'no-auth': 'なし',
'api-key': 'APIキー',
'auth-type': '認証タイプ',
'basic': '基本',
'auth-type': 'API認証タイプ',
'basic': 'ベーシック',
'bearer': 'Bearer',
'custom': 'カスタム',
'api-key-title': 'APIキー',
@@ -449,19 +494,16 @@ const translation = {
},
insertVarPlaceholder: '変数を挿入するには\'/\'を入力してください',
timeout: {
title: 'タイムアウト',
title: 'タイムアウト設定',
connectLabel: '接続タイムアウト',
connectPlaceholder: '接続タイムアウトを秒で入力',
connectPlaceholder: '接続タイムアウト(秒)',
readLabel: '読み取りタイムアウト',
readPlaceholder: '読み取りタイムアウトを秒で入力',
readPlaceholder: '読み取りタイムアウト(秒)',
writeLabel: '書き込みタイムアウト',
writePlaceholder: '書き込みタイムアウトを秒で入力',
writePlaceholder: '書き込みタイムアウト(秒)',
},
type: 'タイプ',
binaryFileVariable: 'バイナリファイル変数',
extractListPlaceholder: 'リスト項目のインデックスを入力し、変数を挿入 \'/\' と入力します',
curl: {
title: 'cURLからインポート',
title: 'cURLからインポート',
placeholder: 'ここにcURL文字列を貼り付けます',
},
},
@@ -653,6 +695,25 @@ const translation = {
MaxParallelismDesc: '最大並列処理は、1 回の反復で同時に実行されるタスクの数を制御するために使用されます。',
answerNodeWarningDesc: '並列モードの警告: 応答ノード、会話変数の割り当て、およびイテレーション内の永続的な読み取り/書き込み操作により、例外が発生する可能性があります。',
},
loop: {
deleteTitle: 'ループノードを削除しますか?',
deleteDesc: 'ループノードを削除すると、全ての子ノードが削除されます。',
input: '入力',
output: '出力変数',
loop_one: '{{count}}回',
loop_other: '{{count}}回',
currentLoop: '現在のループ',
breakCondition: 'ループ終了条件',
breakConditionTip: 'ループ内の変数やセッション変数を参照し、終了条件を設定できます。',
loopMaxCount: '最大ループ回数',
loopMaxCountError: '最大ループ回数は1から{{maxCount}}の範囲で正しく入力してください。',
errorResponseMethod: 'エラー対応方法',
ErrorMethod: {
operationTerminated: 'エラー時に処理を終了',
continueOnError: 'エラーを無視して継続',
removeAbnormalOutput: '異常出力を除外',
},
},
note: {
addNote: 'コメントを追加',
editor: {
@@ -771,12 +832,37 @@ const translation = {
tracing: {
stopBy: '{{user}}によって停止',
},
variableReference: {
noVarsForOperation: '選択した操作で代入できる変数はありません。',
noAvailableVars: '使用可能な変数がありません',
noAssignedVars: '使用可能な代入変数がありません',
assignedVarsDescription: '代入変数は、次のような書き込み可能な変数である必要があります。',
conversationVars: '会話変数',
versionHistory: {
title: 'バージョン',
currentDraft: '現在の下書き',
latest: '最新版',
filter: {
all: 'すべて',
onlyYours: '自分のみ',
onlyShowNamedVersions: '名前付きバージョンのみ',
reset: 'リセット',
empty: '該当するバージョンがありません',
},
defaultName: '名称未設定',
nameThisVersion: 'バージョン名を付ける',
editVersionInfo: 'バージョン情報を編集',
editField: {
title: 'タイトル',
releaseNotes: 'リリースノート',
titleLengthLimit: 'タイトルは{{limit}}文字以内で入力してください',
releaseNotesLengthLimit: 'リリースノートは{{limit}}文字以内で入力してください',
},
releaseNotesPlaceholder: '変更内容を入力してください',
restorationTip: 'バージョンを復元すると、現在の下書きが上書きされます',
deletionTip: '削除したデータは復元できません。よろしいですか?',
action: {
restoreSuccess: '復元が完了しました',
restoreFailure: '復元に失敗しました',
deleteSuccess: '削除が完了しました',
deleteFailure: '削除に失敗しました',
updateSuccess: '更新が完了しました',
updateFailure: '更新に失敗しました',
},
},
}