diff --git a/.editorconfig b/.editorconfig index 12813b0dd56..5425f0db475 100644 --- a/.editorconfig +++ b/.editorconfig @@ -38,7 +38,6 @@ indent_size = 2 indent_style = space indent_size = 2 -# Lint suppression files are machine-generated without a final newline; -# keep them exempt so autofix.ci output stays stable. -[*-suppressions.json] +# Oxlint writes its generated suppression baseline without a final newline. +[oxlint-suppressions.json] insert_final_newline = false diff --git a/api/controllers/console/tag/tags.py b/api/controllers/console/tag/tags.py index bcd8711c58c..462ddf620b6 100644 --- a/api/controllers/console/tag/tags.py +++ b/api/controllers/console/tag/tags.py @@ -1,3 +1,4 @@ +from typing import Literal from uuid import UUID from flask_restx import Resource @@ -53,7 +54,7 @@ class TagBindingRemovePayload(BaseModel): class TagListQueryParam(BaseModel): - type: TagType = Field(description="Tag type filter") + type: Literal["knowledge", "app", "snippet", "skill"] = Field(description="Tag type filter") keyword: str | None = Field(None, description="Search keyword") diff --git a/api/controllers/console/workspace/skills.py b/api/controllers/console/workspace/skills.py index e84f78b02c2..d47f608e5f9 100644 --- a/api/controllers/console/workspace/skills.py +++ b/api/controllers/console/workspace/skills.py @@ -7,25 +7,22 @@ import io from flask import request, send_file from flask_restx import Resource from pydantic import BaseModel, ConfigDict, Field, ValidationError +from sqlalchemy.orm import Session from controllers.common.fields import BinaryFileResponse from controllers.common.schema import query_params_from_model, register_response_schema_models, register_schema_models +from controllers.common.session import with_session from controllers.console import console_ns +from controllers.console.flask_admission import console_account_admission from controllers.console.wraps import ( RBACPermission, RBACResourceScope, - account_initialization_required, edit_permission_required, - rbac_permission_required, - setup_required, - with_current_tenant_id, - with_current_user, ) from fields.base import ResponseModel from libs import helper from libs.helper import dump_response -from libs.login import login_required -from models.account import Account +from machinery.context import RequestContext from services.skill_management_service import ( SkillAssistMessagePayload, SkillCreatePayload, @@ -296,16 +293,23 @@ def _error_response(exc: SkillManagementServiceError) -> tuple[dict[str, object] return body, exc.status_code +def _workspace_id(context: RequestContext) -> str: + if context.active_workspace_id is None: + raise RuntimeError("Console account admission did not resolve an active workspace") + return context.active_workspace_id + + @console_ns.route("/workspaces/current/skills") class WorkspaceSkillsApi(Resource): @console_ns.doc(params=query_params_from_model(WorkspaceSkillsQuery)) @console_ns.response(200, "Workspace skills", console_ns.models[SkillListResponse.__name__]) - @setup_required - @login_required - @account_initialization_required - @rbac_permission_required(RBACResourceScope.WORKSPACE, RBACPermission.SKILL_VIEW, resource_required=False) - @with_current_tenant_id - def get(self, current_tenant_id: str): + @console_account_admission( + rbac_resource_scope=RBACResourceScope.WORKSPACE, + rbac_permission=RBACPermission.SKILL_VIEW, + rbac_resource_required=False, + ) + @with_session(write=False) + def get(self, session: Session, request_context: RequestContext): query_input: dict[str, object] = { "keyword": request.args.get("keyword"), "tag": request.args.getlist("tag"), @@ -315,8 +319,8 @@ class WorkspaceSkillsApi(Resource): if "page" in request.args: query_input["page"] = request.args.get("page") query = WorkspaceSkillsQuery.model_validate(query_input) - result = SkillManagementService().list_skills( - tenant_id=current_tenant_id, + result = SkillManagementService(session=session).list_skills( + tenant_id=_workspace_id(request_context), keyword=query.keyword, page=query.page, limit=query.limit, @@ -326,19 +330,19 @@ class WorkspaceSkillsApi(Resource): @console_ns.expect(console_ns.models[SkillCreatePayload.__name__]) @console_ns.response(201, "Skill created", console_ns.models[SkillDetailResponse.__name__]) - @setup_required - @login_required - @account_initialization_required + @console_account_admission( + rbac_resource_scope=RBACResourceScope.WORKSPACE, + rbac_permission=RBACPermission.SKILL_EDIT, + rbac_resource_required=False, + ) @edit_permission_required - @rbac_permission_required(RBACResourceScope.WORKSPACE, RBACPermission.SKILL_EDIT, resource_required=False) - @with_current_user - @with_current_tenant_id - def post(self, current_tenant_id: str, current_user: Account): + @with_session + def post(self, session: Session, request_context: RequestContext): try: payload = SkillCreatePayload.model_validate(console_ns.payload or {}) - result = SkillManagementService().create_skill( - tenant_id=current_tenant_id, - user_id=current_user.id, + result = SkillManagementService(session=session).create_skill( + tenant_id=_workspace_id(request_context), + user_id=request_context.account_id, payload=payload, ) return dump_response(SkillDetailResponse, result), 201 @@ -354,13 +358,10 @@ class WorkspaceSkillsApi(Resource): class WorkspaceSkillFileUploadApi(Resource): @console_ns.doc(consumes=["multipart/form-data"], params=_FILE_UPLOAD_PARAMS) @console_ns.response(201, "Skill draft file uploaded", console_ns.models[SkillFileUploadResponse.__name__]) - @setup_required - @login_required - @account_initialization_required + @console_account_admission() @edit_permission_required - @with_current_user - @with_current_tenant_id - def post(self, current_tenant_id: str, current_user: Account): + @with_session + def post(self, session: Session, request_context: RequestContext): if "file" not in request.files: return {"code": "no_file_uploaded", "message": "no file uploaded"}, 400 @@ -369,9 +370,9 @@ class WorkspaceSkillFileUploadApi(Resource): return {"code": "filename_missing", "message": "filename is required"}, 400 try: - result = SkillManagementService().upload_file( - tenant_id=current_tenant_id, - user_id=current_user.id, + result = SkillManagementService(session=session).upload_file( + tenant_id=_workspace_id(request_context), + user_id=request_context.account_id, filename=file.filename, content=file.stream.read(), mime_type=file.mimetype, @@ -384,12 +385,10 @@ class WorkspaceSkillFileUploadApi(Resource): @console_ns.route("/workspaces/current/skills/tags") class WorkspaceSkillTagsApi(Resource): @console_ns.response(200, "Workspace Skill tags", console_ns.models[SkillTagListResponse.__name__]) - @setup_required - @login_required - @account_initialization_required - @with_current_tenant_id - def get(self, current_tenant_id: str): - result = SkillManagementService().list_tags(tenant_id=current_tenant_id) + @console_account_admission() + @with_session(write=False) + def get(self, session: Session, request_context: RequestContext): + result = SkillManagementService(session=session).list_tags(tenant_id=_workspace_id(request_context)) return dump_response(SkillTagListResponse, result) @@ -397,21 +396,22 @@ class WorkspaceSkillTagsApi(Resource): class WorkspaceSkillImportApi(Resource): @console_ns.doc(description="Import a Skill zip package from multipart form field `file`.") @console_ns.response(201, "Skill imported", console_ns.models[SkillDetailResponse.__name__]) - @setup_required - @login_required - @account_initialization_required + @console_account_admission( + rbac_resource_scope=RBACResourceScope.WORKSPACE, + rbac_permission=RBACPermission.SKILL_EDIT, + rbac_resource_required=False, + ) @edit_permission_required - @with_current_user - @with_current_tenant_id - def post(self, current_tenant_id: str, current_user: Account): + @with_session + def post(self, session: Session, request_context: RequestContext): upload = request.files.get("file") if upload is None: return {"code": "invalid_request", "message": "file is required"}, 400 try: payload = SkillImportPayload(content=upload.read(), filename=upload.filename or "skill.zip") - result = SkillManagementService().import_skill( - tenant_id=current_tenant_id, - user_id=current_user.id, + result = SkillManagementService(session=session).import_skill( + tenant_id=_workspace_id(request_context), + user_id=request_context.account_id, payload=payload, ) return dump_response(SkillDetailResponse, result), 201 @@ -424,33 +424,36 @@ class WorkspaceSkillImportApi(Resource): @console_ns.route("/workspaces/current/skills/") class WorkspaceSkillApi(Resource): @console_ns.response(200, "Skill detail", console_ns.models[SkillDetailResponse.__name__]) - @setup_required - @login_required - @account_initialization_required - @rbac_permission_required(RBACResourceScope.WORKSPACE, RBACPermission.SKILL_VIEW, resource_required=False) - @with_current_tenant_id - def get(self, current_tenant_id: str, skill_id: str): + @console_account_admission( + rbac_resource_scope=RBACResourceScope.WORKSPACE, + rbac_permission=RBACPermission.SKILL_VIEW, + rbac_resource_required=False, + ) + @with_session(write=False) + def get(self, session: Session, request_context: RequestContext, skill_id: str): try: - result = SkillManagementService().get_skill(tenant_id=current_tenant_id, skill_id=skill_id) + result = SkillManagementService(session=session).get_skill( + tenant_id=_workspace_id(request_context), skill_id=skill_id + ) return dump_response(SkillDetailResponse, result) except SkillManagementServiceError as exc: return _error_response(exc) @console_ns.expect(console_ns.models[SkillMetadataPayload.__name__]) @console_ns.response(200, "Skill updated", console_ns.models[SkillResponse.__name__]) - @setup_required - @login_required - @account_initialization_required + @console_account_admission( + rbac_resource_scope=RBACResourceScope.WORKSPACE, + rbac_permission=RBACPermission.SKILL_EDIT, + rbac_resource_required=False, + ) @edit_permission_required - @rbac_permission_required(RBACResourceScope.WORKSPACE, RBACPermission.SKILL_EDIT, resource_required=False) - @with_current_user - @with_current_tenant_id - def patch(self, current_tenant_id: str, current_user: Account, skill_id: str): + @with_session + def patch(self, session: Session, request_context: RequestContext, skill_id: str): try: payload = SkillMetadataPayload.model_validate(console_ns.payload or {}) - result = SkillManagementService().update_metadata( - tenant_id=current_tenant_id, - user_id=current_user.id, + result = SkillManagementService(session=session).update_metadata( + tenant_id=_workspace_id(request_context), + user_id=request_context.account_id, skill_id=skill_id, payload=payload, ) @@ -464,17 +467,18 @@ class WorkspaceSkillApi(Resource): @console_ns.expect(console_ns.models[SkillDeletePayload.__name__]) @console_ns.response(200, "Skill deleted", console_ns.models[SkillDeleteResponse.__name__]) - @setup_required - @login_required - @account_initialization_required + @console_account_admission( + rbac_resource_scope=RBACResourceScope.WORKSPACE, + rbac_permission=RBACPermission.SKILL_DELETE, + rbac_resource_required=False, + ) @edit_permission_required - @rbac_permission_required(RBACResourceScope.WORKSPACE, RBACPermission.SKILL_DELETE, resource_required=False) - @with_current_tenant_id - def delete(self, current_tenant_id: str, skill_id: str): + @with_session + def delete(self, session: Session, request_context: RequestContext, skill_id: str): try: payload = SkillDeletePayload.model_validate(console_ns.payload or {}) - result = SkillManagementService().delete_skill( - tenant_id=current_tenant_id, + result = SkillManagementService(session=session).delete_skill( + tenant_id=_workspace_id(request_context), skill_id=skill_id, confirmation_name=payload.confirmation_name, ) @@ -488,17 +492,18 @@ class WorkspaceSkillApi(Resource): @console_ns.route("/workspaces/current/skills//duplicate") class WorkspaceSkillDuplicateApi(Resource): @console_ns.response(201, "Skill duplicated", console_ns.models[SkillDetailResponse.__name__]) - @setup_required - @login_required - @account_initialization_required + @console_account_admission( + rbac_resource_scope=RBACResourceScope.WORKSPACE, + rbac_permission=RBACPermission.SKILL_EDIT, + rbac_resource_required=False, + ) @edit_permission_required - @with_current_user - @with_current_tenant_id - def post(self, current_tenant_id: str, current_user: Account, skill_id: str): + @with_session + def post(self, session: Session, request_context: RequestContext, skill_id: str): try: - result = SkillManagementService().duplicate_skill( - tenant_id=current_tenant_id, - user_id=current_user.id, + result = SkillManagementService(session=session).duplicate_skill( + tenant_id=_workspace_id(request_context), + user_id=request_context.account_id, skill_id=skill_id, ) return dump_response(SkillDetailResponse, result), 201 @@ -509,13 +514,17 @@ class WorkspaceSkillDuplicateApi(Resource): @console_ns.route("/workspaces/current/skills//export") class WorkspaceSkillExportApi(Resource): @console_ns.response(200, "Published Skill zip archive") - @setup_required - @login_required - @account_initialization_required - @with_current_tenant_id - def get(self, current_tenant_id: str, skill_id: str): + @console_account_admission( + rbac_resource_scope=RBACResourceScope.WORKSPACE, + rbac_permission=RBACPermission.SKILL_VIEW, + rbac_resource_required=False, + ) + @with_session(write=False) + def get(self, session: Session, request_context: RequestContext, skill_id: str): try: - result = SkillManagementService().pull_published_archive(tenant_id=current_tenant_id, skill_id=skill_id) + result = SkillManagementService(session=session).pull_published_archive( + tenant_id=_workspace_id(request_context), skill_id=skill_id + ) return send_file( io.BytesIO(result.payload), mimetype=result.mime_type, @@ -532,18 +541,15 @@ class WorkspaceSkillAssistMessageApi(Resource): @console_ns.expect(console_ns.models[SkillAssistMessagePayload.__name__]) @console_ns.response(200, "Skill Authoring assistant event stream") - @setup_required - @login_required - @account_initialization_required - @with_current_user - @with_current_tenant_id - def post(self, current_tenant_id: str, current_user: Account, skill_id: str): + @console_account_admission() + @with_session + def post(self, session: Session, request_context: RequestContext, skill_id: str): try: payload = SkillAssistMessagePayload.model_validate(console_ns.payload or {}) - response = SkillManagementService().create_assistant_action_stream( - tenant_id=current_tenant_id, + response = SkillManagementService(session=session).create_assistant_action_stream( + tenant_id=_workspace_id(request_context), skill_id=skill_id, - user_id=current_user.id, + user_id=request_context.account_id, message=payload.message, attachments=payload.attachments, history=payload.history, @@ -561,16 +567,14 @@ class WorkspaceSkillAssistMessageApi(Resource): class WorkspaceSkillFilesCheckApi(Resource): @console_ns.expect(console_ns.models[SkillDraftFileCheckPayload.__name__]) @console_ns.response(200, "Draft files checked", console_ns.models[SkillFileCheckResponse.__name__]) - @setup_required - @login_required - @account_initialization_required + @console_account_admission() @edit_permission_required - @with_current_tenant_id - def post(self, current_tenant_id: str, skill_id: str): + @with_session + def post(self, session: Session, request_context: RequestContext, skill_id: str): try: payload = SkillDraftFileCheckPayload.model_validate(console_ns.payload or {}) - result = SkillManagementService().check_draft_files( - tenant_id=current_tenant_id, + result = SkillManagementService(session=session).check_draft_files( + tenant_id=_workspace_id(request_context), skill_id=skill_id, payload=payload, ) @@ -587,18 +591,15 @@ class WorkspaceSkillFilesCheckApi(Resource): class WorkspaceSkillFilesApi(Resource): @console_ns.expect(console_ns.models[SkillDraftFileOperationPayload.__name__]) @console_ns.response(200, "Draft file operation applied", console_ns.models[SkillDetailResponse.__name__]) - @setup_required - @login_required - @account_initialization_required + @console_account_admission() @edit_permission_required - @with_current_user - @with_current_tenant_id - def patch(self, current_tenant_id: str, current_user: Account, skill_id: str): + @with_session + def patch(self, session: Session, request_context: RequestContext, skill_id: str): try: payload = SkillDraftFileOperationPayload.model_validate(console_ns.payload or {}) - result = SkillManagementService().apply_draft_file_operation( - tenant_id=current_tenant_id, - user_id=current_user.id, + result = SkillManagementService(session=session).apply_draft_file_operation( + tenant_id=_workspace_id(request_context), + user_id=request_context.account_id, skill_id=skill_id, payload=payload, ) @@ -612,18 +613,15 @@ class WorkspaceSkillFilesApi(Resource): @console_ns.expect(console_ns.models[SkillDraftTreePayload.__name__]) @console_ns.response(200, "Draft files replaced", console_ns.models[SkillDetailResponse.__name__]) - @setup_required - @login_required - @account_initialization_required + @console_account_admission() @edit_permission_required - @with_current_user - @with_current_tenant_id - def put(self, current_tenant_id: str, current_user: Account, skill_id: str): + @with_session + def put(self, session: Session, request_context: RequestContext, skill_id: str): try: payload = SkillDraftTreePayload.model_validate(console_ns.payload or {}) - result = SkillManagementService().replace_draft_tree( - tenant_id=current_tenant_id, - user_id=current_user.id, + result = SkillManagementService(session=session).replace_draft_tree( + tenant_id=_workspace_id(request_context), + user_id=request_context.account_id, skill_id=skill_id, payload=payload, ) @@ -640,11 +638,9 @@ class WorkspaceSkillFilesApi(Resource): class WorkspaceSkillFilePreviewApi(Resource): @console_ns.doc(params=query_params_from_model(SkillFileQuery)) @console_ns.response(200, "Skill file text preview", console_ns.models[SkillFilePreviewResponse.__name__]) - @setup_required - @login_required - @account_initialization_required - @with_current_tenant_id - def get(self, current_tenant_id: str, skill_id: str): + @console_account_admission() + @with_session + def get(self, session: Session, request_context: RequestContext, skill_id: str): try: query = SkillFileQuery.model_validate( { @@ -652,8 +648,8 @@ class WorkspaceSkillFilePreviewApi(Resource): "version_id": request.args.get("version_id"), } ) - result = SkillManagementService().preview_file( - tenant_id=current_tenant_id, + result = SkillManagementService(session=session).preview_file( + tenant_id=_workspace_id(request_context), skill_id=skill_id, path=query.path, version_id=query.version_id, @@ -671,11 +667,9 @@ class WorkspaceSkillFilePreviewApi(Resource): class WorkspaceSkillFileContentApi(Resource): @console_ns.doc(params={**query_params_from_model(SkillFileQuery), "download": "Return as an attachment when 1."}) @console_ns.response(200, "Skill file content", console_ns.models[BinaryFileResponse.__name__]) - @setup_required - @login_required - @account_initialization_required - @with_current_tenant_id - def get(self, current_tenant_id: str, skill_id: str): + @console_account_admission() + @with_session + def get(self, session: Session, request_context: RequestContext, skill_id: str): try: query = SkillFileQuery.model_validate( { @@ -683,8 +677,8 @@ class WorkspaceSkillFileContentApi(Resource): "version_id": request.args.get("version_id"), } ) - result = SkillManagementService().pull_file( - tenant_id=current_tenant_id, + result = SkillManagementService(session=session).pull_file( + tenant_id=_workspace_id(request_context), skill_id=skill_id, path=query.path, version_id=query.version_id, @@ -707,19 +701,19 @@ class WorkspaceSkillFileContentApi(Resource): class WorkspaceSkillPublishApi(Resource): @console_ns.expect(console_ns.models[SkillPublishPayload.__name__]) @console_ns.response(200, "Skill published", console_ns.models[SkillVersionResponse.__name__]) - @setup_required - @login_required - @account_initialization_required + @console_account_admission( + rbac_resource_scope=RBACResourceScope.WORKSPACE, + rbac_permission=RBACPermission.SKILL_PUBLISH, + rbac_resource_required=False, + ) @edit_permission_required - @rbac_permission_required(RBACResourceScope.WORKSPACE, RBACPermission.SKILL_PUBLISH, resource_required=False) - @with_current_user - @with_current_tenant_id - def post(self, current_tenant_id: str, current_user: Account, skill_id: str): + @with_session + def post(self, session: Session, request_context: RequestContext, skill_id: str): try: payload = SkillPublishPayload.model_validate(console_ns.payload or {}) - result = SkillManagementService().publish_skill( - tenant_id=current_tenant_id, - user_id=current_user.id, + result = SkillManagementService(session=session).publish_skill( + tenant_id=_workspace_id(request_context), + user_id=request_context.account_id, skill_id=skill_id, payload=payload, ) @@ -734,19 +728,19 @@ class WorkspaceSkillPublishApi(Resource): class WorkspaceSkillRestoreApi(Resource): @console_ns.expect(console_ns.models[SkillRestorePayload.__name__]) @console_ns.response(200, "Skill version restored to draft", console_ns.models[SkillDetailResponse.__name__]) - @setup_required - @login_required - @account_initialization_required + @console_account_admission( + rbac_resource_scope=RBACResourceScope.WORKSPACE, + rbac_permission=RBACPermission.SKILL_PUBLISH, + rbac_resource_required=False, + ) @edit_permission_required - @rbac_permission_required(RBACResourceScope.WORKSPACE, RBACPermission.SKILL_PUBLISH, resource_required=False) - @with_current_user - @with_current_tenant_id - def post(self, current_tenant_id: str, current_user: Account, skill_id: str): + @with_session + def post(self, session: Session, request_context: RequestContext, skill_id: str): try: payload = SkillRestorePayload.model_validate(console_ns.payload or {}) - result = SkillManagementService().restore_version( - tenant_id=current_tenant_id, - user_id=current_user.id, + result = SkillManagementService(session=session).restore_version( + tenant_id=_workspace_id(request_context), + user_id=request_context.account_id, skill_id=skill_id, payload=payload, ) @@ -760,13 +754,13 @@ class WorkspaceSkillRestoreApi(Resource): @console_ns.route("/workspaces/current/skills//references") class WorkspaceSkillReferencesApi(Resource): @console_ns.response(200, "Skill references", console_ns.models[SkillReferenceListResponse.__name__]) - @setup_required - @login_required - @account_initialization_required - @with_current_tenant_id - def get(self, current_tenant_id: str, skill_id: str): + @console_account_admission() + @with_session + def get(self, session: Session, request_context: RequestContext, skill_id: str): try: - result = SkillManagementService().list_skill_references(tenant_id=current_tenant_id, skill_id=skill_id) + result = SkillManagementService(session=session).list_skill_references( + tenant_id=_workspace_id(request_context), skill_id=skill_id + ) return dump_response(SkillReferenceListResponse, result) except SkillManagementServiceError as exc: return _error_response(exc) @@ -775,13 +769,13 @@ class WorkspaceSkillReferencesApi(Resource): @console_ns.route("/workspaces/current/skills//versions") class WorkspaceSkillVersionsApi(Resource): @console_ns.response(200, "Skill versions", console_ns.models[SkillVersionListResponse.__name__]) - @setup_required - @login_required - @account_initialization_required - @with_current_tenant_id - def get(self, current_tenant_id: str, skill_id: str): + @console_account_admission() + @with_session + def get(self, session: Session, request_context: RequestContext, skill_id: str): try: - result = SkillManagementService().list_versions(tenant_id=current_tenant_id, skill_id=skill_id) + result = SkillManagementService(session=session).list_versions( + tenant_id=_workspace_id(request_context), skill_id=skill_id + ) return dump_response(SkillVersionListResponse, result) except SkillManagementServiceError as exc: return _error_response(exc) @@ -790,14 +784,12 @@ class WorkspaceSkillVersionsApi(Resource): @console_ns.route("/workspaces/current/skills//versions/") class WorkspaceSkillVersionApi(Resource): @console_ns.response(200, "Skill version detail", console_ns.models[SkillVersionDetailResponse.__name__]) - @setup_required - @login_required - @account_initialization_required - @with_current_tenant_id - def get(self, current_tenant_id: str, skill_id: str, version_id: str): + @console_account_admission() + @with_session + def get(self, session: Session, request_context: RequestContext, skill_id: str, version_id: str): try: - result = SkillManagementService().get_version( - tenant_id=current_tenant_id, + result = SkillManagementService(session=session).get_version( + tenant_id=_workspace_id(request_context), skill_id=skill_id, version_id=version_id, ) @@ -807,16 +799,14 @@ class WorkspaceSkillVersionApi(Resource): @console_ns.expect(console_ns.models[SkillVersionUpdatePayload.__name__]) @console_ns.response(200, "Skill version updated", console_ns.models[SkillVersionResponse.__name__]) - @setup_required - @login_required - @account_initialization_required + @console_account_admission() @edit_permission_required - @with_current_tenant_id - def patch(self, current_tenant_id: str, skill_id: str, version_id: str): + @with_session + def patch(self, session: Session, request_context: RequestContext, skill_id: str, version_id: str): try: payload = SkillVersionUpdatePayload.model_validate(console_ns.payload or {}) - result = SkillManagementService().update_version( - tenant_id=current_tenant_id, + result = SkillManagementService(session=session).update_version( + tenant_id=_workspace_id(request_context), skill_id=skill_id, version_id=version_id, payload=payload, @@ -828,17 +818,14 @@ class WorkspaceSkillVersionApi(Resource): return _error_response(exc) @console_ns.response(200, "Skill version deleted", console_ns.models[SkillVersionDeleteResponse.__name__]) - @setup_required - @login_required - @account_initialization_required + @console_account_admission() @edit_permission_required - @with_current_user - @with_current_tenant_id - def delete(self, current_tenant_id: str, current_user: Account, skill_id: str, version_id: str): + @with_session + def delete(self, session: Session, request_context: RequestContext, skill_id: str, version_id: str): try: - result = SkillManagementService().delete_version( - tenant_id=current_tenant_id, - user_id=current_user.id, + result = SkillManagementService(session=session).delete_version( + tenant_id=_workspace_id(request_context), + user_id=request_context.account_id, skill_id=skill_id, version_id=version_id, ) @@ -850,28 +837,25 @@ class WorkspaceSkillVersionApi(Resource): @console_ns.route("/workspaces/current/agents//skills") class WorkspaceAgentSkillBindingsApi(Resource): @console_ns.response(200, "Agent Skill bindings", console_ns.models[AgentSkillBindingsResponse.__name__]) - @setup_required - @login_required - @account_initialization_required - @with_current_tenant_id - def get(self, current_tenant_id: str, agent_id: str): - result = SkillManagementService().list_agent_bindings(tenant_id=current_tenant_id, agent_id=agent_id) + @console_account_admission() + @with_session + def get(self, session: Session, request_context: RequestContext, agent_id: str): + result = SkillManagementService(session=session).list_agent_bindings( + tenant_id=_workspace_id(request_context), agent_id=agent_id + ) return dump_response(AgentSkillBindingsResponse, result) @console_ns.expect(console_ns.models[AgentSkillBindingsPayload.__name__]) @console_ns.response(200, "Agent Skill bindings replaced", console_ns.models[AgentSkillBindingsResponse.__name__]) - @setup_required - @login_required - @account_initialization_required + @console_account_admission() @edit_permission_required - @with_current_user - @with_current_tenant_id - def put(self, current_tenant_id: str, current_user: Account, agent_id: str): + @with_session + def put(self, session: Session, request_context: RequestContext, agent_id: str): try: payload = AgentSkillBindingsPayload.model_validate(console_ns.payload or {}) - result = SkillManagementService().replace_agent_bindings( - tenant_id=current_tenant_id, - user_id=current_user.id, + result = SkillManagementService(session=session).replace_agent_bindings( + tenant_id=_workspace_id(request_context), + user_id=request_context.account_id, agent_id=agent_id, skill_ids=payload.skill_ids, ) diff --git a/api/controllers/inner_api/plugin/skills.py b/api/controllers/inner_api/plugin/skills.py index 0aa756f47a4..315e836b8d1 100644 --- a/api/controllers/inner_api/plugin/skills.py +++ b/api/controllers/inner_api/plugin/skills.py @@ -11,7 +11,9 @@ import io from flask import request, send_file from flask_restx import Resource from pydantic import BaseModel, ValidationError +from sqlalchemy.orm import Session +from controllers.common.session import with_session from controllers.console.wraps import setup_required from controllers.inner_api import inner_api_ns from controllers.inner_api.wraps import plugin_inner_api_only @@ -35,10 +37,13 @@ class PublishedSkillPullApi(Resource): @setup_required @plugin_inner_api_only @inner_api_ns.doc("published_skill_pull") - def get(self, skill_id: str): + @with_session(write=False) + def get(self, session: Session, skill_id: str): try: query = _target_query_from_request() - result = SkillManagementService().pull_published_archive(tenant_id=query.tenant_id, skill_id=skill_id) + result = SkillManagementService(session=session).pull_published_archive( + tenant_id=query.tenant_id, skill_id=skill_id + ) return send_file( io.BytesIO(result.payload), mimetype=result.mime_type, diff --git a/api/migrations/versions/2026_07_09_1200-a4f8d2c9e1b0_add_workspace_skill_management.py b/api/migrations/versions/2026_07_09_1200-a4f8d2c9e1b0_add_workspace_skill_management.py deleted file mode 100644 index 4c3fb6d0e39..00000000000 --- a/api/migrations/versions/2026_07_09_1200-a4f8d2c9e1b0_add_workspace_skill_management.py +++ /dev/null @@ -1,114 +0,0 @@ -"""add workspace skill management - -Revision ID: a4f8d2c9e1b0 -Revises: e4708db55c1d -Create Date: 2026-07-09 12:00:00.000000 - -""" - -import sqlalchemy as sa -from alembic import op -from sqlalchemy.dialects import mysql - -from models.types import StringUUID - -# revision identifiers, used by Alembic. -revision = "a4f8d2c9e1b0" -down_revision = "e4708db55c1d" -branch_labels = None -depends_on = None - - -def _uuid_column(name: str, *, nullable: bool = False) -> sa.Column: - return sa.Column(name, StringUUID(), nullable=nullable) - - -def _long_text() -> sa.types.TypeEngine: - return sa.Text().with_variant(mysql.LONGTEXT(), "mysql") - - -def upgrade() -> None: - op.create_table( - "skills", - _uuid_column("id"), - _uuid_column("tenant_id"), - sa.Column("name", sa.String(length=64), nullable=False), - sa.Column("display_name", sa.String(length=128), nullable=False), - sa.Column("icon", sa.String(length=16), nullable=False, server_default="📄"), - sa.Column("description", sa.String(length=1024), nullable=False, server_default=""), - sa.Column("name_manually_edited", sa.Boolean(), nullable=False, server_default=sa.false()), - sa.Column("visibility", sa.String(length=32), nullable=False, server_default="workspace"), - _uuid_column("latest_published_version_id", nullable=True), - _uuid_column("created_by", nullable=True), - _uuid_column("updated_by", nullable=True), - sa.Column("created_at", sa.DateTime(), nullable=False, server_default=sa.func.current_timestamp()), - sa.Column("updated_at", sa.DateTime(), nullable=False, server_default=sa.func.current_timestamp()), - sa.PrimaryKeyConstraint("id", name="skill_pkey"), - sa.UniqueConstraint("tenant_id", "name", name="skill_tenant_name_unique"), - ) - op.create_index("skills_tenant_updated_at_idx", "skills", ["tenant_id", "updated_at"]) - - op.create_table( - "skill_draft_files", - _uuid_column("id"), - _uuid_column("skill_id"), - sa.Column("path", sa.String(length=512), nullable=False), - sa.Column("kind", sa.String(length=32), nullable=False), - sa.Column("storage", sa.String(length=32), nullable=True), - sa.Column("mime_type", sa.String(length=255), nullable=True), - sa.Column("content_text", _long_text(), nullable=True), - _uuid_column("tool_file_id", nullable=True), - sa.Column("size", sa.BigInteger(), nullable=True), - sa.Column("hash", sa.String(length=255), nullable=True), - sa.Column("created_at", sa.DateTime(), nullable=False, server_default=sa.func.current_timestamp()), - sa.Column("updated_at", sa.DateTime(), nullable=False, server_default=sa.func.current_timestamp()), - sa.PrimaryKeyConstraint("id", name="skill_draft_file_pkey"), - sa.UniqueConstraint("skill_id", "path", name="skill_draft_file_skill_path_unique"), - ) - op.create_index("skill_draft_files_skill_path_idx", "skill_draft_files", ["skill_id", "path"]) - - op.create_table( - "skill_versions", - _uuid_column("id"), - _uuid_column("skill_id"), - sa.Column("version_number", sa.Integer(), nullable=False), - sa.Column("version_name", sa.String(length=128), nullable=False, server_default=""), - sa.Column("publish_note", sa.String(length=1024), nullable=False, server_default=""), - sa.Column("manifest", _long_text(), nullable=False), - _uuid_column("archive_tool_file_id"), - sa.Column("hash_code", sa.String(length=255), nullable=False), - sa.Column("archive_size", sa.BigInteger(), nullable=False), - _uuid_column("published_by", nullable=True), - sa.Column("created_at", sa.DateTime(), nullable=False, server_default=sa.func.current_timestamp()), - sa.Column("updated_at", sa.DateTime(), nullable=False, server_default=sa.func.current_timestamp()), - sa.PrimaryKeyConstraint("id", name="skill_version_pkey"), - sa.UniqueConstraint("skill_id", "version_number", name="skill_version_skill_number_unique"), - ) - op.create_index("skill_versions_skill_created_at_idx", "skill_versions", ["skill_id", "created_at"]) - - op.create_table( - "agent_skill_bindings", - _uuid_column("id"), - _uuid_column("tenant_id"), - _uuid_column("agent_id"), - _uuid_column("skill_id"), - sa.Column("priority", sa.Integer(), nullable=False), - _uuid_column("created_by", nullable=True), - sa.Column("created_at", sa.DateTime(), nullable=False, server_default=sa.func.current_timestamp()), - sa.Column("updated_at", sa.DateTime(), nullable=False, server_default=sa.func.current_timestamp()), - sa.PrimaryKeyConstraint("id", name="agent_skill_binding_pkey"), - sa.UniqueConstraint("tenant_id", "agent_id", "skill_id", name="agent_skill_binding_unique"), - sa.UniqueConstraint("tenant_id", "agent_id", "priority", name="agent_skill_binding_priority_unique"), - ) - op.create_index("agent_skill_bindings_skill_idx", "agent_skill_bindings", ["tenant_id", "skill_id"]) - - -def downgrade() -> None: - op.drop_index("agent_skill_bindings_skill_idx", table_name="agent_skill_bindings") - op.drop_table("agent_skill_bindings") - op.drop_index("skill_versions_skill_created_at_idx", table_name="skill_versions") - op.drop_table("skill_versions") - op.drop_index("skill_draft_files_skill_path_idx", table_name="skill_draft_files") - op.drop_table("skill_draft_files") - op.drop_index("skills_tenant_updated_at_idx", table_name="skills") - op.drop_table("skills") diff --git a/api/migrations/versions/2026_07_22_1500-d2825e7b9c10_scope_agent_debug_conversations.py b/api/migrations/versions/2026_07_22_1500-d2825e7b9c10_scope_agent_debug_conversations.py index 3232286faac..2e3e41e2b82 100644 --- a/api/migrations/versions/2026_07_22_1500-d2825e7b9c10_scope_agent_debug_conversations.py +++ b/api/migrations/versions/2026_07_22_1500-d2825e7b9c10_scope_agent_debug_conversations.py @@ -18,109 +18,31 @@ branch_labels = None depends_on = None -def _is_pg(conn) -> bool: - return conn.dialect.name == "postgresql" - - -def _uuid_column(name: str, *, nullable: bool = False, primary_key: bool = False) -> sa.Column: - kwargs = {"nullable": nullable, "primary_key": primary_key} - if primary_key and _is_pg(op.get_bind()): - kwargs["server_default"] = sa.text("uuidv7()") - return sa.Column(name, models.types.StringUUID(), **kwargs) - - -def _has_table(table_name: str) -> bool: - return sa.inspect(op.get_bind()).has_table(table_name) - - -def _has_column(table_name: str, column_name: str) -> bool: - return any( - column["name"] == column_name for column in sa.inspect(op.get_bind()).get_columns(table_name) - ) - - -def _has_unique_constraint(table_name: str, constraint_name: str) -> bool: - return any( - constraint["name"] == constraint_name - for constraint in sa.inspect(op.get_bind()).get_unique_constraints(table_name) - ) - - def upgrade(): - if not _has_table("agent_debug_conversations"): - op.create_table( - "agent_debug_conversations", - _uuid_column("id", primary_key=True), - sa.Column("tenant_id", models.types.StringUUID(), nullable=False), - sa.Column("agent_id", models.types.StringUUID(), nullable=False), - sa.Column("app_id", models.types.StringUUID(), nullable=False), - sa.Column("account_id", models.types.StringUUID(), nullable=False), - sa.Column("conversation_id", models.types.StringUUID(), nullable=False), - sa.Column( - "draft_type", - sa.String(length=32), - nullable=False, - server_default=sa.text("'debug_build'"), - ), - sa.Column("created_at", sa.DateTime(), server_default=sa.func.current_timestamp(), nullable=False), - sa.Column("updated_at", sa.DateTime(), server_default=sa.func.current_timestamp(), nullable=False), - sa.PrimaryKeyConstraint("id", name=op.f("agent_debug_conversation_pkey")), - sa.UniqueConstraint( - "tenant_id", - "agent_id", - "account_id", - "draft_type", - name=op.f("agent_debug_conversation_agent_account_draft_type_unique"), - ), - ) - op.create_index( - "agent_debug_conversation_conversation_idx", - "agent_debug_conversations", - ["conversation_id"], - ) - op.create_index( - "agent_debug_conversation_account_idx", - "agent_debug_conversations", - ["tenant_id", "account_id"], - ) - return - # Existing pointers have always represented Build chat because the Agent # detail API exposes them as ``debug_conversation_id`` for that surface. - if not _has_column("agent_debug_conversations", "draft_type"): - op.add_column( - "agent_debug_conversations", - sa.Column( - "draft_type", - sa.String(length=32), - nullable=False, - server_default=sa.text("'debug_build'"), - ), - ) - if _has_unique_constraint( + op.add_column( "agent_debug_conversations", + sa.Column( + "draft_type", + sa.String(length=32), + nullable=False, + server_default=sa.text("'debug_build'"), + ), + ) + op.drop_constraint( "agent_debug_conversation_agent_account_unique", - ): - op.drop_constraint( - "agent_debug_conversation_agent_account_unique", - "agent_debug_conversations", - type_="unique", - ) - if not _has_unique_constraint( "agent_debug_conversations", + type_="unique", + ) + op.create_unique_constraint( "agent_debug_conversation_agent_account_draft_type_unique", - ): - op.create_unique_constraint( - "agent_debug_conversation_agent_account_draft_type_unique", - "agent_debug_conversations", - ["tenant_id", "agent_id", "account_id", "draft_type"], - ) + "agent_debug_conversations", + ["tenant_id", "agent_id", "account_id", "draft_type"], + ) def downgrade(): - if not _has_table("agent_debug_conversations"): - return - debug_conversations = sa.table( "agent_debug_conversations", sa.column("tenant_id", models.types.StringUUID()), @@ -142,23 +64,14 @@ def downgrade(): ), ) ) - if _has_unique_constraint( - "agent_debug_conversations", + op.drop_constraint( "agent_debug_conversation_agent_account_draft_type_unique", - ): - op.drop_constraint( - "agent_debug_conversation_agent_account_draft_type_unique", - "agent_debug_conversations", - type_="unique", - ) - if not _has_unique_constraint( "agent_debug_conversations", + type_="unique", + ) + op.create_unique_constraint( "agent_debug_conversation_agent_account_unique", - ): - op.create_unique_constraint( - "agent_debug_conversation_agent_account_unique", - "agent_debug_conversations", - ["tenant_id", "agent_id", "account_id"], - ) - if _has_column("agent_debug_conversations", "draft_type"): - op.drop_column("agent_debug_conversations", "draft_type") + "agent_debug_conversations", + ["tenant_id", "agent_id", "account_id"], + ) + op.drop_column("agent_debug_conversations", "draft_type") diff --git a/api/migrations/versions/2026_07_23_1500-e9f4a1b2c3d5_merge_skill_and_agent_debug_heads.py b/api/migrations/versions/2026_07_23_1500-e9f4a1b2c3d5_merge_skill_and_agent_debug_heads.py deleted file mode 100644 index b5e5b709f2c..00000000000 --- a/api/migrations/versions/2026_07_23_1500-e9f4a1b2c3d5_merge_skill_and_agent_debug_heads.py +++ /dev/null @@ -1,21 +0,0 @@ -"""merge skill and agent debug conversation heads - -Revision ID: e9f4a1b2c3d5 -Revises: a4f8d2c9e1b0, d2825e7b9c10 -Create Date: 2026-07-23 15:00:00.000000 - -""" - -# revision identifiers, used by Alembic. -revision = "e9f4a1b2c3d5" -down_revision = ("a4f8d2c9e1b0", "d2825e7b9c10") -branch_labels = None -depends_on = None - - -def upgrade(): - pass - - -def downgrade(): - pass diff --git a/api/migrations/versions/2026_08_24_1052-a4f8d2c9e1b0_add_workspace_skill_management.py b/api/migrations/versions/2026_08_24_1052-a4f8d2c9e1b0_add_workspace_skill_management.py new file mode 100644 index 00000000000..e2d54197e70 --- /dev/null +++ b/api/migrations/versions/2026_08_24_1052-a4f8d2c9e1b0_add_workspace_skill_management.py @@ -0,0 +1,186 @@ +"""add workspace skill management + +Revision ID: a4f8d2c9e1b0 +Revises: 925e75620b69 +Create Date: 2026-08-24 10:52:00.000000 + +""" + +import sqlalchemy as sa +from alembic import context, op +from sqlalchemy.dialects import mysql + +from models.types import StringUUID + +# revision identifiers, used by Alembic. +revision = "a4f8d2c9e1b0" +down_revision = "925e75620b69" +branch_labels = None +depends_on = None + + +def _uuid_column(name: str, *, nullable: bool = False) -> sa.Column: + return sa.Column(name, StringUUID(), nullable=nullable) + + +def _long_text() -> sa.types.TypeEngine: + return sa.Text().with_variant(mysql.LONGTEXT(), "mysql") + + +def upgrade() -> None: + if not _has_table("skills"): + op.create_table( + "skills", + _uuid_column("id"), + _uuid_column("tenant_id"), + sa.Column("name", sa.String(length=64), nullable=False), + sa.Column("display_name", sa.String(length=128), nullable=False), + sa.Column("icon", sa.String(length=16), nullable=False, server_default="📄"), + sa.Column("description", sa.String(length=1024), nullable=False, server_default=""), + sa.Column("name_manually_edited", sa.Boolean(), nullable=False, server_default=sa.false()), + sa.Column("visibility", sa.String(length=32), nullable=False, server_default="workspace"), + _uuid_column("latest_published_version_id", nullable=True), + _uuid_column("created_by", nullable=True), + _uuid_column("updated_by", nullable=True), + sa.Column("created_at", sa.DateTime(), nullable=False, server_default=sa.func.current_timestamp()), + sa.Column("updated_at", sa.DateTime(), nullable=False, server_default=sa.func.current_timestamp()), + sa.PrimaryKeyConstraint("id", name="skill_pkey"), + sa.UniqueConstraint("tenant_id", "name", name="skill_tenant_name_unique"), + ) + if not _has_index("skills", "skills_tenant_updated_at_idx"): + op.create_index("skills_tenant_updated_at_idx", "skills", ["tenant_id", "updated_at"]) + + if not _has_table("skill_draft_files"): + op.create_table( + "skill_draft_files", + _uuid_column("id"), + _uuid_column("skill_id"), + sa.Column("path", sa.String(length=512), nullable=False), + sa.Column("kind", sa.String(length=32), nullable=False), + sa.Column("storage", sa.String(length=32), nullable=True), + sa.Column("mime_type", sa.String(length=255), nullable=True), + sa.Column("content_text", _long_text(), nullable=True), + _uuid_column("tool_file_id", nullable=True), + sa.Column("size", sa.BigInteger(), nullable=True), + sa.Column("hash", sa.String(length=255), nullable=True), + sa.Column("created_at", sa.DateTime(), nullable=False, server_default=sa.func.current_timestamp()), + sa.Column("updated_at", sa.DateTime(), nullable=False, server_default=sa.func.current_timestamp()), + sa.PrimaryKeyConstraint("id", name="skill_draft_file_pkey"), + sa.UniqueConstraint("skill_id", "path", name="skill_draft_file_skill_path_unique"), + ) + if not _has_index("skill_draft_files", "skill_draft_files_skill_path_idx"): + op.create_index("skill_draft_files_skill_path_idx", "skill_draft_files", ["skill_id", "path"]) + + if not _has_table("skill_versions"): + op.create_table( + "skill_versions", + _uuid_column("id"), + _uuid_column("skill_id"), + sa.Column("version_number", sa.Integer(), nullable=False), + sa.Column("version_name", sa.String(length=128), nullable=False, server_default=""), + sa.Column("publish_note", sa.String(length=1024), nullable=False, server_default=""), + sa.Column("manifest", _long_text(), nullable=False), + _uuid_column("archive_tool_file_id"), + sa.Column("hash_code", sa.String(length=255), nullable=False), + sa.Column("archive_size", sa.BigInteger(), nullable=False), + _uuid_column("published_by", nullable=True), + sa.Column("created_at", sa.DateTime(), nullable=False, server_default=sa.func.current_timestamp()), + sa.Column("updated_at", sa.DateTime(), nullable=False, server_default=sa.func.current_timestamp()), + sa.PrimaryKeyConstraint("id", name="skill_version_pkey"), + sa.UniqueConstraint("skill_id", "version_number", name="skill_version_skill_number_unique"), + ) + if not _has_index("skill_versions", "skill_versions_skill_created_at_idx"): + op.create_index("skill_versions_skill_created_at_idx", "skill_versions", ["skill_id", "created_at"]) + + if not _has_table("agent_skill_bindings"): + op.create_table( + "agent_skill_bindings", + _uuid_column("id"), + _uuid_column("tenant_id"), + _uuid_column("agent_id"), + _uuid_column("skill_id"), + sa.Column("priority", sa.Integer(), nullable=False), + _uuid_column("created_by", nullable=True), + sa.Column("created_at", sa.DateTime(), nullable=False, server_default=sa.func.current_timestamp()), + sa.Column("updated_at", sa.DateTime(), nullable=False, server_default=sa.func.current_timestamp()), + sa.PrimaryKeyConstraint("id", name="agent_skill_binding_pkey"), + sa.UniqueConstraint("tenant_id", "agent_id", "skill_id", name="agent_skill_binding_unique"), + sa.UniqueConstraint("tenant_id", "agent_id", "priority", name="agent_skill_binding_priority_unique"), + ) + if not _has_index("agent_skill_bindings", "agent_skill_bindings_skill_idx"): + op.create_index("agent_skill_bindings_skill_idx", "agent_skill_bindings", ["tenant_id", "skill_id"]) + + if not _has_table("agent_skill_binding_snapshots"): + op.create_table( + "agent_skill_binding_snapshots", + _uuid_column("id"), + _uuid_column("tenant_id"), + _uuid_column("agent_id"), + _uuid_column("config_snapshot_id"), + _uuid_column("skill_id"), + sa.Column("priority", sa.Integer(), nullable=False), + _uuid_column("created_by", nullable=True), + sa.Column("created_at", sa.DateTime(), nullable=False, server_default=sa.func.current_timestamp()), + sa.Column("updated_at", sa.DateTime(), nullable=False, server_default=sa.func.current_timestamp()), + sa.PrimaryKeyConstraint("id", name="agent_skill_binding_snapshot_pkey"), + sa.UniqueConstraint( + "tenant_id", + "agent_id", + "config_snapshot_id", + "skill_id", + name="agent_skill_binding_snapshot_skill_unique", + ), + sa.UniqueConstraint( + "tenant_id", + "agent_id", + "config_snapshot_id", + "priority", + name="agent_skill_binding_snapshot_priority_unique", + ), + ) + if not _has_index("agent_skill_binding_snapshots", "agent_skill_binding_snapshots_agent_snapshot_idx"): + op.create_index( + "agent_skill_binding_snapshots_agent_snapshot_idx", + "agent_skill_binding_snapshots", + ["tenant_id", "agent_id", "config_snapshot_id"], + ) + + +def downgrade() -> None: + if context.is_offline_mode() or _has_table("agent_skill_binding_snapshots"): + if context.is_offline_mode() or _has_index( + "agent_skill_binding_snapshots", "agent_skill_binding_snapshots_agent_snapshot_idx" + ): + op.drop_index( + "agent_skill_binding_snapshots_agent_snapshot_idx", + table_name="agent_skill_binding_snapshots", + ) + op.drop_table("agent_skill_binding_snapshots") + if context.is_offline_mode() or _has_table("agent_skill_bindings"): + if context.is_offline_mode() or _has_index("agent_skill_bindings", "agent_skill_bindings_skill_idx"): + op.drop_index("agent_skill_bindings_skill_idx", table_name="agent_skill_bindings") + op.drop_table("agent_skill_bindings") + if context.is_offline_mode() or _has_table("skill_versions"): + if context.is_offline_mode() or _has_index("skill_versions", "skill_versions_skill_created_at_idx"): + op.drop_index("skill_versions_skill_created_at_idx", table_name="skill_versions") + op.drop_table("skill_versions") + if context.is_offline_mode() or _has_table("skill_draft_files"): + if context.is_offline_mode() or _has_index("skill_draft_files", "skill_draft_files_skill_path_idx"): + op.drop_index("skill_draft_files_skill_path_idx", table_name="skill_draft_files") + op.drop_table("skill_draft_files") + if context.is_offline_mode() or _has_table("skills"): + if context.is_offline_mode() or _has_index("skills", "skills_tenant_updated_at_idx"): + op.drop_index("skills_tenant_updated_at_idx", table_name="skills") + op.drop_table("skills") + + +def _has_table(table_name: str) -> bool: + if context.is_offline_mode(): + return False + return sa.inspect(op.get_bind()).has_table(table_name) + + +def _has_index(table_name: str, index_name: str) -> bool: + if context.is_offline_mode() or not _has_table(table_name): + return False + return any(index["name"] == index_name for index in sa.inspect(op.get_bind()).get_indexes(table_name)) diff --git a/api/models/skill.py b/api/models/skill.py index df9f06cff83..5d44b88c078 100644 --- a/api/models/skill.py +++ b/api/models/skill.py @@ -155,8 +155,40 @@ class AgentSkillBinding(DefaultFieldsMixin, Base): created_by: Mapped[str | None] = mapped_column(StringUUID, nullable=True) +class AgentSkillBindingSnapshot(DefaultFieldsMixin, Base): + """Published Agent-to-workspace-Skill bindings for one Agent snapshot.""" + + __tablename__ = "agent_skill_binding_snapshots" + __table_args__ = ( + sa.PrimaryKeyConstraint("id", name="agent_skill_binding_snapshot_pkey"), + UniqueConstraint( + "tenant_id", + "agent_id", + "config_snapshot_id", + "skill_id", + name="agent_skill_binding_snapshot_skill_unique", + ), + UniqueConstraint( + "tenant_id", + "agent_id", + "config_snapshot_id", + "priority", + name="agent_skill_binding_snapshot_priority_unique", + ), + Index("agent_skill_binding_snapshots_agent_snapshot_idx", "tenant_id", "agent_id", "config_snapshot_id"), + ) + + tenant_id: Mapped[str] = mapped_column(StringUUID, nullable=False) + agent_id: Mapped[str] = mapped_column(StringUUID, nullable=False) + config_snapshot_id: Mapped[str] = mapped_column(StringUUID, nullable=False) + skill_id: Mapped[str] = mapped_column(StringUUID, nullable=False) + priority: Mapped[int] = mapped_column(sa.Integer, nullable=False) + created_by: Mapped[str | None] = mapped_column(StringUUID, nullable=True) + + __all__ = [ "AgentSkillBinding", + "AgentSkillBindingSnapshot", "Skill", "SkillDraftFile", "SkillFileKind", diff --git a/api/openapi/markdown/console-openapi.md b/api/openapi/markdown/console-openapi.md index 4fef7e87c9e..c143fd19243 100644 --- a/api/openapi/markdown/console-openapi.md +++ b/api/openapi/markdown/console-openapi.md @@ -146,9 +146,9 @@ Deprecated. Use PATCH /account/profile instead. #### Responses -| Code | Description | -| ---- | ----------- | -| 200 | Success | +| Code | Description | Schema | +| ---- | ----------- | ------ | +| 200 | Success | **application/json**: [EducationActivateResponse](#educationactivateresponse)
| ### [GET] /account/education/autocomplete #### Parameters @@ -9529,9 +9529,9 @@ Returns the site configuration for the application including theme, icons, and t | 200 | Success | **application/json**: [SimpleResultResponse](#simpleresultresponse)
| ### [GET] /trial-models -**Get hosted trial model provider configuration for model-provider pages** +**Get hosted credit provider configuration for the current workspace** -Get hosted trial model provider configuration +Get hosted credit model provider configuration for the current workspace #### Responses @@ -17706,6 +17706,12 @@ Portable DSL reference that could not be restored in the target workspace. | role | string | | Yes | | token | string | | Yes | +#### EducationActivateResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| message | string | | Yes | + #### EducationAutocompleteQuery | Name | Type | Description | Required | @@ -22079,19 +22085,6 @@ How a draft file's content is stored. | page | integer,
**Default:** 1 | | No | | total | integer | | No | -#### SkillManifest - -Validated metadata extracted from a Skill package. - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| description | string | | Yes | -| entry_path | string | | Yes | -| files | [ string ] | | Yes | -| hash | string | | Yes | -| name | string | | Yes | -| size | integer | | Yes | - #### SkillMetadataPayload | Name | Type | Description | Required | @@ -22179,14 +22172,6 @@ Validated metadata extracted from a Skill package. | count | integer | | Yes | | tag | string | | Yes | -#### SkillToolInferenceResult - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| cli_tools | [ [CliToolSuggestion](#clitoolsuggestion) ] | | No | -| inferable | boolean | | Yes | -| reason | string | | No | - #### SkillVersionDeleteResponse | Name | Type | Description | Required | diff --git a/api/services/account_service.py b/api/services/account_service.py index 54a03c6fb4f..b022187e14d 100644 --- a/api/services/account_service.py +++ b/api/services/account_service.py @@ -1518,9 +1518,7 @@ class TenantService: return updated_accounts @staticmethod - def iter_member_account_id_batches( - tenant_id: str, batch_size: int, *, session: Session - ) -> Iterator[list[str]]: + def iter_member_account_id_batches(tenant_id: str, batch_size: int, *, session: Session) -> Iterator[list[str]]: """Yield workspace member account ids in bounded, ordered batches.""" offset = 0 while True: diff --git a/api/services/agent_config_service.py b/api/services/agent_config_service.py index df6761e571f..e4bfe2a0b9e 100644 --- a/api/services/agent_config_service.py +++ b/api/services/agent_config_service.py @@ -37,7 +37,6 @@ from core.db.session_factory import session_factory as default_session_factory from core.tools.signature import bind_file_uri, sign_tool_file_uri from core.tools.tool_file_manager import ToolFileManager from extensions.ext_storage import storage -from factories import file_factory from models.agent import Agent, AgentConfigDraft, AgentConfigDraftType, AgentConfigSnapshot from models.agent_config_entities import ( AgentConfigFileRefConfig, @@ -283,6 +282,7 @@ class AgentConfigService: for item in SkillManagementService().list_runtime_agent_skills( tenant_id=tenant_id, agent_id=agent_id, + include_draft=config_version_kind != AgentConfigVersionKind.SNAPSHOT, ) if item["name"] == name ), @@ -311,45 +311,6 @@ class AgentConfigService: missing_message="config file payload is missing", ) - def pull_skill( - self, - *, - tenant_id: str, - agent_id: str, - config_version_id: str, - config_version_kind: AgentConfigVersionKind, - name: str, - user_id: str | None = None, - ) -> ConfigDownload: - target = self.resolve_target( - tenant_id=tenant_id, - agent_id=agent_id, - config_version_id=config_version_id, - config_version_kind=config_version_kind, - user_id=user_id, - ) - try: - skill = self._require_skill(target.agent_soul, name=name) - file_id = self._available_skill_file_id(skill) - payload, mime_type = self._load_tool_file_bytes(tenant_id=tenant_id, file_id=file_id) - return ConfigDownload( - filename=f"{skill.name}.zip", - mime_type=mime_type or "application/zip", - payload=payload, - ) - except AgentConfigServiceError as exc: - if exc.code != "config_skill_not_found": - raise - try: - result = SkillManagementService().pull_runtime_agent_skill( - tenant_id=tenant_id, - agent_id=agent_id, - name=name, - ) - return ConfigDownload(filename=result.filename, mime_type=result.mime_type, payload=result.payload) - except SkillManagementServiceError as exc: - raise AgentConfigServiceError("config_skill_not_found", "config skill not found", status_code=404) from exc - def download_skill_url( self, *, @@ -401,6 +362,7 @@ class AgentConfigService: tenant_id=tenant_id, agent_id=agent_id, name=name, + include_draft=config_version_kind != AgentConfigVersionKind.SNAPSHOT, ) except SkillManagementServiceError as skill_exc: raise AgentConfigServiceError( @@ -1300,6 +1262,7 @@ class AgentConfigService: for item in SkillManagementService().list_runtime_agent_skills( tenant_id=target.tenant_id, agent_id=target.agent_id, + include_draft=target.kind != AgentConfigVersionKind.SNAPSHOT, ): if item["name"] in seen_names: continue @@ -1577,36 +1540,6 @@ class AgentConfigService: return ConfigDownloadRequest(filename=filename, mime_type=mime_type, size=size, download_uri=uri) - @staticmethod - def _resolve_download_url( - *, tenant_id: str, file_kind: Literal["upload_file", "tool_file"], file_id: str - ) -> str | None: - controller = DatabaseFileAccessController() - from core.app.workflow.file_runtime import DifyWorkflowFileRuntime - - runtime = DifyWorkflowFileRuntime(file_access_controller=controller) - try: - if file_kind == "upload_file": - return runtime.resolve_upload_file_url( - upload_file_id=file_id, - for_external=True, - as_attachment=True, - ) - file = file_factory.build_from_mapping( - mapping={"transfer_method": "tool_file", "tool_file_id": file_id}, - tenant_id=tenant_id, - access_controller=controller, - ) - url = runtime.resolve_file_url(file=file, for_external=True) - if not url: - return None - parsed = urllib.parse.urlsplit(url) - query = urllib.parse.parse_qsl(parsed.query, keep_blank_values=True) - query.append(("as_attachment", "true")) - return urllib.parse.urlunsplit(parsed._replace(query=urllib.parse.urlencode(query))) - except ValueError: - return None - __all__ = [ "AgentConfigMutationSurface", diff --git a/api/services/skill_management_service.py b/api/services/skill_management_service.py index f8eedfd8083..92d3de2f2ea 100644 --- a/api/services/skill_management_service.py +++ b/api/services/skill_management_service.py @@ -18,9 +18,11 @@ import logging import mimetypes import posixpath import re +import xml.etree.ElementTree as ET import zipfile from base64 import b64encode from collections.abc import Generator +from contextlib import contextmanager from dataclasses import dataclass from datetime import datetime from enum import StrEnum @@ -28,11 +30,12 @@ from typing import Any, Literal from uuid import uuid4 import json_repair +import pypdfium2 import yaml from pydantic import BaseModel, ConfigDict, Field, ValidationError, field_validator, model_validator from sqlalchemy import delete, func, select from sqlalchemy.exc import IntegrityError, SQLAlchemyError -from sqlalchemy.orm import object_session +from sqlalchemy.orm import Session, object_session from yaml.error import MarkedYAMLError from configs import dify_config @@ -77,6 +80,7 @@ from models.model import App, Tag, TagBinding from models.provider_ids import ModelProviderID from models.skill import ( AgentSkillBinding, + AgentSkillBindingSnapshot, Skill, SkillDraftFile, SkillFileKind, @@ -95,6 +99,7 @@ logger = logging.getLogger(__name__) _SKILL_MD = "SKILL.md" _MAX_SKILL_BYTES = 200 * 1024 * 1024 _MAX_FILES_PER_SKILL = 5000 +_MAX_ZIP_COMPRESSION_RATIO = 1000 _MAX_FILE_CHECK_ITEMS = 100 _MAX_SKILLS_PER_WORKSPACE = 500 _MAX_AGENT_SKILLS = 20 @@ -227,6 +232,7 @@ Skill content.""" _MAX_ASSISTANT_CONTEXT_CHARS = 60_000 _MAX_ASSISTANT_ATTACHMENTS = 10 _MAX_ASSISTANT_ATTACHMENT_CHARS = 20_000 +_MAX_ASSISTANT_PDF_PAGES = 100 _SKILL_ASSISTANT_ROLE = "__skill_authoring_assistant__" @@ -553,11 +559,33 @@ class SkillManagementService: does not create a published version. """ - def __init__(self, *, tool_file_manager: ToolFileManager | None = None) -> None: + def __init__( + self, + *, + tool_file_manager: ToolFileManager | None = None, + session: Session | None = None, + ) -> None: self._tool_files = tool_file_manager or ToolFileManager() + self._session = session + + @contextmanager + def _session_scope(self, session: Session | None = None) -> Generator[Session, None, None]: + """Reuse a caller-owned transaction when one is available. + + The fallback keeps direct service consumers working while callers are + migrated to the controller/session injection convention. + """ + if session is not None: + yield session + return + if self._session is not None: + yield self._session + return + with session_factory.create_session() as managed_session: + yield managed_session def create_skill(self, *, tenant_id: str, user_id: str, payload: SkillCreatePayload) -> dict[str, Any]: - with session_factory.create_session() as session: + with self._session_scope() as session: self._enforce_workspace_skill_limit(session, tenant_id=tenant_id) skill_name = payload.name or self._generate_untitled_skill_name(session, tenant_id=tenant_id) display_name = payload.display_name or (_UNTITLED_DISPLAY_NAME if payload.name is None else skill_name) @@ -654,7 +682,7 @@ class SkillManagementService: payload: SkillDraftFileCheckPayload, ) -> dict[str, Any]: """Validate candidate draft file uploads without persisting files.""" - with session_factory.create_session() as session: + with self._session_scope() as session: skill = self._require_skill(session, tenant_id=tenant_id, skill_id=skill_id) existing_files = list( session.scalars( @@ -688,7 +716,7 @@ class SkillManagementService: limit: int = 20, tags: list[str] | None = None, ) -> dict[str, Any]: - with session_factory.create_session() as session: + with self._session_scope() as session: stmt = select(Skill).where(Skill.tenant_id == tenant_id).order_by(Skill.updated_at.desc()) if keyword: like = f"%{keyword.strip()}%" @@ -751,7 +779,7 @@ class SkillManagementService: def list_tags(self, *, tenant_id: str) -> dict[str, Any]: """Return distinct Skill tags in a tenant with usage counts for filter controls.""" - with session_factory.create_session() as session: + with self._session_scope() as session: rows = session.execute( select(Tag.name, func.count(TagBinding.id).label("binding_count")) .outerjoin( @@ -768,7 +796,7 @@ class SkillManagementService: return {"data": [{"tag": tag, "count": count} for tag, count in rows]} def get_skill(self, *, tenant_id: str, skill_id: str) -> dict[str, Any]: - with session_factory.create_session() as session: + with self._session_scope() as session: skill = self._require_skill(session, tenant_id=tenant_id, skill_id=skill_id) files = list( session.scalars( @@ -806,7 +834,7 @@ class SkillManagementService: material and never persists its response. Callers remain responsible for applying any suggested content through the draft file APIs. """ - with session_factory.create_session() as session: + with self._session_scope() as session: skill = self._require_skill(session, tenant_id=tenant_id, skill_id=skill_id) files = list( session.scalars( @@ -845,7 +873,9 @@ class SkillManagementService: content=f"\n{context}\n\n\nUser request:\n{message}" ), ], - model_parameters={"temperature": 0.2}, + # Keep the fallback within the minimum accepted range of + # providers that enforce a non-zero temperature floor. + model_parameters={"temperature": 0.7}, stream=True, ) for chunk in response: @@ -1005,7 +1035,7 @@ class SkillManagementService: model_payload: SkillAssistModelPayload | None, target_path: str | None, ) -> Generator[str, None, SkillAssistActionResult]: - with session_factory.create_session() as session: + with self._session_scope() as session: skill = self._require_skill(session, tenant_id=tenant_id, skill_id=skill_id) files = list( session.scalars( @@ -1388,7 +1418,7 @@ class SkillManagementService: "the workspace has no default reasoning model configured", status_code=400, ) from exc - return model_instance, {"temperature": 0.2} + return model_instance, {"temperature": 0.7} try: model_instance = model_manager.get_model_instance( @@ -1403,7 +1433,7 @@ class SkillManagementService: str(exc), status_code=400, ) from exc - model_parameters = {"temperature": 0.2, **(model_payload.model_settings or {})} + model_parameters = {"temperature": 0.7, **(model_payload.model_settings or {})} return model_instance, model_parameters @staticmethod @@ -1479,7 +1509,7 @@ class SkillManagementService: query inlines bounded text attachments and leaves binary files as metadata so the runtime does not need direct storage access. """ - with session_factory.create_session() as session: + with self._session_scope() as session: skill = self._require_skill(session, tenant_id=tenant_id, skill_id=skill_id) files = list( session.scalars( @@ -1650,7 +1680,7 @@ class SkillManagementService: skill_id: str, payload: SkillMetadataPayload, ) -> dict[str, Any]: - with session_factory.create_session() as session: + with self._session_scope() as session: skill = self._require_skill(session, tenant_id=tenant_id, skill_id=skill_id) self._check_expected_updated_at(skill, payload.expected_updated_at) if payload.display_name is not None: @@ -1683,7 +1713,7 @@ class SkillManagementService: skill_id: str, payload: SkillDraftTreePayload, ) -> dict[str, Any]: - with session_factory.create_session() as session: + with self._session_scope() as session: skill = self._require_skill(session, tenant_id=tenant_id, skill_id=skill_id) self._check_expected_updated_at(skill, payload.expected_updated_at) files = self._build_draft_rows_from_tree(skill=skill, payload=payload, strict_frontmatter=False) @@ -1717,7 +1747,7 @@ class SkillManagementService: payload: SkillDraftFileOperationPayload, ) -> dict[str, Any]: """Apply one draft file operation while preserving full-tree validation invariants.""" - with session_factory.create_session() as session: + with self._session_scope() as session: skill = self._require_skill(session, tenant_id=tenant_id, skill_id=skill_id) existing_files = list( session.scalars( @@ -1792,7 +1822,7 @@ class SkillManagementService: skill_id: str, payload: SkillPublishPayload, ) -> dict[str, Any]: - with session_factory.create_session() as session: + with self._session_scope() as session: skill = self._require_skill(session, tenant_id=tenant_id, skill_id=skill_id) draft_files = list(session.scalars(select(SkillDraftFile).where(SkillDraftFile.skill_id == skill.id))) skill_md = next((file for file in draft_files if file.path == _SKILL_MD), None) @@ -1829,7 +1859,7 @@ class SkillManagementService: mimetype="application/zip", filename=f"{skill_name}.zip", ) - with session_factory.create_session() as session: + with self._session_scope() as session: skill = self._require_skill(session, tenant_id=tenant_id, skill_id=skill_id) skill.name = skill_name skill.display_name = skill_display_name @@ -1855,7 +1885,7 @@ class SkillManagementService: return self._serialize_version(version, latest_version_id=skill.latest_published_version_id) def list_versions(self, *, tenant_id: str, skill_id: str) -> dict[str, Any]: - with session_factory.create_session() as session: + with self._session_scope() as session: skill = self._require_skill(session, tenant_id=tenant_id, skill_id=skill_id) versions = list( session.scalars( @@ -1880,7 +1910,7 @@ class SkillManagementService: } def get_version(self, *, tenant_id: str, skill_id: str, version_id: str) -> dict[str, Any]: - with session_factory.create_session() as session: + with self._session_scope() as session: skill = self._require_skill(session, tenant_id=tenant_id, skill_id=skill_id) version = self._require_version(session, skill_id=skill.id, version_id=version_id) version_payload = self._serialize_version( @@ -1929,14 +1959,14 @@ class SkillManagementService: """Resolve one draft or versioned Skill file as bytes for preview/download.""" normalized_path = normalize_skill_file_path(path) if version_id: - with session_factory.create_session() as session: + with self._session_scope() as session: skill = self._require_skill(session, tenant_id=tenant_id, skill_id=skill_id) version = self._require_version(session, skill_id=skill.id, version_id=version_id) archive_tool_file_id = version.archive_tool_file_id archive_bytes = self._load_tool_file_bytes(tenant_id=tenant_id, file_id=archive_tool_file_id) return self._file_content_from_archive_bytes(archive_bytes, path=normalized_path) - with session_factory.create_session() as session: + with self._session_scope() as session: skill = self._require_skill(session, tenant_id=tenant_id, skill_id=skill_id) file = session.scalar( select(SkillDraftFile).where( @@ -1975,7 +2005,7 @@ class SkillManagementService: version_id: str, payload: SkillVersionUpdatePayload, ) -> dict[str, Any]: - with session_factory.create_session() as session: + with self._session_scope() as session: skill = self._require_skill(session, tenant_id=tenant_id, skill_id=skill_id) version = self._require_version(session, skill_id=skill.id, version_id=version_id) version.version_name = self._version_name_from_payload(payload.version_name) @@ -1992,7 +2022,7 @@ class SkillManagementService: ) def delete_version(self, *, tenant_id: str, user_id: str, skill_id: str, version_id: str) -> dict[str, Any]: - with session_factory.create_session() as session: + with self._session_scope() as session: skill = self._require_skill(session, tenant_id=tenant_id, skill_id=skill_id) version = self._require_version(session, skill_id=skill.id, version_id=version_id) was_latest = skill.latest_published_version_id == version.id @@ -2019,7 +2049,7 @@ class SkillManagementService: def duplicate_skill(self, *, tenant_id: str, user_id: str, skill_id: str) -> dict[str, Any]: """Create a draft-only copy, preferring the latest published snapshot when present.""" - with session_factory.create_session() as session: + with self._session_scope() as session: source = self._require_skill(session, tenant_id=tenant_id, skill_id=skill_id) self._enforce_workspace_skill_limit(session, tenant_id=tenant_id) new_name = self._next_copy_name(session, tenant_id=tenant_id, source_name=source.name) @@ -2052,18 +2082,34 @@ class SkillManagementService: if latest_version_id is not None: archive = self._load_version_archive(tenant_id=tenant_id, version_id=latest_version_id) - with session_factory.create_session() as session: + with self._session_scope() as session: duplicate = self._require_skill(session, tenant_id=tenant_id, skill_id=duplicate_id) + duplicate_identity = ( + duplicate.name, + duplicate.display_name, + duplicate.description, + duplicate.name_manually_edited, + ) files = self._draft_rows_from_archive_bytes( tenant_id=tenant_id, user_id=user_id, skill=duplicate, archive_bytes=archive, ) + # Parsing the published SKILL.md synchronizes metadata onto the + # supplied ORM object. A duplicate must retain its new identity, + # otherwise the reused request session autoflushes the source + # name and violates the tenant/name unique constraint. + ( + duplicate.name, + duplicate.display_name, + duplicate.description, + duplicate.name_manually_edited, + ) = duplicate_identity else: files = copied_draft_files - with session_factory.create_session() as session: + with self._session_scope() as session: duplicate = self._require_skill(session, tenant_id=tenant_id, skill_id=duplicate_id) if latest_version_id is not None: for file in files: @@ -2104,7 +2150,7 @@ class SkillManagementService: name = validate_skill_name(str(metadata.get("name") or "")) description = self._require_frontmatter_description(metadata, content=skill_md_content) display_name = self._display_name_from_frontmatter(metadata=metadata, name=name) - with session_factory.create_session() as session: + with self._session_scope() as session: self._enforce_workspace_skill_limit(session, tenant_id=tenant_id) skill = Skill( tenant_id=tenant_id, @@ -2133,7 +2179,7 @@ class SkillManagementService: } def delete_skill(self, *, tenant_id: str, skill_id: str, confirmation_name: str | None = None) -> dict[str, Any]: - with session_factory.create_session() as session: + with self._session_scope() as session: skill = self._require_skill(session, tenant_id=tenant_id, skill_id=skill_id) reference_count = self._reference_counts(session, tenant_id=tenant_id, skill_ids=[skill.id]).get( skill.id, 0 @@ -2167,13 +2213,13 @@ class SkillManagementService: skill_id: str, payload: SkillRestorePayload, ) -> dict[str, Any]: - with session_factory.create_session() as session: + with self._session_scope() as session: skill = self._require_skill(session, tenant_id=tenant_id, skill_id=skill_id) version = self._require_version(session, skill_id=skill.id, version_id=payload.version_id) archive_file_id = version.archive_tool_file_id archive_bytes = self._load_tool_file_bytes(tenant_id=tenant_id, file_id=archive_file_id) - with session_factory.create_session() as session: + with self._session_scope() as session: skill = self._require_skill(session, tenant_id=tenant_id, skill_id=skill_id) draft_files = self._draft_rows_from_archive_bytes( tenant_id=tenant_id, @@ -2194,7 +2240,7 @@ class SkillManagementService: return self.get_skill(tenant_id=tenant_id, skill_id=skill_id) def pull_published_archive(self, *, tenant_id: str, skill_id: str) -> PublishedSkillArchive: - with session_factory.create_session() as session: + with self._session_scope() as session: skill = self._require_skill(session, tenant_id=tenant_id, skill_id=skill_id) if skill.latest_published_version_id is None: raise SkillManagementServiceError("skill_not_published", "skill is not published", status_code=404) @@ -2213,19 +2259,31 @@ class SkillManagementService: payload=self._load_tool_file_bytes(tenant_id=tenant_id, file_id=tool_file_id), ) - def list_runtime_agent_skills(self, *, tenant_id: str, agent_id: str) -> list[dict[str, Any]]: - """Return bound published workspace Skills for Agent runtime selection.""" - with session_factory.create_session() as session: + def list_runtime_agent_skills( + self, + *, + tenant_id: str, + agent_id: str, + include_draft: bool = False, + ) -> list[dict[str, Any]]: + """Return workspace Skills from the Agent draft or active published snapshot.""" + with self._session_scope() as session: + binding_model = AgentSkillBinding if include_draft else AgentSkillBindingSnapshot + conditions = [ + binding_model.tenant_id == tenant_id, + binding_model.agent_id == agent_id, + Skill.tenant_id == tenant_id, + Agent.tenant_id == tenant_id, + ] + if not include_draft: + conditions.append(AgentSkillBindingSnapshot.config_snapshot_id == Agent.active_config_snapshot_id) rows = list( session.execute( - select(AgentSkillBinding, Skill, SkillVersion) - .join(Skill, Skill.id == AgentSkillBinding.skill_id) + select(binding_model, Skill, SkillVersion) + .join(Skill, Skill.id == binding_model.skill_id) .join(SkillVersion, SkillVersion.id == Skill.latest_published_version_id) - .where( - AgentSkillBinding.tenant_id == tenant_id, - AgentSkillBinding.agent_id == agent_id, - Skill.tenant_id == tenant_id, - ) + .join(Agent, Agent.id == binding_model.agent_id) + .where(*conditions) .order_by(Skill.name) ) ) @@ -2245,19 +2303,32 @@ class SkillManagementService: ] ] - def pull_runtime_agent_skill(self, *, tenant_id: str, agent_id: str, name: str) -> PublishedSkillArchive: + def pull_runtime_agent_skill( + self, + *, + tenant_id: str, + agent_id: str, + name: str, + include_draft: bool = False, + ) -> PublishedSkillArchive: """Pull one bound published workspace Skill by Skill name.""" normalized_name = validate_skill_name(name) - with session_factory.create_session() as session: + with self._session_scope() as session: + binding_model = AgentSkillBinding if include_draft else AgentSkillBindingSnapshot + conditions = [ + binding_model.tenant_id == tenant_id, + binding_model.agent_id == agent_id, + Skill.tenant_id == tenant_id, + Agent.tenant_id == tenant_id, + ] + if not include_draft: + conditions.append(AgentSkillBindingSnapshot.config_snapshot_id == Agent.active_config_snapshot_id) rows = session.execute( select(Skill, SkillVersion) - .join(AgentSkillBinding, AgentSkillBinding.skill_id == Skill.id) + .join(binding_model, binding_model.skill_id == Skill.id) .join(SkillVersion, SkillVersion.id == Skill.latest_published_version_id) - .where( - AgentSkillBinding.tenant_id == tenant_id, - AgentSkillBinding.agent_id == agent_id, - Skill.tenant_id == tenant_id, - ) + .join(Agent, Agent.id == binding_model.agent_id) + .where(*conditions) ) row = next( ( @@ -2302,6 +2373,7 @@ class SkillManagementService: file_id=version.archive_tool_file_id, ) with zipfile.ZipFile(io.BytesIO(archive_bytes)) as archive: + cls._validate_archive_limits(archive) content = archive.read(_SKILL_MD).decode("utf-8") frontmatter = cls._parse_frontmatter(content) except (OSError, UnicodeDecodeError, ValueError, KeyError, zipfile.BadZipFile, SkillManagementServiceError): @@ -2311,8 +2383,10 @@ class SkillManagementService: description = frontmatter.get("description") if not isinstance(name, str) or not name: return skill.name, skill.display_name, skill.description - return name, cls._display_name_from_frontmatter(metadata=frontmatter, name=name), ( - description if isinstance(description, str) else "" + return ( + name, + cls._display_name_from_frontmatter(metadata=frontmatter, name=name), + (description if isinstance(description, str) else ""), ) @classmethod @@ -2327,6 +2401,7 @@ class SkillManagementService: """Keep the runtime archive metadata aligned with its published manifest.""" try: with zipfile.ZipFile(io.BytesIO(archive_bytes)) as archive: + cls._validate_archive_limits(archive) skill_md = archive.read(_SKILL_MD).decode("utf-8") frontmatter_match = _FRONTMATTER_RE.match(skill_md) if frontmatter_match is None: @@ -2335,11 +2410,7 @@ class SkillManagementService: current_name = frontmatter.get("name") current_description = frontmatter.get("description") current_display_name = cls._display_name_from_frontmatter(metadata=frontmatter, name=str(current_name)) - if ( - current_name == name - and current_description == description - and current_display_name == display_name - ): + if current_name == name and current_description == description and current_display_name == display_name: return archive_bytes metadata = frontmatter.get("metadata") @@ -2359,9 +2430,7 @@ class SkillManagementService: with zipfile.ZipFile(output, "w", compression=zipfile.ZIP_DEFLATED) as normalized_archive: for info in archive.infolist(): payload = ( - normalized_skill_md.encode("utf-8") - if info.filename == _SKILL_MD - else archive.read(info) + normalized_skill_md.encode("utf-8") if info.filename == _SKILL_MD else archive.read(info) ) normalized_archive.writestr(info.filename, payload) return output.getvalue() @@ -2380,7 +2449,7 @@ class SkillManagementService: raise SkillManagementServiceError("too_many_agent_skills", "agent skill binding limit exceeded") if len(set(skill_ids)) != len(skill_ids): raise SkillManagementServiceError("duplicate_skill_binding", "skill binding list contains duplicates") - with session_factory.create_session() as session: + with self._session_scope() as session: agent = session.scalar(select(Agent).where(Agent.id == agent_id, Agent.tenant_id == tenant_id)) if agent is None: raise SkillManagementServiceError("agent_not_found", "agent not found", status_code=404) @@ -2414,9 +2483,135 @@ class SkillManagementService: created_by=user_id, ) ) - session.commit() + agent.active_config_is_published = False + agent.updated_by = user_id + if self._session is None: + session.commit() + else: + session.flush() return {"agent_id": agent_id, "skill_ids": skill_ids} + def publish_agent_bindings(self, *, tenant_id: str, agent_id: str, snapshot_id: str, user_id: str) -> None: + """Persist the current draft bindings for an immutable Agent snapshot.""" + with self._session_scope() as session: + draft_bindings = list( + session.scalars( + select(AgentSkillBinding) + .where( + AgentSkillBinding.tenant_id == tenant_id, + AgentSkillBinding.agent_id == agent_id, + ) + .order_by(AgentSkillBinding.priority, AgentSkillBinding.created_at, AgentSkillBinding.id) + ) + ) + session.query(AgentSkillBindingSnapshot).filter( + AgentSkillBindingSnapshot.tenant_id == tenant_id, + AgentSkillBindingSnapshot.agent_id == agent_id, + AgentSkillBindingSnapshot.config_snapshot_id == snapshot_id, + ).delete(synchronize_session=False) + for binding in draft_bindings: + session.add( + AgentSkillBindingSnapshot( + tenant_id=tenant_id, + agent_id=agent_id, + config_snapshot_id=snapshot_id, + skill_id=binding.skill_id, + priority=binding.priority, + created_by=user_id, + ) + ) + if self._session is None: + session.commit() + else: + session.flush() + + def copy_agent_bindings( + self, + *, + tenant_id: str, + source_agent_id: str, + source_snapshot_id: str, + target_agent_id: str, + user_id: str, + target_snapshot_id: str | None = None, + source_include_draft: bool = False, + ) -> None: + """Copy an Agent binding set into another Agent's draft and optional snapshot.""" + with self._session_scope() as session: + if source_include_draft: + source_bindings = list( + session.scalars( + select(AgentSkillBinding) + .where( + AgentSkillBinding.tenant_id == tenant_id, + AgentSkillBinding.agent_id == source_agent_id, + ) + .order_by(AgentSkillBinding.priority, AgentSkillBinding.created_at) + ) + ) + else: + source_bindings = list( + session.scalars( + select(AgentSkillBindingSnapshot) + .where( + AgentSkillBindingSnapshot.tenant_id == tenant_id, + AgentSkillBindingSnapshot.agent_id == source_agent_id, + AgentSkillBindingSnapshot.config_snapshot_id == source_snapshot_id, + ) + .order_by(AgentSkillBindingSnapshot.priority, AgentSkillBindingSnapshot.created_at) + ) + ) + # Older installations may have published Agents without the + # binding snapshot table populated yet. Preserve their current + # binding set until the migration/backfill has run. + if not source_bindings: + source_bindings = list( + session.scalars( + select(AgentSkillBinding) + .where( + AgentSkillBinding.tenant_id == tenant_id, + AgentSkillBinding.agent_id == source_agent_id, + ) + .order_by(AgentSkillBinding.priority, AgentSkillBinding.created_at) + ) + ) + session.query(AgentSkillBinding).filter( + AgentSkillBinding.tenant_id == tenant_id, + AgentSkillBinding.agent_id == target_agent_id, + ).delete(synchronize_session=False) + if target_snapshot_id is not None: + session.query(AgentSkillBindingSnapshot).filter( + AgentSkillBindingSnapshot.tenant_id == tenant_id, + AgentSkillBindingSnapshot.agent_id == target_agent_id, + AgentSkillBindingSnapshot.config_snapshot_id == target_snapshot_id, + ).delete(synchronize_session=False) + + for priority, binding in enumerate(source_bindings): + session.add( + AgentSkillBinding( + tenant_id=tenant_id, + agent_id=target_agent_id, + skill_id=binding.skill_id, + priority=priority, + created_by=user_id, + ) + ) + if target_snapshot_id is not None: + session.add( + AgentSkillBindingSnapshot( + tenant_id=tenant_id, + agent_id=target_agent_id, + config_snapshot_id=target_snapshot_id, + skill_id=binding.skill_id, + priority=priority, + created_by=user_id, + ) + ) + if self._session is None: + session.commit() + else: + session.flush() + @staticmethod def _check_agent_skill_name_conflicts( session, @@ -2483,7 +2678,7 @@ class SkillManagementService: tenant_id: str, agent_id: str, ) -> dict[str, Any]: - with session_factory.create_session() as session: + with self._session_scope() as session: rows = list( session.execute( select(AgentSkillBinding, Skill, SkillVersion) @@ -2517,7 +2712,7 @@ class SkillManagementService: def list_skill_references(self, *, tenant_id: str, skill_id: str) -> dict[str, Any]: """Return direct Skill consumers for the editor Referenced by panel.""" - with session_factory.create_session() as session: + with self._session_scope() as session: skill = self._require_skill(session, tenant_id=tenant_id, skill_id=skill_id) binding_rows = list( session.execute( @@ -3062,7 +3257,22 @@ class SkillManagementService: tenant_id=tenant_id, file_id=attachment.tool_file_id, ) - if not SkillManagementService._is_text_payload(filename=attachment.name, mime_type=mime_type): + if SkillManagementService._is_pdf_payload(filename=attachment.name, mime_type=mime_type): + available_content = remaining - len(header) + body = SkillManagementService._extract_pdf_text(payload, max_chars=available_content) + if not body: + body = "[PDF has no extractable text; image-only content is not processed.]" + elif SkillManagementService._is_office_text_payload(filename=attachment.name, mime_type=mime_type): + available_content = remaining - len(header) + body = SkillManagementService._extract_office_text( + filename=attachment.name, + mime_type=mime_type, + payload=payload, + max_chars=available_content, + ) + if not body: + body = "[Document has no extractable text.]" + elif not SkillManagementService._is_text_payload(filename=attachment.name, mime_type=mime_type): body = ( "[Image attachment is provided separately as multimodal content.]" if vision_enabled and mime_type.startswith("image/") @@ -3555,14 +3765,15 @@ class SkillManagementService: ) -> tuple[SkillDraftTreePayload, dict[str, Any], str]: try: with zipfile.ZipFile(io.BytesIO(archive_bytes)) as archive: - raw_paths = [normalize_skill_file_path(info.filename.strip("/")) for info in archive.infolist()] + infos = self._validate_archive_limits(archive) + raw_paths = [normalize_skill_file_path(info.filename.strip("/")) for info in infos] path_map = self._strip_single_root(raw_paths) if _SKILL_MD not in set(path_map.values()): raise SkillManagementServiceError("missing_skill_md", "Skill package must contain SKILL.md") items: list[SkillDraftTreeItemPayload] = [] metadata: dict[str, Any] = {} skill_md_content = "" - for info in archive.infolist(): + for info in infos: raw_path = normalize_skill_file_path(info.filename.strip("/")) path = normalize_skill_file_path(path_map[raw_path]) if info.is_dir(): @@ -3610,8 +3821,9 @@ class SkillManagementService: def _version_files_from_archive_bytes(self, archive_bytes: bytes) -> list[dict[str, Any]]: try: with zipfile.ZipFile(io.BytesIO(archive_bytes)) as archive: + infos = self._validate_archive_limits(archive) files: list[dict[str, Any]] = [] - for info in sorted(archive.infolist(), key=lambda item: item.filename): + for info in sorted(infos, key=lambda item: item.filename): if info.is_dir(): continue path = normalize_skill_file_path(info.filename.strip("/")) @@ -3640,7 +3852,8 @@ class SkillManagementService: def _file_content_from_archive_bytes(self, archive_bytes: bytes, *, path: str) -> SkillFileContent: try: with zipfile.ZipFile(io.BytesIO(archive_bytes)) as archive: - for info in archive.infolist(): + infos = self._validate_archive_limits(archive) + for info in infos: if info.is_dir(): continue archive_path = normalize_skill_file_path(info.filename.strip("/")) @@ -3661,6 +3874,31 @@ class SkillManagementService: raise SkillManagementServiceError("invalid_skill_package", "skill package must be a valid zip") from exc raise SkillManagementServiceError("skill_file_not_found", "skill file was not found", status_code=404) + @staticmethod + def _validate_archive_limits(archive: zipfile.ZipFile) -> list[zipfile.ZipInfo]: + """Validate ZIP metadata before any member is decompressed or persisted.""" + infos = archive.infolist() + if len(infos) > _MAX_FILES_PER_SKILL: + raise SkillManagementServiceError("too_many_files", "skill file count limit exceeded") + + total_uncompressed = 0 + for info in infos: + if info.file_size < 0 or info.compress_size < 0: + raise SkillManagementServiceError("invalid_skill_package", "skill package has invalid ZIP metadata") + + total_uncompressed += info.file_size + if total_uncompressed > _MAX_SKILL_BYTES: + raise SkillManagementServiceError("skill_too_large", "skill exceeds 200MB limit") + + if info.is_dir() or info.file_size == 0: + continue + if info.compress_size == 0 or info.file_size / info.compress_size > _MAX_ZIP_COMPRESSION_RATIO: + raise SkillManagementServiceError( + "invalid_skill_package", + "skill package compression ratio exceeds the allowed limit", + ) + return infos + def _draft_rows_from_archive_bytes( self, *, @@ -3779,7 +4017,7 @@ class SkillManagementService: return [item for item in items if item.path != path and not item.path.startswith(prefix)] def _load_version_archive(self, *, tenant_id: str, version_id: str) -> bytes: - with session_factory.create_session() as session: + with self._session_scope() as session: version = session.get(SkillVersion, version_id) if version is None: raise SkillManagementServiceError("skill_version_not_found", "skill version not found", status_code=404) @@ -4192,6 +4430,249 @@ class SkillManagementService: ) ) + @staticmethod + def _is_pdf_payload(*, filename: str, mime_type: str) -> bool: + return mime_type == "application/pdf" or filename.lower().endswith(".pdf") + + @staticmethod + def _is_office_text_payload(*, filename: str, mime_type: str) -> bool: + lower_name = filename.lower() + return mime_type in { + "application/rtf", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "application/vnd.openxmlformats-officedocument.presentationml.presentation", + } or lower_name.endswith((".docx", ".xlsx", ".pptx", ".rtf")) + + @staticmethod + def _extract_pdf_text(payload: bytes, *, max_chars: int) -> str: + if max_chars <= 0: + return "" + + pages: list[str] = [] + extracted_chars = 0 + truncated = False + pdf_document = None + try: + pdf_document = pypdfium2.PdfDocument(io.BytesIO(payload), autoclose=True) + for page_number, page in enumerate(pdf_document): + if page_number >= _MAX_ASSISTANT_PDF_PAGES: + truncated = True + break + text_page = page.get_textpage() + try: + page_text = text_page.get_text_range() + finally: + text_page.close() + page.close() + if not page_text: + continue + + separator = "\n\n" if pages else "" + available = max_chars - extracted_chars - len(separator) + if available <= 0: + truncated = True + break + if len(page_text) > available: + pages.append(f"{separator}{page_text[:available]}") + truncated = True + break + pages.append(f"{separator}{page_text}") + extracted_chars += len(separator) + len(page_text) + except Exception: + return "" + finally: + if pdf_document is not None: + pdf_document.close() + + text = "".join(pages).strip() + if truncated and text: + text += "\n[TRUNCATED]" + return text + + @staticmethod + def _extract_office_text(*, filename: str, mime_type: str, payload: bytes, max_chars: int) -> str: + if max_chars <= 0: + return "" + + lower_name = filename.lower() + if mime_type == "application/rtf" or lower_name.endswith(".rtf"): + return SkillManagementService._extract_rtf_text(payload, max_chars=max_chars) + if ( + mime_type == "application/vnd.openxmlformats-officedocument.wordprocessingml.document" + or lower_name.endswith(".docx") + ): + return SkillManagementService._extract_docx_text(payload, max_chars=max_chars) + if mime_type == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" or lower_name.endswith( + ".xlsx" + ): + return SkillManagementService._extract_xlsx_text(payload, max_chars=max_chars) + if ( + mime_type == "application/vnd.openxmlformats-officedocument.presentationml.presentation" + or lower_name.endswith(".pptx") + ): + return SkillManagementService._extract_pptx_text(payload, max_chars=max_chars) + return "" + + @staticmethod + def _bounded_text(parts: list[str], *, max_chars: int) -> str: + text = "\n".join(part for part in parts if part).strip() + if len(text) > max_chars: + return f"{text[:max_chars]}\n[TRUNCATED]" + return text + + @staticmethod + def _xml_text_content(xml_payload: bytes, *, text_tags: set[str]) -> list[str]: + root = ET.fromstring(xml_payload) + return [(node.text or "") for node in root.iter() if node.text and node.tag.rsplit("}", 1)[-1] in text_tags] + + @staticmethod + def _extract_docx_text(payload: bytes, *, max_chars: int) -> str: + parts: list[str] = [] + try: + with zipfile.ZipFile(io.BytesIO(payload)) as archive: + for name in sorted(archive.namelist()): + if not ( + name == "word/document.xml" or name.startswith("word/header") or name.startswith("word/footer") + ): + continue + parts.extend(SkillManagementService._xml_text_content(archive.read(name), text_tags={"t"})) + if sum(len(part) for part in parts) >= max_chars: + break + except (ET.ParseError, OSError, zipfile.BadZipFile): + return "" + return SkillManagementService._bounded_text(parts, max_chars=max_chars) + + @staticmethod + def _extract_pptx_text(payload: bytes, *, max_chars: int) -> str: + parts: list[str] = [] + try: + with zipfile.ZipFile(io.BytesIO(payload)) as archive: + slide_names = sorted( + name for name in archive.namelist() if name.startswith("ppt/slides/slide") and name.endswith(".xml") + ) + for name in slide_names: + parts.extend(SkillManagementService._xml_text_content(archive.read(name), text_tags={"t"})) + if sum(len(part) for part in parts) >= max_chars: + break + except (ET.ParseError, OSError, zipfile.BadZipFile): + return "" + return SkillManagementService._bounded_text(parts, max_chars=max_chars) + + @staticmethod + def _extract_xlsx_text(payload: bytes, *, max_chars: int) -> str: + parts: list[str] = [] + try: + with zipfile.ZipFile(io.BytesIO(payload)) as archive: + shared_strings: list[str] = [] + if "xl/sharedStrings.xml" in archive.namelist(): + shared_strings = SkillManagementService._xml_text_content( + archive.read("xl/sharedStrings.xml"), + text_tags={"t"}, + ) + worksheet_names = sorted( + name + for name in archive.namelist() + if name.startswith("xl/worksheets/sheet") and name.endswith(".xml") + ) + for name in worksheet_names: + root = ET.fromstring(archive.read(name)) + for cell in root.iter(): + if cell.tag.rsplit("}", 1)[-1] != "c": + continue + cell_type = cell.attrib.get("t") + values = [ + child.text or "" + for child in cell.iter() + if child.text and child.tag.rsplit("}", 1)[-1] in {"t", "v"} + ] + if not values: + continue + if cell_type == "s": + try: + parts.append(shared_strings[int(values[0])]) + except (IndexError, ValueError): + continue + else: + parts.append(" ".join(values)) + if sum(len(part) for part in parts) >= max_chars: + break + if sum(len(part) for part in parts) >= max_chars: + break + except (ET.ParseError, OSError, zipfile.BadZipFile): + return "" + return SkillManagementService._bounded_text(parts, max_chars=max_chars) + + @staticmethod + def _extract_rtf_text(payload: bytes, *, max_chars: int) -> str: + try: + source = payload.decode("utf-8") + except UnicodeDecodeError: + source = payload.decode("latin-1", errors="replace") + + text_parts: list[str] = [] + destination_skip_depth: int | None = None + depth = 0 + index = 0 + while index < len(source): + char = source[index] + if char == "{": + depth += 1 + index += 1 + if source[index : index + 1] == "\\" and source[index + 1 : index + 2] == "*": + destination_skip_depth = depth + continue + if char == "}": + if destination_skip_depth is not None and depth <= destination_skip_depth: + destination_skip_depth = None + depth = max(0, depth - 1) + index += 1 + continue + if destination_skip_depth is not None: + index += 1 + continue + if char != "\\": + text_parts.append("\n" if char in "\r\n" else char) + index += 1 + continue + + match = re.match(r"\\([a-zA-Z]+)(-?\d+)? ?", source[index:]) + if match: + word = match.group(1) + value = match.group(2) + if word in {"par", "line"}: + text_parts.append("\n") + elif word == "tab": + text_parts.append("\t") + elif word == "u" and value is not None: + codepoint = int(value) + if codepoint < 0: + codepoint += 65536 + text_parts.append(chr(codepoint)) + index += len(match.group(0)) + if word == "u" and source[index : index + 2].startswith("\\'"): + index += 4 + elif word == "u" and index < len(source): + index += 1 + continue + + if source[index : index + 2] == "\\'": + try: + text_parts.append(bytes.fromhex(source[index + 2 : index + 4]).decode("latin-1")) + except ValueError: + pass + index += 4 + continue + if index + 1 < len(source): + text_parts.append(source[index + 1]) + index += 2 + + text = re.sub(r"[ \t]+\n", "\n", "".join(text_parts)) + text = re.sub(r"\n{3,}", "\n\n", text).strip() + if len(text) > max_chars: + return f"{text[:max_chars]}\n[TRUNCATED]" + return text + @staticmethod def _model_supports_vision(model_instance: Any) -> bool: try: diff --git a/api/services/tag_service.py b/api/services/tag_service.py index 8ec560ed449..f2e819175ac 100644 --- a/api/services/tag_service.py +++ b/api/services/tag_service.py @@ -3,10 +3,11 @@ from typing import cast import sqlalchemy as sa from flask_login import current_user +from flask_sqlalchemy.session import Session as FlaskSession from pydantic import BaseModel, Field from sqlalchemy import delete, func, select from sqlalchemy.engine import CursorResult -from sqlalchemy.orm import Session +from sqlalchemy.orm import Session, scoped_session from werkzeug.exceptions import NotFound from models.dataset import Dataset @@ -40,6 +41,11 @@ class TagBindingDeletePayload(BaseModel): class TagService: + @staticmethod + def get_tag_type(tag_id: str, tenant_id: str, session: Session | scoped_session[FlaskSession]) -> TagType | None: + tag_type = session.scalar(select(Tag.type).where(Tag.id == tag_id, Tag.tenant_id == tenant_id).limit(1)) + return tag_type + @staticmethod def get_tags(tag_type: _TagTypeLike, current_tenant_id: str, keyword: str | None = None, *, session: Session): stmt = ( @@ -285,9 +291,7 @@ class TagService: raise NotFound("Snippet not found") elif type == "skill": skill = session.scalar( - select(Skill) - .where(Skill.tenant_id == current_user.current_tenant_id, Skill.id == target_id) - .limit(1) + select(Skill).where(Skill.tenant_id == current_user.current_tenant_id, Skill.id == target_id).limit(1) ) if not skill: raise NotFound("Skill not found") diff --git a/api/tests/unit_tests/controllers/console/workspace/test_skills.py b/api/tests/unit_tests/controllers/console/workspace/test_skills.py index f831120a098..7a61c10d355 100644 --- a/api/tests/unit_tests/controllers/console/workspace/test_skills.py +++ b/api/tests/unit_tests/controllers/console/workspace/test_skills.py @@ -1,7 +1,10 @@ from __future__ import annotations import io -from inspect import unwrap +from collections.abc import Callable +from inspect import signature +from inspect import unwrap as inspect_unwrap +from typing import cast from unittest.mock import MagicMock, PropertyMock, patch import pytest @@ -29,10 +32,23 @@ from controllers.console.workspace.skills import ( WorkspaceSkillVersionsApi, ) from controllers.inner_api.plugin.skills import PublishedSkillPullApi -from models.account import Account +from machinery.context import RequestContext from services.skill_management_service import SkillAssistAttachmentPayload, SkillManagementServiceError +def unwrap[ReturnT](func: Callable[..., ReturnT]) -> Callable[..., ReturnT]: + """Keep direct controller tests compatible with the session-injected methods.""" + unwrapped = cast(Callable[..., ReturnT], inspect_unwrap(func)) + parameters = list(signature(unwrapped).parameters.values()) + if len(parameters) > 1 and parameters[1].name == "session": + + def invoke(*args: object, **kwargs: object) -> ReturnT: + return unwrapped(args[0], MagicMock(), *args[1:], **kwargs) + + return invoke + return unwrapped + + @pytest.fixture def app() -> Flask: flask_app = Flask("test_workspace_skills") @@ -41,10 +57,13 @@ def app() -> Flask: @pytest.fixture -def current_user() -> Account: - user = Account(name="Test User", email="test@example.com") - user.id = "user-1" - return user +def request_context() -> RequestContext: + return RequestContext( + request_id="request-1", + trace_id=None, + account_id="user-1", + active_workspace_id="tenant-1", + ) def _skill_detail() -> dict[str, object]: @@ -81,7 +100,7 @@ def _skill_detail() -> dict[str, object]: } -def test_create_skill_validates_payload_and_returns_detail(app: Flask, current_user: Account) -> None: +def test_create_skill_validates_payload_and_returns_detail(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillsApi() method = unwrap(api.post) service = MagicMock() @@ -92,7 +111,7 @@ def test_create_skill_validates_payload_and_returns_detail(app: Flask, current_u patch.object(type(console_ns), "payload", new_callable=PropertyMock, return_value={}), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload, status = method(api, "tenant-1", current_user) + payload, status = method(api, request_context) assert status == 201 assert payload["id"] == "skill-1" @@ -105,7 +124,7 @@ def test_create_skill_validates_payload_and_returns_detail(app: Flask, current_u @pytest.mark.parametrize("side_effect", [ValueError("bad payload"), SkillManagementServiceError("skill_error", "bad")]) def test_create_skill_maps_validation_and_service_errors( app: Flask, - current_user: Account, + request_context: RequestContext, side_effect: Exception, ) -> None: api = WorkspaceSkillsApi() @@ -118,13 +137,13 @@ def test_create_skill_maps_validation_and_service_errors( patch.object(type(console_ns), "payload", new_callable=PropertyMock, return_value={"name": "finance-sop"}), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload, status = method(api, "tenant-1", current_user) + payload, status = method(api, request_context) assert status == 400 assert payload["code"] in {"invalid_request", "skill_error"} -def test_create_skill_rejects_extra_payload(app: Flask, current_user: Account) -> None: +def test_create_skill_rejects_extra_payload(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillsApi() method = unwrap(api.post) @@ -132,13 +151,15 @@ def test_create_skill_rejects_extra_payload(app: Flask, current_user: Account) - app.test_request_context("/", method="POST"), patch.object(type(console_ns), "payload", new_callable=PropertyMock, return_value={"unknown": "field"}), ): - payload, status = method(api, "tenant-1", current_user) + payload, status = method(api, request_context) assert status == 400 assert payload["code"] == "invalid_request" -def test_list_skills_uses_default_pagination_when_query_omits_page_and_limit(app: Flask) -> None: +def test_list_skills_uses_default_pagination_when_query_omits_page_and_limit( + app: Flask, request_context: RequestContext +) -> None: api = WorkspaceSkillsApi() method = unwrap(api.get) service = MagicMock() @@ -155,7 +176,7 @@ def test_list_skills_uses_default_pagination_when_query_omits_page_and_limit(app app.test_request_context("/?keyword=finance&tag=ops&tag=", method="GET"), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload = method(api, "tenant-1") + payload = method(api, request_context) assert payload == { "data": [], @@ -173,7 +194,7 @@ def test_list_skills_uses_default_pagination_when_query_omits_page_and_limit(app ) -def test_list_skills_passes_explicit_pagination(app: Flask) -> None: +def test_list_skills_passes_explicit_pagination(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillsApi() method = unwrap(api.get) service = MagicMock() @@ -184,14 +205,14 @@ def test_list_skills_passes_explicit_pagination(app: Flask) -> None: app.test_request_context("/?limit=10&page=2", method="GET"), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload = method(api, "tenant-1") + payload = method(api, request_context) assert payload["limit"] == 10 assert payload["page"] == 2 service.list_skills.assert_called_once_with(tenant_id="tenant-1", keyword=None, page=2, limit=10, tags=[]) -def test_upload_skill_file_returns_tool_file_metadata(app: Flask, current_user: Account) -> None: +def test_upload_skill_file_returns_tool_file_metadata(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillFileUploadApi() method = unwrap(api.post) service = MagicMock() @@ -212,7 +233,7 @@ def test_upload_skill_file_returns_tool_file_metadata(app: Flask, current_user: ), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload, status = method(api, "tenant-1", current_user) + payload, status = method(api, request_context) assert status == 201 assert payload["id"] == "tool-file-1" @@ -225,18 +246,18 @@ def test_upload_skill_file_returns_tool_file_metadata(app: Flask, current_user: ) -def test_upload_skill_file_requires_file(app: Flask, current_user: Account) -> None: +def test_upload_skill_file_requires_file(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillFileUploadApi() method = unwrap(api.post) with app.test_request_context("/", method="POST", data={}, content_type="multipart/form-data"): - payload, status = method(api, "tenant-1", current_user) + payload, status = method(api, request_context) assert status == 400 assert payload == {"code": "no_file_uploaded", "message": "no file uploaded"} -def test_upload_skill_file_requires_filename(app: Flask, current_user: Account) -> None: +def test_upload_skill_file_requires_filename(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillFileUploadApi() method = unwrap(api.post) @@ -246,13 +267,13 @@ def test_upload_skill_file_requires_filename(app: Flask, current_user: Account) data={"file": (io.BytesIO(b"payload"), "")}, content_type="multipart/form-data", ): - payload, status = method(api, "tenant-1", current_user) + payload, status = method(api, request_context) assert status == 400 assert payload == {"code": "filename_missing", "message": "filename is required"} -def test_import_skill_uploads_zip(app: Flask, current_user: Account) -> None: +def test_import_skill_uploads_zip(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillImportApi() method = unwrap(api.post) service = MagicMock() @@ -267,7 +288,7 @@ def test_import_skill_uploads_zip(app: Flask, current_user: Account) -> None: ), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload, status = method(api, "tenant-1", current_user) + payload, status = method(api, request_context) assert status == 201 assert payload["id"] == "skill-1" @@ -278,18 +299,18 @@ def test_import_skill_uploads_zip(app: Flask, current_user: Account) -> None: assert call["payload"].filename == "skill.zip" -def test_import_skill_requires_file(app: Flask, current_user: Account) -> None: +def test_import_skill_requires_file(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillImportApi() method = unwrap(api.post) with app.test_request_context("/", method="POST", data={}, content_type="multipart/form-data"): - payload, status = method(api, "tenant-1", current_user) + payload, status = method(api, request_context) assert status == 400 assert payload == {"code": "invalid_request", "message": "file is required"} -def test_import_skill_maps_service_error(app: Flask, current_user: Account) -> None: +def test_import_skill_maps_service_error(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillImportApi() method = unwrap(api.post) service = MagicMock() @@ -304,13 +325,13 @@ def test_import_skill_maps_service_error(app: Flask, current_user: Account) -> N ), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload, status = method(api, "tenant-1", current_user) + payload, status = method(api, request_context) assert status == 400 assert payload == {"code": "invalid_skill_archive", "message": "invalid archive"} -def test_get_skill_detail_returns_files(app: Flask) -> None: +def test_get_skill_detail_returns_files(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillApi() method = unwrap(api.get) service = MagicMock() @@ -320,14 +341,14 @@ def test_get_skill_detail_returns_files(app: Flask) -> None: app.test_request_context("/", method="GET"), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload = method(api, "tenant-1", "skill-1") + payload = method(api, request_context, "skill-1") assert payload["id"] == "skill-1" assert payload["files"][0]["path"] == "SKILL.md" service.get_skill.assert_called_once_with(tenant_id="tenant-1", skill_id="skill-1") -def test_get_skill_detail_maps_service_error(app: Flask) -> None: +def test_get_skill_detail_maps_service_error(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillApi() method = unwrap(api.get) service = MagicMock() @@ -337,13 +358,13 @@ def test_get_skill_detail_maps_service_error(app: Flask) -> None: app.test_request_context("/", method="GET"), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload, status = method(api, "tenant-1", "skill-1") + payload, status = method(api, request_context, "skill-1") assert status == 404 assert payload == {"code": "skill_not_found", "message": "skill not found"} -def test_update_skill_metadata_validates_payload(app: Flask, current_user: Account) -> None: +def test_update_skill_metadata_validates_payload(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillApi() method = unwrap(api.patch) service = MagicMock() @@ -359,7 +380,7 @@ def test_update_skill_metadata_validates_payload(app: Flask, current_user: Accou ), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload = method(api, "tenant-1", current_user, "skill-1") + payload = method(api, request_context, "skill-1") assert payload["display_name"] == "Finance SOP" call = service.update_metadata.call_args.kwargs @@ -375,7 +396,7 @@ def test_update_skill_metadata_validates_payload(app: Flask, current_user: Accou ) def test_update_skill_metadata_maps_service_errors( app: Flask, - current_user: Account, + request_context: RequestContext, side_effect: Exception, ) -> None: api = WorkspaceSkillApi() @@ -388,13 +409,13 @@ def test_update_skill_metadata_maps_service_errors( patch.object(type(console_ns), "payload", new_callable=PropertyMock, return_value={"display_name": "Finance"}), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload, status = method(api, "tenant-1", current_user, "skill-1") + payload, status = method(api, request_context, "skill-1") assert status in {400, 409} assert payload["code"] in {"invalid_request", "skill_conflict"} -def test_delete_skill_passes_confirmation_name(app: Flask) -> None: +def test_delete_skill_passes_confirmation_name(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillApi() method = unwrap(api.delete) service = MagicMock() @@ -410,7 +431,7 @@ def test_delete_skill_passes_confirmation_name(app: Flask) -> None: ), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload = method(api, "tenant-1", "skill-1") + payload = method(api, request_context, "skill-1") assert payload == {"id": "skill-1", "deleted": True} service.delete_skill.assert_called_once_with( @@ -420,7 +441,7 @@ def test_delete_skill_passes_confirmation_name(app: Flask) -> None: ) -def test_delete_skill_maps_service_error(app: Flask) -> None: +def test_delete_skill_maps_service_error(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillApi() method = unwrap(api.delete) service = MagicMock() @@ -435,13 +456,13 @@ def test_delete_skill_maps_service_error(app: Flask) -> None: patch.object(type(console_ns), "payload", new_callable=PropertyMock, return_value={}), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload, status = method(api, "tenant-1", "skill-1") + payload, status = method(api, request_context, "skill-1") assert status == 409 assert payload == {"code": "skill_referenced", "message": "skill is referenced"} -def test_duplicate_skill_returns_new_detail(app: Flask, current_user: Account) -> None: +def test_duplicate_skill_returns_new_detail(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillDuplicateApi() method = unwrap(api.post) service = MagicMock() @@ -451,14 +472,14 @@ def test_duplicate_skill_returns_new_detail(app: Flask, current_user: Account) - app.test_request_context("/", method="POST"), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload, status = method(api, "tenant-1", current_user, "skill-1") + payload, status = method(api, request_context, "skill-1") assert status == 201 assert payload["id"] == "skill-1" service.duplicate_skill.assert_called_once_with(tenant_id="tenant-1", user_id="user-1", skill_id="skill-1") -def test_duplicate_skill_maps_service_error(app: Flask, current_user: Account) -> None: +def test_duplicate_skill_maps_service_error(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillDuplicateApi() method = unwrap(api.post) service = MagicMock() @@ -472,13 +493,13 @@ def test_duplicate_skill_maps_service_error(app: Flask, current_user: Account) - app.test_request_context("/", method="POST"), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload, status = method(api, "tenant-1", current_user, "skill-1") + payload, status = method(api, request_context, "skill-1") assert status == 404 assert payload == {"code": "skill_not_found", "message": "skill not found"} -def test_export_skill_returns_archive_response(app: Flask) -> None: +def test_export_skill_returns_archive_response(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillExportApi() method = unwrap(api.get) service = MagicMock() @@ -492,7 +513,7 @@ def test_export_skill_returns_archive_response(app: Flask) -> None: app.test_request_context("/", method="GET"), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - response = method(api, "tenant-1", "skill-1") + response = method(api, request_context, "skill-1") assert response.status_code == 200 assert response.mimetype == "application/zip" @@ -502,7 +523,7 @@ def test_export_skill_returns_archive_response(app: Flask) -> None: service.pull_published_archive.assert_called_once_with(tenant_id="tenant-1", skill_id="skill-1") -def test_export_skill_maps_service_error(app: Flask) -> None: +def test_export_skill_maps_service_error(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillExportApi() method = unwrap(api.get) service = MagicMock() @@ -516,7 +537,7 @@ def test_export_skill_maps_service_error(app: Flask) -> None: app.test_request_context("/", method="GET"), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload, status = method(api, "tenant-1", "skill-1") + payload, status = method(api, request_context, "skill-1") assert status == 409 assert payload == {"code": "skill_not_published", "message": "skill not published"} @@ -556,7 +577,7 @@ def test_inner_api_pull_maps_missing_tenant_to_invalid_request(app: Flask) -> No assert payload["code"] == "invalid_request" -def test_get_agent_skill_bindings_returns_card_data(app: Flask) -> None: +def test_get_agent_skill_bindings_returns_card_data(app: Flask, request_context: RequestContext) -> None: api = WorkspaceAgentSkillBindingsApi() method = unwrap(api.get) service = MagicMock() @@ -585,7 +606,7 @@ def test_get_agent_skill_bindings_returns_card_data(app: Flask) -> None: app.test_request_context("/", method="GET"), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload = method(api, "tenant-1", "agent-1") + payload = method(api, request_context, "agent-1") assert payload["skill_ids"] == ["skill-1"] assert payload["data"][0]["display_name"] == "Finance SOP" @@ -593,7 +614,9 @@ def test_get_agent_skill_bindings_returns_card_data(app: Flask) -> None: service.list_agent_bindings.assert_called_once_with(tenant_id="tenant-1", agent_id="agent-1") -def test_patch_skill_file_operation_validates_payload_and_returns_detail(app: Flask, current_user: Account) -> None: +def test_patch_skill_file_operation_validates_payload_and_returns_detail( + app: Flask, request_context: RequestContext +) -> None: api = WorkspaceSkillFilesApi() method = unwrap(api.patch) service = MagicMock() @@ -609,7 +632,7 @@ def test_patch_skill_file_operation_validates_payload_and_returns_detail(app: Fl patch.object(type(console_ns), "payload", new_callable=PropertyMock, return_value=request_payload), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload = method(api, "tenant-1", current_user, "skill-1") + payload = method(api, request_context, "skill-1") assert payload["id"] == "skill-1" service.apply_draft_file_operation.assert_called_once() @@ -620,7 +643,7 @@ def test_patch_skill_file_operation_validates_payload_and_returns_detail(app: Fl assert call["payload"].operation == "upsert_text" -def test_patch_skill_file_operation_returns_error_details(app: Flask, current_user: Account) -> None: +def test_patch_skill_file_operation_returns_error_details(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillFilesApi() method = unwrap(api.patch) service = MagicMock() @@ -640,7 +663,7 @@ def test_patch_skill_file_operation_returns_error_details(app: Flask, current_us ), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload, status = method(api, "tenant-1", current_user, "skill-1") + payload, status = method(api, request_context, "skill-1") assert status == 400 assert payload == { @@ -650,7 +673,7 @@ def test_patch_skill_file_operation_returns_error_details(app: Flask, current_us } -def test_check_skill_files_validates_payload_and_returns_results(app: Flask) -> None: +def test_check_skill_files_validates_payload_and_returns_results(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillFilesCheckApi() method = unwrap(api.post) service = MagicMock() @@ -677,7 +700,7 @@ def test_check_skill_files_validates_payload_and_returns_results(app: Flask) -> ), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload = method(api, "tenant-1", "skill-1") + payload = method(api, request_context, "skill-1") assert payload["data"]["policy.md"]["path"] == "references/policy.md" assert payload["data"]["policy.md"]["errors"] == [] @@ -688,7 +711,9 @@ def test_check_skill_files_validates_payload_and_returns_results(app: Flask) -> assert call["payload"].files[0].filename == "policy.md" -def test_replace_skill_draft_tree_validates_payload_and_returns_detail(app: Flask, current_user: Account) -> None: +def test_replace_skill_draft_tree_validates_payload_and_returns_detail( + app: Flask, request_context: RequestContext +) -> None: api = WorkspaceSkillFilesApi() method = unwrap(api.put) service = MagicMock() @@ -704,7 +729,7 @@ def test_replace_skill_draft_tree_validates_payload_and_returns_detail(app: Flas ), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload = method(api, "tenant-1", current_user, "skill-1") + payload = method(api, request_context, "skill-1") assert payload["id"] == "skill-1" call = service.replace_draft_tree.call_args.kwargs @@ -714,7 +739,7 @@ def test_replace_skill_draft_tree_validates_payload_and_returns_detail(app: Flas assert call["payload"].files[0].path == "SKILL.md" -def test_preview_skill_file_validates_query(app: Flask) -> None: +def test_preview_skill_file_validates_query(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillFilePreviewApi() method = unwrap(api.get) service = MagicMock() @@ -730,7 +755,7 @@ def test_preview_skill_file_validates_query(app: Flask) -> None: app.test_request_context("/?path=SKILL.md&version_id=version-1", method="GET"), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload = method(api, "tenant-1", "skill-1") + payload = method(api, request_context, "skill-1") assert payload["content"] == "# Body" service.preview_file.assert_called_once_with( @@ -741,7 +766,7 @@ def test_preview_skill_file_validates_query(app: Flask) -> None: ) -def test_pull_skill_file_content_returns_download(app: Flask) -> None: +def test_pull_skill_file_content_returns_download(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillFileContentApi() method = unwrap(api.get) service = MagicMock() @@ -755,7 +780,7 @@ def test_pull_skill_file_content_returns_download(app: Flask) -> None: app.test_request_context("/?path=SKILL.md&download=1", method="GET"), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - response = method(api, "tenant-1", "skill-1") + response = method(api, request_context, "skill-1") assert response.status_code == 200 assert response.mimetype == "text/markdown" @@ -770,7 +795,7 @@ def test_pull_skill_file_content_returns_download(app: Flask) -> None: ) -def test_list_skill_tags_returns_filter_options(app: Flask) -> None: +def test_list_skill_tags_returns_filter_options(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillTagsApi() method = unwrap(api.get) service = MagicMock() @@ -780,13 +805,13 @@ def test_list_skill_tags_returns_filter_options(app: Flask) -> None: app.test_request_context("/", method="GET"), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload = method(api, "tenant-1") + payload = method(api, request_context) assert payload == {"data": [{"tag": "finance", "count": 2}]} service.list_tags.assert_called_once_with(tenant_id="tenant-1") -def test_publish_skill_validates_payload(app: Flask, current_user: Account) -> None: +def test_publish_skill_validates_payload(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillPublishApi() method = unwrap(api.post) service = MagicMock() @@ -809,7 +834,7 @@ def test_publish_skill_validates_payload(app: Flask, current_user: Account) -> N patch.object(type(console_ns), "payload", new_callable=PropertyMock, return_value={"publish_note": "Initial"}), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload = method(api, "tenant-1", current_user, "skill-1") + payload = method(api, request_context, "skill-1") assert payload["id"] == "version-1" call = service.publish_skill.call_args.kwargs @@ -819,7 +844,7 @@ def test_publish_skill_validates_payload(app: Flask, current_user: Account) -> N assert call["payload"].publish_note == "Initial" -def test_restore_skill_version_validates_payload(app: Flask, current_user: Account) -> None: +def test_restore_skill_version_validates_payload(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillRestoreApi() method = unwrap(api.post) service = MagicMock() @@ -853,7 +878,7 @@ def test_restore_skill_version_validates_payload(app: Flask, current_user: Accou patch.object(type(console_ns), "payload", new_callable=PropertyMock, return_value={"version_id": "version-1"}), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload = method(api, "tenant-1", current_user, "skill-1") + payload = method(api, request_context, "skill-1") assert payload["latest_published_version_id"] == "version-1" call = service.restore_version.call_args.kwargs @@ -863,7 +888,7 @@ def test_restore_skill_version_validates_payload(app: Flask, current_user: Accou assert call["payload"].version_id == "version-1" -def test_list_skill_references_returns_reference_data(app: Flask) -> None: +def test_list_skill_references_returns_reference_data(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillReferencesApi() method = unwrap(api.get) service = MagicMock() @@ -882,13 +907,13 @@ def test_list_skill_references_returns_reference_data(app: Flask) -> None: app.test_request_context("/", method="GET"), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload = method(api, "tenant-1", "skill-1") + payload = method(api, request_context, "skill-1") assert payload["data"][0]["agent_id"] == "agent-1" service.list_skill_references.assert_called_once_with(tenant_id="tenant-1", skill_id="skill-1") -def test_list_skill_versions_returns_version_page(app: Flask) -> None: +def test_list_skill_versions_returns_version_page(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillVersionsApi() method = unwrap(api.get) service = MagicMock() @@ -914,13 +939,13 @@ def test_list_skill_versions_returns_version_page(app: Flask) -> None: app.test_request_context("/", method="GET"), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload = method(api, "tenant-1", "skill-1") + payload = method(api, request_context, "skill-1") assert payload["data"][0]["id"] == "version-1" service.list_versions.assert_called_once_with(tenant_id="tenant-1", skill_id="skill-1") -def test_get_skill_version_returns_version_detail(app: Flask) -> None: +def test_get_skill_version_returns_version_detail(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillVersionApi() method = unwrap(api.get) service = MagicMock() @@ -956,7 +981,7 @@ def test_get_skill_version_returns_version_detail(app: Flask) -> None: app.test_request_context("/", method="GET"), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload = method(api, "tenant-1", "skill-1", "version-1") + payload = method(api, request_context, "skill-1", "version-1") assert payload["files"][0]["content"] == "# Version" service.get_version.assert_called_once_with( @@ -966,7 +991,7 @@ def test_get_skill_version_returns_version_detail(app: Flask) -> None: ) -def test_patch_skill_version_renames_version(app: Flask) -> None: +def test_patch_skill_version_renames_version(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillVersionApi() method = unwrap(api.patch) service = MagicMock() @@ -994,14 +1019,14 @@ def test_patch_skill_version_renames_version(app: Flask) -> None: ), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload = method(api, "tenant-1", "skill-1", "version-1") + payload = method(api, request_context, "skill-1", "version-1") assert payload["version_name"] == "Approval threshold" service.update_version.assert_called_once() assert service.update_version.call_args.kwargs["payload"].version_name == "Approval threshold" -def test_delete_skill_version_returns_new_latest(app: Flask, current_user: Account) -> None: +def test_delete_skill_version_returns_new_latest(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillVersionApi() method = unwrap(api.delete) service = MagicMock() @@ -1015,7 +1040,7 @@ def test_delete_skill_version_returns_new_latest(app: Flask, current_user: Accou app.test_request_context("/", method="DELETE"), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload = method(api, "tenant-1", current_user, "skill-1", "version-2") + payload = method(api, request_context, "skill-1", "version-2") assert payload == {"id": "version-2", "deleted": True, "latest_published_version_id": "version-1"} service.delete_version.assert_called_once_with( @@ -1026,7 +1051,7 @@ def test_delete_skill_version_returns_new_latest(app: Flask, current_user: Accou ) -def test_skill_assistant_runs_agent_app_stream(app: Flask, current_user: Account) -> None: +def test_skill_assistant_runs_agent_app_stream(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillAssistMessageApi() method = unwrap(api.post) service = MagicMock() @@ -1058,7 +1083,7 @@ def test_skill_assistant_runs_agent_app_stream(app: Flask, current_user: Account return_value=compact_response, ) as compact_generate_response, ): - response = method(api, "tenant-1", current_user, "skill-1") + response = method(api, request_context, "skill-1") assert response is compact_response service.create_assistant_action_stream.assert_called_once_with( @@ -1084,7 +1109,7 @@ def test_skill_assistant_runs_agent_app_stream(app: Flask, current_user: Account @pytest.mark.parametrize("payload", [{}, {"message": "x", "unknown": True}]) def test_skill_assistant_rejects_invalid_payload( app: Flask, - current_user: Account, + request_context: RequestContext, payload: dict[str, object], ) -> None: api = WorkspaceSkillAssistMessageApi() @@ -1094,13 +1119,13 @@ def test_skill_assistant_rejects_invalid_payload( app.test_request_context("/", method="POST"), patch.object(type(console_ns), "payload", new_callable=PropertyMock, return_value=payload), ): - response_body, status = method(api, "tenant-1", current_user, "skill-1") + response_body, status = method(api, request_context, "skill-1") assert status == 400 assert response_body["code"] == "invalid_request" -def test_skill_assistant_maps_service_error(app: Flask, current_user: Account) -> None: +def test_skill_assistant_maps_service_error(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillAssistMessageApi() method = unwrap(api.post) service = MagicMock() @@ -1114,7 +1139,7 @@ def test_skill_assistant_maps_service_error(app: Flask, current_user: Account) - patch.object(type(console_ns), "payload", new_callable=PropertyMock, return_value={"message": "help"}), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload, status = method(api, "tenant-1", current_user, "skill-1") + payload, status = method(api, request_context, "skill-1") assert status == 400 assert payload == {"code": "model_provider_not_configured", "message": "model provider not configured"} @@ -1129,7 +1154,7 @@ def test_skill_assistant_maps_service_error(app: Flask, current_user: Account) - ) def test_skill_file_write_methods_map_conflicts( app: Flask, - current_user: Account, + request_context: RequestContext, method_name: str, payload: dict[str, object], ) -> None: @@ -1152,13 +1177,13 @@ def test_skill_file_write_methods_map_conflicts( patch.object(type(console_ns), "payload", new_callable=PropertyMock, return_value=payload), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - response_body, status = method(api, "tenant-1", current_user, "skill-1") + response_body, status = method(api, request_context, "skill-1") assert status == 409 assert response_body["code"] == "skill_conflict" -def test_replace_skill_draft_tree_maps_value_error(app: Flask, current_user: Account) -> None: +def test_replace_skill_draft_tree_maps_value_error(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillFilesApi() method = unwrap(api.put) service = MagicMock() @@ -1169,25 +1194,27 @@ def test_replace_skill_draft_tree_maps_value_error(app: Flask, current_user: Acc patch.object(type(console_ns), "payload", new_callable=PropertyMock, return_value={"files": []}), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload, status = method(api, "tenant-1", current_user, "skill-1") + payload, status = method(api, request_context, "skill-1") assert status == 400 assert payload == {"code": "invalid_request", "message": "bad path"} @pytest.mark.parametrize("query_string", ["", "?path=../secret.md"]) -def test_preview_skill_file_rejects_invalid_query(app: Flask, query_string: str) -> None: +def test_preview_skill_file_rejects_invalid_query( + app: Flask, request_context: RequestContext, query_string: str +) -> None: api = WorkspaceSkillFilePreviewApi() method = unwrap(api.get) with app.test_request_context(f"/{query_string}", method="GET"): - payload, status = method(api, "tenant-1", "skill-1") + payload, status = method(api, request_context, "skill-1") assert status == 400 assert payload["code"] == "invalid_request" -def test_preview_skill_file_maps_service_error(app: Flask) -> None: +def test_preview_skill_file_maps_service_error(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillFilePreviewApi() method = unwrap(api.get) service = MagicMock() @@ -1197,25 +1224,27 @@ def test_preview_skill_file_maps_service_error(app: Flask) -> None: app.test_request_context("/?path=SKILL.md", method="GET"), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload, status = method(api, "tenant-1", "skill-1") + payload, status = method(api, request_context, "skill-1") assert status == 404 assert payload == {"code": "file_not_found", "message": "file not found"} @pytest.mark.parametrize("query_string", ["", "?path=../secret.md"]) -def test_pull_skill_file_content_rejects_invalid_query(app: Flask, query_string: str) -> None: +def test_pull_skill_file_content_rejects_invalid_query( + app: Flask, request_context: RequestContext, query_string: str +) -> None: api = WorkspaceSkillFileContentApi() method = unwrap(api.get) with app.test_request_context(f"/{query_string}", method="GET"): - payload, status = method(api, "tenant-1", "skill-1") + payload, status = method(api, request_context, "skill-1") assert status == 400 assert payload["code"] == "invalid_request" -def test_pull_skill_file_content_maps_service_error(app: Flask) -> None: +def test_pull_skill_file_content_maps_service_error(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillFileContentApi() method = unwrap(api.get) service = MagicMock() @@ -1225,13 +1254,13 @@ def test_pull_skill_file_content_maps_service_error(app: Flask) -> None: app.test_request_context("/?path=SKILL.md", method="GET"), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload, status = method(api, "tenant-1", "skill-1") + payload, status = method(api, request_context, "skill-1") assert status == 404 assert payload == {"code": "file_not_found", "message": "file not found"} -def test_publish_skill_rejects_invalid_payload(app: Flask, current_user: Account) -> None: +def test_publish_skill_rejects_invalid_payload(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillPublishApi() method = unwrap(api.post) @@ -1239,13 +1268,13 @@ def test_publish_skill_rejects_invalid_payload(app: Flask, current_user: Account app.test_request_context("/", method="POST"), patch.object(type(console_ns), "payload", new_callable=PropertyMock, return_value={"publish_note": "x" * 1025}), ): - payload, status = method(api, "tenant-1", current_user, "skill-1") + payload, status = method(api, request_context, "skill-1") assert status == 400 assert payload["code"] == "invalid_request" -def test_publish_skill_maps_service_error(app: Flask, current_user: Account) -> None: +def test_publish_skill_maps_service_error(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillPublishApi() method = unwrap(api.post) service = MagicMock() @@ -1256,13 +1285,13 @@ def test_publish_skill_maps_service_error(app: Flask, current_user: Account) -> patch.object(type(console_ns), "payload", new_callable=PropertyMock, return_value={}), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload, status = method(api, "tenant-1", current_user, "skill-1") + payload, status = method(api, request_context, "skill-1") assert status == 400 assert payload == {"code": "missing_skill_name", "message": "name required"} -def test_restore_skill_version_rejects_invalid_payload(app: Flask, current_user: Account) -> None: +def test_restore_skill_version_rejects_invalid_payload(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillRestoreApi() method = unwrap(api.post) @@ -1270,13 +1299,13 @@ def test_restore_skill_version_rejects_invalid_payload(app: Flask, current_user: app.test_request_context("/", method="POST"), patch.object(type(console_ns), "payload", new_callable=PropertyMock, return_value={}), ): - payload, status = method(api, "tenant-1", current_user, "skill-1") + payload, status = method(api, request_context, "skill-1") assert status == 400 assert payload["code"] == "invalid_request" -def test_restore_skill_version_maps_service_error(app: Flask, current_user: Account) -> None: +def test_restore_skill_version_maps_service_error(app: Flask, request_context: RequestContext) -> None: api = WorkspaceSkillRestoreApi() method = unwrap(api.post) service = MagicMock() @@ -1291,13 +1320,13 @@ def test_restore_skill_version_maps_service_error(app: Flask, current_user: Acco patch.object(type(console_ns), "payload", new_callable=PropertyMock, return_value={"version_id": "version-1"}), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload, status = method(api, "tenant-1", current_user, "skill-1") + payload, status = method(api, request_context, "skill-1") assert status == 404 assert payload == {"code": "version_not_found", "message": "version not found"} -def test_agent_skill_bindings_replaces_bound_skills(app: Flask, current_user: Account) -> None: +def test_agent_skill_bindings_replaces_bound_skills(app: Flask, request_context: RequestContext) -> None: api = WorkspaceAgentSkillBindingsApi() method = unwrap(api.put) service = MagicMock() @@ -1309,7 +1338,7 @@ def test_agent_skill_bindings_replaces_bound_skills(app: Flask, current_user: Ac patch.object(type(console_ns), "payload", new_callable=PropertyMock, return_value={"skill_ids": ["skill-1"]}), patch("controllers.console.workspace.skills.SkillManagementService", return_value=service), ): - payload = method(api, "tenant-1", current_user, "agent-1") + payload = method(api, request_context, "agent-1") assert payload["skill_ids"] == ["skill-1"] service.replace_agent_bindings.assert_called_once_with( @@ -1320,7 +1349,7 @@ def test_agent_skill_bindings_replaces_bound_skills(app: Flask, current_user: Ac ) -def test_agent_skill_bindings_rejects_invalid_payload(app: Flask, current_user: Account) -> None: +def test_agent_skill_bindings_rejects_invalid_payload(app: Flask, request_context: RequestContext) -> None: api = WorkspaceAgentSkillBindingsApi() method = unwrap(api.put) @@ -1328,7 +1357,7 @@ def test_agent_skill_bindings_rejects_invalid_payload(app: Flask, current_user: app.test_request_context("/", method="PUT"), patch.object(type(console_ns), "payload", new_callable=PropertyMock, return_value={"skill_ids": "skill-1"}), ): - payload, status = method(api, "tenant-1", current_user, "agent-1") + payload, status = method(api, request_context, "agent-1") assert status == 400 assert payload["code"] == "invalid_request" diff --git a/api/tests/unit_tests/core/app/apps/agent_app/test_runtime_request_builder.py b/api/tests/unit_tests/core/app/apps/agent_app/test_runtime_request_builder.py index eba09e43179..db33a1ad03b 100644 --- a/api/tests/unit_tests/core/app/apps/agent_app/test_runtime_request_builder.py +++ b/api/tests/unit_tests/core/app/apps/agent_app/test_runtime_request_builder.py @@ -56,14 +56,6 @@ def model_context_window_calls(monkeypatch: pytest.MonkeyPatch) -> list[tuple[ob return calls -@pytest.fixture(autouse=True) -def _no_runtime_agent_skills(monkeypatch: pytest.MonkeyPatch): - monkeypatch.setattr( - "core.app.apps.agent_app.runtime_request_builder.load_runtime_agent_skill_configs", - lambda **_kwargs: [], - ) - - def _exec_ctx() -> DifyExecutionContextLayerConfig: return DifyExecutionContextLayerConfig( tenant_id="tenant-1", diff --git a/api/tests/unit_tests/core/workflow/nodes/agent_v2/test_runtime_request_builder.py b/api/tests/unit_tests/core/workflow/nodes/agent_v2/test_runtime_request_builder.py index 2d06fe84dbb..28cf8ab6ef4 100644 --- a/api/tests/unit_tests/core/workflow/nodes/agent_v2/test_runtime_request_builder.py +++ b/api/tests/unit_tests/core/workflow/nodes/agent_v2/test_runtime_request_builder.py @@ -72,14 +72,6 @@ def model_context_window_calls(monkeypatch: pytest.MonkeyPatch) -> list[tuple[ob return calls -@pytest.fixture(autouse=True) -def _no_runtime_agent_skills(monkeypatch: pytest.MonkeyPatch): - monkeypatch.setattr( - "core.workflow.nodes.agent_v2.runtime_request_builder.load_runtime_agent_skill_configs", - lambda **_kwargs: [], - ) - - def test_agent_soul_round_trip_preserves_existing_app_feature_fields(): config = AgentSoulConfig.model_validate( { diff --git a/api/tests/unit_tests/services/test_agent_config_service.py b/api/tests/unit_tests/services/test_agent_config_service.py index 933c6523724..f69def8bd7c 100644 --- a/api/tests/unit_tests/services/test_agent_config_service.py +++ b/api/tests/unit_tests/services/test_agent_config_service.py @@ -41,7 +41,6 @@ from services.agent_config_service import ( ConfigPushPayload, ConfigPushSkillItem, ) -from services.skill_management_service import SkillManagementServiceError MODULE = "services.agent_config_service" TENANT = "11111111-1111-1111-1111-111111111111" @@ -766,39 +765,6 @@ def test_inspect_skill_maps_invalid_archives_to_service_errors(archive_bytes: by assert exc_info.value.status_code == 500 -def test_pull_skill_falls_back_to_workspace_runtime_skill() -> None: - service = AgentConfigService() - target = _target(kind=AgentConfigVersionKind.DRAFT, writable=False, soul=_soul(config_skills=[])) - workspace_archive = SimpleNamespace( - filename="workspace-skill.zip", - mime_type="application/zip", - payload=b"zip-bytes", - ) - - with ( - patch.object(service, "resolve_target", return_value=target), - patch(f"{MODULE}.SkillManagementService") as skill_management_service, - ): - skill_management_service.return_value.pull_runtime_agent_skill.return_value = workspace_archive - download = service.pull_skill( - tenant_id=TENANT, - agent_id=AGENT, - config_version_id="draft-1", - config_version_kind=AgentConfigVersionKind.DRAFT, - name="workspace-skill", - user_id=USER, - ) - - assert download.filename == "workspace-skill.zip" - assert download.mime_type == "application/zip" - assert download.payload == b"zip-bytes" - skill_management_service.return_value.pull_runtime_agent_skill.assert_called_once_with( - tenant_id=TENANT, - agent_id=AGENT, - name="workspace-skill", - ) - - def test_request_download_falls_back_to_workspace_runtime_skill() -> None: service = AgentConfigService() target = _target(kind=AgentConfigVersionKind.DRAFT, writable=False, soul=_soul(config_skills=[])) @@ -842,33 +808,6 @@ def test_request_download_falls_back_to_workspace_runtime_skill() -> None: ) -def test_pull_skill_maps_missing_workspace_runtime_skill_to_config_error() -> None: - service = AgentConfigService() - target = _target(kind=AgentConfigVersionKind.DRAFT, writable=False, soul=_soul(config_skills=[])) - - with ( - patch.object(service, "resolve_target", return_value=target), - patch(f"{MODULE}.SkillManagementService") as skill_management_service, - ): - skill_management_service.return_value.pull_runtime_agent_skill.side_effect = SkillManagementServiceError( - "skill_not_found", - "skill not found", - status_code=404, - ) - with pytest.raises(AgentConfigServiceError) as exc_info: - service.pull_skill( - tenant_id=TENANT, - agent_id=AGENT, - config_version_id="draft-1", - config_version_kind=AgentConfigVersionKind.DRAFT, - name="workspace-skill", - user_id=USER, - ) - - assert exc_info.value.code == "config_skill_not_found" - assert exc_info.value.status_code == 404 - - def test_inspect_skill_falls_back_to_workspace_runtime_skill() -> None: service = AgentConfigService() target = _target(kind=AgentConfigVersionKind.DRAFT, writable=False, soul=_soul(config_skills=[])) diff --git a/api/tests/unit_tests/services/test_skill_management_service.py b/api/tests/unit_tests/services/test_skill_management_service.py index d30b6e1ccf3..8e9fd12529b 100644 --- a/api/tests/unit_tests/services/test_skill_management_service.py +++ b/api/tests/unit_tests/services/test_skill_management_service.py @@ -881,8 +881,7 @@ def test_sync_assistant_model_config_updates_draft_without_active_snapshot() -> def test_update_display_name_keeps_name_and_draft_content_unchanged() -> None: service = SkillManagementService(tool_file_manager=_FakeToolFileManager()) created = service.create_skill(tenant_id=TENANT, user_id=USER, payload=SkillCreatePayload()) - original = service.get_skill(tenant_id=TENANT, skill_id=created["id"]) - original_skill_md = next(item for item in original["files"] if item["path"] == "SKILL.md") + original_skill_md = next(item for item in service.get_skill(tenant_id=TENANT, skill_id=created["id"])["files"]) updated = service.update_metadata( tenant_id=TENANT, @@ -2698,6 +2697,23 @@ def test_import_skill_package_rejects_archive_larger_than_upload_skill_limit(mon assert exc_info.value.code == "archive_too_large" +def test_import_skill_package_rejects_zip_bomb_before_reading_members() -> None: + package = io.BytesIO() + with zipfile.ZipFile(package, "w", compression=zipfile.ZIP_DEFLATED) as archive: + archive.writestr("payload.bin", b"\x00" * (8 * 1024 * 1024)) + + service = SkillManagementService(tool_file_manager=_FakeToolFileManager()) + + with pytest.raises(SkillManagementServiceError) as exc_info: + service._draft_payload_from_zip( + tenant_id=TENANT, + user_id=USER, + archive_bytes=package.getvalue(), + ) + + assert exc_info.value.code == "invalid_skill_package" + + def test_publish_and_export_include_binary_tool_files() -> None: captured: dict[str, bytes] = {} @@ -2905,6 +2921,165 @@ def test_build_assistant_attachment_context_includes_text_and_marks_binary() -> assert "[Binary attachment available as uploaded file metadata only.]" in context +def test_build_assistant_attachment_context_includes_extractable_pdf_text() -> None: + attachment = SkillAssistAttachmentPayload( + tool_file_id="resume-file-1", + name="resume.pdf", + mime_type="application/pdf", + size=166035, + ) + + with ( + patch( + "services.skill_management_service.SkillManagementService._load_assistant_tool_file_bytes", + return_value=b"pdf bytes", + ), + patch( + "services.skill_management_service.SkillManagementService._extract_pdf_text", + return_value="Wang Lei\nAlgorithm Engineer", + ), + ): + context = SkillManagementService._build_assistant_attachment_context( + tenant_id=TENANT, + attachments=[attachment], + ) + + assert "--- resume.pdf (application/pdf, 166035 bytes) ---" in context + assert "Wang Lei\nAlgorithm Engineer" in context + assert "Binary attachment available" not in context + + +def _zip_payload(files: dict[str, str]) -> bytes: + buffer = io.BytesIO() + with zipfile.ZipFile(buffer, "w") as archive: + for path, content in files.items(): + archive.writestr(path, content) + return buffer.getvalue() + + +def test_build_assistant_attachment_context_extracts_docx_text() -> None: + attachment = SkillAssistAttachmentPayload( + tool_file_id="docx-file-1", + name="guide.docx", + mime_type="application/vnd.openxmlformats-officedocument.wordprocessingml.document", + size=123, + ) + payload = _zip_payload( + { + "word/document.xml": ( + '' + "Escalate urgent tickets" + "" + ) + } + ) + + with patch( + "services.skill_management_service.SkillManagementService._load_assistant_tool_file_bytes", + return_value=payload, + ): + context = SkillManagementService._build_assistant_attachment_context( + tenant_id=TENANT, + attachments=[attachment], + ) + + assert "--- guide.docx" in context + assert "Escalate urgent tickets" in context + assert "Binary attachment available" not in context + + +def test_build_assistant_attachment_context_extracts_xlsx_text() -> None: + attachment = SkillAssistAttachmentPayload( + tool_file_id="xlsx-file-1", + name="forecast.xlsx", + mime_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + size=456, + ) + payload = _zip_payload( + { + "xl/sharedStrings.xml": ( + '' + "Forecast Q1" + "" + ), + "xl/worksheets/sheet1.xml": ( + '' + '042' + "" + ), + } + ) + + with patch( + "services.skill_management_service.SkillManagementService._load_assistant_tool_file_bytes", + return_value=payload, + ): + context = SkillManagementService._build_assistant_attachment_context( + tenant_id=TENANT, + attachments=[attachment], + ) + + assert "--- forecast.xlsx" in context + assert "Forecast Q1" in context + assert "42" in context + assert "Binary attachment available" not in context + + +def test_build_assistant_attachment_context_extracts_pptx_text() -> None: + attachment = SkillAssistAttachmentPayload( + tool_file_id="pptx-file-1", + name="playbook.pptx", + mime_type="application/vnd.openxmlformats-officedocument.presentationml.presentation", + size=789, + ) + payload = _zip_payload( + { + "ppt/slides/slide1.xml": ( + '' + "Quarterly enablement plan" + "" + ) + } + ) + + with patch( + "services.skill_management_service.SkillManagementService._load_assistant_tool_file_bytes", + return_value=payload, + ): + context = SkillManagementService._build_assistant_attachment_context( + tenant_id=TENANT, + attachments=[attachment], + ) + + assert "--- playbook.pptx" in context + assert "Quarterly enablement plan" in context + assert "Binary attachment available" not in context + + +def test_build_assistant_attachment_context_extracts_rtf_text() -> None: + attachment = SkillAssistAttachmentPayload( + tool_file_id="rtf-file-1", + name="notes.rtf", + mime_type="application/rtf", + size=74, + ) + + with patch( + "services.skill_management_service.SkillManagementService._load_assistant_tool_file_bytes", + return_value=b"{\\rtf1\\ansi Skill Builder\\par reads RTF notes.}", + ): + context = SkillManagementService._build_assistant_attachment_context( + tenant_id=TENANT, + attachments=[attachment], + ) + + assert "--- notes.rtf" in context + assert "Skill Builder" in context + assert "reads RTF notes." in context + assert "Binary attachment available" not in context + + def test_build_assistant_image_contents_encodes_images_for_vision_models() -> None: attachments = [ SkillAssistAttachmentPayload( @@ -2996,6 +3171,62 @@ def test_runtime_agent_skills_use_published_identity_when_draft_metadata_changed ] +def test_agent_skill_binding_changes_require_agent_publish_before_runtime_load() -> None: + service = SkillManagementService(tool_file_manager=_FakeToolFileManager()) + created = service.create_skill( + tenant_id=TENANT, + user_id=USER, + payload=SkillCreatePayload(name="finance-sop", description="Finance SOP"), + ) + service.replace_draft_tree( + tenant_id=TENANT, + user_id=USER, + skill_id=created["id"], + payload=SkillDraftTreePayload(files=[{"path": "SKILL.md", "content": _skill_md()}]), + ) + service.publish_skill(tenant_id=TENANT, user_id=USER, skill_id=created["id"], payload=SkillPublishPayload()) + with session_factory.create_session() as session: + agent = session.get(Agent, AGENT) + assert agent is not None + snapshot = AgentConfigSnapshot( + tenant_id=TENANT, + agent_id=AGENT, + version=1, + config_snapshot=AgentSoulConfig(), + created_by=USER, + ) + session.add(snapshot) + session.flush() + agent.active_config_snapshot_id = snapshot.id + agent.active_config_is_published = True + session.commit() + + service.replace_agent_bindings(tenant_id=TENANT, user_id=USER, agent_id=AGENT, skill_ids=[created["id"]]) + with session_factory.create_session() as session: + agent = session.get(Agent, AGENT) + assert agent is not None + assert agent.active_config_is_published is False + + assert service.list_runtime_agent_skills(tenant_id=TENANT, agent_id=AGENT) == [] + + with session_factory.create_session() as session: + agent = session.get(Agent, AGENT) + assert agent is not None + agent.active_config_is_published = True + snapshot_id = agent.active_config_snapshot_id + assert snapshot_id is not None + session.commit() + + service.publish_agent_bindings( + tenant_id=TENANT, + agent_id=AGENT, + snapshot_id=snapshot_id, + user_id=USER, + ) + + assert service.list_runtime_agent_skills(tenant_id=TENANT, agent_id=AGENT)[0]["name"] == "finance-sop" + + def test_runtime_agent_skill_pull_normalizes_archive_identity_to_published_metadata() -> None: archive_buffer = io.BytesIO() with zipfile.ZipFile(archive_buffer, "w") as archive: diff --git a/oxlint-suppressions.json b/oxlint-suppressions.json index e87d2cd9aab..4e744a0a88d 100644 --- a/oxlint-suppressions.json +++ b/oxlint-suppressions.json @@ -59,19 +59,6 @@ "count": 3 } }, - "web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/time-range-picker/date-picker.tsx": { - "jsx_a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 - } - }, - "web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/tracing/field.tsx": { - "no-restricted-imports": { - "count": 1 - } - }, "web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/tracing/provider-panel.tsx": { "eslint-react/static-components": { "count": 2 @@ -94,12 +81,6 @@ "web/app/(shareLayout)/webapp-reset-password/check-code/page.tsx": { "no-restricted-imports": { "count": 1 - }, - "jsx_a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 } }, "web/app/(shareLayout)/webapp-reset-password/layout.tsx": { @@ -115,12 +96,6 @@ "web/app/(shareLayout)/webapp-signin/check-code/page.tsx": { "no-restricted-imports": { "count": 1 - }, - "jsx_a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 } }, "web/app/(shareLayout)/webapp-signin/components/mail-and-code-auth.tsx": { @@ -128,14 +103,6 @@ "count": 1 } }, - "web/app/(shareLayout)/webapp-signin/components/mail-and-password-auth.tsx": { - "jsx_a11y/tabindex-no-positive": { - "count": 3 - }, - "no-restricted-imports": { - "count": 1 - } - }, "web/app/(shareLayout)/webapp-signin/normalForm.tsx": { "jsx-a11y/click-events-have-key-events": { "count": 2 @@ -163,24 +130,6 @@ "count": 1 } }, - "web/app/components/app-sidebar/app-info/app-info-modals.tsx": { - "no-restricted-imports": { - "count": 1 - } - }, - "web/app/components/app-sidebar/app-info/app-operations.tsx": { - "eslint-react/set-state-in-effect": { - "count": 4 - } - }, - "web/app/components/app-sidebar/dataset-info/menu-item.tsx": { - "jsx_a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 - } - }, "web/app/components/app/annotation/add-annotation-modal/edit-item/index.tsx": { "erasable-syntax-only/enums": { "count": 1 @@ -280,14 +229,6 @@ "count": 1 } }, - "web/app/components/app/app-publisher/sections.tsx": { - "jsx_a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 - } - }, "web/app/components/app/configuration/config-prompt/__tests__/index.spec.tsx": { "jsx-a11y/click-events-have-key-events": { "count": 1 @@ -458,11 +399,6 @@ "count": 1 } }, - "web/app/components/app/configuration/debug/__tests__/index.spec.tsx": { - "typescript/no-explicit-any": { - "count": 1 - } - }, "web/app/components/app/configuration/debug/chat-user-input.tsx": { "jsx-a11y/no-autofocus": { "count": 2 @@ -494,9 +430,6 @@ "web/app/components/app/configuration/debug/hooks.tsx": { "typescript/no-explicit-any": { "count": 3 - }, - "no-restricted-globals": { - "count": 2 } }, "web/app/components/app/configuration/debug/index.tsx": { @@ -546,11 +479,6 @@ "count": 5 } }, - "web/app/components/app/log/model-info.tsx": { - "typescript/no-explicit-any": { - "count": 2 - } - }, "web/app/components/app/log/var-panel.tsx": { "jsx-a11y/click-events-have-key-events": { "count": 2 @@ -567,14 +495,6 @@ "count": 1 } }, - "web/app/components/app/overview/app-card-sections.tsx": { - "jsx_a11y/click-events-have-key-events": { - "count": 2 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 2 - } - }, "web/app/components/app/overview/workflow-hidden-input-fields.tsx": { "no-restricted-imports": { "count": 1 @@ -613,19 +533,6 @@ "count": 2 } }, - "web/app/components/apps/import-from-marketplace-template-modal.tsx": { - "jsx-a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx-a11y/no-static-element-interactions": { - "count": 1 - } - }, - "web/app/components/base/action-button/index.tsx": { - "erasable-syntax-only/enums": { - "count": 1 - } - }, "web/app/components/base/agent-log-modal/detail.tsx": { "typescript/no-explicit-any": { "count": 1 @@ -756,14 +663,6 @@ "count": 3 } }, - "web/app/components/base/chat/chat-with-history/sidebar/__tests__/operation.spec.tsx": { - "jsx_a11y/click-events-have-key-events": { - "count": 2 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 2 - } - }, "web/app/components/base/chat/chat-with-history/sidebar/item.tsx": { "jsx-a11y/click-events-have-key-events": { "count": 2 @@ -782,30 +681,6 @@ "count": 1 } }, - "web/app/components/base/chat/chat/answer/human-input-content/content-wrapper.tsx": { - "jsx_a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 - } - }, - "web/app/components/base/chat/chat/answer/suggested-questions.tsx": { - "jsx_a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 - } - }, - "web/app/components/base/chat/chat/answer/tool-detail.tsx": { - "jsx_a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 - } - }, "web/app/components/base/chat/chat/answer/workflow-process.tsx": { "eslint-react/set-state-in-effect": { "count": 1 @@ -819,12 +694,6 @@ "web/app/components/base/chat/chat/citation/index.tsx": { "eslint-react/set-state-in-effect": { "count": 1 - }, - "jsx_a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 } }, "web/app/components/base/chat/chat/hooks.ts": { @@ -1036,12 +905,6 @@ "web/app/components/base/file-uploader/audio-preview.tsx": { "jsx-a11y/media-has-caption": { "count": 1 - }, - "jsx-a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 } }, "web/app/components/base/file-uploader/dynamic-pdf-preview.tsx": { @@ -1062,14 +925,6 @@ "count": 1 } }, - "web/app/components/base/file-uploader/file-uploader-in-chat-input/file-image-item.tsx": { - "jsx_a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 - } - }, "web/app/components/base/file-uploader/file-uploader-in-chat-input/file-item.tsx": { "jsx-a11y/click-events-have-key-events": { "count": 1 @@ -1093,14 +948,6 @@ "count": 2 } }, - "web/app/components/base/file-uploader/pdf-preview.tsx": { - "jsx_a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 - } - }, "web/app/components/base/file-uploader/store.tsx": { "react/only-export-components": { "count": 4 @@ -1122,12 +969,6 @@ "web/app/components/base/file-uploader/video-preview.tsx": { "jsx-a11y/media-has-caption": { "count": 1 - }, - "jsx-a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 } }, "web/app/components/base/form/components/base/base-field.tsx": { @@ -1219,19 +1060,9 @@ "count": 2 } }, - "web/app/components/base/icons/src/public/billing/index.ts": { - "no-barrel-files/no-barrel-files": { - "count": 4 - } - }, "web/app/components/base/icons/src/public/common/index.ts": { "no-barrel-files/no-barrel-files": { - "count": 6 - } - }, - "web/app/components/base/icons/src/public/education/index.ts": { - "no-barrel-files/no-barrel-files": { - "count": 1 + "count": 5 } }, "web/app/components/base/icons/src/public/files/index.ts": { @@ -1251,7 +1082,7 @@ }, "web/app/components/base/icons/src/public/knowledge/online-drive/index.ts": { "no-barrel-files/no-barrel-files": { - "count": 3 + "count": 2 } }, "web/app/components/base/icons/src/public/llm/index.ts": { @@ -1261,7 +1092,7 @@ }, "web/app/components/base/icons/src/public/other/index.ts": { "no-barrel-files/no-barrel-files": { - "count": 6 + "count": 4 } }, "web/app/components/base/icons/src/public/tracing/index.ts": { @@ -1286,7 +1117,7 @@ }, "web/app/components/base/icons/src/vender/line/arrows/index.ts": { "no-barrel-files/no-barrel-files": { - "count": 5 + "count": 4 } }, "web/app/components/base/icons/src/vender/line/communication/index.ts": { @@ -1336,7 +1167,7 @@ }, "web/app/components/base/icons/src/vender/line/others/index.ts": { "no-barrel-files/no-barrel-files": { - "count": 7 + "count": 5 } }, "web/app/components/base/icons/src/vender/line/time/index.ts": { @@ -1356,7 +1187,7 @@ }, "web/app/components/base/icons/src/vender/plugin/index.ts": { "no-barrel-files/no-barrel-files": { - "count": 3 + "count": 2 } }, "web/app/components/base/icons/src/vender/solid/FinanceAndECommerce/index.ts": { @@ -1479,9 +1310,6 @@ }, "typescript/no-explicit-any": { "count": 1 - }, - "jsx-a11y/click-events-have-key-events": { - "count": 1 } }, "web/app/components/base/image-uploader/utils.ts": { @@ -1843,14 +1671,6 @@ "count": 1 } }, - "web/app/components/base/qrcode/index.tsx": { - "jsx_a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 - } - }, "web/app/components/base/search-input/index.stories.tsx": { "jsx-a11y/label-has-associated-control": { "count": 3 @@ -1864,14 +1684,6 @@ "count": 1 } }, - "web/app/components/base/tab-slider-new/index.tsx": { - "jsx_a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 - } - }, "web/app/components/base/tab-slider-plain/index.tsx": { "jsx-a11y/click-events-have-key-events": { "count": 1 @@ -1939,43 +1751,7 @@ }, "web/app/components/billing/plan/assets/index.tsx": { "no-barrel-files/no-barrel-files": { - "count": 4 - } - }, - "web/app/components/billing/pricing/assets/index.tsx": { - "no-barrel-files/no-barrel-files": { - "count": 12 - } - }, - "web/app/components/billing/pricing/plan-switcher/plan-range-switcher.tsx": { - "erasable-syntax-only/enums": { - "count": 1 - }, - "react/only-export-components": { - "count": 1 - } - }, - "web/app/components/billing/pricing/plan-switcher/tab.tsx": { - "jsx_a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 - } - }, - "web/app/components/billing/pricing/plans/self-hosted-plan-item/button.tsx": { - "eslint-react/static-components": { - "count": 2 - } - }, - "web/app/components/billing/pricing/types.ts": { - "erasable-syntax-only/enums": { - "count": 1 - } - }, - "web/app/components/billing/type.ts": { - "erasable-syntax-only/enums": { - "count": 4 + "count": 3 } }, "web/app/components/datasets/chunk.tsx": { @@ -2556,16 +2332,6 @@ "count": 2 } }, - "web/app/components/datasets/metadata/metadata-dataset/create-content.tsx": { - "no-restricted-imports": { - "count": 1 - } - }, - "web/app/components/datasets/metadata/metadata-dataset/dataset-metadata-drawer.tsx": { - "no-restricted-imports": { - "count": 1 - } - }, "web/app/components/datasets/metadata/metadata-document/info-group.tsx": { "no-restricted-globals": { "count": 1 @@ -2724,22 +2490,6 @@ "count": 5 } }, - "web/app/components/header/account-setting/model-provider-page/model-parameter-modal/model-display.tsx": { - "typescript/no-explicit-any": { - "count": 1 - } - }, - "web/app/components/header/account-setting/model-provider-page/model-parameter-modal/status-indicators.tsx": { - "jsx_a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 - }, - "typescript/no-explicit-any": { - "count": 1 - } - }, "web/app/components/header/account-setting/model-provider-page/provider-added-card/cooldown-timer.tsx": { "eslint-react/set-state-in-effect": { "count": 1 @@ -2857,11 +2607,8 @@ "count": 1 } }, - "web/app/components/plugins/marketplace/list/list-with-collection.tsx": { - "jsx-a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx-a11y/no-static-element-interactions": { + "web/app/components/plugins/marketplace/utils.ts": { + "no-unused-vars": { "count": 1 } }, @@ -2950,11 +2697,6 @@ "count": 1 } }, - "web/app/components/plugins/plugin-detail-panel/model-selector/index.tsx": { - "typescript/no-explicit-any": { - "count": 3 - } - }, "web/app/components/plugins/plugin-detail-panel/model-selector/tts-params-panel.tsx": { "typescript/no-explicit-any": { "count": 1 @@ -3362,14 +3104,6 @@ "count": 1 } }, - "web/app/components/tools/provider/tool-item.tsx": { - "jsx_a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 - } - }, "web/app/components/tools/setting/build-in/config-credentials.tsx": { "typescript/no-explicit-any": { "count": 3 @@ -3383,22 +3117,6 @@ "count": 4 } }, - "web/app/components/tools/workflow-tool/__tests__/configure-button.spec.tsx": { - "jsx_a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 - } - }, - "web/app/components/tools/workflow-tool/configure-button.tsx": { - "jsx_a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 - } - }, "web/app/components/tools/workflow-tool/index.tsx": { "no-restricted-imports": { "count": 1 @@ -3479,13 +3197,13 @@ }, "web/app/components/workflow/comment/mention-input.tsx": { "jsx-a11y/click-events-have-key-events": { - "count": 3 + "count": 1 }, "jsx-a11y/no-autofocus": { "count": 1 }, "jsx-a11y/no-static-element-interactions": { - "count": 3 + "count": 1 } }, "web/app/components/workflow/context.tsx": { @@ -3835,11 +3553,6 @@ "count": 31 } }, - "web/app/components/workflow/nodes/_base/components/variable/var-list.tsx": { - "no-restricted-imports": { - "count": 1 - } - }, "web/app/components/workflow/nodes/_base/components/variable/var-reference-picker.trigger.tsx": { "jsx-a11y/click-events-have-key-events": { "count": 3 @@ -4372,11 +4085,6 @@ "count": 3 } }, - "web/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-config.tsx": { - "erasable-syntax-only/enums": { - "count": 1 - } - }, "web/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-generator/assets/index.tsx": { "no-barrel-files/no-barrel-files": { "count": 2 @@ -4452,12 +4160,6 @@ "web/app/components/workflow/nodes/loop/components/loop-variables/item.tsx": { "typescript/no-explicit-any": { "count": 4 - }, - "jsx-a11y/no-autofocus": { - "count": 1 - }, - "no-restricted-imports": { - "count": 1 } }, "web/app/components/workflow/nodes/loop/panel.tsx": { @@ -4497,9 +4199,6 @@ "web/app/components/workflow/nodes/parameter-extractor/components/extract-parameter/update.tsx": { "typescript/no-explicit-any": { "count": 1 - }, - "no-restricted-imports": { - "count": 1 } }, "web/app/components/workflow/nodes/parameter-extractor/types.ts": { @@ -4555,22 +4254,6 @@ "count": 5 } }, - "web/app/components/workflow/nodes/tool/components/__tests__/copy-id.spec.tsx": { - "jsx_a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 - } - }, - "web/app/components/workflow/nodes/tool/components/copy-id.tsx": { - "jsx_a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 - } - }, "web/app/components/workflow/nodes/tool/components/mixed-variable-text-input/index.tsx": { "typescript/no-explicit-any": { "count": 1 @@ -4842,14 +4525,6 @@ "count": 1 } }, - "web/app/components/workflow/panel/chat-variable-panel/index.tsx": { - "jsx_a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 - } - }, "web/app/components/workflow/panel/chat-variable-panel/type.ts": { "erasable-syntax-only/enums": { "count": 1 @@ -4886,14 +4561,6 @@ "count": 11 } }, - "web/app/components/workflow/panel/debug-and-preview/index.tsx": { - "jsx_a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 - } - }, "web/app/components/workflow/panel/debug-and-preview/user-input.tsx": { "jsx-a11y/no-autofocus": { "count": 1 @@ -4934,30 +4601,6 @@ "count": 4 } }, - "web/app/components/workflow/panel/version-history-panel/filter/filter-item.tsx": { - "jsx_a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 - } - }, - "web/app/components/workflow/panel/version-history-panel/index.tsx": { - "jsx_a11y/click-events-have-key-events": { - "count": 2 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 2 - } - }, - "web/app/components/workflow/panel/version-history-panel/version-history-item.tsx": { - "jsx_a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 - } - }, "web/app/components/workflow/panel/workflow-preview.tsx": { "jsx-a11y/click-events-have-key-events": { "count": 4 @@ -5284,25 +4927,6 @@ "count": 1 } }, - "web/app/education-apply/role-selector.tsx": { - "jsx_a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 - } - }, - "web/app/education-apply/search-input.tsx": { - "jsx_a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 - }, - "no-restricted-imports": { - "count": 1 - } - }, "web/app/forgot-password/ChangePasswordForm.tsx": { "no-restricted-imports": { "count": 1 @@ -5331,12 +4955,6 @@ "web/app/reset-password/check-code/page.tsx": { "no-restricted-imports": { "count": 1 - }, - "jsx_a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 } }, "web/app/reset-password/layout.tsx": { @@ -5359,17 +4977,6 @@ "count": 1 } }, - "web/app/signup/check-code/page.tsx": { - "jsx_a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 - }, - "no-restricted-imports": { - "count": 1 - } - }, "web/app/signup/layout.tsx": { "typescript/no-explicit-any": { "count": 1 @@ -5537,11 +5144,6 @@ "count": 3 } }, - "web/service/billing.ts": { - "no-restricted-imports": { - "count": 1 - } - }, "web/service/common.ts": { "no-restricted-imports": { "count": 1 @@ -5566,11 +5168,6 @@ "count": 6 } }, - "web/service/fetch.spec.ts": { - "no-restricted-imports": { - "count": 1 - } - }, "web/service/fetch.ts": { "no-restricted-imports": { "count": 1 @@ -5790,4 +5387,4 @@ "count": 2 } } -} +} \ No newline at end of file diff --git a/packages/contracts/generated/api/console/tags/types.gen.ts b/packages/contracts/generated/api/console/tags/types.gen.ts index 64cccc6dd64..85d0770c988 100644 --- a/packages/contracts/generated/api/console/tags/types.gen.ts +++ b/packages/contracts/generated/api/console/tags/types.gen.ts @@ -29,7 +29,7 @@ export type GetTagsData = { path?: never query: { keyword?: string - type: TagType + type: 'app' | 'knowledge' | 'skill' | 'snippet' } url: '/tags' } diff --git a/packages/contracts/generated/api/console/tags/zod.gen.ts b/packages/contracts/generated/api/console/tags/zod.gen.ts index a858767e81c..10327bc57ff 100644 --- a/packages/contracts/generated/api/console/tags/zod.gen.ts +++ b/packages/contracts/generated/api/console/tags/zod.gen.ts @@ -41,7 +41,7 @@ export const zTagBasePayload = z.object({ export const zGetTagsQuery = z.object({ keyword: z.string().optional(), - type: zTagType, + type: z.enum(['app', 'knowledge', 'skill', 'snippet']), }) /** diff --git a/packages/contracts/generated/api/console/workspaces/zod.gen.ts b/packages/contracts/generated/api/console/workspaces/zod.gen.ts index 0f01cad9f9b..fa7e8ee27c4 100644 --- a/packages/contracts/generated/api/console/workspaces/zod.gen.ts +++ b/packages/contracts/generated/api/console/workspaces/zod.gen.ts @@ -802,28 +802,6 @@ export const zSwitchWorkspacePayload = z.object({ tenant_id: z.string(), }) -/** - * TenantListItemResponse - */ -export const zCloudPlan = z.enum(['professional', 'sandbox', 'team']) - -export const zTenantListItemResponse = z.object({ - created_at: z.int().nullish(), - current: z.boolean(), - id: z.string(), - last_opened_at: z.int().nullish(), - name: z.string().nullish(), - plan: zCloudPlan.nullish(), - status: z.string().nullish(), -}) - -/** - * TenantListResponse - */ -export const zTenantListResponse = z.object({ - workspaces: z.array(zTenantListItemResponse), -}) - /** * AgentSkillBindingItemResponse */ @@ -1613,6 +1591,37 @@ export const zSkillReferenceListResponse = z.object({ data: z.array(zSkillReferenceResponse).optional(), }) +/** + * CloudPlan + * + * Enum representing user plan types in the cloud platform. + * + * SANDBOX: Free/default plan with limited features + * PROFESSIONAL: Professional paid plan + * TEAM: Team collaboration paid plan + */ +export const zCloudPlan = z.enum(['professional', 'sandbox', 'team']) + +/** + * TenantListItemResponse + */ +export const zTenantListItemResponse = z.object({ + created_at: z.int().nullish(), + current: z.boolean(), + id: z.string(), + last_opened_at: z.int().nullish(), + name: z.string().nullish(), + plan: zCloudPlan.nullish(), + status: z.string().nullish(), +}) + +/** + * TenantListResponse + */ +export const zTenantListResponse = z.object({ + workspaces: z.array(zTenantListItemResponse), +}) + /** * TenantAccountRole */ diff --git a/web/app/(commonLayout)/skills/page.tsx b/web/app/(commonLayout)/skills/page.tsx index f0ab9d910d1..b4a320c5aa7 100644 --- a/web/app/(commonLayout)/skills/page.tsx +++ b/web/app/(commonLayout)/skills/page.tsx @@ -1,5 +1,10 @@ +import { getRouteMetadata } from '@/app/route-metadata' import SkillsPage from '@/features/skills/page' +export function generateMetadata() { + return getRouteMetadata('skill', ($) => $['skillManagement.title']) +} + export default function Page() { return } diff --git a/web/app/components/main-nav/__tests__/index.spec.tsx b/web/app/components/main-nav/__tests__/index.spec.tsx index bd47e1f942d..10fce19ce42 100644 --- a/web/app/components/main-nav/__tests__/index.spec.tsx +++ b/web/app/components/main-nav/__tests__/index.spec.tsx @@ -16,7 +16,7 @@ import type { ProviderContextState } from '@/context/provider-context' import type { UserProfileWithMeta } from '@/features/account-profile/client' import type { ConsoleStateFixture } from '@/test/console/state-fixture' import { Dialog, DialogContent, DialogTitle } from '@langgenius/dify-ui/dialog' -import { act, fireEvent, screen, waitFor } from '@testing-library/react' +import { act, fireEvent, screen, waitFor, within } from '@testing-library/react' import userEvent from '@testing-library/user-event' import { createStore, Provider as JotaiProvider } from 'jotai' import { queryClientAtom } from 'jotai-tanstack-query' diff --git a/web/app/components/plugins/marketplace/creator-profile/creator-content.tsx b/web/app/components/plugins/marketplace/creator-profile/creator-content.tsx index ec5d95d5c88..8665049314f 100644 --- a/web/app/components/plugins/marketplace/creator-profile/creator-content.tsx +++ b/web/app/components/plugins/marketplace/creator-profile/creator-content.tsx @@ -91,7 +91,7 @@ export default function CreatorContent({ creations, getCreationAction }: Creator value={sortField} diff --git a/web/app/components/plugins/marketplace/creator-profile/publisher-avatar.tsx b/web/app/components/plugins/marketplace/creator-profile/publisher-avatar.tsx index 73ca25b9ca6..2776410cd51 100644 --- a/web/app/components/plugins/marketplace/creator-profile/publisher-avatar.tsx +++ b/web/app/components/plugins/marketplace/creator-profile/publisher-avatar.tsx @@ -13,7 +13,8 @@ type PublisherAvatarProps = { } // Keep in sync with Creator Center `components/ui/avatar.tsx`. -const DEFAULT_AVATAR_BG = 'linear-gradient(135deg, rgba(255,255,255,0.12) 0%, rgba(255,255,255,0.08) 100%), linear-gradient(90deg, #155aef 0%, #155aef 100%)' +const DEFAULT_AVATAR_BG = + 'linear-gradient(135deg, rgba(255,255,255,0.12) 0%, rgba(255,255,255,0.08) 100%), linear-gradient(90deg, #155aef 0%, #155aef 100%)' const DEFAULT_AVATAR_LETTER_STYLE: CSSProperties = { color: '#FFFFFF', @@ -23,10 +24,8 @@ const DEFAULT_AVATAR_LETTER_STYLE: CSSProperties = { } function getFallbackTextClass(size: number) { - if (size <= 32) - return 'text-xs' - if (size <= 50) - return 'text-base' + if (size <= 32) return 'text-xs' + if (size <= 50) return 'text-base' return 'text-[40px]' } diff --git a/web/app/components/plugins/marketplace/home/catalog-languages-filter.tsx b/web/app/components/plugins/marketplace/home/catalog-languages-filter.tsx index 6a36212da05..eae77708b2e 100644 --- a/web/app/components/plugins/marketplace/home/catalog-languages-filter.tsx +++ b/web/app/components/plugins/marketplace/home/catalog-languages-filter.tsx @@ -41,8 +41,8 @@ export default function CatalogLanguagesFilter() { }, [selectedCount]) const handleLanguagesChange = (next: string[]) => { - const addedLanguage = next.find(language => !languages.includes(language)) - const removedLanguage = languages.find(language => !next.includes(language)) + const addedLanguage = next.find((language) => !languages.includes(language)) + const removedLanguage = languages.find((language) => !next.includes(language)) markMarketplaceSiteFilter({ filter_type: 'language', selection_mode: 'multi', @@ -126,7 +126,7 @@ export default function CatalogLanguagesFilter() { placement="bottom-end" sideOffset={4} alignOffset={-6} - popupClassName="border-none bg-transparent shadow-none" + className="border-none bg-transparent shadow-none" >
diff --git a/web/app/components/plugins/marketplace/home/home-catalog-focus.ts b/web/app/components/plugins/marketplace/home/home-catalog-focus.ts index 4925837ba5b..47614c6ce8b 100644 --- a/web/app/components/plugins/marketplace/home/home-catalog-focus.ts +++ b/web/app/components/plugins/marketplace/home/home-catalog-focus.ts @@ -13,8 +13,9 @@ export const getFocusedCatalogTabHref = (slot: HomeCatalogTabSlot) => { export const focusCatalogTab = (slot: HomeCatalogTabSlot, href: string) => { const slotElement = getCatalogTabSlot(slot) - const matchingLink = Array.from(slotElement?.querySelectorAll('a[href]') ?? []) - .find(link => link.getAttribute('href') === href) + const matchingLink = Array.from( + slotElement?.querySelectorAll('a[href]') ?? [], + ).find((link) => link.getAttribute('href') === href) matchingLink?.focus({ preventScroll: true }) } diff --git a/web/app/components/plugins/marketplace/home/home-catalog-navigation.tsx b/web/app/components/plugins/marketplace/home/home-catalog-navigation.tsx index 28f75b772b8..46aa76f66fe 100644 --- a/web/app/components/plugins/marketplace/home/home-catalog-navigation.tsx +++ b/web/app/components/plugins/marketplace/home/home-catalog-navigation.tsx @@ -109,7 +109,7 @@ function HomeCatalogNavigation({ >
- {catalogLeading && ( + {catalogLeading ? ( <>
{catalogLeading}
- )} + ) : null}
{catalogCategories ?? }
- {catalogTrailing &&
{catalogTrailing}
} + {catalogTrailing ?
{catalogTrailing}
: null}
diff --git a/web/app/components/plugins/marketplace/home/home-sticky-state-provider.tsx b/web/app/components/plugins/marketplace/home/home-sticky-state-provider.tsx index 365d81061cc..436a89707b6 100644 --- a/web/app/components/plugins/marketplace/home/home-sticky-state-provider.tsx +++ b/web/app/components/plugins/marketplace/home/home-sticky-state-provider.tsx @@ -21,10 +21,7 @@ export function HomeStickyCatalogTabs({ children }: { children: ReactNode }) { return (
diff --git a/web/app/components/plugins/marketplace/home/home-trending-track.spec.ts b/web/app/components/plugins/marketplace/home/home-trending-track.spec.ts index d936069bc91..9cb7d8c7261 100644 --- a/web/app/components/plugins/marketplace/home/home-trending-track.spec.ts +++ b/web/app/components/plugins/marketplace/home/home-trending-track.spec.ts @@ -16,11 +16,13 @@ const recommendBanner: PluginBanner = { describe('buildMarketplaceBannerClickProperties', () => { it('maps a recommendation card click to the site-event payload', () => { - expect(buildMarketplaceBannerClickProperties(recommendBanner, { - item_id: 'langgenius/dropbox', - item_type: 'plugin', - link: '/plugin/langgenius/dropbox', - })).toEqual({ + expect( + buildMarketplaceBannerClickProperties(recommendBanner, { + item_id: 'langgenius/dropbox', + item_type: 'plugin', + link: '/plugin/langgenius/dropbox', + }), + ).toEqual({ banner_id: 'banner-recommend', title: 'Trending', theme_type: 'most_popular', @@ -34,14 +36,19 @@ describe('buildMarketplaceBannerClickProperties', () => { }) it('maps newest recommendation theme to new_arrivals', () => { - expect(buildMarketplaceBannerClickProperties({ - ...recommendBanner, - content: { theme_type: 'newest', cards: [] }, - }, { - item_id: 'tpl-1', - item_type: 'template', - link: '/templates?tid=tpl-1', - })).toMatchObject({ + expect( + buildMarketplaceBannerClickProperties( + { + ...recommendBanner, + content: { theme_type: 'newest', cards: [] }, + }, + { + item_id: 'tpl-1', + item_type: 'template', + link: '/templates?tid=tpl-1', + }, + ), + ).toMatchObject({ theme_type: 'new_arrivals', click_target: 'recommendation', item_id: 'tpl-1', @@ -50,18 +57,20 @@ describe('buildMarketplaceBannerClickProperties', () => { }) it('reports blog frame clicks with target_type and without card fields', () => { - expect(buildMarketplaceBannerClickProperties({ - id: 'banner-blog', - style_type: 'blog', - title: 'Dify Updates', - sort: 1, - language: 'zh', - content: { - blog_title: 'Launch', - link: 'https://dify.ai/blog', - link_target_type: 'github', - }, - })).toEqual({ + expect( + buildMarketplaceBannerClickProperties({ + id: 'banner-blog', + style_type: 'blog', + title: 'Dify Updates', + sort: 1, + language: 'zh', + content: { + blog_title: 'Launch', + link: 'https://dify.ai/blog', + link_target_type: 'github', + }, + }), + ).toEqual({ banner_id: 'banner-blog', title: 'Dify Updates', click_target: 'blog', @@ -73,18 +82,20 @@ describe('buildMarketplaceBannerClickProperties', () => { }) it('reports event frame clicks with activity_id only', () => { - expect(buildMarketplaceBannerClickProperties({ - id: 'banner-event', - style_type: 'event', - title: 'Meetup', - sort: 2, - language: 'ja', - content: { - images: { desktop: '/event.png' }, - link: 'https://dify.ai/events', - activity_id: 'act-1', - }, - })).toEqual({ + expect( + buildMarketplaceBannerClickProperties({ + id: 'banner-event', + style_type: 'event', + title: 'Meetup', + sort: 2, + language: 'ja', + content: { + images: { desktop: '/event.png' }, + link: 'https://dify.ai/events', + activity_id: 'act-1', + }, + }), + ).toEqual({ banner_id: 'banner-event', title: 'Meetup', click_target: 'event', @@ -96,19 +107,21 @@ describe('buildMarketplaceBannerClickProperties', () => { }) it('reports ad frame clicks with partner and campaign ids', () => { - expect(buildMarketplaceBannerClickProperties({ - id: 'banner-ad', - style_type: 'ad', - title: 'Partner', - sort: 3, - language: 'en', - content: { - images: { desktop: '/ad.png' }, - link: 'https://partner.example', - partner_id: 'acme', - campaign_id: 'spring', - }, - })).toEqual({ + expect( + buildMarketplaceBannerClickProperties({ + id: 'banner-ad', + style_type: 'ad', + title: 'Partner', + sort: 3, + language: 'en', + content: { + images: { desktop: '/ad.png' }, + link: 'https://partner.example', + partner_id: 'acme', + campaign_id: 'spring', + }, + }), + ).toEqual({ banner_id: 'banner-ad', title: 'Partner', click_target: 'ad', diff --git a/web/app/components/plugins/marketplace/home/home-trending-track.ts b/web/app/components/plugins/marketplace/home/home-trending-track.ts index 6abc666c6dd..65b4321c230 100644 --- a/web/app/components/plugins/marketplace/home/home-trending-track.ts +++ b/web/app/components/plugins/marketplace/home/home-trending-track.ts @@ -20,8 +20,7 @@ export type MarketplaceBannerCardClick = Pick) => { const next: Record = {} for (const [key, value] of Object.entries(properties)) { - if (value !== undefined && value !== '') - next[key] = value + if (value !== undefined && value !== '') next[key] = value } return next } @@ -40,19 +39,17 @@ export const buildMarketplaceBannerClickProperties = ( link: cardClick?.link ?? (banner.style_type === 'recommend' ? undefined : banner.content.link), } - if (clickTarget === 'recommendation') { + if (banner.style_type === 'recommend') { properties.theme_type = THEME_TYPE_BY_BANNER[banner.content.theme_type] properties.item_id = cardClick?.item_id properties.item_type = cardClick?.item_type } - if (clickTarget === 'blog') - properties.target_type = banner.content.link_target_type + if (banner.style_type === 'blog') properties.target_type = banner.content.link_target_type - if (clickTarget === 'event') - properties.activity_id = banner.content.activity_id + if (banner.style_type === 'event') properties.activity_id = banner.content.activity_id - if (clickTarget === 'ad') { + if (banner.style_type === 'ad') { properties.partner_id = banner.content.partner_id properties.campaign_id = banner.content.campaign_id } diff --git a/web/app/components/plugins/marketplace/list/card-wrapper.tsx b/web/app/components/plugins/marketplace/list/card-wrapper.tsx index 49be67158ff..a6e989f4beb 100644 --- a/web/app/components/plugins/marketplace/list/card-wrapper.tsx +++ b/web/app/components/plugins/marketplace/list/card-wrapper.tsx @@ -11,9 +11,9 @@ import { useTags } from '@/app/components/plugins/hooks' import { useOptionalPluginInstallPermission } from '@/app/components/plugins/install-plugin/hooks/use-plugin-install-permission' import InstallFromMarketplace from '@/app/components/plugins/install-plugin/install-from-marketplace' import Link from '@/next/link' +import { trackMarketplaceSiteCardClick } from '@/utils/marketplace-site-track' import MarketplaceDetailDialog from '../detail-dialog' import { getPluginDetailLinkInMarketplace } from '../utils' -import { trackMarketplaceSiteCardClick } from '@/utils/marketplace-site-track' type CardWrapperProps = { plugin: Plugin diff --git a/web/app/components/plugins/marketplace/plugin-type-switch.tsx b/web/app/components/plugins/marketplace/plugin-type-switch.tsx index 59d77546efd..823d5542089 100644 --- a/web/app/components/plugins/marketplace/plugin-type-switch.tsx +++ b/web/app/components/plugins/marketplace/plugin-type-switch.tsx @@ -1,18 +1,12 @@ 'use client' import type { ActivePluginType } from './constants' import { cn } from '@langgenius/dify-ui/cn' -import { - RiBrain2Line, - RiDatabase2Line, - RiHammerLine, - RiPuzzle2Line, -} from '@remixicon/react' import { useSetAtom } from 'jotai' import { Fragment } from 'react' import { useTranslation } from '#i18n' import PluginIcon from '@/app/components/base/icons/src/vender/plugin/Plugin' -import { searchModeAtom, useActivePluginType } from './atoms' import { markMarketplaceSiteFilter } from '@/utils/marketplace-site-track' +import { searchModeAtom, useActivePluginType } from './atoms' import { PLUGIN_CATEGORY_WITH_COLLECTIONS, PLUGIN_TYPE_SEARCH_MAP } from './constants' import styles from './plugin-type-switch.module.css' @@ -43,19 +37,19 @@ const PluginTypeSwitch = ({ className, variant = 'default' }: PluginTypeSwitchPr { value: PLUGIN_TYPE_SEARCH_MAP.model, text: t(($) => $['category.models'], { ns: 'plugin' }), - icon: , + icon: , }, { value: PLUGIN_TYPE_SEARCH_MAP.tool, text: t(($) => $['category.tools'], { ns: 'plugin' }), - icon: , + icon: , }, { value: PLUGIN_TYPE_SEARCH_MAP.datasource, text: t(($) => $[isHome ? 'categorySingle.datasource' : 'category.datasources'], { ns: 'plugin', }), - icon: , + icon: , }, { value: PLUGIN_TYPE_SEARCH_MAP.agent, @@ -77,7 +71,7 @@ const PluginTypeSwitch = ({ className, variant = 'default' }: PluginTypeSwitchPr { value: PLUGIN_TYPE_SEARCH_MAP.extension, text: t(($) => $['category.extensions'], { ns: 'plugin' }), - icon: , + icon: , }, ] diff --git a/web/app/components/plugins/marketplace/search-box/tags-filter.tsx b/web/app/components/plugins/marketplace/search-box/tags-filter.tsx index 48d720b7195..fba271a5061 100644 --- a/web/app/components/plugins/marketplace/search-box/tags-filter.tsx +++ b/web/app/components/plugins/marketplace/search-box/tags-filter.tsx @@ -26,8 +26,8 @@ function TagsFilter({ tags, onTagsChange, usedInMarketplace = false }: TagsFilte ) const selectedTagsLength = tags.length const handleTagsChange = (nextTags: string[]) => { - const addedTag = nextTags.find(tag => !tags.includes(tag)) - const removedTag = tags.find(tag => !nextTags.includes(tag)) + const addedTag = nextTags.find((tag) => !tags.includes(tag)) + const removedTag = tags.find((tag) => !nextTags.includes(tag)) markMarketplaceSiteFilter({ filter_type: 'category', selection_mode: 'multi', diff --git a/web/app/components/plugins/marketplace/search-params.ts b/web/app/components/plugins/marketplace/search-params.ts index 1c22597c69f..2020ee27060 100644 --- a/web/app/components/plugins/marketplace/search-params.ts +++ b/web/app/components/plugins/marketplace/search-params.ts @@ -22,7 +22,7 @@ export const shouldSearchMarketplacePlugins = ({ category, q, tags }: Marketplac Boolean(q || tags.length > 0 || !PLUGIN_CATEGORY_WITH_COLLECTIONS.has(category)) export const getMarketplacePluginsSearchParams = ( - { category, q, tags }: MarketplaceSearchParams, + { category, q, tags }: Pick, sort: PluginsSort = DEFAULT_SORT, ): PluginsSearchParams => ({ query: q, diff --git a/web/features/agent-v2/agent-detail/configure/components/orchestrate/skills/__tests__/index.spec.tsx b/web/features/agent-v2/agent-detail/configure/components/orchestrate/skills/__tests__/index.spec.tsx index 70c0654483d..34c72fa00a9 100644 --- a/web/features/agent-v2/agent-detail/configure/components/orchestrate/skills/__tests__/index.spec.tsx +++ b/web/features/agent-v2/agent-detail/configure/components/orchestrate/skills/__tests__/index.spec.tsx @@ -129,6 +129,11 @@ vi.mock('@/service/client', () => ({ }, agent: { byAgentId: { + composer: { + get: { + key: vi.fn((_options: unknown): unknown[] => ['agent-composer']), + }, + }, config: { skills: { upload: { @@ -1303,9 +1308,7 @@ describe('AgentSkills', () => { }, }) }) - expect(toast.success).toHaveBeenCalledWith( - 'agentV2.agentDetail.configure.skills.workspaceSelector.removeSuccess', - ) + expect(toast.success).not.toHaveBeenCalled() }) it('should open workspace skill details in a new tab from the row menu', async () => { diff --git a/web/features/agent-v2/agent-detail/configure/components/orchestrate/skills/item.tsx b/web/features/agent-v2/agent-detail/configure/components/orchestrate/skills/item.tsx index aba384ae87e..80a00ff5e6c 100644 --- a/web/features/agent-v2/agent-detail/configure/components/orchestrate/skills/item.tsx +++ b/web/features/agent-v2/agent-detail/configure/components/orchestrate/skills/item.tsx @@ -155,7 +155,7 @@ export function AgentSkillItem({ > - + {!skill.isMissing && ( + + + Goto Anything + + + + ) +} + const mocks = vi.hoisted(() => ({ deleteSkillMutationFn: vi.fn(), downloadBlob: vi.fn(), @@ -115,10 +129,24 @@ vi.mock('@/app/components/header/account-setting/model-provider-page/hooks', () data: mocks.textGenerationModelList, isLoading: false, }), + useTextGenerationCurrentProviderAndModelAndModelList: () => ({ + currentProvider: mocks.textGenerationModelList[0], + currentModel: mocks.textGenerationModelList[0]?.models[0], + activeTextGenerationModelList: mocks.textGenerationModelList, + }), })) vi.mock('@/app/components/header/account-setting/model-provider-page/model-selector', () => ({ - default: () => , + ModelSelector: () => , + SplitModelSelector: () => , +})) + +vi.mock('@/service/use-common', async (importOriginal) => ({ + ...(await importOriginal()), + useModelParameterRules: () => ({ + data: { data: [] }, + isLoading: false, + }), })) vi.mock('@/app/components/workflow/nodes/_base/components/editor/code-editor', () => ({ @@ -650,7 +678,7 @@ async function openVersionRowActions( await user.click(actionButton) } -describe('SkillDetailPage', { timeout: 10000 }, () => { +describe('SkillDetailPage', () => { beforeEach(() => { vi.clearAllMocks() mocks.defaultTextGenerationModel = { @@ -841,7 +869,7 @@ describe('SkillDetailPage', { timeout: 10000 }, () => { expect(skillsLink).not.toHaveClass('flex-1') expect( screen.getByRole('button', { - name: 'skill.skillManagement.detail.searchFiles', + name: 'app.gotoAnything.searchTitle', }), ).toHaveClass('size-8', 'rounded-[10px]') expect(document.querySelector('.i-custom-vender-main-nav-skill')).toBeInTheDocument() @@ -1782,9 +1810,9 @@ describe('SkillDetailPage', { timeout: 10000 }, () => { expect(screen.getByText(/skill\.skillManagement\.detail\.saveFailed/)).toBeInTheDocument() }) - it('shows a save failure for non-conflict autosave errors', async () => { + it('stops autosaving unchanged content after a non-conflict save failure', async () => { const user = userEvent.setup() - mocks.saveDraftFileMutationFn.mockRejectedValueOnce(new Error('save failed')) + mocks.saveDraftFileMutationFn.mockRejectedValue(new Error('save failed')) renderSkillDetailPage() @@ -1802,7 +1830,20 @@ describe('SkillDetailPage', { timeout: 10000 }, () => { { timeout: 4000 }, ) expect(screen.getByText(/skill\.skillManagement\.detail\.saveFailed/)).toBeInTheDocument() - }) + + await act(async () => { + await new Promise((resolve) => setTimeout(resolve, 2200)) + }) + expect(mocks.saveDraftFileMutationFn).toHaveBeenCalledTimes(1) + + await user.type(getSourceEditor(), '\nRetry after another edit') + await waitFor( + () => { + expect(mocks.saveDraftFileMutationFn).toHaveBeenCalledTimes(2) + }, + { timeout: 2500 }, + ) + }, 10000) it('does not expose display-name editing in the SKILL.md metadata editor before publishing', async () => { const user = userEvent.setup() @@ -2467,7 +2508,7 @@ describe('SkillDetailPage', { timeout: 10000 }, () => { expect.anything(), ) }) - }) + }, 15000) it('sends uploaded Skill Builder attachments without requiring typed text', async () => { const user = userEvent.setup() @@ -2635,7 +2676,7 @@ describe('SkillDetailPage', { timeout: 10000 }, () => { expect(mocks.sendSkillAssistMessage).not.toHaveBeenCalled() expect(promptInput).toHaveValue('Use the attached guide') - }) + }, 10000) it('ignores an in-flight attachment after restarting Skill Builder', async () => { const user = userEvent.setup() @@ -2830,18 +2871,15 @@ describe('SkillDetailPage', { timeout: 10000 }, () => { expect(await screen.findByRole('img', { name: 'image.png' })).toBeInTheDocument() }) - it('shows unavailable feedback for Skill Builder voice input', async () => { - const user = userEvent.setup() + it('does not show voice input in Skill Builder', async () => { renderSkillDetailPage() await screen.findByText('skill.skillManagement.detail.builder.title') - await user.click( - screen.getByRole('button', { + expect( + screen.queryByRole('button', { name: 'skill.skillManagement.detail.builder.voice', }), - ) - - expect(toast.info).toHaveBeenCalledWith('skill.skillManagement.detail.builder.voiceUnavailable') + ).not.toBeInTheDocument() }) it('shows an error and re-enables Skill Builder input when sending fails', async () => { @@ -3023,7 +3061,7 @@ describe('SkillDetailPage', { timeout: 10000 }, () => { }), ).toBeInTheDocument() expect( - screen.getByText('skill.skillManagement.detail.publishReferencesDescription:{"count":1}'), + screen.getByText('skill.skillManagement.detail.publishReferencesDescription_one:{"count":1}'), ).toBeInTheDocument() expect(await screen.findByText('Stale Count Agent')).toBeInTheDocument() expect(mocks.publishSkillMutationFn).not.toHaveBeenCalled() @@ -3076,11 +3114,19 @@ describe('SkillDetailPage', { timeout: 10000 }, () => { await user.click( await screen.findByRole('button', { - name: 'skill.skillManagement.detail.referencedBy:{"count":1}', + name: 'skill.skillManagement.detail.referencedBy_one:{"count":1}', }), ) - expect(await screen.findByText('Sidebar Agent')).toBeInTheDocument() + const referencesPopover = await screen.findByRole('dialog', { + name: 'skill.skillManagement.detail.referencedBy_one:{"count":1}', + }) + const sidebarReferenceLink = within(referencesPopover).getByRole('link', { + name: /Sidebar Agent/, + }) + expect(sidebarReferenceLink).toBeInTheDocument() + expect(sidebarReferenceLink.querySelector('.i-ri-external-link-line')).toHaveClass('size-3') + expect(sidebarReferenceLink.querySelector('.i-ri-arrow-right-up-line')).not.toBeInTheDocument() expect(mocks.skillReferencesQueryOptions).toHaveBeenCalledWith( expect.objectContaining({ input: { @@ -3092,6 +3138,26 @@ describe('SkillDetailPage', { timeout: 10000 }, () => { ) }) + it('renders a non-interactive reference count when no agent uses the skill', async () => { + mocks.skillDetail = createSkillDetail({ reference_count: 0 }) + mocks.skillReferencesQueryOptions.mockImplementation((options) => ({ + queryKey: ['skill-references', options], + queryFn: async () => ({ data: [] }), + })) + + renderSkillDetailPage() + + const referenceCount = await screen.findByText( + 'skill.skillManagement.detail.referencedBy_other:{"count":0}', + ) + expect(referenceCount).toBeInTheDocument() + expect( + screen.queryByRole('button', { + name: 'skill.skillManagement.detail.referencedBy_other:{"count":0}', + }), + ).not.toBeInTheDocument() + }) + it('uses the references query count when the cached sidebar reference count is stale', async () => { mocks.skillDetail = createSkillDetail({ reference_count: 0 }) mocks.skillReferencesQueryOptions.mockImplementation((options) => ({ @@ -3104,9 +3170,11 @@ describe('SkillDetailPage', { timeout: 10000 }, () => { renderSkillDetailPage() expect( - await screen.findByRole('button', { - name: 'skill.skillManagement.detail.referencedBy:{"count":1}', - }), + await screen.findByRole( + 'button', + { name: 'skill.skillManagement.detail.referencedBy_one:{"count":1}' }, + { timeout: 5000 }, + ), ).toBeInTheDocument() }) @@ -3124,129 +3192,30 @@ describe('SkillDetailPage', { timeout: 10000 }, () => { await user.click( await screen.findByRole('button', { - name: 'skill.skillManagement.detail.referencedBy:{"count":1}', + name: 'skill.skillManagement.detail.referencedBy_one:{"count":1}', }), ) expect(await screen.findByText('Sidebar Agent')).toBeInTheDocument() - fireEvent.pointerDown(document.body) + await user.click( + screen.getByRole('button', { + name: 'app.gotoAnything.searchTitle', + }), + ) await waitFor(() => { expect(screen.queryByText('Sidebar Agent')).not.toBeInTheDocument() }) }) - it('opens files from the file tree search dialog', async () => { - const user = userEvent.setup() - mocks.skillDetail = createSkillDetail({ - files: [ - ...createSkillDetail().files!, - { - id: 'file-guide', - path: 'docs/guide.md', - kind: 'file', - storage: 'text', - mime_type: 'text/markdown', - content: '# Guide', - tool_file_id: null, - size: 7, - hash: 'hash-guide', - }, - { - id: 'file-policy', - path: 'references/policy.md', - kind: 'file', - storage: 'text', - mime_type: 'text/markdown', - content: '# Policy', - tool_file_id: null, - size: 8, - hash: 'hash-policy', - }, - ], - }) - + it('opens Go to Anything from the sidebar search action', async () => { renderSkillDetailPage() + render() - await user.click( - await screen.findByRole('button', { name: 'skill.skillManagement.detail.searchFiles' }), - ) - await user.type( - screen.getByRole('textbox', { name: 'skill.skillManagement.detail.searchFiles' }), - 'guide', - ) + expect(screen.queryByRole('dialog', { name: 'Goto Anything' })).not.toBeInTheDocument() + fireEvent.click(await screen.findByRole('button', { name: 'app.gotoAnything.searchTitle' })) - expect(screen.getByRole('button', { name: 'docs/guide.md' })).toBeInTheDocument() - expect(screen.queryByRole('button', { name: 'references/policy.md' })).not.toBeInTheDocument() - - await user.keyboard('{Enter}') - - expect( - await screen.findByRole('button', { - name: 'skill.skillManagement.detail.closeFileTab:{"name":"docs/guide.md"}', - }), - ).toBeInTheDocument() - }) - - it('opens files by clicking search results and shows the empty search state', async () => { - const user = userEvent.setup() - mocks.skillDetail = createSkillDetail({ - files: [ - ...createSkillDetail().files!, - { - id: 'file-guide', - path: 'docs/guide.md', - kind: 'file', - storage: 'text', - mime_type: 'text/markdown', - content: '# Guide', - tool_file_id: null, - size: 7, - hash: 'hash-guide', - }, - ], - }) - - renderSkillDetailPage() - - await user.click( - await screen.findByRole('button', { name: 'skill.skillManagement.detail.searchFiles' }), - ) - const searchInput = screen.getByRole('textbox', { - name: 'skill.skillManagement.detail.searchFiles', - }) - await user.type(searchInput, 'missing') - expect(screen.getByText('skill.skillManagement.detail.noSearchResults')).toBeInTheDocument() - - await user.clear(searchInput) - await user.type(searchInput, 'guide') - await user.click(screen.getByRole('button', { name: 'docs/guide.md' })) - - expect( - await screen.findByRole('button', { - name: 'skill.skillManagement.detail.closeFileTab:{"name":"docs/guide.md"}', - }), - ).toBeInTheDocument() - expect( - screen.queryByRole('textbox', { name: 'skill.skillManagement.detail.searchFiles' }), - ).not.toBeInTheDocument() - }) - - it('keeps the file search dialog open when Enter is pressed without results', async () => { - const user = userEvent.setup() - renderSkillDetailPage() - - await user.click( - await screen.findByRole('button', { name: 'skill.skillManagement.detail.searchFiles' }), - ) - const searchInput = screen.getByRole('textbox', { - name: 'skill.skillManagement.detail.searchFiles', - }) - - await user.type(searchInput, 'not-present{Enter}') - - expect(searchInput).toBeInTheDocument() - expect(screen.getByText('skill.skillManagement.detail.noSearchResults')).toBeInTheDocument() + expect(screen.getByRole('dialog', { name: 'Goto Anything' })).toBeInTheDocument() }) it('collapses and expands the file tree sidebar', async () => { @@ -3261,7 +3230,7 @@ describe('SkillDetailPage', { timeout: 10000 }, () => { expect(screen.queryByTestId('skill-detail-sidebar-header')).not.toBeInTheDocument() expect(screen.getByTestId('skill-detail-sidebar-shell')).toHaveClass('w-16') - await user.click( + fireEvent.click( screen.getByRole('button', { name: 'skill.skillManagement.detail.expandSidebar', }), @@ -3530,13 +3499,12 @@ describe('SkillDetailPage', { timeout: 10000 }, () => { await screen.findByRole('button', { name: 'skill.skillManagement.detail.versionHistory' }), ) - const panelTitle = await screen.findByText('skill.skillManagement.detail.versions') - expect(panelTitle.closest('aside')).toHaveClass('w-67', 'py-1') + await screen.findByText('skill.skillManagement.detail.versions') expect(screen.getAllByRole('button', { current: true })).toHaveLength(1) await openVersionRowActions(user, '#2') expect(screen.queryByText('skill.skillManagement.detail.copyVersionId')).not.toBeInTheDocument() - expect(await screen.findByRole('menu')).toHaveClass('w-[184px]') + expect(await screen.findByRole('menu')).toBeInTheDocument() await user.keyboard('{Escape}') await user.click( @@ -4184,7 +4152,10 @@ describe('SkillDetailPage', { timeout: 10000 }, () => { await openRootCreateMenu(user) await user.click(await screen.findByText('skill.skillManagement.detail.createFileMenu')) - await user.type(await screen.findByPlaceholderText('File name'), 'notes.md{Enter}') + await user.type( + await screen.findByPlaceholderText('skill.skillManagement.detail.createFile'), + 'notes.md{Enter}', + ) expect(mocks.saveDraftFileMutationFn).toHaveBeenCalledTimes(1) @@ -4257,7 +4228,9 @@ describe('SkillDetailPage', { timeout: 10000 }, () => { }) await openRootCreateMenu(user) await user.click(await screen.findByText('skill.skillManagement.detail.createFolderMenu')) - const folderNameInput = await screen.findByPlaceholderText('Folder name') + const folderNameInput = await screen.findByPlaceholderText( + 'skill.skillManagement.detail.createFolder', + ) expect(screen.queryByRole('dialog')).not.toBeInTheDocument() expect(folderNameInput).toHaveFocus() @@ -4287,7 +4260,9 @@ describe('SkillDetailPage', { timeout: 10000 }, () => { }) await openRootCreateMenu(user) await user.click(await screen.findByText('skill.skillManagement.detail.createFileMenu')) - const fileNameInput = await screen.findByPlaceholderText('File name') + const fileNameInput = await screen.findByPlaceholderText( + 'skill.skillManagement.detail.createFile', + ) await user.type(fileNameInput, 'notes.md') await user.click(screen.getByTestId('skill-detail-sidebar-header')) @@ -4331,7 +4306,9 @@ describe('SkillDetailPage', { timeout: 10000 }, () => { }) await openRootCreateMenu(user) await user.click(await screen.findByText('skill.skillManagement.detail.createFileMenu')) - const fileNameInput = await screen.findByPlaceholderText('File name') + const fileNameInput = await screen.findByPlaceholderText( + 'skill.skillManagement.detail.createFile', + ) await user.type(fileNameInput, 'notes.md') await user.click(screen.getByTestId('skill-detail-sidebar-header')) @@ -4351,7 +4328,9 @@ describe('SkillDetailPage', { timeout: 10000 }, () => { }) await openRootCreateMenu(user) await user.click(await screen.findByText('skill.skillManagement.detail.createFileMenu')) - const fileNameInput = await screen.findByPlaceholderText('File name') + const fileNameInput = await screen.findByPlaceholderText( + 'skill.skillManagement.detail.createFile', + ) await user.type(fileNameInput, 'tool.schema.json') await user.click(screen.getByTestId('skill-detail-sidebar-header')) @@ -4432,7 +4411,9 @@ describe('SkillDetailPage', { timeout: 10000 }, () => { }) await openRootCreateMenu(user) await user.click(await screen.findByText('skill.skillManagement.detail.createFileMenu')) - const fileNameInput = await screen.findByPlaceholderText('File name') + const fileNameInput = await screen.findByPlaceholderText( + 'skill.skillManagement.detail.createFile', + ) await user.click(screen.getByTestId('skill-detail-sidebar-header')) @@ -4467,7 +4448,9 @@ describe('SkillDetailPage', { timeout: 10000 }, () => { }) await openFileTreeActions(user, 'scripts') await user.click(await screen.findByText('skill.skillManagement.detail.createFileMenu')) - const fileNameInput = await screen.findByPlaceholderText('File name') + const fileNameInput = await screen.findByPlaceholderText( + 'skill.skillManagement.detail.createFile', + ) expect(fileNameInput.closest('ul')).toContainElement(getFileTreeItem('scripts/example.ts')) await user.type(fileNameInput, 'helper.ts{Enter}') @@ -4510,7 +4493,9 @@ describe('SkillDetailPage', { timeout: 10000 }, () => { }) await openFileTreeActions(user, 'scripts') await user.click(await screen.findByText('skill.skillManagement.detail.createFolderMenu')) - const folderNameInput = await screen.findByPlaceholderText('Folder name') + const folderNameInput = await screen.findByPlaceholderText( + 'skill.skillManagement.detail.createFolder', + ) expect(folderNameInput.closest('ul')).toContainElement(getFileTreeItem('scripts/example.ts')) await user.type(folderNameInput, 'helpers{Enter}') @@ -4664,7 +4649,10 @@ describe('SkillDetailPage', { timeout: 10000 }, () => { }) await openRootCreateMenu(user) await user.click(await screen.findByText('skill.skillManagement.detail.createFileMenu')) - await user.type(await screen.findByPlaceholderText('File name'), 'broken.md{Enter}') + await user.type( + await screen.findByPlaceholderText('skill.skillManagement.detail.createFile'), + 'broken.md{Enter}', + ) await waitFor(() => { expect(toast.error).toHaveBeenCalledWith('backend exploded') @@ -5116,7 +5104,10 @@ describe('SkillDetailPage', { timeout: 10000 }, () => { clientY: 520, }) await user.click(await screen.findByText('skill.skillManagement.detail.createFileMenu')) - await user.type(await screen.findByPlaceholderText('File name'), 'from-context.md{Enter}') + await user.type( + await screen.findByPlaceholderText('skill.skillManagement.detail.createFile'), + 'from-context.md{Enter}', + ) await waitFor(() => { expect(mocks.saveDraftFileMutationFn).toHaveBeenCalledWith( diff --git a/web/features/skills/__tests__/page.spec.tsx b/web/features/skills/__tests__/page.spec.tsx index 6c2b50c826c..12c1071a752 100644 --- a/web/features/skills/__tests__/page.spec.tsx +++ b/web/features/skills/__tests__/page.spec.tsx @@ -116,7 +116,11 @@ vi.mock('@/app/components/base/app-icon', () => ({ })) vi.mock('@/features/tag-management/components/skill-card-tags', () => ({ - SkillCardTags: ({ tags }: { tags: string[] }) =>
{tags.join(', ')}
, + SkillCardTags: ({ tags }: { tags: string[] }) => ( + + ), })) vi.mock('../skill-list-tag-management-modal', () => ({ @@ -310,16 +314,36 @@ describe('SkillsPage', () => { renderSkillsPage() const skillLink = await screen.findByRole('link', { name: /Refund approval/ }) + expect(screen.getByRole('article', { name: 'Refund approval' })).toBeInTheDocument() expect(skillLink).toHaveAttribute('href', '/skills/skill-1') expect(screen.getByText('refund-approval')).toBeInTheDocument() expect(screen.getByText('Handle refund requests.')).toBeInTheDocument() expect(screen.getByText('support')).toBeInTheDocument() - expect(screen.getByText('skill.skillManagement.referenceCount:{"count":2}')).toBeInTheDocument() + expect( + screen.getByText('skill.skillManagement.referenceCount_other:{"count":2}'), + ).toBeInTheDocument() expect( screen.getByText('skill.skillManagement.publishedAt:{"time":"2 hours ago"}'), ).toBeInTheDocument() }) + it('tabs from the card More action to its tag trigger', async () => { + const user = userEvent.setup() + renderSkillsPage() + + const skillLink = await screen.findByRole('link', { name: /Refund approval/ }) + const moreButton = screen.getByRole('button', { + name: 'skill.skillManagement.moreActions:{"name":"Refund approval"}', + }) + const tagTrigger = screen.getByRole('button', { name: 'support' }) + + skillLink.focus() + await user.tab() + expect(moreButton).toHaveFocus() + await user.tab() + expect(tagTrigger).toHaveFocus() + }) + it('renders draft update time as relative time', async () => { mocks.skills = [createSkill({ latest_published_version_id: null, latest_published_at: null })] mocks.skillPages = [mocks.skills] @@ -331,6 +355,15 @@ describe('SkillsPage', () => { ).toBeInTheDocument() }) + it('shows guidance instead of a persisted editor placeholder when description is empty', async () => { + mocks.skills = [createSkill({ description: '' })] + mocks.skillPages = [mocks.skills] + + renderSkillsPage() + + expect(await screen.findByText('skill.skillManagement.noDescription')).toBeInTheDocument() + }) + it('passes keyword and selected tags to the list query', async () => { mocks.queryState.keyword = 'refund' mocks.queryState.tag = ['support'] @@ -349,6 +382,35 @@ describe('SkillsPage', () => { }) }) + it('uses the localized Skills search hint as the search placeholder', async () => { + renderSkillsPage() + + expect( + await screen.findByRole('searchbox', { + name: 'skill.skillManagement.searchLabel', + }), + ).toHaveAttribute('placeholder', 'skill.skillManagement.searchPlaceholder') + }) + + it('clears stale tag names from the URL-backed filter state', async () => { + mocks.queryState.tag = ['renamed-tag'] + + renderSkillsPage() + + await waitFor(() => { + expect(mocks.queryState.tag).toEqual([]) + }) + await waitFor(() => { + const queryOptions = mocks.skillsQueryOptions.mock.lastCall?.[0] + expect(queryOptions?.input(1)).toEqual({ + query: { + limit: 20, + page: 1, + }, + }) + }) + }) + it('loads the next skill page when the list scrolls near the bottom', async () => { const firstPageSkills = Array.from({ length: 20 }, (_, index) => createSkill({ @@ -417,6 +479,18 @@ describe('SkillsPage', () => { invalidateQueries.mockRestore() }) + it('explains when the workspace skill limit blocks draft creation', async () => { + const user = userEvent.setup() + mocks.createSkillMutationFn.mockRejectedValueOnce({ code: 'skill_limit_exceeded' }) + renderSkillsPage() + + await user.click(await screen.findByRole('button', { name: 'skill.skillManagement.create' })) + + await waitFor(() => { + expect(toast.error).toHaveBeenCalledWith('skill.skillManagement.errors.workspaceLimit') + }) + }) + it('imports a package file and navigates to the imported skill', async () => { const user = userEvent.setup() const invalidateQueries = vi.spyOn(QueryClient.prototype, 'invalidateQueries') @@ -448,6 +522,65 @@ describe('SkillsPage', () => { invalidateQueries.mockRestore() }) + it.each([ + { + error: { + data: { + body: { + code: 'skill_name_conflict', + details: { name: 'refund-approval' }, + }, + }, + }, + message: 'skill.skillManagement.errors.nameConflict:{"name":"refund-approval"}', + }, + { + error: { code: 'skill_limit_exceeded' }, + message: 'skill.skillManagement.errors.workspaceLimit', + }, + { + error: { code: 'missing_skill_md' }, + message: 'skill.skillManagement.errors.missingSkillMd', + }, + { + error: { message: 'Skill package must contain SKILL.md' }, + message: 'skill.skillManagement.errors.missingSkillMd', + }, + { + error: { message: 'Skill name "refund-approval" already exists' }, + message: 'skill.skillManagement.errors.nameConflict:{"name":"refund-approval"}', + }, + ])('explains import errors for $error.code', async ({ error, message }) => { + const user = userEvent.setup() + mocks.importSkillMutationFn.mockRejectedValueOnce(error) + const { container } = renderSkillsPage() + const fileInput = container.querySelector('input[type="file"]') + const file = new File(['skill'], 'refund.skill', { type: 'application/zip' }) + + await user.upload(fileInput!, file) + + await waitFor(() => { + expect(toast.error).toHaveBeenCalledWith(message) + }) + }) + + it('explains an import error returned as a Response body', async () => { + const user = userEvent.setup() + mocks.importSkillMutationFn.mockRejectedValueOnce( + new Response(JSON.stringify({ message: 'Skill package must contain SKILL.md' }), { + status: 400, + }), + ) + const { container } = renderSkillsPage() + const fileInput = container.querySelector('input[type="file"]') + + await user.upload(fileInput!, new File(['skill'], 'refund.skill', { type: 'application/zip' })) + + await waitFor(() => { + expect(toast.error).toHaveBeenCalledWith('skill.skillManagement.errors.missingSkillMd') + }) + }) + it('duplicates a skill from the card action menu', async () => { const user = userEvent.setup() renderSkillsPage() @@ -521,7 +654,7 @@ describe('SkillsPage', () => { expect( within(dialog).getByText( - 'skill.skillManagement.deleteDialog.referencedDescription:{"count":2}', + 'skill.skillManagement.deleteDialog.referencedDescription_other:{"count":2}', ), ).toBeInTheDocument() expect(await within(dialog).findByText('Support Agent')).toBeInTheDocument() @@ -579,7 +712,7 @@ describe('SkillsPage', () => { expect(await within(dialog).findByText('Support Agent From References API')).toBeInTheDocument() expect( within(dialog).getByText( - 'skill.skillManagement.deleteDialog.referencedDescription:{"count":1}', + 'skill.skillManagement.deleteDialog.referencedDescription_one:{"count":1}', ), ).toBeInTheDocument() expect(mocks.skillReferencesQueryOptions).toHaveBeenCalledWith( diff --git a/web/features/skills/detail/__tests__/publish-bar.spec.tsx b/web/features/skills/detail/__tests__/publish-bar.spec.tsx index 3e53d0e4501..4b5201a65e3 100644 --- a/web/features/skills/detail/__tests__/publish-bar.spec.tsx +++ b/web/features/skills/detail/__tests__/publish-bar.spec.tsx @@ -85,4 +85,22 @@ describe('SkillPublishBar', () => { await user.click(publishingButton) expect(onPublish).not.toHaveBeenCalled() }) + + it('keeps the complete status available when the visual timestamp needs less space', () => { + const longMetaLabel = 'Saved a few seconds ago after a long autosave operation' + render( + , + ) + + expect(screen.getByText('skill.skillManagement.detail.draft')).toBeVisible() + expect(screen.getByText(longMetaLabel)).toBeVisible() + expect(screen.getByRole('status')).toHaveAccessibleName( + `skill.skillManagement.detail.draft. ${longMetaLabel}`, + ) + }) }) diff --git a/web/features/skills/detail/builder-panel.tsx b/web/features/skills/detail/builder-panel.tsx index 4c8e2ef853f..ee2449972d6 100644 --- a/web/features/skills/detail/builder-panel.tsx +++ b/web/features/skills/detail/builder-panel.tsx @@ -7,11 +7,13 @@ import type { SkillFileResponse, } from '@dify/contracts/api/console/workspaces/types.gen' import type { BuilderChatMessage, SkillBuilderAttachment, SkillBuilderModel } from './shared' -import type { Model } from '@/app/components/header/account-setting/model-provider-page/declarations' +import type { + FormValue, + Model, +} from '@/app/components/header/account-setting/model-provider-page/declarations' import { Button } from '@langgenius/dify-ui/button' import { cn } from '@langgenius/dify-ui/cn' import { toast } from '@langgenius/dify-ui/toast' -import { Tooltip, TooltipContent, TooltipTrigger } from '@langgenius/dify-ui/tooltip' import { useQueryClient } from '@tanstack/react-query' import { useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -24,7 +26,8 @@ import { useDefaultModel, useModelList, } from '@/app/components/header/account-setting/model-provider-page/hooks' -import ModelSelector from '@/app/components/header/account-setting/model-provider-page/model-selector' +import ModelParameterModal from '@/app/components/header/account-setting/model-provider-page/model-parameter-modal' +import { ModelSelector } from '@/app/components/header/account-setting/model-provider-page/model-selector' import { sendSkillAssistMessage, uploadSkillFile } from '../client' import { SkillBuilderGridTexture } from './builder-grid-texture' import { @@ -79,22 +82,24 @@ function BuilderModelSelector({ selectedModel: SkillBuilderModel | undefined onSelect: (model: SkillBuilderModel) => void }) { + const { t } = useTranslation() + return ( -
+
{isLoading ? (
) : ( { + className="h-8! w-fit! max-w-full bg-transparent! p-1! hover:bg-state-base-hover! [&>div:first-child]:hidden [&>div:nth-child(2)]:px-0" + onValueChange={({ model, provider }) => { onSelect({ ...selectedModel, provider, @@ -103,6 +108,42 @@ function BuilderModelSelector({ }} /> )} + {!isLoading && ( + $['modelProvider.modelSettings'], { ns: 'common' })} + className="flex size-8 shrink-0 cursor-pointer items-center justify-center rounded-lg text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary" + > + + + } + setModel={({ modelId, provider }) => { + onSelect({ + ...selectedModel, + provider, + model: modelId, + }) + }} + onCompletionParamsChange={(modelSettings) => { + if (!selectedModel) return + onSelect({ + ...selectedModel, + model_settings: modelSettings, + }) + }} + /> + )}
) } @@ -315,6 +356,7 @@ export function SkillBuilderPanel({ return { provider: provider.provider, model: model.model, + model_settings: { temperature: 0.7 }, } } } @@ -325,6 +367,7 @@ export function SkillBuilderPanel({ ? { provider: defaultTextGenerationModel.provider.provider, model: defaultTextGenerationModel.model, + model_settings: { temperature: 0.7 }, } : undefined const [selectedModel, setSelectedModel] = useState() @@ -1048,20 +1091,6 @@ export function SkillBuilderPanel({ )} /> - - $['skillManagement.detail.builder.voice'])} - onClick={() => { - toast.info(t(($) => $['skillManagement.detail.builder.voiceUnavailable'])) - }} - > - - - - {t(($) => $['skillManagement.detail.builder.voiceUnavailable'])} - -
- ))} -
- ) : ( -
- {t(($) => $['skillManagement.detail.noSearchResults'])} -
- )} -
-
- {t(($) => $['skillManagement.detail.searchFiles'])} - ESC -
- - - ) -} - export function FileTree({ canEdit, canDelete, @@ -263,17 +171,15 @@ export function FileTree({ skillId: string }) { const { t } = useTranslation('skill') + const { t: tApp } = useTranslation('app') const { t: tCommon } = useTranslation('common') const queryClient = useQueryClient() const sidebarRef = useRef(null) - const referencesRegionRef = useRef(null) const uploadInputRef = useRef(null) const [inlineAction, setInlineAction] = useState() const [draggingPaths, setDraggingPaths] = useState([]) const [dropTarget, setDropTarget] = useState() const [collapsedFolderPaths, setCollapsedFolderPaths] = useState([]) - const [referencesOpen, setReferencesOpen] = useState(false) - const [searchDialogOpen, setSearchDialogOpen] = useState(false) const [skillRenameEditing, setSkillRenameEditing] = useState(false) const [selectedPaths, setSelectedPaths] = useState([]) const [selectionAnchorPath, setSelectionAnchorPath] = useState() @@ -297,31 +203,18 @@ export function FileTree({ refetchOnMount: 'always', }) const referenceCount = referencesQuery.data?.data?.length ?? detail?.reference_count ?? 0 + const referenceCountLabel = t( + ($) => + referenceCount === 1 + ? $['skillManagement.detail.referencedBy_one'] + : $['skillManagement.detail.referencedBy_other'], + { count: referenceCount }, + ) const activeUploadXhrRef = useRef(undefined) const cancelUploadRef = useRef(false) const stopSidebarResizeRef = useRef<() => void>(() => undefined) const closeSidebarFloatingTimerRef = useRef | null>(null) - const handleReferencesRegionBlur = useCallback((event: FocusEvent) => { - const nextTarget = event.relatedTarget - if (nextTarget instanceof Node && event.currentTarget.contains(nextTarget)) return - setReferencesOpen(false) - }, []) - - useEffect(() => { - if (!referencesOpen) return - - const handlePointerDown = (event: PointerEvent) => { - const target = event.target - if (!(target instanceof Node)) return - if (referencesRegionRef.current?.contains(target)) return - setReferencesOpen(false) - } - - document.addEventListener('pointerdown', handlePointerDown, true) - return () => document.removeEventListener('pointerdown', handlePointerDown, true) - }, [referencesOpen]) - useEffect(() => { const fetchedReferenceCount = referencesQuery.data?.data?.length if ( @@ -1219,15 +1112,23 @@ export function FileTree({ onMouseLeave={closeSidebarFloatingPreview} >
- + + $['skillManagement.detail.expandSidebar'])} + className="mt-2 flex size-8 cursor-pointer items-center justify-center rounded-[10px] border-0 bg-transparent text-text-tertiary shadow-none outline-hidden hover:bg-state-base-hover hover:text-text-secondary focus-visible:ring-2 focus-visible:ring-state-accent-solid" + onClick={() => onCollapsedChange(false)} + > + + + } + /> + + {t(($) => $['skillManagement.detail.expandSidebar'])} + +
@@ -1306,31 +1207,62 @@ export function FileTree({ SKILLS
- - + } + /> } - }} - > - - + /> + + {tApp(($) => $['gotoAnything.quickAction'])} + + {GOTO_ANYTHING_HOTKEY.split('+').map((key) => ( + {formatForDisplay(key)} + ))} + + + + + $['skillManagement.detail.collapseSidebar'])} + className="flex size-8 shrink-0 cursor-pointer items-center justify-center rounded-[10px] border-0 bg-transparent text-text-tertiary shadow-none outline-hidden hover:bg-state-base-hover hover:text-text-secondary focus-visible:ring-2 focus-visible:ring-state-accent-solid" + onClick={() => { + if (collapsed) { + setSidebarFloating(false) + onCollapsedChange(false) + } else { + onCollapsedChange(true) + } + }} + > + + + } + /> + + {t(($) => $['skillManagement.detail.collapseSidebar'])} + +
@@ -1382,7 +1314,13 @@ export function FileTree({

- {t(($) => $['skillManagement.detail.fileCount'], { count: fileCount })} + {t( + ($) => + fileCount === 1 + ? $['skillManagement.detail.fileCount_one'] + : $['skillManagement.detail.fileCount_other'], + { count: fileCount }, + )}

{!readonly && ( @@ -1392,10 +1330,7 @@ export function FileTree({ > - + @@ -1473,7 +1408,9 @@ export function FileTree({ onCancel={() => setInlineAction(undefined)} onSubmit={handleSubmitInlineAction} placeholder={ - inlineAction.nodeType === 'file' ? 'File name' : 'Folder name' + inlineAction.nodeType === 'file' + ? t(($) => $['skillManagement.detail.createFile']) + : t(($) => $['skillManagement.detail.createFolder']) } /> )} @@ -1537,7 +1474,7 @@ export function FileTree({ )} - + @@ -1612,35 +1549,48 @@ export function FileTree({ -
-
- + } /> - - {referencesOpen && ( -
- -
- )} -
-
+ +
+ {referenceCountLabel} +
+ +
+ + ) : ( +
+ + {referenceCountLabel} +
+ )} +
{t(($) => $['skillManagement.detail.createdBy'], { @@ -1652,12 +1602,6 @@ export function FileTree({
- ) } diff --git a/web/features/skills/detail/markdown-editor.tsx b/web/features/skills/detail/markdown-editor.tsx index 88e26b4ffbf..cfe579b61eb 100644 --- a/web/features/skills/detail/markdown-editor.tsx +++ b/web/features/skills/detail/markdown-editor.tsx @@ -344,9 +344,6 @@ function EditorPlaceholder({ const shortcutIndex = text.indexOf('/') const beforeShortcut = shortcutIndex >= 0 ? text.slice(0, shortcutIndex) : text const afterShortcut = shortcutIndex >= 0 ? text.slice(shortcutIndex + 1) : '' - const referenceMatch = afterShortcut.match(/^(.*?)(reference files|引用文件)\s*$/i) - const afterTo = referenceMatch?.[1] ?? afterShortcut - const referenceFiles = referenceMatch?.[2] ?? '' return ( / - {afterTo} - {referenceFiles && ( - - {referenceFiles} - - )} + {afterShortcut} ) } diff --git a/web/features/skills/detail/publish-bar.tsx b/web/features/skills/detail/publish-bar.tsx index 1abecff8aa9..95fba62e7d7 100644 --- a/web/features/skills/detail/publish-bar.tsx +++ b/web/features/skills/detail/publish-bar.tsx @@ -100,20 +100,22 @@ export function SkillPublishBar({ return (
{children}
- {currentState.statusLabel} - · - {metaLabel} + + {currentState.statusLabel} + · + {metaLabel} +
-
+ + + + )}
@@ -251,7 +257,7 @@ export function SkillDetailSidebarActions({ > - + {canEdit && ( diff --git a/web/features/skills/detail/skill-display-name-editor.tsx b/web/features/skills/detail/skill-display-name-editor.tsx index d4f55b23eca..7e2d1cb6db1 100644 --- a/web/features/skills/detail/skill-display-name-editor.tsx +++ b/web/features/skills/detail/skill-display-name-editor.tsx @@ -7,7 +7,14 @@ import { useMutation, useQueryClient } from '@tanstack/react-query' import { useLayoutEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { consoleQuery } from '@/service/client' -import { invalidateSkillDetail, runSkillFileMutation, setSkillDetailCache } from './shared' +import { + getAsyncSkillErrorPayload, + getErrorCode, + getErrorDetailString, + invalidateSkillDetail, + runSkillFileMutation, + setSkillDetailCache, +} from './shared' export function SkillDisplayNameEditor({ detail, @@ -95,9 +102,18 @@ export function SkillDisplayNameEditor({ setDraftName(nextDisplayName) onEditingChange(false) toast.success(t(($) => $['skillManagement.detail.renameSkillSuccess'])) - } catch { + } catch (error) { setDraftName(displayName) - toast.error(t(($) => $['skillManagement.detail.saveFailed'])) + const errorPayload = await getAsyncSkillErrorPayload(error) + if (getErrorCode(errorPayload ?? error) === 'skill_name_conflict') { + toast.error( + t(($) => $['skillManagement.errors.nameConflict'], { + name: getErrorDetailString(errorPayload ?? error, 'name') ?? '', + }), + ) + } else { + toast.error(t(($) => $['skillManagement.detail.saveFailed'])) + } } finally { submittingRef.current = false } diff --git a/web/features/skills/detail/skill-metadata.tsx b/web/features/skills/detail/skill-metadata.tsx index e1e87d17814..e17deff232f 100644 --- a/web/features/skills/detail/skill-metadata.tsx +++ b/web/features/skills/detail/skill-metadata.tsx @@ -212,10 +212,7 @@ export function SkillTagsEditor({ - $['skillManagement.detail.addTag'])} - className="w-(--anchor-width) min-w-60 rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-0 shadow-lg backdrop-blur-[5px]" - > + + return } if (references.length === 0) { return ( -
- {t(($) => $['skillManagement.detail.referencedBy'], { count: 0 })} +
+ {t(($) => $['skillManagement.detail.referencedBy_other'], { count: 0 })}
) } @@ -298,6 +302,7 @@ export function SkillReferencesPanel({ return ( @@ -322,12 +335,14 @@ export function SkillReferencesListSkeleton({ compact = false }: { compact?: boo export function SkillReferencesList({ compact = false, + embedded = false, maxHeight, references, testId, visibleLimit, }: { compact?: boolean + embedded?: boolean maxHeight?: string references: SkillReferenceResponse[] testId?: string @@ -346,7 +361,10 @@ export function SkillReferencesList({ data-scrollable={isScrollable ? true : undefined} className={cn( compact - ? 'flex flex-col gap-px rounded-xl border border-divider-subtle p-[3px]' + ? cn( + 'flex flex-col gap-px', + !embedded && 'rounded-xl border border-divider-subtle p-[3px]', + ) : 'w-max max-w-[480px] space-y-0.5 py-1', isScrollable && `${maxHeight} overflow-y-auto`, )} @@ -410,9 +428,13 @@ export function SkillPublishConfirmPanel({ {t(($) => $['skillManagement.detail.publishReferencesTitle'])}

- {t(($) => $['skillManagement.detail.publishReferencesDescription'], { - count: referenceCount, - })} + {t( + ($) => + referenceCount === 1 + ? $['skillManagement.detail.publishReferencesDescription_one'] + : $['skillManagement.detail.publishReferencesDescription_other'], + { count: referenceCount }, + )}

@@ -465,7 +487,7 @@ function SkillReferenceItem({ target="_blank" rel="noreferrer" className={cn( - 'flex min-w-0 items-center gap-2 outline-hidden hover:bg-state-base-hover focus-visible:ring-2 focus-visible:ring-state-accent-solid', + 'group/reference flex min-w-0 items-center gap-2 outline-hidden hover:bg-state-base-hover focus-visible:ring-2 focus-visible:ring-state-accent-solid', compact ? 'h-7 w-full rounded-md py-1 pr-2 pl-1' : 'h-8 w-fit max-w-[480px] rounded-lg px-2', @@ -496,7 +518,7 @@ function SkillReferenceItem({ @@ -532,7 +554,7 @@ function SkillReferenceItem({ @@ -546,7 +568,7 @@ function SkillReferenceItem({ target="_blank" rel="noreferrer" className={cn( - 'flex min-w-0 items-center gap-2 outline-hidden hover:bg-state-base-hover focus-visible:ring-2 focus-visible:ring-state-accent-solid', + 'group/reference flex min-w-0 items-center gap-2 outline-hidden hover:bg-state-base-hover focus-visible:ring-2 focus-visible:ring-state-accent-solid', compact ? 'h-7 w-full rounded-md py-1 pr-2 pl-1' : 'h-8 w-fit max-w-[480px] rounded-lg px-2', @@ -560,7 +582,7 @@ function SkillReferenceItem({ return (
$['skillManagement.detail.uploadInvalidExtension']) if (code === 'missing_file_extension') return t(($) => $['skillManagement.detail.uploadMissingExtension']) - if (code === 'file_too_large') return t(($) => $['skillManagement.detail.uploadSizeExceeded']) return t(($) => $['skillManagement.detail.uploadInvalidPath']) } @@ -176,7 +175,7 @@ export function SkillUploadReviewDialog({ $['operation.close'])} size="lg" - className="absolute top-5 right-5" + className="absolute inset-e-5 top-5" > @@ -212,9 +211,9 @@ export function SkillUploadReviewDialog({ )}
- +
- +
- + diff --git a/web/features/tag-management/components/skill-card-tags.tsx b/web/features/tag-management/components/skill-card-tags.tsx index f8a4c8fd53f..2832c6390cb 100644 --- a/web/features/tag-management/components/skill-card-tags.tsx +++ b/web/features/tag-management/components/skill-card-tags.tsx @@ -34,11 +34,11 @@ export const SkillCardTags = ({ return (
diff --git a/web/features/tag-management/components/tag-filter.tsx b/web/features/tag-management/components/tag-filter.tsx index d4817c16ff6..e19743a9c99 100644 --- a/web/features/tag-management/components/tag-filter.tsx +++ b/web/features/tag-management/components/tag-filter.tsx @@ -143,7 +143,7 @@ export const TagFilter = ({ )} - {!!value.length && !iconOnly && ( + {!!value.length && ( $['operation.clear'], { ns: 'common' })} diff --git a/web/global.d.ts b/web/global.d.ts index 7227bfbd36f..5d1e51bce0a 100644 --- a/web/global.d.ts +++ b/web/global.d.ts @@ -21,10 +21,7 @@ declare global { dataLayer?: unknown[] __marketplaceTracking__?: { track: (eventName: string, properties?: Record) => void - rememberReferrer: ( - itemId: string, - section: 'banner' | 'search' | 'list' | 'direct', - ) => void + rememberReferrer: (itemId: string, section: 'banner' | 'search' | 'list' | 'direct') => void markSearch: (query: string) => void flushSearch: (resultCount: number) => void markFilter: (filter: { diff --git a/web/i18n/ar-TN/agent-v-2.json b/web/i18n/ar-TN/agent-v-2.json index adc9d4c5f30..2a100250d99 100644 --- a/web/i18n/ar-TN/agent-v-2.json +++ b/web/i18n/ar-TN/agent-v-2.json @@ -83,7 +83,7 @@ "agentDetail.configure.buildDraft.changesToApply_other": "{{count}} تغييرات للتطبيق", "agentDetail.configure.buildDraft.discard": "تجاهل", "agentDetail.configure.buildDraft.modeBadge": "وضع البناء", - "agentDetail.configure.buildDraft.modeDescription": "أنت في وضع البناء. لا يمكن تحديث Configure في هذا الوضع إلا بواسطة الوكيل. شكّل هذا الإعداد عبر الدردشة على اليمين، ثم طبّق.", + "agentDetail.configure.buildDraft.modeDescription": "أنت في وضع البناء. شكّل هذا الإعداد من خلال الدردشة مع الوكيل، ثم اضغط على تطبيق.", "agentDetail.configure.buildDraft.rewritten": "أُعيدت صياغته", "agentDetail.configure.buildDraft.title": "مسودة البناء", "agentDetail.configure.buildDraft.updated": "تم التحديث", @@ -105,7 +105,8 @@ "agentDetail.configure.files.preview.failed": "فشل تحميل المعاينة.", "agentDetail.configure.files.preview.unsupported": "هذا الملف لا يدعم المعاينة.", "agentDetail.configure.files.remove": "إزالة {{name}}", - "agentDetail.configure.files.tip": "للمواد المرجعية الأطول من أن تُلصق في Prompt: المواصفات، القوالب، الإرشادات. أشر إليها باستخدام / في Prompt.\n\nفي وضع Build، يمكن للوكيل إعدادها لك.", + "agentDetail.configure.files.richTip": "للمواد المرجعية الأطول من أن تُلصق في Prompt: المواصفات، القوالب، الإرشادات. تعرّف على المزيد\n\nفي وضع Build، يمكن للوكيل إعدادها لك.", + "agentDetail.configure.files.tip": "للمواد المرجعية الأطول من أن تُلصق في Prompt: المواصفات، القوالب، الإرشادات. تعرّف على المزيد\n\nفي وضع Build، يمكن للوكيل إعدادها لك.", "agentDetail.configure.files.toggle": "تبديل الملفات", "agentDetail.configure.files.treeLabel": "ملفات الوكيل", "agentDetail.configure.files.upload.action": "تحميل", @@ -114,7 +115,7 @@ "agentDetail.configure.files.upload.dropzone": "أفلت ملفاً هنا، أو", "agentDetail.configure.files.upload.failed": "فشل تحميل الملف.", "agentDetail.configure.files.upload.fileType": "FILE", - "agentDetail.configure.files.upload.invalidFile": "قم بتحميل ملف واحد.", + "agentDetail.configure.files.upload.invalidFile": "يمكن تحميل ملف واحد فقط في كل مرة.", "agentDetail.configure.files.upload.success": "تم تحميل الملف.", "agentDetail.configure.files.upload.title": "تحميل ملف", "agentDetail.configure.knowledgeRetrieval.add": "إضافة استرجاع معرفة", @@ -177,7 +178,8 @@ "agentDetail.configure.prompt.mention.priyaRamanathan": "Priya Ramanathan", "agentDetail.configure.prompt.placeholder": "اكتب التعليمات هنا،", "agentDetail.configure.prompt.referenceMissing": "{{name}} غير موجود", - "agentDetail.configure.prompt.tip": "عرّف دور الوكيل وصف مهمته المعتادة. استخدم / للإشارة صراحةً إلى المهارات والملفات والأدوات واسترجاع المعرفة.", + "agentDetail.configure.prompt.richTip": "حدّد دور الوكيل وكيفية عمله. تعرّف على المزيد", + "agentDetail.configure.prompt.tip": "حدّد دور الوكيل وكيفية عمله. تعرّف على المزيد", "agentDetail.configure.publishBar.draft": "مسودة", "agentDetail.configure.publishBar.publishUpdate": "نشر التحديث", "agentDetail.configure.publishBar.published": "تم النشر", @@ -190,8 +192,8 @@ "agentDetail.configure.publishBar.versionHistory": "فتح سجل الإصدارات", "agentDetail.configure.publishImpact.affectedWorkflows": "سير العمل المتأثر", "agentDetail.configure.publishImpact.cancel": "إلغاء", - "agentDetail.configure.publishImpact.descriptionPrefix": "يظهر وكيلك في", - "agentDetail.configure.publishImpact.descriptionSuffix": ". ستؤثر التغييرات عليها.", + "agentDetail.configure.publishImpact.descriptionPrefix": "يُستخدم هذا الوكيل في", + "agentDetail.configure.publishImpact.descriptionSuffix": ". سيؤدي نشره إلى تحديثه فيها جميعًا.", "agentDetail.configure.publishImpact.fallbackAgentName": "هذا الوكيل", "agentDetail.configure.publishImpact.title": "{{action}} إلى {{name}}", "agentDetail.configure.publishImpact.workflowCount_one": "{{count}} سير عمل", @@ -222,8 +224,8 @@ "agentDetail.configure.skills.openInLibrary": "Open in Skill library", "agentDetail.configure.skills.remove": "إزالة {{name}}", "agentDetail.configure.skills.removeAction": "Remove", - "agentDetail.configure.skills.richTip": "اجمع التعليمات والملفات والبرامج النصية لمهمة متكررة في Skill. أشر إليها باستخدام / في Prompt. معرفة المزيد\n\nفي وضع Build، يمكن للوكيل إعدادها لك.", - "agentDetail.configure.skills.tip": "اجمع التعليمات والملفات والبرامج النصية لمهمة متكررة في Skill. أشر إليها باستخدام / في Prompt. معرفة المزيد\n\nفي وضع Build، يمكن للوكيل إعدادها لك.", + "agentDetail.configure.skills.richTip": "اجمع التعليمات والملفات والبرامج النصية لمهمة متكررة في Skill. معرفة المزيد\n\nفي وضع Build، يمكن للوكيل إعدادها لك.", + "agentDetail.configure.skills.tip": "اجمع التعليمات والملفات والبرامج النصية لمهمة متكررة في Skill. معرفة المزيد\n\nفي وضع Build، يمكن للوكيل إعدادها لك.", "agentDetail.configure.skills.toggle": "تبديل المهارات", "agentDetail.configure.skills.upload.action": "تحميل", "agentDetail.configure.skills.upload.browse": "استعراض", @@ -269,8 +271,8 @@ "agentDetail.configure.tools.moreActions": "إجراءات أخرى لـ {{name}}", "agentDetail.configure.tools.removeAction": "إزالة {{name}}", "agentDetail.configure.tools.removeProvider": "إزالة جميع الأدوات", - "agentDetail.configure.tools.richTip": "أضف أدوات Dify من مساحة عملك. أشر إليها باستخدام / في Prompt. معرفة المزيد\n\nالأدوات التي يثبتها الوكيل في sandbox الخاص به لن تظهر هنا، لكنها ستبقى متاحة له.", - "agentDetail.configure.tools.tip": "أضف أدوات Dify من مساحة عملك. أشر إليها باستخدام / في Prompt. معرفة المزيد\n\nالأدوات التي يثبتها الوكيل في sandbox الخاص به لن تظهر هنا، لكنها ستبقى متاحة له.", + "agentDetail.configure.tools.richTip": "أضف أدوات Dify من مساحة عملك. معرفة المزيد\n\nالأدوات التي يثبتها الوكيل في sandbox الخاص به لن تظهر هنا، لكنها ستبقى متاحة له.", + "agentDetail.configure.tools.tip": "أضف أدوات Dify من مساحة عملك. معرفة المزيد\n\nالأدوات التي يثبتها الوكيل في sandbox الخاص به لن تظهر هنا، لكنها ستبقى متاحة له.", "agentDetail.configure.tools.toggle": "تبديل الأدوات", "agentDetail.configure.tools.toolTabs.all": "الكل", "agentDetail.configure.tools.toolTabs.cli": "CLI", @@ -336,22 +338,22 @@ "agentDetail.metadata.sourceLabel": "المصدر", "agentDetail.monitoring.change": "{{value}} عن الفترة السابقة", "agentDetail.monitoring.dateRangeLabel": "نطاق التاريخ", - "agentDetail.monitoring.description": "تتبّع نشاط وتكلفة وجودة تفاعل الوكيل القابل لإعادة الاستخدام عبر سير العمل.", + "agentDetail.monitoring.description": "تتبّع نشاط هذا الوكيل وتكلفته وجودة التفاعل معه عبر جميع نقاط الوصول.", "agentDetail.monitoring.learnMore": "اعرف المزيد", "agentDetail.monitoring.loadFailed": "تعذر تحميل بيانات المراقبة", - "agentDetail.monitoring.metrics.activeUsers.explanation": "المستخدمون النهائيون الفريدون الذين شغّلوا سير العمل باستخدام هذا الوكيل.", + "agentDetail.monitoring.metrics.activeUsers.explanation": "المستخدمون النهائيون الفريدون الذين تفاعلوا مع هذا الوكيل.", "agentDetail.monitoring.metrics.activeUsers.title": "المستخدمون النشطون", - "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "عدد التواصل المستمر بين المستخدم والوكيل لنقطة الوصول هذه.", + "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "متوسط عدد رسائل المستخدم في كل محادثة.", "agentDetail.monitoring.metrics.avgSessionInteractions.title": "متوسط تفاعلات الجلسة", - "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "متوسط سرعة الإخراج من بداية الطلب حتى الاكتمال.", + "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "متوسط عدد التوكنات التي يتم إنشاؤها في الثانية أثناء ردّ الوكيل.", "agentDetail.monitoring.metrics.tokenOutputSpeed.title": "سرعة إخراج التوكن", - "agentDetail.monitoring.metrics.tokenUsage.explanation": "تكلفة التوكن المقدرة التي ينتجها هذا الوكيل عبر تشغيل سير العمل.", + "agentDetail.monitoring.metrics.tokenUsage.explanation": "التوكنات المستهلكة والتكلفة المقدّرة.", "agentDetail.monitoring.metrics.tokenUsage.title": "استخدام التوكن", "agentDetail.monitoring.metrics.totalConversations.explanation": "محادثات الذكاء الاصطناعي اليومية التي وصلت إلى هذا الوكيل من خلال نقطة الوصول المحددة.", "agentDetail.monitoring.metrics.totalConversations.title": "إجمالي المحادثات", - "agentDetail.monitoring.metrics.totalMessages.explanation": "عدد تفاعلات الوكيل اليومية.", + "agentDetail.monitoring.metrics.totalMessages.explanation": "إجمالي رسائل المستخدمين المرسلة إلى هذا الوكيل.", "agentDetail.monitoring.metrics.totalMessages.title": "إجمالي الرسائل", - "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "عدد الإعجابات لكل 1000 رسالة لهذا الوكيل.", + "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "النسبة المئوية لردود الوكيل التي نالت إعجاب المستخدمين.", "agentDetail.monitoring.metrics.userSatisfactionRate.title": "معدل رضا المستخدم", "agentDetail.monitoring.pickSource": "اختر تطبيقاً", "agentDetail.monitoring.sourceLabel": "التطبيق", @@ -549,7 +551,5 @@ "skillManagement.searchLabel": "Search skills", "skillManagement.searchPlaceholder": "Search", "skillManagement.tags": "Tags", - "skillManagement.title": "Skills", - "agentDetail.configure.files.richTip": "للمواد المرجعية الأطول من أن تُلصق في Prompt: المواصفات، القوالب، الإرشادات. تعرّف على المزيد\n\nفي وضع Build، يمكن للوكيل إعدادها لك.", - "agentDetail.configure.prompt.richTip": "حدّد دور الوكيل وكيفية عمله. تعرّف على المزيد" + "skillManagement.title": "Skills" } diff --git a/web/i18n/ar-TN/skill.json b/web/i18n/ar-TN/skill.json index 50d0af86420..24224f1cef6 100644 --- a/web/i18n/ar-TN/skill.json +++ b/web/i18n/ar-TN/skill.json @@ -1,121 +1,245 @@ { - "skillManagement.clearTags": "Clear tags", - "skillManagement.create": "Create", - "skillManagement.createFailed": "Failed to create skill.", - "skillManagement.createSuccess": "Skill created.", - "skillManagement.dateTimeFormat": "MMM D, YYYY HH:mm", + "skillManagement.clearTags": "مسح العلامات", + "skillManagement.create": "إنشاء", + "skillManagement.createFailed": "فشل في خلق المهارة.", + "skillManagement.createSuccess": "تم إنشاء المسودة.", + "skillManagement.dateTimeFormat": "ش ش د، س س س س س: مم", "skillManagement.deleteDialog.confirmInputLabel": "للتأكيد، اكتب {{skillName}} في الحقل أدناه:", "skillManagement.deleteDialog.confirmInputPlaceholder": "أدخل اسم العرض للـ Skill…", - "skillManagement.deleteDialog.description": "This skill will be removed from the workspace. Agents that reference it may lose access to this capability.", - "skillManagement.deleteDialog.title": "Delete {{name}}?", - "skillManagement.deleteFailed": "Failed to delete skill.", - "skillManagement.deleteSuccess": "Skill deleted.", - "skillManagement.detail.addMetadata": "Add metadata", - "skillManagement.detail.addMetadataDescription": "Add a frontmatter field to this Markdown file.", - "skillManagement.detail.addTag": "Add tag", - "skillManagement.detail.addTagDescription": "Create or bind a tag to this Skill. New tags are saved with the Skill metadata.", - "skillManagement.detail.addTagSuccess": "Tag added.", - "skillManagement.detail.back": "Back to Skills", - "skillManagement.detail.cancelAddMetadata": "Cancel adding metadata", - "skillManagement.detail.closeFileTab": "Close {{name}}", + "skillManagement.deleteDialog.description": "حذف المهارة لا رجعة فيه. سيتم حذف محتواه وسجل الإصدار الكامل نهائيًا. لا يوجد وكلاء يستخدمونه حاليًا.", + "skillManagement.deleteDialog.referencedDescription_one": "يستخدم وكيل {{count}} هذه المهارة، إما بشكل مستقل أو في سير العمل. سيؤدي حذف هذه المهارة إلى مسح محتوياتها وسجل الإصدارات بشكل دائم، وإزالتها من الوكيل المتأثر.", + "skillManagement.deleteDialog.referencedDescription_other": "يستخدم وكلاء {{count}} هذه المهارة، إما بشكل مستقل أو في سير العمل. سيؤدي حذف هذه المهارة إلى مسح محتوياتها وسجل الإصدارات بشكل دائم، وإزالتها من جميع الوكلاء المتأثرين.", + "skillManagement.deleteDialog.title": "حذف {{name}}؟", + "skillManagement.deleteFailed": "فشل في حذف المهارة.", + "skillManagement.deleteSuccess": "تم حذف Skill.", + "skillManagement.detail.addMetadata": "إضافة البيانات الوصفية", + "skillManagement.detail.addMetadataDescription": "أضف حقل المادة الأمامية إلى ملف Markdown هذا.", + "skillManagement.detail.addTag": "إضافة علامة", + "skillManagement.detail.addTagDescription": "قم بإنشاء أو ربط علامة بهذا Skill. يتم حفظ العلامات الجديدة باستخدام البيانات التعريفية Skill.", + "skillManagement.detail.addTagSuccess": "تمت إضافة العلامة.", + "skillManagement.detail.back": "العودة إلى Skills", + "skillManagement.detail.builder.applyFailed": "فشل تطبيق مسودة التحديثات.", + "skillManagement.detail.builder.attach": "إرفاق الملف", + "skillManagement.detail.builder.attachFailed": "فشل في إرفاق الملف.", + "skillManagement.detail.builder.attachLimit": "يمكنك إرفاق ما يصل إلى 10 ملفات.", + "skillManagement.detail.builder.attachTooLarge": "يجب أن يكون حجم الملفات 15 ميغابايت أو أصغر. يجب أن يكون حجم الصور 10 ميغابايت أو أصغر.", + "skillManagement.detail.builder.attachUnsupported": "يمكن إرفاق ملفات الصور والنصوص والمستندات فقط.", + "skillManagement.detail.builder.attachmentOnlyMessage": "استخدم الملف المرفق للمساعدة في تحسين هذه المهارة.", + "skillManagement.detail.builder.close": "إغلاق Skill Builder", + "skillManagement.detail.builder.compatibleModelsOnly": "يتم عرض النماذج المتوافقة فقط", + "skillManagement.detail.builder.copyResponse": "نسخ الرد", + "skillManagement.detail.builder.copySuccess": "تم نسخ الرد إلى الحافظة.", + "skillManagement.detail.builder.editIntro": "لقد قمت بمراجعة هذه المهارة. ما الذي تريد تعديله؟", + "skillManagement.detail.builder.exampleIssueTriage": "فرز مشكلة العملاء", + "skillManagement.detail.builder.exampleOnboarding": "دليل تأهيل الموظفين الجدد", + "skillManagement.detail.builder.exampleSalesFollowUp": "استراتيجية متابعة قيادة المبيعات", + "skillManagement.detail.builder.followUpDisplayName": "استخدم الموافقة على استرداد الأموال كاسم العرض", + "skillManagement.detail.builder.followUpNameIcon": "قم بتطبيق الاسم والرمز المقترحين", + "skillManagement.detail.builder.fromMarketplace": "من السوق", + "skillManagement.detail.builder.model": "GPT-4o", + "skillManagement.detail.builder.modelCredits.all": "جميع الاعتمادات", + "skillManagement.detail.builder.modelCredits.configure": "التكوين مطلوب", + "skillManagement.detail.builder.modelCredits.exhausted": "نفدت الحصة", + "skillManagement.detail.builder.modelProviderSettings": "إعدادات مزود النموذج", + "skillManagement.detail.builder.modelSearch": "البحث في النماذج...", + "skillManagement.detail.builder.modifyPlaceholder": "اطلب من الذكاء الاصطناعي تعديل هذه المهارة...", + "skillManagement.detail.builder.open": "افتح Skill Builder", + "skillManagement.detail.builder.placeholder": "وصف السيناريو...", + "skillManagement.detail.builder.progress.applyingChanges": "تطبيق تغييرات الملف", + "skillManagement.detail.builder.progress.generatingPlan": "إنشاء خطة التحديث", + "skillManagement.detail.builder.progress.readingDraft": "قراءة المسودة الحالية", + "skillManagement.detail.builder.progress.updatingEditor": "تحديث المحرر", + "skillManagement.detail.builder.promptDescription": "قم بوصفها وستظهر مسودة في المحرر، مع تضمين الخطوات والملفات.", + "skillManagement.detail.builder.promptTitle": "ما الذي يجب أن تتعامل معه هذه المهارة؟", + "skillManagement.detail.builder.readAloud": "اقرأ الرد بصوت عالٍ", + "skillManagement.detail.builder.removeAttachment": "إزالة {{name}}", + "skillManagement.detail.builder.restart": "أعد تشغيل المنشئ", + "skillManagement.detail.builder.retryResponse": "أعد محاولة الرد", + "skillManagement.detail.builder.send": "أرسل رسالة", + "skillManagement.detail.builder.sendFailed": "فشل Skill Builder في الاستجابة.", + "skillManagement.detail.builder.thinking": "جارٍ التفكير", + "skillManagement.detail.builder.thinkingUnavailable": "لم يتم إرجاع أي محتوى تفكير بواسطة النموذج.", + "skillManagement.detail.builder.title": "Skill Builder", + "skillManagement.detail.builder.tryExample": "جرب مثالا", + "skillManagement.detail.builder.voice": "إدخال صوتي", + "skillManagement.detail.builder.voiceUnavailable": "الإدخال الصوتي غير متاح بعد.", + "skillManagement.detail.cancelAddMetadata": "إلغاء إضافة البيانات الوصفية", + "skillManagement.detail.closeFileTab": "إغلاق {{name}}", + "skillManagement.detail.closeVersions": "إغلاق الإصدارات", "skillManagement.detail.collapseSidebar": "طي الشريط الجانبي", - "skillManagement.detail.createFile": "New file", - "skillManagement.detail.createFileDescription": "Enter a file path relative to the skill root.", - "skillManagement.detail.createFileMenu": "New file...", - "skillManagement.detail.createFileSuccess": "File created.", - "skillManagement.detail.createFolder": "New folder", - "skillManagement.detail.createFolderDescription": "Enter a folder path relative to the skill root.", - "skillManagement.detail.createFolderMenu": "New folder...", - "skillManagement.detail.createFolderSuccess": "Folder created.", - "skillManagement.detail.createdBy": "Created by {{name}}", - "skillManagement.detail.currentDraft": "Current draft", - "skillManagement.detail.deleteFileConfirm": "Delete this file?", - "skillManagement.detail.deleteFileSuccess": "File deleted.", - "skillManagement.detail.deleteVersionConfirm": "Delete this version?", - "skillManagement.detail.deleteVersionFailed": "Failed to delete version.", - "skillManagement.detail.deleteVersionSuccess": "Version deleted.", - "skillManagement.detail.downloadFile": "Download file", - "skillManagement.detail.draft": "Draft", + "skillManagement.detail.copyContentSuccess": "تم نسخ المحتوى إلى الحافظة.", + "skillManagement.detail.copyFile": "نسخ", + "skillManagement.detail.copyFileSuccess": "الملف جاهز للصقه.", + "skillManagement.detail.copyVersionId": "نسخ المعرف", + "skillManagement.detail.copyVersionIdSuccess": "تم نسخ المعرف إلى الحافظة.", + "skillManagement.detail.createFile": "ملف جديد", + "skillManagement.detail.createFileDescription": "أدخل مسار الملف المتعلق بجذر المهارة.", + "skillManagement.detail.createFileMenu": "ملف جديد...", + "skillManagement.detail.createFileSuccess": "تم إنشاء الملف.", + "skillManagement.detail.createFolder": "مجلد جديد", + "skillManagement.detail.createFolderDescription": "أدخل مسار المجلد المتعلق بجذر المهارة.", + "skillManagement.detail.createFolderMenu": "مجلد جديد...", + "skillManagement.detail.createFolderSuccess": "تم إنشاء المجلد.", + "skillManagement.detail.createdBy": "تم إنشاؤها بواسطة {{name}}", + "skillManagement.detail.currentDraft": "المسودة الحالية", + "skillManagement.detail.cutFile": "يقطع", + "skillManagement.detail.cutFileSuccess": "الملف جاهز للتحرك.", + "skillManagement.detail.deleteFileConfirm": "هل تريد حذف هذا الملف؟", + "skillManagement.detail.deleteFileSuccess": "تم حذف الملف.", + "skillManagement.detail.deleteVersionConfirm": "هل تريد حذف هذا الإصدار؟", + "skillManagement.detail.deleteVersionFailed": "فشل في حذف الإصدار.", + "skillManagement.detail.deleteVersionSuccess": "تم حذف الإصدار.", + "skillManagement.detail.downloadFile": "تنزيل الملف", + "skillManagement.detail.draft": "مسودة", + "skillManagement.detail.editVersionInfo": "تعديل معلومات الإصدار", + "skillManagement.detail.exitVersions": "الخروج من الإصدارات", "skillManagement.detail.expandSidebar": "توسيع الشريط الجانبي", - "skillManagement.detail.fileCount": "{{count}} FILES", - "skillManagement.detail.fileMeta": "{{type}} · {{size}} bytes", - "skillManagement.detail.fileMissing": "File not found.", - "skillManagement.detail.fileOperationFailed": "File operation failed.", - "skillManagement.detail.files": "Files", - "skillManagement.detail.latest": "Latest", - "skillManagement.detail.loadFailed": "Failed to load skill.", - "skillManagement.detail.markdownLiveMode": "Live preview", - "skillManagement.detail.markdownSourceMode": "Source editor", - "skillManagement.detail.metadataKey": "name", - "skillManagement.detail.metadataValue": "value", - "skillManagement.detail.moveFileSuccess": "File moved.", - "skillManagement.detail.moveFilesSuccess": "Files moved.", - "skillManagement.detail.noFileSelected": "Select a file to preview.", - "skillManagement.detail.noFiles": "No files.", + "skillManagement.detail.fileAlreadyExists": "يوجد ملف أو مجلد بهذا الاسم بالفعل.", + "skillManagement.detail.fileCount_one": "ملف {{count}}", + "skillManagement.detail.fileCount_other": "ملفات {{count}}", + "skillManagement.detail.fileMeta": "{{type}} · {{size}} بايت", + "skillManagement.detail.fileMissing": "لم يتم العثور على الملف.", + "skillManagement.detail.fileOperationFailed": "فشلت عملية الملف.", + "skillManagement.detail.files": "الملفات", + "skillManagement.detail.latest": "الأحدث", + "skillManagement.detail.loadFailed": "فشل في تحميل المهارة.", + "skillManagement.detail.loadingTags": "جارٍ تحميل العلامات...", + "skillManagement.detail.markdownLiveMode": "معاينة حية", + "skillManagement.detail.markdownSourceMode": "محرر المصدر", + "skillManagement.detail.metadataKey": "اسم", + "skillManagement.detail.metadataValue": "قيمة", + "skillManagement.detail.moveFileSuccess": "تم نقل الملف.", + "skillManagement.detail.moveFilesSuccess": "تم نقل الملفات.", + "skillManagement.detail.nameThisVersion": "تسمية هذا الإصدار", + "skillManagement.detail.noFileSelected": "حدد ملفًا لمعاينته.", + "skillManagement.detail.noFiles": "لا توجد ملفات.", "skillManagement.detail.noSearchResults": "لا توجد ملفات مطابقة.", - "skillManagement.detail.noVersions": "No published versions yet.", - "skillManagement.detail.previewUnsupported": "Preview is not supported for this file.", - "skillManagement.detail.publish": "Publish", - "skillManagement.detail.publishFailed": "Failed to publish skill.", - "skillManagement.detail.publishSuccess": "Skill published.", - "skillManagement.detail.published": "Published", + "skillManagement.detail.noSelectableTags": "لا توجد علامات متاحة.", + "skillManagement.detail.noVersions": "لا توجد إصدارات منشورة حتى الآن.", + "skillManagement.detail.pasteFile": "لصق", + "skillManagement.detail.pasteFileSuccess": "تم لصق الملف.", + "skillManagement.detail.previewUnsupported": "هذا الملف لا يدعم المعاينة.", + "skillManagement.detail.publish": "نشر", + "skillManagement.detail.publishFailed": "فشل في نشر المهارة.", + "skillManagement.detail.publishReferencesDescription_one": "يصبح النشر ساري المفعول على الفور بالنسبة إلى وكيل {{count}} الذي يستخدم هذه المهارة.", + "skillManagement.detail.publishReferencesDescription_other": "يصبح النشر ساري المفعول على الفور بالنسبة لعملاء {{count}} الذين يستخدمون هذه المهارة.", + "skillManagement.detail.publishReferencesTitle": "مهارة النشر", + "skillManagement.detail.publishSuccess": "Skill تم النشر.", + "skillManagement.detail.publishUpdate": "نشر التحديث", + "skillManagement.detail.published": "تم النشر", "skillManagement.detail.publishedAt": "نُشر {{time}}", + "skillManagement.detail.publishedVersion": "تم النشر #{{number}}", "skillManagement.detail.publishing": "جارٍ النشر...", - "skillManagement.detail.readonly": "Read only", - "skillManagement.detail.referenceFiles.confirm": "Enter Confirm", - "skillManagement.detail.referenceFiles.empty": "No files available.", - "skillManagement.detail.referenceFiles.livePlaceholder": "Write instructions for the agent, type / to reference files", - "skillManagement.detail.referenceFiles.navigate": "↑↓ Navigate", - "skillManagement.detail.referenceFiles.title": "Reference files", - "skillManagement.detail.referencedBy": "Referenced by {{count}} Apps", - "skillManagement.detail.removeMetadata": "Delete {{name}} metadata", - "skillManagement.detail.removeTag": "Remove {{tag}}", - "skillManagement.detail.removeTagSuccess": "Tag removed.", - "skillManagement.detail.renameFile": "Rename file", - "skillManagement.detail.renameFileDescription": "Enter the new path relative to the skill root.", - "skillManagement.detail.renameFileSuccess": "File renamed.", - "skillManagement.detail.renameSkillSuccess": "Skill renamed.", - "skillManagement.detail.renameVersion": "Rename", - "skillManagement.detail.renameVersionFailed": "Failed to rename version.", - "skillManagement.detail.renameVersionPrompt": "Version name", - "skillManagement.detail.renameVersionSuccess": "Version renamed.", - "skillManagement.detail.restoreVersion": "Restore", - "skillManagement.detail.restoreVersionFailed": "Failed to restore version.", - "skillManagement.detail.restoreVersionSuccess": "Version restored to draft.", - "skillManagement.detail.save": "Save", - "skillManagement.detail.saveFailed": "Failed to save file.", - "skillManagement.detail.saveSuccess": "File saved.", - "skillManagement.detail.saved": "Saved", - "skillManagement.detail.savedAt": "Saved {{time}}", - "skillManagement.detail.saving": "Saving...", + "skillManagement.detail.readonly": "اقرأ فقط", + "skillManagement.detail.referenceFiles.confirm": "أدخل تأكيد", + "skillManagement.detail.referenceFiles.empty": "لا توجد ملفات متاحة.", + "skillManagement.detail.referenceFiles.livePlaceholder": "كتابة تعليمات للوكيل. اكتب / للإشارة إلى الملفات.", + "skillManagement.detail.referenceFiles.navigate": "↑↓ التنقل", + "skillManagement.detail.referenceFiles.title": "الملفات المرجعية", + "skillManagement.detail.referencedBy_one": "يستخدمه {{count}} وكيل", + "skillManagement.detail.referencedBy_other": "يستخدمه {{count}} وكلاء", + "skillManagement.detail.removeMetadata": "احذف البيانات التعريفية {{name}}", + "skillManagement.detail.removeTag": "إزالة {{tag}}", + "skillManagement.detail.removeTagSuccess": "تمت إزالة العلامة.", + "skillManagement.detail.renameFile": "إعادة تسمية الملف", + "skillManagement.detail.renameFileDescription": "أدخل المسار الجديد المتعلق بجذر المهارة.", + "skillManagement.detail.renameFileSuccess": "تمت إعادة تسمية الملف.", + "skillManagement.detail.renameSkillSuccess": "تمت إعادة تسمية Skill.", + "skillManagement.detail.renameVersion": "إعادة تسمية", + "skillManagement.detail.renameVersionFailed": "فشلت إعادة تسمية الإصدار.", + "skillManagement.detail.renameVersionPrompt": "اسم الإصدار", + "skillManagement.detail.renameVersionSuccess": "تمت إعادة تسمية الإصدار.", + "skillManagement.detail.resizeSidebar": "تغيير حجم الشريط الجانبي للملف", + "skillManagement.detail.restoreVersion": "استعادة", + "skillManagement.detail.restoreVersionConfirmDescription": "سيؤدي هذا إلى استبدال المسودة الحالية بالملفات من \"{{version}}\". لن يقوم بنشر Skill أو إنشاء إصدار جديد.", + "skillManagement.detail.restoreVersionConfirmTitle": "استعادة هذا الإصدار؟", + "skillManagement.detail.restoreVersionFailed": "فشل في استعادة الإصدار.", + "skillManagement.detail.restoreVersionSuccess": "تمت استعادة الإصدار للمسودة.", + "skillManagement.detail.save": "حفظ", + "skillManagement.detail.saveConflictConfirmDescription": "تم تحديث هذه المهارة في مكان آخر. قم بتحميل أحدث مسودة لمواصلة التحرير. سيتم تجاهل تغييراتك الحالية.", + "skillManagement.detail.saveConflictConfirmTitle": "هل تريد تحميل أحدث مسودة؟", + "skillManagement.detail.saveConflictReload": "تحميل أحدث مسودة", + "skillManagement.detail.saveConflictStatus": "تم الكشف عن الصراع. قم بتحميل أحدث مسودة لمواصلة التحرير.", + "skillManagement.detail.saveFailed": "فشل حفظ الملف.", + "skillManagement.detail.saveSuccess": "تم حفظ الملف.", + "skillManagement.detail.saved": "تم الحفظ", + "skillManagement.detail.savedAt": "تم الحفظ {{time}}", + "skillManagement.detail.saving": "جارٍ الحفظ...", "skillManagement.detail.searchFiles": "البحث عن الملفات", + "skillManagement.detail.showMoreReferences": "أظهر {{count}} المزيد", + "skillManagement.detail.skillDescriptionPlaceholder": "صف ما تفعله هذه المهارة ومتى يجب على الوكلاء استخدامها.", + "skillManagement.detail.skillNamePlaceholder": "استخدم الحروف الصغيرة والأرقام والواصلات.", "skillManagement.detail.unpublishedChanges": "تغييرات غير منشورة", - "skillManagement.detail.unsavedChanges": "Unsaved changes", + "skillManagement.detail.unsavedChanges": "التغييرات غير المحفوظة", "skillManagement.detail.upToDate": "محدّث", - "skillManagement.detail.updateTagsFailed": "Failed to update tags.", - "skillManagement.detail.uploadFile": "Upload file", - "skillManagement.detail.uploadFileFailed": "File upload failed.", - "skillManagement.detail.uploadFileSuccess": "File uploaded.", - "skillManagement.detail.uploadFilesMenu": "Upload files...", + "skillManagement.detail.updateTagsFailed": "فشل تحديث العلامات.", + "skillManagement.detail.uploadCheckFailed": "لا يمكن التحقق من هذه الملفات. حاول ثانية.", + "skillManagement.detail.uploadConflict": "يوجد ملف بهذا الاسم بالفعل.", + "skillManagement.detail.uploadFailureSummary": "فشل {{failed}} من ملفات {{total}}", + "skillManagement.detail.uploadFailureTitle": "فشلت بعض عمليات التحميل", + "skillManagement.detail.uploadFile": "تحميل ملف", + "skillManagement.detail.uploadFileFailed": "فشل تحميل الملف.", + "skillManagement.detail.uploadFileSuccess": "تم تحميل الملف.", + "skillManagement.detail.uploadFilesButton": "تحميل ملفات {{count}}", + "skillManagement.detail.uploadFilesFailedStatus_one": "فشل تحميل ملف {{count}}.", + "skillManagement.detail.uploadFilesFailedStatus_other": "فشل تحميل الملفات {{count}}.", + "skillManagement.detail.uploadFilesMenu": "تحميل الملفات...", + "skillManagement.detail.uploadFilesProgress": "جارٍ تحميل {{completed}}/{{total}}", + "skillManagement.detail.uploadFilesResult": "تم تحميل {{uploaded}} · فشل {{failed}}", + "skillManagement.detail.uploadFilesStatus": "حالة التحميل", + "skillManagement.detail.uploadInvalidExtension": "نوع الملف هذا غير مدعوم.", + "skillManagement.detail.uploadInvalidName": "اسم غير صالح.", + "skillManagement.detail.uploadInvalidPath": "مسار الملف غير صالح.", + "skillManagement.detail.uploadKeepBoth": "احتفظ بكليهما", + "skillManagement.detail.uploadLateConflict": "قام أحد الأشخاص بإضافة هذا الملف أثناء قيامك بالتحميل.", + "skillManagement.detail.uploadMissingExtension": "مطلوب امتداد الملف.", + "skillManagement.detail.uploadNetworkFailure": "فشل التحميل. تحقق من اتصالك.", + "skillManagement.detail.uploadReadySummary": "{{ready}} جاهز · {{decisions}} بحاجة إلى قرار · سيتم تخطي {{skipped}}", + "skillManagement.detail.uploadReplace": "يستبدل", + "skillManagement.detail.uploadResolvedSummary": "{{ready}} جاهز · سيتم تخطي {{skipped}}", + "skillManagement.detail.uploadRetryCount": "أعد محاولة {{count}}", + "skillManagement.detail.uploadReviewTitle": "المراجعة قبل التحميل", + "skillManagement.detail.uploadSkip": "تخطي", + "skillManagement.detail.uploadSkippedGroup": "لا يمكن تحميل ملفات {{count}} وسيتم تخطيها", + "skillManagement.detail.uploadStatusDismiss": "تجاهل حالة التحميل", + "skillManagement.detail.uploadSuggestion": "استخدم الاقتراح", + "skillManagement.detail.uploadWillReplace": "سيتم استبدال الملف الموجود", + "skillManagement.detail.uploadWillUseName": "سيتم التحميل كـ {{name}}", + "skillManagement.detail.versionHistory": "فتح سجل الإصدارات", "skillManagement.detail.versionMeta": "{{hash}} · {{time}}", - "skillManagement.detail.versions": "Versions", - "skillManagement.draft": "Draft", - "skillManagement.duplicateFailed": "Failed to duplicate skill.", - "skillManagement.duplicateSuccess": "Skill duplicated.", - "skillManagement.editedAt": "Edited {{time}}", - "skillManagement.empty": "No skills yet", - "skillManagement.emptySearch": "No skills found", - "skillManagement.import": "Import", - "skillManagement.importFailed": "Failed to import skill.", - "skillManagement.importSuccess": "Skill imported.", - "skillManagement.listLabel": "Workspace skills", - "skillManagement.loadingError": "Failed to load skills", - "skillManagement.moreActions": "More actions for {{name}}", - "skillManagement.noTags": "No tags", - "skillManagement.publishedAt": "Published {{time}}", - "skillManagement.referenceCount": "{{count}} Refs", - "skillManagement.searchLabel": "Search skills", - "skillManagement.searchPlaceholder": "Search", - "skillManagement.tags": "Tags", - "skillManagement.title": "Skills" + "skillManagement.detail.versionPublishNote": "ملاحظات الإصدار", + "skillManagement.detail.versionPublishNotePlaceholder": "وصف هذا التغيير", + "skillManagement.detail.versionPublishedMeta": "{{time}} · {{name}}", + "skillManagement.detail.versionTitle": "العنوان", + "skillManagement.detail.versions": "إصدارات", + "skillManagement.detail.viewOnly": "عرض فقط", + "skillManagement.detail.viewUploadErrors": "عرض الأخطاء", + "skillManagement.draft": "مسودة", + "skillManagement.duplicateFailed": "فشل في تكرار المهارة.", + "skillManagement.duplicateSuccess": "Skill مكرر.", + "skillManagement.editedAt": "تم التعديل {{time}}", + "skillManagement.empty": "لا توجد مهارات بعد", + "skillManagement.emptyAction.createDescription": "قم بوصف السيناريو بكلمات واضحة واحصل على مسودة مهارة لمراجعتها.", + "skillManagement.emptyAction.createTitle": "قم بالإنشاء باستخدام Skill Builder", + "skillManagement.emptyAction.importDescription": "أحضر ملف .zip مع SKILL.md، بتنسيق agentskills.io.", + "skillManagement.emptyAction.importTitle": "استيراد حزمة المهارات", + "skillManagement.emptySearch": "لم يتم العثور على المهارات", + "skillManagement.errors.missingSkillMd": "لا تحتوي هذه الحزمة على SKILL.md. أضف الملف وقم باستيراده مرة أخرى.", + "skillManagement.errors.nameConflict": "توجد بالفعل مهارة اسمها \"{{name}}\". أعد تسميته إلى SKILL.md وقم باستيراده مرة أخرى.", + "skillManagement.errors.workspaceLimit": "وصلت مساحة العمل الخاصة بك إلى الحد الأقصى وهو 500 مهارة. احذف مهارة لإضافة مهارة جديدة.", + "skillManagement.import": "استيراد", + "skillManagement.importFailed": "فشل استيراد المهارة.", + "skillManagement.importSuccess": "Skill مستورد.", + "skillManagement.listLabel": "مهارات مساحة العمل", + "skillManagement.loadingError": "فشل في تحميل المهارات", + "skillManagement.moreActions": "إجراءات أخرى لـ {{name}}", + "skillManagement.noDescription": "لا يوجد وصف بعد", + "skillManagement.noTags": "لا توجد علامات", + "skillManagement.publishedAt": "تم النشر {{time}}", + "skillManagement.referenceCount_one": "{{count}} وكيل", + "skillManagement.referenceCount_other": "{{count}} وكلاء", + "skillManagement.searchLabel": "البحث عن المهارات", + "skillManagement.searchPlaceholder": "البحث بالاسم أو الوصف", + "skillManagement.tags": "العلامات", + "skillManagement.title": "المهارات" } diff --git a/web/i18n/de-DE/agent-v-2.json b/web/i18n/de-DE/agent-v-2.json index 06780109958..f7f8c5a0d81 100644 --- a/web/i18n/de-DE/agent-v-2.json +++ b/web/i18n/de-DE/agent-v-2.json @@ -83,7 +83,7 @@ "agentDetail.configure.buildDraft.changesToApply_other": "{{count}} Änderungen anzuwenden", "agentDetail.configure.buildDraft.discard": "Verwerfen", "agentDetail.configure.buildDraft.modeBadge": "Build-Modus", - "agentDetail.configure.buildDraft.modeDescription": "Sie sind im Build-Modus. Configure kann in diesem Modus nur vom Agenten aktualisiert werden. Formen Sie diese Einrichtung über den Chat rechts und wenden Sie sie dann an.", + "agentDetail.configure.buildDraft.modeDescription": "Sie befinden sich im Build-Modus. Gestalten Sie diese Einrichtung im Chat mit dem Agenten und klicken Sie anschließend auf „Anwenden“.", "agentDetail.configure.buildDraft.rewritten": "Neu geschrieben", "agentDetail.configure.buildDraft.title": "Build-Entwurf", "agentDetail.configure.buildDraft.updated": "Aktualisiert", @@ -105,7 +105,8 @@ "agentDetail.configure.files.preview.failed": "Vorschau konnte nicht geladen werden.", "agentDetail.configure.files.preview.unsupported": "Für diese Datei wird keine Vorschau unterstützt.", "agentDetail.configure.files.remove": "{{name}} entfernen", - "agentDetail.configure.files.tip": "Für Referenzmaterial, das zu lang zum Einfügen in den Prompt ist: Spezifikationen, Vorlagen, Richtlinien. Verweisen Sie im Prompt mit / darauf.\n\nIm Build-Modus kann der Agent diese Einrichtung für Sie übernehmen.", + "agentDetail.configure.files.richTip": "Für Referenzmaterial, das zu lang zum Einfügen in den Prompt ist: Spezifikationen, Vorlagen, Richtlinien. Mehr erfahren\n\nIm Build-Modus kann der Agent diese Einrichtung für Sie übernehmen.", + "agentDetail.configure.files.tip": "Für Referenzmaterial, das zu lang zum Einfügen in den Prompt ist: Spezifikationen, Vorlagen, Richtlinien. Mehr erfahren\n\nIm Build-Modus kann der Agent diese Einrichtung für Sie übernehmen.", "agentDetail.configure.files.toggle": "Dateien umschalten", "agentDetail.configure.files.treeLabel": "Agentendateien", "agentDetail.configure.files.upload.action": "Hochladen", @@ -114,7 +115,7 @@ "agentDetail.configure.files.upload.dropzone": "Datei hier ablegen oder", "agentDetail.configure.files.upload.failed": "Datei konnte nicht hochgeladen werden.", "agentDetail.configure.files.upload.fileType": "DATEI", - "agentDetail.configure.files.upload.invalidFile": "Bitte eine Datei hochladen.", + "agentDetail.configure.files.upload.invalidFile": "Es kann jeweils nur eine Datei hochgeladen werden.", "agentDetail.configure.files.upload.success": "Datei hochgeladen.", "agentDetail.configure.files.upload.title": "Datei hochladen", "agentDetail.configure.knowledgeRetrieval.add": "Wissensabfrage hinzufügen", @@ -177,7 +178,8 @@ "agentDetail.configure.prompt.mention.priyaRamanathan": "Priya Ramanathan", "agentDetail.configure.prompt.placeholder": "Anweisungen hier eintragen,", "agentDetail.configure.prompt.referenceMissing": "{{name}} existiert nicht", - "agentDetail.configure.prompt.tip": "Definieren Sie die Rolle des Agenten und beschreiben Sie seine typische Aufgabe. Verwenden Sie /, um explizit auf Skills, Dateien, Tools und Wissensabrufe zu verweisen.", + "agentDetail.configure.prompt.richTip": "Definieren Sie die Rolle des Agenten und wie er arbeiten soll. Mehr erfahren", + "agentDetail.configure.prompt.tip": "Definieren Sie die Rolle des Agenten und wie er arbeiten soll. Mehr erfahren", "agentDetail.configure.publishBar.draft": "Entwurf", "agentDetail.configure.publishBar.publishUpdate": "Update veröffentlichen", "agentDetail.configure.publishBar.published": "Veröffentlicht", @@ -190,8 +192,8 @@ "agentDetail.configure.publishBar.versionHistory": "Versionsverlauf öffnen", "agentDetail.configure.publishImpact.affectedWorkflows": "Betroffene Workflows", "agentDetail.configure.publishImpact.cancel": "Abbrechen", - "agentDetail.configure.publishImpact.descriptionPrefix": "Ihr Agent erscheint in", - "agentDetail.configure.publishImpact.descriptionSuffix": ". Änderungen wirken sich auf sie aus.", + "agentDetail.configure.publishImpact.descriptionPrefix": "Dieser Agent wird in", + "agentDetail.configure.publishImpact.descriptionSuffix": " verwendet. Durch die Veröffentlichung wird er in allen aktualisiert.", "agentDetail.configure.publishImpact.fallbackAgentName": "diesem Agenten", "agentDetail.configure.publishImpact.title": "{{action}} für {{name}}", "agentDetail.configure.publishImpact.workflowCount_one": "{{count}} Workflow", @@ -222,8 +224,8 @@ "agentDetail.configure.skills.openInLibrary": "Open in Skill library", "agentDetail.configure.skills.remove": "{{name}} entfernen", "agentDetail.configure.skills.removeAction": "Remove", - "agentDetail.configure.skills.richTip": "Bündeln Sie Anweisungen, Dateien und Skripte für eine wiederkehrende Aufgabe in einer Skill. Verweisen Sie im Prompt mit / darauf. Mehr erfahren\n\nIm Build-Modus kann der Agent diese Einrichtung für Sie übernehmen.", - "agentDetail.configure.skills.tip": "Bündeln Sie Anweisungen, Dateien und Skripte für eine wiederkehrende Aufgabe in einer Skill. Verweisen Sie im Prompt mit / darauf. Mehr erfahren\n\nIm Build-Modus kann der Agent diese Einrichtung für Sie übernehmen.", + "agentDetail.configure.skills.richTip": "Bündeln Sie Anweisungen, Dateien und Skripte für eine wiederkehrende Aufgabe in einer Skill. Mehr erfahren\n\nIm Build-Modus kann der Agent diese Einrichtung für Sie übernehmen.", + "agentDetail.configure.skills.tip": "Bündeln Sie Anweisungen, Dateien und Skripte für eine wiederkehrende Aufgabe in einer Skill. Mehr erfahren\n\nIm Build-Modus kann der Agent diese Einrichtung für Sie übernehmen.", "agentDetail.configure.skills.toggle": "Skills umschalten", "agentDetail.configure.skills.upload.action": "Hochladen", "agentDetail.configure.skills.upload.browse": "durchsuchen", @@ -269,8 +271,8 @@ "agentDetail.configure.tools.moreActions": "Weitere Aktionen für {{name}}", "agentDetail.configure.tools.removeAction": "{{name}} entfernen", "agentDetail.configure.tools.removeProvider": "Alle Tools entfernen", - "agentDetail.configure.tools.richTip": "Fügen Sie Dify-Tools aus Ihrem Workspace hinzu. Verweisen Sie im Prompt mit / darauf. Mehr erfahren\n\nTools, die der Agent in seiner Sandbox installiert, erscheinen hier nicht, bleiben ihm aber verfügbar.", - "agentDetail.configure.tools.tip": "Fügen Sie Dify-Tools aus Ihrem Workspace hinzu. Verweisen Sie im Prompt mit / darauf. Mehr erfahren\n\nTools, die der Agent in seiner Sandbox installiert, erscheinen hier nicht, bleiben ihm aber verfügbar.", + "agentDetail.configure.tools.richTip": "Fügen Sie Dify-Tools aus Ihrem Workspace hinzu. Mehr erfahren\n\nTools, die der Agent in seiner Sandbox installiert, erscheinen hier nicht, bleiben ihm aber verfügbar.", + "agentDetail.configure.tools.tip": "Fügen Sie Dify-Tools aus Ihrem Workspace hinzu. Mehr erfahren\n\nTools, die der Agent in seiner Sandbox installiert, erscheinen hier nicht, bleiben ihm aber verfügbar.", "agentDetail.configure.tools.toggle": "Tools umschalten", "agentDetail.configure.tools.toolTabs.all": "Alle", "agentDetail.configure.tools.toolTabs.cli": "CLI", @@ -336,22 +338,22 @@ "agentDetail.metadata.sourceLabel": "Quelle", "agentDetail.monitoring.change": "{{value}} im Vergleich zum Vorzeitraum", "agentDetail.monitoring.dateRangeLabel": "Datumsbereich", - "agentDetail.monitoring.description": "Verfolgen Sie Aktivität, Kosten und Interaktionsqualität des wiederverwendbaren Agenten über Workflows hinweg.", + "agentDetail.monitoring.description": "Verfolgen Sie die Aktivität, Kosten und Interaktionsqualität dieses Agenten über alle Zugangspunkte hinweg.", "agentDetail.monitoring.learnMore": "Mehr erfahren", "agentDetail.monitoring.loadFailed": "Monitoring-Daten konnten nicht geladen werden", - "agentDetail.monitoring.metrics.activeUsers.explanation": "Eindeutige Endbenutzer, die Workflows mit diesem Agenten ausgelöst haben.", + "agentDetail.monitoring.metrics.activeUsers.explanation": "Eindeutige Endbenutzer, die mit diesem Agenten interagiert haben.", "agentDetail.monitoring.metrics.activeUsers.title": "Aktive Benutzer", - "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Anzahl der durchgehenden Benutzer-Agent-Kommunikationen für diesen Zugangspunkt.", + "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Durchschnittliche Anzahl der Benutzernachrichten pro Konversation.", "agentDetail.monitoring.metrics.avgSessionInteractions.title": "Durchschn. Sitzungsinteraktionen", - "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Durchschnittliche Ausgabegeschwindigkeit vom Beginn der Anfrage bis zum Abschluss.", + "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Durchschnittlich pro Sekunde generierte Tokens während einer Antwort des Agenten.", "agentDetail.monitoring.metrics.tokenOutputSpeed.title": "Token-Ausgabegeschwindigkeit", - "agentDetail.monitoring.metrics.tokenUsage.explanation": "Geschätzte Tokenkosten, die dieser Agent über Workflow-Ausführungen hinweg verursacht.", + "agentDetail.monitoring.metrics.tokenUsage.explanation": "Verbrauchte Tokens und geschätzte Kosten.", "agentDetail.monitoring.metrics.tokenUsage.title": "Token-Nutzung", "agentDetail.monitoring.metrics.totalConversations.explanation": "Tägliche KI-Konversationen, die diesen Agenten über den ausgewählten Zugangspunkt erreicht haben.", "agentDetail.monitoring.metrics.totalConversations.title": "Gesamtzahl Konversationen", - "agentDetail.monitoring.metrics.totalMessages.explanation": "Tägliche Anzahl der Agenteninteraktionen.", + "agentDetail.monitoring.metrics.totalMessages.explanation": "Gesamtzahl der Benutzernachrichten, die an diesen Agenten gesendet wurden.", "agentDetail.monitoring.metrics.totalMessages.title": "Gesamtzahl Nachrichten", - "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "Anzahl der Likes pro 1.000 Nachrichten für diesen Agenten.", + "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "Prozentsatz der Antworten des Agenten, die von Benutzern mit „Gefällt mir“ bewertet wurden.", "agentDetail.monitoring.metrics.userSatisfactionRate.title": "Benutzerzufriedenheitsrate", "agentDetail.monitoring.pickSource": "Eine App auswählen", "agentDetail.monitoring.sourceLabel": "App", @@ -549,7 +551,5 @@ "skillManagement.searchLabel": "Search skills", "skillManagement.searchPlaceholder": "Search", "skillManagement.tags": "Tags", - "skillManagement.title": "Skills", - "agentDetail.configure.files.richTip": "Für Referenzmaterial, das zu lang zum Einfügen in den Prompt ist: Spezifikationen, Vorlagen, Richtlinien. Mehr erfahren\n\nIm Build-Modus kann der Agent diese Einrichtung für Sie übernehmen.", - "agentDetail.configure.prompt.richTip": "Definieren Sie die Rolle des Agenten und wie er arbeiten soll. Mehr erfahren" + "skillManagement.title": "Skills" } diff --git a/web/i18n/de-DE/skill.json b/web/i18n/de-DE/skill.json index 61760678230..c5364396fa5 100644 --- a/web/i18n/de-DE/skill.json +++ b/web/i18n/de-DE/skill.json @@ -1,121 +1,245 @@ { - "skillManagement.clearTags": "Clear tags", - "skillManagement.create": "Create", - "skillManagement.createFailed": "Failed to create skill.", - "skillManagement.createSuccess": "Skill created.", - "skillManagement.dateTimeFormat": "MMM D, YYYY HH:mm", + "skillManagement.clearTags": "Tags löschen", + "skillManagement.create": "Erstellen", + "skillManagement.createFailed": "Fertigkeit konnte nicht erstellt werden.", + "skillManagement.createSuccess": "Entwurf erstellt.", + "skillManagement.dateTimeFormat": "MMM T, JJJJ HH:mm", "skillManagement.deleteDialog.confirmInputLabel": "Geben Sie zur Bestätigung {{skillName}} in das folgende Feld ein:", "skillManagement.deleteDialog.confirmInputPlaceholder": "Skill-Anzeigenamen eingeben…", - "skillManagement.deleteDialog.description": "This skill will be removed from the workspace. Agents that reference it may lose access to this capability.", - "skillManagement.deleteDialog.title": "Delete {{name}}?", - "skillManagement.deleteFailed": "Failed to delete skill.", - "skillManagement.deleteSuccess": "Skill deleted.", - "skillManagement.detail.addMetadata": "Add metadata", - "skillManagement.detail.addMetadataDescription": "Add a frontmatter field to this Markdown file.", - "skillManagement.detail.addTag": "Add tag", - "skillManagement.detail.addTagDescription": "Create or bind a tag to this Skill. New tags are saved with the Skill metadata.", - "skillManagement.detail.addTagSuccess": "Tag added.", - "skillManagement.detail.back": "Back to Skills", - "skillManagement.detail.cancelAddMetadata": "Cancel adding metadata", - "skillManagement.detail.closeFileTab": "Close {{name}}", + "skillManagement.deleteDialog.description": "Das Löschen des Skills ist unwiderruflich. Der Inhalt und der vollständige Versionsverlauf werden dauerhaft gelöscht. Derzeit wird es von keinem Agenten verwendet.", + "skillManagement.deleteDialog.referencedDescription_one": "Der {{count}}-Agent verwendet diesen Skill, entweder unabhängig oder in einem Workflow. Durch das Löschen dieses Skills werden sein Inhalt und sein Versionsverlauf dauerhaft gelöscht und er wird vom betroffenen Agenten entfernt.", + "skillManagement.deleteDialog.referencedDescription_other": "{{count}}-Agenten nutzen diesen Skill, entweder unabhängig oder in Workflows. Durch das Löschen dieses Skills werden dessen Inhalt und Versionsverlauf dauerhaft gelöscht und er wird von allen betroffenen Agenten entfernt.", + "skillManagement.deleteDialog.title": "{{name}} löschen?", + "skillManagement.deleteFailed": "Fertigkeit konnte nicht gelöscht werden.", + "skillManagement.deleteSuccess": "Skill gelöscht.", + "skillManagement.detail.addMetadata": "Metadaten hinzufügen", + "skillManagement.detail.addMetadataDescription": "Fügen Sie dieser Markdown-Datei ein Frontmatter-Feld hinzu.", + "skillManagement.detail.addTag": "Tag hinzufügen", + "skillManagement.detail.addTagDescription": "Erstellen oder binden Sie ein Tag an dieses Skill. Neue Tags werden mit den Skill-Metadaten gespeichert.", + "skillManagement.detail.addTagSuccess": "Tag hinzugefügt.", + "skillManagement.detail.back": "Zurück zu Skills", + "skillManagement.detail.builder.applyFailed": "Entwurfsaktualisierungen konnten nicht angewendet werden.", + "skillManagement.detail.builder.attach": "Datei anhängen", + "skillManagement.detail.builder.attachFailed": "Datei konnte nicht angehängt werden.", + "skillManagement.detail.builder.attachLimit": "Sie können bis zu 10 Dateien anhängen.", + "skillManagement.detail.builder.attachTooLarge": "Dateien dürfen maximal 15 MB groß sein. Bilder müssen maximal 10 MB groß sein.", + "skillManagement.detail.builder.attachUnsupported": "Es können nur Bilder, Texte und Dokumentdateien angehängt werden.", + "skillManagement.detail.builder.attachmentOnlyMessage": "Verwenden Sie die angehängte Datei, um diese Fähigkeit zu verbessern.", + "skillManagement.detail.builder.close": "Schließen Sie Skill Builder", + "skillManagement.detail.builder.compatibleModelsOnly": "Es werden nur kompatible Modelle angezeigt", + "skillManagement.detail.builder.copyResponse": "Antwort kopieren", + "skillManagement.detail.builder.copySuccess": "Antwort in die Zwischenablage kopiert.", + "skillManagement.detail.builder.editIntro": "Ich habe diesen Skill überprüft. Was möchten Sie anpassen?", + "skillManagement.detail.builder.exampleIssueTriage": "Triage von Kundenproblemen", + "skillManagement.detail.builder.exampleOnboarding": "Onboarding-Leitfaden für neue Mitarbeiter", + "skillManagement.detail.builder.exampleSalesFollowUp": "Vertriebs-Lead-Follow-up-Strategie", + "skillManagement.detail.builder.followUpDisplayName": "Verwenden Sie „Rückerstattungsgenehmigung“ als Anzeigenamen", + "skillManagement.detail.builder.followUpNameIcon": "Übernehmen Sie den vorgeschlagenen Namen und das vorgeschlagene Symbol", + "skillManagement.detail.builder.fromMarketplace": "Vom Marketplace", + "skillManagement.detail.builder.model": "GPT-4o", + "skillManagement.detail.builder.modelCredits.all": "Alle Credits", + "skillManagement.detail.builder.modelCredits.configure": "Konfiguration erforderlich", + "skillManagement.detail.builder.modelCredits.exhausted": "Kontingent erschöpft", + "skillManagement.detail.builder.modelProviderSettings": "Modellanbieter-Einstellungen", + "skillManagement.detail.builder.modelSearch": "Modelle suchen...", + "skillManagement.detail.builder.modifyPlaceholder": "Bitten Sie die KI, diese Fähigkeit zu ändern ...", + "skillManagement.detail.builder.open": "Öffnen Sie Skill Builder", + "skillManagement.detail.builder.placeholder": "Beschreiben Sie das Szenario...", + "skillManagement.detail.builder.progress.applyingChanges": "Anwenden von Dateiänderungen", + "skillManagement.detail.builder.progress.generatingPlan": "Generieren des Update-Plans", + "skillManagement.detail.builder.progress.readingDraft": "Lesen Sie den aktuellen Entwurf", + "skillManagement.detail.builder.progress.updatingEditor": "Aktualisierung des Editors", + "skillManagement.detail.builder.promptDescription": "Beschreiben Sie es und im Editor erscheint ein Entwurf mit Schritten und Dateien.", + "skillManagement.detail.builder.promptTitle": "Womit soll diese Fähigkeit umgehen?", + "skillManagement.detail.builder.readAloud": "Lesen Sie die Antwort laut vor", + "skillManagement.detail.builder.removeAttachment": "{{name}} entfernen", + "skillManagement.detail.builder.restart": "Starten Sie den Builder neu", + "skillManagement.detail.builder.retryResponse": "Antwort wiederholen", + "skillManagement.detail.builder.send": "Nachricht senden", + "skillManagement.detail.builder.sendFailed": "Skill Builder konnte nicht antworten.", + "skillManagement.detail.builder.thinking": "Denkt nach", + "skillManagement.detail.builder.thinkingUnavailable": "Das Modell gab keinen Denkinhalt zurück.", + "skillManagement.detail.builder.title": "Skill Builder", + "skillManagement.detail.builder.tryExample": "Versuchen Sie es mit einem Beispiel", + "skillManagement.detail.builder.voice": "Spracheingabe", + "skillManagement.detail.builder.voiceUnavailable": "Die Spracheingabe ist noch nicht verfügbar.", + "skillManagement.detail.cancelAddMetadata": "Das Hinzufügen von Metadaten abbrechen", + "skillManagement.detail.closeFileTab": "Schließen {{name}}", + "skillManagement.detail.closeVersions": "Schließen Sie Versionen", "skillManagement.detail.collapseSidebar": "Seitenleiste einklappen", - "skillManagement.detail.createFile": "New file", - "skillManagement.detail.createFileDescription": "Enter a file path relative to the skill root.", - "skillManagement.detail.createFileMenu": "New file...", - "skillManagement.detail.createFileSuccess": "File created.", - "skillManagement.detail.createFolder": "New folder", - "skillManagement.detail.createFolderDescription": "Enter a folder path relative to the skill root.", - "skillManagement.detail.createFolderMenu": "New folder...", - "skillManagement.detail.createFolderSuccess": "Folder created.", - "skillManagement.detail.createdBy": "Created by {{name}}", - "skillManagement.detail.currentDraft": "Current draft", - "skillManagement.detail.deleteFileConfirm": "Delete this file?", - "skillManagement.detail.deleteFileSuccess": "File deleted.", - "skillManagement.detail.deleteVersionConfirm": "Delete this version?", - "skillManagement.detail.deleteVersionFailed": "Failed to delete version.", - "skillManagement.detail.deleteVersionSuccess": "Version deleted.", - "skillManagement.detail.downloadFile": "Download file", - "skillManagement.detail.draft": "Draft", + "skillManagement.detail.copyContentSuccess": "Inhalt in die Zwischenablage kopiert.", + "skillManagement.detail.copyFile": "Kopieren", + "skillManagement.detail.copyFileSuccess": "Datei zum Einfügen bereit.", + "skillManagement.detail.copyVersionId": "ID kopieren", + "skillManagement.detail.copyVersionIdSuccess": "ID in die Zwischenablage kopiert.", + "skillManagement.detail.createFile": "Neue Datei", + "skillManagement.detail.createFileDescription": "Geben Sie einen Dateipfad relativ zum Skill-Stamm ein.", + "skillManagement.detail.createFileMenu": "Neue Datei...", + "skillManagement.detail.createFileSuccess": "Datei erstellt.", + "skillManagement.detail.createFolder": "Neuer Ordner", + "skillManagement.detail.createFolderDescription": "Geben Sie einen Ordnerpfad relativ zum Skill-Stamm ein.", + "skillManagement.detail.createFolderMenu": "Neuer Ordner...", + "skillManagement.detail.createFolderSuccess": "Ordner erstellt.", + "skillManagement.detail.createdBy": "Erstellt von {{name}}", + "skillManagement.detail.currentDraft": "Aktueller Entwurf", + "skillManagement.detail.cutFile": "Schneiden", + "skillManagement.detail.cutFileSuccess": "Datei zum Verschieben bereit.", + "skillManagement.detail.deleteFileConfirm": "Diese Datei löschen?", + "skillManagement.detail.deleteFileSuccess": "Datei gelöscht.", + "skillManagement.detail.deleteVersionConfirm": "Diese Version löschen?", + "skillManagement.detail.deleteVersionFailed": "Die Version konnte nicht gelöscht werden.", + "skillManagement.detail.deleteVersionSuccess": "Version gelöscht.", + "skillManagement.detail.downloadFile": "Datei herunterladen", + "skillManagement.detail.draft": "Entwurf", + "skillManagement.detail.editVersionInfo": "Versionsinformationen bearbeiten", + "skillManagement.detail.exitVersions": "Versionen verlassen", "skillManagement.detail.expandSidebar": "Seitenleiste ausklappen", - "skillManagement.detail.fileCount": "{{count}} FILES", - "skillManagement.detail.fileMeta": "{{type}} · {{size}} bytes", - "skillManagement.detail.fileMissing": "File not found.", - "skillManagement.detail.fileOperationFailed": "File operation failed.", - "skillManagement.detail.files": "Files", - "skillManagement.detail.latest": "Latest", - "skillManagement.detail.loadFailed": "Failed to load skill.", - "skillManagement.detail.markdownLiveMode": "Live preview", - "skillManagement.detail.markdownSourceMode": "Source editor", - "skillManagement.detail.metadataKey": "name", - "skillManagement.detail.metadataValue": "value", - "skillManagement.detail.moveFileSuccess": "File moved.", - "skillManagement.detail.moveFilesSuccess": "Files moved.", - "skillManagement.detail.noFileSelected": "Select a file to preview.", - "skillManagement.detail.noFiles": "No files.", + "skillManagement.detail.fileAlreadyExists": "Eine Datei oder ein Ordner mit diesem Namen existiert bereits.", + "skillManagement.detail.fileCount_one": "{{count}}-Datei", + "skillManagement.detail.fileCount_other": "{{count}}-Dateien", + "skillManagement.detail.fileMeta": "{{type}} · {{size}} Bytes", + "skillManagement.detail.fileMissing": "Datei nicht gefunden.", + "skillManagement.detail.fileOperationFailed": "Der Dateivorgang ist fehlgeschlagen.", + "skillManagement.detail.files": "Dateien", + "skillManagement.detail.latest": "Neueste", + "skillManagement.detail.loadFailed": "Der Skill konnte nicht geladen werden.", + "skillManagement.detail.loadingTags": "Tags werden geladen...", + "skillManagement.detail.markdownLiveMode": "Live-Vorschau", + "skillManagement.detail.markdownSourceMode": "Quelleneditor", + "skillManagement.detail.metadataKey": "Name", + "skillManagement.detail.metadataValue": "Wert", + "skillManagement.detail.moveFileSuccess": "Datei verschoben.", + "skillManagement.detail.moveFilesSuccess": "Dateien verschoben.", + "skillManagement.detail.nameThisVersion": "Nennen Sie diese Version", + "skillManagement.detail.noFileSelected": "Wählen Sie eine Datei zur Vorschau aus.", + "skillManagement.detail.noFiles": "Keine Dateien.", "skillManagement.detail.noSearchResults": "Keine passenden Dateien.", - "skillManagement.detail.noVersions": "No published versions yet.", - "skillManagement.detail.previewUnsupported": "Preview is not supported for this file.", - "skillManagement.detail.publish": "Publish", - "skillManagement.detail.publishFailed": "Failed to publish skill.", - "skillManagement.detail.publishSuccess": "Skill published.", - "skillManagement.detail.published": "Published", + "skillManagement.detail.noSelectableTags": "Keine verfügbaren Tags.", + "skillManagement.detail.noVersions": "Noch keine veröffentlichten Versionen.", + "skillManagement.detail.pasteFile": "Paste", + "skillManagement.detail.pasteFileSuccess": "Datei eingefügt.", + "skillManagement.detail.previewUnsupported": "Für diese Datei wird keine Vorschau unterstützt.", + "skillManagement.detail.publish": "Veröffentlichen", + "skillManagement.detail.publishFailed": "Der Skill konnte nicht veröffentlicht werden.", + "skillManagement.detail.publishReferencesDescription_one": "Die Veröffentlichung wird für den {{count}}-Agenten, der diesen Skill verwendet, sofort wirksam.", + "skillManagement.detail.publishReferencesDescription_other": "Die Veröffentlichung wird für die {{count}}-Agenten, die diesen Skill verwenden, sofort wirksam.", + "skillManagement.detail.publishReferencesTitle": "Fertigkeit veröffentlichen", + "skillManagement.detail.publishSuccess": "Skill veröffentlicht.", + "skillManagement.detail.publishUpdate": "Update veröffentlichen", + "skillManagement.detail.published": "Veröffentlicht", "skillManagement.detail.publishedAt": "Veröffentlicht {{time}}", + "skillManagement.detail.publishedVersion": "Veröffentlicht #{{number}}", "skillManagement.detail.publishing": "Wird veröffentlicht...", - "skillManagement.detail.readonly": "Read only", - "skillManagement.detail.referenceFiles.confirm": "Enter Confirm", - "skillManagement.detail.referenceFiles.empty": "No files available.", - "skillManagement.detail.referenceFiles.livePlaceholder": "Write instructions for the agent, type / to reference files", - "skillManagement.detail.referenceFiles.navigate": "↑↓ Navigate", - "skillManagement.detail.referenceFiles.title": "Reference files", - "skillManagement.detail.referencedBy": "Referenced by {{count}} Apps", - "skillManagement.detail.removeMetadata": "Delete {{name}} metadata", - "skillManagement.detail.removeTag": "Remove {{tag}}", - "skillManagement.detail.removeTagSuccess": "Tag removed.", - "skillManagement.detail.renameFile": "Rename file", - "skillManagement.detail.renameFileDescription": "Enter the new path relative to the skill root.", - "skillManagement.detail.renameFileSuccess": "File renamed.", - "skillManagement.detail.renameSkillSuccess": "Skill renamed.", - "skillManagement.detail.renameVersion": "Rename", - "skillManagement.detail.renameVersionFailed": "Failed to rename version.", - "skillManagement.detail.renameVersionPrompt": "Version name", - "skillManagement.detail.renameVersionSuccess": "Version renamed.", - "skillManagement.detail.restoreVersion": "Restore", - "skillManagement.detail.restoreVersionFailed": "Failed to restore version.", - "skillManagement.detail.restoreVersionSuccess": "Version restored to draft.", - "skillManagement.detail.save": "Save", - "skillManagement.detail.saveFailed": "Failed to save file.", - "skillManagement.detail.saveSuccess": "File saved.", - "skillManagement.detail.saved": "Saved", - "skillManagement.detail.savedAt": "Saved {{time}}", - "skillManagement.detail.saving": "Saving...", + "skillManagement.detail.readonly": "Nur lesen", + "skillManagement.detail.referenceFiles.confirm": "Geben Sie Bestätigen ein", + "skillManagement.detail.referenceFiles.empty": "Keine Dateien verfügbar.", + "skillManagement.detail.referenceFiles.livePlaceholder": "Schreiben Sie Anweisungen für den Agenten. Geben Sie / ein, um auf Dateien zu verweisen.", + "skillManagement.detail.referenceFiles.navigate": "↑↓ Navigieren", + "skillManagement.detail.referenceFiles.title": "Referenzdateien", + "skillManagement.detail.referencedBy_one": "Von {{count}} Agent verwendet", + "skillManagement.detail.referencedBy_other": "Von {{count}} Agenten verwendet", + "skillManagement.detail.removeMetadata": "Löschen Sie {{name}}-Metadaten", + "skillManagement.detail.removeTag": "{{tag}} entfernen", + "skillManagement.detail.removeTagSuccess": "Tag entfernt.", + "skillManagement.detail.renameFile": "Datei umbenennen", + "skillManagement.detail.renameFileDescription": "Geben Sie den neuen Pfad relativ zum Skill-Stamm ein.", + "skillManagement.detail.renameFileSuccess": "Datei umbenannt.", + "skillManagement.detail.renameSkillSuccess": "Skill umbenannt.", + "skillManagement.detail.renameVersion": "Umbenennen", + "skillManagement.detail.renameVersionFailed": "Die Version konnte nicht umbenannt werden.", + "skillManagement.detail.renameVersionPrompt": "Versionsname", + "skillManagement.detail.renameVersionSuccess": "Version umbenannt.", + "skillManagement.detail.resizeSidebar": "Größe der Seitenleiste der Datei ändern", + "skillManagement.detail.restoreVersion": "Wiederherstellen", + "skillManagement.detail.restoreVersionConfirmDescription": "Dadurch wird der aktuelle Entwurf durch die Dateien von „{{version}}“ ersetzt. Es wird weder Skill veröffentlicht noch eine neue Version erstellt.", + "skillManagement.detail.restoreVersionConfirmTitle": "Diese Version wiederherstellen?", + "skillManagement.detail.restoreVersionFailed": "Die Version konnte nicht wiederhergestellt werden.", + "skillManagement.detail.restoreVersionSuccess": "Version als Entwurf wiederhergestellt.", + "skillManagement.detail.save": "Speichern", + "skillManagement.detail.saveConflictConfirmDescription": "Diese Fertigkeit wurde an anderer Stelle aktualisiert. Laden Sie den neuesten Entwurf, um mit der Bearbeitung fortzufahren. Ihre aktuellen Änderungen werden verworfen.", + "skillManagement.detail.saveConflictConfirmTitle": "Den neuesten Entwurf laden?", + "skillManagement.detail.saveConflictReload": "Laden Sie den neuesten Entwurf", + "skillManagement.detail.saveConflictStatus": "Konflikt erkannt. Laden Sie den neuesten Entwurf, um mit der Bearbeitung fortzufahren.", + "skillManagement.detail.saveFailed": "Datei konnte nicht gespeichert werden.", + "skillManagement.detail.saveSuccess": "Datei gespeichert.", + "skillManagement.detail.saved": "Gespeichert", + "skillManagement.detail.savedAt": "Gespeichert {{time}}", + "skillManagement.detail.saving": "Speichern...", "skillManagement.detail.searchFiles": "Dateien suchen", + "skillManagement.detail.showMoreReferences": "Zeige {{count}} mehr", + "skillManagement.detail.skillDescriptionPlaceholder": "Beschreiben Sie, was diese Fähigkeit bewirkt und wann Agenten sie verwenden sollten.", + "skillManagement.detail.skillNamePlaceholder": "Verwenden Sie Kleinbuchstaben, Zahlen und Bindestriche.", "skillManagement.detail.unpublishedChanges": "Unveröffentlichte Änderungen", - "skillManagement.detail.unsavedChanges": "Unsaved changes", + "skillManagement.detail.unsavedChanges": "Nicht gespeicherte Änderungen", "skillManagement.detail.upToDate": "Aktuell", - "skillManagement.detail.updateTagsFailed": "Failed to update tags.", - "skillManagement.detail.uploadFile": "Upload file", - "skillManagement.detail.uploadFileFailed": "File upload failed.", - "skillManagement.detail.uploadFileSuccess": "File uploaded.", - "skillManagement.detail.uploadFilesMenu": "Upload files...", + "skillManagement.detail.updateTagsFailed": "Tags konnten nicht aktualisiert werden.", + "skillManagement.detail.uploadCheckFailed": "Diese Dateien konnten nicht überprüft werden. Versuchen Sie es erneut.", + "skillManagement.detail.uploadConflict": "Eine Datei mit diesem Namen existiert bereits.", + "skillManagement.detail.uploadFailureSummary": "{{failed}} von {{total}}-Dateien ist fehlgeschlagen", + "skillManagement.detail.uploadFailureTitle": "Einige Uploads sind fehlgeschlagen", + "skillManagement.detail.uploadFile": "Datei hochladen", + "skillManagement.detail.uploadFileFailed": "Das Hochladen der Datei ist fehlgeschlagen.", + "skillManagement.detail.uploadFileSuccess": "Datei hochgeladen.", + "skillManagement.detail.uploadFilesButton": "Laden Sie {{count}}-Dateien hoch", + "skillManagement.detail.uploadFilesFailedStatus_one": "Das Hochladen der {{count}}-Datei ist fehlgeschlagen.", + "skillManagement.detail.uploadFilesFailedStatus_other": "Das Hochladen der {{count}}-Datei ist fehlgeschlagen.", + "skillManagement.detail.uploadFilesMenu": "Dateien hochladen...", + "skillManagement.detail.uploadFilesProgress": "Hochladen von {{completed}}/{{total}}", + "skillManagement.detail.uploadFilesResult": "{{uploaded}} hochgeladen · {{failed}} fehlgeschlagen", + "skillManagement.detail.uploadFilesStatus": "Upload-Status", + "skillManagement.detail.uploadInvalidExtension": "Dieser Dateityp wird nicht unterstützt.", + "skillManagement.detail.uploadInvalidName": "Ungültiger Name.", + "skillManagement.detail.uploadInvalidPath": "Ungültiger Dateipfad.", + "skillManagement.detail.uploadKeepBoth": "Behalte beides", + "skillManagement.detail.uploadLateConflict": "Jemand hat diese Datei hinzugefügt, während Sie sie hochgeladen haben.", + "skillManagement.detail.uploadMissingExtension": "Eine Dateierweiterung ist erforderlich.", + "skillManagement.detail.uploadNetworkFailure": "Der Upload ist fehlgeschlagen. Überprüfen Sie Ihre Verbindung.", + "skillManagement.detail.uploadReadySummary": "{{ready}} bereit · {{decisions}} benötigt eine Entscheidung · {{skipped}} wird übersprungen", + "skillManagement.detail.uploadReplace": "Ersetzen", + "skillManagement.detail.uploadResolvedSummary": "{{ready}} bereit · {{skipped}} wird übersprungen", + "skillManagement.detail.uploadRetryCount": "Versuchen Sie es erneut mit {{count}}", + "skillManagement.detail.uploadReviewTitle": "Überprüfen Sie es vor dem Hochladen", + "skillManagement.detail.uploadSkip": "Schiff", + "skillManagement.detail.uploadSkippedGroup": "{{count}}-Dateien können nicht hochgeladen werden und werden übersprungen", + "skillManagement.detail.uploadStatusDismiss": "Upload-Status verwerfen", + "skillManagement.detail.uploadSuggestion": "Vorschlag verwenden", + "skillManagement.detail.uploadWillReplace": "Ersetzt die vorhandene Datei", + "skillManagement.detail.uploadWillUseName": "Wird als {{name}} hochgeladen", + "skillManagement.detail.versionHistory": "Versionsverlauf öffnen", "skillManagement.detail.versionMeta": "{{hash}} · {{time}}", - "skillManagement.detail.versions": "Versions", - "skillManagement.draft": "Draft", - "skillManagement.duplicateFailed": "Failed to duplicate skill.", - "skillManagement.duplicateSuccess": "Skill duplicated.", - "skillManagement.editedAt": "Edited {{time}}", - "skillManagement.empty": "No skills yet", - "skillManagement.emptySearch": "No skills found", - "skillManagement.import": "Import", - "skillManagement.importFailed": "Failed to import skill.", - "skillManagement.importSuccess": "Skill imported.", - "skillManagement.listLabel": "Workspace skills", - "skillManagement.loadingError": "Failed to load skills", - "skillManagement.moreActions": "More actions for {{name}}", - "skillManagement.noTags": "No tags", - "skillManagement.publishedAt": "Published {{time}}", - "skillManagement.referenceCount": "{{count}} Refs", - "skillManagement.searchLabel": "Search skills", - "skillManagement.searchPlaceholder": "Search", - "skillManagement.tags": "Tags", + "skillManagement.detail.versionPublishNote": "Versionshinweise", + "skillManagement.detail.versionPublishNotePlaceholder": "Beschreiben Sie diese Änderung", + "skillManagement.detail.versionPublishedMeta": "{{time}} · {{name}}", + "skillManagement.detail.versionTitle": "Titel", + "skillManagement.detail.versions": "Versionen", + "skillManagement.detail.viewOnly": "Nur ansehen", + "skillManagement.detail.viewUploadErrors": "Fehler anzeigen", + "skillManagement.draft": "Entwurf", + "skillManagement.duplicateFailed": "Fertigkeit konnte nicht dupliziert werden.", + "skillManagement.duplicateSuccess": "Skill dupliziert.", + "skillManagement.editedAt": "Bearbeitet {{time}}", + "skillManagement.empty": "Noch keine Skills", + "skillManagement.emptyAction.createDescription": "Beschreiben Sie ein Szenario in einfachen Worten und erhalten Sie einen Fertigkeitsentwurf zur Überprüfung.", + "skillManagement.emptyAction.createTitle": "Erstellen Sie mit Skill Builder", + "skillManagement.emptyAction.importDescription": "Bringen Sie eine ZIP-Datei mit SKILL.md im Agentskills.io-Format mit.", + "skillManagement.emptyAction.importTitle": "Importieren Sie ein Fertigkeitspaket", + "skillManagement.emptySearch": "Keine Fähigkeiten gefunden", + "skillManagement.errors.missingSkillMd": "Dieses Paket enthält kein SKILL.md. Fügen Sie die Datei hinzu und importieren Sie sie erneut.", + "skillManagement.errors.nameConflict": "Ein Skill mit dem Namen „{{name}}“ ist bereits vorhanden. Benennen Sie es in SKILL.md um und importieren Sie es erneut.", + "skillManagement.errors.workspaceLimit": "Ihr Arbeitsbereich hat die Grenze von 500 Fertigkeiten erreicht. Löschen Sie eine Fertigkeit, um eine neue hinzuzufügen.", + "skillManagement.import": "Importieren", + "skillManagement.importFailed": "Der Skill konnte nicht importiert werden.", + "skillManagement.importSuccess": "Skill importiert.", + "skillManagement.listLabel": "Fähigkeiten am Arbeitsplatz", + "skillManagement.loadingError": "Fertigkeiten konnten nicht geladen werden", + "skillManagement.moreActions": "Weitere Aktionen für {{name}}", + "skillManagement.noDescription": "Noch keine Beschreibung", + "skillManagement.noTags": "Keine Tags", + "skillManagement.publishedAt": "Veröffentlicht {{time}}", + "skillManagement.referenceCount_one": "{{count}} Agent", + "skillManagement.referenceCount_other": "{{count}} Agenten", + "skillManagement.searchLabel": "Skills suchen", + "skillManagement.searchPlaceholder": "Suchen Sie nach Name oder Beschreibung", + "skillManagement.tags": "Schilder", "skillManagement.title": "Skills" } diff --git a/web/i18n/en-US/agent-v-2.json b/web/i18n/en-US/agent-v-2.json index 7e5bf84bb55..ac6ce7de965 100644 --- a/web/i18n/en-US/agent-v-2.json +++ b/web/i18n/en-US/agent-v-2.json @@ -83,7 +83,7 @@ "agentDetail.configure.buildDraft.changesToApply_other": "{{count}} changes to apply", "agentDetail.configure.buildDraft.discard": "Discard", "agentDetail.configure.buildDraft.modeBadge": "Build mode", - "agentDetail.configure.buildDraft.modeDescription": "You’re in build mode. Configure can only be updated by the agent in this mode. Shape this setup through the chat on the right, then Apply.", + "agentDetail.configure.buildDraft.modeDescription": "You're in Build mode. Shape this setup by chatting with the agent, then Apply.", "agentDetail.configure.buildDraft.rewritten": "Rewritten", "agentDetail.configure.buildDraft.title": "Build draft", "agentDetail.configure.buildDraft.updated": "Updated", @@ -105,7 +105,8 @@ "agentDetail.configure.files.preview.failed": "Failed to load preview.", "agentDetail.configure.files.preview.unsupported": "Preview is not supported for this file.", "agentDetail.configure.files.remove": "Remove {{name}}", - "agentDetail.configure.files.tip": "For reference material too long to paste into the Prompt: specs, templates, guidelines. Reference with / in the Prompt.\n\nIn Build mode, the agent can set these up for you.", + "agentDetail.configure.files.richTip": "For reference material too long to paste into the Prompt: specs, templates, guidelines. Learn more\n\nIn Build mode, the agent can set these up for you.", + "agentDetail.configure.files.tip": "For reference material too long to paste into the Prompt: specs, templates, guidelines. Learn more\n\nIn Build mode, the agent can set these up for you.", "agentDetail.configure.files.toggle": "Toggle files", "agentDetail.configure.files.treeLabel": "Agent files", "agentDetail.configure.files.upload.action": "Upload", @@ -114,7 +115,7 @@ "agentDetail.configure.files.upload.dropzone": "Drop a file here, or", "agentDetail.configure.files.upload.failed": "Failed to upload file.", "agentDetail.configure.files.upload.fileType": "FILE", - "agentDetail.configure.files.upload.invalidFile": "Upload one file.", + "agentDetail.configure.files.upload.invalidFile": "Only one file can be uploaded at a time.", "agentDetail.configure.files.upload.success": "File uploaded.", "agentDetail.configure.files.upload.title": "Upload file", "agentDetail.configure.knowledgeRetrieval.add": "Add knowledge retrieval", @@ -177,7 +178,8 @@ "agentDetail.configure.prompt.mention.priyaRamanathan": "Priya Ramanathan", "agentDetail.configure.prompt.placeholder": "Write instructions here,", "agentDetail.configure.prompt.referenceMissing": "{{name}} does not exist", - "agentDetail.configure.prompt.tip": "Define the agent's role and describe its typical task. Use / to make explicit reference to Skills, Files, Tools and Knowledge Retrievals.", + "agentDetail.configure.prompt.richTip": "Define the agent's role and how it should work. Learn more", + "agentDetail.configure.prompt.tip": "Define the agent's role and how it should work. Learn more", "agentDetail.configure.publishBar.draft": "Draft", "agentDetail.configure.publishBar.publishUpdate": "Publish update", "agentDetail.configure.publishBar.published": "Published", @@ -190,8 +192,8 @@ "agentDetail.configure.publishBar.versionHistory": "Open version history", "agentDetail.configure.publishImpact.affectedWorkflows": "Affected Workflows", "agentDetail.configure.publishImpact.cancel": "Cancel", - "agentDetail.configure.publishImpact.descriptionPrefix": "Your agent appears in", - "agentDetail.configure.publishImpact.descriptionSuffix": ". Changes will impact them.", + "agentDetail.configure.publishImpact.descriptionPrefix": "This agent is used in", + "agentDetail.configure.publishImpact.descriptionSuffix": ". Publishing updates it in all of them.", "agentDetail.configure.publishImpact.fallbackAgentName": "this agent", "agentDetail.configure.publishImpact.title": "{{action}} to {{name}}", "agentDetail.configure.publishImpact.workflowCount_one": "{{count}} workflow", @@ -224,8 +226,8 @@ "agentDetail.configure.skills.openInLibrary": "Open in Skill library", "agentDetail.configure.skills.remove": "Remove {{name}}", "agentDetail.configure.skills.removeAction": "Remove", - "agentDetail.configure.skills.richTip": "Package the instructions, files, and scripts for a recurring task into a skill. Reference with / in the Prompt. Learn more\n\nIn Build mode, the agent can set these up for you.", - "agentDetail.configure.skills.tip": "Package the instructions, files, and scripts for a recurring task into a skill. Reference with / in the Prompt. Learn more\n\nIn Build mode, the agent can set these up for you.", + "agentDetail.configure.skills.richTip": "Package the instructions, files, and scripts for a recurring task into a skill. Learn more\n\nIn Build mode, the agent can set these up for you.", + "agentDetail.configure.skills.tip": "Package the instructions, files, and scripts for a recurring task into a skill. Learn more\n\nIn Build mode, the agent can set these up for you.", "agentDetail.configure.skills.toggle": "Toggle skills", "agentDetail.configure.skills.upload.action": "Upload", "agentDetail.configure.skills.upload.browse": "browse", @@ -243,7 +245,8 @@ "agentDetail.configure.skills.workspaceSelector.addSuccess": "Workspace skill added.", "agentDetail.configure.skills.workspaceSelector.added": "Added", "agentDetail.configure.skills.workspaceSelector.draft": "Draft", - "agentDetail.configure.skills.workspaceSelector.empty": "No workspace skills found.", + "agentDetail.configure.skills.workspaceSelector.empty": "No library skills found.", + "agentDetail.configure.skills.workspaceSelector.limitReached": "An agent can use up to 20 library skills. Remove one to add another.", "agentDetail.configure.skills.workspaceSelector.manage": "Manage in Skills", "agentDetail.configure.skills.workspaceSelector.removeSuccess": "Workspace skill removed.", "agentDetail.configure.skills.workspaceSelector.saveFailed": "Failed to update workspace skills.", @@ -280,8 +283,8 @@ "agentDetail.configure.tools.moreActions": "More actions for {{name}}", "agentDetail.configure.tools.removeAction": "Remove {{name}}", "agentDetail.configure.tools.removeProvider": "Remove all tools", - "agentDetail.configure.tools.richTip": "Add Dify tools from your workspace. Reference with / in the Prompt. Learn more\n\nTools the agent installs in its sandbox won't appear here but stay available to it.", - "agentDetail.configure.tools.tip": "Add Dify tools from your workspace. Reference with / in the Prompt. Learn more\n\nTools the agent installs in its sandbox won't appear here but stay available to it.", + "agentDetail.configure.tools.richTip": "Add Dify tools from your workspace. Learn more\n\nTools the agent installs in its sandbox won't appear here but stay available to it.", + "agentDetail.configure.tools.tip": "Add Dify tools from your workspace. Learn more\n\nTools the agent installs in its sandbox won't appear here but stay available to it.", "agentDetail.configure.tools.toggle": "Toggle tools", "agentDetail.configure.tools.toolTabs.all": "All", "agentDetail.configure.tools.toolTabs.cli": "CLI", @@ -347,22 +350,22 @@ "agentDetail.metadata.sourceLabel": "Source", "agentDetail.monitoring.change": "{{value}} from previous period", "agentDetail.monitoring.dateRangeLabel": "Date range", - "agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.", + "agentDetail.monitoring.description": "Track this agent's activity, cost, and interaction quality across all access points.", "agentDetail.monitoring.learnMore": "Learn more", "agentDetail.monitoring.loadFailed": "Failed to load monitoring data", - "agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.", + "agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who interacted with this agent.", "agentDetail.monitoring.metrics.activeUsers.title": "Active Users", - "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Continuous user-agent communication count for this access point.", + "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Average number of user messages per conversation.", "agentDetail.monitoring.metrics.avgSessionInteractions.title": "Avg. Session Interactions", - "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Average output speed from the beginning of the request to completion.", + "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Average tokens generated per second during an agent reply.", "agentDetail.monitoring.metrics.tokenOutputSpeed.title": "Token Output Speed", - "agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.", + "agentDetail.monitoring.metrics.tokenUsage.explanation": "Tokens consumed and estimated cost.", "agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage", "agentDetail.monitoring.metrics.totalConversations.explanation": "Daily AI conversations that reached this agent through the selected access point.", "agentDetail.monitoring.metrics.totalConversations.title": "Total Conversations", - "agentDetail.monitoring.metrics.totalMessages.explanation": "Daily agent interaction count.", + "agentDetail.monitoring.metrics.totalMessages.explanation": "Total user messages sent to this agent.", "agentDetail.monitoring.metrics.totalMessages.title": "Total Messages", - "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "The number of likes per 1,000 messages for this agent.", + "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "Percentage of agent replies that users rated with a like.", "agentDetail.monitoring.metrics.userSatisfactionRate.title": "User Satisfaction Rate", "agentDetail.monitoring.pickSource": "Pick an app", "agentDetail.monitoring.sourceLabel": "App", @@ -624,8 +627,5 @@ "skillManagement.searchLabel": "Search skills", "skillManagement.searchPlaceholder": "Search", "skillManagement.tags": "Tags", - "skillManagement.title": "Skills", - "agentDetail.configure.files.richTip": "For reference material too long to paste into the Prompt: specs, templates, guidelines. Learn more\n\nIn Build mode, the agent can set these up for you.", - "agentDetail.configure.prompt.richTip": "Define the agent's role and how it should work. Learn more", - "agentDetail.configure.skills.workspaceSelector.limitReached": "An agent can use up to 20 library skills. Remove one to add another." + "skillManagement.title": "Skills" } diff --git a/web/i18n/en-US/skill.json b/web/i18n/en-US/skill.json index ea12c979b10..f5da7162225 100644 --- a/web/i18n/en-US/skill.json +++ b/web/i18n/en-US/skill.json @@ -2,12 +2,13 @@ "skillManagement.clearTags": "Clear tags", "skillManagement.create": "Create", "skillManagement.createFailed": "Failed to create skill.", - "skillManagement.createSuccess": "Skill created.", + "skillManagement.createSuccess": "Draft created.", "skillManagement.dateTimeFormat": "MMM D, YYYY HH:mm", "skillManagement.deleteDialog.confirmInputLabel": "To confirm, type {{skillName}} in the box below:", - "skillManagement.deleteDialog.confirmInputPlaceholder": "Enter Skill Display Name…", - "skillManagement.deleteDialog.description": "This skill will be removed from the workspace. Agents that reference it may lose access to this capability.", - "skillManagement.deleteDialog.referencedDescription": "This Skill is referenced by {{count}} Agent, Workflow, or Chatflow item. Deleting it will remove the Skill from the workspace and clear those bindings.", + "skillManagement.deleteDialog.confirmInputPlaceholder": "Enter the skill display name", + "skillManagement.deleteDialog.description": "Deleting the skill is irreversible. Its content and full version history will be permanently deleted. No agents are currently using it.", + "skillManagement.deleteDialog.referencedDescription_one": "{{count}} agent is using this skill, either independently or in a workflow. Deleting this skill will permanently erase its contents and version history, and remove it from the affected agent.", + "skillManagement.deleteDialog.referencedDescription_other": "{{count}} agents are using this skill, either independently or in workflows. Deleting this skill will permanently erase its contents and version history, and remove it from all affected agents.", "skillManagement.deleteDialog.title": "Delete {{name}}?", "skillManagement.deleteFailed": "Failed to delete skill.", "skillManagement.deleteSuccess": "Skill deleted.", @@ -21,14 +22,14 @@ "skillManagement.detail.builder.attach": "Attach file", "skillManagement.detail.builder.attachFailed": "Failed to attach file.", "skillManagement.detail.builder.attachLimit": "You can attach up to 10 files.", - "skillManagement.detail.builder.attachTooLarge": "The file exceeds the allowed size limit.", + "skillManagement.detail.builder.attachTooLarge": "Files must be 15 MB or smaller. Images must be 10 MB or smaller.", "skillManagement.detail.builder.attachUnsupported": "Only images, text, and document files can be attached.", - "skillManagement.detail.builder.attachmentOnlyMessage": "Use the attached file to help improve this Skill.", + "skillManagement.detail.builder.attachmentOnlyMessage": "Use the attached file to help improve this skill.", "skillManagement.detail.builder.close": "Close Skill Builder", "skillManagement.detail.builder.compatibleModelsOnly": "Only compatible models are shown", "skillManagement.detail.builder.copyResponse": "Copy response", "skillManagement.detail.builder.copySuccess": "Response copied to clipboard.", - "skillManagement.detail.builder.editIntro": "I've reviewed this Skill. What would you like to adjust?", + "skillManagement.detail.builder.editIntro": "I've reviewed this skill. What would you like to adjust?", "skillManagement.detail.builder.exampleIssueTriage": "Customer issue triage", "skillManagement.detail.builder.exampleOnboarding": "New hire onboarding guide", "skillManagement.detail.builder.exampleSalesFollowUp": "Sales lead follow-up strategy", @@ -49,7 +50,7 @@ "skillManagement.detail.builder.progress.readingDraft": "Reading the current draft", "skillManagement.detail.builder.progress.updatingEditor": "Updating the editor", "skillManagement.detail.builder.promptDescription": "Describe it and a draft appears in the editor, with steps and files included.", - "skillManagement.detail.builder.promptTitle": "What should this Skill handle?", + "skillManagement.detail.builder.promptTitle": "What should this skill handle?", "skillManagement.detail.builder.readAloud": "Read response aloud", "skillManagement.detail.builder.removeAttachment": "Remove {{name}}", "skillManagement.detail.builder.restart": "Restart builder", @@ -94,7 +95,8 @@ "skillManagement.detail.exitVersions": "Exit versions", "skillManagement.detail.expandSidebar": "Expand sidebar", "skillManagement.detail.fileAlreadyExists": "A file or folder with this name already exists.", - "skillManagement.detail.fileCount": "{{count}} FILES", + "skillManagement.detail.fileCount_one": "{{count}} file", + "skillManagement.detail.fileCount_other": "{{count}} files", "skillManagement.detail.fileMeta": "{{type}} · {{size}} bytes", "skillManagement.detail.fileMissing": "File not found.", "skillManagement.detail.fileOperationFailed": "File operation failed.", @@ -119,7 +121,8 @@ "skillManagement.detail.previewUnsupported": "Preview is not supported for this file.", "skillManagement.detail.publish": "Publish", "skillManagement.detail.publishFailed": "Failed to publish skill.", - "skillManagement.detail.publishReferencesDescription": "Publishing will make this draft active for {{count}} references using this Skill.", + "skillManagement.detail.publishReferencesDescription_one": "Publishing takes effect immediately for the {{count}} agent using this skill.", + "skillManagement.detail.publishReferencesDescription_other": "Publishing takes effect immediately for the {{count}} agents using this skill.", "skillManagement.detail.publishReferencesTitle": "Publish skill", "skillManagement.detail.publishSuccess": "Skill published.", "skillManagement.detail.publishUpdate": "Publish update", @@ -130,10 +133,11 @@ "skillManagement.detail.readonly": "Read only", "skillManagement.detail.referenceFiles.confirm": "Enter Confirm", "skillManagement.detail.referenceFiles.empty": "No files available.", - "skillManagement.detail.referenceFiles.livePlaceholder": "Write instructions for the agent, type / to reference files", + "skillManagement.detail.referenceFiles.livePlaceholder": "Write instructions for the agent. Type / to reference files.", "skillManagement.detail.referenceFiles.navigate": "↑↓ Navigate", "skillManagement.detail.referenceFiles.title": "Reference files", - "skillManagement.detail.referencedBy": "Referenced by {{count}} Apps", + "skillManagement.detail.referencedBy_one": "Used by {{count}} agent", + "skillManagement.detail.referencedBy_other": "Used by {{count}} agents", "skillManagement.detail.removeMetadata": "Delete {{name}} metadata", "skillManagement.detail.removeTag": "Remove {{tag}}", "skillManagement.detail.removeTagSuccess": "Tag removed.", @@ -152,7 +156,7 @@ "skillManagement.detail.restoreVersionFailed": "Failed to restore version.", "skillManagement.detail.restoreVersionSuccess": "Version restored to draft.", "skillManagement.detail.save": "Save", - "skillManagement.detail.saveConflictConfirmDescription": "This Skill was updated in another tab. Loading the latest draft will discard your unsaved changes.", + "skillManagement.detail.saveConflictConfirmDescription": "This skill was updated elsewhere. Load the latest draft to continue editing. Your current changes will be discarded.", "skillManagement.detail.saveConflictConfirmTitle": "Load the latest draft?", "skillManagement.detail.saveConflictReload": "Load latest draft", "skillManagement.detail.saveConflictStatus": "Conflict detected. Load the latest draft to continue editing.", @@ -163,8 +167,8 @@ "skillManagement.detail.saving": "Saving...", "skillManagement.detail.searchFiles": "Search files", "skillManagement.detail.showMoreReferences": "Show {{count}} more", - "skillManagement.detail.skillDescriptionPlaceholder": "Describe what this Skill does and when agents should use it.", - "skillManagement.detail.skillNamePlaceholder": "Name this skill, Lowercase letters, numbers, hyphens. Becomes the folder name on export", + "skillManagement.detail.skillDescriptionPlaceholder": "Describe what this skill does and when agents should use it.", + "skillManagement.detail.skillNamePlaceholder": "Use lowercase letters, numbers, and hyphens.", "skillManagement.detail.unpublishedChanges": "Unpublished changes", "skillManagement.detail.unsavedChanges": "Unsaved changes", "skillManagement.detail.upToDate": "Up to date", @@ -195,7 +199,6 @@ "skillManagement.detail.uploadResolvedSummary": "{{ready}} ready · {{skipped}} will be skipped", "skillManagement.detail.uploadRetryCount": "Retry {{count}}", "skillManagement.detail.uploadReviewTitle": "Review before uploading", - "skillManagement.detail.uploadSizeExceeded": "Too large. Files must be under 512 KB.", "skillManagement.detail.uploadSkip": "Skip", "skillManagement.detail.uploadSkippedGroup": "{{count}} files can't be uploaded and will be skipped", "skillManagement.detail.uploadStatusDismiss": "Dismiss upload status", @@ -215,23 +218,28 @@ "skillManagement.duplicateFailed": "Failed to duplicate skill.", "skillManagement.duplicateSuccess": "Skill duplicated.", "skillManagement.editedAt": "Edited {{time}}", - "skillManagement.empty": "No skill yet", + "skillManagement.empty": "No skills yet", "skillManagement.emptyAction.createDescription": "Describe a scenario in plain words and get a draft skill to review.", "skillManagement.emptyAction.createTitle": "Create with Skill Builder", "skillManagement.emptyAction.importDescription": "Bring a .zip with SKILL.md, in the agentskills.io format.", "skillManagement.emptyAction.importTitle": "Import a skill package", "skillManagement.emptySearch": "No skills found", + "skillManagement.errors.missingSkillMd": "This package has no SKILL.md. Add the file and import it again.", + "skillManagement.errors.nameConflict": "A skill named \"{{name}}\" already exists. Rename it in SKILL.md and import again.", + "skillManagement.errors.workspaceLimit": "Your workspace has reached the limit of 500 skills. Delete a skill to add a new one.", "skillManagement.import": "Import", "skillManagement.importFailed": "Failed to import skill.", "skillManagement.importSuccess": "Skill imported.", "skillManagement.listLabel": "Workspace skills", "skillManagement.loadingError": "Failed to load skills", "skillManagement.moreActions": "More actions for {{name}}", + "skillManagement.noDescription": "No description yet", "skillManagement.noTags": "No tags", "skillManagement.publishedAt": "Published {{time}}", - "skillManagement.referenceCount": "{{count}} Refs", + "skillManagement.referenceCount_one": "{{count}} agent", + "skillManagement.referenceCount_other": "{{count}} agents", "skillManagement.searchLabel": "Search skills", - "skillManagement.searchPlaceholder": "Search", + "skillManagement.searchPlaceholder": "Search by name or description", "skillManagement.tags": "Tags", "skillManagement.title": "Skills" } diff --git a/web/i18n/es-ES/agent-v-2.json b/web/i18n/es-ES/agent-v-2.json index 4844993d8c8..aaaea8fe982 100644 --- a/web/i18n/es-ES/agent-v-2.json +++ b/web/i18n/es-ES/agent-v-2.json @@ -83,7 +83,7 @@ "agentDetail.configure.buildDraft.changesToApply_other": "{{count}} cambios por aplicar", "agentDetail.configure.buildDraft.discard": "Descartar", "agentDetail.configure.buildDraft.modeBadge": "Modo build", - "agentDetail.configure.buildDraft.modeDescription": "Estás en modo build. Configure solo puede ser actualizado por el agente en este modo. Ajusta esta configuración con el chat de la derecha y luego aplica los cambios.", + "agentDetail.configure.buildDraft.modeDescription": "Estás en modo build. Da forma a esta configuración chateando con el agente y, después, selecciona Aplicar.", "agentDetail.configure.buildDraft.rewritten": "Reescrito", "agentDetail.configure.buildDraft.title": "Borrador de compilación", "agentDetail.configure.buildDraft.updated": "Actualizado", @@ -105,7 +105,8 @@ "agentDetail.configure.files.preview.failed": "Error al cargar la vista previa.", "agentDetail.configure.files.preview.unsupported": "Este archivo no admite vista previa.", "agentDetail.configure.files.remove": "Eliminar {{name}}", - "agentDetail.configure.files.tip": "Para material de referencia demasiado largo para pegar en el Prompt: especificaciones, plantillas, guías. Haz referencia con / en el Prompt.\n\nEn modo Build, el agente puede configurarlos por ti.", + "agentDetail.configure.files.richTip": "Para material de referencia demasiado largo para pegar en el Prompt: especificaciones, plantillas, guías. Más información\n\nEn modo Build, el agente puede configurarlos por ti.", + "agentDetail.configure.files.tip": "Para material de referencia demasiado largo para pegar en el Prompt: especificaciones, plantillas, guías. Más información\n\nEn modo Build, el agente puede configurarlos por ti.", "agentDetail.configure.files.toggle": "Alternar archivos", "agentDetail.configure.files.treeLabel": "Archivos del agente", "agentDetail.configure.files.upload.action": "Subir", @@ -114,7 +115,7 @@ "agentDetail.configure.files.upload.dropzone": "Suelta un archivo aquí, o", "agentDetail.configure.files.upload.failed": "Error al subir el archivo.", "agentDetail.configure.files.upload.fileType": "ARCHIVO", - "agentDetail.configure.files.upload.invalidFile": "Sube un archivo.", + "agentDetail.configure.files.upload.invalidFile": "Solo se puede subir un archivo a la vez.", "agentDetail.configure.files.upload.success": "Archivo subido.", "agentDetail.configure.files.upload.title": "Subir archivo", "agentDetail.configure.knowledgeRetrieval.add": "Agregar recuperación de conocimiento", @@ -177,7 +178,8 @@ "agentDetail.configure.prompt.mention.priyaRamanathan": "Priya Ramanathan", "agentDetail.configure.prompt.placeholder": "Escribe las instrucciones aquí,", "agentDetail.configure.prompt.referenceMissing": "{{name}} no existe", - "agentDetail.configure.prompt.tip": "Define el rol del agente y describe su tarea habitual. Usa / para hacer referencia explícita a habilidades, archivos, herramientas y recuperaciones de conocimiento.", + "agentDetail.configure.prompt.richTip": "Define el rol del agente y cómo debe trabajar. Más información", + "agentDetail.configure.prompt.tip": "Define el rol del agente y cómo debe trabajar. Más información", "agentDetail.configure.publishBar.draft": "Borrador", "agentDetail.configure.publishBar.publishUpdate": "Publicar actualización", "agentDetail.configure.publishBar.published": "Publicado", @@ -190,8 +192,8 @@ "agentDetail.configure.publishBar.versionHistory": "Abrir historial de versiones", "agentDetail.configure.publishImpact.affectedWorkflows": "Flujos de trabajo afectados", "agentDetail.configure.publishImpact.cancel": "Cancelar", - "agentDetail.configure.publishImpact.descriptionPrefix": "Tu agente aparece en", - "agentDetail.configure.publishImpact.descriptionSuffix": ". Los cambios los afectarán.", + "agentDetail.configure.publishImpact.descriptionPrefix": "Este agente se utiliza en", + "agentDetail.configure.publishImpact.descriptionSuffix": ". Al publicarlo, se actualizará en todos ellos.", "agentDetail.configure.publishImpact.fallbackAgentName": "este agente", "agentDetail.configure.publishImpact.title": "{{action}} en {{name}}", "agentDetail.configure.publishImpact.workflowCount_one": "{{count}} flujo de trabajo", @@ -222,8 +224,8 @@ "agentDetail.configure.skills.openInLibrary": "Open in Skill library", "agentDetail.configure.skills.remove": "Eliminar {{name}}", "agentDetail.configure.skills.removeAction": "Remove", - "agentDetail.configure.skills.richTip": "Empaqueta las instrucciones, archivos y scripts de una tarea recurrente en una skill. Haz referencia con / en el Prompt. Más información\n\nEn modo Build, el agente puede configurarlas por ti.", - "agentDetail.configure.skills.tip": "Empaqueta las instrucciones, archivos y scripts de una tarea recurrente en una skill. Haz referencia con / en el Prompt. Más información\n\nEn modo Build, el agente puede configurarlas por ti.", + "agentDetail.configure.skills.richTip": "Empaqueta las instrucciones, archivos y scripts de una tarea recurrente en una skill. Más información\n\nEn modo Build, el agente puede configurarlas por ti.", + "agentDetail.configure.skills.tip": "Empaqueta las instrucciones, archivos y scripts de una tarea recurrente en una skill. Más información\n\nEn modo Build, el agente puede configurarlas por ti.", "agentDetail.configure.skills.toggle": "Alternar habilidades", "agentDetail.configure.skills.upload.action": "Subir", "agentDetail.configure.skills.upload.browse": "examinar", @@ -269,8 +271,8 @@ "agentDetail.configure.tools.moreActions": "Más acciones para {{name}}", "agentDetail.configure.tools.removeAction": "Eliminar {{name}}", "agentDetail.configure.tools.removeProvider": "Eliminar todas las herramientas", - "agentDetail.configure.tools.richTip": "Añade herramientas de Dify desde tu espacio de trabajo. Haz referencia con / en el Prompt. Más información\n\nLas herramientas que el agente instale en su sandbox no aparecerán aquí, pero seguirán disponibles para él.", - "agentDetail.configure.tools.tip": "Añade herramientas de Dify desde tu espacio de trabajo. Haz referencia con / en el Prompt. Más información\n\nLas herramientas que el agente instale en su sandbox no aparecerán aquí, pero seguirán disponibles para él.", + "agentDetail.configure.tools.richTip": "Añade herramientas de Dify desde tu espacio de trabajo. Más información\n\nLas herramientas que el agente instale en su sandbox no aparecerán aquí, pero seguirán disponibles para él.", + "agentDetail.configure.tools.tip": "Añade herramientas de Dify desde tu espacio de trabajo. Más información\n\nLas herramientas que el agente instale en su sandbox no aparecerán aquí, pero seguirán disponibles para él.", "agentDetail.configure.tools.toggle": "Alternar herramientas", "agentDetail.configure.tools.toolTabs.all": "Todas", "agentDetail.configure.tools.toolTabs.cli": "CLI", @@ -336,22 +338,22 @@ "agentDetail.metadata.sourceLabel": "Fuente", "agentDetail.monitoring.change": "{{value}} respecto al periodo anterior", "agentDetail.monitoring.dateRangeLabel": "Rango de fechas", - "agentDetail.monitoring.description": "Realiza un seguimiento de la actividad, el coste y la calidad de interacción del agente reutilizable en todos los flujos de trabajo.", + "agentDetail.monitoring.description": "Realiza un seguimiento de la actividad, el coste y la calidad de las interacciones de este agente en todos los puntos de acceso.", "agentDetail.monitoring.learnMore": "Más información", "agentDetail.monitoring.loadFailed": "No se pudieron cargar los datos de monitoreo", - "agentDetail.monitoring.metrics.activeUsers.explanation": "Usuarios finales únicos que activaron flujos de trabajo usando este agente.", + "agentDetail.monitoring.metrics.activeUsers.explanation": "Usuarios finales únicos que interactuaron con este agente.", "agentDetail.monitoring.metrics.activeUsers.title": "Usuarios activos", - "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Recuento continuo de comunicación entre usuario y agente para este punto de acceso.", + "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Número medio de mensajes de usuario por conversación.", "agentDetail.monitoring.metrics.avgSessionInteractions.title": "Prom. interacciones por sesión", - "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Velocidad media de salida desde el inicio de la solicitud hasta la finalización.", + "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Media de tokens generados por segundo durante una respuesta del agente.", "agentDetail.monitoring.metrics.tokenOutputSpeed.title": "Velocidad de salida de tokens", - "agentDetail.monitoring.metrics.tokenUsage.explanation": "Coste estimado de tokens producido por este agente en las ejecuciones de flujos de trabajo.", + "agentDetail.monitoring.metrics.tokenUsage.explanation": "Tokens consumidos y coste estimado.", "agentDetail.monitoring.metrics.tokenUsage.title": "Uso de tokens", "agentDetail.monitoring.metrics.totalConversations.explanation": "Conversaciones de IA diarias que llegaron a este agente a través del punto de acceso seleccionado.", "agentDetail.monitoring.metrics.totalConversations.title": "Conversaciones totales", - "agentDetail.monitoring.metrics.totalMessages.explanation": "Recuento diario de interacciones del agente.", + "agentDetail.monitoring.metrics.totalMessages.explanation": "Número total de mensajes de usuario enviados a este agente.", "agentDetail.monitoring.metrics.totalMessages.title": "Mensajes totales", - "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "El número de me gusta por cada 1.000 mensajes para este agente.", + "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "Porcentaje de respuestas del agente que los usuarios valoraron con un «Me gusta».", "agentDetail.monitoring.metrics.userSatisfactionRate.title": "Tasa de satisfacción del usuario", "agentDetail.monitoring.pickSource": "Elige una aplicación", "agentDetail.monitoring.sourceLabel": "Aplicación", @@ -549,7 +551,5 @@ "skillManagement.searchLabel": "Search skills", "skillManagement.searchPlaceholder": "Search", "skillManagement.tags": "Tags", - "skillManagement.title": "Skills", - "agentDetail.configure.files.richTip": "Para material de referencia demasiado largo para pegar en el Prompt: especificaciones, plantillas, guías. Más información\n\nEn modo Build, el agente puede configurarlos por ti.", - "agentDetail.configure.prompt.richTip": "Define el rol del agente y cómo debe trabajar. Más información" + "skillManagement.title": "Skills" } diff --git a/web/i18n/es-ES/skill.json b/web/i18n/es-ES/skill.json index 56a6f2da24e..12c49f80fa6 100644 --- a/web/i18n/es-ES/skill.json +++ b/web/i18n/es-ES/skill.json @@ -1,121 +1,245 @@ { - "skillManagement.clearTags": "Clear tags", - "skillManagement.create": "Create", - "skillManagement.createFailed": "Failed to create skill.", - "skillManagement.createSuccess": "Skill created.", - "skillManagement.dateTimeFormat": "MMM D, YYYY HH:mm", + "skillManagement.clearTags": "Borrar etiquetas", + "skillManagement.create": "Crear", + "skillManagement.createFailed": "No se pudo crear habilidad.", + "skillManagement.createSuccess": "Borrador creado.", + "skillManagement.dateTimeFormat": "MMM D, AAAA HH:mm", "skillManagement.deleteDialog.confirmInputLabel": "Para confirmar, escriba {{skillName}} en el campo siguiente:", "skillManagement.deleteDialog.confirmInputPlaceholder": "Ingrese el nombre para mostrar del Skill…", - "skillManagement.deleteDialog.description": "This skill will be removed from the workspace. Agents that reference it may lose access to this capability.", - "skillManagement.deleteDialog.title": "Delete {{name}}?", - "skillManagement.deleteFailed": "Failed to delete skill.", - "skillManagement.deleteSuccess": "Skill deleted.", - "skillManagement.detail.addMetadata": "Add metadata", - "skillManagement.detail.addMetadataDescription": "Add a frontmatter field to this Markdown file.", - "skillManagement.detail.addTag": "Add tag", - "skillManagement.detail.addTagDescription": "Create or bind a tag to this Skill. New tags are saved with the Skill metadata.", - "skillManagement.detail.addTagSuccess": "Tag added.", - "skillManagement.detail.back": "Back to Skills", - "skillManagement.detail.cancelAddMetadata": "Cancel adding metadata", - "skillManagement.detail.closeFileTab": "Close {{name}}", + "skillManagement.deleteDialog.description": "Eliminar la habilidad es irreversible. Su contenido y el historial de versiones completo se eliminarán permanentemente. Ningún agente lo está utilizando actualmente.", + "skillManagement.deleteDialog.referencedDescription_one": "El agente {{count}} está utilizando esta habilidad, ya sea de forma independiente o en un flujo de trabajo. Al eliminar esta habilidad se borrarán permanentemente su contenido y su historial de versiones, y se eliminará del agente afectado.", + "skillManagement.deleteDialog.referencedDescription_other": "Los agentes de {{count}} utilizan esta habilidad, ya sea de forma independiente o en flujos de trabajo. Al eliminar esta habilidad se borrarán permanentemente su contenido y su historial de versiones, y se eliminará de todos los agentes afectados.", + "skillManagement.deleteDialog.title": "¿Eliminar {{name}}?", + "skillManagement.deleteFailed": "No se pudo eliminar la habilidad.", + "skillManagement.deleteSuccess": "Skill eliminado.", + "skillManagement.detail.addMetadata": "Agregar metadatos", + "skillManagement.detail.addMetadataDescription": "Agregue un campo frontal a este archivo Markdown.", + "skillManagement.detail.addTag": "Agregar etiqueta", + "skillManagement.detail.addTagDescription": "Cree o vincule una etiqueta a este Skill. Las nuevas etiquetas se guardan con los metadatos Skill.", + "skillManagement.detail.addTagSuccess": "Etiqueta agregada.", + "skillManagement.detail.back": "Volver a Skills", + "skillManagement.detail.builder.applyFailed": "No se pudieron aplicar las actualizaciones del borrador.", + "skillManagement.detail.builder.attach": "Adjuntar archivo", + "skillManagement.detail.builder.attachFailed": "No se pudo adjuntar el archivo.", + "skillManagement.detail.builder.attachLimit": "Puede adjuntar hasta 10 archivos.", + "skillManagement.detail.builder.attachTooLarge": "Los archivos deben tener 15 MB o menos. Las imágenes deben tener 10 MB o menos.", + "skillManagement.detail.builder.attachUnsupported": "Sólo se pueden adjuntar archivos de imágenes, texto y documentos.", + "skillManagement.detail.builder.attachmentOnlyMessage": "Utilice el archivo adjunto para ayudar a mejorar esta habilidad.", + "skillManagement.detail.builder.close": "Cerrar Skill Builder", + "skillManagement.detail.builder.compatibleModelsOnly": "Solo se muestran los modelos compatibles", + "skillManagement.detail.builder.copyResponse": "Copiar respuesta", + "skillManagement.detail.builder.copySuccess": "Respuesta copiada al portapapeles.", + "skillManagement.detail.builder.editIntro": "He revisado esta habilidad. ¿Qué te gustaría ajustar?", + "skillManagement.detail.builder.exampleIssueTriage": "Clasificación de problemas del cliente", + "skillManagement.detail.builder.exampleOnboarding": "Guía de incorporación de nuevos empleados", + "skillManagement.detail.builder.exampleSalesFollowUp": "Estrategia de seguimiento de leads de ventas", + "skillManagement.detail.builder.followUpDisplayName": "Utilice Aprobación de reembolso como nombre para mostrar", + "skillManagement.detail.builder.followUpNameIcon": "Aplicar el nombre y el icono sugeridos", + "skillManagement.detail.builder.fromMarketplace": "Desde el Marketplace", + "skillManagement.detail.builder.model": "GPT-4o", + "skillManagement.detail.builder.modelCredits.all": "Todos los créditos", + "skillManagement.detail.builder.modelCredits.configure": "Configuración requerida", + "skillManagement.detail.builder.modelCredits.exhausted": "Cuota agotada", + "skillManagement.detail.builder.modelProviderSettings": "Configuración del proveedor de modelos", + "skillManagement.detail.builder.modelSearch": "Buscar modelos...", + "skillManagement.detail.builder.modifyPlaceholder": "Pídele a la IA que modifique esta habilidad...", + "skillManagement.detail.builder.open": "Abrir Skill Builder", + "skillManagement.detail.builder.placeholder": "Describe el escenario...", + "skillManagement.detail.builder.progress.applyingChanges": "Aplicar cambios de archivos", + "skillManagement.detail.builder.progress.generatingPlan": "Generando el plan de actualización", + "skillManagement.detail.builder.progress.readingDraft": "Leyendo el borrador actual", + "skillManagement.detail.builder.progress.updatingEditor": "Actualizando el editor", + "skillManagement.detail.builder.promptDescription": "Descríbelo y aparecerá un borrador en el editor, con los pasos y archivos incluidos.", + "skillManagement.detail.builder.promptTitle": "¿Qué debería manejar esta habilidad?", + "skillManagement.detail.builder.readAloud": "Leer la respuesta en voz alta", + "skillManagement.detail.builder.removeAttachment": "Eliminar {{name}}", + "skillManagement.detail.builder.restart": "Reiniciar constructor", + "skillManagement.detail.builder.retryResponse": "Reintentar respuesta", + "skillManagement.detail.builder.send": "enviar mensaje", + "skillManagement.detail.builder.sendFailed": "Skill Builder no pudo responder.", + "skillManagement.detail.builder.thinking": "Pensando", + "skillManagement.detail.builder.thinkingUnavailable": "El modelo no devolvió ningún contenido de pensamiento.", + "skillManagement.detail.builder.title": "Skill Builder", + "skillManagement.detail.builder.tryExample": "Pruebe un ejemplo", + "skillManagement.detail.builder.voice": "Entrada de voz", + "skillManagement.detail.builder.voiceUnavailable": "La entrada de voz aún no está disponible.", + "skillManagement.detail.cancelAddMetadata": "Cancelar agregar metadatos", + "skillManagement.detail.closeFileTab": "Cerrar {{name}}", + "skillManagement.detail.closeVersions": "Cerrar versiones", "skillManagement.detail.collapseSidebar": "Contraer barra lateral", - "skillManagement.detail.createFile": "New file", - "skillManagement.detail.createFileDescription": "Enter a file path relative to the skill root.", - "skillManagement.detail.createFileMenu": "New file...", - "skillManagement.detail.createFileSuccess": "File created.", - "skillManagement.detail.createFolder": "New folder", - "skillManagement.detail.createFolderDescription": "Enter a folder path relative to the skill root.", - "skillManagement.detail.createFolderMenu": "New folder...", - "skillManagement.detail.createFolderSuccess": "Folder created.", - "skillManagement.detail.createdBy": "Created by {{name}}", - "skillManagement.detail.currentDraft": "Current draft", - "skillManagement.detail.deleteFileConfirm": "Delete this file?", - "skillManagement.detail.deleteFileSuccess": "File deleted.", - "skillManagement.detail.deleteVersionConfirm": "Delete this version?", - "skillManagement.detail.deleteVersionFailed": "Failed to delete version.", - "skillManagement.detail.deleteVersionSuccess": "Version deleted.", - "skillManagement.detail.downloadFile": "Download file", - "skillManagement.detail.draft": "Draft", + "skillManagement.detail.copyContentSuccess": "Contenido copiado al portapapeles.", + "skillManagement.detail.copyFile": "Copiar", + "skillManagement.detail.copyFileSuccess": "Archivo listo para pegar.", + "skillManagement.detail.copyVersionId": "Copiar ID", + "skillManagement.detail.copyVersionIdSuccess": "ID copiado al portapapeles.", + "skillManagement.detail.createFile": "Nuevo archivo", + "skillManagement.detail.createFileDescription": "Ingrese una ruta de archivo relativa a la raíz de la habilidad.", + "skillManagement.detail.createFileMenu": "Nuevo archivo...", + "skillManagement.detail.createFileSuccess": "Archivo creado.", + "skillManagement.detail.createFolder": "Nueva carpeta", + "skillManagement.detail.createFolderDescription": "Ingrese una ruta de carpeta relativa a la raíz de la habilidad.", + "skillManagement.detail.createFolderMenu": "Nueva carpeta...", + "skillManagement.detail.createFolderSuccess": "Carpeta creada.", + "skillManagement.detail.createdBy": "Creado por {{name}}", + "skillManagement.detail.currentDraft": "Borrador actual", + "skillManagement.detail.cutFile": "Cortar", + "skillManagement.detail.cutFileSuccess": "Archivo listo para moverse.", + "skillManagement.detail.deleteFileConfirm": "¿Eliminar este archivo?", + "skillManagement.detail.deleteFileSuccess": "Archivo eliminado.", + "skillManagement.detail.deleteVersionConfirm": "¿Eliminar esta versión?", + "skillManagement.detail.deleteVersionFailed": "No se pudo eliminar la versión.", + "skillManagement.detail.deleteVersionSuccess": "Versión eliminada.", + "skillManagement.detail.downloadFile": "Descargar archivo", + "skillManagement.detail.draft": "Borrador", + "skillManagement.detail.editVersionInfo": "Editar información de la versión", + "skillManagement.detail.exitVersions": "Salir de versiones", "skillManagement.detail.expandSidebar": "Expandir barra lateral", - "skillManagement.detail.fileCount": "{{count}} FILES", + "skillManagement.detail.fileAlreadyExists": "Ya existe un archivo o carpeta con este nombre.", + "skillManagement.detail.fileCount_one": "Archivo {{count}}", + "skillManagement.detail.fileCount_other": "Archivos {{count}}", "skillManagement.detail.fileMeta": "{{type}} · {{size}} bytes", - "skillManagement.detail.fileMissing": "File not found.", - "skillManagement.detail.fileOperationFailed": "File operation failed.", - "skillManagement.detail.files": "Files", - "skillManagement.detail.latest": "Latest", - "skillManagement.detail.loadFailed": "Failed to load skill.", - "skillManagement.detail.markdownLiveMode": "Live preview", - "skillManagement.detail.markdownSourceMode": "Source editor", - "skillManagement.detail.metadataKey": "name", - "skillManagement.detail.metadataValue": "value", - "skillManagement.detail.moveFileSuccess": "File moved.", - "skillManagement.detail.moveFilesSuccess": "Files moved.", - "skillManagement.detail.noFileSelected": "Select a file to preview.", - "skillManagement.detail.noFiles": "No files.", + "skillManagement.detail.fileMissing": "Archivo no encontrado.", + "skillManagement.detail.fileOperationFailed": "La operación del archivo falló.", + "skillManagement.detail.files": "Archivos", + "skillManagement.detail.latest": "último", + "skillManagement.detail.loadFailed": "No se pudo cargar la habilidad.", + "skillManagement.detail.loadingTags": "Cargando etiquetas...", + "skillManagement.detail.markdownLiveMode": "Vista previa en vivo", + "skillManagement.detail.markdownSourceMode": "editor de código fuente", + "skillManagement.detail.metadataKey": "nombre", + "skillManagement.detail.metadataValue": "valor", + "skillManagement.detail.moveFileSuccess": "Archivo movido.", + "skillManagement.detail.moveFilesSuccess": "Archivos movidos.", + "skillManagement.detail.nameThisVersion": "Nombra esta versión", + "skillManagement.detail.noFileSelected": "Seleccione un archivo para obtener una vista previa.", + "skillManagement.detail.noFiles": "Sin archivos.", "skillManagement.detail.noSearchResults": "No hay archivos coincidentes.", - "skillManagement.detail.noVersions": "No published versions yet.", - "skillManagement.detail.previewUnsupported": "Preview is not supported for this file.", - "skillManagement.detail.publish": "Publish", - "skillManagement.detail.publishFailed": "Failed to publish skill.", - "skillManagement.detail.publishSuccess": "Skill published.", - "skillManagement.detail.published": "Published", + "skillManagement.detail.noSelectableTags": "No hay etiquetas disponibles.", + "skillManagement.detail.noVersions": "Aún no hay versiones publicadas.", + "skillManagement.detail.pasteFile": "Pasta", + "skillManagement.detail.pasteFileSuccess": "Archivo pegado.", + "skillManagement.detail.previewUnsupported": "Este archivo no admite vista previa.", + "skillManagement.detail.publish": "Publicar", + "skillManagement.detail.publishFailed": "No se pudo publicar la habilidad.", + "skillManagement.detail.publishReferencesDescription_one": "La publicación entra en vigor inmediatamente para el agente {{count}} que utiliza esta habilidad.", + "skillManagement.detail.publishReferencesDescription_other": "La publicación entra en vigor inmediatamente para los agentes {{count}} que utilizan esta habilidad.", + "skillManagement.detail.publishReferencesTitle": "Publicar habilidad", + "skillManagement.detail.publishSuccess": "Skill publicado.", + "skillManagement.detail.publishUpdate": "Publicar actualización", + "skillManagement.detail.published": "Publicado", "skillManagement.detail.publishedAt": "Publicado {{time}}", + "skillManagement.detail.publishedVersion": "Publicado #{{number}}", "skillManagement.detail.publishing": "Publicando...", - "skillManagement.detail.readonly": "Read only", - "skillManagement.detail.referenceFiles.confirm": "Enter Confirm", - "skillManagement.detail.referenceFiles.empty": "No files available.", - "skillManagement.detail.referenceFiles.livePlaceholder": "Write instructions for the agent, type / to reference files", - "skillManagement.detail.referenceFiles.navigate": "↑↓ Navigate", - "skillManagement.detail.referenceFiles.title": "Reference files", - "skillManagement.detail.referencedBy": "Referenced by {{count}} Apps", - "skillManagement.detail.removeMetadata": "Delete {{name}} metadata", - "skillManagement.detail.removeTag": "Remove {{tag}}", - "skillManagement.detail.removeTagSuccess": "Tag removed.", - "skillManagement.detail.renameFile": "Rename file", - "skillManagement.detail.renameFileDescription": "Enter the new path relative to the skill root.", - "skillManagement.detail.renameFileSuccess": "File renamed.", - "skillManagement.detail.renameSkillSuccess": "Skill renamed.", - "skillManagement.detail.renameVersion": "Rename", - "skillManagement.detail.renameVersionFailed": "Failed to rename version.", - "skillManagement.detail.renameVersionPrompt": "Version name", - "skillManagement.detail.renameVersionSuccess": "Version renamed.", - "skillManagement.detail.restoreVersion": "Restore", - "skillManagement.detail.restoreVersionFailed": "Failed to restore version.", - "skillManagement.detail.restoreVersionSuccess": "Version restored to draft.", - "skillManagement.detail.save": "Save", - "skillManagement.detail.saveFailed": "Failed to save file.", - "skillManagement.detail.saveSuccess": "File saved.", - "skillManagement.detail.saved": "Saved", - "skillManagement.detail.savedAt": "Saved {{time}}", - "skillManagement.detail.saving": "Saving...", + "skillManagement.detail.readonly": "Solo lectura", + "skillManagement.detail.referenceFiles.confirm": "Ingresar Confirmar", + "skillManagement.detail.referenceFiles.empty": "No hay archivos disponibles.", + "skillManagement.detail.referenceFiles.livePlaceholder": "Escriba instrucciones para el agente. Escriba / para hacer referencia a archivos.", + "skillManagement.detail.referenceFiles.navigate": "↑↓ Navegar", + "skillManagement.detail.referenceFiles.title": "Archivos de referencia", + "skillManagement.detail.referencedBy_one": "Utilizado por {{count}} agente", + "skillManagement.detail.referencedBy_other": "Utilizado por {{count}} agentes", + "skillManagement.detail.removeMetadata": "Eliminar metadatos {{name}}", + "skillManagement.detail.removeTag": "Quitar {{tag}}", + "skillManagement.detail.removeTagSuccess": "Etiqueta eliminada.", + "skillManagement.detail.renameFile": "Cambiar nombre de archivo", + "skillManagement.detail.renameFileDescription": "Ingrese la nueva ruta relativa a la raíz de la habilidad.", + "skillManagement.detail.renameFileSuccess": "Archivo renombrado.", + "skillManagement.detail.renameSkillSuccess": "Skill renombrado.", + "skillManagement.detail.renameVersion": "Renombrar", + "skillManagement.detail.renameVersionFailed": "No se pudo cambiar el nombre de la versión.", + "skillManagement.detail.renameVersionPrompt": "Nombre de la versión", + "skillManagement.detail.renameVersionSuccess": "Versión renombrada.", + "skillManagement.detail.resizeSidebar": "Cambiar el tamaño de la barra lateral del archivo", + "skillManagement.detail.restoreVersion": "Restaurar", + "skillManagement.detail.restoreVersionConfirmDescription": "Esto reemplazará el borrador actual con los archivos de \"{{version}}\". No publicará el Skill ni creará una nueva versión.", + "skillManagement.detail.restoreVersionConfirmTitle": "¿Restaurar esta versión?", + "skillManagement.detail.restoreVersionFailed": "No se pudo restaurar la versión.", + "skillManagement.detail.restoreVersionSuccess": "Versión restaurada al borrador.", + "skillManagement.detail.save": "Guardar", + "skillManagement.detail.saveConflictConfirmDescription": "Esta habilidad se actualizó en otro lugar. Cargue el último borrador para continuar editando. Sus cambios actuales serán descartados.", + "skillManagement.detail.saveConflictConfirmTitle": "¿Cargar el último borrador?", + "skillManagement.detail.saveConflictReload": "Cargar el último borrador", + "skillManagement.detail.saveConflictStatus": "Conflicto detectado. Cargue el último borrador para continuar editando.", + "skillManagement.detail.saveFailed": "No se pudo guardar el archivo.", + "skillManagement.detail.saveSuccess": "Archivo guardado.", + "skillManagement.detail.saved": "Guardado", + "skillManagement.detail.savedAt": "Guardado {{time}}", + "skillManagement.detail.saving": "Guardando...", "skillManagement.detail.searchFiles": "Buscar archivos", + "skillManagement.detail.showMoreReferences": "Mostrar {{count}} más", + "skillManagement.detail.skillDescriptionPlaceholder": "Describa qué hace esta habilidad y cuándo los agentes deben usarla.", + "skillManagement.detail.skillNamePlaceholder": "Utilice letras minúsculas, números y guiones.", "skillManagement.detail.unpublishedChanges": "Cambios sin publicar", - "skillManagement.detail.unsavedChanges": "Unsaved changes", + "skillManagement.detail.unsavedChanges": "Cambios no guardados", "skillManagement.detail.upToDate": "Actualizado", - "skillManagement.detail.updateTagsFailed": "Failed to update tags.", - "skillManagement.detail.uploadFile": "Upload file", - "skillManagement.detail.uploadFileFailed": "File upload failed.", - "skillManagement.detail.uploadFileSuccess": "File uploaded.", - "skillManagement.detail.uploadFilesMenu": "Upload files...", + "skillManagement.detail.updateTagsFailed": "No se pudieron actualizar las etiquetas.", + "skillManagement.detail.uploadCheckFailed": "No se pudieron verificar estos archivos. Intentar otra vez.", + "skillManagement.detail.uploadConflict": "Ya existe un archivo con este nombre.", + "skillManagement.detail.uploadFailureSummary": "Error en {{failed}} de archivos {{total}}", + "skillManagement.detail.uploadFailureTitle": "Algunas cargas fallaron", + "skillManagement.detail.uploadFile": "Subir archivo", + "skillManagement.detail.uploadFileFailed": "Error al cargar el archivo.", + "skillManagement.detail.uploadFileSuccess": "Archivo subido.", + "skillManagement.detail.uploadFilesButton": "Cargar archivos {{count}}", + "skillManagement.detail.uploadFilesFailedStatus_one": "Error al cargar el archivo {{count}}.", + "skillManagement.detail.uploadFilesFailedStatus_other": "Error al cargar el archivo {{count}}.", + "skillManagement.detail.uploadFilesMenu": "Subir archivos...", + "skillManagement.detail.uploadFilesProgress": "Subiendo {{completed}}/{{total}}", + "skillManagement.detail.uploadFilesResult": "{{uploaded}} subido · {{failed}} falló", + "skillManagement.detail.uploadFilesStatus": "Estado de carga", + "skillManagement.detail.uploadInvalidExtension": "Este tipo de archivo no es compatible.", + "skillManagement.detail.uploadInvalidName": "Nombre no válido.", + "skillManagement.detail.uploadInvalidPath": "Ruta de archivo no válida.", + "skillManagement.detail.uploadKeepBoth": "Mantenga ambos", + "skillManagement.detail.uploadLateConflict": "Alguien agregó este archivo mientras lo subías.", + "skillManagement.detail.uploadMissingExtension": "Se requiere una extensión de archivo.", + "skillManagement.detail.uploadNetworkFailure": "La carga falló. Comprueba tu conexión.", + "skillManagement.detail.uploadReadySummary": "{{ready}} listo · {{decisions}} necesita una decisión · {{skipped}} se omitirá", + "skillManagement.detail.uploadReplace": "Reemplazar", + "skillManagement.detail.uploadResolvedSummary": "{{ready}} listo · {{skipped}} se omitirá", + "skillManagement.detail.uploadRetryCount": "Reintentar {{count}}", + "skillManagement.detail.uploadReviewTitle": "Revisar antes de subir", + "skillManagement.detail.uploadSkip": "Navío", + "skillManagement.detail.uploadSkippedGroup": "Los archivos {{count}} no se pueden cargar y se omitirán", + "skillManagement.detail.uploadStatusDismiss": "Descartar estado de carga", + "skillManagement.detail.uploadSuggestion": "sugerencia de uso", + "skillManagement.detail.uploadWillReplace": "Reemplazará el archivo existente", + "skillManagement.detail.uploadWillUseName": "Se cargará como {{name}}", + "skillManagement.detail.versionHistory": "Abrir historial de versiones", "skillManagement.detail.versionMeta": "{{hash}} · {{time}}", - "skillManagement.detail.versions": "Versions", - "skillManagement.draft": "Draft", - "skillManagement.duplicateFailed": "Failed to duplicate skill.", - "skillManagement.duplicateSuccess": "Skill duplicated.", - "skillManagement.editedAt": "Edited {{time}}", - "skillManagement.empty": "No skills yet", - "skillManagement.emptySearch": "No skills found", - "skillManagement.import": "Import", - "skillManagement.importFailed": "Failed to import skill.", - "skillManagement.importSuccess": "Skill imported.", - "skillManagement.listLabel": "Workspace skills", - "skillManagement.loadingError": "Failed to load skills", - "skillManagement.moreActions": "More actions for {{name}}", - "skillManagement.noTags": "No tags", - "skillManagement.publishedAt": "Published {{time}}", - "skillManagement.referenceCount": "{{count}} Refs", - "skillManagement.searchLabel": "Search skills", - "skillManagement.searchPlaceholder": "Search", - "skillManagement.tags": "Tags", - "skillManagement.title": "Skills" + "skillManagement.detail.versionPublishNote": "Notas de la versión", + "skillManagement.detail.versionPublishNotePlaceholder": "Describe este cambio", + "skillManagement.detail.versionPublishedMeta": "{{time}} · {{name}}", + "skillManagement.detail.versionTitle": "Título", + "skillManagement.detail.versions": "Versiones", + "skillManagement.detail.viewOnly": "Ver sólo", + "skillManagement.detail.viewUploadErrors": "Ver errores", + "skillManagement.draft": "Borrador", + "skillManagement.duplicateFailed": "No se pudo duplicar la habilidad.", + "skillManagement.duplicateSuccess": "Skill duplicado.", + "skillManagement.editedAt": "Editado {{time}}", + "skillManagement.empty": "Aún no hay habilidades", + "skillManagement.emptyAction.createDescription": "Describe un escenario en palabras sencillas y obtén un borrador de habilidad para revisar.", + "skillManagement.emptyAction.createTitle": "Crear con Skill Builder", + "skillManagement.emptyAction.importDescription": "Traer un .zip con SKILL.md, en formato agenteskills.io.", + "skillManagement.emptyAction.importTitle": "Importar un paquete de habilidades", + "skillManagement.emptySearch": "No se encontraron habilidades", + "skillManagement.errors.missingSkillMd": "Este paquete no tiene SKILL.md. Agregue el archivo e impórtelo nuevamente.", + "skillManagement.errors.nameConflict": "Ya existe una habilidad denominada \"{{name}}\". Cambie el nombre a SKILL.md e impórtelo nuevamente.", + "skillManagement.errors.workspaceLimit": "Tu espacio de trabajo ha alcanzado el límite de 500 habilidades. Elimina una habilidad para agregar una nueva.", + "skillManagement.import": "Importar", + "skillManagement.importFailed": "No se pudo importar la habilidad.", + "skillManagement.importSuccess": "Skill importado.", + "skillManagement.listLabel": "Habilidades en el espacio de trabajo", + "skillManagement.loadingError": "No se pudieron cargar las habilidades", + "skillManagement.moreActions": "Más acciones para {{name}}", + "skillManagement.noDescription": "Aún no hay descripción", + "skillManagement.noTags": "Sin etiquetas", + "skillManagement.publishedAt": "Publicado {{time}}", + "skillManagement.referenceCount_one": "{{count}} agente", + "skillManagement.referenceCount_other": "{{count}} agentes", + "skillManagement.searchLabel": "Buscar habilidades", + "skillManagement.searchPlaceholder": "Buscar por nombre o descripción", + "skillManagement.tags": "Etiquetas", + "skillManagement.title": "Habilidades" } diff --git a/web/i18n/fa-IR/agent-v-2.json b/web/i18n/fa-IR/agent-v-2.json index 29208ba493c..87891c5d70a 100644 --- a/web/i18n/fa-IR/agent-v-2.json +++ b/web/i18n/fa-IR/agent-v-2.json @@ -83,7 +83,7 @@ "agentDetail.configure.buildDraft.changesToApply_other": "{{count}} تغییر برای اعمال", "agentDetail.configure.buildDraft.discard": "رد کردن", "agentDetail.configure.buildDraft.modeBadge": "حالت ساخت", - "agentDetail.configure.buildDraft.modeDescription": "شما در حالت ساخت هستید. در این حالت Configure فقط می‌تواند توسط عامل به‌روزرسانی شود. این تنظیمات را از طریق چت سمت راست شکل دهید، سپس اعمال کنید.", + "agentDetail.configure.buildDraft.modeDescription": "شما در حالت ساخت هستید. با عامل گفتگو کنید تا این تنظیمات را شکل دهید، سپس روی «اعمال» کلیک کنید.", "agentDetail.configure.buildDraft.rewritten": "بازنویسی شد", "agentDetail.configure.buildDraft.title": "پیش نویس ساخت", "agentDetail.configure.buildDraft.updated": "به‌روزرسانی شد", @@ -105,7 +105,8 @@ "agentDetail.configure.files.preview.failed": "بارگذاری پیش‌نمایش ناموفق بود.", "agentDetail.configure.files.preview.unsupported": "این فایل از پیش‌نمایش پشتیبانی نمی‌کند.", "agentDetail.configure.files.remove": "حذف {{name}}", - "agentDetail.configure.files.tip": "برای منابع مرجعی که برای چسباندن در Prompt بیش از حد طولانی‌اند: مشخصات، قالب‌ها، دستورالعمل‌ها. در Prompt با / به آن‌ها ارجاع دهید.\n\nدر حالت Build، عامل می‌تواند این موارد را برای شما تنظیم کند.", + "agentDetail.configure.files.richTip": "برای منابع مرجعی که برای چسباندن در Prompt بیش از حد طولانی‌اند: مشخصات، قالب‌ها، دستورالعمل‌ها. بیشتر بدانید\n\nدر حالت Build، عامل می‌تواند این موارد را برای شما تنظیم کند.", + "agentDetail.configure.files.tip": "برای منابع مرجعی که برای چسباندن در Prompt بیش از حد طولانی‌اند: مشخصات، قالب‌ها، دستورالعمل‌ها. بیشتر بدانید\n\nدر حالت Build، عامل می‌تواند این موارد را برای شما تنظیم کند.", "agentDetail.configure.files.toggle": "تغییر فایل‌ها", "agentDetail.configure.files.treeLabel": "فایل‌های عامل", "agentDetail.configure.files.upload.action": "بارگذاری", @@ -114,7 +115,7 @@ "agentDetail.configure.files.upload.dropzone": "یک فایل را اینجا رها کنید، یا", "agentDetail.configure.files.upload.failed": "بارگذاری فایل ناموفق بود.", "agentDetail.configure.files.upload.fileType": "FILE", - "agentDetail.configure.files.upload.invalidFile": "یک فایل بارگذاری کنید.", + "agentDetail.configure.files.upload.invalidFile": "در هر بار فقط یک فایل را می‌توان بارگذاری کرد.", "agentDetail.configure.files.upload.success": "فایل بارگذاری شد.", "agentDetail.configure.files.upload.title": "بارگذاری فایل", "agentDetail.configure.knowledgeRetrieval.add": "افزودن بازیابی دانش", @@ -177,7 +178,8 @@ "agentDetail.configure.prompt.mention.priyaRamanathan": "Priya Ramanathan", "agentDetail.configure.prompt.placeholder": "دستورالعمل‌ها را اینجا بنویسید،", "agentDetail.configure.prompt.referenceMissing": "{{name}} وجود ندارد", - "agentDetail.configure.prompt.tip": "نقش عامل را تعریف کنید و وظیفه معمول آن را شرح دهید. برای ارجاع صریح به مهارت‌ها، فایل‌ها، ابزارها و بازیابی‌های دانش از / استفاده کنید.", + "agentDetail.configure.prompt.richTip": "نقش عامل و نحوه کار آن را تعریف کنید. بیشتر بدانید", + "agentDetail.configure.prompt.tip": "نقش عامل و نحوه کار آن را تعریف کنید. بیشتر بدانید", "agentDetail.configure.publishBar.draft": "پیش‌نویس", "agentDetail.configure.publishBar.publishUpdate": "انتشار به‌روزرسانی", "agentDetail.configure.publishBar.published": "منتشر شد", @@ -190,8 +192,8 @@ "agentDetail.configure.publishBar.versionHistory": "باز کردن تاریخچه نسخه", "agentDetail.configure.publishImpact.affectedWorkflows": "گردش‌های کار تحت تأثیر", "agentDetail.configure.publishImpact.cancel": "لغو", - "agentDetail.configure.publishImpact.descriptionPrefix": "عامل شما در", - "agentDetail.configure.publishImpact.descriptionSuffix": " ظاهر می‌شود. تغییرات بر آن‌ها تأثیر می‌گذارد.", + "agentDetail.configure.publishImpact.descriptionPrefix": "این عامل در", + "agentDetail.configure.publishImpact.descriptionSuffix": " استفاده می‌شود. با انتشار، در همه آن‌ها به‌روزرسانی می‌شود.", "agentDetail.configure.publishImpact.fallbackAgentName": "این عامل", "agentDetail.configure.publishImpact.title": "{{action}} به {{name}}", "agentDetail.configure.publishImpact.workflowCount_one": "{{count}} گردش کار", @@ -222,8 +224,8 @@ "agentDetail.configure.skills.openInLibrary": "Open in Skill library", "agentDetail.configure.skills.remove": "حذف {{name}}", "agentDetail.configure.skills.removeAction": "Remove", - "agentDetail.configure.skills.richTip": "دستورالعمل‌ها، فایل‌ها و اسکریپت‌های یک کار تکرارشونده را در یک Skill بسته‌بندی کنید. در Prompt با / به آن ارجاع دهید. بیشتر بدانید\n\nدر حالت Build، عامل می‌تواند این موارد را برای شما تنظیم کند.", - "agentDetail.configure.skills.tip": "دستورالعمل‌ها، فایل‌ها و اسکریپت‌های یک کار تکرارشونده را در یک Skill بسته‌بندی کنید. در Prompt با / به آن ارجاع دهید. بیشتر بدانید\n\nدر حالت Build، عامل می‌تواند این موارد را برای شما تنظیم کند.", + "agentDetail.configure.skills.richTip": "دستورالعمل‌ها، فایل‌ها و اسکریپت‌های یک کار تکرارشونده را در یک Skill بسته‌بندی کنید. بیشتر بدانید\n\nدر حالت Build، عامل می‌تواند این موارد را برای شما تنظیم کند.", + "agentDetail.configure.skills.tip": "دستورالعمل‌ها، فایل‌ها و اسکریپت‌های یک کار تکرارشونده را در یک Skill بسته‌بندی کنید. بیشتر بدانید\n\nدر حالت Build، عامل می‌تواند این موارد را برای شما تنظیم کند.", "agentDetail.configure.skills.toggle": "تغییر مهارت‌ها", "agentDetail.configure.skills.upload.action": "بارگذاری", "agentDetail.configure.skills.upload.browse": "مرور", @@ -269,8 +271,8 @@ "agentDetail.configure.tools.moreActions": "اقدامات بیشتر برای {{name}}", "agentDetail.configure.tools.removeAction": "حذف {{name}}", "agentDetail.configure.tools.removeProvider": "حذف همه ابزارها", - "agentDetail.configure.tools.richTip": "ابزارهای Dify را از workspace خود اضافه کنید. در Prompt با / به آن‌ها ارجاع دهید. بیشتر بدانید\n\nابزارهایی که عامل در sandbox خود نصب می‌کند اینجا نمایش داده نمی‌شوند، اما برای او در دسترس می‌مانند.", - "agentDetail.configure.tools.tip": "ابزارهای Dify را از workspace خود اضافه کنید. در Prompt با / به آن‌ها ارجاع دهید. بیشتر بدانید\n\nابزارهایی که عامل در sandbox خود نصب می‌کند اینجا نمایش داده نمی‌شوند، اما برای او در دسترس می‌مانند.", + "agentDetail.configure.tools.richTip": "ابزارهای Dify را از workspace خود اضافه کنید. بیشتر بدانید\n\nابزارهایی که عامل در sandbox خود نصب می‌کند اینجا نمایش داده نمی‌شوند، اما برای او در دسترس می‌مانند.", + "agentDetail.configure.tools.tip": "ابزارهای Dify را از workspace خود اضافه کنید. بیشتر بدانید\n\nابزارهایی که عامل در sandbox خود نصب می‌کند اینجا نمایش داده نمی‌شوند، اما برای او در دسترس می‌مانند.", "agentDetail.configure.tools.toggle": "تغییر ابزارها", "agentDetail.configure.tools.toolTabs.all": "همه", "agentDetail.configure.tools.toolTabs.cli": "CLI", @@ -336,22 +338,22 @@ "agentDetail.metadata.sourceLabel": "منبع", "agentDetail.monitoring.change": "{{value}} نسبت به دوره قبل", "agentDetail.monitoring.dateRangeLabel": "بازه تاریخ", - "agentDetail.monitoring.description": "فعالیت، هزینه و کیفیت تعامل عامل قابل استفاده مجدد را در گردش‌های کار دنبال کنید.", + "agentDetail.monitoring.description": "فعالیت، هزینه و کیفیت تعامل این عامل را در همه نقاط دسترسی پیگیری کنید.", "agentDetail.monitoring.learnMore": "اطلاعات بیشتر", "agentDetail.monitoring.loadFailed": "بارگیری داده‌های پایش ناموفق بود", - "agentDetail.monitoring.metrics.activeUsers.explanation": "کاربران نهایی منحصربه‌فردی که با استفاده از این عامل گردش کارها را راه‌اندازی کرده‌اند.", + "agentDetail.monitoring.metrics.activeUsers.explanation": "کاربران نهایی منحصربه‌فردی که با این عامل تعامل داشته‌اند.", "agentDetail.monitoring.metrics.activeUsers.title": "کاربران فعال", - "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "تعداد ارتباط مداوم کاربر-عامل برای این نقطه دسترسی.", + "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "میانگین تعداد پیام‌های کاربر در هر گفتگو.", "agentDetail.monitoring.metrics.avgSessionInteractions.title": "میانگین تعامل جلسه", - "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "میانگین سرعت خروجی از شروع درخواست تا تکمیل.", + "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "میانگین تعداد توکن‌های تولیدشده در هر ثانیه هنگام پاسخ عامل.", "agentDetail.monitoring.metrics.tokenOutputSpeed.title": "سرعت خروجی توکن", - "agentDetail.monitoring.metrics.tokenUsage.explanation": "هزینه تخمینی توکن تولیدشده توسط این عامل در اجرای گردش‌های کار.", + "agentDetail.monitoring.metrics.tokenUsage.explanation": "توکن‌های مصرف‌شده و هزینه تخمینی.", "agentDetail.monitoring.metrics.tokenUsage.title": "مصرف توکن", "agentDetail.monitoring.metrics.totalConversations.explanation": "مکالمات روزانه AI که از طریق نقطه دسترسی انتخاب‌شده به این عامل رسیده‌اند.", "agentDetail.monitoring.metrics.totalConversations.title": "کل مکالمات", - "agentDetail.monitoring.metrics.totalMessages.explanation": "تعداد تعامل روزانه عامل.", + "agentDetail.monitoring.metrics.totalMessages.explanation": "کل پیام‌هایی که کاربران به این عامل ارسال کرده‌اند.", "agentDetail.monitoring.metrics.totalMessages.title": "کل پیام‌ها", - "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "تعداد لایک‌ها به ازای ۱۰۰۰ پیام برای این عامل.", + "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "درصد پاسخ‌های عامل که کاربران پسندیده‌اند.", "agentDetail.monitoring.metrics.userSatisfactionRate.title": "نرخ رضایت کاربر", "agentDetail.monitoring.pickSource": "یک برنامه انتخاب کنید", "agentDetail.monitoring.sourceLabel": "برنامه", @@ -549,7 +551,5 @@ "skillManagement.searchLabel": "Search skills", "skillManagement.searchPlaceholder": "Search", "skillManagement.tags": "Tags", - "skillManagement.title": "Skills", - "agentDetail.configure.files.richTip": "برای منابع مرجعی که برای چسباندن در Prompt بیش از حد طولانی‌اند: مشخصات، قالب‌ها، دستورالعمل‌ها. بیشتر بدانید\n\nدر حالت Build، عامل می‌تواند این موارد را برای شما تنظیم کند.", - "agentDetail.configure.prompt.richTip": "نقش عامل و نحوه کار آن را تعریف کنید. بیشتر بدانید" + "skillManagement.title": "Skills" } diff --git a/web/i18n/fa-IR/skill.json b/web/i18n/fa-IR/skill.json index ec81a3d7b6f..7d6dcae5d08 100644 --- a/web/i18n/fa-IR/skill.json +++ b/web/i18n/fa-IR/skill.json @@ -1,121 +1,245 @@ { - "skillManagement.clearTags": "Clear tags", - "skillManagement.create": "Create", - "skillManagement.createFailed": "Failed to create skill.", - "skillManagement.createSuccess": "Skill created.", - "skillManagement.dateTimeFormat": "MMM D, YYYY HH:mm", + "skillManagement.clearTags": "برچسب ها را پاک کنید", + "skillManagement.create": "ایجاد", + "skillManagement.createFailed": "ایجاد مهارت ناموفق بود.", + "skillManagement.createSuccess": "پیش نویس ایجاد شد.", + "skillManagement.dateTimeFormat": "D MMM، YYYY HH:mm", "skillManagement.deleteDialog.confirmInputLabel": "برای تأیید، {{skillName}} را در کادر زیر وارد کنید:", "skillManagement.deleteDialog.confirmInputPlaceholder": "نام نمایشی Skill را وارد کنید…", - "skillManagement.deleteDialog.description": "This skill will be removed from the workspace. Agents that reference it may lose access to this capability.", - "skillManagement.deleteDialog.title": "Delete {{name}}?", - "skillManagement.deleteFailed": "Failed to delete skill.", - "skillManagement.deleteSuccess": "Skill deleted.", - "skillManagement.detail.addMetadata": "Add metadata", - "skillManagement.detail.addMetadataDescription": "Add a frontmatter field to this Markdown file.", - "skillManagement.detail.addTag": "Add tag", - "skillManagement.detail.addTagDescription": "Create or bind a tag to this Skill. New tags are saved with the Skill metadata.", - "skillManagement.detail.addTagSuccess": "Tag added.", - "skillManagement.detail.back": "Back to Skills", - "skillManagement.detail.cancelAddMetadata": "Cancel adding metadata", - "skillManagement.detail.closeFileTab": "Close {{name}}", + "skillManagement.deleteDialog.description": "حذف مهارت غیر قابل برگشت است. محتوای آن و تاریخچه نسخه کامل آن برای همیشه حذف خواهد شد. هیچ عاملی در حال حاضر از آن استفاده نمی کند.", + "skillManagement.deleteDialog.referencedDescription_one": "عامل {{count}} از این مهارت، به طور مستقل یا در یک گردش کار استفاده می کند. حذف این مهارت، محتویات و تاریخچه نسخه آن را برای همیشه پاک می کند و آن را از عامل آسیب دیده حذف می کند.", + "skillManagement.deleteDialog.referencedDescription_other": "نمایندگان {{count}} از این مهارت چه به صورت مستقل یا در جریان کار استفاده می کنند. حذف این مهارت، محتویات و تاریخچه نسخه آن را برای همیشه پاک می کند و آن را از همه عوامل آسیب دیده حذف می کند.", + "skillManagement.deleteDialog.title": "حذف {{name}}؟", + "skillManagement.deleteFailed": "مهارت حذف نشد.", + "skillManagement.deleteSuccess": "Skill حذف شد.", + "skillManagement.detail.addMetadata": "متادیتا اضافه کنید", + "skillManagement.detail.addMetadataDescription": "یک فیلد frontmatter به این فایل Markdown اضافه کنید.", + "skillManagement.detail.addTag": "برچسب اضافه کنید", + "skillManagement.detail.addTagDescription": "یک برچسب به این Skill ایجاد یا متصل کنید. برچسب‌های جدید با ابرداده Skill ذخیره می‌شوند.", + "skillManagement.detail.addTagSuccess": "برچسب اضافه شد.", + "skillManagement.detail.back": "بازگشت به Skills", + "skillManagement.detail.builder.applyFailed": "به‌روزرسانی‌های پیش‌نویس اعمال نشد.", + "skillManagement.detail.builder.attach": "فایل پیوست کنید", + "skillManagement.detail.builder.attachFailed": "فایل پیوست نشد.", + "skillManagement.detail.builder.attachLimit": "می توانید حداکثر 10 فایل را پیوست کنید.", + "skillManagement.detail.builder.attachTooLarge": "فایل ها باید 15 مگابایت یا کوچکتر باشند. تصاویر باید 10 مگابایت یا کوچکتر باشند.", + "skillManagement.detail.builder.attachUnsupported": "فقط تصاویر، متن و فایل های سند را می توان پیوست کرد.", + "skillManagement.detail.builder.attachmentOnlyMessage": "برای کمک به بهبود این مهارت از فایل پیوست استفاده کنید.", + "skillManagement.detail.builder.close": "Skill Builder را ببندید", + "skillManagement.detail.builder.compatibleModelsOnly": "فقط مدل‌های سازگار نمایش داده می‌شوند", + "skillManagement.detail.builder.copyResponse": "پاسخ را کپی کنید", + "skillManagement.detail.builder.copySuccess": "پاسخ در کلیپ بورد کپی شد.", + "skillManagement.detail.builder.editIntro": "من این مهارت را مرور کردم. چه چیزی را دوست دارید تنظیم کنید؟", + "skillManagement.detail.builder.exampleIssueTriage": "تریاژ مسئله مشتری", + "skillManagement.detail.builder.exampleOnboarding": "راهنمای استخدام جدید", + "skillManagement.detail.builder.exampleSalesFollowUp": "استراتژی پیگیری سرنخ فروش", + "skillManagement.detail.builder.followUpDisplayName": "از تأیید بازپرداخت به عنوان نام نمایشی استفاده کنید", + "skillManagement.detail.builder.followUpNameIcon": "نام و نماد پیشنهادی را اعمال کنید", + "skillManagement.detail.builder.fromMarketplace": "از Marketplace", + "skillManagement.detail.builder.model": "GPT-4o", + "skillManagement.detail.builder.modelCredits.all": "تمام اعتبارات", + "skillManagement.detail.builder.modelCredits.configure": "پیکربندی الزامی است", + "skillManagement.detail.builder.modelCredits.exhausted": "سهمیه تمام شده", + "skillManagement.detail.builder.modelProviderSettings": "تنظیمات ارائه‌دهنده مدل", + "skillManagement.detail.builder.modelSearch": "جستجوی مدل‌ها...", + "skillManagement.detail.builder.modifyPlaceholder": "از هوش مصنوعی بخواهید این مهارت را اصلاح کند...", + "skillManagement.detail.builder.open": "Skill Builder را باز کنید", + "skillManagement.detail.builder.placeholder": "سناریو را شرح دهید ...", + "skillManagement.detail.builder.progress.applyingChanges": "اعمال تغییرات فایل", + "skillManagement.detail.builder.progress.generatingPlan": "ایجاد طرح به روز رسانی", + "skillManagement.detail.builder.progress.readingDraft": "خواندن پیش نویس فعلی", + "skillManagement.detail.builder.progress.updatingEditor": "به روز رسانی ویرایشگر", + "skillManagement.detail.builder.promptDescription": "آن را توصیف کنید و یک پیش‌نویس با مراحل و فایل‌ها در ویرایشگر ظاهر می‌شود.", + "skillManagement.detail.builder.promptTitle": "این مهارت باید چه چیزی را مدیریت کند؟", + "skillManagement.detail.builder.readAloud": "پاسخ را با صدای بلند بخوانید", + "skillManagement.detail.builder.removeAttachment": "حذف {{name}}", + "skillManagement.detail.builder.restart": "سازنده را دوباره راه اندازی کنید", + "skillManagement.detail.builder.retryResponse": "پاسخ را دوباره امتحان کنید", + "skillManagement.detail.builder.send": "ارسال پیام", + "skillManagement.detail.builder.sendFailed": "Skill Builder پاسخ نداد.", + "skillManagement.detail.builder.thinking": "در حال فکر کردن", + "skillManagement.detail.builder.thinkingUnavailable": "هیچ محتوای فکری توسط مدل برگردانده نشد.", + "skillManagement.detail.builder.title": "Skill Builder", + "skillManagement.detail.builder.tryExample": "یک مثال را امتحان کنید", + "skillManagement.detail.builder.voice": "ورودی صوتی", + "skillManagement.detail.builder.voiceUnavailable": "ورودی صوتی هنوز در دسترس نیست.", + "skillManagement.detail.cancelAddMetadata": "لغو افزودن فراداده", + "skillManagement.detail.closeFileTab": "بستن {{name}}", + "skillManagement.detail.closeVersions": "بستن نسخه ها", "skillManagement.detail.collapseSidebar": "جمع کردن نوار کناری", - "skillManagement.detail.createFile": "New file", - "skillManagement.detail.createFileDescription": "Enter a file path relative to the skill root.", - "skillManagement.detail.createFileMenu": "New file...", - "skillManagement.detail.createFileSuccess": "File created.", - "skillManagement.detail.createFolder": "New folder", - "skillManagement.detail.createFolderDescription": "Enter a folder path relative to the skill root.", - "skillManagement.detail.createFolderMenu": "New folder...", - "skillManagement.detail.createFolderSuccess": "Folder created.", - "skillManagement.detail.createdBy": "Created by {{name}}", - "skillManagement.detail.currentDraft": "Current draft", - "skillManagement.detail.deleteFileConfirm": "Delete this file?", - "skillManagement.detail.deleteFileSuccess": "File deleted.", - "skillManagement.detail.deleteVersionConfirm": "Delete this version?", - "skillManagement.detail.deleteVersionFailed": "Failed to delete version.", - "skillManagement.detail.deleteVersionSuccess": "Version deleted.", - "skillManagement.detail.downloadFile": "Download file", - "skillManagement.detail.draft": "Draft", + "skillManagement.detail.copyContentSuccess": "محتوا در کلیپ بورد کپی شد.", + "skillManagement.detail.copyFile": "کپی", + "skillManagement.detail.copyFileSuccess": "فایل آماده برای چسباندن", + "skillManagement.detail.copyVersionId": "کپی شناسه", + "skillManagement.detail.copyVersionIdSuccess": "شناسه در کلیپ بورد کپی شد.", + "skillManagement.detail.createFile": "فایل جدید", + "skillManagement.detail.createFileDescription": "یک مسیر فایل نسبت به ریشه مهارت وارد کنید.", + "skillManagement.detail.createFileMenu": "فایل جدید...", + "skillManagement.detail.createFileSuccess": "فایل ایجاد شد.", + "skillManagement.detail.createFolder": "پوشه جدید", + "skillManagement.detail.createFolderDescription": "یک مسیر پوشه نسبت به ریشه مهارت وارد کنید.", + "skillManagement.detail.createFolderMenu": "پوشه جدید...", + "skillManagement.detail.createFolderSuccess": "پوشه ایجاد شد.", + "skillManagement.detail.createdBy": "ایجاد شده توسط {{name}}", + "skillManagement.detail.currentDraft": "پیش نویس فعلی", + "skillManagement.detail.cutFile": "برش دهید", + "skillManagement.detail.cutFileSuccess": "فایل آماده انتقال است.", + "skillManagement.detail.deleteFileConfirm": "این فایل حذف شود؟", + "skillManagement.detail.deleteFileSuccess": "فایل حذف شد", + "skillManagement.detail.deleteVersionConfirm": "این نسخه حذف شود؟", + "skillManagement.detail.deleteVersionFailed": "نسخه حذف نشد.", + "skillManagement.detail.deleteVersionSuccess": "نسخه حذف شد", + "skillManagement.detail.downloadFile": "دانلود فایل", + "skillManagement.detail.draft": "پیش‌نویس", + "skillManagement.detail.editVersionInfo": "ویرایش اطلاعات نسخه", + "skillManagement.detail.exitVersions": "خروج از نسخه‌ها", "skillManagement.detail.expandSidebar": "باز کردن نوار کناری", - "skillManagement.detail.fileCount": "{{count}} FILES", - "skillManagement.detail.fileMeta": "{{type}} · {{size}} bytes", - "skillManagement.detail.fileMissing": "File not found.", - "skillManagement.detail.fileOperationFailed": "File operation failed.", - "skillManagement.detail.files": "Files", - "skillManagement.detail.latest": "Latest", - "skillManagement.detail.loadFailed": "Failed to load skill.", - "skillManagement.detail.markdownLiveMode": "Live preview", - "skillManagement.detail.markdownSourceMode": "Source editor", - "skillManagement.detail.metadataKey": "name", - "skillManagement.detail.metadataValue": "value", - "skillManagement.detail.moveFileSuccess": "File moved.", - "skillManagement.detail.moveFilesSuccess": "Files moved.", - "skillManagement.detail.noFileSelected": "Select a file to preview.", - "skillManagement.detail.noFiles": "No files.", + "skillManagement.detail.fileAlreadyExists": "یک فایل یا پوشه با این نام از قبل وجود دارد.", + "skillManagement.detail.fileCount_one": "فایل {{count}}", + "skillManagement.detail.fileCount_other": "فایل های {{count}}", + "skillManagement.detail.fileMeta": "{{type}} · {{size}} بایت", + "skillManagement.detail.fileMissing": "فایل پیدا نشد", + "skillManagement.detail.fileOperationFailed": "عملیات فایل انجام نشد.", + "skillManagement.detail.files": "فایل‌ها", + "skillManagement.detail.latest": "آخرین", + "skillManagement.detail.loadFailed": "مهارت بارگیری نشد.", + "skillManagement.detail.loadingTags": "در حال بارگیری برچسب ها...", + "skillManagement.detail.markdownLiveMode": "پیش نمایش زنده", + "skillManagement.detail.markdownSourceMode": "ویرایشگر منبع", + "skillManagement.detail.metadataKey": "نام", + "skillManagement.detail.metadataValue": "ارزش", + "skillManagement.detail.moveFileSuccess": "فایل منتقل شد.", + "skillManagement.detail.moveFilesSuccess": "فایل ها منتقل شدند.", + "skillManagement.detail.nameThisVersion": "نام‌گذاری این نسخه", + "skillManagement.detail.noFileSelected": "فایلی را برای پیش نمایش انتخاب کنید.", + "skillManagement.detail.noFiles": "بدون فایل", "skillManagement.detail.noSearchResults": "فایل منطبقی نیست.", - "skillManagement.detail.noVersions": "No published versions yet.", - "skillManagement.detail.previewUnsupported": "Preview is not supported for this file.", - "skillManagement.detail.publish": "Publish", - "skillManagement.detail.publishFailed": "Failed to publish skill.", - "skillManagement.detail.publishSuccess": "Skill published.", - "skillManagement.detail.published": "Published", + "skillManagement.detail.noSelectableTags": "هیچ برچسبی موجود نیست", + "skillManagement.detail.noVersions": "هنوز هیچ نسخه منتشر شده ای وجود ندارد.", + "skillManagement.detail.pasteFile": "چسباندن", + "skillManagement.detail.pasteFileSuccess": "فایل جایگذاری شد.", + "skillManagement.detail.previewUnsupported": "این فایل از پیش‌نمایش پشتیبانی نمی‌کند.", + "skillManagement.detail.publish": "انتشار", + "skillManagement.detail.publishFailed": "مهارت منتشر نشد.", + "skillManagement.detail.publishReferencesDescription_one": "انتشار بلافاصله برای عامل {{count}} با استفاده از این مهارت اعمال می شود.", + "skillManagement.detail.publishReferencesDescription_other": "انتشار بلافاصله برای نمایندگان {{count}} با استفاده از این مهارت اعمال می شود.", + "skillManagement.detail.publishReferencesTitle": "مهارت انتشار", + "skillManagement.detail.publishSuccess": "Skill منتشر شد.", + "skillManagement.detail.publishUpdate": "انتشار به‌روزرسانی", + "skillManagement.detail.published": "منتشر شد", "skillManagement.detail.publishedAt": "{{time}} منتشر شد", + "skillManagement.detail.publishedVersion": "#{{number}} منتشر شد", "skillManagement.detail.publishing": "در حال انتشار...", - "skillManagement.detail.readonly": "Read only", - "skillManagement.detail.referenceFiles.confirm": "Enter Confirm", - "skillManagement.detail.referenceFiles.empty": "No files available.", - "skillManagement.detail.referenceFiles.livePlaceholder": "Write instructions for the agent, type / to reference files", - "skillManagement.detail.referenceFiles.navigate": "↑↓ Navigate", - "skillManagement.detail.referenceFiles.title": "Reference files", - "skillManagement.detail.referencedBy": "Referenced by {{count}} Apps", - "skillManagement.detail.removeMetadata": "Delete {{name}} metadata", - "skillManagement.detail.removeTag": "Remove {{tag}}", - "skillManagement.detail.removeTagSuccess": "Tag removed.", - "skillManagement.detail.renameFile": "Rename file", - "skillManagement.detail.renameFileDescription": "Enter the new path relative to the skill root.", - "skillManagement.detail.renameFileSuccess": "File renamed.", - "skillManagement.detail.renameSkillSuccess": "Skill renamed.", - "skillManagement.detail.renameVersion": "Rename", - "skillManagement.detail.renameVersionFailed": "Failed to rename version.", - "skillManagement.detail.renameVersionPrompt": "Version name", - "skillManagement.detail.renameVersionSuccess": "Version renamed.", - "skillManagement.detail.restoreVersion": "Restore", - "skillManagement.detail.restoreVersionFailed": "Failed to restore version.", - "skillManagement.detail.restoreVersionSuccess": "Version restored to draft.", - "skillManagement.detail.save": "Save", - "skillManagement.detail.saveFailed": "Failed to save file.", - "skillManagement.detail.saveSuccess": "File saved.", - "skillManagement.detail.saved": "Saved", - "skillManagement.detail.savedAt": "Saved {{time}}", - "skillManagement.detail.saving": "Saving...", + "skillManagement.detail.readonly": "فقط بخوانید", + "skillManagement.detail.referenceFiles.confirm": "تایید را وارد کنید", + "skillManagement.detail.referenceFiles.empty": "هیچ فایلی در دسترس نیست", + "skillManagement.detail.referenceFiles.livePlaceholder": "دستورالعمل هایی را برای نماینده بنویسید. تایپ / به فایل های مرجع.", + "skillManagement.detail.referenceFiles.navigate": "↑↓ پیمایش کنید", + "skillManagement.detail.referenceFiles.title": "فایل های مرجع", + "skillManagement.detail.referencedBy_one": "مورد استفاده توسط {{count}} عامل", + "skillManagement.detail.referencedBy_other": "مورد استفاده توسط {{count}} عامل", + "skillManagement.detail.removeMetadata": "ابرداده {{name}} را حذف کنید", + "skillManagement.detail.removeTag": "حذف {{tag}}", + "skillManagement.detail.removeTagSuccess": "برچسب حذف شد.", + "skillManagement.detail.renameFile": "تغییر نام فایل", + "skillManagement.detail.renameFileDescription": "مسیر جدید را نسبت به ریشه مهارت وارد کنید.", + "skillManagement.detail.renameFileSuccess": "فایل تغییر نام داد", + "skillManagement.detail.renameSkillSuccess": "Skill تغییر نام داد.", + "skillManagement.detail.renameVersion": "تغییر نام", + "skillManagement.detail.renameVersionFailed": "تغییر نام نسخه انجام نشد.", + "skillManagement.detail.renameVersionPrompt": "نام نسخه", + "skillManagement.detail.renameVersionSuccess": "نسخه تغییر نام داد.", + "skillManagement.detail.resizeSidebar": "تغییر اندازه نوار کناری فایل", + "skillManagement.detail.restoreVersion": "بازیابی", + "skillManagement.detail.restoreVersionConfirmDescription": "این کار جایگزین پیش‌نویس فعلی با فایل‌های «{{version}}» می‌شود. Skill را منتشر نمی کند یا نسخه جدیدی ایجاد نمی کند.", + "skillManagement.detail.restoreVersionConfirmTitle": "بازیابی این نسخه؟", + "skillManagement.detail.restoreVersionFailed": "بازیابی نسخه انجام نشد.", + "skillManagement.detail.restoreVersionSuccess": "نسخه به پیش نویس بازیابی شد.", + "skillManagement.detail.save": "ذخیره", + "skillManagement.detail.saveConflictConfirmDescription": "این مهارت در جای دیگری به روز شد. برای ادامه ویرایش، آخرین پیش نویس را بارگیری کنید. تغییرات فعلی شما نادیده گرفته خواهد شد.", + "skillManagement.detail.saveConflictConfirmTitle": "آخرین پیش نویس بارگیری شود؟", + "skillManagement.detail.saveConflictReload": "آخرین پیش نویس را بارگیری کنید", + "skillManagement.detail.saveConflictStatus": "درگیری شناسایی شد. برای ادامه ویرایش، آخرین پیش نویس را بارگیری کنید.", + "skillManagement.detail.saveFailed": "فایل ذخیره نشد.", + "skillManagement.detail.saveSuccess": "فایل ذخیره شد.", + "skillManagement.detail.saved": "ذخیره شد", + "skillManagement.detail.savedAt": "ذخیره شد {{time}}", + "skillManagement.detail.saving": "در حال ذخیره‌سازی...", "skillManagement.detail.searchFiles": "جستجوی فایل‌ها", + "skillManagement.detail.showMoreReferences": "نمایش {{count}} موارد بیشتر", + "skillManagement.detail.skillDescriptionPlaceholder": "توضیح دهید که این مهارت چه کاری انجام می دهد و چه زمانی عوامل باید از آن استفاده کنند.", + "skillManagement.detail.skillNamePlaceholder": "از حروف کوچک، اعداد و خط فاصله استفاده کنید.", "skillManagement.detail.unpublishedChanges": "تغییرات منتشرنشده", - "skillManagement.detail.unsavedChanges": "Unsaved changes", + "skillManagement.detail.unsavedChanges": "تغییرات ذخیره نشده", "skillManagement.detail.upToDate": "به‌روز", - "skillManagement.detail.updateTagsFailed": "Failed to update tags.", - "skillManagement.detail.uploadFile": "Upload file", - "skillManagement.detail.uploadFileFailed": "File upload failed.", - "skillManagement.detail.uploadFileSuccess": "File uploaded.", - "skillManagement.detail.uploadFilesMenu": "Upload files...", + "skillManagement.detail.updateTagsFailed": "به‌روزرسانی برچسب‌ها انجام نشد.", + "skillManagement.detail.uploadCheckFailed": "نمی‌توان این فایل‌ها را بررسی کرد. دوباره امتحان کنید.", + "skillManagement.detail.uploadConflict": "فایلی با این نام از قبل وجود دارد.", + "skillManagement.detail.uploadFailureSummary": "{{failed}} از فایل های {{total}} ناموفق بود", + "skillManagement.detail.uploadFailureTitle": "برخی از آپلودها ناموفق بود", + "skillManagement.detail.uploadFile": "بارگذاری فایل", + "skillManagement.detail.uploadFileFailed": "آپلود فایل انجام نشد.", + "skillManagement.detail.uploadFileSuccess": "فایل بارگذاری شد.", + "skillManagement.detail.uploadFilesButton": "فایل های {{count}} را آپلود کنید", + "skillManagement.detail.uploadFilesFailedStatus_one": "آپلود فایل {{count}} انجام نشد.", + "skillManagement.detail.uploadFilesFailedStatus_other": "آپلود فایل {{count}} انجام نشد.", + "skillManagement.detail.uploadFilesMenu": "آپلود فایل ها...", + "skillManagement.detail.uploadFilesProgress": "در حال آپلود {{completed}}/{{total}}", + "skillManagement.detail.uploadFilesResult": "{{uploaded}} آپلود شد · {{failed}} ناموفق بود", + "skillManagement.detail.uploadFilesStatus": "وضعیت آپلود", + "skillManagement.detail.uploadInvalidExtension": "این نوع فایل پشتیبانی نمی شود.", + "skillManagement.detail.uploadInvalidName": "نام نامعتبر", + "skillManagement.detail.uploadInvalidPath": "مسیر فایل نامعتبر است.", + "skillManagement.detail.uploadKeepBoth": "هر دو را نگه دارید", + "skillManagement.detail.uploadLateConflict": "زمانی که شما در حال آپلود کردن بودید، شخصی این فایل را اضافه کرد.", + "skillManagement.detail.uploadMissingExtension": "پسوند فایل مورد نیاز است.", + "skillManagement.detail.uploadNetworkFailure": "آپلود انجام نشد. اتصال خود را بررسی کنید.", + "skillManagement.detail.uploadReadySummary": "{{ready}} آماده است · {{decisions}} نیاز به تصمیم دارد · {{skipped}} حذف خواهد شد", + "skillManagement.detail.uploadReplace": "جایگزین کنید", + "skillManagement.detail.uploadResolvedSummary": "{{ready}} آماده است · {{skipped}} حذف خواهد شد", + "skillManagement.detail.uploadRetryCount": "{{count}} را دوباره امتحان کنید", + "skillManagement.detail.uploadReviewTitle": "قبل از آپلود بررسی کنید", + "skillManagement.detail.uploadSkip": "کشتی", + "skillManagement.detail.uploadSkippedGroup": "فایل‌های {{count}} آپلود نمی‌شوند و از آنها صرفنظر می‌شود", + "skillManagement.detail.uploadStatusDismiss": "رد کردن وضعیت آپلود", + "skillManagement.detail.uploadSuggestion": "از پیشنهاد استفاده کنید", + "skillManagement.detail.uploadWillReplace": "جایگزین فایل موجود می شود", + "skillManagement.detail.uploadWillUseName": "به عنوان {{name}} آپلود خواهد شد", + "skillManagement.detail.versionHistory": "باز کردن تاریخچه نسخه", "skillManagement.detail.versionMeta": "{{hash}} · {{time}}", - "skillManagement.detail.versions": "Versions", - "skillManagement.draft": "Draft", - "skillManagement.duplicateFailed": "Failed to duplicate skill.", - "skillManagement.duplicateSuccess": "Skill duplicated.", - "skillManagement.editedAt": "Edited {{time}}", - "skillManagement.empty": "No skills yet", - "skillManagement.emptySearch": "No skills found", - "skillManagement.import": "Import", - "skillManagement.importFailed": "Failed to import skill.", - "skillManagement.importSuccess": "Skill imported.", - "skillManagement.listLabel": "Workspace skills", - "skillManagement.loadingError": "Failed to load skills", - "skillManagement.moreActions": "More actions for {{name}}", - "skillManagement.noTags": "No tags", - "skillManagement.publishedAt": "Published {{time}}", - "skillManagement.referenceCount": "{{count}} Refs", - "skillManagement.searchLabel": "Search skills", - "skillManagement.searchPlaceholder": "Search", - "skillManagement.tags": "Tags", - "skillManagement.title": "Skills" + "skillManagement.detail.versionPublishNote": "یادداشت های انتشار", + "skillManagement.detail.versionPublishNotePlaceholder": "این تغییر را شرح دهید", + "skillManagement.detail.versionPublishedMeta": "{{time}} · {{name}}", + "skillManagement.detail.versionTitle": "عنوان", + "skillManagement.detail.versions": "نسخه‌ها", + "skillManagement.detail.viewOnly": "فقط مشاهده کنید", + "skillManagement.detail.viewUploadErrors": "مشاهده خطاها", + "skillManagement.draft": "پیش‌نویس", + "skillManagement.duplicateFailed": "مهارت تکرار نشد.", + "skillManagement.duplicateSuccess": "Skill تکراری.", + "skillManagement.editedAt": "ویرایش‌شده {{time}}", + "skillManagement.empty": "هنوز مهارتی وجود ندارد", + "skillManagement.emptyAction.createDescription": "یک سناریو را با کلمات ساده توصیف کنید و یک مهارت پیش نویس برای مرور بدست آورید.", + "skillManagement.emptyAction.createTitle": "با Skill Builder ایجاد کنید", + "skillManagement.emptyAction.importDescription": "یک .zip با SKILL.md در قالب agentskills.io بیاورید.", + "skillManagement.emptyAction.importTitle": "یک بسته مهارت وارد کنید", + "skillManagement.emptySearch": "هیچ مهارتی پیدا نشد", + "skillManagement.errors.missingSkillMd": "این بسته فاقد SKILL.md است. فایل را اضافه کنید و دوباره آن را وارد کنید.", + "skillManagement.errors.nameConflict": "مهارتی به نام \"{{name}}\" از قبل وجود دارد. نام آن را در SKILL.md تغییر دهید و دوباره وارد کنید.", + "skillManagement.errors.workspaceLimit": "فضای کاری شما به حداکثر 500 مهارت رسیده است. برای افزودن مهارت جدید، مهارت را حذف کنید.", + "skillManagement.import": "وارد کردن", + "skillManagement.importFailed": "وارد کردن مهارت انجام نشد.", + "skillManagement.importSuccess": "Skill وارد شده است.", + "skillManagement.listLabel": "مهارت های فضای کاری", + "skillManagement.loadingError": "مهارت ها بارگیری نشد", + "skillManagement.moreActions": "اقدامات بیشتر برای {{name}}", + "skillManagement.noDescription": "هنوز توضیحاتی ارائه نشده است", + "skillManagement.noTags": "بدون برچسب", + "skillManagement.publishedAt": "منتشر شد {{time}}", + "skillManagement.referenceCount_one": "{{count}} عامل", + "skillManagement.referenceCount_other": "{{count}} عامل", + "skillManagement.searchLabel": "جستجوی مهارت‌ها", + "skillManagement.searchPlaceholder": "جستجو بر اساس نام یا توضیحات", + "skillManagement.tags": "برچسب‌ها", + "skillManagement.title": "مهارت‌ها" } diff --git a/web/i18n/fr-FR/agent-v-2.json b/web/i18n/fr-FR/agent-v-2.json index b41080c2b7f..f0dd393cbea 100644 --- a/web/i18n/fr-FR/agent-v-2.json +++ b/web/i18n/fr-FR/agent-v-2.json @@ -83,7 +83,7 @@ "agentDetail.configure.buildDraft.changesToApply_other": "{{count}} modifications à appliquer", "agentDetail.configure.buildDraft.discard": "Ignorer", "agentDetail.configure.buildDraft.modeBadge": "Mode build", - "agentDetail.configure.buildDraft.modeDescription": "Vous êtes en mode build. Configure ne peut être mis à jour que par l’agent dans ce mode. Ajustez cette configuration avec le chat à droite, puis appliquez.", + "agentDetail.configure.buildDraft.modeDescription": "Vous êtes en mode build. Façonnez cette configuration en discutant avec l’agent, puis cliquez sur Appliquer.", "agentDetail.configure.buildDraft.rewritten": "Réécrit", "agentDetail.configure.buildDraft.title": "Brouillon de build", "agentDetail.configure.buildDraft.updated": "Mis à jour", @@ -105,7 +105,8 @@ "agentDetail.configure.files.preview.failed": "Échec du chargement de l’aperçu.", "agentDetail.configure.files.preview.unsupported": "Ce fichier ne prend pas en charge l’aperçu.", "agentDetail.configure.files.remove": "Supprimer {{name}}", - "agentDetail.configure.files.tip": "Pour les documents de référence trop longs à coller dans le Prompt : spécifications, modèles, consignes. Référencez-les avec / dans le Prompt.\n\nEn mode Build, l'agent peut les configurer pour vous.", + "agentDetail.configure.files.richTip": "Pour les documents de référence trop longs à coller dans le Prompt : spécifications, modèles, consignes. En savoir plus\n\nEn mode Build, l'agent peut les configurer pour vous.", + "agentDetail.configure.files.tip": "Pour les documents de référence trop longs à coller dans le Prompt : spécifications, modèles, consignes. En savoir plus\n\nEn mode Build, l'agent peut les configurer pour vous.", "agentDetail.configure.files.toggle": "Basculer les fichiers", "agentDetail.configure.files.treeLabel": "Fichiers de l’agent", "agentDetail.configure.files.upload.action": "Téléverser", @@ -114,7 +115,7 @@ "agentDetail.configure.files.upload.dropzone": "Déposez un fichier ici, ou", "agentDetail.configure.files.upload.failed": "Échec du téléversement du fichier.", "agentDetail.configure.files.upload.fileType": "FICHIER", - "agentDetail.configure.files.upload.invalidFile": "Téléversez un fichier.", + "agentDetail.configure.files.upload.invalidFile": "Un seul fichier peut être téléversé à la fois.", "agentDetail.configure.files.upload.success": "Fichier téléversé.", "agentDetail.configure.files.upload.title": "Téléverser un fichier", "agentDetail.configure.knowledgeRetrieval.add": "Ajouter une récupération de connaissances", @@ -177,7 +178,8 @@ "agentDetail.configure.prompt.mention.priyaRamanathan": "Priya Ramanathan", "agentDetail.configure.prompt.placeholder": "Écrivez les instructions ici,", "agentDetail.configure.prompt.referenceMissing": "{{name}} n’existe pas", - "agentDetail.configure.prompt.tip": "Définissez le rôle de l’agent et décrivez sa tâche habituelle. Utilisez / pour faire explicitement référence aux compétences, fichiers, outils et récupérations de connaissances.", + "agentDetail.configure.prompt.richTip": "Définissez le rôle de l’agent et la manière dont il doit travailler. En savoir plus", + "agentDetail.configure.prompt.tip": "Définissez le rôle de l’agent et la manière dont il doit travailler. En savoir plus", "agentDetail.configure.publishBar.draft": "Brouillon", "agentDetail.configure.publishBar.publishUpdate": "Publier la mise à jour", "agentDetail.configure.publishBar.published": "Publié", @@ -190,8 +192,8 @@ "agentDetail.configure.publishBar.versionHistory": "Ouvrir l’historique des versions", "agentDetail.configure.publishImpact.affectedWorkflows": "Workflows affectés", "agentDetail.configure.publishImpact.cancel": "Annuler", - "agentDetail.configure.publishImpact.descriptionPrefix": "Votre agent apparaît dans", - "agentDetail.configure.publishImpact.descriptionSuffix": ". Les modifications les affecteront.", + "agentDetail.configure.publishImpact.descriptionPrefix": "Cet agent est utilisé dans", + "agentDetail.configure.publishImpact.descriptionSuffix": ". Sa publication le mettra à jour dans chacun d’eux.", "agentDetail.configure.publishImpact.fallbackAgentName": "cet agent", "agentDetail.configure.publishImpact.title": "{{action}} pour {{name}}", "agentDetail.configure.publishImpact.workflowCount_one": "{{count}} workflow", @@ -222,8 +224,8 @@ "agentDetail.configure.skills.openInLibrary": "Open in Skill library", "agentDetail.configure.skills.remove": "Supprimer {{name}}", "agentDetail.configure.skills.removeAction": "Remove", - "agentDetail.configure.skills.richTip": "Regroupez les instructions, fichiers et scripts d'une tâche récurrente dans une skill. Référencez-la avec / dans le Prompt. En savoir plus\n\nEn mode Build, l'agent peut les configurer pour vous.", - "agentDetail.configure.skills.tip": "Regroupez les instructions, fichiers et scripts d'une tâche récurrente dans une skill. Référencez-la avec / dans le Prompt. En savoir plus\n\nEn mode Build, l'agent peut les configurer pour vous.", + "agentDetail.configure.skills.richTip": "Regroupez les instructions, fichiers et scripts d'une tâche récurrente dans une skill. En savoir plus\n\nEn mode Build, l'agent peut les configurer pour vous.", + "agentDetail.configure.skills.tip": "Regroupez les instructions, fichiers et scripts d'une tâche récurrente dans une skill. En savoir plus\n\nEn mode Build, l'agent peut les configurer pour vous.", "agentDetail.configure.skills.toggle": "Basculer les compétences", "agentDetail.configure.skills.upload.action": "Téléverser", "agentDetail.configure.skills.upload.browse": "parcourir", @@ -269,8 +271,8 @@ "agentDetail.configure.tools.moreActions": "Plus d’actions pour {{name}}", "agentDetail.configure.tools.removeAction": "Supprimer {{name}}", "agentDetail.configure.tools.removeProvider": "Supprimer tous les outils", - "agentDetail.configure.tools.richTip": "Ajoutez les outils Dify de votre espace de travail. Référencez-les avec / dans le Prompt. En savoir plus\n\nLes outils que l'agent installe dans son sandbox n'apparaîtront pas ici, mais resteront disponibles.", - "agentDetail.configure.tools.tip": "Ajoutez les outils Dify de votre espace de travail. Référencez-les avec / dans le Prompt. En savoir plus\n\nLes outils que l'agent installe dans son sandbox n'apparaîtront pas ici, mais resteront disponibles.", + "agentDetail.configure.tools.richTip": "Ajoutez les outils Dify de votre espace de travail. En savoir plus\n\nLes outils que l'agent installe dans son sandbox n'apparaîtront pas ici, mais resteront disponibles.", + "agentDetail.configure.tools.tip": "Ajoutez les outils Dify de votre espace de travail. En savoir plus\n\nLes outils que l'agent installe dans son sandbox n'apparaîtront pas ici, mais resteront disponibles.", "agentDetail.configure.tools.toggle": "Basculer les outils", "agentDetail.configure.tools.toolTabs.all": "Tous", "agentDetail.configure.tools.toolTabs.cli": "CLI", @@ -336,22 +338,22 @@ "agentDetail.metadata.sourceLabel": "Source", "agentDetail.monitoring.change": "{{value}} par rapport à la période précédente", "agentDetail.monitoring.dateRangeLabel": "Plage de dates", - "agentDetail.monitoring.description": "Suivez l’activité, le coût et la qualité d’interaction de l’agent réutilisable dans tous les workflows.", + "agentDetail.monitoring.description": "Suivez l’activité, le coût et la qualité des interactions de cet agent sur tous les points d’accès.", "agentDetail.monitoring.learnMore": "En savoir plus", "agentDetail.monitoring.loadFailed": "Échec du chargement des données de surveillance", - "agentDetail.monitoring.metrics.activeUsers.explanation": "Utilisateurs finaux uniques ayant déclenché des workflows utilisant cet agent.", + "agentDetail.monitoring.metrics.activeUsers.explanation": "Utilisateurs finaux uniques ayant interagi avec cet agent.", "agentDetail.monitoring.metrics.activeUsers.title": "Utilisateurs actifs", - "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Nombre de communications continues entre utilisateur et agent pour ce point d’accès.", + "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Nombre moyen de messages utilisateur par conversation.", "agentDetail.monitoring.metrics.avgSessionInteractions.title": "Moy. interactions par session", - "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Vitesse de sortie moyenne du début de la requête jusqu’à son achèvement.", + "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Nombre moyen de tokens générés par seconde pendant une réponse de l’agent.", "agentDetail.monitoring.metrics.tokenOutputSpeed.title": "Vitesse de sortie des tokens", - "agentDetail.monitoring.metrics.tokenUsage.explanation": "Coût estimé en tokens produit par cet agent au cours des exécutions de workflows.", + "agentDetail.monitoring.metrics.tokenUsage.explanation": "Tokens consommés et coût estimé.", "agentDetail.monitoring.metrics.tokenUsage.title": "Utilisation des tokens", "agentDetail.monitoring.metrics.totalConversations.explanation": "Conversations IA quotidiennes ayant atteint cet agent via le point d’accès sélectionné.", "agentDetail.monitoring.metrics.totalConversations.title": "Total des conversations", - "agentDetail.monitoring.metrics.totalMessages.explanation": "Nombre quotidien d’interactions avec l’agent.", + "agentDetail.monitoring.metrics.totalMessages.explanation": "Nombre total de messages envoyés par les utilisateurs à cet agent.", "agentDetail.monitoring.metrics.totalMessages.title": "Total des messages", - "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "Le nombre de mentions « J’aime » pour 1 000 messages pour cet agent.", + "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "Pourcentage de réponses de l’agent auxquelles les utilisateurs ont attribué une mention « J’aime ».", "agentDetail.monitoring.metrics.userSatisfactionRate.title": "Taux de satisfaction des utilisateurs", "agentDetail.monitoring.pickSource": "Choisir une application", "agentDetail.monitoring.sourceLabel": "Application", @@ -549,7 +551,5 @@ "skillManagement.searchLabel": "Search skills", "skillManagement.searchPlaceholder": "Search", "skillManagement.tags": "Tags", - "skillManagement.title": "Skills", - "agentDetail.configure.files.richTip": "Pour les documents de référence trop longs à coller dans le Prompt : spécifications, modèles, consignes. En savoir plus\n\nEn mode Build, l'agent peut les configurer pour vous.", - "agentDetail.configure.prompt.richTip": "Définissez le rôle de l’agent et la manière dont il doit travailler. En savoir plus" + "skillManagement.title": "Skills" } diff --git a/web/i18n/fr-FR/skill.json b/web/i18n/fr-FR/skill.json index be5c79e9fbb..f47ac8cb14b 100644 --- a/web/i18n/fr-FR/skill.json +++ b/web/i18n/fr-FR/skill.json @@ -1,121 +1,245 @@ { - "skillManagement.clearTags": "Clear tags", - "skillManagement.create": "Create", - "skillManagement.createFailed": "Failed to create skill.", - "skillManagement.createSuccess": "Skill created.", - "skillManagement.dateTimeFormat": "MMM D, YYYY HH:mm", + "skillManagement.clearTags": "Effacer les balises", + "skillManagement.create": "Créer", + "skillManagement.createFailed": "Échec de la création de compétences.", + "skillManagement.createSuccess": "Brouillon créé.", + "skillManagement.dateTimeFormat": "MMM J, AAAA HH : mm", "skillManagement.deleteDialog.confirmInputLabel": "Pour confirmer, saisissez {{skillName}} dans le champ ci-dessous :", "skillManagement.deleteDialog.confirmInputPlaceholder": "Saisissez le nom d’affichage du Skill…", - "skillManagement.deleteDialog.description": "This skill will be removed from the workspace. Agents that reference it may lose access to this capability.", - "skillManagement.deleteDialog.title": "Delete {{name}}?", - "skillManagement.deleteFailed": "Failed to delete skill.", - "skillManagement.deleteSuccess": "Skill deleted.", - "skillManagement.detail.addMetadata": "Add metadata", - "skillManagement.detail.addMetadataDescription": "Add a frontmatter field to this Markdown file.", - "skillManagement.detail.addTag": "Add tag", - "skillManagement.detail.addTagDescription": "Create or bind a tag to this Skill. New tags are saved with the Skill metadata.", - "skillManagement.detail.addTagSuccess": "Tag added.", - "skillManagement.detail.back": "Back to Skills", - "skillManagement.detail.cancelAddMetadata": "Cancel adding metadata", - "skillManagement.detail.closeFileTab": "Close {{name}}", + "skillManagement.deleteDialog.description": "La suppression de la compétence est irréversible. Son contenu et son historique complet des versions seront définitivement supprimés. Aucun agent ne l'utilise actuellement.", + "skillManagement.deleteDialog.referencedDescription_one": "L'agent {{count}} utilise cette compétence, soit indépendamment, soit dans le cadre d'un flux de travail. La suppression de cette compétence effacera définitivement son contenu et son historique de versions, et la supprimera de l'agent concerné.", + "skillManagement.deleteDialog.referencedDescription_other": "Les agents {{count}} utilisent cette compétence, soit de manière indépendante, soit dans le cadre de workflows. La suppression de cette compétence effacera définitivement son contenu et son historique de versions, et la supprimera de tous les agents concernés.", + "skillManagement.deleteDialog.title": "Supprimer {{name}} ?", + "skillManagement.deleteFailed": "Échec de la suppression de la compétence.", + "skillManagement.deleteSuccess": "Skill supprimé.", + "skillManagement.detail.addMetadata": "Ajouter des métadonnées", + "skillManagement.detail.addMetadataDescription": "Ajoutez un champ frontmatter à ce fichier Markdown.", + "skillManagement.detail.addTag": "Ajouter une balise", + "skillManagement.detail.addTagDescription": "Créez ou liez une balise à ce Skill. Les nouvelles balises sont enregistrées avec les métadonnées Skill.", + "skillManagement.detail.addTagSuccess": "Balise ajoutée.", + "skillManagement.detail.back": "Retour à Skills", + "skillManagement.detail.builder.applyFailed": "Échec de l'application des brouillons de mises à jour.", + "skillManagement.detail.builder.attach": "Joindre un fichier", + "skillManagement.detail.builder.attachFailed": "Échec de la pièce jointe du fichier.", + "skillManagement.detail.builder.attachLimit": "Vous pouvez joindre jusqu'à 10 fichiers.", + "skillManagement.detail.builder.attachTooLarge": "Les fichiers doivent faire 15 Mo ou moins. Les images doivent faire 10 Mo ou moins.", + "skillManagement.detail.builder.attachUnsupported": "Seuls les fichiers d’images, de texte et de documents peuvent être joints.", + "skillManagement.detail.builder.attachmentOnlyMessage": "Utilisez le fichier ci-joint pour vous aider à améliorer cette compétence.", + "skillManagement.detail.builder.close": "Fermer Skill Builder", + "skillManagement.detail.builder.compatibleModelsOnly": "Seuls les modèles compatibles sont affichés", + "skillManagement.detail.builder.copyResponse": "Copier la réponse", + "skillManagement.detail.builder.copySuccess": "Réponse copiée dans le presse-papiers.", + "skillManagement.detail.builder.editIntro": "J'ai examiné cette compétence. Que souhaiteriez-vous régler ?", + "skillManagement.detail.builder.exampleIssueTriage": "Tri des problèmes clients", + "skillManagement.detail.builder.exampleOnboarding": "Guide d'intégration des nouveaux employés", + "skillManagement.detail.builder.exampleSalesFollowUp": "Stratégie de suivi des leads commerciaux", + "skillManagement.detail.builder.followUpDisplayName": "Utiliser l'approbation du remboursement comme nom d'affichage", + "skillManagement.detail.builder.followUpNameIcon": "Appliquer le nom et l'icône suggérés", + "skillManagement.detail.builder.fromMarketplace": "Depuis le Marketplace", + "skillManagement.detail.builder.model": "GPT-4o", + "skillManagement.detail.builder.modelCredits.all": "Tous les crédits", + "skillManagement.detail.builder.modelCredits.configure": "Configuration requise", + "skillManagement.detail.builder.modelCredits.exhausted": "Quota épuisé", + "skillManagement.detail.builder.modelProviderSettings": "Paramètres du fournisseur de modèle", + "skillManagement.detail.builder.modelSearch": "Rechercher des modèles...", + "skillManagement.detail.builder.modifyPlaceholder": "Demandez à l'IA de modifier cette compétence...", + "skillManagement.detail.builder.open": "Ouvrir Skill Builder", + "skillManagement.detail.builder.placeholder": "Décrivez le scénario...", + "skillManagement.detail.builder.progress.applyingChanges": "Application des modifications de fichiers", + "skillManagement.detail.builder.progress.generatingPlan": "Génération du plan de mise à jour", + "skillManagement.detail.builder.progress.readingDraft": "Lire le brouillon actuel", + "skillManagement.detail.builder.progress.updatingEditor": "Mise à jour de l'éditeur", + "skillManagement.detail.builder.promptDescription": "Décrivez-le et un brouillon apparaît dans l'éditeur, avec les étapes et les fichiers inclus.", + "skillManagement.detail.builder.promptTitle": "Que doit gérer cette compétence ?", + "skillManagement.detail.builder.readAloud": "Lire la réponse à haute voix", + "skillManagement.detail.builder.removeAttachment": "Supprimer {{name}}", + "skillManagement.detail.builder.restart": "Redémarrer le constructeur", + "skillManagement.detail.builder.retryResponse": "Réessayer la réponse", + "skillManagement.detail.builder.send": "Envoyer un message", + "skillManagement.detail.builder.sendFailed": "Skill Builder n'a pas répondu.", + "skillManagement.detail.builder.thinking": "Réflexion en cours", + "skillManagement.detail.builder.thinkingUnavailable": "Aucun contenu de réflexion n'a été renvoyé par le modèle.", + "skillManagement.detail.builder.title": "Skill Builder", + "skillManagement.detail.builder.tryExample": "Essayez un exemple", + "skillManagement.detail.builder.voice": "Saisie vocale", + "skillManagement.detail.builder.voiceUnavailable": "La saisie vocale n'est pas encore disponible.", + "skillManagement.detail.cancelAddMetadata": "Annuler l'ajout de métadonnées", + "skillManagement.detail.closeFileTab": "Fermer {{name}}", + "skillManagement.detail.closeVersions": "Fermer les versions", "skillManagement.detail.collapseSidebar": "Réduire la barre latérale", - "skillManagement.detail.createFile": "New file", - "skillManagement.detail.createFileDescription": "Enter a file path relative to the skill root.", - "skillManagement.detail.createFileMenu": "New file...", - "skillManagement.detail.createFileSuccess": "File created.", - "skillManagement.detail.createFolder": "New folder", - "skillManagement.detail.createFolderDescription": "Enter a folder path relative to the skill root.", - "skillManagement.detail.createFolderMenu": "New folder...", - "skillManagement.detail.createFolderSuccess": "Folder created.", - "skillManagement.detail.createdBy": "Created by {{name}}", - "skillManagement.detail.currentDraft": "Current draft", - "skillManagement.detail.deleteFileConfirm": "Delete this file?", - "skillManagement.detail.deleteFileSuccess": "File deleted.", - "skillManagement.detail.deleteVersionConfirm": "Delete this version?", - "skillManagement.detail.deleteVersionFailed": "Failed to delete version.", - "skillManagement.detail.deleteVersionSuccess": "Version deleted.", - "skillManagement.detail.downloadFile": "Download file", - "skillManagement.detail.draft": "Draft", + "skillManagement.detail.copyContentSuccess": "Contenu copié dans le presse-papiers.", + "skillManagement.detail.copyFile": "Copier", + "skillManagement.detail.copyFileSuccess": "Fichier prêt à coller.", + "skillManagement.detail.copyVersionId": "Copier l’ID", + "skillManagement.detail.copyVersionIdSuccess": "ID copié dans le presse-papiers.", + "skillManagement.detail.createFile": "Nouveau fichier", + "skillManagement.detail.createFileDescription": "Entrez un chemin de fichier relatif à la racine de la compétence.", + "skillManagement.detail.createFileMenu": "Nouveau fichier...", + "skillManagement.detail.createFileSuccess": "Fichier créé.", + "skillManagement.detail.createFolder": "Nouveau dossier", + "skillManagement.detail.createFolderDescription": "Entrez un chemin de dossier relatif à la racine de la compétence.", + "skillManagement.detail.createFolderMenu": "Nouveau dossier...", + "skillManagement.detail.createFolderSuccess": "Dossier créé.", + "skillManagement.detail.createdBy": "Créé par {{name}}", + "skillManagement.detail.currentDraft": "Projet actuel", + "skillManagement.detail.cutFile": "Couper", + "skillManagement.detail.cutFileSuccess": "Fichier prêt à déménager.", + "skillManagement.detail.deleteFileConfirm": "Supprimer ce fichier ?", + "skillManagement.detail.deleteFileSuccess": "Fichier supprimé.", + "skillManagement.detail.deleteVersionConfirm": "Supprimer cette version ?", + "skillManagement.detail.deleteVersionFailed": "Échec de la suppression de la version.", + "skillManagement.detail.deleteVersionSuccess": "Version supprimée.", + "skillManagement.detail.downloadFile": "Télécharger le fichier", + "skillManagement.detail.draft": "Brouillon", + "skillManagement.detail.editVersionInfo": "Modifier les informations de version", + "skillManagement.detail.exitVersions": "Quitter les versions", "skillManagement.detail.expandSidebar": "Développer la barre latérale", - "skillManagement.detail.fileCount": "{{count}} FILES", - "skillManagement.detail.fileMeta": "{{type}} · {{size}} bytes", - "skillManagement.detail.fileMissing": "File not found.", - "skillManagement.detail.fileOperationFailed": "File operation failed.", - "skillManagement.detail.files": "Files", - "skillManagement.detail.latest": "Latest", - "skillManagement.detail.loadFailed": "Failed to load skill.", - "skillManagement.detail.markdownLiveMode": "Live preview", - "skillManagement.detail.markdownSourceMode": "Source editor", - "skillManagement.detail.metadataKey": "name", - "skillManagement.detail.metadataValue": "value", - "skillManagement.detail.moveFileSuccess": "File moved.", - "skillManagement.detail.moveFilesSuccess": "Files moved.", - "skillManagement.detail.noFileSelected": "Select a file to preview.", - "skillManagement.detail.noFiles": "No files.", + "skillManagement.detail.fileAlreadyExists": "Un fichier ou un dossier portant ce nom existe déjà.", + "skillManagement.detail.fileCount_one": "Fichier {{count}}", + "skillManagement.detail.fileCount_other": "Fichiers {{count}}", + "skillManagement.detail.fileMeta": "{{type}} · {{size}} octets", + "skillManagement.detail.fileMissing": "Fichier introuvable.", + "skillManagement.detail.fileOperationFailed": "L'opération sur le fichier a échoué.", + "skillManagement.detail.files": "Fichiers", + "skillManagement.detail.latest": "Dernier", + "skillManagement.detail.loadFailed": "Échec du chargement de la compétence.", + "skillManagement.detail.loadingTags": "Chargement des balises...", + "skillManagement.detail.markdownLiveMode": "Aperçu en direct", + "skillManagement.detail.markdownSourceMode": "Éditeur de sources", + "skillManagement.detail.metadataKey": "nom", + "skillManagement.detail.metadataValue": "valeur", + "skillManagement.detail.moveFileSuccess": "Fichier déplacé.", + "skillManagement.detail.moveFilesSuccess": "Fichiers déplacés.", + "skillManagement.detail.nameThisVersion": "Nommez cette version", + "skillManagement.detail.noFileSelected": "Sélectionnez un fichier à prévisualiser.", + "skillManagement.detail.noFiles": "Aucun fichier.", "skillManagement.detail.noSearchResults": "Aucun fichier correspondant.", - "skillManagement.detail.noVersions": "No published versions yet.", - "skillManagement.detail.previewUnsupported": "Preview is not supported for this file.", - "skillManagement.detail.publish": "Publish", - "skillManagement.detail.publishFailed": "Failed to publish skill.", - "skillManagement.detail.publishSuccess": "Skill published.", - "skillManagement.detail.published": "Published", + "skillManagement.detail.noSelectableTags": "Aucune balise disponible.", + "skillManagement.detail.noVersions": "Aucune version publiée pour l'instant.", + "skillManagement.detail.pasteFile": "Coller", + "skillManagement.detail.pasteFileSuccess": "Fichier collé.", + "skillManagement.detail.previewUnsupported": "Ce fichier ne prend pas en charge l’aperçu.", + "skillManagement.detail.publish": "Publier", + "skillManagement.detail.publishFailed": "Échec de la publication de la compétence.", + "skillManagement.detail.publishReferencesDescription_one": "La publication prend effet immédiatement pour l'agent {{count}} utilisant cette compétence.", + "skillManagement.detail.publishReferencesDescription_other": "La publication prend effet immédiatement pour les agents {{count}} utilisant cette compétence.", + "skillManagement.detail.publishReferencesTitle": "Publier la compétence", + "skillManagement.detail.publishSuccess": "Skill publié.", + "skillManagement.detail.publishUpdate": "Publier la mise à jour", + "skillManagement.detail.published": "Publié", "skillManagement.detail.publishedAt": "Publié {{time}}", + "skillManagement.detail.publishedVersion": "Publié #{{number}}", "skillManagement.detail.publishing": "Publication...", - "skillManagement.detail.readonly": "Read only", - "skillManagement.detail.referenceFiles.confirm": "Enter Confirm", - "skillManagement.detail.referenceFiles.empty": "No files available.", - "skillManagement.detail.referenceFiles.livePlaceholder": "Write instructions for the agent, type / to reference files", - "skillManagement.detail.referenceFiles.navigate": "↑↓ Navigate", - "skillManagement.detail.referenceFiles.title": "Reference files", - "skillManagement.detail.referencedBy": "Referenced by {{count}} Apps", - "skillManagement.detail.removeMetadata": "Delete {{name}} metadata", - "skillManagement.detail.removeTag": "Remove {{tag}}", - "skillManagement.detail.removeTagSuccess": "Tag removed.", - "skillManagement.detail.renameFile": "Rename file", - "skillManagement.detail.renameFileDescription": "Enter the new path relative to the skill root.", - "skillManagement.detail.renameFileSuccess": "File renamed.", - "skillManagement.detail.renameSkillSuccess": "Skill renamed.", - "skillManagement.detail.renameVersion": "Rename", - "skillManagement.detail.renameVersionFailed": "Failed to rename version.", - "skillManagement.detail.renameVersionPrompt": "Version name", - "skillManagement.detail.renameVersionSuccess": "Version renamed.", - "skillManagement.detail.restoreVersion": "Restore", - "skillManagement.detail.restoreVersionFailed": "Failed to restore version.", - "skillManagement.detail.restoreVersionSuccess": "Version restored to draft.", - "skillManagement.detail.save": "Save", - "skillManagement.detail.saveFailed": "Failed to save file.", - "skillManagement.detail.saveSuccess": "File saved.", - "skillManagement.detail.saved": "Saved", - "skillManagement.detail.savedAt": "Saved {{time}}", - "skillManagement.detail.saving": "Saving...", + "skillManagement.detail.readonly": "Lecture seule", + "skillManagement.detail.referenceFiles.confirm": "Entrer Confirmer", + "skillManagement.detail.referenceFiles.empty": "Aucun fichier disponible.", + "skillManagement.detail.referenceFiles.livePlaceholder": "Rédigez des instructions pour l’agent. Tapez / pour référencer des fichiers.", + "skillManagement.detail.referenceFiles.navigate": "↑↓ Naviguer", + "skillManagement.detail.referenceFiles.title": "Fichiers de référence", + "skillManagement.detail.referencedBy_one": "Utilisé par {{count}} Agent", + "skillManagement.detail.referencedBy_other": "Utilisé par {{count}} Agents", + "skillManagement.detail.removeMetadata": "Supprimer les métadonnées {{name}}", + "skillManagement.detail.removeTag": "Supprimer {{tag}}", + "skillManagement.detail.removeTagSuccess": "Balise supprimée.", + "skillManagement.detail.renameFile": "Renommer le fichier", + "skillManagement.detail.renameFileDescription": "Entrez le nouveau chemin par rapport à la racine de la compétence.", + "skillManagement.detail.renameFileSuccess": "Fichier renommé.", + "skillManagement.detail.renameSkillSuccess": "Skill renommé.", + "skillManagement.detail.renameVersion": "Renommer", + "skillManagement.detail.renameVersionFailed": "Échec du renommage de la version.", + "skillManagement.detail.renameVersionPrompt": "Nom de la version", + "skillManagement.detail.renameVersionSuccess": "Version renommée.", + "skillManagement.detail.resizeSidebar": "Redimensionner la barre latérale du fichier", + "skillManagement.detail.restoreVersion": "Restaurer", + "skillManagement.detail.restoreVersionConfirmDescription": "Cela remplacera le brouillon actuel par les fichiers de \"{{version}}\". Il ne publiera pas le Skill ni ne créera de nouvelle version.", + "skillManagement.detail.restoreVersionConfirmTitle": "Restaurer cette version ?", + "skillManagement.detail.restoreVersionFailed": "Échec de la restauration de la version.", + "skillManagement.detail.restoreVersionSuccess": "Version restaurée au brouillon.", + "skillManagement.detail.save": "Enregistrer", + "skillManagement.detail.saveConflictConfirmDescription": "Cette compétence a été mise à jour ailleurs. Chargez le dernier brouillon pour continuer l'édition. Vos modifications actuelles seront ignorées.", + "skillManagement.detail.saveConflictConfirmTitle": "Charger le dernier brouillon ?", + "skillManagement.detail.saveConflictReload": "Charger le dernier brouillon", + "skillManagement.detail.saveConflictStatus": "Conflit détecté. Chargez le dernier brouillon pour continuer l'édition.", + "skillManagement.detail.saveFailed": "Échec de l'enregistrement du fichier.", + "skillManagement.detail.saveSuccess": "Fichier enregistré.", + "skillManagement.detail.saved": "Sauvegardé", + "skillManagement.detail.savedAt": "Enregistré {{time}}", + "skillManagement.detail.saving": "Enregistrement...", "skillManagement.detail.searchFiles": "Rechercher des fichiers", + "skillManagement.detail.showMoreReferences": "Afficher {{count}} plus", + "skillManagement.detail.skillDescriptionPlaceholder": "Décrivez à quoi sert cette compétence et quand les agents doivent l'utiliser.", + "skillManagement.detail.skillNamePlaceholder": "Utilisez des lettres minuscules, des chiffres et des traits d'union.", "skillManagement.detail.unpublishedChanges": "Modifications non publiées", - "skillManagement.detail.unsavedChanges": "Unsaved changes", + "skillManagement.detail.unsavedChanges": "Modifications non enregistrées", "skillManagement.detail.upToDate": "À jour", - "skillManagement.detail.updateTagsFailed": "Failed to update tags.", - "skillManagement.detail.uploadFile": "Upload file", - "skillManagement.detail.uploadFileFailed": "File upload failed.", - "skillManagement.detail.uploadFileSuccess": "File uploaded.", - "skillManagement.detail.uploadFilesMenu": "Upload files...", + "skillManagement.detail.updateTagsFailed": "Échec de la mise à jour des balises.", + "skillManagement.detail.uploadCheckFailed": "Impossible de vérifier ces fichiers. Essayer à nouveau.", + "skillManagement.detail.uploadConflict": "Un fichier portant ce nom existe déjà.", + "skillManagement.detail.uploadFailureSummary": "Échec du {{failed}} des fichiers {{total}}", + "skillManagement.detail.uploadFailureTitle": "Certains téléchargements ont échoué", + "skillManagement.detail.uploadFile": "Téléverser un fichier", + "skillManagement.detail.uploadFileFailed": "Le téléchargement du fichier a échoué.", + "skillManagement.detail.uploadFileSuccess": "Fichier téléversé.", + "skillManagement.detail.uploadFilesButton": "Téléchargez des fichiers {{count}}", + "skillManagement.detail.uploadFilesFailedStatus_one": "Échec du téléchargement du fichier {{count}}.", + "skillManagement.detail.uploadFilesFailedStatus_other": "Les téléchargements du fichier {{count}} ont échoué.", + "skillManagement.detail.uploadFilesMenu": "Télécharger des fichiers...", + "skillManagement.detail.uploadFilesProgress": "Téléchargement de {{completed}}/{{total}}", + "skillManagement.detail.uploadFilesResult": "{{uploaded}} téléchargé · {{failed}} a échoué", + "skillManagement.detail.uploadFilesStatus": "Statut de téléchargement", + "skillManagement.detail.uploadInvalidExtension": "Ce type de fichier n'est pas pris en charge.", + "skillManagement.detail.uploadInvalidName": "Nom invalide.", + "skillManagement.detail.uploadInvalidPath": "Chemin de fichier invalide.", + "skillManagement.detail.uploadKeepBoth": "Gardez les deux", + "skillManagement.detail.uploadLateConflict": "Quelqu'un a ajouté ce fichier pendant que vous téléchargiez.", + "skillManagement.detail.uploadMissingExtension": "Une extension de fichier est requise.", + "skillManagement.detail.uploadNetworkFailure": "Le téléchargement a échoué. Vérifiez votre connexion.", + "skillManagement.detail.uploadReadySummary": "{{ready}} prêt · {{decisions}} nécessite une décision · {{skipped}} sera ignoré", + "skillManagement.detail.uploadReplace": "Remplacer", + "skillManagement.detail.uploadResolvedSummary": "{{ready}} prêt · {{skipped}} sera ignoré", + "skillManagement.detail.uploadRetryCount": "Réessayez {{count}}", + "skillManagement.detail.uploadReviewTitle": "Vérifier avant de télécharger", + "skillManagement.detail.uploadSkip": "Bateau", + "skillManagement.detail.uploadSkippedGroup": "Les fichiers {{count}} ne peuvent pas être téléchargés et seront ignorés", + "skillManagement.detail.uploadStatusDismiss": "Ignorer le statut de téléchargement", + "skillManagement.detail.uploadSuggestion": "Utiliser la suggestion", + "skillManagement.detail.uploadWillReplace": "Remplacera le fichier existant", + "skillManagement.detail.uploadWillUseName": "Sera téléchargé en tant que {{name}}", + "skillManagement.detail.versionHistory": "Ouvrir l’historique des versions", "skillManagement.detail.versionMeta": "{{hash}} · {{time}}", + "skillManagement.detail.versionPublishNote": "Notes de version", + "skillManagement.detail.versionPublishNotePlaceholder": "Décrivez ce changement", + "skillManagement.detail.versionPublishedMeta": "{{time}} · {{name}}", + "skillManagement.detail.versionTitle": "Titre", "skillManagement.detail.versions": "Versions", - "skillManagement.draft": "Draft", - "skillManagement.duplicateFailed": "Failed to duplicate skill.", - "skillManagement.duplicateSuccess": "Skill duplicated.", - "skillManagement.editedAt": "Edited {{time}}", - "skillManagement.empty": "No skills yet", - "skillManagement.emptySearch": "No skills found", - "skillManagement.import": "Import", - "skillManagement.importFailed": "Failed to import skill.", - "skillManagement.importSuccess": "Skill imported.", - "skillManagement.listLabel": "Workspace skills", - "skillManagement.loadingError": "Failed to load skills", - "skillManagement.moreActions": "More actions for {{name}}", - "skillManagement.noTags": "No tags", - "skillManagement.publishedAt": "Published {{time}}", - "skillManagement.referenceCount": "{{count}} Refs", - "skillManagement.searchLabel": "Search skills", - "skillManagement.searchPlaceholder": "Search", - "skillManagement.tags": "Tags", - "skillManagement.title": "Skills" + "skillManagement.detail.viewOnly": "Visualisation uniquement", + "skillManagement.detail.viewUploadErrors": "Afficher les erreurs", + "skillManagement.draft": "Brouillon", + "skillManagement.duplicateFailed": "Échec de la duplication de la compétence.", + "skillManagement.duplicateSuccess": "Skill dupliqué.", + "skillManagement.editedAt": "Modifié {{time}}", + "skillManagement.empty": "Pas encore de compétences", + "skillManagement.emptyAction.createDescription": "Décrivez un scénario avec des mots simples et obtenez une ébauche de compétence à réviser.", + "skillManagement.emptyAction.createTitle": "Créer avec Skill Builder", + "skillManagement.emptyAction.importDescription": "Apportez un .zip avec SKILL.md, au format agentskills.io.", + "skillManagement.emptyAction.importTitle": "Importer un package de compétences", + "skillManagement.emptySearch": "Aucune compétence trouvée", + "skillManagement.errors.missingSkillMd": "Ce package ne contient pas de SKILL.md. Ajoutez le fichier et importez-le à nouveau.", + "skillManagement.errors.nameConflict": "Une compétence nommée \"{{name}}\" existe déjà. Renommez-le en SKILL.md et importez-le à nouveau.", + "skillManagement.errors.workspaceLimit": "Votre espace de travail a atteint la limite de 500 compétences. Supprimez une compétence pour en ajouter une nouvelle.", + "skillManagement.import": "Importer", + "skillManagement.importFailed": "Échec de l'importation de la compétence.", + "skillManagement.importSuccess": "Skill importé.", + "skillManagement.listLabel": "Compétences en espace de travail", + "skillManagement.loadingError": "Échec du chargement des compétences", + "skillManagement.moreActions": "Plus d’actions pour {{name}}", + "skillManagement.noDescription": "Pas encore de description", + "skillManagement.noTags": "Aucune balise", + "skillManagement.publishedAt": "Publié {{time}}", + "skillManagement.referenceCount_one": "{{count}} Agent", + "skillManagement.referenceCount_other": "{{count}} Agents", + "skillManagement.searchLabel": "Rechercher des compétences", + "skillManagement.searchPlaceholder": "Rechercher par nom ou description", + "skillManagement.tags": "Balises", + "skillManagement.title": "Compétences" } diff --git a/web/i18n/hi-IN/agent-v-2.json b/web/i18n/hi-IN/agent-v-2.json index b07673157f1..59c6e791d00 100644 --- a/web/i18n/hi-IN/agent-v-2.json +++ b/web/i18n/hi-IN/agent-v-2.json @@ -83,7 +83,7 @@ "agentDetail.configure.buildDraft.changesToApply_other": "लागू करने के लिए {{count}} बदलाव", "agentDetail.configure.buildDraft.discard": "छोड़ें", "agentDetail.configure.buildDraft.modeBadge": "बिल्ड मोड", - "agentDetail.configure.buildDraft.modeDescription": "आप बिल्ड मोड में हैं। इस मोड में Configure को केवल एजेंट ही अपडेट कर सकता है। दाईं ओर की चैट से इस सेटअप को आकार दें, फिर लागू करें।", + "agentDetail.configure.buildDraft.modeDescription": "आप बिल्ड मोड में हैं। एजेंट से चैट करके इस सेटअप को आकार दें, फिर लागू करें।", "agentDetail.configure.buildDraft.rewritten": "फिर से लिखा गया", "agentDetail.configure.buildDraft.title": "बिल्ड ड्राफ्ट", "agentDetail.configure.buildDraft.updated": "अपडेट किया गया", @@ -105,7 +105,8 @@ "agentDetail.configure.files.preview.failed": "पूर्वावलोकन लोड करने में विफल।", "agentDetail.configure.files.preview.unsupported": "यह फ़ाइल पूर्वावलोकन का समर्थन नहीं करती।", "agentDetail.configure.files.remove": "{{name}} हटाएँ", - "agentDetail.configure.files.tip": "Prompt में चिपकाने के लिए बहुत लंबी संदर्भ सामग्री के लिए: स्पेक्स, टेम्पलेट, दिशानिर्देश। Prompt में / से संदर्भ दें।\n\nBuild mode में, एजेंट इन्हें आपके लिए सेट कर सकता है।", + "agentDetail.configure.files.richTip": "Prompt में चिपकाने के लिए बहुत लंबी संदर्भ सामग्री के लिए: स्पेक्स, टेम्पलेट, दिशानिर्देश। ज़्यादा जानें\n\nBuild mode में, एजेंट इन्हें आपके लिए सेट कर सकता है।", + "agentDetail.configure.files.tip": "Prompt में चिपकाने के लिए बहुत लंबी संदर्भ सामग्री के लिए: स्पेक्स, टेम्पलेट, दिशानिर्देश। ज़्यादा जानें\n\nBuild mode में, एजेंट इन्हें आपके लिए सेट कर सकता है।", "agentDetail.configure.files.toggle": "फ़ाइलें टॉगल करें", "agentDetail.configure.files.treeLabel": "एजेंट फ़ाइलें", "agentDetail.configure.files.upload.action": "अपलोड करें", @@ -114,7 +115,7 @@ "agentDetail.configure.files.upload.dropzone": "यहाँ एक फ़ाइल छोड़ें, या", "agentDetail.configure.files.upload.failed": "फ़ाइल अपलोड करने में विफल।", "agentDetail.configure.files.upload.fileType": "FILE", - "agentDetail.configure.files.upload.invalidFile": "एक फ़ाइल अपलोड करें।", + "agentDetail.configure.files.upload.invalidFile": "एक बार में केवल एक फ़ाइल अपलोड की जा सकती है।", "agentDetail.configure.files.upload.success": "फ़ाइल अपलोड हो गई।", "agentDetail.configure.files.upload.title": "फ़ाइल अपलोड करें", "agentDetail.configure.knowledgeRetrieval.add": "ज्ञान पुनर्प्राप्ति जोड़ें", @@ -177,7 +178,8 @@ "agentDetail.configure.prompt.mention.priyaRamanathan": "Priya Ramanathan", "agentDetail.configure.prompt.placeholder": "यहाँ निर्देश लिखें,", "agentDetail.configure.prompt.referenceMissing": "{{name}} मौजूद नहीं है", - "agentDetail.configure.prompt.tip": "एजेंट की भूमिका परिभाषित करें और उसके सामान्य कार्य का वर्णन करें। Skills, Files, Tools और Knowledge Retrievals का स्पष्ट संदर्भ देने के लिए / का उपयोग करें।", + "agentDetail.configure.prompt.richTip": "एजेंट की भूमिका और उसके काम करने के तरीके को तय करें। ज़्यादा जानें", + "agentDetail.configure.prompt.tip": "एजेंट की भूमिका और उसके काम करने के तरीके को तय करें। ज़्यादा जानें", "agentDetail.configure.publishBar.draft": "ड्राफ्ट", "agentDetail.configure.publishBar.publishUpdate": "अपडेट प्रकाशित करें", "agentDetail.configure.publishBar.published": "प्रकाशित", @@ -190,8 +192,8 @@ "agentDetail.configure.publishBar.versionHistory": "संस्करण इतिहास खोलें", "agentDetail.configure.publishImpact.affectedWorkflows": "प्रभावित वर्कफ़्लो", "agentDetail.configure.publishImpact.cancel": "रद्द करें", - "agentDetail.configure.publishImpact.descriptionPrefix": "आपका एजेंट यहाँ दिखाई देता है", - "agentDetail.configure.publishImpact.descriptionSuffix": "। परिवर्तन उन पर असर डालेंगे।", + "agentDetail.configure.publishImpact.descriptionPrefix": "इस एजेंट का उपयोग", + "agentDetail.configure.publishImpact.descriptionSuffix": " में किया जाता है। इसे प्रकाशित करने पर यह उन सभी में अपडेट हो जाएगा।", "agentDetail.configure.publishImpact.fallbackAgentName": "यह एजेंट", "agentDetail.configure.publishImpact.title": "{{name}} पर {{action}}", "agentDetail.configure.publishImpact.workflowCount_one": "{{count}} वर्कफ़्लो", @@ -222,8 +224,8 @@ "agentDetail.configure.skills.openInLibrary": "Open in Skill library", "agentDetail.configure.skills.remove": "{{name}} हटाएँ", "agentDetail.configure.skills.removeAction": "Remove", - "agentDetail.configure.skills.richTip": "किसी दोहराए जाने वाले कार्य के निर्देशों, फ़ाइलों और स्क्रिप्ट को एक Skill में पैकेज करें। Prompt में / से संदर्भ दें। और जानें\n\nBuild mode में, एजेंट इन्हें आपके लिए सेट कर सकता है।", - "agentDetail.configure.skills.tip": "किसी दोहराए जाने वाले कार्य के निर्देशों, फ़ाइलों और स्क्रिप्ट को एक Skill में पैकेज करें। Prompt में / से संदर्भ दें। और जानें\n\nBuild mode में, एजेंट इन्हें आपके लिए सेट कर सकता है।", + "agentDetail.configure.skills.richTip": "किसी दोहराए जाने वाले कार्य के निर्देशों, फ़ाइलों और स्क्रिप्ट को एक Skill में पैकेज करें। और जानें\n\nBuild mode में, एजेंट इन्हें आपके लिए सेट कर सकता है।", + "agentDetail.configure.skills.tip": "किसी दोहराए जाने वाले कार्य के निर्देशों, फ़ाइलों और स्क्रिप्ट को एक Skill में पैकेज करें। और जानें\n\nBuild mode में, एजेंट इन्हें आपके लिए सेट कर सकता है।", "agentDetail.configure.skills.toggle": "कौशल टॉगल करें", "agentDetail.configure.skills.upload.action": "अपलोड करें", "agentDetail.configure.skills.upload.browse": "ब्राउज़ करें", @@ -269,8 +271,8 @@ "agentDetail.configure.tools.moreActions": "{{name}} के लिए और क्रियाएँ", "agentDetail.configure.tools.removeAction": "{{name}} हटाएँ", "agentDetail.configure.tools.removeProvider": "सभी उपकरण हटाएँ", - "agentDetail.configure.tools.richTip": "अपने workspace से Dify tools जोड़ें। Prompt में / से संदर्भ दें। और जानें\n\nएजेंट अपने sandbox में जो tools इंस्टॉल करता है वे यहां दिखाई नहीं देंगे, लेकिन उसके लिए उपलब्ध रहेंगे।", - "agentDetail.configure.tools.tip": "अपने workspace से Dify tools जोड़ें। Prompt में / से संदर्भ दें। और जानें\n\nएजेंट अपने sandbox में जो tools इंस्टॉल करता है वे यहां दिखाई नहीं देंगे, लेकिन उसके लिए उपलब्ध रहेंगे।", + "agentDetail.configure.tools.richTip": "अपने workspace से Dify tools जोड़ें। और जानें\n\nएजेंट अपने sandbox में जो tools इंस्टॉल करता है वे यहां दिखाई नहीं देंगे, लेकिन उसके लिए उपलब्ध रहेंगे।", + "agentDetail.configure.tools.tip": "अपने workspace से Dify tools जोड़ें। और जानें\n\nएजेंट अपने sandbox में जो tools इंस्टॉल करता है वे यहां दिखाई नहीं देंगे, लेकिन उसके लिए उपलब्ध रहेंगे।", "agentDetail.configure.tools.toggle": "उपकरण टॉगल करें", "agentDetail.configure.tools.toolTabs.all": "सभी", "agentDetail.configure.tools.toolTabs.cli": "CLI", @@ -336,22 +338,22 @@ "agentDetail.metadata.sourceLabel": "स्रोत", "agentDetail.monitoring.change": "पिछली अवधि से {{value}}", "agentDetail.monitoring.dateRangeLabel": "दिनांक सीमा", - "agentDetail.monitoring.description": "वर्कफ़्लो में पुनः उपयोग योग्य एजेंट गतिविधि, लागत और इंटरैक्शन गुणवत्ता को ट्रैक करें।", + "agentDetail.monitoring.description": "सभी एक्सेस पॉइंट पर इस एजेंट की गतिविधि, लागत और इंटरैक्शन की गुणवत्ता को ट्रैक करें।", "agentDetail.monitoring.learnMore": "और अधिक जानें", "agentDetail.monitoring.loadFailed": "मॉनिटरिंग डेटा लोड नहीं हो सका", - "agentDetail.monitoring.metrics.activeUsers.explanation": "अद्वितीय अंतिम-उपयोगकर्ता जिन्होंने इस एजेंट का उपयोग करके वर्कफ़्लो ट्रिगर किए।", + "agentDetail.monitoring.metrics.activeUsers.explanation": "इस एजेंट के साथ इंटरैक्ट करने वाले अद्वितीय अंतिम उपयोगकर्ताओं की संख्या।", "agentDetail.monitoring.metrics.activeUsers.title": "सक्रिय उपयोगकर्ता", - "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "इस एक्सेस पॉइंट के लिए निरंतर उपयोगकर्ता-एजेंट संचार गणना।", + "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "प्रति बातचीत उपयोगकर्ता संदेशों की औसत संख्या।", "agentDetail.monitoring.metrics.avgSessionInteractions.title": "औसत सत्र इंटरैक्शन", - "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "अनुरोध की शुरुआत से पूरा होने तक औसत आउटपुट गति।", + "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "एजेंट के जवाब के दौरान प्रति सेकंड जनरेट किए गए टोकन की औसत संख्या।", "agentDetail.monitoring.metrics.tokenOutputSpeed.title": "टोकन आउटपुट गति", - "agentDetail.monitoring.metrics.tokenUsage.explanation": "वर्कफ़्लो रन में इस एजेंट द्वारा उत्पन्न अनुमानित टोकन लागत।", + "agentDetail.monitoring.metrics.tokenUsage.explanation": "उपयोग किए गए टोकन और अनुमानित लागत।", "agentDetail.monitoring.metrics.tokenUsage.title": "टोकन उपयोग", "agentDetail.monitoring.metrics.totalConversations.explanation": "चयनित एक्सेस पॉइंट के माध्यम से इस एजेंट तक पहुँचने वाली दैनिक AI वार्तालाप।", "agentDetail.monitoring.metrics.totalConversations.title": "कुल वार्तालाप", - "agentDetail.monitoring.metrics.totalMessages.explanation": "दैनिक एजेंट इंटरैक्शन गणना।", + "agentDetail.monitoring.metrics.totalMessages.explanation": "इस एजेंट को भेजे गए उपयोगकर्ता संदेशों की कुल संख्या।", "agentDetail.monitoring.metrics.totalMessages.title": "कुल संदेश", - "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "इस एजेंट के लिए प्रति 1,000 संदेशों पर लाइक की संख्या।", + "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "एजेंट के उन जवाबों का प्रतिशत जिन्हें उपयोगकर्ताओं ने लाइक किया।", "agentDetail.monitoring.metrics.userSatisfactionRate.title": "उपयोगकर्ता संतुष्टि दर", "agentDetail.monitoring.pickSource": "एक ऐप चुनें", "agentDetail.monitoring.sourceLabel": "ऐप", @@ -549,7 +551,5 @@ "skillManagement.searchLabel": "Search skills", "skillManagement.searchPlaceholder": "Search", "skillManagement.tags": "Tags", - "skillManagement.title": "Skills", - "agentDetail.configure.files.richTip": "Prompt में चिपकाने के लिए बहुत लंबी संदर्भ सामग्री के लिए: स्पेक्स, टेम्पलेट, दिशानिर्देश। ज़्यादा जानें\n\nBuild mode में, एजेंट इन्हें आपके लिए सेट कर सकता है।", - "agentDetail.configure.prompt.richTip": "एजेंट की भूमिका और उसके काम करने के तरीके को तय करें। ज़्यादा जानें" + "skillManagement.title": "Skills" } diff --git a/web/i18n/hi-IN/skill.json b/web/i18n/hi-IN/skill.json index ad0363dd786..5b1316d4965 100644 --- a/web/i18n/hi-IN/skill.json +++ b/web/i18n/hi-IN/skill.json @@ -1,121 +1,245 @@ { - "skillManagement.clearTags": "Clear tags", - "skillManagement.create": "Create", - "skillManagement.createFailed": "Failed to create skill.", - "skillManagement.createSuccess": "Skill created.", - "skillManagement.dateTimeFormat": "MMM D, YYYY HH:mm", + "skillManagement.clearTags": "टैग साफ़ करें", + "skillManagement.create": "बनाएँ", + "skillManagement.createFailed": "कौशल पैदा करने में असफल.", + "skillManagement.createSuccess": "ड्राफ्ट बनाया गया.", + "skillManagement.dateTimeFormat": "एमएमएम डी, वाई वाई वाई एचएच: मिमी", "skillManagement.deleteDialog.confirmInputLabel": "पुष्टि करने के लिए, नीचे दिए गए बॉक्स में {{skillName}} टाइप करें:", "skillManagement.deleteDialog.confirmInputPlaceholder": "Skill का डिस्प्ले नाम दर्ज करें…", - "skillManagement.deleteDialog.description": "This skill will be removed from the workspace. Agents that reference it may lose access to this capability.", - "skillManagement.deleteDialog.title": "Delete {{name}}?", - "skillManagement.deleteFailed": "Failed to delete skill.", - "skillManagement.deleteSuccess": "Skill deleted.", - "skillManagement.detail.addMetadata": "Add metadata", - "skillManagement.detail.addMetadataDescription": "Add a frontmatter field to this Markdown file.", - "skillManagement.detail.addTag": "Add tag", - "skillManagement.detail.addTagDescription": "Create or bind a tag to this Skill. New tags are saved with the Skill metadata.", - "skillManagement.detail.addTagSuccess": "Tag added.", - "skillManagement.detail.back": "Back to Skills", - "skillManagement.detail.cancelAddMetadata": "Cancel adding metadata", - "skillManagement.detail.closeFileTab": "Close {{name}}", + "skillManagement.deleteDialog.description": "कौशल को हटाना अपरिवर्तनीय है. इसकी सामग्री और पूर्ण संस्करण इतिहास स्थायी रूप से हटा दिया जाएगा। वर्तमान में कोई भी एजेंट इसका उपयोग नहीं कर रहा है।", + "skillManagement.deleteDialog.referencedDescription_one": "{{count}} एजेंट इस कौशल का उपयोग स्वतंत्र रूप से या वर्कफ़्लो में कर रहा है। इस कौशल को हटाने से इसकी सामग्री और संस्करण इतिहास स्थायी रूप से मिट जाएगा, और इसे प्रभावित एजेंट से हटा दिया जाएगा।", + "skillManagement.deleteDialog.referencedDescription_other": "{{count}} एजेंट इस कौशल का उपयोग स्वतंत्र रूप से या वर्कफ़्लो में कर रहे हैं। इस कौशल को हटाने से इसकी सामग्री और संस्करण इतिहास स्थायी रूप से मिट जाएगा, और इसे सभी प्रभावित एजेंटों से हटा दिया जाएगा।", + "skillManagement.deleteDialog.title": "{{name}} हटाएँ?", + "skillManagement.deleteFailed": "कौशल हटाने में विफल.", + "skillManagement.deleteSuccess": "Skill हटा दिया गया.", + "skillManagement.detail.addMetadata": "मेटाडेटा जोड़ें", + "skillManagement.detail.addMetadataDescription": "इस मार्कडाउन फ़ाइल में एक फ्रंटमैटर फ़ील्ड जोड़ें।", + "skillManagement.detail.addTag": "टैग जोड़ें", + "skillManagement.detail.addTagDescription": "इस Skill पर एक टैग बनाएं या बाइंड करें। नए टैग Skill मेटाडेटा के साथ सहेजे जाते हैं।", + "skillManagement.detail.addTagSuccess": "टैग जोड़ा गया.", + "skillManagement.detail.back": "Skills पर वापस जाएँ", + "skillManagement.detail.builder.applyFailed": "ड्राफ्ट अपडेट लागू करने में विफल.", + "skillManagement.detail.builder.attach": "फ़ाइल जोड़ें", + "skillManagement.detail.builder.attachFailed": "फ़ाइल संलग्न करने में विफल.", + "skillManagement.detail.builder.attachLimit": "आप अधिकतम 10 फ़ाइलें संलग्न कर सकते हैं.", + "skillManagement.detail.builder.attachTooLarge": "फ़ाइलें 15 एमबी या उससे छोटी होनी चाहिए. छवियाँ 10 एमबी या उससे छोटी होनी चाहिए।", + "skillManagement.detail.builder.attachUnsupported": "केवल छवियाँ, पाठ और दस्तावेज़ फ़ाइलें ही संलग्न की जा सकती हैं।", + "skillManagement.detail.builder.attachmentOnlyMessage": "इस कौशल को बेहतर बनाने में सहायता के लिए संलग्न फ़ाइल का उपयोग करें।", + "skillManagement.detail.builder.close": "Skill Builder बंद करें", + "skillManagement.detail.builder.compatibleModelsOnly": "केवल संगत मॉडल दिखाए गए हैं", + "skillManagement.detail.builder.copyResponse": "प्रतिक्रिया कॉपी करें", + "skillManagement.detail.builder.copySuccess": "प्रतिक्रिया क्लिपबोर्ड पर कॉपी की गई.", + "skillManagement.detail.builder.editIntro": "मैंने इस कौशल की समीक्षा की है. आप क्या समायोजित करना चाहेंगे?", + "skillManagement.detail.builder.exampleIssueTriage": "ग्राहक समस्या ट्राइएज", + "skillManagement.detail.builder.exampleOnboarding": "नया किराया ऑनबोर्डिंग गाइड", + "skillManagement.detail.builder.exampleSalesFollowUp": "बिक्री नेतृत्व अनुवर्ती रणनीति", + "skillManagement.detail.builder.followUpDisplayName": "प्रदर्शन नाम के रूप में धनवापसी अनुमोदन का उपयोग करें", + "skillManagement.detail.builder.followUpNameIcon": "सुझाए गए नाम और आइकन को लागू करें", + "skillManagement.detail.builder.fromMarketplace": "Marketplace से", + "skillManagement.detail.builder.model": "GPT-4o", + "skillManagement.detail.builder.modelCredits.all": "सभी श्रेय", + "skillManagement.detail.builder.modelCredits.configure": "कॉन्फ़िगरेशन आवश्यक", + "skillManagement.detail.builder.modelCredits.exhausted": "कोटा समाप्त", + "skillManagement.detail.builder.modelProviderSettings": "मॉडल प्रदाता सेटिंग्स", + "skillManagement.detail.builder.modelSearch": "मॉडल खोजें...", + "skillManagement.detail.builder.modifyPlaceholder": "एआई से इस कौशल को संशोधित करने के लिए कहें...", + "skillManagement.detail.builder.open": "Skill Builder खोलें", + "skillManagement.detail.builder.placeholder": "परिदृश्य का वर्णन करें...", + "skillManagement.detail.builder.progress.applyingChanges": "फ़ाइल परिवर्तन लागू करना", + "skillManagement.detail.builder.progress.generatingPlan": "अद्यतन योजना तैयार की जा रही है", + "skillManagement.detail.builder.progress.readingDraft": "वर्तमान ड्राफ्ट पढ़ रहा हूँ", + "skillManagement.detail.builder.progress.updatingEditor": "संपादक को अद्यतन कर रहा है", + "skillManagement.detail.builder.promptDescription": "इसका वर्णन करें और संपादक में एक ड्राफ्ट दिखाई देगा, जिसमें चरण और फ़ाइलें शामिल होंगी।", + "skillManagement.detail.builder.promptTitle": "इस कौशल को क्या संभालना चाहिए?", + "skillManagement.detail.builder.readAloud": "प्रतिक्रिया ज़ोर से पढ़ें", + "skillManagement.detail.builder.removeAttachment": "{{name}} हटाएँ", + "skillManagement.detail.builder.restart": "बिल्डर को पुनरारंभ करें", + "skillManagement.detail.builder.retryResponse": "प्रतिक्रिया पुनः प्रयास करें", + "skillManagement.detail.builder.send": "मेसेज भेजें", + "skillManagement.detail.builder.sendFailed": "Skill Builder उत्तर देने में विफल रहा।", + "skillManagement.detail.builder.thinking": "सोच रहा है", + "skillManagement.detail.builder.thinkingUnavailable": "मॉडल द्वारा कोई विचारशील सामग्री वापस नहीं की गई।", + "skillManagement.detail.builder.title": "Skill Builder", + "skillManagement.detail.builder.tryExample": "एक उदाहरण आज़माएँ", + "skillManagement.detail.builder.voice": "वॉइस इनपुट", + "skillManagement.detail.builder.voiceUnavailable": "वॉयस इनपुट अभी उपलब्ध नहीं है.", + "skillManagement.detail.cancelAddMetadata": "मेटाडेटा जोड़ना रद्द करें", + "skillManagement.detail.closeFileTab": "बंद करें {{name}}", + "skillManagement.detail.closeVersions": "संस्करण बंद करें", "skillManagement.detail.collapseSidebar": "साइडबार समेटें", - "skillManagement.detail.createFile": "New file", - "skillManagement.detail.createFileDescription": "Enter a file path relative to the skill root.", - "skillManagement.detail.createFileMenu": "New file...", - "skillManagement.detail.createFileSuccess": "File created.", - "skillManagement.detail.createFolder": "New folder", - "skillManagement.detail.createFolderDescription": "Enter a folder path relative to the skill root.", - "skillManagement.detail.createFolderMenu": "New folder...", - "skillManagement.detail.createFolderSuccess": "Folder created.", - "skillManagement.detail.createdBy": "Created by {{name}}", - "skillManagement.detail.currentDraft": "Current draft", - "skillManagement.detail.deleteFileConfirm": "Delete this file?", - "skillManagement.detail.deleteFileSuccess": "File deleted.", - "skillManagement.detail.deleteVersionConfirm": "Delete this version?", - "skillManagement.detail.deleteVersionFailed": "Failed to delete version.", - "skillManagement.detail.deleteVersionSuccess": "Version deleted.", - "skillManagement.detail.downloadFile": "Download file", - "skillManagement.detail.draft": "Draft", + "skillManagement.detail.copyContentSuccess": "सामग्री क्लिपबोर्ड पर कॉपी की गई.", + "skillManagement.detail.copyFile": "प्रतिलिपि", + "skillManagement.detail.copyFileSuccess": "फ़ाइल चिपकाने के लिए तैयार है.", + "skillManagement.detail.copyVersionId": "आईडी कॉपी करें", + "skillManagement.detail.copyVersionIdSuccess": "आईडी को क्लिपबोर्ड पर कॉपी किया गया.", + "skillManagement.detail.createFile": "नई फ़ाइल", + "skillManagement.detail.createFileDescription": "कौशल रूट के सापेक्ष एक फ़ाइल पथ दर्ज करें।", + "skillManagement.detail.createFileMenu": "नई फ़ाइल...", + "skillManagement.detail.createFileSuccess": "फ़ाइल बनाई गई.", + "skillManagement.detail.createFolder": "नया फ़ोल्डर", + "skillManagement.detail.createFolderDescription": "कौशल रूट के सापेक्ष एक फ़ोल्डर पथ दर्ज करें।", + "skillManagement.detail.createFolderMenu": "नया फ़ोल्डर...", + "skillManagement.detail.createFolderSuccess": "फ़ोल्डर बनाया गया.", + "skillManagement.detail.createdBy": "{{name}} द्वारा बनाया गया", + "skillManagement.detail.currentDraft": "वर्तमान मसौदा", + "skillManagement.detail.cutFile": "काटना", + "skillManagement.detail.cutFileSuccess": "फ़ाइल स्थानांतरित करने के लिए तैयार है.", + "skillManagement.detail.deleteFileConfirm": "यह फ़ाइल हटाएं?", + "skillManagement.detail.deleteFileSuccess": "फ़ाइल हटा दी गई.", + "skillManagement.detail.deleteVersionConfirm": "यह संस्करण हटाएं?", + "skillManagement.detail.deleteVersionFailed": "संस्करण हटाने में विफल.", + "skillManagement.detail.deleteVersionSuccess": "संस्करण हटा दिया गया.", + "skillManagement.detail.downloadFile": "डाउनलोड फ़ाइल", + "skillManagement.detail.draft": "ड्राफ्ट", + "skillManagement.detail.editVersionInfo": "संस्करण की जानकारी संपादित करें", + "skillManagement.detail.exitVersions": "संस्करणों से बाहर निकलें", "skillManagement.detail.expandSidebar": "साइडबार फैलाएं", - "skillManagement.detail.fileCount": "{{count}} FILES", - "skillManagement.detail.fileMeta": "{{type}} · {{size}} bytes", - "skillManagement.detail.fileMissing": "File not found.", - "skillManagement.detail.fileOperationFailed": "File operation failed.", - "skillManagement.detail.files": "Files", - "skillManagement.detail.latest": "Latest", - "skillManagement.detail.loadFailed": "Failed to load skill.", - "skillManagement.detail.markdownLiveMode": "Live preview", - "skillManagement.detail.markdownSourceMode": "Source editor", - "skillManagement.detail.metadataKey": "name", - "skillManagement.detail.metadataValue": "value", - "skillManagement.detail.moveFileSuccess": "File moved.", - "skillManagement.detail.moveFilesSuccess": "Files moved.", - "skillManagement.detail.noFileSelected": "Select a file to preview.", - "skillManagement.detail.noFiles": "No files.", + "skillManagement.detail.fileAlreadyExists": "इस नाम की एक फ़ाइल या फ़ोल्डर पहले से मौजूद है.", + "skillManagement.detail.fileCount_one": "{{count}} फ़ाइल", + "skillManagement.detail.fileCount_other": "{{count}} फ़ाइलें", + "skillManagement.detail.fileMeta": "{{type}} · {{size}} बाइट्स", + "skillManagement.detail.fileMissing": "फ़ाइल प्राप्त नहीं हुई।", + "skillManagement.detail.fileOperationFailed": "फ़ाइल कार्रवाई विफल रही.", + "skillManagement.detail.files": "फ़ाइलें", + "skillManagement.detail.latest": "नवीनतम", + "skillManagement.detail.loadFailed": "कौशल लोड करने में विफल.", + "skillManagement.detail.loadingTags": "टैग लोड हो रहे हैं...", + "skillManagement.detail.markdownLiveMode": "लाइव पूर्वावलोकन", + "skillManagement.detail.markdownSourceMode": "स्रोत संपादक", + "skillManagement.detail.metadataKey": "नाम", + "skillManagement.detail.metadataValue": "कीमत", + "skillManagement.detail.moveFileSuccess": "फ़ाइल ले जाया गया.", + "skillManagement.detail.moveFilesSuccess": "फ़ाइलें स्थानांतरित हुईं.", + "skillManagement.detail.nameThisVersion": "इस संस्करण का नाम दें", + "skillManagement.detail.noFileSelected": "पूर्वावलोकन करने के लिए एक फ़ाइल का चयन करें.", + "skillManagement.detail.noFiles": "कोई फ़ाइल नहीं.", "skillManagement.detail.noSearchResults": "कोई मेल खाती फ़ाइल नहीं.", - "skillManagement.detail.noVersions": "No published versions yet.", - "skillManagement.detail.previewUnsupported": "Preview is not supported for this file.", - "skillManagement.detail.publish": "Publish", - "skillManagement.detail.publishFailed": "Failed to publish skill.", - "skillManagement.detail.publishSuccess": "Skill published.", - "skillManagement.detail.published": "Published", + "skillManagement.detail.noSelectableTags": "कोई टैग उपलब्ध नहीं.", + "skillManagement.detail.noVersions": "अभी तक कोई प्रकाशित संस्करण नहीं.", + "skillManagement.detail.pasteFile": "पेस्ट करें", + "skillManagement.detail.pasteFileSuccess": "फ़ाइल चिपकाई गई.", + "skillManagement.detail.previewUnsupported": "यह फ़ाइल पूर्वावलोकन का समर्थन नहीं करती।", + "skillManagement.detail.publish": "प्रकाशित करें", + "skillManagement.detail.publishFailed": "कौशल प्रकाशित करने में विफल.", + "skillManagement.detail.publishReferencesDescription_one": "इस कौशल का उपयोग करके {{count}} एजेंट के लिए प्रकाशन तुरंत प्रभावी होता है।", + "skillManagement.detail.publishReferencesDescription_other": "इस कौशल का उपयोग करने वाले {{count}} एजेंटों के लिए प्रकाशन तुरंत प्रभावी होता है।", + "skillManagement.detail.publishReferencesTitle": "कौशल प्रकाशित करें", + "skillManagement.detail.publishSuccess": "Skill प्रकाशित.", + "skillManagement.detail.publishUpdate": "अपडेट प्रकाशित करें", + "skillManagement.detail.published": "प्रकाशित", "skillManagement.detail.publishedAt": "{{time}} प्रकाशित", + "skillManagement.detail.publishedVersion": "#{{number}} प्रकाशित", "skillManagement.detail.publishing": "प्रकाशित हो रहा है...", - "skillManagement.detail.readonly": "Read only", - "skillManagement.detail.referenceFiles.confirm": "Enter Confirm", - "skillManagement.detail.referenceFiles.empty": "No files available.", - "skillManagement.detail.referenceFiles.livePlaceholder": "Write instructions for the agent, type / to reference files", - "skillManagement.detail.referenceFiles.navigate": "↑↓ Navigate", - "skillManagement.detail.referenceFiles.title": "Reference files", - "skillManagement.detail.referencedBy": "Referenced by {{count}} Apps", - "skillManagement.detail.removeMetadata": "Delete {{name}} metadata", - "skillManagement.detail.removeTag": "Remove {{tag}}", - "skillManagement.detail.removeTagSuccess": "Tag removed.", - "skillManagement.detail.renameFile": "Rename file", - "skillManagement.detail.renameFileDescription": "Enter the new path relative to the skill root.", - "skillManagement.detail.renameFileSuccess": "File renamed.", - "skillManagement.detail.renameSkillSuccess": "Skill renamed.", - "skillManagement.detail.renameVersion": "Rename", - "skillManagement.detail.renameVersionFailed": "Failed to rename version.", - "skillManagement.detail.renameVersionPrompt": "Version name", - "skillManagement.detail.renameVersionSuccess": "Version renamed.", - "skillManagement.detail.restoreVersion": "Restore", - "skillManagement.detail.restoreVersionFailed": "Failed to restore version.", - "skillManagement.detail.restoreVersionSuccess": "Version restored to draft.", - "skillManagement.detail.save": "Save", - "skillManagement.detail.saveFailed": "Failed to save file.", - "skillManagement.detail.saveSuccess": "File saved.", - "skillManagement.detail.saved": "Saved", - "skillManagement.detail.savedAt": "Saved {{time}}", - "skillManagement.detail.saving": "Saving...", + "skillManagement.detail.readonly": "केवल पढ़ने के लिए", + "skillManagement.detail.referenceFiles.confirm": "पुष्टि दर्ज करें", + "skillManagement.detail.referenceFiles.empty": "कोई फ़ाइल उपलब्ध नहीं.", + "skillManagement.detail.referenceFiles.livePlaceholder": "एजेंट के लिए निर्देश लिखें. फ़ाइलों को संदर्भित करने के लिए / टाइप करें।", + "skillManagement.detail.referenceFiles.navigate": "↑↓नेविगेट करें", + "skillManagement.detail.referenceFiles.title": "संदर्भ फ़ाइलें", + "skillManagement.detail.referencedBy_one": "{{count}} एजेंट द्वारा उपयोग किया जाता है", + "skillManagement.detail.referencedBy_other": "{{count}} एजेंटों द्वारा उपयोग किया जाता है", + "skillManagement.detail.removeMetadata": "{{name}} मेटाडेटा हटाएं", + "skillManagement.detail.removeTag": "{{tag}} हटाएं", + "skillManagement.detail.removeTagSuccess": "टैग हटा दिया गया.", + "skillManagement.detail.renameFile": "फ़ाइल का नाम बदलें", + "skillManagement.detail.renameFileDescription": "कौशल रूट के सापेक्ष नया पथ दर्ज करें।", + "skillManagement.detail.renameFileSuccess": "फ़ाइल का नाम बदला गया.", + "skillManagement.detail.renameSkillSuccess": "Skill का नाम बदला गया.", + "skillManagement.detail.renameVersion": "नाम बदलें", + "skillManagement.detail.renameVersionFailed": "संस्करण का नाम बदलने में विफल.", + "skillManagement.detail.renameVersionPrompt": "संस्करण का नाम", + "skillManagement.detail.renameVersionSuccess": "संस्करण का नाम बदला गया.", + "skillManagement.detail.resizeSidebar": "फ़ाइल साइडबार का आकार बदलें", + "skillManagement.detail.restoreVersion": "रीस्टोर करें", + "skillManagement.detail.restoreVersionConfirmDescription": "यह मौजूदा ड्राफ्ट को \"{{version}}\" की फाइलों से बदल देगा। यह Skill को प्रकाशित नहीं करेगा या कोई नया संस्करण नहीं बनाएगा।", + "skillManagement.detail.restoreVersionConfirmTitle": "इस संस्करण को पुनर्स्थापित करें?", + "skillManagement.detail.restoreVersionFailed": "संस्करण पुनर्स्थापित करने में विफल.", + "skillManagement.detail.restoreVersionSuccess": "संस्करण को ड्राफ्ट में पुनर्स्थापित किया गया।", + "skillManagement.detail.save": "सहेजें", + "skillManagement.detail.saveConflictConfirmDescription": "यह कौशल अन्यत्र अद्यतन किया गया था. संपादन जारी रखने के लिए नवीनतम ड्राफ्ट लोड करें। आपके वर्तमान परिवर्तन खारिज कर दिए जाएंगे.", + "skillManagement.detail.saveConflictConfirmTitle": "नवीनतम ड्राफ्ट लोड करें?", + "skillManagement.detail.saveConflictReload": "नवीनतम ड्राफ्ट लोड करें", + "skillManagement.detail.saveConflictStatus": "संघर्ष का पता चला. संपादन जारी रखने के लिए नवीनतम ड्राफ्ट लोड करें।", + "skillManagement.detail.saveFailed": "फ़ाइल सहेजने में विफल.", + "skillManagement.detail.saveSuccess": "फ़ाइल सहेजी गई.", + "skillManagement.detail.saved": "सहेजा गया", + "skillManagement.detail.savedAt": "{{time}} सहेजा गया", + "skillManagement.detail.saving": "सेव हो रहा है...", "skillManagement.detail.searchFiles": "फ़ाइलें खोजें", + "skillManagement.detail.showMoreReferences": "{{count}} और अधिक दिखाएँ", + "skillManagement.detail.skillDescriptionPlaceholder": "वर्णन करें कि यह कौशल क्या करता है और एजेंटों को इसका उपयोग कब करना चाहिए।", + "skillManagement.detail.skillNamePlaceholder": "छोटे अक्षरों, संख्याओं और हाइफ़न का उपयोग करें।", "skillManagement.detail.unpublishedChanges": "अप्रकाशित बदलाव", - "skillManagement.detail.unsavedChanges": "Unsaved changes", + "skillManagement.detail.unsavedChanges": "सहेजे न गए परिवर्तन", "skillManagement.detail.upToDate": "अप टू डेट", - "skillManagement.detail.updateTagsFailed": "Failed to update tags.", - "skillManagement.detail.uploadFile": "Upload file", - "skillManagement.detail.uploadFileFailed": "File upload failed.", - "skillManagement.detail.uploadFileSuccess": "File uploaded.", - "skillManagement.detail.uploadFilesMenu": "Upload files...", + "skillManagement.detail.updateTagsFailed": "टैग अपडेट करने में विफल.", + "skillManagement.detail.uploadCheckFailed": "इन फ़ाइलों की जाँच नहीं की जा सकी. पुनः प्रयास करें।", + "skillManagement.detail.uploadConflict": "इस नाम की एक फ़ाइल पहले से मौजूद है.", + "skillManagement.detail.uploadFailureSummary": "{{total}} में से {{failed}} फ़ाइलें विफल रहीं", + "skillManagement.detail.uploadFailureTitle": "कुछ अपलोड विफल रहे", + "skillManagement.detail.uploadFile": "फ़ाइल अपलोड करें", + "skillManagement.detail.uploadFileFailed": "फ़ाइल अपलोड विफल रहा.", + "skillManagement.detail.uploadFileSuccess": "फ़ाइल अपलोड हो गई।", + "skillManagement.detail.uploadFilesButton": "{{count}} फ़ाइलें अपलोड करें", + "skillManagement.detail.uploadFilesFailedStatus_one": "{{count}} फ़ाइल अपलोड विफल रहा.", + "skillManagement.detail.uploadFilesFailedStatus_other": "{{count}} फ़ाइल अपलोड विफल रहा.", + "skillManagement.detail.uploadFilesMenu": "फाइलें अपलोड करें...", + "skillManagement.detail.uploadFilesProgress": "{{completed}}/{{total}} अपलोड हो रहा है", + "skillManagement.detail.uploadFilesResult": "{{uploaded}} अपलोड किया गया · {{failed}} विफल रहा", + "skillManagement.detail.uploadFilesStatus": "अपलोड स्थिति", + "skillManagement.detail.uploadInvalidExtension": "यह फ़ाइल प्रकार समर्थित नहीं है.", + "skillManagement.detail.uploadInvalidName": "अमान्य नाम।", + "skillManagement.detail.uploadInvalidPath": "अमान्य फ़ाइल पथ.", + "skillManagement.detail.uploadKeepBoth": "दोनो रख लो", + "skillManagement.detail.uploadLateConflict": "जब आप अपलोड कर रहे थे तो किसी ने यह फ़ाइल जोड़ दी।", + "skillManagement.detail.uploadMissingExtension": "एक फ़ाइल एक्सटेंशन आवश्यक है.", + "skillManagement.detail.uploadNetworkFailure": "अपलोड विफल रहा. अपना कनेक्शन जांचें.", + "skillManagement.detail.uploadReadySummary": "{{ready}} तैयार · {{decisions}} को निर्णय की आवश्यकता है · {{skipped}} को छोड़ दिया जाएगा", + "skillManagement.detail.uploadReplace": "प्रतिस्थापित करें", + "skillManagement.detail.uploadResolvedSummary": "{{ready}} तैयार · {{skipped}} को छोड़ दिया जाएगा", + "skillManagement.detail.uploadRetryCount": "{{count}} पुनः प्रयास करें", + "skillManagement.detail.uploadReviewTitle": "अपलोड करने से पहले समीक्षा करें", + "skillManagement.detail.uploadSkip": "जहाज़", + "skillManagement.detail.uploadSkippedGroup": "{{count}} फ़ाइलें अपलोड नहीं की जा सकतीं और छोड़ दी जाएंगी", + "skillManagement.detail.uploadStatusDismiss": "अपलोड स्थिति ख़ारिज करें", + "skillManagement.detail.uploadSuggestion": "सुझाव का प्रयोग करें", + "skillManagement.detail.uploadWillReplace": "मौजूदा फ़ाइल को बदल देगा", + "skillManagement.detail.uploadWillUseName": "{{name}} के रूप में अपलोड किया जाएगा", + "skillManagement.detail.versionHistory": "संस्करण इतिहास खोलें", "skillManagement.detail.versionMeta": "{{hash}} · {{time}}", - "skillManagement.detail.versions": "Versions", - "skillManagement.draft": "Draft", - "skillManagement.duplicateFailed": "Failed to duplicate skill.", - "skillManagement.duplicateSuccess": "Skill duplicated.", - "skillManagement.editedAt": "Edited {{time}}", - "skillManagement.empty": "No skills yet", - "skillManagement.emptySearch": "No skills found", - "skillManagement.import": "Import", - "skillManagement.importFailed": "Failed to import skill.", - "skillManagement.importSuccess": "Skill imported.", - "skillManagement.listLabel": "Workspace skills", - "skillManagement.loadingError": "Failed to load skills", - "skillManagement.moreActions": "More actions for {{name}}", - "skillManagement.noTags": "No tags", - "skillManagement.publishedAt": "Published {{time}}", - "skillManagement.referenceCount": "{{count}} Refs", - "skillManagement.searchLabel": "Search skills", - "skillManagement.searchPlaceholder": "Search", - "skillManagement.tags": "Tags", - "skillManagement.title": "Skills" + "skillManagement.detail.versionPublishNote": "रिलीज नोट्स", + "skillManagement.detail.versionPublishNotePlaceholder": "इस परिवर्तन का वर्णन करें", + "skillManagement.detail.versionPublishedMeta": "{{time}} · {{name}}", + "skillManagement.detail.versionTitle": "शीर्षक", + "skillManagement.detail.versions": "संस्करण", + "skillManagement.detail.viewOnly": "केवल देखें", + "skillManagement.detail.viewUploadErrors": "त्रुटियाँ देखें", + "skillManagement.draft": "ड्राफ्ट", + "skillManagement.duplicateFailed": "कौशल की नकल करने में विफल.", + "skillManagement.duplicateSuccess": "Skill डुप्लिकेट किया गया.", + "skillManagement.editedAt": "{{time}} को संपादित किया गया", + "skillManagement.empty": "अभी तक कोई कौशल नहीं", + "skillManagement.emptyAction.createDescription": "किसी परिदृश्य का स्पष्ट शब्दों में वर्णन करें और समीक्षा करने के लिए मसौदा कौशल प्राप्त करें।", + "skillManagement.emptyAction.createTitle": "Skill Builder के साथ बनाएं", + "skillManagement.emptyAction.importDescription": "Agentkills.io प्रारूप में SKILL.md के साथ एक .zip लाएँ।", + "skillManagement.emptyAction.importTitle": "एक कौशल पैकेज आयात करें", + "skillManagement.emptySearch": "कोई कौशल नहीं मिला", + "skillManagement.errors.missingSkillMd": "इस पैकेज में कोई SKILL.md नहीं है। फ़ाइल जोड़ें और इसे फिर से आयात करें।", + "skillManagement.errors.nameConflict": "\"{{name}}\" नामक कौशल पहले से मौजूद है। इसे SKILL.md में नाम बदलें और फिर से आयात करें।", + "skillManagement.errors.workspaceLimit": "आपका कार्यक्षेत्र 500 कौशल की सीमा तक पहुंच गया है। नया जोड़ने के लिए एक कौशल हटाएँ।", + "skillManagement.import": "आयात करें", + "skillManagement.importFailed": "कौशल आयात करने में विफल.", + "skillManagement.importSuccess": "Skill आयातित.", + "skillManagement.listLabel": "कार्यस्थल कौशल", + "skillManagement.loadingError": "कौशल लोड करने में विफल", + "skillManagement.moreActions": "{{name}} के लिए और क्रियाएँ", + "skillManagement.noDescription": "अभी तक कोई विवरण नहीं", + "skillManagement.noTags": "कोई टैग नहीं", + "skillManagement.publishedAt": "{{time}} प्रकाशित", + "skillManagement.referenceCount_one": "{{count}} एजेंट", + "skillManagement.referenceCount_other": "{{count}} एजेंट", + "skillManagement.searchLabel": "कौशल खोजें", + "skillManagement.searchPlaceholder": "नाम या विवरण से खोजें", + "skillManagement.tags": "टैग्स", + "skillManagement.title": "कौशल" } diff --git a/web/i18n/id-ID/agent-v-2.json b/web/i18n/id-ID/agent-v-2.json index 48005377bde..2016104bc58 100644 --- a/web/i18n/id-ID/agent-v-2.json +++ b/web/i18n/id-ID/agent-v-2.json @@ -83,7 +83,7 @@ "agentDetail.configure.buildDraft.changesToApply_other": "{{count}} perubahan untuk diterapkan", "agentDetail.configure.buildDraft.discard": "Buang", "agentDetail.configure.buildDraft.modeBadge": "Mode build", - "agentDetail.configure.buildDraft.modeDescription": "Anda berada dalam mode build. Configure hanya dapat diperbarui oleh agen dalam mode ini. Bentuk pengaturan ini lewat chat di kanan, lalu terapkan.", + "agentDetail.configure.buildDraft.modeDescription": "Anda berada dalam mode build. Bentuk pengaturan ini dengan mengobrol bersama agen, lalu pilih Terapkan.", "agentDetail.configure.buildDraft.rewritten": "Ditulis ulang", "agentDetail.configure.buildDraft.title": "Draf build", "agentDetail.configure.buildDraft.updated": "Diperbarui", @@ -105,7 +105,8 @@ "agentDetail.configure.files.preview.failed": "Gagal memuat pratinjau.", "agentDetail.configure.files.preview.unsupported": "File ini tidak mendukung pratinjau.", "agentDetail.configure.files.remove": "Hapus {{name}}", - "agentDetail.configure.files.tip": "Untuk materi referensi yang terlalu panjang untuk ditempel ke Prompt: spesifikasi, templat, panduan. Referensikan dengan / di Prompt.\n\nDalam mode Build, agen dapat menyiapkannya untuk Anda.", + "agentDetail.configure.files.richTip": "Untuk materi referensi yang terlalu panjang untuk ditempel ke Prompt: spesifikasi, templat, panduan. Pelajari selengkapnya\n\nDalam mode Build, agen dapat menyiapkannya untuk Anda.", + "agentDetail.configure.files.tip": "Untuk materi referensi yang terlalu panjang untuk ditempel ke Prompt: spesifikasi, templat, panduan. Pelajari selengkapnya\n\nDalam mode Build, agen dapat menyiapkannya untuk Anda.", "agentDetail.configure.files.toggle": "Alihkan file", "agentDetail.configure.files.treeLabel": "File agen", "agentDetail.configure.files.upload.action": "Unggah", @@ -114,7 +115,7 @@ "agentDetail.configure.files.upload.dropzone": "Letakkan file di sini, atau", "agentDetail.configure.files.upload.failed": "Gagal mengunggah file.", "agentDetail.configure.files.upload.fileType": "FILE", - "agentDetail.configure.files.upload.invalidFile": "Unggah satu file.", + "agentDetail.configure.files.upload.invalidFile": "Hanya satu file yang dapat diunggah dalam satu waktu.", "agentDetail.configure.files.upload.success": "File diunggah.", "agentDetail.configure.files.upload.title": "Unggah file", "agentDetail.configure.knowledgeRetrieval.add": "Tambahkan pengambilan pengetahuan", @@ -177,7 +178,8 @@ "agentDetail.configure.prompt.mention.priyaRamanathan": "Priya Ramanathan", "agentDetail.configure.prompt.placeholder": "Tulis instruksi di sini,", "agentDetail.configure.prompt.referenceMissing": "{{name}} tidak ada", - "agentDetail.configure.prompt.tip": "Tentukan peran agen dan jelaskan tugas umumnya. Gunakan / untuk membuat referensi eksplisit ke Skills, Files, Tools, dan Knowledge Retrievals.", + "agentDetail.configure.prompt.richTip": "Tentukan peran agen dan cara kerjanya. Pelajari selengkapnya", + "agentDetail.configure.prompt.tip": "Tentukan peran agen dan cara kerjanya. Pelajari selengkapnya", "agentDetail.configure.publishBar.draft": "Draf", "agentDetail.configure.publishBar.publishUpdate": "Terbitkan pembaruan", "agentDetail.configure.publishBar.published": "Diterbitkan", @@ -190,8 +192,8 @@ "agentDetail.configure.publishBar.versionHistory": "Buka riwayat versi", "agentDetail.configure.publishImpact.affectedWorkflows": "Alur Kerja yang Terpengaruh", "agentDetail.configure.publishImpact.cancel": "Batal", - "agentDetail.configure.publishImpact.descriptionPrefix": "Agen Anda muncul di", - "agentDetail.configure.publishImpact.descriptionSuffix": ". Perubahan akan memengaruhi mereka.", + "agentDetail.configure.publishImpact.descriptionPrefix": "Agen ini digunakan dalam", + "agentDetail.configure.publishImpact.descriptionSuffix": ". Saat dipublikasikan, agen ini akan diperbarui di semuanya.", "agentDetail.configure.publishImpact.fallbackAgentName": "agen ini", "agentDetail.configure.publishImpact.title": "{{action}} ke {{name}}", "agentDetail.configure.publishImpact.workflowCount_one": "{{count}} alur kerja", @@ -222,8 +224,8 @@ "agentDetail.configure.skills.openInLibrary": "Open in Skill library", "agentDetail.configure.skills.remove": "Hapus {{name}}", "agentDetail.configure.skills.removeAction": "Remove", - "agentDetail.configure.skills.richTip": "Kemas instruksi, file, dan skrip untuk tugas berulang menjadi skill. Referensikan dengan / di Prompt. Pelajari selengkapnya\n\nDalam mode Build, agen dapat menyiapkannya untuk Anda.", - "agentDetail.configure.skills.tip": "Kemas instruksi, file, dan skrip untuk tugas berulang menjadi skill. Referensikan dengan / di Prompt. Pelajari selengkapnya\n\nDalam mode Build, agen dapat menyiapkannya untuk Anda.", + "agentDetail.configure.skills.richTip": "Kemas instruksi, file, dan skrip untuk tugas berulang menjadi skill. Pelajari selengkapnya\n\nDalam mode Build, agen dapat menyiapkannya untuk Anda.", + "agentDetail.configure.skills.tip": "Kemas instruksi, file, dan skrip untuk tugas berulang menjadi skill. Pelajari selengkapnya\n\nDalam mode Build, agen dapat menyiapkannya untuk Anda.", "agentDetail.configure.skills.toggle": "Alihkan keterampilan", "agentDetail.configure.skills.upload.action": "Unggah", "agentDetail.configure.skills.upload.browse": "telusuri", @@ -269,8 +271,8 @@ "agentDetail.configure.tools.moreActions": "Tindakan lainnya untuk {{name}}", "agentDetail.configure.tools.removeAction": "Hapus {{name}}", "agentDetail.configure.tools.removeProvider": "Hapus semua alat", - "agentDetail.configure.tools.richTip": "Tambahkan Dify tools dari workspace Anda. Referensikan dengan / di Prompt. Pelajari selengkapnya\n\nTools yang diinstal agen di sandbox-nya tidak akan muncul di sini, tetapi tetap tersedia baginya.", - "agentDetail.configure.tools.tip": "Tambahkan Dify tools dari workspace Anda. Referensikan dengan / di Prompt. Pelajari selengkapnya\n\nTools yang diinstal agen di sandbox-nya tidak akan muncul di sini, tetapi tetap tersedia baginya.", + "agentDetail.configure.tools.richTip": "Tambahkan Dify tools dari workspace Anda. Pelajari selengkapnya\n\nTools yang diinstal agen di sandbox-nya tidak akan muncul di sini, tetapi tetap tersedia baginya.", + "agentDetail.configure.tools.tip": "Tambahkan Dify tools dari workspace Anda. Pelajari selengkapnya\n\nTools yang diinstal agen di sandbox-nya tidak akan muncul di sini, tetapi tetap tersedia baginya.", "agentDetail.configure.tools.toggle": "Alihkan alat", "agentDetail.configure.tools.toolTabs.all": "Semua", "agentDetail.configure.tools.toolTabs.cli": "CLI", @@ -336,22 +338,22 @@ "agentDetail.metadata.sourceLabel": "Sumber", "agentDetail.monitoring.change": "{{value}} dari periode sebelumnya", "agentDetail.monitoring.dateRangeLabel": "Rentang tanggal", - "agentDetail.monitoring.description": "Lacak aktivitas, biaya, dan kualitas interaksi agen yang dapat digunakan kembali di seluruh alur kerja.", + "agentDetail.monitoring.description": "Lacak aktivitas, biaya, dan kualitas interaksi agen ini di semua titik akses.", "agentDetail.monitoring.learnMore": "Pelajari lebih lanjut", "agentDetail.monitoring.loadFailed": "Gagal memuat data pemantauan", - "agentDetail.monitoring.metrics.activeUsers.explanation": "Pengguna akhir unik yang memicu alur kerja menggunakan agen ini.", + "agentDetail.monitoring.metrics.activeUsers.explanation": "Jumlah pengguna akhir unik yang berinteraksi dengan agen ini.", "agentDetail.monitoring.metrics.activeUsers.title": "Pengguna Aktif", - "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Hitungan komunikasi pengguna-agen yang berkelanjutan untuk titik akses ini.", + "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Rata-rata jumlah pesan pengguna per percakapan.", "agentDetail.monitoring.metrics.avgSessionInteractions.title": "Rata-rata Interaksi Sesi", - "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Kecepatan output rata-rata dari awal permintaan hingga selesai.", + "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Rata-rata token yang dihasilkan per detik saat agen memberikan respons.", "agentDetail.monitoring.metrics.tokenOutputSpeed.title": "Kecepatan Output Token", - "agentDetail.monitoring.metrics.tokenUsage.explanation": "Perkiraan biaya token yang dihasilkan oleh agen ini di seluruh eksekusi alur kerja.", + "agentDetail.monitoring.metrics.tokenUsage.explanation": "Token yang digunakan dan perkiraan biayanya.", "agentDetail.monitoring.metrics.tokenUsage.title": "Penggunaan Token", "agentDetail.monitoring.metrics.totalConversations.explanation": "Percakapan AI harian yang mencapai agen ini melalui titik akses yang dipilih.", "agentDetail.monitoring.metrics.totalConversations.title": "Total Percakapan", - "agentDetail.monitoring.metrics.totalMessages.explanation": "Hitungan interaksi agen harian.", + "agentDetail.monitoring.metrics.totalMessages.explanation": "Total pesan pengguna yang dikirim ke agen ini.", "agentDetail.monitoring.metrics.totalMessages.title": "Total Pesan", - "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "Jumlah suka per 1.000 pesan untuk agen ini.", + "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "Persentase respons agen yang diberi tanda suka oleh pengguna.", "agentDetail.monitoring.metrics.userSatisfactionRate.title": "Tingkat Kepuasan Pengguna", "agentDetail.monitoring.pickSource": "Pilih aplikasi", "agentDetail.monitoring.sourceLabel": "Aplikasi", @@ -549,7 +551,5 @@ "skillManagement.searchLabel": "Search skills", "skillManagement.searchPlaceholder": "Search", "skillManagement.tags": "Tags", - "skillManagement.title": "Skills", - "agentDetail.configure.files.richTip": "Untuk materi referensi yang terlalu panjang untuk ditempel ke Prompt: spesifikasi, templat, panduan. Pelajari selengkapnya\n\nDalam mode Build, agen dapat menyiapkannya untuk Anda.", - "agentDetail.configure.prompt.richTip": "Tentukan peran agen dan cara kerjanya. Pelajari selengkapnya" + "skillManagement.title": "Skills" } diff --git a/web/i18n/id-ID/skill.json b/web/i18n/id-ID/skill.json index 375d123c3a5..ed37dacd430 100644 --- a/web/i18n/id-ID/skill.json +++ b/web/i18n/id-ID/skill.json @@ -1,121 +1,245 @@ { - "skillManagement.clearTags": "Clear tags", - "skillManagement.create": "Create", - "skillManagement.createFailed": "Failed to create skill.", - "skillManagement.createSuccess": "Skill created.", + "skillManagement.clearTags": "Hapus tag", + "skillManagement.create": "Buat", + "skillManagement.createFailed": "Gagal membuat keterampilan.", + "skillManagement.createSuccess": "Draf dibuat.", "skillManagement.dateTimeFormat": "MMM D, YYYY HH:mm", "skillManagement.deleteDialog.confirmInputLabel": "Untuk mengonfirmasi, ketik {{skillName}} di kolom berikut:", "skillManagement.deleteDialog.confirmInputPlaceholder": "Masukkan nama tampilan Skill…", - "skillManagement.deleteDialog.description": "This skill will be removed from the workspace. Agents that reference it may lose access to this capability.", - "skillManagement.deleteDialog.title": "Delete {{name}}?", - "skillManagement.deleteFailed": "Failed to delete skill.", - "skillManagement.deleteSuccess": "Skill deleted.", - "skillManagement.detail.addMetadata": "Add metadata", - "skillManagement.detail.addMetadataDescription": "Add a frontmatter field to this Markdown file.", - "skillManagement.detail.addTag": "Add tag", - "skillManagement.detail.addTagDescription": "Create or bind a tag to this Skill. New tags are saved with the Skill metadata.", - "skillManagement.detail.addTagSuccess": "Tag added.", - "skillManagement.detail.back": "Back to Skills", - "skillManagement.detail.cancelAddMetadata": "Cancel adding metadata", - "skillManagement.detail.closeFileTab": "Close {{name}}", + "skillManagement.deleteDialog.description": "Menghapus keterampilan tidak dapat diubah. Konten dan riwayat versi lengkapnya akan dihapus secara permanen. Tidak ada agen yang saat ini menggunakannya.", + "skillManagement.deleteDialog.referencedDescription_one": "Agen {{count}} menggunakan keterampilan ini, baik secara mandiri atau dalam alur kerja. Menghapus keterampilan ini akan menghapus konten dan riwayat versinya secara permanen, serta menghapusnya dari agen yang terpengaruh.", + "skillManagement.deleteDialog.referencedDescription_other": "Agen {{count}} menggunakan keterampilan ini, baik secara mandiri atau dalam alur kerja. Menghapus keterampilan ini akan menghapus konten dan riwayat versinya secara permanen, serta menghapusnya dari semua agen yang terpengaruh.", + "skillManagement.deleteDialog.title": "Hapus {{name}}?", + "skillManagement.deleteFailed": "Gagal menghapus keterampilan.", + "skillManagement.deleteSuccess": "Skill dihapus.", + "skillManagement.detail.addMetadata": "Tambahkan metadata", + "skillManagement.detail.addMetadataDescription": "Tambahkan bidang frontmatter ke file penurunan harga ini.", + "skillManagement.detail.addTag": "Tambahkan tanda", + "skillManagement.detail.addTagDescription": "Buat atau ikat tag ke Skill ini. Tag baru disimpan dengan metadata Skill.", + "skillManagement.detail.addTagSuccess": "Tag ditambahkan.", + "skillManagement.detail.back": "Kembali ke Skills", + "skillManagement.detail.builder.applyFailed": "Gagal menerapkan pembaruan draf.", + "skillManagement.detail.builder.attach": "Lampirkan berkas", + "skillManagement.detail.builder.attachFailed": "Gagal melampirkan file.", + "skillManagement.detail.builder.attachLimit": "Anda dapat melampirkan hingga 10 file.", + "skillManagement.detail.builder.attachTooLarge": "File harus berukuran 15 MB atau lebih kecil. Gambar harus berukuran 10 MB atau lebih kecil.", + "skillManagement.detail.builder.attachUnsupported": "Hanya file gambar, teks, dan dokumen yang dapat dilampirkan.", + "skillManagement.detail.builder.attachmentOnlyMessage": "Gunakan file terlampir untuk membantu meningkatkan keterampilan ini.", + "skillManagement.detail.builder.close": "Tutup Skill Builder", + "skillManagement.detail.builder.compatibleModelsOnly": "Hanya model yang kompatibel yang ditampilkan", + "skillManagement.detail.builder.copyResponse": "Salin respons", + "skillManagement.detail.builder.copySuccess": "Respons disalin ke papan klip.", + "skillManagement.detail.builder.editIntro": "Saya telah meninjau keterampilan ini. Apa yang ingin Anda sesuaikan?", + "skillManagement.detail.builder.exampleIssueTriage": "Triase masalah pelanggan", + "skillManagement.detail.builder.exampleOnboarding": "Panduan orientasi karyawan baru", + "skillManagement.detail.builder.exampleSalesFollowUp": "Strategi tindak lanjut prospek penjualan", + "skillManagement.detail.builder.followUpDisplayName": "Gunakan Persetujuan Pengembalian Dana sebagai nama tampilan", + "skillManagement.detail.builder.followUpNameIcon": "Terapkan nama dan ikon yang disarankan", + "skillManagement.detail.builder.fromMarketplace": "Dari Marketplace", + "skillManagement.detail.builder.model": "GPT-4o", + "skillManagement.detail.builder.modelCredits.all": "Semua kredit", + "skillManagement.detail.builder.modelCredits.configure": "Konfigurasi diperlukan", + "skillManagement.detail.builder.modelCredits.exhausted": "Kuota habis", + "skillManagement.detail.builder.modelProviderSettings": "Pengaturan Penyedia Model", + "skillManagement.detail.builder.modelSearch": "Cari model...", + "skillManagement.detail.builder.modifyPlaceholder": "Minta AI untuk memodifikasi keterampilan ini...", + "skillManagement.detail.builder.open": "Buka Skill Builder", + "skillManagement.detail.builder.placeholder": "Jelaskan skenarionya...", + "skillManagement.detail.builder.progress.applyingChanges": "Menerapkan perubahan file", + "skillManagement.detail.builder.progress.generatingPlan": "Menghasilkan rencana pembaruan", + "skillManagement.detail.builder.progress.readingDraft": "Membaca draf saat ini", + "skillManagement.detail.builder.progress.updatingEditor": "Memperbarui editor", + "skillManagement.detail.builder.promptDescription": "Jelaskan dan drafnya muncul di editor, disertai langkah-langkah dan file.", + "skillManagement.detail.builder.promptTitle": "Apa yang harus ditangani oleh keterampilan ini?", + "skillManagement.detail.builder.readAloud": "Baca tanggapan dengan keras", + "skillManagement.detail.builder.removeAttachment": "Hapus {{name}}", + "skillManagement.detail.builder.restart": "Mulai ulang pembuat", + "skillManagement.detail.builder.retryResponse": "Coba lagi respons", + "skillManagement.detail.builder.send": "Kirim pesan", + "skillManagement.detail.builder.sendFailed": "Skill Builder gagal merespons.", + "skillManagement.detail.builder.thinking": "Sedang berpikir", + "skillManagement.detail.builder.thinkingUnavailable": "Tidak ada konten pemikiran yang dikembalikan oleh model.", + "skillManagement.detail.builder.title": "Skill Builder", + "skillManagement.detail.builder.tryExample": "Coba sebuah contoh", + "skillManagement.detail.builder.voice": "Input suara", + "skillManagement.detail.builder.voiceUnavailable": "Masukan suara belum tersedia.", + "skillManagement.detail.cancelAddMetadata": "Batalkan penambahan metadata", + "skillManagement.detail.closeFileTab": "Tutup {{name}}", + "skillManagement.detail.closeVersions": "Tutup versi", "skillManagement.detail.collapseSidebar": "Ciutkan sidebar", - "skillManagement.detail.createFile": "New file", - "skillManagement.detail.createFileDescription": "Enter a file path relative to the skill root.", - "skillManagement.detail.createFileMenu": "New file...", - "skillManagement.detail.createFileSuccess": "File created.", - "skillManagement.detail.createFolder": "New folder", - "skillManagement.detail.createFolderDescription": "Enter a folder path relative to the skill root.", - "skillManagement.detail.createFolderMenu": "New folder...", - "skillManagement.detail.createFolderSuccess": "Folder created.", - "skillManagement.detail.createdBy": "Created by {{name}}", - "skillManagement.detail.currentDraft": "Current draft", - "skillManagement.detail.deleteFileConfirm": "Delete this file?", - "skillManagement.detail.deleteFileSuccess": "File deleted.", - "skillManagement.detail.deleteVersionConfirm": "Delete this version?", - "skillManagement.detail.deleteVersionFailed": "Failed to delete version.", - "skillManagement.detail.deleteVersionSuccess": "Version deleted.", - "skillManagement.detail.downloadFile": "Download file", - "skillManagement.detail.draft": "Draft", + "skillManagement.detail.copyContentSuccess": "Konten disalin ke papan klip.", + "skillManagement.detail.copyFile": "Salin", + "skillManagement.detail.copyFileSuccess": "File siap ditempel.", + "skillManagement.detail.copyVersionId": "Salin ID", + "skillManagement.detail.copyVersionIdSuccess": "ID disalin ke papan klip.", + "skillManagement.detail.createFile": "Berkas baru", + "skillManagement.detail.createFileDescription": "Masukkan jalur file yang berhubungan dengan akar keterampilan.", + "skillManagement.detail.createFileMenu": "Berkas baru...", + "skillManagement.detail.createFileSuccess": "File dibuat.", + "skillManagement.detail.createFolder": "Folder baru", + "skillManagement.detail.createFolderDescription": "Masukkan jalur folder yang berhubungan dengan akar keterampilan.", + "skillManagement.detail.createFolderMenu": "Folder baru...", + "skillManagement.detail.createFolderSuccess": "Folder dibuat.", + "skillManagement.detail.createdBy": "Dibuat oleh {{name}}", + "skillManagement.detail.currentDraft": "Draf saat ini", + "skillManagement.detail.cutFile": "Memotong", + "skillManagement.detail.cutFileSuccess": "File siap dipindahkan.", + "skillManagement.detail.deleteFileConfirm": "Hapus berkas ini?", + "skillManagement.detail.deleteFileSuccess": "Berkas dihapus.", + "skillManagement.detail.deleteVersionConfirm": "Hapus versi ini?", + "skillManagement.detail.deleteVersionFailed": "Gagal menghapus versi.", + "skillManagement.detail.deleteVersionSuccess": "Versi dihapus.", + "skillManagement.detail.downloadFile": "Unduh berkas", + "skillManagement.detail.draft": "Draf", + "skillManagement.detail.editVersionInfo": "Mengedit info versi", + "skillManagement.detail.exitVersions": "Keluar versi", "skillManagement.detail.expandSidebar": "Perluas sidebar", - "skillManagement.detail.fileCount": "{{count}} FILES", - "skillManagement.detail.fileMeta": "{{type}} · {{size}} bytes", - "skillManagement.detail.fileMissing": "File not found.", - "skillManagement.detail.fileOperationFailed": "File operation failed.", - "skillManagement.detail.files": "Files", - "skillManagement.detail.latest": "Latest", - "skillManagement.detail.loadFailed": "Failed to load skill.", - "skillManagement.detail.markdownLiveMode": "Live preview", - "skillManagement.detail.markdownSourceMode": "Source editor", - "skillManagement.detail.metadataKey": "name", - "skillManagement.detail.metadataValue": "value", - "skillManagement.detail.moveFileSuccess": "File moved.", - "skillManagement.detail.moveFilesSuccess": "Files moved.", - "skillManagement.detail.noFileSelected": "Select a file to preview.", - "skillManagement.detail.noFiles": "No files.", + "skillManagement.detail.fileAlreadyExists": "File atau folder dengan nama ini sudah ada.", + "skillManagement.detail.fileCount_one": "berkas {{count}}", + "skillManagement.detail.fileCount_other": "file {{count}}", + "skillManagement.detail.fileMeta": "{{type}} · {{size}} byte", + "skillManagement.detail.fileMissing": "Berkas tidak ditemukan.", + "skillManagement.detail.fileOperationFailed": "Operasi berkas gagal.", + "skillManagement.detail.files": "File", + "skillManagement.detail.latest": "Terbaru", + "skillManagement.detail.loadFailed": "Gagal memuat keterampilan.", + "skillManagement.detail.loadingTags": "Memuat tag...", + "skillManagement.detail.markdownLiveMode": "Pratinjau langsung", + "skillManagement.detail.markdownSourceMode": "Penyunting sumber", + "skillManagement.detail.metadataKey": "nama", + "skillManagement.detail.metadataValue": "nilai", + "skillManagement.detail.moveFileSuccess": "File dipindahkan.", + "skillManagement.detail.moveFilesSuccess": "File dipindahkan.", + "skillManagement.detail.nameThisVersion": "Beri nama versi ini", + "skillManagement.detail.noFileSelected": "Pilih file untuk dipratinjau.", + "skillManagement.detail.noFiles": "Tidak ada file.", "skillManagement.detail.noSearchResults": "Tidak ada file yang cocok.", - "skillManagement.detail.noVersions": "No published versions yet.", - "skillManagement.detail.previewUnsupported": "Preview is not supported for this file.", - "skillManagement.detail.publish": "Publish", - "skillManagement.detail.publishFailed": "Failed to publish skill.", - "skillManagement.detail.publishSuccess": "Skill published.", - "skillManagement.detail.published": "Published", + "skillManagement.detail.noSelectableTags": "Tidak ada tag yang tersedia.", + "skillManagement.detail.noVersions": "Belum ada versi yang dipublikasikan.", + "skillManagement.detail.pasteFile": "Pasta", + "skillManagement.detail.pasteFileSuccess": "File ditempel.", + "skillManagement.detail.previewUnsupported": "File ini tidak mendukung pratinjau.", + "skillManagement.detail.publish": "Terbitkan", + "skillManagement.detail.publishFailed": "Gagal memublikasikan keahlian.", + "skillManagement.detail.publishReferencesDescription_one": "Penerbitan akan langsung berlaku untuk agen {{count}} yang menggunakan skill ini.", + "skillManagement.detail.publishReferencesDescription_other": "Penerbitan akan segera berlaku untuk agen {{count}} yang menggunakan keterampilan ini.", + "skillManagement.detail.publishReferencesTitle": "Keterampilan publikasi", + "skillManagement.detail.publishSuccess": "Skill diterbitkan.", + "skillManagement.detail.publishUpdate": "Terbitkan pembaruan", + "skillManagement.detail.published": "Diterbitkan", "skillManagement.detail.publishedAt": "Diterbitkan {{time}}", + "skillManagement.detail.publishedVersion": "Diterbitkan #{{number}}", "skillManagement.detail.publishing": "Menerbitkan...", - "skillManagement.detail.readonly": "Read only", - "skillManagement.detail.referenceFiles.confirm": "Enter Confirm", - "skillManagement.detail.referenceFiles.empty": "No files available.", - "skillManagement.detail.referenceFiles.livePlaceholder": "Write instructions for the agent, type / to reference files", - "skillManagement.detail.referenceFiles.navigate": "↑↓ Navigate", - "skillManagement.detail.referenceFiles.title": "Reference files", - "skillManagement.detail.referencedBy": "Referenced by {{count}} Apps", - "skillManagement.detail.removeMetadata": "Delete {{name}} metadata", - "skillManagement.detail.removeTag": "Remove {{tag}}", - "skillManagement.detail.removeTagSuccess": "Tag removed.", - "skillManagement.detail.renameFile": "Rename file", - "skillManagement.detail.renameFileDescription": "Enter the new path relative to the skill root.", - "skillManagement.detail.renameFileSuccess": "File renamed.", - "skillManagement.detail.renameSkillSuccess": "Skill renamed.", - "skillManagement.detail.renameVersion": "Rename", - "skillManagement.detail.renameVersionFailed": "Failed to rename version.", - "skillManagement.detail.renameVersionPrompt": "Version name", - "skillManagement.detail.renameVersionSuccess": "Version renamed.", - "skillManagement.detail.restoreVersion": "Restore", - "skillManagement.detail.restoreVersionFailed": "Failed to restore version.", - "skillManagement.detail.restoreVersionSuccess": "Version restored to draft.", - "skillManagement.detail.save": "Save", - "skillManagement.detail.saveFailed": "Failed to save file.", - "skillManagement.detail.saveSuccess": "File saved.", - "skillManagement.detail.saved": "Saved", - "skillManagement.detail.savedAt": "Saved {{time}}", - "skillManagement.detail.saving": "Saving...", + "skillManagement.detail.readonly": "Hanya baca", + "skillManagement.detail.referenceFiles.confirm": "Masukkan Konfirmasi", + "skillManagement.detail.referenceFiles.empty": "Tidak ada file yang tersedia.", + "skillManagement.detail.referenceFiles.livePlaceholder": "Tulis instruksi untuk agen. Ketik / untuk mereferensikan file.", + "skillManagement.detail.referenceFiles.navigate": "↑↓ Navigasi", + "skillManagement.detail.referenceFiles.title": "File referensi", + "skillManagement.detail.referencedBy_one": "Digunakan oleh {{count}} agen", + "skillManagement.detail.referencedBy_other": "Digunakan oleh {{count}} agen", + "skillManagement.detail.removeMetadata": "Hapus metadata {{name}}", + "skillManagement.detail.removeTag": "Hapus {{tag}}", + "skillManagement.detail.removeTagSuccess": "Tandai dihapus.", + "skillManagement.detail.renameFile": "Ganti nama berkas", + "skillManagement.detail.renameFileDescription": "Masukkan jalur baru yang berhubungan dengan akar keterampilan.", + "skillManagement.detail.renameFileSuccess": "File diganti namanya.", + "skillManagement.detail.renameSkillSuccess": "Skill diganti namanya.", + "skillManagement.detail.renameVersion": "Ubah nama", + "skillManagement.detail.renameVersionFailed": "Gagal mengganti nama versi.", + "skillManagement.detail.renameVersionPrompt": "Nama versi", + "skillManagement.detail.renameVersionSuccess": "Versi diganti namanya.", + "skillManagement.detail.resizeSidebar": "Ubah ukuran bilah sisi file", + "skillManagement.detail.restoreVersion": "Pulihkan", + "skillManagement.detail.restoreVersionConfirmDescription": "Ini akan mengganti draf saat ini dengan file dari \"{{version}}\". Itu tidak akan mempublikasikan Skill atau membuat versi baru.", + "skillManagement.detail.restoreVersionConfirmTitle": "Pulihkan versi ini?", + "skillManagement.detail.restoreVersionFailed": "Gagal memulihkan versi.", + "skillManagement.detail.restoreVersionSuccess": "Versi dikembalikan ke draf.", + "skillManagement.detail.save": "Simpan", + "skillManagement.detail.saveConflictConfirmDescription": "Keterampilan ini telah diperbarui di tempat lain. Muat draf terbaru untuk melanjutkan pengeditan. Perubahan Anda saat ini akan dibuang.", + "skillManagement.detail.saveConflictConfirmTitle": "Muat draf terbaru?", + "skillManagement.detail.saveConflictReload": "Muat draf terbaru", + "skillManagement.detail.saveConflictStatus": "Konflik terdeteksi. Muat draf terbaru untuk melanjutkan pengeditan.", + "skillManagement.detail.saveFailed": "Gagal menyimpan file.", + "skillManagement.detail.saveSuccess": "Berkas disimpan.", + "skillManagement.detail.saved": "Disimpan", + "skillManagement.detail.savedAt": "Disimpan {{time}}", + "skillManagement.detail.saving": "Menyimpan...", "skillManagement.detail.searchFiles": "Cari file", + "skillManagement.detail.showMoreReferences": "Tampilkan {{count}} lebih lanjut", + "skillManagement.detail.skillDescriptionPlaceholder": "Jelaskan fungsi keterampilan ini dan kapan agen harus menggunakannya.", + "skillManagement.detail.skillNamePlaceholder": "Gunakan huruf kecil, angka, dan tanda hubung.", "skillManagement.detail.unpublishedChanges": "Perubahan belum diterbitkan", - "skillManagement.detail.unsavedChanges": "Unsaved changes", + "skillManagement.detail.unsavedChanges": "Perubahan yang belum disimpan", "skillManagement.detail.upToDate": "Terkini", - "skillManagement.detail.updateTagsFailed": "Failed to update tags.", - "skillManagement.detail.uploadFile": "Upload file", - "skillManagement.detail.uploadFileFailed": "File upload failed.", - "skillManagement.detail.uploadFileSuccess": "File uploaded.", - "skillManagement.detail.uploadFilesMenu": "Upload files...", + "skillManagement.detail.updateTagsFailed": "Gagal memperbarui tag.", + "skillManagement.detail.uploadCheckFailed": "Tidak dapat memeriksa file-file ini. Coba lagi.", + "skillManagement.detail.uploadConflict": "File dengan nama ini sudah ada.", + "skillManagement.detail.uploadFailureSummary": "{{failed}} dari file {{total}} gagal", + "skillManagement.detail.uploadFailureTitle": "Beberapa unggahan gagal", + "skillManagement.detail.uploadFile": "Unggah file", + "skillManagement.detail.uploadFileFailed": "Gagal mengunggah file.", + "skillManagement.detail.uploadFileSuccess": "File diunggah.", + "skillManagement.detail.uploadFilesButton": "Unggah file {{count}}", + "skillManagement.detail.uploadFilesFailedStatus_one": "Pengunggahan file {{count}} gagal.", + "skillManagement.detail.uploadFilesFailedStatus_other": "Gagal mengunggah file {{count}}.", + "skillManagement.detail.uploadFilesMenu": "Unggah file...", + "skillManagement.detail.uploadFilesProgress": "Mengunggah {{completed}}/{{total}}", + "skillManagement.detail.uploadFilesResult": "{{uploaded}} diunggah · {{failed}} gagal", + "skillManagement.detail.uploadFilesStatus": "Status Unggah", + "skillManagement.detail.uploadInvalidExtension": "Jenis file ini tidak didukung.", + "skillManagement.detail.uploadInvalidName": "Nama tidak valid.", + "skillManagement.detail.uploadInvalidPath": "Jalur file tidak valid.", + "skillManagement.detail.uploadKeepBoth": "Pertahankan keduanya", + "skillManagement.detail.uploadLateConflict": "Seseorang menambahkan file ini saat Anda mengunggah.", + "skillManagement.detail.uploadMissingExtension": "Ekstensi file diperlukan.", + "skillManagement.detail.uploadNetworkFailure": "Gagal mengunggah. Periksa koneksi Anda.", + "skillManagement.detail.uploadReadySummary": "{{ready}} siap · {{decisions}} butuh keputusan · {{skipped}} akan dilewati", + "skillManagement.detail.uploadReplace": "Mengganti", + "skillManagement.detail.uploadResolvedSummary": "{{ready}} siap · {{skipped}} akan dilewati", + "skillManagement.detail.uploadRetryCount": "Coba lagi {{count}}", + "skillManagement.detail.uploadReviewTitle": "Tinjau sebelum mengunggah", + "skillManagement.detail.uploadSkip": "Lewat", + "skillManagement.detail.uploadSkippedGroup": "File {{count}} tidak dapat diunggah dan akan dilewati", + "skillManagement.detail.uploadStatusDismiss": "Tutup status unggahan", + "skillManagement.detail.uploadSuggestion": "Gunakan saran", + "skillManagement.detail.uploadWillReplace": "Akan menggantikan file yang ada", + "skillManagement.detail.uploadWillUseName": "Akan diunggah sebagai {{name}}", + "skillManagement.detail.versionHistory": "Buka riwayat versi", "skillManagement.detail.versionMeta": "{{hash}} · {{time}}", - "skillManagement.detail.versions": "Versions", - "skillManagement.draft": "Draft", - "skillManagement.duplicateFailed": "Failed to duplicate skill.", - "skillManagement.duplicateSuccess": "Skill duplicated.", - "skillManagement.editedAt": "Edited {{time}}", - "skillManagement.empty": "No skills yet", - "skillManagement.emptySearch": "No skills found", - "skillManagement.import": "Import", - "skillManagement.importFailed": "Failed to import skill.", - "skillManagement.importSuccess": "Skill imported.", - "skillManagement.listLabel": "Workspace skills", - "skillManagement.loadingError": "Failed to load skills", - "skillManagement.moreActions": "More actions for {{name}}", - "skillManagement.noTags": "No tags", - "skillManagement.publishedAt": "Published {{time}}", - "skillManagement.referenceCount": "{{count}} Refs", - "skillManagement.searchLabel": "Search skills", - "skillManagement.searchPlaceholder": "Search", - "skillManagement.tags": "Tags", - "skillManagement.title": "Skills" + "skillManagement.detail.versionPublishNote": "Catatan rilis", + "skillManagement.detail.versionPublishNotePlaceholder": "Jelaskan perubahan ini", + "skillManagement.detail.versionPublishedMeta": "{{time}} · {{name}}", + "skillManagement.detail.versionTitle": "Judul", + "skillManagement.detail.versions": "Versi", + "skillManagement.detail.viewOnly": "Lihat saja", + "skillManagement.detail.viewUploadErrors": "Lihat kesalahan", + "skillManagement.draft": "Draf", + "skillManagement.duplicateFailed": "Gagal menduplikasi keterampilan.", + "skillManagement.duplicateSuccess": "Skill digandakan.", + "skillManagement.editedAt": "Diedit {{time}}", + "skillManagement.empty": "Belum ada keterampilan", + "skillManagement.emptyAction.createDescription": "Jelaskan skenario dengan kata-kata sederhana dan dapatkan draf keterampilan untuk ditinjau.", + "skillManagement.emptyAction.createTitle": "Buat dengan Skill Builder", + "skillManagement.emptyAction.importDescription": "Bawalah .zip dengan SKILL.md, dalam format Agentkills.io.", + "skillManagement.emptyAction.importTitle": "Impor paket keterampilan", + "skillManagement.emptySearch": "Tidak ada keterampilan yang ditemukan", + "skillManagement.errors.missingSkillMd": "Paket ini tidak memiliki SKILL.md. Tambahkan file dan impor lagi.", + "skillManagement.errors.nameConflict": "Skill bernama \"{{name}}\" sudah ada. Ubah namanya menjadi SKILL.md dan impor lagi.", + "skillManagement.errors.workspaceLimit": "Ruang kerja Anda telah mencapai batas 500 keterampilan. Hapus keterampilan untuk menambahkan keterampilan baru.", + "skillManagement.import": "Impor", + "skillManagement.importFailed": "Gagal mengimpor keterampilan.", + "skillManagement.importSuccess": "Skill diimpor.", + "skillManagement.listLabel": "Keterampilan ruang kerja", + "skillManagement.loadingError": "Gagal memuat keterampilan", + "skillManagement.moreActions": "Tindakan lainnya untuk {{name}}", + "skillManagement.noDescription": "Belum ada deskripsi", + "skillManagement.noTags": "Tidak ada tag", + "skillManagement.publishedAt": "Diterbitkan {{time}}", + "skillManagement.referenceCount_one": "{{count}} agen", + "skillManagement.referenceCount_other": "{{count}} agen", + "skillManagement.searchLabel": "Cari keterampilan", + "skillManagement.searchPlaceholder": "Cari berdasarkan nama atau deskripsi", + "skillManagement.tags": "Tag", + "skillManagement.title": "Keterampilan" } diff --git a/web/i18n/it-IT/agent-v-2.json b/web/i18n/it-IT/agent-v-2.json index 74d94d63f66..4a2fffbf227 100644 --- a/web/i18n/it-IT/agent-v-2.json +++ b/web/i18n/it-IT/agent-v-2.json @@ -83,7 +83,7 @@ "agentDetail.configure.buildDraft.changesToApply_other": "{{count}} modifiche da applicare", "agentDetail.configure.buildDraft.discard": "Scarta", "agentDetail.configure.buildDraft.modeBadge": "Modalità build", - "agentDetail.configure.buildDraft.modeDescription": "Sei in modalità build. Configure può essere aggiornato solo dall’agente in questa modalità. Modella questa configurazione tramite la chat a destra, poi applica.", + "agentDetail.configure.buildDraft.modeDescription": "Sei in modalità build. Definisci questa configurazione chattando con l’agente, quindi seleziona Applica.", "agentDetail.configure.buildDraft.rewritten": "Riscritto", "agentDetail.configure.buildDraft.title": "Bozza di build", "agentDetail.configure.buildDraft.updated": "Aggiornato", @@ -105,7 +105,8 @@ "agentDetail.configure.files.preview.failed": "Impossibile caricare l’anteprima.", "agentDetail.configure.files.preview.unsupported": "Questo file non supporta l’anteprima.", "agentDetail.configure.files.remove": "Rimuovi {{name}}", - "agentDetail.configure.files.tip": "Per materiale di riferimento troppo lungo da incollare nel Prompt: specifiche, modelli, linee guida. Fai riferimento con / nel Prompt.\n\nIn modalità Build, l'agente può configurarli per te.", + "agentDetail.configure.files.richTip": "Per materiale di riferimento troppo lungo da incollare nel Prompt: specifiche, modelli, linee guida. Scopri di più\n\nIn modalità Build, l'agente può configurarli per te.", + "agentDetail.configure.files.tip": "Per materiale di riferimento troppo lungo da incollare nel Prompt: specifiche, modelli, linee guida. Scopri di più\n\nIn modalità Build, l'agente può configurarli per te.", "agentDetail.configure.files.toggle": "Attiva/disattiva file", "agentDetail.configure.files.treeLabel": "File dell’agente", "agentDetail.configure.files.upload.action": "Carica", @@ -114,7 +115,7 @@ "agentDetail.configure.files.upload.dropzone": "Trascina qui un file, oppure", "agentDetail.configure.files.upload.failed": "Impossibile caricare il file.", "agentDetail.configure.files.upload.fileType": "FILE", - "agentDetail.configure.files.upload.invalidFile": "Carica un solo file.", + "agentDetail.configure.files.upload.invalidFile": "È possibile caricare un solo file alla volta.", "agentDetail.configure.files.upload.success": "File caricato.", "agentDetail.configure.files.upload.title": "Carica file", "agentDetail.configure.knowledgeRetrieval.add": "Aggiungi recupero della conoscenza", @@ -177,7 +178,8 @@ "agentDetail.configure.prompt.mention.priyaRamanathan": "Priya Ramanathan", "agentDetail.configure.prompt.placeholder": "Scrivi le istruzioni qui,", "agentDetail.configure.prompt.referenceMissing": "{{name}} non esiste", - "agentDetail.configure.prompt.tip": "Definisci il ruolo dell’agente e descrivi la sua attività tipica. Usa / per fare riferimento esplicito a abilità, file, strumenti e recuperi di conoscenza.", + "agentDetail.configure.prompt.richTip": "Definisci il ruolo dell’agente e il modo in cui deve lavorare. Scopri di più", + "agentDetail.configure.prompt.tip": "Definisci il ruolo dell’agente e il modo in cui deve lavorare. Scopri di più", "agentDetail.configure.publishBar.draft": "Bozza", "agentDetail.configure.publishBar.publishUpdate": "Pubblica aggiornamento", "agentDetail.configure.publishBar.published": "Pubblicato", @@ -190,8 +192,8 @@ "agentDetail.configure.publishBar.versionHistory": "Apri cronologia versioni", "agentDetail.configure.publishImpact.affectedWorkflows": "Workflow interessati", "agentDetail.configure.publishImpact.cancel": "Annulla", - "agentDetail.configure.publishImpact.descriptionPrefix": "Il tuo agente compare in", - "agentDetail.configure.publishImpact.descriptionSuffix": ". Le modifiche li influenzeranno.", + "agentDetail.configure.publishImpact.descriptionPrefix": "Questo agente viene utilizzato in", + "agentDetail.configure.publishImpact.descriptionSuffix": ". Pubblicandolo, verrà aggiornato in tutti.", "agentDetail.configure.publishImpact.fallbackAgentName": "questo agente", "agentDetail.configure.publishImpact.title": "{{action}} in {{name}}", "agentDetail.configure.publishImpact.workflowCount_one": "{{count}} workflow", @@ -222,8 +224,8 @@ "agentDetail.configure.skills.openInLibrary": "Open in Skill library", "agentDetail.configure.skills.remove": "Rimuovi {{name}}", "agentDetail.configure.skills.removeAction": "Remove", - "agentDetail.configure.skills.richTip": "Raggruppa istruzioni, file e script per un'attività ricorrente in una skill. Fai riferimento con / nel Prompt. Scopri di più\n\nIn modalità Build, l'agente può configurarli per te.", - "agentDetail.configure.skills.tip": "Raggruppa istruzioni, file e script per un'attività ricorrente in una skill. Fai riferimento con / nel Prompt. Scopri di più\n\nIn modalità Build, l'agente può configurarli per te.", + "agentDetail.configure.skills.richTip": "Raggruppa istruzioni, file e script per un'attività ricorrente in una skill. Scopri di più\n\nIn modalità Build, l'agente può configurarli per te.", + "agentDetail.configure.skills.tip": "Raggruppa istruzioni, file e script per un'attività ricorrente in una skill. Scopri di più\n\nIn modalità Build, l'agente può configurarli per te.", "agentDetail.configure.skills.toggle": "Attiva/disattiva abilità", "agentDetail.configure.skills.upload.action": "Carica", "agentDetail.configure.skills.upload.browse": "sfoglia", @@ -269,8 +271,8 @@ "agentDetail.configure.tools.moreActions": "Altre azioni per {{name}}", "agentDetail.configure.tools.removeAction": "Rimuovi {{name}}", "agentDetail.configure.tools.removeProvider": "Rimuovi tutti gli strumenti", - "agentDetail.configure.tools.richTip": "Aggiungi strumenti Dify dal tuo workspace. Fai riferimento con / nel Prompt. Scopri di più\n\nGli strumenti che l'agente installa nel suo sandbox non appariranno qui, ma resteranno disponibili.", - "agentDetail.configure.tools.tip": "Aggiungi strumenti Dify dal tuo workspace. Fai riferimento con / nel Prompt. Scopri di più\n\nGli strumenti che l'agente installa nel suo sandbox non appariranno qui, ma resteranno disponibili.", + "agentDetail.configure.tools.richTip": "Aggiungi strumenti Dify dal tuo workspace. Scopri di più\n\nGli strumenti che l'agente installa nel suo sandbox non appariranno qui, ma resteranno disponibili.", + "agentDetail.configure.tools.tip": "Aggiungi strumenti Dify dal tuo workspace. Scopri di più\n\nGli strumenti che l'agente installa nel suo sandbox non appariranno qui, ma resteranno disponibili.", "agentDetail.configure.tools.toggle": "Attiva/disattiva strumenti", "agentDetail.configure.tools.toolTabs.all": "Tutti", "agentDetail.configure.tools.toolTabs.cli": "CLI", @@ -336,22 +338,22 @@ "agentDetail.metadata.sourceLabel": "Origine", "agentDetail.monitoring.change": "{{value}} rispetto al periodo precedente", "agentDetail.monitoring.dateRangeLabel": "Intervallo di date", - "agentDetail.monitoring.description": "Monitora l’attività, il costo e la qualità dell’interazione dell’agente riutilizzabile in tutti i workflow.", + "agentDetail.monitoring.description": "Monitora l’attività, il costo e la qualità delle interazioni di questo agente in tutti i punti di accesso.", "agentDetail.monitoring.learnMore": "Scopri di più", "agentDetail.monitoring.loadFailed": "Impossibile caricare i dati di monitoraggio", - "agentDetail.monitoring.metrics.activeUsers.explanation": "Utenti finali unici che hanno attivato workflow utilizzando questo agente.", + "agentDetail.monitoring.metrics.activeUsers.explanation": "Utenti finali unici che hanno interagito con questo agente.", "agentDetail.monitoring.metrics.activeUsers.title": "Utenti attivi", - "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Conteggio della comunicazione continua tra utente e agente per questo punto di accesso.", + "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Numero medio di messaggi degli utenti per conversazione.", "agentDetail.monitoring.metrics.avgSessionInteractions.title": "Interazioni medie per sessione", - "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Velocità media di output dall’inizio della richiesta al completamento.", + "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Numero medio di token generati al secondo durante una risposta dell’agente.", "agentDetail.monitoring.metrics.tokenOutputSpeed.title": "Velocità di output dei token", - "agentDetail.monitoring.metrics.tokenUsage.explanation": "Costo stimato in token prodotto da questo agente nelle esecuzioni dei workflow.", + "agentDetail.monitoring.metrics.tokenUsage.explanation": "Token consumati e costo stimato.", "agentDetail.monitoring.metrics.tokenUsage.title": "Utilizzo dei token", "agentDetail.monitoring.metrics.totalConversations.explanation": "Conversazioni IA giornaliere che hanno raggiunto questo agente tramite il punto di accesso selezionato.", "agentDetail.monitoring.metrics.totalConversations.title": "Conversazioni totali", - "agentDetail.monitoring.metrics.totalMessages.explanation": "Conteggio giornaliero delle interazioni dell’agente.", + "agentDetail.monitoring.metrics.totalMessages.explanation": "Numero totale di messaggi inviati dagli utenti a questo agente.", "agentDetail.monitoring.metrics.totalMessages.title": "Messaggi totali", - "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "Il numero di mi piace per 1.000 messaggi per questo agente.", + "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "Percentuale di risposte dell’agente che gli utenti hanno valutato con un «Mi piace».", "agentDetail.monitoring.metrics.userSatisfactionRate.title": "Tasso di soddisfazione utente", "agentDetail.monitoring.pickSource": "Scegli un’app", "agentDetail.monitoring.sourceLabel": "App", @@ -549,7 +551,5 @@ "skillManagement.searchLabel": "Search skills", "skillManagement.searchPlaceholder": "Search", "skillManagement.tags": "Tags", - "skillManagement.title": "Skills", - "agentDetail.configure.files.richTip": "Per materiale di riferimento troppo lungo da incollare nel Prompt: specifiche, modelli, linee guida. Scopri di più\n\nIn modalità Build, l'agente può configurarli per te.", - "agentDetail.configure.prompt.richTip": "Definisci il ruolo dell’agente e il modo in cui deve lavorare. Scopri di più" + "skillManagement.title": "Skills" } diff --git a/web/i18n/it-IT/skill.json b/web/i18n/it-IT/skill.json index 84ee06bbfeb..56c843d3f84 100644 --- a/web/i18n/it-IT/skill.json +++ b/web/i18n/it-IT/skill.json @@ -1,121 +1,245 @@ { - "skillManagement.clearTags": "Clear tags", - "skillManagement.create": "Create", - "skillManagement.createFailed": "Failed to create skill.", - "skillManagement.createSuccess": "Skill created.", - "skillManagement.dateTimeFormat": "MMM D, YYYY HH:mm", + "skillManagement.clearTags": "Cancella tag", + "skillManagement.create": "Crea", + "skillManagement.createFailed": "Impossibile creare la competenza.", + "skillManagement.createSuccess": "Bozza creata.", + "skillManagement.dateTimeFormat": "MMM D, AAAA HH:mm", "skillManagement.deleteDialog.confirmInputLabel": "Per confermare, digita {{skillName}} nel campo sottostante:", "skillManagement.deleteDialog.confirmInputPlaceholder": "Inserisci il nome visualizzato dello Skill…", - "skillManagement.deleteDialog.description": "This skill will be removed from the workspace. Agents that reference it may lose access to this capability.", - "skillManagement.deleteDialog.title": "Delete {{name}}?", - "skillManagement.deleteFailed": "Failed to delete skill.", - "skillManagement.deleteSuccess": "Skill deleted.", - "skillManagement.detail.addMetadata": "Add metadata", - "skillManagement.detail.addMetadataDescription": "Add a frontmatter field to this Markdown file.", - "skillManagement.detail.addTag": "Add tag", - "skillManagement.detail.addTagDescription": "Create or bind a tag to this Skill. New tags are saved with the Skill metadata.", - "skillManagement.detail.addTagSuccess": "Tag added.", - "skillManagement.detail.back": "Back to Skills", - "skillManagement.detail.cancelAddMetadata": "Cancel adding metadata", - "skillManagement.detail.closeFileTab": "Close {{name}}", + "skillManagement.deleteDialog.description": "L'eliminazione della competenza è irreversibile. Il suo contenuto e la cronologia completa delle versioni verranno eliminati definitivamente. Nessun agente lo sta attualmente utilizzando.", + "skillManagement.deleteDialog.referencedDescription_one": "L'agente {{count}} sta utilizzando questa abilità, in modo indipendente o in un flusso di lavoro. L'eliminazione di questa abilità ne cancellerà permanentemente i contenuti e la cronologia delle versioni e la rimuoverà dall'agente interessato.", + "skillManagement.deleteDialog.referencedDescription_other": "Gli agenti {{count}} utilizzano questa abilità, in modo indipendente o nei flussi di lavoro. L'eliminazione di questa competenza ne cancellerà permanentemente i contenuti e la cronologia delle versioni e la rimuoverà da tutti gli agenti interessati.", + "skillManagement.deleteDialog.title": "Eliminare {{name}}?", + "skillManagement.deleteFailed": "Impossibile eliminare la competenza.", + "skillManagement.deleteSuccess": "Skill eliminato.", + "skillManagement.detail.addMetadata": "Aggiungi metadati", + "skillManagement.detail.addMetadataDescription": "Aggiungi un campo in primo piano a questo file Markdown.", + "skillManagement.detail.addTag": "Aggiungi etichetta", + "skillManagement.detail.addTagDescription": "Crea o associa un tag a questo Skill. I nuovi tag vengono salvati con i metadati Skill.", + "skillManagement.detail.addTagSuccess": "Etichetta aggiunta.", + "skillManagement.detail.back": "Torna a Skills", + "skillManagement.detail.builder.applyFailed": "Impossibile applicare gli aggiornamenti della bozza.", + "skillManagement.detail.builder.attach": "Allega file", + "skillManagement.detail.builder.attachFailed": "Impossibile allegare il file.", + "skillManagement.detail.builder.attachLimit": "Puoi allegare fino a 10 file.", + "skillManagement.detail.builder.attachTooLarge": "I file devono essere di 15 MB o più piccoli. Le immagini devono essere di 10 MB o inferiori.", + "skillManagement.detail.builder.attachUnsupported": "È possibile allegare solo immagini, testo e file di documenti.", + "skillManagement.detail.builder.attachmentOnlyMessage": "Utilizza il file allegato per migliorare questa abilità.", + "skillManagement.detail.builder.close": "Chiudi Skill Builder", + "skillManagement.detail.builder.compatibleModelsOnly": "Vengono mostrati solo i modelli compatibili", + "skillManagement.detail.builder.copyResponse": "Copia la risposta", + "skillManagement.detail.builder.copySuccess": "Risposta copiata negli appunti.", + "skillManagement.detail.builder.editIntro": "Ho rivisto questa abilità. Cosa vorresti regolare?", + "skillManagement.detail.builder.exampleIssueTriage": "Valutazione dei problemi del cliente", + "skillManagement.detail.builder.exampleOnboarding": "Guida all'onboarding dei nuovi assunti", + "skillManagement.detail.builder.exampleSalesFollowUp": "Strategia di follow-up dei lead di vendita", + "skillManagement.detail.builder.followUpDisplayName": "Utilizza Approvazione rimborso come nome visualizzato", + "skillManagement.detail.builder.followUpNameIcon": "Applica il nome e l'icona suggeriti", + "skillManagement.detail.builder.fromMarketplace": "Dal Marketplace", + "skillManagement.detail.builder.model": "GPT-4o", + "skillManagement.detail.builder.modelCredits.all": "Tutti i crediti", + "skillManagement.detail.builder.modelCredits.configure": "Configurazione richiesta", + "skillManagement.detail.builder.modelCredits.exhausted": "Quota esaurita", + "skillManagement.detail.builder.modelProviderSettings": "Impostazioni fornitore modelli", + "skillManagement.detail.builder.modelSearch": "Cerca modelli...", + "skillManagement.detail.builder.modifyPlaceholder": "Chiedi all'IA di modificare questa abilità...", + "skillManagement.detail.builder.open": "Apri Skill Builder", + "skillManagement.detail.builder.placeholder": "Descrivi lo scenario...", + "skillManagement.detail.builder.progress.applyingChanges": "Applicazione delle modifiche ai file", + "skillManagement.detail.builder.progress.generatingPlan": "Generazione del piano di aggiornamento", + "skillManagement.detail.builder.progress.readingDraft": "Lettura della bozza attuale", + "skillManagement.detail.builder.progress.updatingEditor": "Aggiornamento dell'editor", + "skillManagement.detail.builder.promptDescription": "Descrivilo e nell'editor apparirà una bozza, con passaggi e file inclusi.", + "skillManagement.detail.builder.promptTitle": "Cosa dovrebbe gestire questa abilità?", + "skillManagement.detail.builder.readAloud": "Leggi la risposta ad alta voce", + "skillManagement.detail.builder.removeAttachment": "Rimuovi {{name}}", + "skillManagement.detail.builder.restart": "Riavvia il generatore", + "skillManagement.detail.builder.retryResponse": "Riprovare la risposta", + "skillManagement.detail.builder.send": "Invia messaggio", + "skillManagement.detail.builder.sendFailed": "Skill Builder non ha risposto.", + "skillManagement.detail.builder.thinking": "Sto pensando", + "skillManagement.detail.builder.thinkingUnavailable": "Il modello non ha restituito alcun contenuto pensante.", + "skillManagement.detail.builder.title": "Skill Builder", + "skillManagement.detail.builder.tryExample": "Prova un esempio", + "skillManagement.detail.builder.voice": "Input vocale", + "skillManagement.detail.builder.voiceUnavailable": "L'input vocale non è ancora disponibile.", + "skillManagement.detail.cancelAddMetadata": "Annulla l'aggiunta di metadati", + "skillManagement.detail.closeFileTab": "Chiudi {{name}}", + "skillManagement.detail.closeVersions": "Versioni vicine", "skillManagement.detail.collapseSidebar": "Comprimi barra laterale", - "skillManagement.detail.createFile": "New file", - "skillManagement.detail.createFileDescription": "Enter a file path relative to the skill root.", - "skillManagement.detail.createFileMenu": "New file...", - "skillManagement.detail.createFileSuccess": "File created.", - "skillManagement.detail.createFolder": "New folder", - "skillManagement.detail.createFolderDescription": "Enter a folder path relative to the skill root.", - "skillManagement.detail.createFolderMenu": "New folder...", - "skillManagement.detail.createFolderSuccess": "Folder created.", - "skillManagement.detail.createdBy": "Created by {{name}}", - "skillManagement.detail.currentDraft": "Current draft", - "skillManagement.detail.deleteFileConfirm": "Delete this file?", - "skillManagement.detail.deleteFileSuccess": "File deleted.", - "skillManagement.detail.deleteVersionConfirm": "Delete this version?", - "skillManagement.detail.deleteVersionFailed": "Failed to delete version.", - "skillManagement.detail.deleteVersionSuccess": "Version deleted.", - "skillManagement.detail.downloadFile": "Download file", - "skillManagement.detail.draft": "Draft", + "skillManagement.detail.copyContentSuccess": "Contenuto copiato negli appunti.", + "skillManagement.detail.copyFile": "Copia", + "skillManagement.detail.copyFileSuccess": "File pronto per essere incollato.", + "skillManagement.detail.copyVersionId": "Copia ID", + "skillManagement.detail.copyVersionIdSuccess": "ID copiato negli appunti.", + "skillManagement.detail.createFile": "Nuovo fascicolo", + "skillManagement.detail.createFileDescription": "Immettere un percorso file relativo alla radice della competenza.", + "skillManagement.detail.createFileMenu": "Nuovo fascicolo...", + "skillManagement.detail.createFileSuccess": "File creato.", + "skillManagement.detail.createFolder": "Nuova cartella", + "skillManagement.detail.createFolderDescription": "Immettere un percorso di cartella relativo alla radice della competenza.", + "skillManagement.detail.createFolderMenu": "Nuova cartella...", + "skillManagement.detail.createFolderSuccess": "Cartella creata.", + "skillManagement.detail.createdBy": "Creato da {{name}}", + "skillManagement.detail.currentDraft": "Bozza attuale", + "skillManagement.detail.cutFile": "Taglio", + "skillManagement.detail.cutFileSuccess": "File pronto per lo spostamento.", + "skillManagement.detail.deleteFileConfirm": "Eliminare questo file?", + "skillManagement.detail.deleteFileSuccess": "File eliminato.", + "skillManagement.detail.deleteVersionConfirm": "Eliminare questa versione?", + "skillManagement.detail.deleteVersionFailed": "Impossibile eliminare la versione.", + "skillManagement.detail.deleteVersionSuccess": "Versione eliminata.", + "skillManagement.detail.downloadFile": "Scarica file", + "skillManagement.detail.draft": "Bozza", + "skillManagement.detail.editVersionInfo": "Modifica le informazioni sulla versione", + "skillManagement.detail.exitVersions": "Esci dalle versioni", "skillManagement.detail.expandSidebar": "Espandi barra laterale", - "skillManagement.detail.fileCount": "{{count}} FILES", - "skillManagement.detail.fileMeta": "{{type}} · {{size}} bytes", - "skillManagement.detail.fileMissing": "File not found.", - "skillManagement.detail.fileOperationFailed": "File operation failed.", - "skillManagement.detail.files": "Files", - "skillManagement.detail.latest": "Latest", - "skillManagement.detail.loadFailed": "Failed to load skill.", - "skillManagement.detail.markdownLiveMode": "Live preview", - "skillManagement.detail.markdownSourceMode": "Source editor", - "skillManagement.detail.metadataKey": "name", - "skillManagement.detail.metadataValue": "value", - "skillManagement.detail.moveFileSuccess": "File moved.", - "skillManagement.detail.moveFilesSuccess": "Files moved.", - "skillManagement.detail.noFileSelected": "Select a file to preview.", - "skillManagement.detail.noFiles": "No files.", + "skillManagement.detail.fileAlreadyExists": "Esiste già un file o una cartella con questo nome.", + "skillManagement.detail.fileCount_one": "{{count}}", + "skillManagement.detail.fileCount_other": "File {{count}}", + "skillManagement.detail.fileMeta": "{{type}} · {{size}} byte", + "skillManagement.detail.fileMissing": "File non trovato.", + "skillManagement.detail.fileOperationFailed": "Operazione sul file non riuscita.", + "skillManagement.detail.files": "File", + "skillManagement.detail.latest": "Ultimo", + "skillManagement.detail.loadFailed": "Impossibile caricare la competenza.", + "skillManagement.detail.loadingTags": "Caricamento tag...", + "skillManagement.detail.markdownLiveMode": "Anteprima dal vivo", + "skillManagement.detail.markdownSourceMode": "Redattore della fonte", + "skillManagement.detail.metadataKey": "nome", + "skillManagement.detail.metadataValue": "valore", + "skillManagement.detail.moveFileSuccess": "File spostato.", + "skillManagement.detail.moveFilesSuccess": "File spostati.", + "skillManagement.detail.nameThisVersion": "Chiamare questa versione", + "skillManagement.detail.noFileSelected": "Seleziona un file da visualizzare in anteprima.", + "skillManagement.detail.noFiles": "Nessun file.", "skillManagement.detail.noSearchResults": "Nessun file corrispondente.", - "skillManagement.detail.noVersions": "No published versions yet.", - "skillManagement.detail.previewUnsupported": "Preview is not supported for this file.", - "skillManagement.detail.publish": "Publish", - "skillManagement.detail.publishFailed": "Failed to publish skill.", - "skillManagement.detail.publishSuccess": "Skill published.", - "skillManagement.detail.published": "Published", + "skillManagement.detail.noSelectableTags": "Nessun tag disponibile.", + "skillManagement.detail.noVersions": "Nessuna versione pubblicata ancora.", + "skillManagement.detail.pasteFile": "Impasto", + "skillManagement.detail.pasteFileSuccess": "File incollato.", + "skillManagement.detail.previewUnsupported": "Questo file non supporta l’anteprima.", + "skillManagement.detail.publish": "Pubblica", + "skillManagement.detail.publishFailed": "Impossibile pubblicare la competenza.", + "skillManagement.detail.publishReferencesDescription_one": "La pubblicazione ha effetto immediato per l'agente {{count}} che utilizza questa abilità.", + "skillManagement.detail.publishReferencesDescription_other": "La pubblicazione ha effetto immediato per gli agenti {{count}} che utilizzano questa abilità.", + "skillManagement.detail.publishReferencesTitle": "Pubblica abilità", + "skillManagement.detail.publishSuccess": "Skill pubblicato.", + "skillManagement.detail.publishUpdate": "Pubblica aggiornamento", + "skillManagement.detail.published": "Pubblicato", "skillManagement.detail.publishedAt": "Pubblicato {{time}}", + "skillManagement.detail.publishedVersion": "Pubblicato #{{number}}", "skillManagement.detail.publishing": "Pubblicazione...", - "skillManagement.detail.readonly": "Read only", - "skillManagement.detail.referenceFiles.confirm": "Enter Confirm", - "skillManagement.detail.referenceFiles.empty": "No files available.", - "skillManagement.detail.referenceFiles.livePlaceholder": "Write instructions for the agent, type / to reference files", - "skillManagement.detail.referenceFiles.navigate": "↑↓ Navigate", - "skillManagement.detail.referenceFiles.title": "Reference files", - "skillManagement.detail.referencedBy": "Referenced by {{count}} Apps", - "skillManagement.detail.removeMetadata": "Delete {{name}} metadata", - "skillManagement.detail.removeTag": "Remove {{tag}}", - "skillManagement.detail.removeTagSuccess": "Tag removed.", - "skillManagement.detail.renameFile": "Rename file", - "skillManagement.detail.renameFileDescription": "Enter the new path relative to the skill root.", - "skillManagement.detail.renameFileSuccess": "File renamed.", - "skillManagement.detail.renameSkillSuccess": "Skill renamed.", - "skillManagement.detail.renameVersion": "Rename", - "skillManagement.detail.renameVersionFailed": "Failed to rename version.", - "skillManagement.detail.renameVersionPrompt": "Version name", - "skillManagement.detail.renameVersionSuccess": "Version renamed.", - "skillManagement.detail.restoreVersion": "Restore", - "skillManagement.detail.restoreVersionFailed": "Failed to restore version.", - "skillManagement.detail.restoreVersionSuccess": "Version restored to draft.", - "skillManagement.detail.save": "Save", - "skillManagement.detail.saveFailed": "Failed to save file.", - "skillManagement.detail.saveSuccess": "File saved.", - "skillManagement.detail.saved": "Saved", - "skillManagement.detail.savedAt": "Saved {{time}}", - "skillManagement.detail.saving": "Saving...", + "skillManagement.detail.readonly": "Sola lettura", + "skillManagement.detail.referenceFiles.confirm": "Inserisci Conferma", + "skillManagement.detail.referenceFiles.empty": "Nessun file disponibile.", + "skillManagement.detail.referenceFiles.livePlaceholder": "Scrivi le istruzioni per l'agente. Digitare / per fare riferimento ai file.", + "skillManagement.detail.referenceFiles.navigate": "↑↓ Naviga", + "skillManagement.detail.referenceFiles.title": "File di riferimento", + "skillManagement.detail.referencedBy_one": "Utilizzato da {{count}} agente", + "skillManagement.detail.referencedBy_other": "Utilizzato da {{count}} agenti", + "skillManagement.detail.removeMetadata": "Elimina i metadati {{name}}", + "skillManagement.detail.removeTag": "Rimuovi {{tag}}", + "skillManagement.detail.removeTagSuccess": "Etichetta rimossa.", + "skillManagement.detail.renameFile": "Rinominare il file", + "skillManagement.detail.renameFileDescription": "Inserisci il nuovo percorso relativo alla radice della competenza.", + "skillManagement.detail.renameFileSuccess": "File rinominato.", + "skillManagement.detail.renameSkillSuccess": "Skill rinominato.", + "skillManagement.detail.renameVersion": "Rinomina", + "skillManagement.detail.renameVersionFailed": "Impossibile rinominare la versione.", + "skillManagement.detail.renameVersionPrompt": "Nome della versione", + "skillManagement.detail.renameVersionSuccess": "Versione rinominata.", + "skillManagement.detail.resizeSidebar": "Ridimensiona la barra laterale del file", + "skillManagement.detail.restoreVersion": "Ripristina", + "skillManagement.detail.restoreVersionConfirmDescription": "Questo sostituirà la bozza corrente con i file di \"{{version}}\". Non pubblicherà lo Skill né creerà una nuova versione.", + "skillManagement.detail.restoreVersionConfirmTitle": "Ripristinare questa versione?", + "skillManagement.detail.restoreVersionFailed": "Impossibile ripristinare la versione.", + "skillManagement.detail.restoreVersionSuccess": "Versione ripristinata alla bozza.", + "skillManagement.detail.save": "Salva", + "skillManagement.detail.saveConflictConfirmDescription": "Questa abilità è stata aggiornata altrove. Carica l'ultima bozza per continuare a modificare. Le modifiche attuali verranno annullate.", + "skillManagement.detail.saveConflictConfirmTitle": "Caricare l'ultima bozza?", + "skillManagement.detail.saveConflictReload": "Carica l'ultima bozza", + "skillManagement.detail.saveConflictStatus": "Rilevato conflitto. Carica l'ultima bozza per continuare a modificare.", + "skillManagement.detail.saveFailed": "Impossibile salvare il file.", + "skillManagement.detail.saveSuccess": "File salvato.", + "skillManagement.detail.saved": "Salvato", + "skillManagement.detail.savedAt": "Salvato {{time}}", + "skillManagement.detail.saving": "Salvataggio...", "skillManagement.detail.searchFiles": "Cerca file", + "skillManagement.detail.showMoreReferences": "Mostra altro {{count}}", + "skillManagement.detail.skillDescriptionPlaceholder": "Descrivi cosa fa questa abilità e quando gli agenti dovrebbero utilizzarla.", + "skillManagement.detail.skillNamePlaceholder": "Utilizza lettere minuscole, numeri e trattini.", "skillManagement.detail.unpublishedChanges": "Modifiche non pubblicate", - "skillManagement.detail.unsavedChanges": "Unsaved changes", + "skillManagement.detail.unsavedChanges": "Modifiche non salvate", "skillManagement.detail.upToDate": "Aggiornato", - "skillManagement.detail.updateTagsFailed": "Failed to update tags.", - "skillManagement.detail.uploadFile": "Upload file", - "skillManagement.detail.uploadFileFailed": "File upload failed.", - "skillManagement.detail.uploadFileSuccess": "File uploaded.", - "skillManagement.detail.uploadFilesMenu": "Upload files...", + "skillManagement.detail.updateTagsFailed": "Impossibile aggiornare i tag.", + "skillManagement.detail.uploadCheckFailed": "Impossibile controllare questi file. Riprova.", + "skillManagement.detail.uploadConflict": "Esiste già un file con questo nome.", + "skillManagement.detail.uploadFailureSummary": "{{failed}} dei file {{total}} non riuscito", + "skillManagement.detail.uploadFailureTitle": "Alcuni caricamenti non sono riusciti", + "skillManagement.detail.uploadFile": "Carica file", + "skillManagement.detail.uploadFileFailed": "Caricamento file non riuscito.", + "skillManagement.detail.uploadFileSuccess": "File caricato.", + "skillManagement.detail.uploadFilesButton": "Carica file {{count}}", + "skillManagement.detail.uploadFilesFailedStatus_one": "Caricamento file {{count}} non riuscito.", + "skillManagement.detail.uploadFilesFailedStatus_other": "Caricamenti di file {{count}} non riusciti.", + "skillManagement.detail.uploadFilesMenu": "Carica file...", + "skillManagement.detail.uploadFilesProgress": "Caricamento {{completed}}/{{total}}", + "skillManagement.detail.uploadFilesResult": "{{uploaded}} caricato · {{failed}} non riuscito", + "skillManagement.detail.uploadFilesStatus": "Stato del caricamento", + "skillManagement.detail.uploadInvalidExtension": "Questo tipo di file non è supportato.", + "skillManagement.detail.uploadInvalidName": "Nome non valido.", + "skillManagement.detail.uploadInvalidPath": "Percorso file non valido.", + "skillManagement.detail.uploadKeepBoth": "Tienili entrambi", + "skillManagement.detail.uploadLateConflict": "Qualcuno ha aggiunto questo file durante il caricamento.", + "skillManagement.detail.uploadMissingExtension": "È richiesta un'estensione del file.", + "skillManagement.detail.uploadNetworkFailure": "Caricamento non riuscito. Controlla la tua connessione.", + "skillManagement.detail.uploadReadySummary": "{{ready}} pronto · {{decisions}} necessita di una decisione · {{skipped}} verrà saltato", + "skillManagement.detail.uploadReplace": "Sostituire", + "skillManagement.detail.uploadResolvedSummary": "{{ready}} pronto · {{skipped}} verrà saltato", + "skillManagement.detail.uploadRetryCount": "Riprova {{count}}", + "skillManagement.detail.uploadReviewTitle": "Rivedi prima del caricamento", + "skillManagement.detail.uploadSkip": "Nave", + "skillManagement.detail.uploadSkippedGroup": "I file {{count}} non possono essere caricati e verranno ignorati", + "skillManagement.detail.uploadStatusDismiss": "Ignora lo stato del caricamento", + "skillManagement.detail.uploadSuggestion": "Usa il suggerimento", + "skillManagement.detail.uploadWillReplace": "Sostituirà il file esistente", + "skillManagement.detail.uploadWillUseName": "Verrà caricato come {{name}}", + "skillManagement.detail.versionHistory": "Apri cronologia versioni", "skillManagement.detail.versionMeta": "{{hash}} · {{time}}", - "skillManagement.detail.versions": "Versions", - "skillManagement.draft": "Draft", - "skillManagement.duplicateFailed": "Failed to duplicate skill.", - "skillManagement.duplicateSuccess": "Skill duplicated.", - "skillManagement.editedAt": "Edited {{time}}", - "skillManagement.empty": "No skills yet", - "skillManagement.emptySearch": "No skills found", - "skillManagement.import": "Import", - "skillManagement.importFailed": "Failed to import skill.", - "skillManagement.importSuccess": "Skill imported.", - "skillManagement.listLabel": "Workspace skills", - "skillManagement.loadingError": "Failed to load skills", - "skillManagement.moreActions": "More actions for {{name}}", - "skillManagement.noTags": "No tags", - "skillManagement.publishedAt": "Published {{time}}", - "skillManagement.referenceCount": "{{count}} Refs", - "skillManagement.searchLabel": "Search skills", - "skillManagement.searchPlaceholder": "Search", - "skillManagement.tags": "Tags", - "skillManagement.title": "Skills" + "skillManagement.detail.versionPublishNote": "Note sulla versione", + "skillManagement.detail.versionPublishNotePlaceholder": "Descrivi questo cambiamento", + "skillManagement.detail.versionPublishedMeta": "{{time}} · {{name}}", + "skillManagement.detail.versionTitle": "Titolo", + "skillManagement.detail.versions": "Versioni", + "skillManagement.detail.viewOnly": "Visualizza solo", + "skillManagement.detail.viewUploadErrors": "Visualizza errori", + "skillManagement.draft": "Bozza", + "skillManagement.duplicateFailed": "Impossibile duplicare la competenza.", + "skillManagement.duplicateSuccess": "Skill duplicato.", + "skillManagement.editedAt": "Modificato {{time}}", + "skillManagement.empty": "Nessuna abilità al momento", + "skillManagement.emptyAction.createDescription": "Descrivi uno scenario in parole semplici e ottieni una bozza di competenza da rivedere.", + "skillManagement.emptyAction.createTitle": "Crea con Skill Builder", + "skillManagement.emptyAction.importDescription": "Porta con te un file .zip con SKILL.md, nel formato agentikills.io.", + "skillManagement.emptyAction.importTitle": "Importa un pacchetto di abilità", + "skillManagement.emptySearch": "Nessuna competenza trovata", + "skillManagement.errors.missingSkillMd": "Questo pacchetto non ha SKILL.md. Aggiungi il file e importalo di nuovo.", + "skillManagement.errors.nameConflict": "Esiste già una competenza denominata \"{{name}}\". Rinominalo in SKILL.md e importalo di nuovo.", + "skillManagement.errors.workspaceLimit": "La tua area di lavoro ha raggiunto il limite di 500 competenze. Elimina una competenza per aggiungerne una nuova.", + "skillManagement.import": "Importa", + "skillManagement.importFailed": "Impossibile importare la competenza.", + "skillManagement.importSuccess": "Skill importato.", + "skillManagement.listLabel": "Abilità nello spazio di lavoro", + "skillManagement.loadingError": "Impossibile caricare le competenze", + "skillManagement.moreActions": "Altre azioni per {{name}}", + "skillManagement.noDescription": "Nessuna descrizione ancora", + "skillManagement.noTags": "Nessun tag", + "skillManagement.publishedAt": "Pubblicato {{time}}", + "skillManagement.referenceCount_one": "{{count}} agente", + "skillManagement.referenceCount_other": "{{count}} agenti", + "skillManagement.searchLabel": "Cerca abilità", + "skillManagement.searchPlaceholder": "Cerca per nome o descrizione", + "skillManagement.tags": "Tag", + "skillManagement.title": "Abilità" } diff --git a/web/i18n/ja-JP/agent-v-2.json b/web/i18n/ja-JP/agent-v-2.json index 04d68477bfc..f21906a5240 100644 --- a/web/i18n/ja-JP/agent-v-2.json +++ b/web/i18n/ja-JP/agent-v-2.json @@ -83,7 +83,7 @@ "agentDetail.configure.buildDraft.changesToApply_other": "適用する変更 {{count}} 件", "agentDetail.configure.buildDraft.discard": "破棄", "agentDetail.configure.buildDraft.modeBadge": "ビルドモード", - "agentDetail.configure.buildDraft.modeDescription": "ビルドモードです。このモードでは、Configure はエージェントのみが更新できます。右側のチャットでこの設定を調整してから適用してください。", + "agentDetail.configure.buildDraft.modeDescription": "ビルドモード中です。Agent とチャットしてこのセットアップを形づくり、最後に適用してください。", "agentDetail.configure.buildDraft.rewritten": "書き換え済み", "agentDetail.configure.buildDraft.title": "ビルドドラフト", "agentDetail.configure.buildDraft.updated": "更新済み", @@ -105,7 +105,8 @@ "agentDetail.configure.files.preview.failed": "プレビューの読み込みに失敗しました。", "agentDetail.configure.files.preview.unsupported": "ファイルはプレビューに対応していません。", "agentDetail.configure.files.remove": "{{name}} を削除", - "agentDetail.configure.files.tip": "Prompt に貼り付けるには長すぎる参考資料向けです: 仕様、テンプレート、ガイドライン。Prompt で / を使って参照します。\n\nBuild モードでは、エージェントがこれらを設定できます。", + "agentDetail.configure.files.richTip": "Prompt に貼り付けるには長すぎる参考資料向けです: 仕様、テンプレート、ガイドライン。詳細を見る\n\nBuild モードでは、エージェントがこれらを設定できます。", + "agentDetail.configure.files.tip": "Prompt に貼り付けるには長すぎる参考資料向けです: 仕様、テンプレート、ガイドライン。詳細を見る\n\nBuild モードでは、エージェントがこれらを設定できます。", "agentDetail.configure.files.toggle": "ファイルの表示を切り替え", "agentDetail.configure.files.treeLabel": "エージェントファイル", "agentDetail.configure.files.upload.action": "アップロード", @@ -114,7 +115,7 @@ "agentDetail.configure.files.upload.dropzone": "ファイルをドロップ、または", "agentDetail.configure.files.upload.failed": "ファイルのアップロードに失敗しました。", "agentDetail.configure.files.upload.fileType": "FILE", - "agentDetail.configure.files.upload.invalidFile": "ファイルを 1 つアップロードしてください。", + "agentDetail.configure.files.upload.invalidFile": "一度にアップロードできるファイルは 1 つです。", "agentDetail.configure.files.upload.success": "ファイルをアップロードしました。", "agentDetail.configure.files.upload.title": "ファイルをアップロード", "agentDetail.configure.knowledgeRetrieval.add": "ナレッジ検索を追加", @@ -177,7 +178,8 @@ "agentDetail.configure.prompt.mention.priyaRamanathan": "Priya Ramanathan", "agentDetail.configure.prompt.placeholder": "ここに指示を記述してください、", "agentDetail.configure.prompt.referenceMissing": "{{name}} は存在しません", - "agentDetail.configure.prompt.tip": "エージェントの役割を定義し、通常のタスクを説明します。/ を使ってスキル、ファイル、ツール、ナレッジ検索を明示的に参照してください。", + "agentDetail.configure.prompt.richTip": "Agent のロールと仕事の進め方を設定します。詳細を見る", + "agentDetail.configure.prompt.tip": "Agent のロールと仕事の進め方を設定します。詳細を見る", "agentDetail.configure.publishBar.draft": "ドラフト", "agentDetail.configure.publishBar.publishUpdate": "更新を公開", "agentDetail.configure.publishBar.published": "公開済み", @@ -190,12 +192,12 @@ "agentDetail.configure.publishBar.versionHistory": "バージョン履歴を開く", "agentDetail.configure.publishImpact.affectedWorkflows": "影響を受けるワークフロー", "agentDetail.configure.publishImpact.cancel": "キャンセル", - "agentDetail.configure.publishImpact.descriptionPrefix": "あなたのエージェントは", - "agentDetail.configure.publishImpact.descriptionSuffix": " で使用されています。変更はそれらに影響します。", + "agentDetail.configure.publishImpact.descriptionPrefix": "この Agent は", + "agentDetail.configure.publishImpact.descriptionSuffix": "で使用されています。公開すると、そのすべてに更新が反映されます。", "agentDetail.configure.publishImpact.fallbackAgentName": "このエージェント", "agentDetail.configure.publishImpact.title": "{{name}} に{{action}}", - "agentDetail.configure.publishImpact.workflowCount_one": "{{count}} 個のワークフロー", - "agentDetail.configure.publishImpact.workflowCount_other": "{{count}} 個のワークフロー", + "agentDetail.configure.publishImpact.workflowCount_one": "{{count}} 件のワークフロー", + "agentDetail.configure.publishImpact.workflowCount_other": "{{count}} 件のワークフロー", "agentDetail.configure.rightPanel.build": "ビルド", "agentDetail.configure.rightPanel.buildTipBody": "Build はチャットを通じてエージェントを設定します。やりたいことを説明すると、左側の設定が入力されます。", "agentDetail.configure.rightPanel.buildTipTitle": "チャットでエージェントを構築", @@ -222,8 +224,8 @@ "agentDetail.configure.skills.openInLibrary": "Open in Skill library", "agentDetail.configure.skills.remove": "{{name}} を削除", "agentDetail.configure.skills.removeAction": "Remove", - "agentDetail.configure.skills.richTip": "繰り返し行うタスクに必要な指示、ファイル、スクリプトを Skill にまとめます。Prompt で / を使って参照します。詳しく見る\n\nBuild モードでは、エージェントがこれらを設定できます。", - "agentDetail.configure.skills.tip": "繰り返し行うタスクに必要な指示、ファイル、スクリプトを Skill にまとめます。Prompt で / を使って参照します。詳しく見る\n\nBuild モードでは、エージェントがこれらを設定できます。", + "agentDetail.configure.skills.richTip": "繰り返し行うタスクに必要な指示、ファイル、スクリプトを Skill にまとめます。詳しく見る\n\nBuild モードでは、エージェントがこれらを設定できます。", + "agentDetail.configure.skills.tip": "繰り返し行うタスクに必要な指示、ファイル、スクリプトを Skill にまとめます。詳しく見る\n\nBuild モードでは、エージェントがこれらを設定できます。", "agentDetail.configure.skills.toggle": "スキルの表示を切り替え", "agentDetail.configure.skills.upload.action": "アップロード", "agentDetail.configure.skills.upload.browse": "選択", @@ -237,6 +239,8 @@ "agentDetail.configure.skills.upload.title": "スキルをアップロード", "agentDetail.configure.skills.upload.warning.files": "Markdown ファイルのみを使用する場合は、「ファイル」にアップロードし、プロンプト内で参照してください。", "agentDetail.configure.skills.upload.warning.specification": "アップロードするスキルは Agent Skills 仕様に準拠する必要があります。", + "agentDetail.configure.skills.workspaceSelector.empty": "スキルライブラリに一致するスキルはありません。", + "agentDetail.configure.skills.workspaceSelector.limitReached": "各 Agent には、スキルライブラリから最大 20 個のスキルを追加できます。スキルを 1 つ外してから、新しいスキルを追加してください。", "agentDetail.configure.switchToPreviewConfirm.title": "プレビューモードに切り替えますか?", "agentDetail.configure.title": "設定", "agentDetail.configure.tools.add": "ツールを追加", @@ -269,8 +273,8 @@ "agentDetail.configure.tools.moreActions": "{{name}} のその他の操作", "agentDetail.configure.tools.removeAction": "{{name}} を削除", "agentDetail.configure.tools.removeProvider": "すべてのツールを削除", - "agentDetail.configure.tools.richTip": "ワークスペースの Dify ツールを追加します。Prompt で / を使って参照します。詳しく見る\n\nエージェントがサンドボックス内にインストールしたツールはここには表示されませんが、引き続き利用できます。", - "agentDetail.configure.tools.tip": "ワークスペースの Dify ツールを追加します。Prompt で / を使って参照します。詳しく見る\n\nエージェントがサンドボックス内にインストールしたツールはここには表示されませんが、引き続き利用できます。", + "agentDetail.configure.tools.richTip": "ワークスペースの Dify ツールを追加します。詳しく見る\n\nエージェントがサンドボックス内にインストールしたツールはここには表示されませんが、引き続き利用できます。", + "agentDetail.configure.tools.tip": "ワークスペースの Dify ツールを追加します。詳しく見る\n\nエージェントがサンドボックス内にインストールしたツールはここには表示されませんが、引き続き利用できます。", "agentDetail.configure.tools.toggle": "ツールの表示を切り替え", "agentDetail.configure.tools.toolTabs.all": "すべて", "agentDetail.configure.tools.toolTabs.cli": "CLI", @@ -336,22 +340,22 @@ "agentDetail.metadata.sourceLabel": "ソース", "agentDetail.monitoring.change": "前期間から {{value}}", "agentDetail.monitoring.dateRangeLabel": "日付範囲", - "agentDetail.monitoring.description": "ワークフロー全体での再利用可能なエージェントのアクティビティ、コスト、対話品質を追跡します。", + "agentDetail.monitoring.description": "この Agent のアクティビティ、コスト、対話品質を、すべてのアクセスポイントにわたって追跡します。", "agentDetail.monitoring.learnMore": "詳細を見る", "agentDetail.monitoring.loadFailed": "モニタリングデータの読み込みに失敗しました", - "agentDetail.monitoring.metrics.activeUsers.explanation": "このエージェントを使ったワークフローをトリガーしたユニークエンドユーザー数。", + "agentDetail.monitoring.metrics.activeUsers.explanation": "この Agent と対話したユニークエンドユーザー数。", "agentDetail.monitoring.metrics.activeUsers.title": "アクティブユーザー", - "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "このアクセスポイントにおけるユーザーとエージェントの連続通信回数。", + "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "1 つの対話でユーザーが送信するメッセージ数の平均。", "agentDetail.monitoring.metrics.avgSessionInteractions.title": "平均セッション対話数", - "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "リクエスト開始から完了までの平均出力速度。", + "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Agent の返信生成中における 1 秒あたりの平均トークン数。", "agentDetail.monitoring.metrics.tokenOutputSpeed.title": "トークン出力速度", - "agentDetail.monitoring.metrics.tokenUsage.explanation": "ワークフロー実行を通じてこのエージェントが生成した推定トークンコスト。", + "agentDetail.monitoring.metrics.tokenUsage.explanation": "消費されたトークン数と推定コスト。", "agentDetail.monitoring.metrics.tokenUsage.title": "トークン使用量", "agentDetail.monitoring.metrics.totalConversations.explanation": "選択したアクセスポイントを通じてこのエージェントに到達した日次 AI 会話数。", "agentDetail.monitoring.metrics.totalConversations.title": "総会話数", - "agentDetail.monitoring.metrics.totalMessages.explanation": "日次のエージェント対話数。", + "agentDetail.monitoring.metrics.totalMessages.explanation": "この Agent に送信されたユーザーメッセージの合計。", "agentDetail.monitoring.metrics.totalMessages.title": "総メッセージ数", - "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "このエージェントの 1,000 メッセージあたりのいいね数。", + "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "ユーザーが「いいね」を付けた Agent の返信の割合。", "agentDetail.monitoring.metrics.userSatisfactionRate.title": "ユーザー満足度", "agentDetail.monitoring.pickSource": "アプリを選択", "agentDetail.monitoring.sourceLabel": "アプリ", @@ -549,9 +553,5 @@ "skillManagement.searchLabel": "Search skills", "skillManagement.searchPlaceholder": "Search", "skillManagement.tags": "Tags", - "skillManagement.title": "Skills", - "agentDetail.configure.files.richTip": "Prompt に貼り付けるには長すぎる参考資料向けです: 仕様、テンプレート、ガイドライン。詳細を見る\n\nBuild モードでは、エージェントがこれらを設定できます。", - "agentDetail.configure.prompt.richTip": "Agent のロールと仕事の進め方を設定します。詳細を見る", - "agentDetail.configure.skills.workspaceSelector.empty": "スキルライブラリに一致するスキルはありません。", - "agentDetail.configure.skills.workspaceSelector.limitReached": "各 Agent には、スキルライブラリから最大 20 個のスキルを追加できます。スキルを 1 つ外してから、新しいスキルを追加してください。" + "skillManagement.title": "Skills" } diff --git a/web/i18n/ja-JP/skill.json b/web/i18n/ja-JP/skill.json index 86186767f66..670b6fb590b 100644 --- a/web/i18n/ja-JP/skill.json +++ b/web/i18n/ja-JP/skill.json @@ -1,29 +1,35 @@ { - "skillManagement.clearTags": "Clear tags", - "skillManagement.create": "Create", - "skillManagement.createFailed": "Failed to create skill.", - "skillManagement.createSuccess": "Skill created.", - "skillManagement.dateTimeFormat": "MMM D, YYYY HH:mm", + "skillManagement.clearTags": "タグをクリアする", + "skillManagement.create": "作成する", + "skillManagement.createFailed": "スキルの作成に失敗しました。", + "skillManagement.createSuccess": "ドラフトを作成しました。", + "skillManagement.dateTimeFormat": "MMM D、YYYY HH:mm", "skillManagement.deleteDialog.confirmInputLabel": "確認するには、下の入力欄に {{skillName}} と入力してください:", - "skillManagement.deleteDialog.confirmInputPlaceholder": "Skill の表示名を入力…", - "skillManagement.deleteDialog.description": "This skill will be removed from the workspace. Agents that reference it may lose access to this capability.", - "skillManagement.deleteDialog.title": "Delete {{name}}?", - "skillManagement.deleteFailed": "Failed to delete skill.", - "skillManagement.deleteSuccess": "Skill deleted.", - "skillManagement.detail.addMetadata": "Add metadata", - "skillManagement.detail.addMetadataDescription": "Add a frontmatter field to this Markdown file.", - "skillManagement.detail.addTag": "Add tag", - "skillManagement.detail.addTagDescription": "Create or bind a tag to this Skill. New tags are saved with the Skill metadata.", - "skillManagement.detail.addTagSuccess": "Tag added.", - "skillManagement.detail.back": "Back to Skills", + "skillManagement.deleteDialog.confirmInputPlaceholder": "スキルの表示名を入力", + "skillManagement.deleteDialog.description": "このスキルを削除すると元に戻せません。内容とすべてのバージョン履歴が完全に削除されます。現在、このスキルを使用している Agent はありません。", + "skillManagement.deleteDialog.referencedDescription_one": "単独またはワークフロー内の {{count}} 個の Agent がこのスキルを使用しています。削除すると、内容とすべてのバージョン履歴が完全に削除され、対象のすべての Agent からも取り除かれます。", + "skillManagement.deleteDialog.referencedDescription_other": "単独またはワークフロー内の {{count}} 個の Agent がこのスキルを使用しています。削除すると、内容とすべてのバージョン履歴が完全に削除され、対象のすべての Agent からも取り除かれます。", + "skillManagement.deleteDialog.title": "{{name}} を削除しますか?", + "skillManagement.deleteFailed": "スキルの削除に失敗しました。", + "skillManagement.deleteSuccess": "Skill が削除されました。", + "skillManagement.detail.addMetadata": "メタデータの追加", + "skillManagement.detail.addMetadataDescription": "この Markdown ファイルに、frontmatter フィールドを追加します。", + "skillManagement.detail.addTag": "タグを追加", + "skillManagement.detail.addTagDescription": "タグを作成するか、この Skill にバインドします。新しいタグは Skill メタデータとともに保存されます。", + "skillManagement.detail.addTagSuccess": "タグが追加されました。", + "skillManagement.detail.back": "Skills に戻る", "skillManagement.detail.builder.applyFailed": "ドラフトの更新を適用できませんでした。", "skillManagement.detail.builder.attach": "ファイルを添付", "skillManagement.detail.builder.attachFailed": "ファイルを添付できませんでした。", + "skillManagement.detail.builder.attachLimit": "最大 10 個のファイルを添付できます。", + "skillManagement.detail.builder.attachTooLarge": "ファイルは 15 MB 以下、画像は 10 MB 以下にしてください。", "skillManagement.detail.builder.attachUnsupported": "テキストファイルとドキュメントファイルのみ添付できます。", - "skillManagement.detail.builder.attachmentOnlyMessage": "添付ファイルの内容を使って、この Skill を改善してください。", + "skillManagement.detail.builder.attachmentOnlyMessage": "添付ファイルを使って、このスキルを改善してください。", "skillManagement.detail.builder.close": "Skill Builder を閉じる", "skillManagement.detail.builder.compatibleModelsOnly": "互換性のあるモデルのみ表示", - "skillManagement.detail.builder.editIntro": "この Skill の内容を確認しました。何を調整しますか?", + "skillManagement.detail.builder.copyResponse": "応答をコピーする", + "skillManagement.detail.builder.copySuccess": "応答がクリップボードにコピーされました。", + "skillManagement.detail.builder.editIntro": "このスキルを確認しました。何を調整しますか?", "skillManagement.detail.builder.exampleIssueTriage": "顧客問い合わせの優先度分類", "skillManagement.detail.builder.exampleOnboarding": "新入社員オンボーディングガイド", "skillManagement.detail.builder.exampleSalesFollowUp": "営業リードのフォローアップ戦略", @@ -44,9 +50,11 @@ "skillManagement.detail.builder.progress.readingDraft": "現在のドラフトを読み込み中", "skillManagement.detail.builder.progress.updatingEditor": "エディターを更新中", "skillManagement.detail.builder.promptDescription": "説明すると、手順やファイルを含むドラフトがエディターに作成されます。", - "skillManagement.detail.builder.promptTitle": "この Skill で何を扱いますか?", + "skillManagement.detail.builder.promptTitle": "このスキルで扱うタスクは何ですか?", + "skillManagement.detail.builder.readAloud": "応答を読み上げる", "skillManagement.detail.builder.removeAttachment": "{{name}} を削除", "skillManagement.detail.builder.restart": "Builder を再開始", + "skillManagement.detail.builder.retryResponse": "応答を再試行します", "skillManagement.detail.builder.send": "メッセージを送信", "skillManagement.detail.builder.sendFailed": "Skill Builder が応答できませんでした。", "skillManagement.detail.builder.thinking": "思考中", @@ -55,99 +63,149 @@ "skillManagement.detail.builder.tryExample": "例を試す", "skillManagement.detail.builder.voice": "音声入力", "skillManagement.detail.builder.voiceUnavailable": "音声入力はまだ利用できません。", - "skillManagement.detail.cancelAddMetadata": "Cancel adding metadata", - "skillManagement.detail.closeFileTab": "Close {{name}}", + "skillManagement.detail.cancelAddMetadata": "メタデータの追加をキャンセルします", + "skillManagement.detail.closeFileTab": "{{name}}を閉じる", + "skillManagement.detail.closeVersions": "バージョンを閉じる", "skillManagement.detail.collapseSidebar": "サイドバーを折りたたむ", "skillManagement.detail.copyContentSuccess": "内容をクリップボードにコピーしました。", "skillManagement.detail.copyFile": "コピー", "skillManagement.detail.copyFileSuccess": "ファイルを貼り付けできる状態にしました。", - "skillManagement.detail.createFile": "New file", - "skillManagement.detail.createFileDescription": "Enter a file path relative to the skill root.", - "skillManagement.detail.createFileMenu": "New file...", - "skillManagement.detail.createFileSuccess": "File created.", - "skillManagement.detail.createFolder": "New folder", - "skillManagement.detail.createFolderDescription": "Enter a folder path relative to the skill root.", - "skillManagement.detail.createFolderMenu": "New folder...", - "skillManagement.detail.createFolderSuccess": "Folder created.", - "skillManagement.detail.createdBy": "Created by {{name}}", - "skillManagement.detail.currentDraft": "Current draft", + "skillManagement.detail.copyVersionId": "IDをコピー", + "skillManagement.detail.copyVersionIdSuccess": "ID がクリップボードにコピーされました。", + "skillManagement.detail.createFile": "新しいファイル", + "skillManagement.detail.createFileDescription": "スキル ルートからの相対ファイル パスを入力します。", + "skillManagement.detail.createFileMenu": "新しいファイル...", + "skillManagement.detail.createFileSuccess": "ファイルが作成されました。", + "skillManagement.detail.createFolder": "新しいフォルダー", + "skillManagement.detail.createFolderDescription": "", + "skillManagement.detail.createFolderMenu": "新しいフォルダ...", + "skillManagement.detail.createFolderSuccess": "フォルダーが作成されました。", + "skillManagement.detail.createdBy": "作成者: {{name}}", + "skillManagement.detail.currentDraft": "現在のドラフト", "skillManagement.detail.cutFile": "切り取り", "skillManagement.detail.cutFileSuccess": "ファイルを移動できる状態にしました。", - "skillManagement.detail.deleteFileConfirm": "Delete this file?", - "skillManagement.detail.deleteFileSuccess": "File deleted.", - "skillManagement.detail.deleteVersionConfirm": "Delete this version?", - "skillManagement.detail.deleteVersionFailed": "Failed to delete version.", - "skillManagement.detail.deleteVersionSuccess": "Version deleted.", - "skillManagement.detail.downloadFile": "Download file", - "skillManagement.detail.draft": "Draft", + "skillManagement.detail.deleteFileConfirm": "このファイルを削除しますか?", + "skillManagement.detail.deleteFileSuccess": "ファイルが削除されました。", + "skillManagement.detail.deleteVersionConfirm": "このバージョンを削除しますか?", + "skillManagement.detail.deleteVersionFailed": "", + "skillManagement.detail.deleteVersionSuccess": "バージョンが削除されました。", + "skillManagement.detail.downloadFile": "ファイルをダウンロードする", + "skillManagement.detail.draft": "ドラフト", + "skillManagement.detail.editVersionInfo": "バージョン情報を編集", + "skillManagement.detail.exitVersions": "バージョンを終了", "skillManagement.detail.expandSidebar": "サイドバーを展開", - "skillManagement.detail.fileCount": "{{count}} FILES", - "skillManagement.detail.fileMeta": "{{type}} · {{size}} bytes", - "skillManagement.detail.fileMissing": "File not found.", - "skillManagement.detail.fileOperationFailed": "File operation failed.", - "skillManagement.detail.files": "Files", - "skillManagement.detail.latest": "Latest", - "skillManagement.detail.loadFailed": "Failed to load skill.", + "skillManagement.detail.fileAlreadyExists": "この名前のファイルまたはフォルダーはすでに存在します。", + "skillManagement.detail.fileCount_one": "{{count}} 個のファイル", + "skillManagement.detail.fileCount_other": "{{count}} 個のファイル", + "skillManagement.detail.fileMeta": "{{type}} · {{size}} バイト", + "skillManagement.detail.fileMissing": "ファイルが見つかりません。", + "skillManagement.detail.fileOperationFailed": "ファイル操作に失敗しました。", + "skillManagement.detail.files": "ファイル", + "skillManagement.detail.latest": "最新の", + "skillManagement.detail.loadFailed": "", "skillManagement.detail.loadingTags": "タグを読み込み中...", - "skillManagement.detail.markdownLiveMode": "Live preview", - "skillManagement.detail.markdownSourceMode": "Source editor", - "skillManagement.detail.metadataKey": "name", - "skillManagement.detail.metadataValue": "value", - "skillManagement.detail.moveFileSuccess": "File moved.", - "skillManagement.detail.moveFilesSuccess": "Files moved.", - "skillManagement.detail.noFileSelected": "Select a file to preview.", - "skillManagement.detail.noFiles": "No files.", + "skillManagement.detail.markdownLiveMode": "", + "skillManagement.detail.markdownSourceMode": "ソースエディタ", + "skillManagement.detail.metadataKey": "名前", + "skillManagement.detail.metadataValue": "価値", + "skillManagement.detail.moveFileSuccess": "ファイルが移動されました。", + "skillManagement.detail.moveFilesSuccess": "ファイルが移動されました。", + "skillManagement.detail.nameThisVersion": "バージョン名を付ける", + "skillManagement.detail.noFileSelected": "プレビューするファイルを選択します。", + "skillManagement.detail.noFiles": "ファイルがありません。", "skillManagement.detail.noSearchResults": "一致するファイルはありません。", "skillManagement.detail.noSelectableTags": "利用可能なタグはありません。", - "skillManagement.detail.noVersions": "No published versions yet.", + "skillManagement.detail.noVersions": "まだ公開されたバージョンはありません。", "skillManagement.detail.pasteFile": "貼り付け", "skillManagement.detail.pasteFileSuccess": "ファイルを貼り付けました。", - "skillManagement.detail.previewUnsupported": "Preview is not supported for this file.", - "skillManagement.detail.publish": "Publish", - "skillManagement.detail.publishFailed": "Failed to publish skill.", - "skillManagement.detail.publishSuccess": "Skill published.", - "skillManagement.detail.published": "Published", + "skillManagement.detail.previewUnsupported": "ファイルはプレビューに対応していません。", + "skillManagement.detail.publish": "公開", + "skillManagement.detail.publishFailed": "スキルの公開に失敗しました。", + "skillManagement.detail.publishReferencesDescription_one": "公開すると、このスキルを使用している {{count}} 個の Agent に新しいバージョンがすぐに反映されます。", + "skillManagement.detail.publishReferencesDescription_other": "公開すると、このスキルを使用している {{count}} 個の Agent に新しいバージョンがすぐに反映されます。", + "skillManagement.detail.publishReferencesTitle": "スキルの公開", + "skillManagement.detail.publishSuccess": "Skill が公開されました。", + "skillManagement.detail.publishUpdate": "更新を公開", + "skillManagement.detail.published": "公開済み", "skillManagement.detail.publishedAt": "{{time}}に公開", + "skillManagement.detail.publishedVersion": "#{{number}} を公開しました", "skillManagement.detail.publishing": "公開中...", - "skillManagement.detail.readonly": "Read only", - "skillManagement.detail.referenceFiles.confirm": "Enter Confirm", - "skillManagement.detail.referenceFiles.empty": "No files available.", - "skillManagement.detail.referenceFiles.livePlaceholder": "Write instructions for the agent, type / to reference files", - "skillManagement.detail.referenceFiles.navigate": "↑↓ Navigate", - "skillManagement.detail.referenceFiles.title": "Reference files", - "skillManagement.detail.referencedBy": "Referenced by {{count}} Apps", - "skillManagement.detail.removeMetadata": "Delete {{name}} metadata", - "skillManagement.detail.removeTag": "Remove {{tag}}", - "skillManagement.detail.removeTagSuccess": "Tag removed.", - "skillManagement.detail.renameFile": "Rename file", - "skillManagement.detail.renameFileDescription": "Enter the new path relative to the skill root.", - "skillManagement.detail.renameFileSuccess": "File renamed.", - "skillManagement.detail.renameSkillSuccess": "Skill renamed.", - "skillManagement.detail.renameVersion": "Rename", - "skillManagement.detail.renameVersionFailed": "Failed to rename version.", - "skillManagement.detail.renameVersionPrompt": "Version name", - "skillManagement.detail.renameVersionSuccess": "Version renamed.", - "skillManagement.detail.restoreVersion": "Restore", - "skillManagement.detail.restoreVersionFailed": "Failed to restore version.", - "skillManagement.detail.restoreVersionSuccess": "Version restored to draft.", - "skillManagement.detail.save": "Save", - "skillManagement.detail.saveFailed": "Failed to save file.", - "skillManagement.detail.saveSuccess": "File saved.", - "skillManagement.detail.saved": "Saved", - "skillManagement.detail.savedAt": "Saved {{time}}", - "skillManagement.detail.saving": "Saving...", + "skillManagement.detail.readonly": "読み取り専用", + "skillManagement.detail.referenceFiles.confirm": "入力 確認", + "skillManagement.detail.referenceFiles.empty": "利用可能なファイルがありません。", + "skillManagement.detail.referenceFiles.livePlaceholder": "Agent への指示を記述してください。/ を入力するとファイルを参照できます。", + "skillManagement.detail.referenceFiles.navigate": "↑↓ナビゲート", + "skillManagement.detail.referenceFiles.title": "参照ファイル", + "skillManagement.detail.referencedBy_one": "{{count}} 個の Agent が使用中", + "skillManagement.detail.referencedBy_other": "{{count}} 個の Agent が使用中", + "skillManagement.detail.removeMetadata": "{{name}} メタデータを削除する", + "skillManagement.detail.removeTag": "{{tag}} を削除", + "skillManagement.detail.removeTagSuccess": "タグは外しました。", + "skillManagement.detail.renameFile": "ファイル名の変更", + "skillManagement.detail.renameFileDescription": "スキル ルートを基準とした新しいパスを入力します。", + "skillManagement.detail.renameFileSuccess": "ファイル名が変更されました。", + "skillManagement.detail.renameSkillSuccess": "Skill の名前が変更されました。", + "skillManagement.detail.renameVersion": "名前の変更", + "skillManagement.detail.renameVersionFailed": "バージョン名の変更に失敗しました。", + "skillManagement.detail.renameVersionPrompt": "バージョン名", + "skillManagement.detail.renameVersionSuccess": "バージョン名が変更されました。", + "skillManagement.detail.resizeSidebar": "ファイルのサイドバーのサイズを変更する", + "skillManagement.detail.restoreVersion": "復元", + "skillManagement.detail.restoreVersionConfirmDescription": "これにより、現在のドラフトが「{{version}}」のファイルに置き換えられます。 Skill を公開したり、新しいバージョンを作成したりすることはありません。", + "skillManagement.detail.restoreVersionConfirmTitle": "このバージョンを復元しますか?", + "skillManagement.detail.restoreVersionFailed": "バージョンの復元に失敗しました。", + "skillManagement.detail.restoreVersionSuccess": "バージョンはドラフトに復元されました。", + "skillManagement.detail.save": "保存", + "skillManagement.detail.saveConflictConfirmDescription": "このスキルは別の場所で更新されました。編集を続けるには、最新のドラフトを読み込んでください。現在の変更内容は破棄されます。", + "skillManagement.detail.saveConflictConfirmTitle": "最新のドラフトをロードしますか?", + "skillManagement.detail.saveConflictReload": "最新のドラフトをロードする", + "skillManagement.detail.saveConflictStatus": "競合が検出されました。編集を続けるには、最新のドラフトをロードしてください。", + "skillManagement.detail.saveFailed": "ファイルの保存に失敗しました。", + "skillManagement.detail.saveSuccess": "ファイルが保存されました。", + "skillManagement.detail.saved": "保存済み", + "skillManagement.detail.savedAt": "{{time}} に保存", + "skillManagement.detail.saving": "保存中...", "skillManagement.detail.searchFiles": "ファイルを検索", "skillManagement.detail.showMoreReferences": "さらに {{count}} 件を表示", - "skillManagement.detail.skillDescriptionPlaceholder": "この Skill の用途と、Agent がいつ使うべきかを説明します。", - "skillManagement.detail.skillNamePlaceholder": "この Skill に名前を付けます。小文字、数字、ハイフンのみ使用できます。エクスポート時のフォルダー名になります", + "skillManagement.detail.skillDescriptionPlaceholder": "このスキルの用途と、Agent が使用するタイミングを説明してください。", + "skillManagement.detail.skillNamePlaceholder": "使用できる文字は英小文字、数字、ハイフンのみです。", "skillManagement.detail.unpublishedChanges": "未公開の変更", - "skillManagement.detail.unsavedChanges": "Unsaved changes", + "skillManagement.detail.unsavedChanges": "未保存の変更", "skillManagement.detail.upToDate": "最新", - "skillManagement.detail.updateTagsFailed": "Failed to update tags.", - "skillManagement.detail.uploadFile": "Upload file", - "skillManagement.detail.uploadFileFailed": "File upload failed.", - "skillManagement.detail.uploadFileSuccess": "File uploaded.", - "skillManagement.detail.uploadFilesMenu": "Upload files...", + "skillManagement.detail.updateTagsFailed": "タグの更新に失敗しました。", + "skillManagement.detail.uploadCheckFailed": "これらのファイルを確認できませんでした。もう一度やり直してください。", + "skillManagement.detail.uploadConflict": "この名前のファイルはすでに存在します。", + "skillManagement.detail.uploadFailureSummary": "{{failed}}/{{total}} ファイルが失敗しました", + "skillManagement.detail.uploadFailureTitle": "一部のアップロードに失敗しました", + "skillManagement.detail.uploadFile": "ファイルをアップロード", + "skillManagement.detail.uploadFileFailed": "ファイルのアップロードに失敗しました。", + "skillManagement.detail.uploadFileSuccess": "ファイルをアップロードしました。", + "skillManagement.detail.uploadFilesButton": "{{count}} ファイルをアップロードする", + "skillManagement.detail.uploadFilesFailedStatus_one": "{{count}} ファイルのアップロードに失敗しました。", + "skillManagement.detail.uploadFilesFailedStatus_other": "{{count}} ファイルのアップロードに失敗しました。", + "skillManagement.detail.uploadFilesMenu": "ファイルをアップロード...", + "skillManagement.detail.uploadFilesProgress": "{{completed}}/{{total}} をアップロードしています", + "skillManagement.detail.uploadFilesResult": "{{uploaded}} がアップロードされました · {{failed}} は失敗しました", + "skillManagement.detail.uploadFilesStatus": "アップロードステータス", + "skillManagement.detail.uploadInvalidExtension": "このファイルの種類はサポートされていません。", + "skillManagement.detail.uploadInvalidName": "無効な名前です。", + "skillManagement.detail.uploadInvalidPath": "無効なファイルパスです。", + "skillManagement.detail.uploadKeepBoth": "両方とも保管しておいてください", + "skillManagement.detail.uploadLateConflict": "アップロード中に誰かがこのファイルを追加しました。", + "skillManagement.detail.uploadMissingExtension": "ファイル拡張子は必須です。", + "skillManagement.detail.uploadNetworkFailure": "アップロードに失敗しました。接続を確認してください。", + "skillManagement.detail.uploadReadySummary": "{{ready}} 準備完了 · {{decisions}} は決定が必要 · {{skipped}} はスキップされます", + "skillManagement.detail.uploadReplace": "交換する", + "skillManagement.detail.uploadResolvedSummary": "{{ready}} 準備完了 · {{skipped}} はスキップされます", + "skillManagement.detail.uploadRetryCount": "{{count}}を再試行してください", + "skillManagement.detail.uploadReviewTitle": "アップロードする前に確認する", + "skillManagement.detail.uploadSkip": "スキップ", + "skillManagement.detail.uploadSkippedGroup": "{{count}} ファイルはアップロードできないためスキップされます", + "skillManagement.detail.uploadStatusDismiss": "アップロードステータスを閉じる", + "skillManagement.detail.uploadSuggestion": "提案を使用する", + "skillManagement.detail.uploadWillReplace": "既存のファイルを置き換えます", + "skillManagement.detail.uploadWillUseName": "{{name}}としてアップロードします", + "skillManagement.detail.versionHistory": "バージョン履歴を開く", "skillManagement.detail.versionMeta": "{{hash}} · {{time}}", "skillManagement.detail.versionPublishNote": "リリースノート", "skillManagement.detail.versionPublishNotePlaceholder": "この変更について説明してください", diff --git a/web/i18n/ko-KR/agent-v-2.json b/web/i18n/ko-KR/agent-v-2.json index 02f1ff0ebb4..d170aa9af2b 100644 --- a/web/i18n/ko-KR/agent-v-2.json +++ b/web/i18n/ko-KR/agent-v-2.json @@ -83,7 +83,7 @@ "agentDetail.configure.buildDraft.changesToApply_other": "적용할 변경 사항 {{count}}개", "agentDetail.configure.buildDraft.discard": "폐기", "agentDetail.configure.buildDraft.modeBadge": "빌드 모드", - "agentDetail.configure.buildDraft.modeDescription": "빌드 모드입니다. 이 모드에서는 에이전트만 Configure를 업데이트할 수 있습니다. 오른쪽 채팅으로 이 설정을 다듬은 뒤 적용하세요.", + "agentDetail.configure.buildDraft.modeDescription": "빌드 모드입니다. 에이전트와 채팅하며 이 설정을 구성한 다음 적용하세요.", "agentDetail.configure.buildDraft.rewritten": "다시 작성됨", "agentDetail.configure.buildDraft.title": "빌드 초안", "agentDetail.configure.buildDraft.updated": "업데이트됨", @@ -105,7 +105,8 @@ "agentDetail.configure.files.preview.failed": "미리보기를 불러오지 못했습니다.", "agentDetail.configure.files.preview.unsupported": "이 파일은 미리보기를 지원하지 않습니다.", "agentDetail.configure.files.remove": "{{name}} 제거", - "agentDetail.configure.files.tip": "Prompt에 붙여넣기에는 너무 긴 참고 자료용입니다: 사양, 템플릿, 가이드라인. Prompt에서 /로 참조하세요.\n\nBuild mode에서는 에이전트가 이를 대신 설정할 수 있습니다.", + "agentDetail.configure.files.richTip": "Prompt에 붙여넣기에는 너무 긴 참고 자료용입니다: 사양, 템플릿, 가이드라인. 자세히 알아보기\n\nBuild mode에서는 에이전트가 이를 대신 설정할 수 있습니다.", + "agentDetail.configure.files.tip": "Prompt에 붙여넣기에는 너무 긴 참고 자료용입니다: 사양, 템플릿, 가이드라인. 자세히 알아보기\n\nBuild mode에서는 에이전트가 이를 대신 설정할 수 있습니다.", "agentDetail.configure.files.toggle": "파일 전환", "agentDetail.configure.files.treeLabel": "에이전트 파일", "agentDetail.configure.files.upload.action": "업로드", @@ -114,7 +115,7 @@ "agentDetail.configure.files.upload.dropzone": "파일을 여기에 놓거나", "agentDetail.configure.files.upload.failed": "파일 업로드에 실패했습니다.", "agentDetail.configure.files.upload.fileType": "FILE", - "agentDetail.configure.files.upload.invalidFile": "파일 하나를 업로드하세요.", + "agentDetail.configure.files.upload.invalidFile": "한 번에 하나의 파일만 업로드할 수 있습니다.", "agentDetail.configure.files.upload.success": "파일을 업로드했습니다.", "agentDetail.configure.files.upload.title": "파일 업로드", "agentDetail.configure.knowledgeRetrieval.add": "지식 검색 추가", @@ -177,7 +178,8 @@ "agentDetail.configure.prompt.mention.priyaRamanathan": "Priya Ramanathan", "agentDetail.configure.prompt.placeholder": "여기에 지시 사항을 작성하세요,", "agentDetail.configure.prompt.referenceMissing": "{{name}}이(가) 존재하지 않습니다", - "agentDetail.configure.prompt.tip": "에이전트의 역할을 정의하고 일반적인 작업을 설명합니다. /를 사용해 스킬, 파일, 도구, 지식 검색을 명시적으로 참조하세요.", + "agentDetail.configure.prompt.richTip": "에이전트의 역할과 작업 방식을 정의합니다. 자세히 알아보기", + "agentDetail.configure.prompt.tip": "에이전트의 역할과 작업 방식을 정의합니다. 자세히 알아보기", "agentDetail.configure.publishBar.draft": "초안", "agentDetail.configure.publishBar.publishUpdate": "업데이트 게시", "agentDetail.configure.publishBar.published": "게시됨", @@ -190,8 +192,8 @@ "agentDetail.configure.publishBar.versionHistory": "버전 기록 열기", "agentDetail.configure.publishImpact.affectedWorkflows": "영향을 받는 워크플로", "agentDetail.configure.publishImpact.cancel": "취소", - "agentDetail.configure.publishImpact.descriptionPrefix": "에이전트가", - "agentDetail.configure.publishImpact.descriptionSuffix": "에 표시됩니다. 변경 사항이 이에 영향을 미칩니다.", + "agentDetail.configure.publishImpact.descriptionPrefix": "이 에이전트는", + "agentDetail.configure.publishImpact.descriptionSuffix": "에서 사용됩니다. 게시하면 모든 워크플로에서 업데이트됩니다.", "agentDetail.configure.publishImpact.fallbackAgentName": "이 에이전트", "agentDetail.configure.publishImpact.title": "{{name}}에 {{action}}", "agentDetail.configure.publishImpact.workflowCount_one": "워크플로 {{count}}개", @@ -222,8 +224,8 @@ "agentDetail.configure.skills.openInLibrary": "Open in Skill library", "agentDetail.configure.skills.remove": "{{name}} 제거", "agentDetail.configure.skills.removeAction": "Remove", - "agentDetail.configure.skills.richTip": "반복 작업에 필요한 지침, 파일, 스크립트를 Skill로 패키징하세요. Prompt에서 /로 참조하세요. 자세히 알아보기\n\nBuild mode에서는 에이전트가 이를 대신 설정할 수 있습니다.", - "agentDetail.configure.skills.tip": "반복 작업에 필요한 지침, 파일, 스크립트를 Skill로 패키징하세요. Prompt에서 /로 참조하세요. 자세히 알아보기\n\nBuild mode에서는 에이전트가 이를 대신 설정할 수 있습니다.", + "agentDetail.configure.skills.richTip": "반복 작업에 필요한 지침, 파일, 스크립트를 Skill로 패키징하세요. 자세히 알아보기\n\nBuild mode에서는 에이전트가 이를 대신 설정할 수 있습니다.", + "agentDetail.configure.skills.tip": "반복 작업에 필요한 지침, 파일, 스크립트를 Skill로 패키징하세요. 자세히 알아보기\n\nBuild mode에서는 에이전트가 이를 대신 설정할 수 있습니다.", "agentDetail.configure.skills.toggle": "스킬 전환", "agentDetail.configure.skills.upload.action": "업로드", "agentDetail.configure.skills.upload.browse": "찾아보기", @@ -269,8 +271,8 @@ "agentDetail.configure.tools.moreActions": "{{name}}의 추가 작업", "agentDetail.configure.tools.removeAction": "{{name}} 제거", "agentDetail.configure.tools.removeProvider": "모든 도구 제거", - "agentDetail.configure.tools.richTip": "워크스페이스의 Dify 도구를 추가하세요. Prompt에서 /로 참조하세요. 자세히 알아보기\n\n에이전트가 sandbox에 설치한 도구는 여기에 표시되지 않지만 계속 사용할 수 있습니다.", - "agentDetail.configure.tools.tip": "워크스페이스의 Dify 도구를 추가하세요. Prompt에서 /로 참조하세요. 자세히 알아보기\n\n에이전트가 sandbox에 설치한 도구는 여기에 표시되지 않지만 계속 사용할 수 있습니다.", + "agentDetail.configure.tools.richTip": "워크스페이스의 Dify 도구를 추가하세요. 자세히 알아보기\n\n에이전트가 sandbox에 설치한 도구는 여기에 표시되지 않지만 계속 사용할 수 있습니다.", + "agentDetail.configure.tools.tip": "워크스페이스의 Dify 도구를 추가하세요. 자세히 알아보기\n\n에이전트가 sandbox에 설치한 도구는 여기에 표시되지 않지만 계속 사용할 수 있습니다.", "agentDetail.configure.tools.toggle": "도구 전환", "agentDetail.configure.tools.toolTabs.all": "전체", "agentDetail.configure.tools.toolTabs.cli": "CLI", @@ -336,22 +338,22 @@ "agentDetail.metadata.sourceLabel": "소스", "agentDetail.monitoring.change": "이전 기간 대비 {{value}}", "agentDetail.monitoring.dateRangeLabel": "날짜 범위", - "agentDetail.monitoring.description": "워크플로 전반에 걸친 재사용 가능한 에이전트의 활동, 비용 및 상호 작용 품질을 추적합니다.", + "agentDetail.monitoring.description": "모든 액세스 지점에서 이 에이전트의 활동, 비용 및 상호 작용 품질을 추적합니다.", "agentDetail.monitoring.learnMore": "자세히 알아보기", "agentDetail.monitoring.loadFailed": "모니터링 데이터를 불러오지 못했습니다", - "agentDetail.monitoring.metrics.activeUsers.explanation": "이 에이전트를 사용하는 워크플로를 트리거한 고유 최종 사용자 수.", + "agentDetail.monitoring.metrics.activeUsers.explanation": "이 에이전트와 상호 작용한 고유 최종 사용자 수.", "agentDetail.monitoring.metrics.activeUsers.title": "활성 사용자", - "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "이 액세스 지점에서의 사용자-에이전트 연속 통신 횟수.", + "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "대화당 평균 사용자 메시지 수.", "agentDetail.monitoring.metrics.avgSessionInteractions.title": "평균 세션 상호 작용", - "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "요청 시작부터 완료까지의 평균 출력 속도.", + "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "에이전트 응답 중 초당 생성된 평균 토큰 수.", "agentDetail.monitoring.metrics.tokenOutputSpeed.title": "토큰 출력 속도", - "agentDetail.monitoring.metrics.tokenUsage.explanation": "워크플로 실행 전반에서 이 에이전트가 생성한 예상 토큰 비용.", + "agentDetail.monitoring.metrics.tokenUsage.explanation": "사용된 토큰 수와 예상 비용.", "agentDetail.monitoring.metrics.tokenUsage.title": "토큰 사용량", "agentDetail.monitoring.metrics.totalConversations.explanation": "선택한 액세스 지점을 통해 이 에이전트에 도달한 일일 AI 대화 수.", "agentDetail.monitoring.metrics.totalConversations.title": "총 대화 수", - "agentDetail.monitoring.metrics.totalMessages.explanation": "일일 에이전트 상호 작용 수.", + "agentDetail.monitoring.metrics.totalMessages.explanation": "이 에이전트에 전송된 사용자 메시지의 총수.", "agentDetail.monitoring.metrics.totalMessages.title": "총 메시지 수", - "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "이 에이전트에 대한 메시지 1,000 개당 좋아요 수.", + "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "사용자가 좋아요를 표시한 에이전트 응답의 비율.", "agentDetail.monitoring.metrics.userSatisfactionRate.title": "사용자 만족도", "agentDetail.monitoring.pickSource": "앱 선택", "agentDetail.monitoring.sourceLabel": "앱", @@ -549,7 +551,5 @@ "skillManagement.searchLabel": "Search skills", "skillManagement.searchPlaceholder": "Search", "skillManagement.tags": "Tags", - "skillManagement.title": "Skills", - "agentDetail.configure.files.richTip": "Prompt에 붙여넣기에는 너무 긴 참고 자료용입니다: 사양, 템플릿, 가이드라인. 자세히 알아보기\n\nBuild mode에서는 에이전트가 이를 대신 설정할 수 있습니다.", - "agentDetail.configure.prompt.richTip": "에이전트의 역할과 작업 방식을 정의합니다. 자세히 알아보기" + "skillManagement.title": "Skills" } diff --git a/web/i18n/ko-KR/skill.json b/web/i18n/ko-KR/skill.json index b565e1852a5..5996e37586d 100644 --- a/web/i18n/ko-KR/skill.json +++ b/web/i18n/ko-KR/skill.json @@ -1,121 +1,245 @@ { - "skillManagement.clearTags": "Clear tags", - "skillManagement.create": "Create", - "skillManagement.createFailed": "Failed to create skill.", - "skillManagement.createSuccess": "Skill created.", + "skillManagement.clearTags": "태그 지우기", + "skillManagement.create": "만들기", + "skillManagement.createFailed": "스킬 생성에 실패했습니다.", + "skillManagement.createSuccess": "초안이 생성되었습니다.", "skillManagement.dateTimeFormat": "MMM D, YYYY HH:mm", "skillManagement.deleteDialog.confirmInputLabel": "확인하려면 아래 입력란에 {{skillName}}을 입력하세요:", "skillManagement.deleteDialog.confirmInputPlaceholder": "Skill 표시 이름 입력…", - "skillManagement.deleteDialog.description": "This skill will be removed from the workspace. Agents that reference it may lose access to this capability.", - "skillManagement.deleteDialog.title": "Delete {{name}}?", - "skillManagement.deleteFailed": "Failed to delete skill.", - "skillManagement.deleteSuccess": "Skill deleted.", - "skillManagement.detail.addMetadata": "Add metadata", - "skillManagement.detail.addMetadataDescription": "Add a frontmatter field to this Markdown file.", - "skillManagement.detail.addTag": "Add tag", - "skillManagement.detail.addTagDescription": "Create or bind a tag to this Skill. New tags are saved with the Skill metadata.", - "skillManagement.detail.addTagSuccess": "Tag added.", - "skillManagement.detail.back": "Back to Skills", - "skillManagement.detail.cancelAddMetadata": "Cancel adding metadata", - "skillManagement.detail.closeFileTab": "Close {{name}}", + "skillManagement.deleteDialog.description": "스킬을 삭제하면 되돌릴 수 없습니다. 콘텐츠와 전체 버전 기록이 영구적으로 삭제됩니다. 현재 사용 중인 상담원이 없습니다.", + "skillManagement.deleteDialog.referencedDescription_one": "{{count}} 에이전트는 이 기술을 독립적으로 또는 워크플로에서 사용하고 있습니다. 이 스킬을 삭제하면 해당 콘텐츠와 버전 기록이 영구적으로 지워지고 영향을 받는 에이전트에서 제거됩니다.", + "skillManagement.deleteDialog.referencedDescription_other": "{{count}} 상담원은 이 기술을 독립적으로 또는 워크플로에서 사용하고 있습니다. 이 스킬을 삭제하면 해당 콘텐츠와 버전 기록이 영구적으로 지워지고 영향을 받는 모든 에이전트에서 제거됩니다.", + "skillManagement.deleteDialog.title": "{{name}}을(를) 삭제하시겠습니까?", + "skillManagement.deleteFailed": "스킬 삭제에 실패했습니다.", + "skillManagement.deleteSuccess": "Skill이(가) 삭제되었습니다.", + "skillManagement.detail.addMetadata": "메타데이터 추가", + "skillManagement.detail.addMetadataDescription": "이 Markdown 파일에 머리말 필드를 추가합니다.", + "skillManagement.detail.addTag": "태그 추가", + "skillManagement.detail.addTagDescription": "이 Skill에 태그를 생성하거나 바인딩하세요. 새 태그는 Skill 메타데이터와 함께 저장됩니다.", + "skillManagement.detail.addTagSuccess": "태그가 추가되었습니다.", + "skillManagement.detail.back": "Skills(으)로 돌아가기", + "skillManagement.detail.builder.applyFailed": "초안 업데이트를 적용하지 못했습니다.", + "skillManagement.detail.builder.attach": "파일첨부", + "skillManagement.detail.builder.attachFailed": "파일을 첨부하지 못했습니다.", + "skillManagement.detail.builder.attachLimit": "최대 10개의 파일을 첨부할 수 있습니다.", + "skillManagement.detail.builder.attachTooLarge": "파일은 15MB 이하여야 합니다. 이미지는 10MB 이하여야 합니다.", + "skillManagement.detail.builder.attachUnsupported": "이미지, 텍스트, 문서 파일만 첨부 가능합니다.", + "skillManagement.detail.builder.attachmentOnlyMessage": "첨부파일을 활용하시면 이 스킬을 향상하는데 도움이 됩니다.", + "skillManagement.detail.builder.close": "Skill Builder 닫기", + "skillManagement.detail.builder.compatibleModelsOnly": "호환되는 모델만 표시됩니다", + "skillManagement.detail.builder.copyResponse": "응답 복사", + "skillManagement.detail.builder.copySuccess": "응답이 클립보드에 복사되었습니다.", + "skillManagement.detail.builder.editIntro": "이 스킬을 리뷰해봤습니다. 무엇을 조정하시겠습니까?", + "skillManagement.detail.builder.exampleIssueTriage": "고객 문제 분류", + "skillManagement.detail.builder.exampleOnboarding": "신입사원 온보딩 가이드", + "skillManagement.detail.builder.exampleSalesFollowUp": "영업 리드 후속 전략", + "skillManagement.detail.builder.followUpDisplayName": "표시 이름으로 환불 승인을 사용하세요.", + "skillManagement.detail.builder.followUpNameIcon": "제안된 이름과 아이콘을 적용하세요.", + "skillManagement.detail.builder.fromMarketplace": "마켓플레이스에서", + "skillManagement.detail.builder.model": "GPT-4o", + "skillManagement.detail.builder.modelCredits.all": "모든 학점", + "skillManagement.detail.builder.modelCredits.configure": "구성 필요", + "skillManagement.detail.builder.modelCredits.exhausted": "할당량이 다 사용되었습니다", + "skillManagement.detail.builder.modelProviderSettings": "모델 공급자 설정", + "skillManagement.detail.builder.modelSearch": "모델 검색...", + "skillManagement.detail.builder.modifyPlaceholder": "AI에게 이 스킬을 수정해달라고 요청하세요...", + "skillManagement.detail.builder.open": "Skill Builder 열기", + "skillManagement.detail.builder.placeholder": "시나리오를 설명해보세요..", + "skillManagement.detail.builder.progress.applyingChanges": "파일 변경사항 적용", + "skillManagement.detail.builder.progress.generatingPlan": "업데이트 계획 생성", + "skillManagement.detail.builder.progress.readingDraft": "현재 초안 읽기", + "skillManagement.detail.builder.progress.updatingEditor": "편집기 업데이트", + "skillManagement.detail.builder.promptDescription": "설명하면 단계와 파일이 포함된 초안이 편집기에 나타납니다.", + "skillManagement.detail.builder.promptTitle": "이 스킬은 무엇을 처리해야 합니까?", + "skillManagement.detail.builder.readAloud": "응답을 소리내어 읽기", + "skillManagement.detail.builder.removeAttachment": "{{name}} 제거", + "skillManagement.detail.builder.restart": "빌더 다시 시작", + "skillManagement.detail.builder.retryResponse": "응답 재시도", + "skillManagement.detail.builder.send": "메시지 보내기", + "skillManagement.detail.builder.sendFailed": "Skill Builder가 응답하지 못했습니다.", + "skillManagement.detail.builder.thinking": "생각 중", + "skillManagement.detail.builder.thinkingUnavailable": "모델이 사고 콘텐츠를 반환하지 않았습니다.", + "skillManagement.detail.builder.title": "Skill Builder", + "skillManagement.detail.builder.tryExample": "예시를 들어보세요", + "skillManagement.detail.builder.voice": "음성 입력", + "skillManagement.detail.builder.voiceUnavailable": "아직 음성 입력을 사용할 수 없습니다.", + "skillManagement.detail.cancelAddMetadata": "메타데이터 추가 취소", + "skillManagement.detail.closeFileTab": "{{name}} 닫기", + "skillManagement.detail.closeVersions": "버전 닫기", "skillManagement.detail.collapseSidebar": "사이드바 접기", - "skillManagement.detail.createFile": "New file", - "skillManagement.detail.createFileDescription": "Enter a file path relative to the skill root.", - "skillManagement.detail.createFileMenu": "New file...", - "skillManagement.detail.createFileSuccess": "File created.", - "skillManagement.detail.createFolder": "New folder", - "skillManagement.detail.createFolderDescription": "Enter a folder path relative to the skill root.", - "skillManagement.detail.createFolderMenu": "New folder...", - "skillManagement.detail.createFolderSuccess": "Folder created.", - "skillManagement.detail.createdBy": "Created by {{name}}", - "skillManagement.detail.currentDraft": "Current draft", - "skillManagement.detail.deleteFileConfirm": "Delete this file?", - "skillManagement.detail.deleteFileSuccess": "File deleted.", - "skillManagement.detail.deleteVersionConfirm": "Delete this version?", - "skillManagement.detail.deleteVersionFailed": "Failed to delete version.", - "skillManagement.detail.deleteVersionSuccess": "Version deleted.", - "skillManagement.detail.downloadFile": "Download file", - "skillManagement.detail.draft": "Draft", + "skillManagement.detail.copyContentSuccess": "콘텐츠가 클립보드에 복사되었습니다.", + "skillManagement.detail.copyFile": "복사", + "skillManagement.detail.copyFileSuccess": "파일을 붙여넣을 준비가 되었습니다.", + "skillManagement.detail.copyVersionId": "ID 복사", + "skillManagement.detail.copyVersionIdSuccess": "ID가 클립보드에 복사되었습니다.", + "skillManagement.detail.createFile": "새 파일", + "skillManagement.detail.createFileDescription": "스킬 루트를 기준으로 파일 경로를 입력하세요.", + "skillManagement.detail.createFileMenu": "새 파일...", + "skillManagement.detail.createFileSuccess": "파일이 생성되었습니다.", + "skillManagement.detail.createFolder": "새 폴더", + "skillManagement.detail.createFolderDescription": "스킬 루트를 기준으로 폴더 경로를 입력하세요.", + "skillManagement.detail.createFolderMenu": "새 폴더...", + "skillManagement.detail.createFolderSuccess": "폴더가 생성되었습니다.", + "skillManagement.detail.createdBy": "작성자: {{name}}", + "skillManagement.detail.currentDraft": "현재 초안", + "skillManagement.detail.cutFile": "자르다", + "skillManagement.detail.cutFileSuccess": "파일을 이동할 준비가 되었습니다.", + "skillManagement.detail.deleteFileConfirm": "이 파일을 삭제하시겠습니까?", + "skillManagement.detail.deleteFileSuccess": "파일이 삭제되었습니다.", + "skillManagement.detail.deleteVersionConfirm": "이 버전을 삭제하시겠습니까?", + "skillManagement.detail.deleteVersionFailed": "버전을 삭제하지 못했습니다.", + "skillManagement.detail.deleteVersionSuccess": "버전이 삭제되었습니다.", + "skillManagement.detail.downloadFile": "파일 다운로드", + "skillManagement.detail.draft": "초안", + "skillManagement.detail.editVersionInfo": "버전 정보 편집", + "skillManagement.detail.exitVersions": "버전 나가기", "skillManagement.detail.expandSidebar": "사이드바 펼치기", - "skillManagement.detail.fileCount": "{{count}} FILES", - "skillManagement.detail.fileMeta": "{{type}} · {{size}} bytes", - "skillManagement.detail.fileMissing": "File not found.", - "skillManagement.detail.fileOperationFailed": "File operation failed.", - "skillManagement.detail.files": "Files", - "skillManagement.detail.latest": "Latest", - "skillManagement.detail.loadFailed": "Failed to load skill.", - "skillManagement.detail.markdownLiveMode": "Live preview", - "skillManagement.detail.markdownSourceMode": "Source editor", - "skillManagement.detail.metadataKey": "name", - "skillManagement.detail.metadataValue": "value", - "skillManagement.detail.moveFileSuccess": "File moved.", - "skillManagement.detail.moveFilesSuccess": "Files moved.", - "skillManagement.detail.noFileSelected": "Select a file to preview.", - "skillManagement.detail.noFiles": "No files.", + "skillManagement.detail.fileAlreadyExists": "이 이름을 가진 파일이나 폴더가 이미 존재합니다.", + "skillManagement.detail.fileCount_one": "{{count}} 파일", + "skillManagement.detail.fileCount_other": "{{count}} 파일", + "skillManagement.detail.fileMeta": "{{type}} · {{size}} 바이트", + "skillManagement.detail.fileMissing": "파일을 찾을 수 없습니다.", + "skillManagement.detail.fileOperationFailed": "파일 작업이 실패했습니다.", + "skillManagement.detail.files": "파일", + "skillManagement.detail.latest": "최신", + "skillManagement.detail.loadFailed": "스킬 로딩에 실패했습니다.", + "skillManagement.detail.loadingTags": "태그 로드 중...", + "skillManagement.detail.markdownLiveMode": "실시간 미리보기", + "skillManagement.detail.markdownSourceMode": "소스 편집기", + "skillManagement.detail.metadataKey": "이름", + "skillManagement.detail.metadataValue": "값", + "skillManagement.detail.moveFileSuccess": "파일이 이동되었습니다.", + "skillManagement.detail.moveFilesSuccess": "파일이 이동되었습니다.", + "skillManagement.detail.nameThisVersion": "이름 바꾸기", + "skillManagement.detail.noFileSelected": "미리 볼 파일을 선택하세요.", + "skillManagement.detail.noFiles": "파일이 없습니다.", "skillManagement.detail.noSearchResults": "일치하는 파일이 없습니다.", - "skillManagement.detail.noVersions": "No published versions yet.", - "skillManagement.detail.previewUnsupported": "Preview is not supported for this file.", - "skillManagement.detail.publish": "Publish", - "skillManagement.detail.publishFailed": "Failed to publish skill.", - "skillManagement.detail.publishSuccess": "Skill published.", - "skillManagement.detail.published": "Published", + "skillManagement.detail.noSelectableTags": "사용 가능한 태그가 없습니다.", + "skillManagement.detail.noVersions": "아직 게시된 버전이 없습니다.", + "skillManagement.detail.pasteFile": "반죽", + "skillManagement.detail.pasteFileSuccess": "파일을 붙여넣었습니다.", + "skillManagement.detail.previewUnsupported": "이 파일은 미리보기를 지원하지 않습니다.", + "skillManagement.detail.publish": "게시", + "skillManagement.detail.publishFailed": "스킬을 게시하지 못했습니다.", + "skillManagement.detail.publishReferencesDescription_one": "이 스킬을 사용하는 {{count}} 에이전트에는 게시가 즉시 적용됩니다.", + "skillManagement.detail.publishReferencesDescription_other": "이 스킬을 사용하는 {{count}} 에이전트에게는 게시가 즉시 적용됩니다.", + "skillManagement.detail.publishReferencesTitle": "퍼블리싱 스킬", + "skillManagement.detail.publishSuccess": "Skill이(가) 게시되었습니다.", + "skillManagement.detail.publishUpdate": "업데이트 게시", + "skillManagement.detail.published": "게시됨", "skillManagement.detail.publishedAt": "{{time}} 게시됨", + "skillManagement.detail.publishedVersion": "#{{number}} 게시됨", "skillManagement.detail.publishing": "게시 중...", - "skillManagement.detail.readonly": "Read only", - "skillManagement.detail.referenceFiles.confirm": "Enter Confirm", - "skillManagement.detail.referenceFiles.empty": "No files available.", - "skillManagement.detail.referenceFiles.livePlaceholder": "Write instructions for the agent, type / to reference files", - "skillManagement.detail.referenceFiles.navigate": "↑↓ Navigate", - "skillManagement.detail.referenceFiles.title": "Reference files", - "skillManagement.detail.referencedBy": "Referenced by {{count}} Apps", - "skillManagement.detail.removeMetadata": "Delete {{name}} metadata", - "skillManagement.detail.removeTag": "Remove {{tag}}", - "skillManagement.detail.removeTagSuccess": "Tag removed.", - "skillManagement.detail.renameFile": "Rename file", - "skillManagement.detail.renameFileDescription": "Enter the new path relative to the skill root.", - "skillManagement.detail.renameFileSuccess": "File renamed.", - "skillManagement.detail.renameSkillSuccess": "Skill renamed.", - "skillManagement.detail.renameVersion": "Rename", - "skillManagement.detail.renameVersionFailed": "Failed to rename version.", - "skillManagement.detail.renameVersionPrompt": "Version name", - "skillManagement.detail.renameVersionSuccess": "Version renamed.", - "skillManagement.detail.restoreVersion": "Restore", - "skillManagement.detail.restoreVersionFailed": "Failed to restore version.", - "skillManagement.detail.restoreVersionSuccess": "Version restored to draft.", - "skillManagement.detail.save": "Save", - "skillManagement.detail.saveFailed": "Failed to save file.", - "skillManagement.detail.saveSuccess": "File saved.", - "skillManagement.detail.saved": "Saved", - "skillManagement.detail.savedAt": "Saved {{time}}", - "skillManagement.detail.saving": "Saving...", + "skillManagement.detail.readonly": "읽기 전용", + "skillManagement.detail.referenceFiles.confirm": "확인을 입력하세요", + "skillManagement.detail.referenceFiles.empty": "사용 가능한 파일이 없습니다.", + "skillManagement.detail.referenceFiles.livePlaceholder": "상담원을 위한 지침을 작성합니다. 파일을 참조하려면 /를 입력하세요.", + "skillManagement.detail.referenceFiles.navigate": "↑↓ 탐색", + "skillManagement.detail.referenceFiles.title": "참조 파일", + "skillManagement.detail.referencedBy_one": "{{count}}개의 Agent가 사용 중", + "skillManagement.detail.referencedBy_other": "{{count}}개의 Agent가 사용 중", + "skillManagement.detail.removeMetadata": "{{name}} 메타데이터 삭제", + "skillManagement.detail.removeTag": "{{tag}} 제거", + "skillManagement.detail.removeTagSuccess": "태그가 삭제되었습니다.", + "skillManagement.detail.renameFile": "파일 이름 바꾸기", + "skillManagement.detail.renameFileDescription": "스킬 루트를 기준으로 새 경로를 입력합니다.", + "skillManagement.detail.renameFileSuccess": "파일 이름이 변경되었습니다.", + "skillManagement.detail.renameSkillSuccess": "Skill 이름이 변경되었습니다.", + "skillManagement.detail.renameVersion": "이름 바꾸기", + "skillManagement.detail.renameVersionFailed": "버전 이름을 바꾸지 못했습니다.", + "skillManagement.detail.renameVersionPrompt": "버전 이름", + "skillManagement.detail.renameVersionSuccess": "버전 이름이 변경되었습니다.", + "skillManagement.detail.resizeSidebar": "파일 사이드바 크기 조정", + "skillManagement.detail.restoreVersion": "복원", + "skillManagement.detail.restoreVersionConfirmDescription": "그러면 현재 초안이 \"{{version}}\"의 파일로 대체됩니다. Skill를 게시하거나 새 버전을 생성하지 않습니다.", + "skillManagement.detail.restoreVersionConfirmTitle": "이 버전을 복원하시겠습니까?", + "skillManagement.detail.restoreVersionFailed": "버전을 복원하지 못했습니다.", + "skillManagement.detail.restoreVersionSuccess": "버전이 초안으로 복원되었습니다.", + "skillManagement.detail.save": "저장", + "skillManagement.detail.saveConflictConfirmDescription": "이 스킬은 다른 곳에서 업데이트되었습니다. 계속 편집하려면 최신 초안을 로드하세요. 현재 변경사항이 삭제됩니다.", + "skillManagement.detail.saveConflictConfirmTitle": "최신 초안을 로드하시겠습니까?", + "skillManagement.detail.saveConflictReload": "최신 초안 로드", + "skillManagement.detail.saveConflictStatus": "충돌이 감지되었습니다. 계속 편집하려면 최신 초안을 로드하세요.", + "skillManagement.detail.saveFailed": "파일을 저장하지 못했습니다.", + "skillManagement.detail.saveSuccess": "파일이 저장되었습니다.", + "skillManagement.detail.saved": "저장됨", + "skillManagement.detail.savedAt": "{{time}}에 저장", + "skillManagement.detail.saving": "저장 중...", "skillManagement.detail.searchFiles": "파일 검색", + "skillManagement.detail.showMoreReferences": "{{count}} 더 보기", + "skillManagement.detail.skillDescriptionPlaceholder": "이 스킬의 기능과 상담원이 언제 사용해야 하는지 설명하세요.", + "skillManagement.detail.skillNamePlaceholder": "소문자, 숫자, 하이픈을 사용하세요.", "skillManagement.detail.unpublishedChanges": "게시되지 않은 변경 사항", - "skillManagement.detail.unsavedChanges": "Unsaved changes", + "skillManagement.detail.unsavedChanges": "저장되지 않은 변경사항", "skillManagement.detail.upToDate": "최신 상태", - "skillManagement.detail.updateTagsFailed": "Failed to update tags.", - "skillManagement.detail.uploadFile": "Upload file", - "skillManagement.detail.uploadFileFailed": "File upload failed.", - "skillManagement.detail.uploadFileSuccess": "File uploaded.", - "skillManagement.detail.uploadFilesMenu": "Upload files...", + "skillManagement.detail.updateTagsFailed": "태그를 업데이트하지 못했습니다.", + "skillManagement.detail.uploadCheckFailed": "이 파일을 확인할 수 없습니다. 다시 시도해 보세요.", + "skillManagement.detail.uploadConflict": "이 이름을 가진 파일이 이미 존재합니다.", + "skillManagement.detail.uploadFailureSummary": "{{total}} 파일 중 {{failed}}가 실패했습니다.", + "skillManagement.detail.uploadFailureTitle": "일부 업로드에 실패했습니다.", + "skillManagement.detail.uploadFile": "파일 업로드", + "skillManagement.detail.uploadFileFailed": "파일 업로드에 실패했습니다.", + "skillManagement.detail.uploadFileSuccess": "파일을 업로드했습니다.", + "skillManagement.detail.uploadFilesButton": "{{count}} 파일 업로드", + "skillManagement.detail.uploadFilesFailedStatus_one": "{{count}} 파일 업로드에 실패했습니다.", + "skillManagement.detail.uploadFilesFailedStatus_other": "{{count}} 파일 업로드에 실패했습니다.", + "skillManagement.detail.uploadFilesMenu": "파일 업로드...", + "skillManagement.detail.uploadFilesProgress": "{{completed}}/{{total}} 업로드 중", + "skillManagement.detail.uploadFilesResult": "{{uploaded}} 업로드됨 · {{failed}} 실패", + "skillManagement.detail.uploadFilesStatus": "업로드 상태", + "skillManagement.detail.uploadInvalidExtension": "이 파일 형식은 지원되지 않습니다.", + "skillManagement.detail.uploadInvalidName": "이름이 잘못되었습니다.", + "skillManagement.detail.uploadInvalidPath": "파일 경로가 잘못되었습니다.", + "skillManagement.detail.uploadKeepBoth": "둘 다 유지", + "skillManagement.detail.uploadLateConflict": "귀하가 업로드하는 동안 누군가 이 파일을 추가했습니다.", + "skillManagement.detail.uploadMissingExtension": "파일 확장자가 필요합니다.", + "skillManagement.detail.uploadNetworkFailure": "업로드에 실패했습니다. 연결을 확인하세요.", + "skillManagement.detail.uploadReadySummary": "{{ready}} 준비됨 · {{decisions}} 결정 필요 · {{skipped}}는 건너뜁니다.", + "skillManagement.detail.uploadReplace": "바꾸다", + "skillManagement.detail.uploadResolvedSummary": "{{ready}} 준비됨 · {{skipped}}는 건너뜁니다.", + "skillManagement.detail.uploadRetryCount": "{{count}} 다시 시도", + "skillManagement.detail.uploadReviewTitle": "업로드하기 전에 검토하세요.", + "skillManagement.detail.uploadSkip": "건너뛰기", + "skillManagement.detail.uploadSkippedGroup": "{{count}} 파일은 업로드할 수 없으며 건너뜁니다.", + "skillManagement.detail.uploadStatusDismiss": "업로드 상태 닫기", + "skillManagement.detail.uploadSuggestion": "제안 사용", + "skillManagement.detail.uploadWillReplace": "기존 파일을 대체합니다.", + "skillManagement.detail.uploadWillUseName": "{{name}}로 업로드됩니다", + "skillManagement.detail.versionHistory": "버전 기록 열기", "skillManagement.detail.versionMeta": "{{hash}} · {{time}}", - "skillManagement.detail.versions": "Versions", - "skillManagement.draft": "Draft", - "skillManagement.duplicateFailed": "Failed to duplicate skill.", - "skillManagement.duplicateSuccess": "Skill duplicated.", - "skillManagement.editedAt": "Edited {{time}}", - "skillManagement.empty": "No skills yet", - "skillManagement.emptySearch": "No skills found", - "skillManagement.import": "Import", - "skillManagement.importFailed": "Failed to import skill.", - "skillManagement.importSuccess": "Skill imported.", - "skillManagement.listLabel": "Workspace skills", - "skillManagement.loadingError": "Failed to load skills", - "skillManagement.moreActions": "More actions for {{name}}", - "skillManagement.noTags": "No tags", - "skillManagement.publishedAt": "Published {{time}}", - "skillManagement.referenceCount": "{{count}} Refs", - "skillManagement.searchLabel": "Search skills", - "skillManagement.searchPlaceholder": "Search", - "skillManagement.tags": "Tags", - "skillManagement.title": "Skills" + "skillManagement.detail.versionPublishNote": "릴리스 노트", + "skillManagement.detail.versionPublishNotePlaceholder": "이 변경사항을 설명하세요.", + "skillManagement.detail.versionPublishedMeta": "{{time}} · {{name}}", + "skillManagement.detail.versionTitle": "제목", + "skillManagement.detail.versions": "버전들", + "skillManagement.detail.viewOnly": "보기 전용", + "skillManagement.detail.viewUploadErrors": "오류 보기", + "skillManagement.draft": "초안", + "skillManagement.duplicateFailed": "스킬 중복에 실패했습니다.", + "skillManagement.duplicateSuccess": "Skill이(가) 중복되었습니다.", + "skillManagement.editedAt": "{{time}}에 편집됨", + "skillManagement.empty": "아직 스킬이 없습니다", + "skillManagement.emptyAction.createDescription": "시나리오를 일반 단어로 설명하고 검토할 초안 기술을 확보하세요.", + "skillManagement.emptyAction.createTitle": "Skill Builder로 만들기", + "skillManagement.emptyAction.importDescription": "Agentkills.io 형식으로 SKILL.md가 포함된 .zip을 가져옵니다.", + "skillManagement.emptyAction.importTitle": "스킬 패키지 가져오기", + "skillManagement.emptySearch": "기술을 찾을 수 없습니다.", + "skillManagement.errors.missingSkillMd": "이 패키지에는 SKILL.md가 없습니다. 파일을 추가하고 다시 가져오세요.", + "skillManagement.errors.nameConflict": "\"{{name}}\"라는 스킬이 이미 존재합니다. SKILL.md에서 이름을 바꾸고 다시 가져옵니다.", + "skillManagement.errors.workspaceLimit": "작업 영역이 스킬 한도인 500개에 도달했습니다. 새로운 스킬을 추가하려면 스킬을 삭제하세요.", + "skillManagement.import": "가져오기", + "skillManagement.importFailed": "스킬을 가져오지 못했습니다.", + "skillManagement.importSuccess": "Skill 가져왔습니다.", + "skillManagement.listLabel": "작업 공간 기술", + "skillManagement.loadingError": "스킬을 로드하지 못했습니다.", + "skillManagement.moreActions": "{{name}}의 추가 작업", + "skillManagement.noDescription": "아직 설명이 없습니다", + "skillManagement.noTags": "태그 없음", + "skillManagement.publishedAt": "{{time}}에 게시", + "skillManagement.referenceCount_one": "{{count}}개 Agent", + "skillManagement.referenceCount_other": "{{count}}개 Agent", + "skillManagement.searchLabel": "스킬 검색", + "skillManagement.searchPlaceholder": "이름이나 설명으로 검색", + "skillManagement.tags": "태그", + "skillManagement.title": "스킬" } diff --git a/web/i18n/nl-NL/agent-v-2.json b/web/i18n/nl-NL/agent-v-2.json index 76c16feec13..dae795c9e4f 100644 --- a/web/i18n/nl-NL/agent-v-2.json +++ b/web/i18n/nl-NL/agent-v-2.json @@ -83,7 +83,7 @@ "agentDetail.configure.buildDraft.changesToApply_other": "{{count}} wijzigingen om toe te passen", "agentDetail.configure.buildDraft.discard": "Negeren", "agentDetail.configure.buildDraft.modeBadge": "Buildmodus", - "agentDetail.configure.buildDraft.modeDescription": "Je bent in buildmodus. Configure kan in deze modus alleen door de agent worden bijgewerkt. Werk deze configuratie bij via de chat rechts en pas daarna toe.", + "agentDetail.configure.buildDraft.modeDescription": "Je bevindt je in de buildmodus. Geef deze configuratie vorm door met de agent te chatten en klik daarna op Toepassen.", "agentDetail.configure.buildDraft.rewritten": "Herschreven", "agentDetail.configure.buildDraft.title": "Buildconcept", "agentDetail.configure.buildDraft.updated": "Bijgewerkt", @@ -105,7 +105,8 @@ "agentDetail.configure.files.preview.failed": "Laden van voorbeeld mislukt.", "agentDetail.configure.files.preview.unsupported": "Dit bestand ondersteunt geen voorbeeldweergave.", "agentDetail.configure.files.remove": "{{name}} verwijderen", - "agentDetail.configure.files.tip": "Voor referentiemateriaal dat te lang is om in de Prompt te plakken: specificaties, sjablonen, richtlijnen. Verwijs ernaar met / in de Prompt.\n\nIn de Build-modus kan de agent dit voor u instellen.", + "agentDetail.configure.files.richTip": "Voor referentiemateriaal dat te lang is om in de Prompt te plakken: specificaties, sjablonen, richtlijnen. Meer informatie\n\nIn de Build-modus kan de agent dit voor u instellen.", + "agentDetail.configure.files.tip": "Voor referentiemateriaal dat te lang is om in de Prompt te plakken: specificaties, sjablonen, richtlijnen. Meer informatie\n\nIn de Build-modus kan de agent dit voor u instellen.", "agentDetail.configure.files.toggle": "Bestanden in/uit", "agentDetail.configure.files.treeLabel": "Agentbestanden", "agentDetail.configure.files.upload.action": "Uploaden", @@ -114,7 +115,7 @@ "agentDetail.configure.files.upload.dropzone": "Sleep een bestand hierheen, of", "agentDetail.configure.files.upload.failed": "Bestand uploaden mislukt.", "agentDetail.configure.files.upload.fileType": "BESTAND", - "agentDetail.configure.files.upload.invalidFile": "Upload één bestand.", + "agentDetail.configure.files.upload.invalidFile": "Er kan maar één bestand tegelijk worden geüpload.", "agentDetail.configure.files.upload.success": "Bestand geüpload.", "agentDetail.configure.files.upload.title": "Bestand uploaden", "agentDetail.configure.knowledgeRetrieval.add": "Kennisophaling toevoegen", @@ -177,7 +178,8 @@ "agentDetail.configure.prompt.mention.priyaRamanathan": "Priya Ramanathan", "agentDetail.configure.prompt.placeholder": "Schrijf hier instructies,", "agentDetail.configure.prompt.referenceMissing": "{{name}} bestaat niet", - "agentDetail.configure.prompt.tip": "Definieer de rol van de agent en beschrijf zijn typische taak. Gebruik / om expliciet te verwijzen naar skills, bestanden, tools en kennisophalingen.", + "agentDetail.configure.prompt.richTip": "Bepaal de rol van de agent en hoe die moet werken. Meer informatie", + "agentDetail.configure.prompt.tip": "Bepaal de rol van de agent en hoe die moet werken. Meer informatie", "agentDetail.configure.publishBar.draft": "Concept", "agentDetail.configure.publishBar.publishUpdate": "Update publiceren", "agentDetail.configure.publishBar.published": "Gepubliceerd", @@ -190,8 +192,8 @@ "agentDetail.configure.publishBar.versionHistory": "Versiegeschiedenis openen", "agentDetail.configure.publishImpact.affectedWorkflows": "Beïnvloede workflows", "agentDetail.configure.publishImpact.cancel": "Annuleren", - "agentDetail.configure.publishImpact.descriptionPrefix": "Je agent verschijnt in", - "agentDetail.configure.publishImpact.descriptionSuffix": ". Wijzigingen hebben hierop invloed.", + "agentDetail.configure.publishImpact.descriptionPrefix": "Deze agent wordt gebruikt in", + "agentDetail.configure.publishImpact.descriptionSuffix": ". Bij publicatie wordt de agent in al deze workflows bijgewerkt.", "agentDetail.configure.publishImpact.fallbackAgentName": "deze agent", "agentDetail.configure.publishImpact.title": "{{action}} naar {{name}}", "agentDetail.configure.publishImpact.workflowCount_one": "{{count}} workflow", @@ -222,8 +224,8 @@ "agentDetail.configure.skills.openInLibrary": "Open in Skill library", "agentDetail.configure.skills.remove": "{{name}} verwijderen", "agentDetail.configure.skills.removeAction": "Remove", - "agentDetail.configure.skills.richTip": "Bundel de instructies, bestanden en scripts voor een terugkerende taak in een skill. Verwijs ernaar met / in de Prompt. Meer informatie\n\nIn de Build-modus kan de agent dit voor u instellen.", - "agentDetail.configure.skills.tip": "Bundel de instructies, bestanden en scripts voor een terugkerende taak in een skill. Verwijs ernaar met / in de Prompt. Meer informatie\n\nIn de Build-modus kan de agent dit voor u instellen.", + "agentDetail.configure.skills.richTip": "Bundel de instructies, bestanden en scripts voor een terugkerende taak in een skill. Meer informatie\n\nIn de Build-modus kan de agent dit voor u instellen.", + "agentDetail.configure.skills.tip": "Bundel de instructies, bestanden en scripts voor een terugkerende taak in een skill. Meer informatie\n\nIn de Build-modus kan de agent dit voor u instellen.", "agentDetail.configure.skills.toggle": "Skills in/uit", "agentDetail.configure.skills.upload.action": "Uploaden", "agentDetail.configure.skills.upload.browse": "bladeren", @@ -269,8 +271,8 @@ "agentDetail.configure.tools.moreActions": "Meer acties voor {{name}}", "agentDetail.configure.tools.removeAction": "{{name}} verwijderen", "agentDetail.configure.tools.removeProvider": "Alle tools verwijderen", - "agentDetail.configure.tools.richTip": "Voeg Dify-tools uit uw workspace toe. Verwijs ernaar met / in de Prompt. Meer informatie\n\nTools die de agent in zijn sandbox installeert, verschijnen hier niet, maar blijven beschikbaar.", - "agentDetail.configure.tools.tip": "Voeg Dify-tools uit uw workspace toe. Verwijs ernaar met / in de Prompt. Meer informatie\n\nTools die de agent in zijn sandbox installeert, verschijnen hier niet, maar blijven beschikbaar.", + "agentDetail.configure.tools.richTip": "Voeg Dify-tools uit uw workspace toe. Meer informatie\n\nTools die de agent in zijn sandbox installeert, verschijnen hier niet, maar blijven beschikbaar.", + "agentDetail.configure.tools.tip": "Voeg Dify-tools uit uw workspace toe. Meer informatie\n\nTools die de agent in zijn sandbox installeert, verschijnen hier niet, maar blijven beschikbaar.", "agentDetail.configure.tools.toggle": "Tools in/uit", "agentDetail.configure.tools.toolTabs.all": "Alle", "agentDetail.configure.tools.toolTabs.cli": "CLI", @@ -336,22 +338,22 @@ "agentDetail.metadata.sourceLabel": "Bron", "agentDetail.monitoring.change": "{{value}} t.o.v. vorige periode", "agentDetail.monitoring.dateRangeLabel": "Datumbereik", - "agentDetail.monitoring.description": "Volg de activiteit, kosten en interactiekwaliteit van de herbruikbare agent over workflows heen.", + "agentDetail.monitoring.description": "Volg de activiteit, kosten en interactiekwaliteit van deze agent via alle toegangspunten.", "agentDetail.monitoring.learnMore": "Meer informatie", "agentDetail.monitoring.loadFailed": "Monitoringgegevens laden mislukt", - "agentDetail.monitoring.metrics.activeUsers.explanation": "Unieke eindgebruikers die workflows met deze agent hebben getriggerd.", + "agentDetail.monitoring.metrics.activeUsers.explanation": "Unieke eindgebruikers die interactie hadden met deze agent.", "agentDetail.monitoring.metrics.activeUsers.title": "Actieve gebruikers", - "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Aaneengesloten communicatie tussen gebruiker en agent voor dit toegangspunt.", + "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Gemiddeld aantal gebruikersberichten per gesprek.", "agentDetail.monitoring.metrics.avgSessionInteractions.title": "Gem. sessie-interacties", - "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Gemiddelde uitvoersnelheid vanaf het begin van de aanvraag tot voltooiing.", + "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Gemiddeld aantal tokens dat per seconde wordt gegenereerd tijdens een antwoord van de agent.", "agentDetail.monitoring.metrics.tokenOutputSpeed.title": "Token-uitvoersnelheid", - "agentDetail.monitoring.metrics.tokenUsage.explanation": "Geschatte tokenkosten gegenereerd door deze agent in workflowuitvoeringen.", + "agentDetail.monitoring.metrics.tokenUsage.explanation": "Verbruikte tokens en geschatte kosten.", "agentDetail.monitoring.metrics.tokenUsage.title": "Tokengebruik", "agentDetail.monitoring.metrics.totalConversations.explanation": "Dagelijkse AI-gesprekken die deze agent hebben bereikt via het geselecteerde toegangspunt.", "agentDetail.monitoring.metrics.totalConversations.title": "Totaal aantal gesprekken", - "agentDetail.monitoring.metrics.totalMessages.explanation": "Dagelijks aantal agentinteracties.", + "agentDetail.monitoring.metrics.totalMessages.explanation": "Het totale aantal gebruikersberichten dat naar deze agent is gestuurd.", "agentDetail.monitoring.metrics.totalMessages.title": "Totaal aantal berichten", - "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "Het aantal likes per 1.000 berichten voor deze agent.", + "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "Percentage antwoorden van de agent die door gebruikers met een like zijn beoordeeld.", "agentDetail.monitoring.metrics.userSatisfactionRate.title": "Gebruikerstevredenheid", "agentDetail.monitoring.pickSource": "Kies een app", "agentDetail.monitoring.sourceLabel": "App", @@ -549,7 +551,5 @@ "skillManagement.searchLabel": "Search skills", "skillManagement.searchPlaceholder": "Search", "skillManagement.tags": "Tags", - "skillManagement.title": "Skills", - "agentDetail.configure.files.richTip": "Voor referentiemateriaal dat te lang is om in de Prompt te plakken: specificaties, sjablonen, richtlijnen. Meer informatie\n\nIn de Build-modus kan de agent dit voor u instellen.", - "agentDetail.configure.prompt.richTip": "Bepaal de rol van de agent en hoe die moet werken. Meer informatie" + "skillManagement.title": "Skills" } diff --git a/web/i18n/nl-NL/skill.json b/web/i18n/nl-NL/skill.json index b1d82280dce..01ef4f359bf 100644 --- a/web/i18n/nl-NL/skill.json +++ b/web/i18n/nl-NL/skill.json @@ -1,121 +1,245 @@ { - "skillManagement.clearTags": "Clear tags", - "skillManagement.create": "Create", - "skillManagement.createFailed": "Failed to create skill.", - "skillManagement.createSuccess": "Skill created.", - "skillManagement.dateTimeFormat": "MMM D, YYYY HH:mm", + "skillManagement.clearTags": "Duidelijke tags", + "skillManagement.create": "Creëren", + "skillManagement.createFailed": "Kan geen vaardigheid creëren.", + "skillManagement.createSuccess": "Concept gemaakt.", + "skillManagement.dateTimeFormat": "MMM D, JJJJ UU:mm", "skillManagement.deleteDialog.confirmInputLabel": "Typ ter bevestiging {{skillName}} in het onderstaande veld:", "skillManagement.deleteDialog.confirmInputPlaceholder": "Voer de weergavenaam van de Skill in…", - "skillManagement.deleteDialog.description": "This skill will be removed from the workspace. Agents that reference it may lose access to this capability.", - "skillManagement.deleteDialog.title": "Delete {{name}}?", - "skillManagement.deleteFailed": "Failed to delete skill.", - "skillManagement.deleteSuccess": "Skill deleted.", - "skillManagement.detail.addMetadata": "Add metadata", - "skillManagement.detail.addMetadataDescription": "Add a frontmatter field to this Markdown file.", - "skillManagement.detail.addTag": "Add tag", - "skillManagement.detail.addTagDescription": "Create or bind a tag to this Skill. New tags are saved with the Skill metadata.", - "skillManagement.detail.addTagSuccess": "Tag added.", - "skillManagement.detail.back": "Back to Skills", - "skillManagement.detail.cancelAddMetadata": "Cancel adding metadata", - "skillManagement.detail.closeFileTab": "Close {{name}}", + "skillManagement.deleteDialog.description": "Het verwijderen van de vaardigheid is onomkeerbaar. De inhoud en de volledige versiegeschiedenis worden permanent verwijderd. Er zijn momenteel geen agenten die er gebruik van maken.", + "skillManagement.deleteDialog.referencedDescription_one": "De {{count}}-agent gebruikt deze vaardigheid, zelfstandig of in een workflow. Als u deze vaardigheid verwijdert, worden de inhoud en versiegeschiedenis permanent gewist en verwijderd van de betrokken agent.", + "skillManagement.deleteDialog.referencedDescription_other": "{{count}}-agenten gebruiken deze vaardigheid, zelfstandig of in workflows. Als u deze vaardigheid verwijdert, worden de inhoud en versiegeschiedenis ervan permanent gewist en verwijderd van alle betrokken agenten.", + "skillManagement.deleteDialog.title": "{{name}} verwijderen?", + "skillManagement.deleteFailed": "Kan vaardigheid niet verwijderen.", + "skillManagement.deleteSuccess": "Skill verwijderd.", + "skillManagement.detail.addMetadata": "Voeg metagegevens toe", + "skillManagement.detail.addMetadataDescription": "Voeg een frontmatter-veld toe aan dit Markdown-bestand.", + "skillManagement.detail.addTag": "Label toevoegen", + "skillManagement.detail.addTagDescription": "Maak of koppel een tag aan deze Skill. Nieuwe tags worden opgeslagen met de Skill-metagegevens.", + "skillManagement.detail.addTagSuccess": "Label toegevoegd.", + "skillManagement.detail.back": "Terug naar Skills", + "skillManagement.detail.builder.applyFailed": "Kan conceptupdates niet toepassen.", + "skillManagement.detail.builder.attach": "Bestand bijvoegen", + "skillManagement.detail.builder.attachFailed": "Kan bestand niet bijvoegen.", + "skillManagement.detail.builder.attachLimit": "U kunt maximaal 10 bestanden bijvoegen.", + "skillManagement.detail.builder.attachTooLarge": "Bestanden moeten 15 MB of kleiner zijn. Afbeeldingen moeten 10 MB of kleiner zijn.", + "skillManagement.detail.builder.attachUnsupported": "Alleen afbeeldingen, tekst en documentbestanden kunnen worden bijgevoegd.", + "skillManagement.detail.builder.attachmentOnlyMessage": "Gebruik het bijgevoegde bestand om deze vaardigheid te verbeteren.", + "skillManagement.detail.builder.close": "Sluit Skill Builder", + "skillManagement.detail.builder.compatibleModelsOnly": "Alleen compatibele modellen worden weergegeven", + "skillManagement.detail.builder.copyResponse": "Kopieer het antwoord", + "skillManagement.detail.builder.copySuccess": "Reactie gekopieerd naar klembord.", + "skillManagement.detail.builder.editIntro": "Ik heb deze vaardigheid beoordeeld. Wat zou je willen aanpassen?", + "skillManagement.detail.builder.exampleIssueTriage": "Triage van klantproblemen", + "skillManagement.detail.builder.exampleOnboarding": "Onboardinggids voor nieuwe medewerkers", + "skillManagement.detail.builder.exampleSalesFollowUp": "Opvolgstrategie voor verkoopleads", + "skillManagement.detail.builder.followUpDisplayName": "Gebruik Terugbetalingsgoedkeuring als weergavenaam", + "skillManagement.detail.builder.followUpNameIcon": "Pas de voorgestelde naam en het pictogram toe", + "skillManagement.detail.builder.fromMarketplace": "Vanuit de Marketplace", + "skillManagement.detail.builder.model": "GPT-4o", + "skillManagement.detail.builder.modelCredits.all": "Alle kredieten", + "skillManagement.detail.builder.modelCredits.configure": "Configuratie vereist", + "skillManagement.detail.builder.modelCredits.exhausted": "Quota exhausted", + "skillManagement.detail.builder.modelProviderSettings": "Modelproviderinstellingen", + "skillManagement.detail.builder.modelSearch": "Modellen zoeken...", + "skillManagement.detail.builder.modifyPlaceholder": "Vraag AI om deze vaardigheid aan te passen...", + "skillManagement.detail.builder.open": "Open Skill Builder", + "skillManagement.detail.builder.placeholder": "Beschrijf het scenario...", + "skillManagement.detail.builder.progress.applyingChanges": "Bestandswijzigingen toepassen", + "skillManagement.detail.builder.progress.generatingPlan": "Het genereren van het updateplan", + "skillManagement.detail.builder.progress.readingDraft": "Het huidige ontwerp lezen", + "skillManagement.detail.builder.progress.updatingEditor": "De editor bijwerken", + "skillManagement.detail.builder.promptDescription": "Beschrijf het en er verschijnt een concept in de editor, inclusief stappen en bestanden.", + "skillManagement.detail.builder.promptTitle": "Waar moet deze vaardigheid mee omgaan?", + "skillManagement.detail.builder.readAloud": "Reactie voorlezen", + "skillManagement.detail.builder.removeAttachment": "{{name}} verwijderen", + "skillManagement.detail.builder.restart": "Start de bouwer opnieuw", + "skillManagement.detail.builder.retryResponse": "Probeer het antwoord opnieuw", + "skillManagement.detail.builder.send": "Bericht verzenden", + "skillManagement.detail.builder.sendFailed": "Skill Builder reageerde niet.", + "skillManagement.detail.builder.thinking": "Aan het nadenken", + "skillManagement.detail.builder.thinkingUnavailable": "Er werd geen denkinhoud geretourneerd door het model.", + "skillManagement.detail.builder.title": "Skill Builder", + "skillManagement.detail.builder.tryExample": "Probeer een voorbeeld", + "skillManagement.detail.builder.voice": "Spraakinvoer", + "skillManagement.detail.builder.voiceUnavailable": "Spraakinvoer is nog niet beschikbaar.", + "skillManagement.detail.cancelAddMetadata": "Annuleer het toevoegen van metagegevens", + "skillManagement.detail.closeFileTab": "Sluiten {{name}}", + "skillManagement.detail.closeVersions": "Versies sluiten", "skillManagement.detail.collapseSidebar": "Zijbalk inklappen", - "skillManagement.detail.createFile": "New file", - "skillManagement.detail.createFileDescription": "Enter a file path relative to the skill root.", - "skillManagement.detail.createFileMenu": "New file...", - "skillManagement.detail.createFileSuccess": "File created.", - "skillManagement.detail.createFolder": "New folder", - "skillManagement.detail.createFolderDescription": "Enter a folder path relative to the skill root.", - "skillManagement.detail.createFolderMenu": "New folder...", - "skillManagement.detail.createFolderSuccess": "Folder created.", - "skillManagement.detail.createdBy": "Created by {{name}}", - "skillManagement.detail.currentDraft": "Current draft", - "skillManagement.detail.deleteFileConfirm": "Delete this file?", - "skillManagement.detail.deleteFileSuccess": "File deleted.", - "skillManagement.detail.deleteVersionConfirm": "Delete this version?", - "skillManagement.detail.deleteVersionFailed": "Failed to delete version.", - "skillManagement.detail.deleteVersionSuccess": "Version deleted.", - "skillManagement.detail.downloadFile": "Download file", - "skillManagement.detail.draft": "Draft", + "skillManagement.detail.copyContentSuccess": "Inhoud gekopieerd naar klembord.", + "skillManagement.detail.copyFile": "Kopiëren", + "skillManagement.detail.copyFileSuccess": "Bestand klaar om te plakken.", + "skillManagement.detail.copyVersionId": "Kopieer identiteitsbewijs", + "skillManagement.detail.copyVersionIdSuccess": "ID gekopieerd naar klembord.", + "skillManagement.detail.createFile": "Nieuw bestand", + "skillManagement.detail.createFileDescription": "Voer een bestandspad in ten opzichte van de vaardigheidsroot.", + "skillManagement.detail.createFileMenu": "Nieuw bestand...", + "skillManagement.detail.createFileSuccess": "Bestand gemaakt.", + "skillManagement.detail.createFolder": "Nieuwe map", + "skillManagement.detail.createFolderDescription": "Voer een mappad in ten opzichte van de vaardigheidsroot.", + "skillManagement.detail.createFolderMenu": "Nieuwe map...", + "skillManagement.detail.createFolderSuccess": "Map gemaakt.", + "skillManagement.detail.createdBy": "Gemaakt door {{name}}", + "skillManagement.detail.currentDraft": "Huidig ​​ontwerp", + "skillManagement.detail.cutFile": "Snee", + "skillManagement.detail.cutFileSuccess": "Bestand klaar om te verplaatsen.", + "skillManagement.detail.deleteFileConfirm": "Dit bestand verwijderen?", + "skillManagement.detail.deleteFileSuccess": "Bestand verwijderd.", + "skillManagement.detail.deleteVersionConfirm": "Deze versie verwijderen?", + "skillManagement.detail.deleteVersionFailed": "Kan de versie niet verwijderen.", + "skillManagement.detail.deleteVersionSuccess": "Versie verwijderd.", + "skillManagement.detail.downloadFile": "Bestand downloaden", + "skillManagement.detail.draft": "Concept", + "skillManagement.detail.editVersionInfo": "Versie-informatie bewerken", + "skillManagement.detail.exitVersions": "Versies verlaten", "skillManagement.detail.expandSidebar": "Zijbalk uitklappen", - "skillManagement.detail.fileCount": "{{count}} FILES", + "skillManagement.detail.fileAlreadyExists": "Er bestaat al een bestand of map met deze naam.", + "skillManagement.detail.fileCount_one": "{{count}}-bestand", + "skillManagement.detail.fileCount_other": "{{count}}-bestanden", "skillManagement.detail.fileMeta": "{{type}} · {{size}} bytes", - "skillManagement.detail.fileMissing": "File not found.", - "skillManagement.detail.fileOperationFailed": "File operation failed.", - "skillManagement.detail.files": "Files", - "skillManagement.detail.latest": "Latest", - "skillManagement.detail.loadFailed": "Failed to load skill.", - "skillManagement.detail.markdownLiveMode": "Live preview", - "skillManagement.detail.markdownSourceMode": "Source editor", - "skillManagement.detail.metadataKey": "name", - "skillManagement.detail.metadataValue": "value", - "skillManagement.detail.moveFileSuccess": "File moved.", - "skillManagement.detail.moveFilesSuccess": "Files moved.", - "skillManagement.detail.noFileSelected": "Select a file to preview.", - "skillManagement.detail.noFiles": "No files.", + "skillManagement.detail.fileMissing": "Bestand niet gevonden.", + "skillManagement.detail.fileOperationFailed": "Bestandsbewerking is mislukt.", + "skillManagement.detail.files": "Bestanden", + "skillManagement.detail.latest": "Nieuwste", + "skillManagement.detail.loadFailed": "Kan vaardigheid niet laden.", + "skillManagement.detail.loadingTags": "Labels laden...", + "skillManagement.detail.markdownLiveMode": "Live-voorbeeld", + "skillManagement.detail.markdownSourceMode": "Bron-editor", + "skillManagement.detail.metadataKey": "naam", + "skillManagement.detail.metadataValue": "waarde", + "skillManagement.detail.moveFileSuccess": "Bestand verplaatst.", + "skillManagement.detail.moveFilesSuccess": "Bestanden verplaatst.", + "skillManagement.detail.nameThisVersion": "Geef deze versie een naam", + "skillManagement.detail.noFileSelected": "Selecteer een bestand waarvan u een voorbeeld wilt bekijken.", + "skillManagement.detail.noFiles": "Geen bestanden.", "skillManagement.detail.noSearchResults": "Geen overeenkomende bestanden.", - "skillManagement.detail.noVersions": "No published versions yet.", - "skillManagement.detail.previewUnsupported": "Preview is not supported for this file.", - "skillManagement.detail.publish": "Publish", - "skillManagement.detail.publishFailed": "Failed to publish skill.", - "skillManagement.detail.publishSuccess": "Skill published.", - "skillManagement.detail.published": "Published", + "skillManagement.detail.noSelectableTags": "Geen beschikbare tags.", + "skillManagement.detail.noVersions": "Nog geen gepubliceerde versies.", + "skillManagement.detail.pasteFile": "Plakken", + "skillManagement.detail.pasteFileSuccess": "Bestand geplakt.", + "skillManagement.detail.previewUnsupported": "Dit bestand ondersteunt geen voorbeeldweergave.", + "skillManagement.detail.publish": "Publiceren", + "skillManagement.detail.publishFailed": "Kan de vaardigheid niet publiceren.", + "skillManagement.detail.publishReferencesDescription_one": "Het publiceren wordt onmiddellijk van kracht voor de {{count}}-agent die deze vaardigheid gebruikt.", + "skillManagement.detail.publishReferencesDescription_other": "Het publiceren wordt onmiddellijk van kracht voor de {{count}}-agenten die deze vaardigheid gebruiken.", + "skillManagement.detail.publishReferencesTitle": "Vaardigheid publiceren", + "skillManagement.detail.publishSuccess": "Skill gepubliceerd.", + "skillManagement.detail.publishUpdate": "Update publiceren", + "skillManagement.detail.published": "Gepubliceerd", "skillManagement.detail.publishedAt": "Gepubliceerd {{time}}", + "skillManagement.detail.publishedVersion": "Gepubliceerd #{{number}}", "skillManagement.detail.publishing": "Publiceren...", - "skillManagement.detail.readonly": "Read only", - "skillManagement.detail.referenceFiles.confirm": "Enter Confirm", - "skillManagement.detail.referenceFiles.empty": "No files available.", - "skillManagement.detail.referenceFiles.livePlaceholder": "Write instructions for the agent, type / to reference files", - "skillManagement.detail.referenceFiles.navigate": "↑↓ Navigate", - "skillManagement.detail.referenceFiles.title": "Reference files", - "skillManagement.detail.referencedBy": "Referenced by {{count}} Apps", - "skillManagement.detail.removeMetadata": "Delete {{name}} metadata", - "skillManagement.detail.removeTag": "Remove {{tag}}", - "skillManagement.detail.removeTagSuccess": "Tag removed.", - "skillManagement.detail.renameFile": "Rename file", - "skillManagement.detail.renameFileDescription": "Enter the new path relative to the skill root.", - "skillManagement.detail.renameFileSuccess": "File renamed.", - "skillManagement.detail.renameSkillSuccess": "Skill renamed.", - "skillManagement.detail.renameVersion": "Rename", - "skillManagement.detail.renameVersionFailed": "Failed to rename version.", - "skillManagement.detail.renameVersionPrompt": "Version name", - "skillManagement.detail.renameVersionSuccess": "Version renamed.", - "skillManagement.detail.restoreVersion": "Restore", - "skillManagement.detail.restoreVersionFailed": "Failed to restore version.", - "skillManagement.detail.restoreVersionSuccess": "Version restored to draft.", - "skillManagement.detail.save": "Save", - "skillManagement.detail.saveFailed": "Failed to save file.", - "skillManagement.detail.saveSuccess": "File saved.", - "skillManagement.detail.saved": "Saved", - "skillManagement.detail.savedAt": "Saved {{time}}", - "skillManagement.detail.saving": "Saving...", + "skillManagement.detail.readonly": "Alleen lezen", + "skillManagement.detail.referenceFiles.confirm": "Voer Bevestigen in", + "skillManagement.detail.referenceFiles.empty": "Geen bestanden beschikbaar.", + "skillManagement.detail.referenceFiles.livePlaceholder": "Schrijf instructies voor de agent. Typ / om naar bestanden te verwijzen.", + "skillManagement.detail.referenceFiles.navigate": "↑↓ Navigeren", + "skillManagement.detail.referenceFiles.title": "Referentiebestanden", + "skillManagement.detail.referencedBy_one": "Gebruikt door {{count}} agent", + "skillManagement.detail.referencedBy_other": "Gebruikt door {{count}} agenten", + "skillManagement.detail.removeMetadata": "Verwijder {{name}}-metagegevens", + "skillManagement.detail.removeTag": "Verwijder {{tag}}", + "skillManagement.detail.removeTagSuccess": "Label verwijderd.", + "skillManagement.detail.renameFile": "Bestand hernoemen", + "skillManagement.detail.renameFileDescription": "Voer het nieuwe pad in ten opzichte van de vaardigheidsroot.", + "skillManagement.detail.renameFileSuccess": "Bestand hernoemd.", + "skillManagement.detail.renameSkillSuccess": "Skill hernoemd.", + "skillManagement.detail.renameVersion": "Hernoemen", + "skillManagement.detail.renameVersionFailed": "Kan de naam van de versie niet wijzigen.", + "skillManagement.detail.renameVersionPrompt": "Versienaam", + "skillManagement.detail.renameVersionSuccess": "Versie hernoemd.", + "skillManagement.detail.resizeSidebar": "Formaat van bestandszijbalk wijzigen", + "skillManagement.detail.restoreVersion": "Herstellen", + "skillManagement.detail.restoreVersionConfirmDescription": "Hierdoor wordt het huidige concept vervangen door de bestanden uit \"{{version}}\". Het zal de Skill niet publiceren of een nieuwe versie maken.", + "skillManagement.detail.restoreVersionConfirmTitle": "Deze versie herstellen?", + "skillManagement.detail.restoreVersionFailed": "Kan de versie niet herstellen.", + "skillManagement.detail.restoreVersionSuccess": "Versie hersteld naar concept.", + "skillManagement.detail.save": "Redden", + "skillManagement.detail.saveConflictConfirmDescription": "Deze vaardigheid is elders bijgewerkt. Laad het nieuwste concept om door te gaan met bewerken. Uw huidige wijzigingen worden verwijderd.", + "skillManagement.detail.saveConflictConfirmTitle": "Het laatste concept laden?", + "skillManagement.detail.saveConflictReload": "Laad het laatste concept", + "skillManagement.detail.saveConflictStatus": "Conflict gedetecteerd. Laad het nieuwste concept om door te gaan met bewerken.", + "skillManagement.detail.saveFailed": "Kan bestand niet opslaan.", + "skillManagement.detail.saveSuccess": "Bestand opgeslagen.", + "skillManagement.detail.saved": "Opgeslagen", + "skillManagement.detail.savedAt": "Opgeslagen {{time}}", + "skillManagement.detail.saving": "Besparing...", "skillManagement.detail.searchFiles": "Bestanden zoeken", + "skillManagement.detail.showMoreReferences": "Laat {{count}} meer zien", + "skillManagement.detail.skillDescriptionPlaceholder": "Beschrijf wat deze vaardigheid doet en wanneer agenten deze moeten gebruiken.", + "skillManagement.detail.skillNamePlaceholder": "Gebruik kleine letters, cijfers en koppeltekens.", "skillManagement.detail.unpublishedChanges": "Niet-gepubliceerde wijzigingen", - "skillManagement.detail.unsavedChanges": "Unsaved changes", + "skillManagement.detail.unsavedChanges": "Niet-opgeslagen wijzigingen", "skillManagement.detail.upToDate": "Up-to-date", - "skillManagement.detail.updateTagsFailed": "Failed to update tags.", - "skillManagement.detail.uploadFile": "Upload file", - "skillManagement.detail.uploadFileFailed": "File upload failed.", - "skillManagement.detail.uploadFileSuccess": "File uploaded.", - "skillManagement.detail.uploadFilesMenu": "Upload files...", + "skillManagement.detail.updateTagsFailed": "Kan tags niet updaten.", + "skillManagement.detail.uploadCheckFailed": "Kan deze bestanden niet controleren. Probeer het opnieuw.", + "skillManagement.detail.uploadConflict": "Er bestaat al een bestand met deze naam.", + "skillManagement.detail.uploadFailureSummary": "{{failed}} van {{total}}-bestanden zijn mislukt", + "skillManagement.detail.uploadFailureTitle": "Sommige uploads zijn mislukt", + "skillManagement.detail.uploadFile": "Bestand uploaden", + "skillManagement.detail.uploadFileFailed": "Bestandsupload mislukt.", + "skillManagement.detail.uploadFileSuccess": "Bestand geüpload.", + "skillManagement.detail.uploadFilesButton": "Upload {{count}}-bestanden", + "skillManagement.detail.uploadFilesFailedStatus_one": "Uploaden van {{count}}-bestand mislukt.", + "skillManagement.detail.uploadFilesFailedStatus_other": "Uploaden van {{count}}-bestanden is mislukt.", + "skillManagement.detail.uploadFilesMenu": "Bestanden uploaden...", + "skillManagement.detail.uploadFilesProgress": "{{completed}}/{{total}} uploaden", + "skillManagement.detail.uploadFilesResult": "{{uploaded}} geüpload · {{failed}} mislukt", + "skillManagement.detail.uploadFilesStatus": "Uploadstatus", + "skillManagement.detail.uploadInvalidExtension": "Dit bestandstype wordt niet ondersteund.", + "skillManagement.detail.uploadInvalidName": "Ongeldige naam.", + "skillManagement.detail.uploadInvalidPath": "Ongeldig bestandspad.", + "skillManagement.detail.uploadKeepBoth": "Bewaar beide", + "skillManagement.detail.uploadLateConflict": "Iemand heeft dit bestand toegevoegd terwijl je aan het uploaden was.", + "skillManagement.detail.uploadMissingExtension": "Er is een bestandsextensie vereist.", + "skillManagement.detail.uploadNetworkFailure": "Uploaden mislukt. Controleer uw verbinding.", + "skillManagement.detail.uploadReadySummary": "{{ready}} klaar · {{decisions}} heeft een beslissing nodig · {{skipped}} wordt overgeslagen", + "skillManagement.detail.uploadReplace": "Vervangen", + "skillManagement.detail.uploadResolvedSummary": "{{ready}} gereed · {{skipped}} wordt overgeslagen", + "skillManagement.detail.uploadRetryCount": "Probeer {{count}} opnieuw", + "skillManagement.detail.uploadReviewTitle": "Controleer voordat u uploadt", + "skillManagement.detail.uploadSkip": "Overslaan", + "skillManagement.detail.uploadSkippedGroup": "{{count}}-bestanden kunnen niet worden geüpload en worden overgeslagen", + "skillManagement.detail.uploadStatusDismiss": "Uploadstatus afwijzen", + "skillManagement.detail.uploadSuggestion": "Gebruik suggestie", + "skillManagement.detail.uploadWillReplace": "Zal het bestaande bestand vervangen", + "skillManagement.detail.uploadWillUseName": "Zal uploaden als {{name}}", + "skillManagement.detail.versionHistory": "Versiegeschiedenis openen", "skillManagement.detail.versionMeta": "{{hash}} · {{time}}", - "skillManagement.detail.versions": "Versions", - "skillManagement.draft": "Draft", - "skillManagement.duplicateFailed": "Failed to duplicate skill.", - "skillManagement.duplicateSuccess": "Skill duplicated.", - "skillManagement.editedAt": "Edited {{time}}", - "skillManagement.empty": "No skills yet", - "skillManagement.emptySearch": "No skills found", - "skillManagement.import": "Import", - "skillManagement.importFailed": "Failed to import skill.", - "skillManagement.importSuccess": "Skill imported.", - "skillManagement.listLabel": "Workspace skills", - "skillManagement.loadingError": "Failed to load skills", - "skillManagement.moreActions": "More actions for {{name}}", - "skillManagement.noTags": "No tags", - "skillManagement.publishedAt": "Published {{time}}", - "skillManagement.referenceCount": "{{count}} Refs", - "skillManagement.searchLabel": "Search skills", - "skillManagement.searchPlaceholder": "Search", - "skillManagement.tags": "Tags", + "skillManagement.detail.versionPublishNote": "Release-opmerkingen", + "skillManagement.detail.versionPublishNotePlaceholder": "Beschrijf deze verandering", + "skillManagement.detail.versionPublishedMeta": "{{time}} · {{name}}", + "skillManagement.detail.versionTitle": "Titel", + "skillManagement.detail.versions": "Versies", + "skillManagement.detail.viewOnly": "Alleen bekijken", + "skillManagement.detail.viewUploadErrors": "Bekijk fouten", + "skillManagement.draft": "Concept", + "skillManagement.duplicateFailed": "Kan de vaardigheid niet dupliceren.", + "skillManagement.duplicateSuccess": "Skill gedupliceerd.", + "skillManagement.editedAt": "Bewerkt {{time}}", + "skillManagement.empty": "Nog geen skills", + "skillManagement.emptyAction.createDescription": "Beschrijf een scenario in gewone woorden en laat een conceptvaardigheid beoordelen.", + "skillManagement.emptyAction.createTitle": "Creëer met Skill Builder", + "skillManagement.emptyAction.importDescription": "Neem een ​​.zip mee met SKILL.md, in het agentskills.io-formaat.", + "skillManagement.emptyAction.importTitle": "Importeer een vaardighedenpakket", + "skillManagement.emptySearch": "Geen vaardigheden gevonden", + "skillManagement.errors.missingSkillMd": "Dit pakket heeft geen SKILL.md. Voeg het bestand toe en importeer het opnieuw.", + "skillManagement.errors.nameConflict": "Er bestaat al een vaardigheid met de naam \"{{name}}\". Hernoem het in SKILL.md en importeer opnieuw.", + "skillManagement.errors.workspaceLimit": "Uw werkruimte heeft de limiet van 500 vaardigheden bereikt. Verwijder een vaardigheid om een ​​nieuwe toe te voegen.", + "skillManagement.import": "Importeren", + "skillManagement.importFailed": "Kan vaardigheid niet importeren.", + "skillManagement.importSuccess": "Skill geïmporteerd.", + "skillManagement.listLabel": "Vaardigheden op het gebied van de werkruimte", + "skillManagement.loadingError": "Kan vaardigheden niet laden", + "skillManagement.moreActions": "Meer acties voor {{name}}", + "skillManagement.noDescription": "Nog geen beschrijving", + "skillManagement.noTags": "Geen labels", + "skillManagement.publishedAt": "Gepubliceerd {{time}}", + "skillManagement.referenceCount_one": "{{count}} agent", + "skillManagement.referenceCount_other": "{{count}} agenten", + "skillManagement.searchLabel": "Skills zoeken", + "skillManagement.searchPlaceholder": "Zoek op naam of beschrijving", + "skillManagement.tags": "Labels", "skillManagement.title": "Skills" } diff --git a/web/i18n/pl-PL/agent-v-2.json b/web/i18n/pl-PL/agent-v-2.json index 7f0485c3eb1..834faf52792 100644 --- a/web/i18n/pl-PL/agent-v-2.json +++ b/web/i18n/pl-PL/agent-v-2.json @@ -83,7 +83,7 @@ "agentDetail.configure.buildDraft.changesToApply_other": "{{count}} zmiany do zastosowania", "agentDetail.configure.buildDraft.discard": "Odrzuć", "agentDetail.configure.buildDraft.modeBadge": "Tryb budowania", - "agentDetail.configure.buildDraft.modeDescription": "Jesteś w trybie budowania. W tym trybie Configure może być aktualizowane tylko przez agenta. Dostosuj tę konfigurację przez czat po prawej, a następnie zastosuj.", + "agentDetail.configure.buildDraft.modeDescription": "Jesteś w trybie budowania. Ukształtuj tę konfigurację podczas rozmowy z agentem, a następnie kliknij Zastosuj.", "agentDetail.configure.buildDraft.rewritten": "Przepisano", "agentDetail.configure.buildDraft.title": "Szkic budowania", "agentDetail.configure.buildDraft.updated": "Zaktualizowano", @@ -105,7 +105,8 @@ "agentDetail.configure.files.preview.failed": "Nie udało się załadować podglądu.", "agentDetail.configure.files.preview.unsupported": "Ten plik nie obsługuje podglądu.", "agentDetail.configure.files.remove": "Usuń {{name}}", - "agentDetail.configure.files.tip": "Dla materiałów referencyjnych zbyt długich do wklejenia w Prompt: specyfikacje, szablony, wytyczne. Odwołuj się za pomocą / w Prompt.\n\nW trybie Build agent może skonfigurować je za Ciebie.", + "agentDetail.configure.files.richTip": "Dla materiałów referencyjnych zbyt długich do wklejenia w Prompt: specyfikacje, szablony, wytyczne. Dowiedz się więcej\n\nW trybie Build agent może skonfigurować je za Ciebie.", + "agentDetail.configure.files.tip": "Dla materiałów referencyjnych zbyt długich do wklejenia w Prompt: specyfikacje, szablony, wytyczne. Dowiedz się więcej\n\nW trybie Build agent może skonfigurować je za Ciebie.", "agentDetail.configure.files.toggle": "Przełącz pliki", "agentDetail.configure.files.treeLabel": "Pliki agenta", "agentDetail.configure.files.upload.action": "Prześlij", @@ -114,7 +115,7 @@ "agentDetail.configure.files.upload.dropzone": "Upuść plik tutaj lub", "agentDetail.configure.files.upload.failed": "Nie udało się przesłać pliku.", "agentDetail.configure.files.upload.fileType": "PLIK", - "agentDetail.configure.files.upload.invalidFile": "Prześlij jeden plik.", + "agentDetail.configure.files.upload.invalidFile": "Można przesłać tylko jeden plik naraz.", "agentDetail.configure.files.upload.success": "Plik przesłany.", "agentDetail.configure.files.upload.title": "Prześlij plik", "agentDetail.configure.knowledgeRetrieval.add": "Dodaj wyszukiwanie wiedzy", @@ -177,7 +178,8 @@ "agentDetail.configure.prompt.mention.priyaRamanathan": "Priya Ramanathan", "agentDetail.configure.prompt.placeholder": "Napisz tutaj instrukcje,", "agentDetail.configure.prompt.referenceMissing": "{{name}} nie istnieje", - "agentDetail.configure.prompt.tip": "Zdefiniuj rolę agenta i opisz jego typowe zadanie. Użyj /, aby jawnie odwołać się do umiejętności, plików, narzędzi i pobierania wiedzy.", + "agentDetail.configure.prompt.richTip": "Określ rolę agenta i sposób jego działania. Dowiedz się więcej", + "agentDetail.configure.prompt.tip": "Określ rolę agenta i sposób jego działania. Dowiedz się więcej", "agentDetail.configure.publishBar.draft": "Wersja robocza", "agentDetail.configure.publishBar.publishUpdate": "Opublikuj aktualizację", "agentDetail.configure.publishBar.published": "Opublikowane", @@ -190,12 +192,12 @@ "agentDetail.configure.publishBar.versionHistory": "Otwórz historię wersji", "agentDetail.configure.publishImpact.affectedWorkflows": "Workflow, których to dotyczy", "agentDetail.configure.publishImpact.cancel": "Anuluj", - "agentDetail.configure.publishImpact.descriptionPrefix": "Twój agent pojawia się w", - "agentDetail.configure.publishImpact.descriptionSuffix": ". Zmiany na nie wpłyną.", + "agentDetail.configure.publishImpact.descriptionPrefix": "Ten agent jest używany w", + "agentDetail.configure.publishImpact.descriptionSuffix": ". Publikacja zaktualizuje go we wszystkich z nich.", "agentDetail.configure.publishImpact.fallbackAgentName": "tego agenta", "agentDetail.configure.publishImpact.title": "{{action}} do {{name}}", - "agentDetail.configure.publishImpact.workflowCount_one": "{{count}} workflow", - "agentDetail.configure.publishImpact.workflowCount_other": "{{count}} workflow", + "agentDetail.configure.publishImpact.workflowCount_one": "{{count}} przepływie pracy", + "agentDetail.configure.publishImpact.workflowCount_other": "{{count}} przepływach pracy", "agentDetail.configure.rightPanel.build": "Buduj", "agentDetail.configure.rightPanel.buildTipBody": "Build konfiguruje agenta przez czat. Opisz, czego chcesz, a ustawienia po lewej zostaną uzupełnione.", "agentDetail.configure.rightPanel.buildTipTitle": "Zbuduj agenta przez czat", @@ -222,8 +224,8 @@ "agentDetail.configure.skills.openInLibrary": "Open in Skill library", "agentDetail.configure.skills.remove": "Usuń {{name}}", "agentDetail.configure.skills.removeAction": "Remove", - "agentDetail.configure.skills.richTip": "Spakuj instrukcje, pliki i skrypty dla powtarzalnego zadania w skill. Odwołuj się za pomocą / w Prompt. Dowiedz się więcej\n\nW trybie Build agent może skonfigurować je za Ciebie.", - "agentDetail.configure.skills.tip": "Spakuj instrukcje, pliki i skrypty dla powtarzalnego zadania w skill. Odwołuj się za pomocą / w Prompt. Dowiedz się więcej\n\nW trybie Build agent może skonfigurować je za Ciebie.", + "agentDetail.configure.skills.richTip": "Spakuj instrukcje, pliki i skrypty dla powtarzalnego zadania w skill. Dowiedz się więcej\n\nW trybie Build agent może skonfigurować je za Ciebie.", + "agentDetail.configure.skills.tip": "Spakuj instrukcje, pliki i skrypty dla powtarzalnego zadania w skill. Dowiedz się więcej\n\nW trybie Build agent może skonfigurować je za Ciebie.", "agentDetail.configure.skills.toggle": "Przełącz umiejętności", "agentDetail.configure.skills.upload.action": "Prześlij", "agentDetail.configure.skills.upload.browse": "przeglądaj", @@ -269,8 +271,8 @@ "agentDetail.configure.tools.moreActions": "Więcej akcji dla {{name}}", "agentDetail.configure.tools.removeAction": "Usuń {{name}}", "agentDetail.configure.tools.removeProvider": "Usuń wszystkie narzędzia", - "agentDetail.configure.tools.richTip": "Dodaj narzędzia Dify ze swojego workspace. Odwołuj się za pomocą / w Prompt. Dowiedz się więcej\n\nNarzędzia instalowane przez agenta w jego sandbox nie pojawią się tutaj, ale pozostaną dla niego dostępne.", - "agentDetail.configure.tools.tip": "Dodaj narzędzia Dify ze swojego workspace. Odwołuj się za pomocą / w Prompt. Dowiedz się więcej\n\nNarzędzia instalowane przez agenta w jego sandbox nie pojawią się tutaj, ale pozostaną dla niego dostępne.", + "agentDetail.configure.tools.richTip": "Dodaj narzędzia Dify ze swojego workspace. Dowiedz się więcej\n\nNarzędzia instalowane przez agenta w jego sandbox nie pojawią się tutaj, ale pozostaną dla niego dostępne.", + "agentDetail.configure.tools.tip": "Dodaj narzędzia Dify ze swojego workspace. Dowiedz się więcej\n\nNarzędzia instalowane przez agenta w jego sandbox nie pojawią się tutaj, ale pozostaną dla niego dostępne.", "agentDetail.configure.tools.toggle": "Przełącz narzędzia", "agentDetail.configure.tools.toolTabs.all": "Wszystkie", "agentDetail.configure.tools.toolTabs.cli": "CLI", @@ -336,22 +338,22 @@ "agentDetail.metadata.sourceLabel": "Źródło", "agentDetail.monitoring.change": "{{value}} w porównaniu z poprzednim okresem", "agentDetail.monitoring.dateRangeLabel": "Zakres dat", - "agentDetail.monitoring.description": "Śledź aktywność, koszt i jakość interakcji reużywalnego agenta w workflow.", + "agentDetail.monitoring.description": "Śledź aktywność tego agenta, koszty i jakość interakcji we wszystkich punktach dostępu.", "agentDetail.monitoring.learnMore": "Dowiedz się więcej", "agentDetail.monitoring.loadFailed": "Nie udało się wczytać danych monitorowania", - "agentDetail.monitoring.metrics.activeUsers.explanation": "Unikalni użytkownicy końcowi, którzy uruchomili workflow z tym agentem.", + "agentDetail.monitoring.metrics.activeUsers.explanation": "Unikalni użytkownicy końcowi, którzy weszli w interakcję z tym agentem.", "agentDetail.monitoring.metrics.activeUsers.title": "Aktywni użytkownicy", - "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Liczba ciągłych interakcji użytkownik-agent dla tego punktu dostępu.", + "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Średnia liczba wiadomości użytkownika na rozmowę.", "agentDetail.monitoring.metrics.avgSessionInteractions.title": "Śr. interakcje na sesję", - "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Średnia prędkość wyjścia od początku żądania do jego zakończenia.", + "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Średnia liczba tokenów generowanych na sekundę podczas odpowiedzi agenta.", "agentDetail.monitoring.metrics.tokenOutputSpeed.title": "Prędkość wyjścia tokenów", - "agentDetail.monitoring.metrics.tokenUsage.explanation": "Szacunkowy koszt tokenów wygenerowanych przez tego agenta w uruchomieniach workflow.", + "agentDetail.monitoring.metrics.tokenUsage.explanation": "Zużyte tokeny i szacowany koszt.", "agentDetail.monitoring.metrics.tokenUsage.title": "Użycie tokenów", "agentDetail.monitoring.metrics.totalConversations.explanation": "Dzienne rozmowy AI, które dotarły do tego agenta przez wybrany punkt dostępu.", "agentDetail.monitoring.metrics.totalConversations.title": "Liczba rozmów", - "agentDetail.monitoring.metrics.totalMessages.explanation": "Dzienna liczba interakcji z agentem.", + "agentDetail.monitoring.metrics.totalMessages.explanation": "Łączna liczba wiadomości wysłanych przez użytkowników do tego agenta.", "agentDetail.monitoring.metrics.totalMessages.title": "Liczba wiadomości", - "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "Liczba polubień na 1000 wiadomości dla tego agenta.", + "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "Odsetek odpowiedzi agenta, które użytkownicy polubili.", "agentDetail.monitoring.metrics.userSatisfactionRate.title": "Wskaźnik zadowolenia użytkowników", "agentDetail.monitoring.pickSource": "Wybierz aplikację", "agentDetail.monitoring.sourceLabel": "Aplikacja", @@ -549,7 +551,5 @@ "skillManagement.searchLabel": "Search skills", "skillManagement.searchPlaceholder": "Search", "skillManagement.tags": "Tags", - "skillManagement.title": "Skills", - "agentDetail.configure.files.richTip": "Dla materiałów referencyjnych zbyt długich do wklejenia w Prompt: specyfikacje, szablony, wytyczne. Dowiedz się więcej\n\nW trybie Build agent może skonfigurować je za Ciebie.", - "agentDetail.configure.prompt.richTip": "Określ rolę agenta i sposób jego działania. Dowiedz się więcej" + "skillManagement.title": "Skills" } diff --git a/web/i18n/pl-PL/skill.json b/web/i18n/pl-PL/skill.json index 7f50dd4b3c4..77f5d0a5b4d 100644 --- a/web/i18n/pl-PL/skill.json +++ b/web/i18n/pl-PL/skill.json @@ -1,121 +1,245 @@ { - "skillManagement.clearTags": "Clear tags", - "skillManagement.create": "Create", - "skillManagement.createFailed": "Failed to create skill.", - "skillManagement.createSuccess": "Skill created.", - "skillManagement.dateTimeFormat": "MMM D, YYYY HH:mm", + "skillManagement.clearTags": "Wyczyść tagi", + "skillManagement.create": "Utwórz", + "skillManagement.createFailed": "Nie udało się utworzyć umiejętności.", + "skillManagement.createSuccess": "Wersja robocza utworzona.", + "skillManagement.dateTimeFormat": "MMM D, RRRR GG:mm", "skillManagement.deleteDialog.confirmInputLabel": "Aby potwierdzić, wpisz {{skillName}} w polu poniżej:", "skillManagement.deleteDialog.confirmInputPlaceholder": "Wprowadź nazwę wyświetlaną Skill…", - "skillManagement.deleteDialog.description": "This skill will be removed from the workspace. Agents that reference it may lose access to this capability.", - "skillManagement.deleteDialog.title": "Delete {{name}}?", - "skillManagement.deleteFailed": "Failed to delete skill.", - "skillManagement.deleteSuccess": "Skill deleted.", - "skillManagement.detail.addMetadata": "Add metadata", - "skillManagement.detail.addMetadataDescription": "Add a frontmatter field to this Markdown file.", - "skillManagement.detail.addTag": "Add tag", - "skillManagement.detail.addTagDescription": "Create or bind a tag to this Skill. New tags are saved with the Skill metadata.", - "skillManagement.detail.addTagSuccess": "Tag added.", - "skillManagement.detail.back": "Back to Skills", - "skillManagement.detail.cancelAddMetadata": "Cancel adding metadata", - "skillManagement.detail.closeFileTab": "Close {{name}}", + "skillManagement.deleteDialog.description": "Usunięcie umiejętności jest nieodwracalne. Jego zawartość i pełna historia wersji zostaną trwale usunięte. Obecnie żaden agent z niego nie korzysta.", + "skillManagement.deleteDialog.referencedDescription_one": "Agent {{count}} korzysta z tej umiejętności samodzielnie lub w ramach przepływu pracy. Usunięcie tej umiejętności spowoduje trwałe usunięcie jej zawartości i historii wersji oraz usunięcie jej z agenta, którego to dotyczy.", + "skillManagement.deleteDialog.referencedDescription_other": "Agenci {{count}} korzystają z tej umiejętności niezależnie lub w przepływach pracy. Usunięcie tej umiejętności spowoduje trwałe usunięcie jej zawartości i historii wersji oraz usunięcie jej ze wszystkich agentów, których to dotyczy.", + "skillManagement.deleteDialog.title": "Usunąć {{name}}?", + "skillManagement.deleteFailed": "Nie udało się usunąć umiejętności.", + "skillManagement.deleteSuccess": "Skill usunięty.", + "skillManagement.detail.addMetadata": "Dodaj metadane", + "skillManagement.detail.addMetadataDescription": "Dodaj pole frontmatter do tego pliku Markdown.", + "skillManagement.detail.addTag": "Dodaj tag", + "skillManagement.detail.addTagDescription": "Utwórz lub powiąż tag z tym Skill. Nowe tagi są zapisywane z metadanymi Skill.", + "skillManagement.detail.addTagSuccess": "Dodano tag.", + "skillManagement.detail.back": "Powrót do Skills", + "skillManagement.detail.builder.applyFailed": "Nie udało się zastosować wersji roboczej aktualizacji.", + "skillManagement.detail.builder.attach": "Załącz plik", + "skillManagement.detail.builder.attachFailed": "Nie udało się załączyć pliku.", + "skillManagement.detail.builder.attachLimit": "Możesz załączyć maksymalnie 10 plików.", + "skillManagement.detail.builder.attachTooLarge": "Pliki muszą mieć 15 MB lub mniej. Obrazy muszą mieć 10 MB lub mniej.", + "skillManagement.detail.builder.attachUnsupported": "Załączać można wyłącznie obrazy, teksty i pliki dokumentów.", + "skillManagement.detail.builder.attachmentOnlyMessage": "Skorzystaj z załączonego pliku, aby udoskonalić tę umiejętność.", + "skillManagement.detail.builder.close": "Zamknij Skill Builder", + "skillManagement.detail.builder.compatibleModelsOnly": "Wyświetlane są tylko kompatybilne modele", + "skillManagement.detail.builder.copyResponse": "Skopiuj odpowiedź", + "skillManagement.detail.builder.copySuccess": "Odpowiedź skopiowana do schowka.", + "skillManagement.detail.builder.editIntro": "Sprawdziłem tę umiejętność. Co chciałbyś dostosować?", + "skillManagement.detail.builder.exampleIssueTriage": "Selekcja problemów klientów", + "skillManagement.detail.builder.exampleOnboarding": "Przewodnik dotyczący wdrażania nowych pracowników", + "skillManagement.detail.builder.exampleSalesFollowUp": "Strategia śledzenia leadów sprzedażowych", + "skillManagement.detail.builder.followUpDisplayName": "Jako nazwy wyświetlanej użyj Zatwierdzenia zwrotu pieniędzy", + "skillManagement.detail.builder.followUpNameIcon": "Zastosuj sugerowaną nazwę i ikonę", + "skillManagement.detail.builder.fromMarketplace": "Z Marketplace", + "skillManagement.detail.builder.model": "GPT-4o", + "skillManagement.detail.builder.modelCredits.all": "Wszystkie kredyty", + "skillManagement.detail.builder.modelCredits.configure": "Wymagana konfiguracja", + "skillManagement.detail.builder.modelCredits.exhausted": "Wyczerpany limit", + "skillManagement.detail.builder.modelProviderSettings": "Ustawienia dostawcy modeli", + "skillManagement.detail.builder.modelSearch": "Szukaj modeli...", + "skillManagement.detail.builder.modifyPlaceholder": "Poproś sztuczną inteligencję o zmodyfikowanie tej umiejętności...", + "skillManagement.detail.builder.open": "Otwórz Skill Builder", + "skillManagement.detail.builder.placeholder": "Opisz scenariusz...", + "skillManagement.detail.builder.progress.applyingChanges": "Stosowanie zmian w plikach", + "skillManagement.detail.builder.progress.generatingPlan": "Generowanie planu aktualizacji", + "skillManagement.detail.builder.progress.readingDraft": "Czytanie aktualnego projektu", + "skillManagement.detail.builder.progress.updatingEditor": "Aktualizacja edytora", + "skillManagement.detail.builder.promptDescription": "Opisz to, a w edytorze pojawi się wersja robocza zawierająca kroki i pliki.", + "skillManagement.detail.builder.promptTitle": "Z czym powinna sobie radzić ta umiejętność?", + "skillManagement.detail.builder.readAloud": "Przeczytaj głośno odpowiedź", + "skillManagement.detail.builder.removeAttachment": "Usuń {{name}}", + "skillManagement.detail.builder.restart": "Uruchom ponownie konstruktora", + "skillManagement.detail.builder.retryResponse": "Ponów próbę odpowiedzi", + "skillManagement.detail.builder.send": "Wyślij wiadomość", + "skillManagement.detail.builder.sendFailed": "Skill Builder nie odpowiedział.", + "skillManagement.detail.builder.thinking": "Myśli", + "skillManagement.detail.builder.thinkingUnavailable": "Model nie zwrócił żadnej treści myślącej.", + "skillManagement.detail.builder.title": "Skill Builder", + "skillManagement.detail.builder.tryExample": "Spróbuj przykładu", + "skillManagement.detail.builder.voice": "Wprowadzanie głosowe", + "skillManagement.detail.builder.voiceUnavailable": "Wprowadzanie głosowe nie jest jeszcze dostępne.", + "skillManagement.detail.cancelAddMetadata": "Anuluj dodawanie metadanych", + "skillManagement.detail.closeFileTab": "Zamknij {{name}}", + "skillManagement.detail.closeVersions": "Zamknij wersje", "skillManagement.detail.collapseSidebar": "Zwiń pasek boczny", - "skillManagement.detail.createFile": "New file", - "skillManagement.detail.createFileDescription": "Enter a file path relative to the skill root.", - "skillManagement.detail.createFileMenu": "New file...", - "skillManagement.detail.createFileSuccess": "File created.", - "skillManagement.detail.createFolder": "New folder", - "skillManagement.detail.createFolderDescription": "Enter a folder path relative to the skill root.", - "skillManagement.detail.createFolderMenu": "New folder...", - "skillManagement.detail.createFolderSuccess": "Folder created.", - "skillManagement.detail.createdBy": "Created by {{name}}", - "skillManagement.detail.currentDraft": "Current draft", - "skillManagement.detail.deleteFileConfirm": "Delete this file?", - "skillManagement.detail.deleteFileSuccess": "File deleted.", - "skillManagement.detail.deleteVersionConfirm": "Delete this version?", - "skillManagement.detail.deleteVersionFailed": "Failed to delete version.", - "skillManagement.detail.deleteVersionSuccess": "Version deleted.", - "skillManagement.detail.downloadFile": "Download file", - "skillManagement.detail.draft": "Draft", + "skillManagement.detail.copyContentSuccess": "Treść skopiowana do schowka.", + "skillManagement.detail.copyFile": "Kopiuj", + "skillManagement.detail.copyFileSuccess": "Plik gotowy do wklejenia.", + "skillManagement.detail.copyVersionId": "Kopiuj ID", + "skillManagement.detail.copyVersionIdSuccess": "Identyfikator skopiowany do schowka.", + "skillManagement.detail.createFile": "Nowy plik", + "skillManagement.detail.createFileDescription": "Wprowadź ścieżkę pliku względem katalogu głównego umiejętności.", + "skillManagement.detail.createFileMenu": "Nowy plik...", + "skillManagement.detail.createFileSuccess": "Plik został utworzony.", + "skillManagement.detail.createFolder": "Nowy folder", + "skillManagement.detail.createFolderDescription": "Wprowadź ścieżkę folderu względem katalogu głównego umiejętności.", + "skillManagement.detail.createFolderMenu": "Nowy folder...", + "skillManagement.detail.createFolderSuccess": "Folder został utworzony.", + "skillManagement.detail.createdBy": "Utworzony przez {{name}}", + "skillManagement.detail.currentDraft": "Aktualny projekt", + "skillManagement.detail.cutFile": "Cięcie", + "skillManagement.detail.cutFileSuccess": "Plik gotowy do przeniesienia.", + "skillManagement.detail.deleteFileConfirm": "Usunąć ten plik?", + "skillManagement.detail.deleteFileSuccess": "Plik usunięty.", + "skillManagement.detail.deleteVersionConfirm": "Usunąć tę wersję?", + "skillManagement.detail.deleteVersionFailed": "Nie udało się usunąć wersji.", + "skillManagement.detail.deleteVersionSuccess": "Wersja usunięta.", + "skillManagement.detail.downloadFile": "Pobierz plik", + "skillManagement.detail.draft": "Wersja robocza", + "skillManagement.detail.editVersionInfo": "Edytuj informacje o wersji", + "skillManagement.detail.exitVersions": "Opuść wersje", "skillManagement.detail.expandSidebar": "Rozwiń pasek boczny", - "skillManagement.detail.fileCount": "{{count}} FILES", - "skillManagement.detail.fileMeta": "{{type}} · {{size}} bytes", - "skillManagement.detail.fileMissing": "File not found.", - "skillManagement.detail.fileOperationFailed": "File operation failed.", - "skillManagement.detail.files": "Files", - "skillManagement.detail.latest": "Latest", - "skillManagement.detail.loadFailed": "Failed to load skill.", - "skillManagement.detail.markdownLiveMode": "Live preview", - "skillManagement.detail.markdownSourceMode": "Source editor", - "skillManagement.detail.metadataKey": "name", - "skillManagement.detail.metadataValue": "value", - "skillManagement.detail.moveFileSuccess": "File moved.", - "skillManagement.detail.moveFilesSuccess": "Files moved.", - "skillManagement.detail.noFileSelected": "Select a file to preview.", - "skillManagement.detail.noFiles": "No files.", + "skillManagement.detail.fileAlreadyExists": "Plik lub folder o tej nazwie już istnieje.", + "skillManagement.detail.fileCount_one": "Plik {{count}}", + "skillManagement.detail.fileCount_other": "Pliki {{count}}", + "skillManagement.detail.fileMeta": "{{type}} · {{size}} bajtów", + "skillManagement.detail.fileMissing": "Nie znaleziono pliku.", + "skillManagement.detail.fileOperationFailed": "Operacja na pliku nie powiodła się.", + "skillManagement.detail.files": "Pliki", + "skillManagement.detail.latest": "Najnowszy", + "skillManagement.detail.loadFailed": "Nie udało się załadować umiejętności.", + "skillManagement.detail.loadingTags": "Ładowanie tagów...", + "skillManagement.detail.markdownLiveMode": "Podgląd na żywo", + "skillManagement.detail.markdownSourceMode": "Redaktor źródła", + "skillManagement.detail.metadataKey": "nazwa", + "skillManagement.detail.metadataValue": "wartość", + "skillManagement.detail.moveFileSuccess": "Plik został przeniesiony.", + "skillManagement.detail.moveFilesSuccess": "Pliki zostały przeniesione.", + "skillManagement.detail.nameThisVersion": "Nazwij tę wersję", + "skillManagement.detail.noFileSelected": "Wybierz plik do podglądu.", + "skillManagement.detail.noFiles": "Brak plików.", "skillManagement.detail.noSearchResults": "Brak pasujących plików.", - "skillManagement.detail.noVersions": "No published versions yet.", - "skillManagement.detail.previewUnsupported": "Preview is not supported for this file.", - "skillManagement.detail.publish": "Publish", - "skillManagement.detail.publishFailed": "Failed to publish skill.", - "skillManagement.detail.publishSuccess": "Skill published.", - "skillManagement.detail.published": "Published", + "skillManagement.detail.noSelectableTags": "Brak dostępnych tagów.", + "skillManagement.detail.noVersions": "Nie ma jeszcze opublikowanych wersji.", + "skillManagement.detail.pasteFile": "Pasta", + "skillManagement.detail.pasteFileSuccess": "Plik wklejony.", + "skillManagement.detail.previewUnsupported": "Ten plik nie obsługuje podglądu.", + "skillManagement.detail.publish": "Opublikuj", + "skillManagement.detail.publishFailed": "Nie udało się opublikować umiejętności.", + "skillManagement.detail.publishReferencesDescription_one": "Publikowanie zaczyna obowiązywać natychmiast w przypadku agenta {{count}} korzystającego z tej umiejętności.", + "skillManagement.detail.publishReferencesDescription_other": "Publikowanie zaczyna obowiązywać natychmiast w przypadku agentów {{count}} korzystających z tej umiejętności.", + "skillManagement.detail.publishReferencesTitle": "Publikuj umiejętności", + "skillManagement.detail.publishSuccess": "Skill opublikowany.", + "skillManagement.detail.publishUpdate": "Opublikuj aktualizację", + "skillManagement.detail.published": "Opublikowane", "skillManagement.detail.publishedAt": "Opublikowano {{time}}", + "skillManagement.detail.publishedVersion": "Opublikowano #{{number}}", "skillManagement.detail.publishing": "Publikowanie...", - "skillManagement.detail.readonly": "Read only", - "skillManagement.detail.referenceFiles.confirm": "Enter Confirm", - "skillManagement.detail.referenceFiles.empty": "No files available.", - "skillManagement.detail.referenceFiles.livePlaceholder": "Write instructions for the agent, type / to reference files", - "skillManagement.detail.referenceFiles.navigate": "↑↓ Navigate", - "skillManagement.detail.referenceFiles.title": "Reference files", - "skillManagement.detail.referencedBy": "Referenced by {{count}} Apps", - "skillManagement.detail.removeMetadata": "Delete {{name}} metadata", - "skillManagement.detail.removeTag": "Remove {{tag}}", - "skillManagement.detail.removeTagSuccess": "Tag removed.", - "skillManagement.detail.renameFile": "Rename file", - "skillManagement.detail.renameFileDescription": "Enter the new path relative to the skill root.", - "skillManagement.detail.renameFileSuccess": "File renamed.", - "skillManagement.detail.renameSkillSuccess": "Skill renamed.", - "skillManagement.detail.renameVersion": "Rename", - "skillManagement.detail.renameVersionFailed": "Failed to rename version.", - "skillManagement.detail.renameVersionPrompt": "Version name", - "skillManagement.detail.renameVersionSuccess": "Version renamed.", - "skillManagement.detail.restoreVersion": "Restore", - "skillManagement.detail.restoreVersionFailed": "Failed to restore version.", - "skillManagement.detail.restoreVersionSuccess": "Version restored to draft.", - "skillManagement.detail.save": "Save", - "skillManagement.detail.saveFailed": "Failed to save file.", - "skillManagement.detail.saveSuccess": "File saved.", - "skillManagement.detail.saved": "Saved", - "skillManagement.detail.savedAt": "Saved {{time}}", - "skillManagement.detail.saving": "Saving...", + "skillManagement.detail.readonly": "Tylko do odczytu", + "skillManagement.detail.referenceFiles.confirm": "Wprowadź Potwierdź", + "skillManagement.detail.referenceFiles.empty": "Brak dostępnych plików.", + "skillManagement.detail.referenceFiles.livePlaceholder": "Napisz instrukcje dla agenta. Wpisz /, aby odwołać się do plików.", + "skillManagement.detail.referenceFiles.navigate": "↑↓ Nawiguj", + "skillManagement.detail.referenceFiles.title": "Pliki referencyjne", + "skillManagement.detail.referencedBy_one": "Używany przez {{count}} agenta", + "skillManagement.detail.referencedBy_other": "Używany przez {{count}} agentów", + "skillManagement.detail.removeMetadata": "Usuń metadane {{name}}", + "skillManagement.detail.removeTag": "Usuń {{tag}}", + "skillManagement.detail.removeTagSuccess": "Etykieta usunięta.", + "skillManagement.detail.renameFile": "Zmień nazwę pliku", + "skillManagement.detail.renameFileDescription": "Wprowadź nową ścieżkę względem korzenia umiejętności.", + "skillManagement.detail.renameFileSuccess": "Zmieniono nazwę pliku.", + "skillManagement.detail.renameSkillSuccess": "Zmieniono nazwę Skill.", + "skillManagement.detail.renameVersion": "Zmień nazwę", + "skillManagement.detail.renameVersionFailed": "Nie udało się zmienić nazwy wersji.", + "skillManagement.detail.renameVersionPrompt": "Nazwa wersji", + "skillManagement.detail.renameVersionSuccess": "Zmieniono nazwę wersji.", + "skillManagement.detail.resizeSidebar": "Zmień rozmiar paska bocznego pliku", + "skillManagement.detail.restoreVersion": "Przywróć", + "skillManagement.detail.restoreVersionConfirmDescription": "Spowoduje to zastąpienie bieżącej wersji roboczej plikami z „{{version}}”. Nie opublikuje Skill ani nie utworzy nowej wersji.", + "skillManagement.detail.restoreVersionConfirmTitle": "Przywrócić tę wersję?", + "skillManagement.detail.restoreVersionFailed": "Nie udało się przywrócić wersji.", + "skillManagement.detail.restoreVersionSuccess": "Wersja przywrócona do wersji roboczej.", + "skillManagement.detail.save": "Zapisz", + "skillManagement.detail.saveConflictConfirmDescription": "Ta umiejętność została zaktualizowana w innym miejscu. Załaduj najnowszą wersję roboczą, aby kontynuować edycję. Twoje obecne zmiany zostaną odrzucone.", + "skillManagement.detail.saveConflictConfirmTitle": "Załadować najnowszą wersję roboczą?", + "skillManagement.detail.saveConflictReload": "Załaduj najnowszą wersję roboczą", + "skillManagement.detail.saveConflictStatus": "Wykryto konflikt. Załaduj najnowszą wersję roboczą, aby kontynuować edycję.", + "skillManagement.detail.saveFailed": "Nie udało się zapisać pliku.", + "skillManagement.detail.saveSuccess": "Plik został zapisany.", + "skillManagement.detail.saved": "Zapisane", + "skillManagement.detail.savedAt": "Zapisano {{time}}", + "skillManagement.detail.saving": "Zapisywanie...", "skillManagement.detail.searchFiles": "Szukaj plików", + "skillManagement.detail.showMoreReferences": "Pokaż więcej {{count}}", + "skillManagement.detail.skillDescriptionPlaceholder": "Opisz, do czego służy ta umiejętność i kiedy agenci powinni z niej korzystać.", + "skillManagement.detail.skillNamePlaceholder": "Używaj małych liter, cyfr i łączników.", "skillManagement.detail.unpublishedChanges": "Nieopublikowane zmiany", - "skillManagement.detail.unsavedChanges": "Unsaved changes", + "skillManagement.detail.unsavedChanges": "Niezapisane zmiany", "skillManagement.detail.upToDate": "Aktualne", - "skillManagement.detail.updateTagsFailed": "Failed to update tags.", - "skillManagement.detail.uploadFile": "Upload file", - "skillManagement.detail.uploadFileFailed": "File upload failed.", - "skillManagement.detail.uploadFileSuccess": "File uploaded.", - "skillManagement.detail.uploadFilesMenu": "Upload files...", + "skillManagement.detail.updateTagsFailed": "Nie udało się zaktualizować tagów.", + "skillManagement.detail.uploadCheckFailed": "Nie udało się sprawdzić tych plików. Spróbuj ponownie.", + "skillManagement.detail.uploadConflict": "Plik o tej nazwie już istnieje.", + "skillManagement.detail.uploadFailureSummary": "Pliki {{failed}} lub {{total}} nie powiodły się", + "skillManagement.detail.uploadFailureTitle": "Nie udało się przesłać niektórych plików", + "skillManagement.detail.uploadFile": "Prześlij plik", + "skillManagement.detail.uploadFileFailed": "Przesyłanie pliku nie powiodło się.", + "skillManagement.detail.uploadFileSuccess": "Plik przesłany.", + "skillManagement.detail.uploadFilesButton": "Prześlij pliki {{count}}", + "skillManagement.detail.uploadFilesFailedStatus_one": "Przesyłanie pliku {{count}} nie powiodło się.", + "skillManagement.detail.uploadFilesFailedStatus_other": "Przesyłanie pliku {{count}} nie powiodło się.", + "skillManagement.detail.uploadFilesMenu": "Prześlij pliki...", + "skillManagement.detail.uploadFilesProgress": "Przesyłanie {{completed}}/{{total}}", + "skillManagement.detail.uploadFilesResult": "Przesłano {{uploaded}} · {{failed}} nie powiodło się", + "skillManagement.detail.uploadFilesStatus": "Prześlij stan", + "skillManagement.detail.uploadInvalidExtension": "Ten typ pliku nie jest obsługiwany.", + "skillManagement.detail.uploadInvalidName": "Nieprawidłowa nazwa.", + "skillManagement.detail.uploadInvalidPath": "Nieprawidłowa ścieżka pliku.", + "skillManagement.detail.uploadKeepBoth": "Zachowaj oba", + "skillManagement.detail.uploadLateConflict": "Ktoś dodał ten plik podczas przesyłania.", + "skillManagement.detail.uploadMissingExtension": "Wymagane jest rozszerzenie pliku.", + "skillManagement.detail.uploadNetworkFailure": "Przesyłanie nie powiodło się. Sprawdź swoje połączenie.", + "skillManagement.detail.uploadReadySummary": "{{ready}} gotowy · {{decisions}} wymaga decyzji · {{skipped}} zostanie pominięty", + "skillManagement.detail.uploadReplace": "Zastępować", + "skillManagement.detail.uploadResolvedSummary": "{{ready}} gotowy · {{skipped}} zostanie pominięty", + "skillManagement.detail.uploadRetryCount": "Spróbuj ponownie {{count}}", + "skillManagement.detail.uploadReviewTitle": "Przejrzyj przed przesłaniem", + "skillManagement.detail.uploadSkip": "Statek", + "skillManagement.detail.uploadSkippedGroup": "Nie można przesłać plików {{count}} i zostaną one pominięte", + "skillManagement.detail.uploadStatusDismiss": "Odrzuć stan przesyłania", + "skillManagement.detail.uploadSuggestion": "Skorzystaj z sugestii", + "skillManagement.detail.uploadWillReplace": "Zastąpi istniejący plik", + "skillManagement.detail.uploadWillUseName": "Przesłane jako {{name}}", + "skillManagement.detail.versionHistory": "Otwórz historię wersji", "skillManagement.detail.versionMeta": "{{hash}} · {{time}}", - "skillManagement.detail.versions": "Versions", - "skillManagement.draft": "Draft", - "skillManagement.duplicateFailed": "Failed to duplicate skill.", - "skillManagement.duplicateSuccess": "Skill duplicated.", - "skillManagement.editedAt": "Edited {{time}}", - "skillManagement.empty": "No skills yet", - "skillManagement.emptySearch": "No skills found", - "skillManagement.import": "Import", - "skillManagement.importFailed": "Failed to import skill.", - "skillManagement.importSuccess": "Skill imported.", - "skillManagement.listLabel": "Workspace skills", - "skillManagement.loadingError": "Failed to load skills", - "skillManagement.moreActions": "More actions for {{name}}", - "skillManagement.noTags": "No tags", - "skillManagement.publishedAt": "Published {{time}}", - "skillManagement.referenceCount": "{{count}} Refs", - "skillManagement.searchLabel": "Search skills", - "skillManagement.searchPlaceholder": "Search", - "skillManagement.tags": "Tags", - "skillManagement.title": "Skills" + "skillManagement.detail.versionPublishNote": "Informacje o wydaniu", + "skillManagement.detail.versionPublishNotePlaceholder": "Opisz tę zmianę", + "skillManagement.detail.versionPublishedMeta": "{{time}} · {{name}}", + "skillManagement.detail.versionTitle": "Tytuł", + "skillManagement.detail.versions": "Wersje", + "skillManagement.detail.viewOnly": "Tylko przeglądaj", + "skillManagement.detail.viewUploadErrors": "Wyświetl błędy", + "skillManagement.draft": "Wersja robocza", + "skillManagement.duplicateFailed": "Nie udało się zduplikować umiejętności.", + "skillManagement.duplicateSuccess": "Skill zduplikowany.", + "skillManagement.editedAt": "Edytowano {{time}}", + "skillManagement.empty": "Brak umiejętności", + "skillManagement.emptyAction.createDescription": "Opisz scenariusz prostymi słowami i uzyskaj projekt umiejętności do przejrzenia.", + "skillManagement.emptyAction.createTitle": "Twórz za pomocą Skill Builder", + "skillManagement.emptyAction.importDescription": "Przynieś plik .zip z SKILL.md w formacie agentskills.io.", + "skillManagement.emptyAction.importTitle": "Zaimportuj pakiet umiejętności", + "skillManagement.emptySearch": "Nie znaleziono umiejętności", + "skillManagement.errors.missingSkillMd": "Ten pakiet nie zawiera SKILL.md. Dodaj plik i zaimportuj go ponownie.", + "skillManagement.errors.nameConflict": "Umiejętność o nazwie „{{name}}” już istnieje. Zmień jego nazwę na SKILL.md i zaimportuj ponownie.", + "skillManagement.errors.workspaceLimit": "Twój obszar roboczy osiągnął limit 500 umiejętności. Usuń umiejętność, aby dodać nową.", + "skillManagement.import": "Importuj", + "skillManagement.importFailed": "Nie udało się zaimportować umiejętności.", + "skillManagement.importSuccess": "Skill zaimportowano.", + "skillManagement.listLabel": "Umiejętności obszaru roboczego", + "skillManagement.loadingError": "Nie udało się załadować umiejętności", + "skillManagement.moreActions": "Więcej akcji dla {{name}}", + "skillManagement.noDescription": "Nie ma jeszcze opisu", + "skillManagement.noTags": "Brak tagów", + "skillManagement.publishedAt": "Opublikowano {{time}}", + "skillManagement.referenceCount_one": "{{count}} agent", + "skillManagement.referenceCount_other": "{{count}} agentów", + "skillManagement.searchLabel": "Szukaj umiejętności", + "skillManagement.searchPlaceholder": "Szukaj według nazwy lub opisu", + "skillManagement.tags": "Tagi", + "skillManagement.title": "Umiejętności" } diff --git a/web/i18n/pt-BR/agent-v-2.json b/web/i18n/pt-BR/agent-v-2.json index 67dcece2414..618bd8029e4 100644 --- a/web/i18n/pt-BR/agent-v-2.json +++ b/web/i18n/pt-BR/agent-v-2.json @@ -83,7 +83,7 @@ "agentDetail.configure.buildDraft.changesToApply_other": "{{count}} alterações para aplicar", "agentDetail.configure.buildDraft.discard": "Descartar", "agentDetail.configure.buildDraft.modeBadge": "Modo build", - "agentDetail.configure.buildDraft.modeDescription": "Você está no modo build. O Configure só pode ser atualizado pelo agente neste modo. Ajuste esta configuração pelo chat à direita e depois aplique.", + "agentDetail.configure.buildDraft.modeDescription": "Você está no modo build. Defina esta configuração conversando com o agente e depois clique em Aplicar.", "agentDetail.configure.buildDraft.rewritten": "Reescrito", "agentDetail.configure.buildDraft.title": "Rascunho de build", "agentDetail.configure.buildDraft.updated": "Atualizado", @@ -105,7 +105,8 @@ "agentDetail.configure.files.preview.failed": "Falha ao carregar a pré-visualização.", "agentDetail.configure.files.preview.unsupported": "Este arquivo não oferece suporte à pré-visualização.", "agentDetail.configure.files.remove": "Remover {{name}}", - "agentDetail.configure.files.tip": "Para materiais de referência longos demais para colar no Prompt: especificações, modelos, diretrizes. Referencie com / no Prompt.\n\nNo modo Build, o agente pode configurar isso para você.", + "agentDetail.configure.files.richTip": "Para materiais de referência longos demais para colar no Prompt: especificações, modelos, diretrizes. Saiba mais\n\nNo modo Build, o agente pode configurar isso para você.", + "agentDetail.configure.files.tip": "Para materiais de referência longos demais para colar no Prompt: especificações, modelos, diretrizes. Saiba mais\n\nNo modo Build, o agente pode configurar isso para você.", "agentDetail.configure.files.toggle": "Alternar arquivos", "agentDetail.configure.files.treeLabel": "Arquivos do agente", "agentDetail.configure.files.upload.action": "Enviar", @@ -114,7 +115,7 @@ "agentDetail.configure.files.upload.dropzone": "Solte um arquivo aqui, ou", "agentDetail.configure.files.upload.failed": "Falha ao enviar o arquivo.", "agentDetail.configure.files.upload.fileType": "ARQUIVO", - "agentDetail.configure.files.upload.invalidFile": "Envie um arquivo.", + "agentDetail.configure.files.upload.invalidFile": "Só é possível enviar um arquivo por vez.", "agentDetail.configure.files.upload.success": "Arquivo enviado.", "agentDetail.configure.files.upload.title": "Enviar arquivo", "agentDetail.configure.knowledgeRetrieval.add": "Adicionar recuperação de conhecimento", @@ -177,7 +178,8 @@ "agentDetail.configure.prompt.mention.priyaRamanathan": "Priya Ramanathan", "agentDetail.configure.prompt.placeholder": "Escreva as instruções aqui,", "agentDetail.configure.prompt.referenceMissing": "{{name}} não existe", - "agentDetail.configure.prompt.tip": "Defina o papel do agente e descreva sua tarefa típica. Use / para fazer referência explícita a habilidades, arquivos, ferramentas e recuperações de conhecimento.", + "agentDetail.configure.prompt.richTip": "Defina o papel do agente e como ele deve trabalhar. Saiba mais", + "agentDetail.configure.prompt.tip": "Defina o papel do agente e como ele deve trabalhar. Saiba mais", "agentDetail.configure.publishBar.draft": "Rascunho", "agentDetail.configure.publishBar.publishUpdate": "Publicar atualização", "agentDetail.configure.publishBar.published": "Publicado", @@ -190,8 +192,8 @@ "agentDetail.configure.publishBar.versionHistory": "Abrir histórico de versões", "agentDetail.configure.publishImpact.affectedWorkflows": "Workflows afetados", "agentDetail.configure.publishImpact.cancel": "Cancelar", - "agentDetail.configure.publishImpact.descriptionPrefix": "Seu agente aparece em", - "agentDetail.configure.publishImpact.descriptionSuffix": ". As alterações irão impactá-los.", + "agentDetail.configure.publishImpact.descriptionPrefix": "Este agente é usado em", + "agentDetail.configure.publishImpact.descriptionSuffix": ". Ao publicá-lo, ele será atualizado em todos eles.", "agentDetail.configure.publishImpact.fallbackAgentName": "este agente", "agentDetail.configure.publishImpact.title": "{{action}} em {{name}}", "agentDetail.configure.publishImpact.workflowCount_one": "{{count}} workflow", @@ -222,8 +224,8 @@ "agentDetail.configure.skills.openInLibrary": "Open in Skill library", "agentDetail.configure.skills.remove": "Remover {{name}}", "agentDetail.configure.skills.removeAction": "Remove", - "agentDetail.configure.skills.richTip": "Empacote as instruções, arquivos e scripts de uma tarefa recorrente em uma skill. Referencie com / no Prompt. Saiba mais\n\nNo modo Build, o agente pode configurar isso para você.", - "agentDetail.configure.skills.tip": "Empacote as instruções, arquivos e scripts de uma tarefa recorrente em uma skill. Referencie com / no Prompt. Saiba mais\n\nNo modo Build, o agente pode configurar isso para você.", + "agentDetail.configure.skills.richTip": "Empacote as instruções, arquivos e scripts de uma tarefa recorrente em uma skill. Saiba mais\n\nNo modo Build, o agente pode configurar isso para você.", + "agentDetail.configure.skills.tip": "Empacote as instruções, arquivos e scripts de uma tarefa recorrente em uma skill. Saiba mais\n\nNo modo Build, o agente pode configurar isso para você.", "agentDetail.configure.skills.toggle": "Alternar habilidades", "agentDetail.configure.skills.upload.action": "Enviar", "agentDetail.configure.skills.upload.browse": "procurar", @@ -269,8 +271,8 @@ "agentDetail.configure.tools.moreActions": "Mais ações para {{name}}", "agentDetail.configure.tools.removeAction": "Remover {{name}}", "agentDetail.configure.tools.removeProvider": "Remover todas as ferramentas", - "agentDetail.configure.tools.richTip": "Adicione ferramentas Dify do seu workspace. Referencie com / no Prompt. Saiba mais\n\nAs ferramentas que o agente instala no sandbox não aparecerão aqui, mas continuarão disponíveis para ele.", - "agentDetail.configure.tools.tip": "Adicione ferramentas Dify do seu workspace. Referencie com / no Prompt. Saiba mais\n\nAs ferramentas que o agente instala no sandbox não aparecerão aqui, mas continuarão disponíveis para ele.", + "agentDetail.configure.tools.richTip": "Adicione ferramentas Dify do seu workspace. Saiba mais\n\nAs ferramentas que o agente instala no sandbox não aparecerão aqui, mas continuarão disponíveis para ele.", + "agentDetail.configure.tools.tip": "Adicione ferramentas Dify do seu workspace. Saiba mais\n\nAs ferramentas que o agente instala no sandbox não aparecerão aqui, mas continuarão disponíveis para ele.", "agentDetail.configure.tools.toggle": "Alternar ferramentas", "agentDetail.configure.tools.toolTabs.all": "Todas", "agentDetail.configure.tools.toolTabs.cli": "CLI", @@ -336,22 +338,22 @@ "agentDetail.metadata.sourceLabel": "Origem", "agentDetail.monitoring.change": "{{value}} em relação ao período anterior", "agentDetail.monitoring.dateRangeLabel": "Intervalo de datas", - "agentDetail.monitoring.description": "Acompanhe a atividade, o custo e a qualidade de interação do agente reutilizável em todos os workflows.", + "agentDetail.monitoring.description": "Acompanhe a atividade, o custo e a qualidade das interações deste agente em todos os pontos de acesso.", "agentDetail.monitoring.learnMore": "Saiba mais", "agentDetail.monitoring.loadFailed": "Falha ao carregar dados de monitoramento", - "agentDetail.monitoring.metrics.activeUsers.explanation": "Usuários finais únicos que acionaram workflows usando este agente.", + "agentDetail.monitoring.metrics.activeUsers.explanation": "Usuários finais únicos que interagiram com este agente.", "agentDetail.monitoring.metrics.activeUsers.title": "Usuários ativos", - "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Contagem de comunicação contínua entre usuário e agente para este ponto de acesso.", + "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Número médio de mensagens de usuários por conversa.", "agentDetail.monitoring.metrics.avgSessionInteractions.title": "Méd. de interações por sessão", - "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Velocidade média de saída desde o início da solicitação até a conclusão.", + "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Média de tokens gerados por segundo durante uma resposta do agente.", "agentDetail.monitoring.metrics.tokenOutputSpeed.title": "Velocidade de saída de tokens", - "agentDetail.monitoring.metrics.tokenUsage.explanation": "Custo estimado em tokens produzido por este agente nas execuções de workflow.", + "agentDetail.monitoring.metrics.tokenUsage.explanation": "Tokens consumidos e custo estimado.", "agentDetail.monitoring.metrics.tokenUsage.title": "Uso de tokens", "agentDetail.monitoring.metrics.totalConversations.explanation": "Conversas de IA diárias que alcançaram este agente através do ponto de acesso selecionado.", "agentDetail.monitoring.metrics.totalConversations.title": "Total de conversas", - "agentDetail.monitoring.metrics.totalMessages.explanation": "Contagem diária de interações do agente.", + "agentDetail.monitoring.metrics.totalMessages.explanation": "Número total de mensagens de usuários enviadas a este agente.", "agentDetail.monitoring.metrics.totalMessages.title": "Total de mensagens", - "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "O número de curtidas por 1.000 mensagens para este agente.", + "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "Percentual de respostas do agente que receberam uma curtida dos usuários.", "agentDetail.monitoring.metrics.userSatisfactionRate.title": "Taxa de satisfação do usuário", "agentDetail.monitoring.pickSource": "Escolha um aplicativo", "agentDetail.monitoring.sourceLabel": "Aplicativo", @@ -549,7 +551,5 @@ "skillManagement.searchLabel": "Search skills", "skillManagement.searchPlaceholder": "Search", "skillManagement.tags": "Tags", - "skillManagement.title": "Skills", - "agentDetail.configure.files.richTip": "Para materiais de referência longos demais para colar no Prompt: especificações, modelos, diretrizes. Saiba mais\n\nNo modo Build, o agente pode configurar isso para você.", - "agentDetail.configure.prompt.richTip": "Defina o papel do agente e como ele deve trabalhar. Saiba mais" + "skillManagement.title": "Skills" } diff --git a/web/i18n/pt-BR/skill.json b/web/i18n/pt-BR/skill.json index 6a7d76786c8..aeb9e73fe5a 100644 --- a/web/i18n/pt-BR/skill.json +++ b/web/i18n/pt-BR/skill.json @@ -1,121 +1,245 @@ { - "skillManagement.clearTags": "Clear tags", - "skillManagement.create": "Create", - "skillManagement.createFailed": "Failed to create skill.", - "skillManagement.createSuccess": "Skill created.", - "skillManagement.dateTimeFormat": "MMM D, YYYY HH:mm", + "skillManagement.clearTags": "Limpar tags", + "skillManagement.create": "Criar", + "skillManagement.createFailed": "Falha ao criar habilidade.", + "skillManagement.createSuccess": "Rascunho criado.", + "skillManagement.dateTimeFormat": "MMM D, AAAA HH:mm", "skillManagement.deleteDialog.confirmInputLabel": "Para confirmar, digite {{skillName}} no campo abaixo:", "skillManagement.deleteDialog.confirmInputPlaceholder": "Digite o nome de exibição da Skill…", - "skillManagement.deleteDialog.description": "This skill will be removed from the workspace. Agents that reference it may lose access to this capability.", - "skillManagement.deleteDialog.title": "Delete {{name}}?", - "skillManagement.deleteFailed": "Failed to delete skill.", - "skillManagement.deleteSuccess": "Skill deleted.", - "skillManagement.detail.addMetadata": "Add metadata", - "skillManagement.detail.addMetadataDescription": "Add a frontmatter field to this Markdown file.", - "skillManagement.detail.addTag": "Add tag", - "skillManagement.detail.addTagDescription": "Create or bind a tag to this Skill. New tags are saved with the Skill metadata.", - "skillManagement.detail.addTagSuccess": "Tag added.", - "skillManagement.detail.back": "Back to Skills", - "skillManagement.detail.cancelAddMetadata": "Cancel adding metadata", - "skillManagement.detail.closeFileTab": "Close {{name}}", + "skillManagement.deleteDialog.description": "A exclusão da habilidade é irreversível. Seu conteúdo e histórico completo de versões serão excluídos permanentemente. Nenhum agente o está usando no momento.", + "skillManagement.deleteDialog.referencedDescription_one": "O agente {{count}} está usando essa habilidade, de forma independente ou em um fluxo de trabalho. A exclusão desta habilidade apagará permanentemente seu conteúdo e histórico de versão e a removerá do agente afetado.", + "skillManagement.deleteDialog.referencedDescription_other": "Os agentes {{count}} estão usando essa habilidade, de forma independente ou em fluxos de trabalho. A exclusão desta habilidade apagará permanentemente seu conteúdo e histórico de versões e a removerá de todos os agentes afetados.", + "skillManagement.deleteDialog.title": "Excluir {{name}}?", + "skillManagement.deleteFailed": "Falha ao excluir habilidade.", + "skillManagement.deleteSuccess": "Skill excluído.", + "skillManagement.detail.addMetadata": "Adicionar metadados", + "skillManagement.detail.addMetadataDescription": "Adicione um campo frontmatter a este arquivo Markdown.", + "skillManagement.detail.addTag": "Adicionar etiqueta", + "skillManagement.detail.addTagDescription": "Crie ou vincule uma tag a este Skill. Novas tags são salvas com os metadados Skill.", + "skillManagement.detail.addTagSuccess": "Etiqueta adicionada.", + "skillManagement.detail.back": "Voltar para Skills", + "skillManagement.detail.builder.applyFailed": "Falha ao aplicar atualizações de rascunho.", + "skillManagement.detail.builder.attach": "Anexar arquivo", + "skillManagement.detail.builder.attachFailed": "Falha ao anexar arquivo.", + "skillManagement.detail.builder.attachLimit": "Você pode anexar até 10 arquivos.", + "skillManagement.detail.builder.attachTooLarge": "Os arquivos devem ter 15 MB ou menos. As imagens devem ter 10 MB ou menos.", + "skillManagement.detail.builder.attachUnsupported": "Somente imagens, texto e arquivos de documentos podem ser anexados.", + "skillManagement.detail.builder.attachmentOnlyMessage": "Use o arquivo anexo para ajudar a melhorar essa habilidade.", + "skillManagement.detail.builder.close": "Fechar Skill Builder", + "skillManagement.detail.builder.compatibleModelsOnly": "Apenas modelos compatíveis são exibidos", + "skillManagement.detail.builder.copyResponse": "Copiar resposta", + "skillManagement.detail.builder.copySuccess": "Resposta copiada para a área de transferência.", + "skillManagement.detail.builder.editIntro": "Eu revisei essa habilidade. O que você gostaria de ajustar?", + "skillManagement.detail.builder.exampleIssueTriage": "Triagem de problemas do cliente", + "skillManagement.detail.builder.exampleOnboarding": "Guia de integração para novos contratados", + "skillManagement.detail.builder.exampleSalesFollowUp": "Estratégia de acompanhamento de leads de vendas", + "skillManagement.detail.builder.followUpDisplayName": "Use aprovação de reembolso como nome de exibição", + "skillManagement.detail.builder.followUpNameIcon": "Aplique o nome e ícone sugeridos", + "skillManagement.detail.builder.fromMarketplace": "Do Marketplace", + "skillManagement.detail.builder.model": "GPT-4o", + "skillManagement.detail.builder.modelCredits.all": "Todos os créditos", + "skillManagement.detail.builder.modelCredits.configure": "Configuração necessária", + "skillManagement.detail.builder.modelCredits.exhausted": "Quota esgotada", + "skillManagement.detail.builder.modelProviderSettings": "Configurações do provedor de modelo", + "skillManagement.detail.builder.modelSearch": "Buscar modelos...", + "skillManagement.detail.builder.modifyPlaceholder": "Peça à IA para modificar esta habilidade...", + "skillManagement.detail.builder.open": "Abra Skill Builder", + "skillManagement.detail.builder.placeholder": "Descreva o cenário...", + "skillManagement.detail.builder.progress.applyingChanges": "Aplicando alterações de arquivo", + "skillManagement.detail.builder.progress.generatingPlan": "Gerando o plano de atualização", + "skillManagement.detail.builder.progress.readingDraft": "Lendo o rascunho atual", + "skillManagement.detail.builder.progress.updatingEditor": "Atualizando o editor", + "skillManagement.detail.builder.promptDescription": "Descreva-o e um rascunho aparecerá no editor, com etapas e arquivos incluídos.", + "skillManagement.detail.builder.promptTitle": "O que essa habilidade deve tratar?", + "skillManagement.detail.builder.readAloud": "Leia a resposta em voz alta", + "skillManagement.detail.builder.removeAttachment": "Remover {{name}}", + "skillManagement.detail.builder.restart": "Reiniciar construtor", + "skillManagement.detail.builder.retryResponse": "Tentar resposta novamente", + "skillManagement.detail.builder.send": "Enviar mensagem", + "skillManagement.detail.builder.sendFailed": "Skill Builder não respondeu.", + "skillManagement.detail.builder.thinking": "Pensando", + "skillManagement.detail.builder.thinkingUnavailable": "Nenhum conteúdo de pensamento foi retornado pelo modelo.", + "skillManagement.detail.builder.title": "Skill Builder", + "skillManagement.detail.builder.tryExample": "Experimente um exemplo", + "skillManagement.detail.builder.voice": "Entrada por voz", + "skillManagement.detail.builder.voiceUnavailable": "A entrada de voz ainda não está disponível.", + "skillManagement.detail.cancelAddMetadata": "Cancelar adição de metadados", + "skillManagement.detail.closeFileTab": "Fechar {{name}}", + "skillManagement.detail.closeVersions": "Fechar versões", "skillManagement.detail.collapseSidebar": "Recolher barra lateral", - "skillManagement.detail.createFile": "New file", - "skillManagement.detail.createFileDescription": "Enter a file path relative to the skill root.", - "skillManagement.detail.createFileMenu": "New file...", - "skillManagement.detail.createFileSuccess": "File created.", - "skillManagement.detail.createFolder": "New folder", - "skillManagement.detail.createFolderDescription": "Enter a folder path relative to the skill root.", - "skillManagement.detail.createFolderMenu": "New folder...", - "skillManagement.detail.createFolderSuccess": "Folder created.", - "skillManagement.detail.createdBy": "Created by {{name}}", - "skillManagement.detail.currentDraft": "Current draft", - "skillManagement.detail.deleteFileConfirm": "Delete this file?", - "skillManagement.detail.deleteFileSuccess": "File deleted.", - "skillManagement.detail.deleteVersionConfirm": "Delete this version?", - "skillManagement.detail.deleteVersionFailed": "Failed to delete version.", - "skillManagement.detail.deleteVersionSuccess": "Version deleted.", - "skillManagement.detail.downloadFile": "Download file", - "skillManagement.detail.draft": "Draft", + "skillManagement.detail.copyContentSuccess": "Conteúdo copiado para a área de transferência.", + "skillManagement.detail.copyFile": "Copiar", + "skillManagement.detail.copyFileSuccess": "Arquivo pronto para colar.", + "skillManagement.detail.copyVersionId": "Copiar ID", + "skillManagement.detail.copyVersionIdSuccess": "ID copiado para a área de transferência.", + "skillManagement.detail.createFile": "Novo arquivo", + "skillManagement.detail.createFileDescription": "Insira um caminho de arquivo relativo à raiz da habilidade.", + "skillManagement.detail.createFileMenu": "Novo arquivo...", + "skillManagement.detail.createFileSuccess": "Arquivo criado.", + "skillManagement.detail.createFolder": "Nova pasta", + "skillManagement.detail.createFolderDescription": "Insira um caminho de pasta relativo à raiz da habilidade.", + "skillManagement.detail.createFolderMenu": "Nova pasta...", + "skillManagement.detail.createFolderSuccess": "Pasta criada.", + "skillManagement.detail.createdBy": "Criado por {{name}}", + "skillManagement.detail.currentDraft": "Rascunho atual", + "skillManagement.detail.cutFile": "Corte", + "skillManagement.detail.cutFileSuccess": "Arquivo pronto para ser movido.", + "skillManagement.detail.deleteFileConfirm": "Excluir este arquivo?", + "skillManagement.detail.deleteFileSuccess": "Arquivo excluído.", + "skillManagement.detail.deleteVersionConfirm": "Excluir esta versão?", + "skillManagement.detail.deleteVersionFailed": "Falha ao excluir a versão.", + "skillManagement.detail.deleteVersionSuccess": "Versão excluída.", + "skillManagement.detail.downloadFile": "Baixar arquivo", + "skillManagement.detail.draft": "Rascunho", + "skillManagement.detail.editVersionInfo": "Editar informações da versão", + "skillManagement.detail.exitVersions": "Sair das versões", "skillManagement.detail.expandSidebar": "Expandir barra lateral", - "skillManagement.detail.fileCount": "{{count}} FILES", + "skillManagement.detail.fileAlreadyExists": "Já existe um arquivo ou pasta com este nome.", + "skillManagement.detail.fileCount_one": "Arquivo {{count}}", + "skillManagement.detail.fileCount_other": "Arquivos {{count}}", "skillManagement.detail.fileMeta": "{{type}} · {{size}} bytes", - "skillManagement.detail.fileMissing": "File not found.", - "skillManagement.detail.fileOperationFailed": "File operation failed.", - "skillManagement.detail.files": "Files", - "skillManagement.detail.latest": "Latest", - "skillManagement.detail.loadFailed": "Failed to load skill.", - "skillManagement.detail.markdownLiveMode": "Live preview", - "skillManagement.detail.markdownSourceMode": "Source editor", - "skillManagement.detail.metadataKey": "name", - "skillManagement.detail.metadataValue": "value", - "skillManagement.detail.moveFileSuccess": "File moved.", - "skillManagement.detail.moveFilesSuccess": "Files moved.", - "skillManagement.detail.noFileSelected": "Select a file to preview.", - "skillManagement.detail.noFiles": "No files.", + "skillManagement.detail.fileMissing": "Arquivo não encontrado.", + "skillManagement.detail.fileOperationFailed": "A operação do arquivo falhou.", + "skillManagement.detail.files": "Arquivos", + "skillManagement.detail.latest": "Último", + "skillManagement.detail.loadFailed": "Falha ao carregar habilidade.", + "skillManagement.detail.loadingTags": "Carregando etiquetas...", + "skillManagement.detail.markdownLiveMode": "Visualização ao vivo", + "skillManagement.detail.markdownSourceMode": "Editor de origem", + "skillManagement.detail.metadataKey": "nome", + "skillManagement.detail.metadataValue": "valor", + "skillManagement.detail.moveFileSuccess": "Arquivo movido.", + "skillManagement.detail.moveFilesSuccess": "Arquivos movidos.", + "skillManagement.detail.nameThisVersion": "Nomeie esta versão", + "skillManagement.detail.noFileSelected": "Selecione um arquivo para visualizar.", + "skillManagement.detail.noFiles": "Nenhum arquivo.", "skillManagement.detail.noSearchResults": "Nenhum arquivo correspondente.", - "skillManagement.detail.noVersions": "No published versions yet.", - "skillManagement.detail.previewUnsupported": "Preview is not supported for this file.", - "skillManagement.detail.publish": "Publish", - "skillManagement.detail.publishFailed": "Failed to publish skill.", - "skillManagement.detail.publishSuccess": "Skill published.", - "skillManagement.detail.published": "Published", + "skillManagement.detail.noSelectableTags": "Nenhuma tag disponível.", + "skillManagement.detail.noVersions": "Nenhuma versão publicada ainda.", + "skillManagement.detail.pasteFile": "Colar", + "skillManagement.detail.pasteFileSuccess": "Arquivo colado.", + "skillManagement.detail.previewUnsupported": "Este arquivo não oferece suporte à pré-visualização.", + "skillManagement.detail.publish": "Publicar", + "skillManagement.detail.publishFailed": "Falha ao publicar habilidade.", + "skillManagement.detail.publishReferencesDescription_one": "A publicação entra em vigor imediatamente para o agente {{count}} que usa esta habilidade.", + "skillManagement.detail.publishReferencesDescription_other": "A publicação entra em vigor imediatamente para os agentes {{count}} que usam esta habilidade.", + "skillManagement.detail.publishReferencesTitle": "Publicar habilidade", + "skillManagement.detail.publishSuccess": "Skill publicado.", + "skillManagement.detail.publishUpdate": "Publicar atualização", + "skillManagement.detail.published": "Publicado", "skillManagement.detail.publishedAt": "Publicado {{time}}", + "skillManagement.detail.publishedVersion": "Publicado #{{number}}", "skillManagement.detail.publishing": "Publicando...", - "skillManagement.detail.readonly": "Read only", - "skillManagement.detail.referenceFiles.confirm": "Enter Confirm", - "skillManagement.detail.referenceFiles.empty": "No files available.", - "skillManagement.detail.referenceFiles.livePlaceholder": "Write instructions for the agent, type / to reference files", - "skillManagement.detail.referenceFiles.navigate": "↑↓ Navigate", - "skillManagement.detail.referenceFiles.title": "Reference files", - "skillManagement.detail.referencedBy": "Referenced by {{count}} Apps", - "skillManagement.detail.removeMetadata": "Delete {{name}} metadata", - "skillManagement.detail.removeTag": "Remove {{tag}}", - "skillManagement.detail.removeTagSuccess": "Tag removed.", - "skillManagement.detail.renameFile": "Rename file", - "skillManagement.detail.renameFileDescription": "Enter the new path relative to the skill root.", - "skillManagement.detail.renameFileSuccess": "File renamed.", - "skillManagement.detail.renameSkillSuccess": "Skill renamed.", - "skillManagement.detail.renameVersion": "Rename", - "skillManagement.detail.renameVersionFailed": "Failed to rename version.", - "skillManagement.detail.renameVersionPrompt": "Version name", - "skillManagement.detail.renameVersionSuccess": "Version renamed.", - "skillManagement.detail.restoreVersion": "Restore", - "skillManagement.detail.restoreVersionFailed": "Failed to restore version.", - "skillManagement.detail.restoreVersionSuccess": "Version restored to draft.", - "skillManagement.detail.save": "Save", - "skillManagement.detail.saveFailed": "Failed to save file.", - "skillManagement.detail.saveSuccess": "File saved.", - "skillManagement.detail.saved": "Saved", - "skillManagement.detail.savedAt": "Saved {{time}}", - "skillManagement.detail.saving": "Saving...", + "skillManagement.detail.readonly": "Somente leitura", + "skillManagement.detail.referenceFiles.confirm": "Digite Confirmar", + "skillManagement.detail.referenceFiles.empty": "Nenhum arquivo disponível.", + "skillManagement.detail.referenceFiles.livePlaceholder": "Escreva instruções para o agente. Digite / para referenciar arquivos.", + "skillManagement.detail.referenceFiles.navigate": "↑↓ Navegue", + "skillManagement.detail.referenceFiles.title": "Arquivos de referência", + "skillManagement.detail.referencedBy_one": "Usado por {{count}} agente", + "skillManagement.detail.referencedBy_other": "Usado por {{count}} agentes", + "skillManagement.detail.removeMetadata": "Excluir metadados {{name}}", + "skillManagement.detail.removeTag": "Remover {{tag}}", + "skillManagement.detail.removeTagSuccess": "Etiqueta removida.", + "skillManagement.detail.renameFile": "Renomear arquivo", + "skillManagement.detail.renameFileDescription": "Insira o novo caminho relativo à raiz da habilidade.", + "skillManagement.detail.renameFileSuccess": "Arquivo renomeado.", + "skillManagement.detail.renameSkillSuccess": "Skill renomeado.", + "skillManagement.detail.renameVersion": "Renomear", + "skillManagement.detail.renameVersionFailed": "Falha ao renomear a versão.", + "skillManagement.detail.renameVersionPrompt": "Nome da versão", + "skillManagement.detail.renameVersionSuccess": "Versão renomeada.", + "skillManagement.detail.resizeSidebar": "Redimensionar barra lateral de arquivo", + "skillManagement.detail.restoreVersion": "Restaurar", + "skillManagement.detail.restoreVersionConfirmDescription": "Isso substituirá o rascunho atual pelos arquivos de \"{{version}}\". Não publicará o Skill nem criará uma nova versão.", + "skillManagement.detail.restoreVersionConfirmTitle": "Restaurar esta versão?", + "skillManagement.detail.restoreVersionFailed": "Falha ao restaurar a versão.", + "skillManagement.detail.restoreVersionSuccess": "Versão restaurada para rascunho.", + "skillManagement.detail.save": "Salvar", + "skillManagement.detail.saveConflictConfirmDescription": "Esta habilidade foi atualizada em outro lugar. Carregue o rascunho mais recente para continuar editando. Suas alterações atuais serão descartadas.", + "skillManagement.detail.saveConflictConfirmTitle": "Carregar o rascunho mais recente?", + "skillManagement.detail.saveConflictReload": "Carregar rascunho mais recente", + "skillManagement.detail.saveConflictStatus": "Conflito detectado. Carregue o rascunho mais recente para continuar editando.", + "skillManagement.detail.saveFailed": "Falha ao salvar o arquivo.", + "skillManagement.detail.saveSuccess": "Arquivo salvo.", + "skillManagement.detail.saved": "Salvo", + "skillManagement.detail.savedAt": "Salvo em {{time}}", + "skillManagement.detail.saving": "Salvando...", "skillManagement.detail.searchFiles": "Buscar arquivos", + "skillManagement.detail.showMoreReferences": "Mostrar mais {{count}}", + "skillManagement.detail.skillDescriptionPlaceholder": "Descreva o que essa habilidade faz e quando os agentes devem usá-la.", + "skillManagement.detail.skillNamePlaceholder": "Use letras minúsculas, números e hifens.", "skillManagement.detail.unpublishedChanges": "Alterações não publicadas", - "skillManagement.detail.unsavedChanges": "Unsaved changes", + "skillManagement.detail.unsavedChanges": "Alterações não salvas", "skillManagement.detail.upToDate": "Atualizado", - "skillManagement.detail.updateTagsFailed": "Failed to update tags.", - "skillManagement.detail.uploadFile": "Upload file", - "skillManagement.detail.uploadFileFailed": "File upload failed.", - "skillManagement.detail.uploadFileSuccess": "File uploaded.", - "skillManagement.detail.uploadFilesMenu": "Upload files...", + "skillManagement.detail.updateTagsFailed": "Falha ao atualizar tags.", + "skillManagement.detail.uploadCheckFailed": "Não foi possível verificar esses arquivos. Tente novamente.", + "skillManagement.detail.uploadConflict": "Já existe um arquivo com este nome.", + "skillManagement.detail.uploadFailureSummary": "{{failed}} dos arquivos {{total}} falhou", + "skillManagement.detail.uploadFailureTitle": "Alguns uploads falharam", + "skillManagement.detail.uploadFile": "Enviar arquivo", + "skillManagement.detail.uploadFileFailed": "Falha no upload do arquivo.", + "skillManagement.detail.uploadFileSuccess": "Arquivo enviado.", + "skillManagement.detail.uploadFilesButton": "Carregar arquivos {{count}}", + "skillManagement.detail.uploadFilesFailedStatus_one": "Falha no upload do arquivo {{count}}.", + "skillManagement.detail.uploadFilesFailedStatus_other": "Falha no upload do arquivo {{count}}.", + "skillManagement.detail.uploadFilesMenu": "Carregar arquivos...", + "skillManagement.detail.uploadFilesProgress": "Carregando {{completed}}/{{total}}", + "skillManagement.detail.uploadFilesResult": "{{uploaded}} carregado · {{failed}} falhou", + "skillManagement.detail.uploadFilesStatus": "Carregar status", + "skillManagement.detail.uploadInvalidExtension": "Este tipo de arquivo não é compatível.", + "skillManagement.detail.uploadInvalidName": "Nome inválido.", + "skillManagement.detail.uploadInvalidPath": "Caminho de arquivo inválido.", + "skillManagement.detail.uploadKeepBoth": "Mantenha ambos", + "skillManagement.detail.uploadLateConflict": "Alguém adicionou este arquivo enquanto você estava enviando.", + "skillManagement.detail.uploadMissingExtension": "É necessária uma extensão de arquivo.", + "skillManagement.detail.uploadNetworkFailure": "Falha no upload. Verifique sua conexão.", + "skillManagement.detail.uploadReadySummary": "{{ready}} pronto · {{decisions}} precisa de uma decisão · {{skipped}} será ignorado", + "skillManagement.detail.uploadReplace": "Substituir", + "skillManagement.detail.uploadResolvedSummary": "{{ready}} pronto · {{skipped}} será ignorado", + "skillManagement.detail.uploadRetryCount": "Tente novamente {{count}}", + "skillManagement.detail.uploadReviewTitle": "Revise antes de enviar", + "skillManagement.detail.uploadSkip": "Navio", + "skillManagement.detail.uploadSkippedGroup": "Os arquivos {{count}} não podem ser carregados e serão ignorados", + "skillManagement.detail.uploadStatusDismiss": "Dispensar status de upload", + "skillManagement.detail.uploadSuggestion": "Usar sugestão", + "skillManagement.detail.uploadWillReplace": "Substituirá o arquivo existente", + "skillManagement.detail.uploadWillUseName": "Será carregado como {{name}}", + "skillManagement.detail.versionHistory": "Abrir histórico de versões", "skillManagement.detail.versionMeta": "{{hash}} · {{time}}", - "skillManagement.detail.versions": "Versions", - "skillManagement.draft": "Draft", - "skillManagement.duplicateFailed": "Failed to duplicate skill.", - "skillManagement.duplicateSuccess": "Skill duplicated.", - "skillManagement.editedAt": "Edited {{time}}", - "skillManagement.empty": "No skills yet", - "skillManagement.emptySearch": "No skills found", - "skillManagement.import": "Import", - "skillManagement.importFailed": "Failed to import skill.", - "skillManagement.importSuccess": "Skill imported.", - "skillManagement.listLabel": "Workspace skills", - "skillManagement.loadingError": "Failed to load skills", - "skillManagement.moreActions": "More actions for {{name}}", - "skillManagement.noTags": "No tags", - "skillManagement.publishedAt": "Published {{time}}", - "skillManagement.referenceCount": "{{count}} Refs", - "skillManagement.searchLabel": "Search skills", - "skillManagement.searchPlaceholder": "Search", - "skillManagement.tags": "Tags", - "skillManagement.title": "Skills" + "skillManagement.detail.versionPublishNote": "Notas de lançamento", + "skillManagement.detail.versionPublishNotePlaceholder": "Descreva esta mudança", + "skillManagement.detail.versionPublishedMeta": "{{time}} · {{name}}", + "skillManagement.detail.versionTitle": "Título", + "skillManagement.detail.versions": "Versões", + "skillManagement.detail.viewOnly": "Somente visualizar", + "skillManagement.detail.viewUploadErrors": "Ver erros", + "skillManagement.draft": "Rascunho", + "skillManagement.duplicateFailed": "Falha ao duplicar habilidade.", + "skillManagement.duplicateSuccess": "Skill duplicado.", + "skillManagement.editedAt": "Editado {{time}}", + "skillManagement.empty": "Ainda não há habilidades", + "skillManagement.emptyAction.createDescription": "Descreva um cenário em palavras simples e obtenha um rascunho de habilidade para revisar.", + "skillManagement.emptyAction.createTitle": "Criar com Skill Builder", + "skillManagement.emptyAction.importDescription": "Traga um .zip com SKILL.md, no formato agentskills.io.", + "skillManagement.emptyAction.importTitle": "Importe um pacote de habilidades", + "skillManagement.emptySearch": "Nenhuma habilidade encontrada", + "skillManagement.errors.missingSkillMd": "Este pacote não possui SKILL.md. Adicione o arquivo e importe-o novamente.", + "skillManagement.errors.nameConflict": "Uma habilidade chamada \"{{name}}\" já existe. Renomeie-o para SKILL.md e importe novamente.", + "skillManagement.errors.workspaceLimit": "Seu espaço de trabalho atingiu o limite de 500 habilidades. Exclua uma habilidade para adicionar uma nova.", + "skillManagement.import": "Importar", + "skillManagement.importFailed": "Falha ao importar habilidade.", + "skillManagement.importSuccess": "Skill importado.", + "skillManagement.listLabel": "Habilidades de espaço de trabalho", + "skillManagement.loadingError": "Falha ao carregar habilidades", + "skillManagement.moreActions": "Mais ações para {{name}}", + "skillManagement.noDescription": "Ainda não há descrição", + "skillManagement.noTags": "Sem tags", + "skillManagement.publishedAt": "Publicado em {{time}}", + "skillManagement.referenceCount_one": "{{count}} agente", + "skillManagement.referenceCount_other": "{{count}} agentes", + "skillManagement.searchLabel": "Buscar habilidades", + "skillManagement.searchPlaceholder": "Pesquise por nome ou descrição", + "skillManagement.tags": "Etiquetas", + "skillManagement.title": "Habilidades" } diff --git a/web/i18n/ro-RO/agent-v-2.json b/web/i18n/ro-RO/agent-v-2.json index b2b89afa626..9821a56a786 100644 --- a/web/i18n/ro-RO/agent-v-2.json +++ b/web/i18n/ro-RO/agent-v-2.json @@ -83,7 +83,7 @@ "agentDetail.configure.buildDraft.changesToApply_other": "{{count}} modificări de aplicat", "agentDetail.configure.buildDraft.discard": "Renunță", "agentDetail.configure.buildDraft.modeBadge": "Mod build", - "agentDetail.configure.buildDraft.modeDescription": "Ești în modul build. Configure poate fi actualizat doar de agent în acest mod. Ajustează această configurare prin chatul din dreapta, apoi aplică.", + "agentDetail.configure.buildDraft.modeDescription": "Ești în modul build. Conturează această configurare discutând cu agentul, apoi apasă Aplică.", "agentDetail.configure.buildDraft.rewritten": "Rescris", "agentDetail.configure.buildDraft.title": "Schiță de build", "agentDetail.configure.buildDraft.updated": "Actualizat", @@ -105,7 +105,8 @@ "agentDetail.configure.files.preview.failed": "Încărcarea previzualizării a eșuat.", "agentDetail.configure.files.preview.unsupported": "Acest fișier nu acceptă previzualizarea.", "agentDetail.configure.files.remove": "Elimină {{name}}", - "agentDetail.configure.files.tip": "Pentru materiale de referință prea lungi pentru a fi lipite în Prompt: specificații, șabloane, ghiduri. Faceți referire cu / în Prompt.\n\nÎn modul Build, agentul le poate configura pentru dvs.", + "agentDetail.configure.files.richTip": "Pentru materiale de referință prea lungi pentru a fi lipite în Prompt: specificații, șabloane, ghiduri. Aflați mai multe\n\nÎn modul Build, agentul le poate configura pentru dvs.", + "agentDetail.configure.files.tip": "Pentru materiale de referință prea lungi pentru a fi lipite în Prompt: specificații, șabloane, ghiduri. Aflați mai multe\n\nÎn modul Build, agentul le poate configura pentru dvs.", "agentDetail.configure.files.toggle": "Comută fișierele", "agentDetail.configure.files.treeLabel": "Fișierele agentului", "agentDetail.configure.files.upload.action": "Încarcă", @@ -114,7 +115,7 @@ "agentDetail.configure.files.upload.dropzone": "Plasează un fișier aici sau", "agentDetail.configure.files.upload.failed": "Încărcarea fișierului a eșuat.", "agentDetail.configure.files.upload.fileType": "FIȘIER", - "agentDetail.configure.files.upload.invalidFile": "Încărcați un singur fișier.", + "agentDetail.configure.files.upload.invalidFile": "Poate fi încărcat un singur fișier odată.", "agentDetail.configure.files.upload.success": "Fișier încărcat.", "agentDetail.configure.files.upload.title": "Încarcă fișier", "agentDetail.configure.knowledgeRetrieval.add": "Adaugă recuperare de cunoștințe", @@ -177,7 +178,8 @@ "agentDetail.configure.prompt.mention.priyaRamanathan": "Priya Ramanathan", "agentDetail.configure.prompt.placeholder": "Scrieți instrucțiunile aici,", "agentDetail.configure.prompt.referenceMissing": "{{name}} nu există", - "agentDetail.configure.prompt.tip": "Definiți rolul agentului și descrieți sarcina sa tipică. Folosiți / pentru a face referire explicită la abilități, fișiere, instrumente și recuperări de cunoștințe.", + "agentDetail.configure.prompt.richTip": "Definiți rolul agentului și modul în care ar trebui să lucreze. Aflați mai multe", + "agentDetail.configure.prompt.tip": "Definiți rolul agentului și modul în care ar trebui să lucreze. Aflați mai multe", "agentDetail.configure.publishBar.draft": "Ciornă", "agentDetail.configure.publishBar.publishUpdate": "Publică actualizarea", "agentDetail.configure.publishBar.published": "Publicat", @@ -190,8 +192,8 @@ "agentDetail.configure.publishBar.versionHistory": "Deschide istoricul versiunilor", "agentDetail.configure.publishImpact.affectedWorkflows": "Workflow-uri afectate", "agentDetail.configure.publishImpact.cancel": "Anulează", - "agentDetail.configure.publishImpact.descriptionPrefix": "Agentul tău apare în", - "agentDetail.configure.publishImpact.descriptionSuffix": ". Modificările le vor afecta.", + "agentDetail.configure.publishImpact.descriptionPrefix": "Acest agent este utilizat în", + "agentDetail.configure.publishImpact.descriptionSuffix": ". Publicarea îl va actualiza în toate aceste workflow-uri.", "agentDetail.configure.publishImpact.fallbackAgentName": "acest agent", "agentDetail.configure.publishImpact.title": "{{action}} pentru {{name}}", "agentDetail.configure.publishImpact.workflowCount_one": "{{count}} workflow", @@ -222,8 +224,8 @@ "agentDetail.configure.skills.openInLibrary": "Open in Skill library", "agentDetail.configure.skills.remove": "Elimină {{name}}", "agentDetail.configure.skills.removeAction": "Remove", - "agentDetail.configure.skills.richTip": "Împachetați instrucțiunile, fișierele și scripturile pentru o sarcină recurentă într-un skill. Faceți referire cu / în Prompt. Aflați mai multe\n\nÎn modul Build, agentul le poate configura pentru dvs.", - "agentDetail.configure.skills.tip": "Împachetați instrucțiunile, fișierele și scripturile pentru o sarcină recurentă într-un skill. Faceți referire cu / în Prompt. Aflați mai multe\n\nÎn modul Build, agentul le poate configura pentru dvs.", + "agentDetail.configure.skills.richTip": "Împachetați instrucțiunile, fișierele și scripturile pentru o sarcină recurentă într-un skill. Aflați mai multe\n\nÎn modul Build, agentul le poate configura pentru dvs.", + "agentDetail.configure.skills.tip": "Împachetați instrucțiunile, fișierele și scripturile pentru o sarcină recurentă într-un skill. Aflați mai multe\n\nÎn modul Build, agentul le poate configura pentru dvs.", "agentDetail.configure.skills.toggle": "Comută abilitățile", "agentDetail.configure.skills.upload.action": "Încarcă", "agentDetail.configure.skills.upload.browse": "răsfoiește", @@ -269,8 +271,8 @@ "agentDetail.configure.tools.moreActions": "Mai multe acțiuni pentru {{name}}", "agentDetail.configure.tools.removeAction": "Eliminați {{name}}", "agentDetail.configure.tools.removeProvider": "Eliminați toate instrumentele", - "agentDetail.configure.tools.richTip": "Adăugați instrumente Dify din workspace. Faceți referire cu / în Prompt. Aflați mai multe\n\nInstrumentele pe care agentul le instalează în sandbox nu vor apărea aici, dar îi vor rămâne disponibile.", - "agentDetail.configure.tools.tip": "Adăugați instrumente Dify din workspace. Faceți referire cu / în Prompt. Aflați mai multe\n\nInstrumentele pe care agentul le instalează în sandbox nu vor apărea aici, dar îi vor rămâne disponibile.", + "agentDetail.configure.tools.richTip": "Adăugați instrumente Dify din workspace. Aflați mai multe\n\nInstrumentele pe care agentul le instalează în sandbox nu vor apărea aici, dar îi vor rămâne disponibile.", + "agentDetail.configure.tools.tip": "Adăugați instrumente Dify din workspace. Aflați mai multe\n\nInstrumentele pe care agentul le instalează în sandbox nu vor apărea aici, dar îi vor rămâne disponibile.", "agentDetail.configure.tools.toggle": "Comută instrumentele", "agentDetail.configure.tools.toolTabs.all": "Toate", "agentDetail.configure.tools.toolTabs.cli": "CLI", @@ -336,22 +338,22 @@ "agentDetail.metadata.sourceLabel": "Sursă", "agentDetail.monitoring.change": "{{value}} față de perioada anterioară", "agentDetail.monitoring.dateRangeLabel": "Interval de date", - "agentDetail.monitoring.description": "Urmăriți activitatea, costul și calitatea interacțiunii agentului reutilizabil în toate workflow-urile.", + "agentDetail.monitoring.description": "Urmăriți activitatea, costurile și calitatea interacțiunilor acestui agent în toate punctele de acces.", "agentDetail.monitoring.learnMore": "Aflați mai multe", "agentDetail.monitoring.loadFailed": "Nu s-au putut încărca datele de monitorizare", - "agentDetail.monitoring.metrics.activeUsers.explanation": "Utilizatori finali unici care au declanșat workflow-uri folosind acest agent.", + "agentDetail.monitoring.metrics.activeUsers.explanation": "Utilizatori finali unici care au interacționat cu acest agent.", "agentDetail.monitoring.metrics.activeUsers.title": "Utilizatori activi", - "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Numărul de comunicări continue utilizator-agent pentru acest punct de acces.", + "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Numărul mediu de mesaje ale utilizatorilor per conversație.", "agentDetail.monitoring.metrics.avgSessionInteractions.title": "Med. interacțiuni per sesiune", - "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Viteza medie de ieșire de la începutul cererii până la finalizare.", + "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Numărul mediu de token-uri generate pe secundă în timpul unui răspuns al agentului.", "agentDetail.monitoring.metrics.tokenOutputSpeed.title": "Viteza de ieșire token-uri", - "agentDetail.monitoring.metrics.tokenUsage.explanation": "Costul estimat al token-urilor produs de acest agent în execuțiile workflow-urilor.", + "agentDetail.monitoring.metrics.tokenUsage.explanation": "Token-uri consumate și costul estimat.", "agentDetail.monitoring.metrics.tokenUsage.title": "Utilizarea token-urilor", "agentDetail.monitoring.metrics.totalConversations.explanation": "Conversații AI zilnice care au ajuns la acest agent prin punctul de acces selectat.", "agentDetail.monitoring.metrics.totalConversations.title": "Total conversații", - "agentDetail.monitoring.metrics.totalMessages.explanation": "Numărul zilnic de interacțiuni ale agentului.", + "agentDetail.monitoring.metrics.totalMessages.explanation": "Numărul total de mesaje trimise de utilizatori acestui agent.", "agentDetail.monitoring.metrics.totalMessages.title": "Total mesaje", - "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "Numărul de aprecieri la fiecare 1.000 de mesaje pentru acest agent.", + "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "Procentul răspunsurilor agentului cărora utilizatorii le-au acordat o apreciere.", "agentDetail.monitoring.metrics.userSatisfactionRate.title": "Rata de satisfacție a utilizatorilor", "agentDetail.monitoring.pickSource": "Alegeți o aplicație", "agentDetail.monitoring.sourceLabel": "Aplicație", @@ -549,7 +551,5 @@ "skillManagement.searchLabel": "Search skills", "skillManagement.searchPlaceholder": "Search", "skillManagement.tags": "Tags", - "skillManagement.title": "Skills", - "agentDetail.configure.files.richTip": "Pentru materiale de referință prea lungi pentru a fi lipite în Prompt: specificații, șabloane, ghiduri. Aflați mai multe\n\nÎn modul Build, agentul le poate configura pentru dvs.", - "agentDetail.configure.prompt.richTip": "Definiți rolul agentului și modul în care ar trebui să lucreze. Aflați mai multe" + "skillManagement.title": "Skills" } diff --git a/web/i18n/ro-RO/skill.json b/web/i18n/ro-RO/skill.json index a78f60ce776..fad5ed9487e 100644 --- a/web/i18n/ro-RO/skill.json +++ b/web/i18n/ro-RO/skill.json @@ -1,121 +1,245 @@ { - "skillManagement.clearTags": "Clear tags", - "skillManagement.create": "Create", - "skillManagement.createFailed": "Failed to create skill.", - "skillManagement.createSuccess": "Skill created.", - "skillManagement.dateTimeFormat": "MMM D, YYYY HH:mm", + "skillManagement.clearTags": "Ștergeți etichetele", + "skillManagement.create": "Creează", + "skillManagement.createFailed": "Nu s-a putut crea abilitate.", + "skillManagement.createSuccess": "Ciornă creată.", + "skillManagement.dateTimeFormat": "LMM D, AAAA HH:mm", "skillManagement.deleteDialog.confirmInputLabel": "Pentru confirmare, introdu {{skillName}} în câmpul de mai jos:", "skillManagement.deleteDialog.confirmInputPlaceholder": "Introdu numele afișat al Skill-ului…", - "skillManagement.deleteDialog.description": "This skill will be removed from the workspace. Agents that reference it may lose access to this capability.", - "skillManagement.deleteDialog.title": "Delete {{name}}?", - "skillManagement.deleteFailed": "Failed to delete skill.", - "skillManagement.deleteSuccess": "Skill deleted.", - "skillManagement.detail.addMetadata": "Add metadata", - "skillManagement.detail.addMetadataDescription": "Add a frontmatter field to this Markdown file.", - "skillManagement.detail.addTag": "Add tag", - "skillManagement.detail.addTagDescription": "Create or bind a tag to this Skill. New tags are saved with the Skill metadata.", - "skillManagement.detail.addTagSuccess": "Tag added.", - "skillManagement.detail.back": "Back to Skills", - "skillManagement.detail.cancelAddMetadata": "Cancel adding metadata", - "skillManagement.detail.closeFileTab": "Close {{name}}", + "skillManagement.deleteDialog.description": "Ștergerea abilității este ireversibilă. Conținutul și istoricul complet al versiunilor vor fi șterse definitiv. În prezent, niciun agent nu îl folosește.", + "skillManagement.deleteDialog.referencedDescription_one": "Agentul {{count}} folosește această abilitate, fie independent, fie într-un flux de lucru. Ștergerea acestei aptitudini va șterge definitiv conținutul și istoricul versiunilor și o va elimina din agentul afectat.", + "skillManagement.deleteDialog.referencedDescription_other": "Agenții {{count}} folosesc această abilitate, fie independent, fie în fluxuri de lucru. Ștergerea acestei aptitudini va șterge definitiv conținutul și istoricul versiunilor și o va elimina din toți agenții afectați.", + "skillManagement.deleteDialog.title": "Ștergeți {{name}}?", + "skillManagement.deleteFailed": "Skill-ul nu a putut fi șters.", + "skillManagement.deleteSuccess": "Skill șters.", + "skillManagement.detail.addMetadata": "Adăugați metadate", + "skillManagement.detail.addMetadataDescription": "Adăugați un câmp principal la acest fișier Markdown.", + "skillManagement.detail.addTag": "Adăugați etichetă", + "skillManagement.detail.addTagDescription": "Creați sau legați o etichetă la acest Skill. Etichetele noi sunt salvate cu metadatele Skill.", + "skillManagement.detail.addTagSuccess": "Etichetă adăugată.", + "skillManagement.detail.back": "Înapoi la Skills", + "skillManagement.detail.builder.applyFailed": "Nu s-au aplicat actualizările schiței.", + "skillManagement.detail.builder.attach": "Atașați fișierul", + "skillManagement.detail.builder.attachFailed": "Fișierul nu a fost atașat.", + "skillManagement.detail.builder.attachLimit": "Puteți atașa până la 10 fișiere.", + "skillManagement.detail.builder.attachTooLarge": "Fișierele trebuie să aibă 15 MB sau mai mici. Imaginile trebuie să fie de 10 MB sau mai mici.", + "skillManagement.detail.builder.attachUnsupported": "Pot fi atașate numai imagini, text și fișiere de document.", + "skillManagement.detail.builder.attachmentOnlyMessage": "Utilizați fișierul atașat pentru a ajuta la îmbunătățirea acestei aptitudini.", + "skillManagement.detail.builder.close": "Închideți Skill Builder", + "skillManagement.detail.builder.compatibleModelsOnly": "Sunt afișate doar modelele compatibile", + "skillManagement.detail.builder.copyResponse": "Copiați răspunsul", + "skillManagement.detail.builder.copySuccess": "Răspunsul a fost copiat în clipboard.", + "skillManagement.detail.builder.editIntro": "Am trecut în revistă această abilitate. Ce ai vrea să ajustezi?", + "skillManagement.detail.builder.exampleIssueTriage": "Triajul problemelor clienților", + "skillManagement.detail.builder.exampleOnboarding": "Ghid de înscriere pentru angajați noi", + "skillManagement.detail.builder.exampleSalesFollowUp": "Strategia de urmărire a conducerii de vânzări", + "skillManagement.detail.builder.followUpDisplayName": "Utilizați aprobarea rambursării ca nume afișat", + "skillManagement.detail.builder.followUpNameIcon": "Aplicați numele și pictograma sugerate", + "skillManagement.detail.builder.fromMarketplace": "Din Marketplace", + "skillManagement.detail.builder.model": "GPT-4o", + "skillManagement.detail.builder.modelCredits.all": "Toate creditele", + "skillManagement.detail.builder.modelCredits.configure": "Configurare necesară", + "skillManagement.detail.builder.modelCredits.exhausted": "Cotă epuizată", + "skillManagement.detail.builder.modelProviderSettings": "Setări furnizor de modele", + "skillManagement.detail.builder.modelSearch": "Caută modele...", + "skillManagement.detail.builder.modifyPlaceholder": "Cereți AI să modifice această abilitate...", + "skillManagement.detail.builder.open": "Deschideți Skill Builder", + "skillManagement.detail.builder.placeholder": "Descrie scenariul...", + "skillManagement.detail.builder.progress.applyingChanges": "Aplicarea modificărilor fișierului", + "skillManagement.detail.builder.progress.generatingPlan": "Generarea planului de actualizare", + "skillManagement.detail.builder.progress.readingDraft": "Citirea proiectului actual", + "skillManagement.detail.builder.progress.updatingEditor": "Actualizarea editorului", + "skillManagement.detail.builder.promptDescription": "Descrieți-l și va apărea o schiță în editor, cu pași și fișiere incluse.", + "skillManagement.detail.builder.promptTitle": "Cu ce ​​ar trebui să se ocupe această abilitate?", + "skillManagement.detail.builder.readAloud": "Citiți răspunsul cu voce tare", + "skillManagement.detail.builder.removeAttachment": "Elimină {{name}}", + "skillManagement.detail.builder.restart": "Reporniți constructorul", + "skillManagement.detail.builder.retryResponse": "Reîncercați răspunsul", + "skillManagement.detail.builder.send": "Trimite mesaj", + "skillManagement.detail.builder.sendFailed": "Skill Builder nu a răspuns.", + "skillManagement.detail.builder.thinking": "Se gândește", + "skillManagement.detail.builder.thinkingUnavailable": "Nu a fost returnat niciun conținut de gândire de către model.", + "skillManagement.detail.builder.title": "Skill Builder", + "skillManagement.detail.builder.tryExample": "Încearcă un exemplu", + "skillManagement.detail.builder.voice": "Introducere vocală", + "skillManagement.detail.builder.voiceUnavailable": "Intrarea vocală nu este încă disponibilă.", + "skillManagement.detail.cancelAddMetadata": "Anulați adăugarea metadatelor", + "skillManagement.detail.closeFileTab": "Închide {{name}}", + "skillManagement.detail.closeVersions": "Versiuni apropiate", "skillManagement.detail.collapseSidebar": "Restrânge bara laterală", - "skillManagement.detail.createFile": "New file", - "skillManagement.detail.createFileDescription": "Enter a file path relative to the skill root.", - "skillManagement.detail.createFileMenu": "New file...", - "skillManagement.detail.createFileSuccess": "File created.", - "skillManagement.detail.createFolder": "New folder", - "skillManagement.detail.createFolderDescription": "Enter a folder path relative to the skill root.", - "skillManagement.detail.createFolderMenu": "New folder...", - "skillManagement.detail.createFolderSuccess": "Folder created.", - "skillManagement.detail.createdBy": "Created by {{name}}", - "skillManagement.detail.currentDraft": "Current draft", - "skillManagement.detail.deleteFileConfirm": "Delete this file?", - "skillManagement.detail.deleteFileSuccess": "File deleted.", - "skillManagement.detail.deleteVersionConfirm": "Delete this version?", - "skillManagement.detail.deleteVersionFailed": "Failed to delete version.", - "skillManagement.detail.deleteVersionSuccess": "Version deleted.", - "skillManagement.detail.downloadFile": "Download file", - "skillManagement.detail.draft": "Draft", + "skillManagement.detail.copyContentSuccess": "Conținut copiat în clipboard.", + "skillManagement.detail.copyFile": "Copiază", + "skillManagement.detail.copyFileSuccess": "Fișier gata de lipit.", + "skillManagement.detail.copyVersionId": "Copiază ID", + "skillManagement.detail.copyVersionIdSuccess": "ID copiat în clipboard.", + "skillManagement.detail.createFile": "Fișier nou", + "skillManagement.detail.createFileDescription": "Introduceți o cale de fișier în raport cu rădăcina abilității.", + "skillManagement.detail.createFileMenu": "Fișier nou...", + "skillManagement.detail.createFileSuccess": "Fișier creat.", + "skillManagement.detail.createFolder": "Dosar nou", + "skillManagement.detail.createFolderDescription": "Introduceți o cale de folder în raport cu rădăcina abilității.", + "skillManagement.detail.createFolderMenu": "Dosar nou...", + "skillManagement.detail.createFolderSuccess": "Folder creat.", + "skillManagement.detail.createdBy": "Creat de {{name}}", + "skillManagement.detail.currentDraft": "Schiță curentă", + "skillManagement.detail.cutFile": "Tăiați", + "skillManagement.detail.cutFileSuccess": "Fișier gata de mutat.", + "skillManagement.detail.deleteFileConfirm": "Ștergeți acest fișier?", + "skillManagement.detail.deleteFileSuccess": "Fișier șters.", + "skillManagement.detail.deleteVersionConfirm": "Ștergeți această versiune?", + "skillManagement.detail.deleteVersionFailed": "Versiunea a eșuat.", + "skillManagement.detail.deleteVersionSuccess": "Versiune ștearsă.", + "skillManagement.detail.downloadFile": "Descărcați fișierul", + "skillManagement.detail.draft": "Ciornă", + "skillManagement.detail.editVersionInfo": "Editează informațiile versiunii", + "skillManagement.detail.exitVersions": "Ieși din versiuni", "skillManagement.detail.expandSidebar": "Extinde bara laterală", - "skillManagement.detail.fileCount": "{{count}} FILES", - "skillManagement.detail.fileMeta": "{{type}} · {{size}} bytes", - "skillManagement.detail.fileMissing": "File not found.", - "skillManagement.detail.fileOperationFailed": "File operation failed.", - "skillManagement.detail.files": "Files", - "skillManagement.detail.latest": "Latest", - "skillManagement.detail.loadFailed": "Failed to load skill.", - "skillManagement.detail.markdownLiveMode": "Live preview", - "skillManagement.detail.markdownSourceMode": "Source editor", - "skillManagement.detail.metadataKey": "name", - "skillManagement.detail.metadataValue": "value", - "skillManagement.detail.moveFileSuccess": "File moved.", - "skillManagement.detail.moveFilesSuccess": "Files moved.", - "skillManagement.detail.noFileSelected": "Select a file to preview.", - "skillManagement.detail.noFiles": "No files.", + "skillManagement.detail.fileAlreadyExists": "Un fișier sau dosar cu acest nume există deja.", + "skillManagement.detail.fileCount_one": "Fișierul {{count}}", + "skillManagement.detail.fileCount_other": "fișierele {{count}}", + "skillManagement.detail.fileMeta": "{{type}} · {{size}} octeți", + "skillManagement.detail.fileMissing": "Fișierul nu a fost găsit.", + "skillManagement.detail.fileOperationFailed": "Operațiunea fișierului a eșuat.", + "skillManagement.detail.files": "Fișiere", + "skillManagement.detail.latest": "Cea mai recentă", + "skillManagement.detail.loadFailed": "Nu s-a putut încărca calificarea.", + "skillManagement.detail.loadingTags": "Se încarcă etichetele...", + "skillManagement.detail.markdownLiveMode": "Previzualizare live", + "skillManagement.detail.markdownSourceMode": "Editor sursă", + "skillManagement.detail.metadataKey": "nume", + "skillManagement.detail.metadataValue": "valoare", + "skillManagement.detail.moveFileSuccess": "Fișierul a fost mutat.", + "skillManagement.detail.moveFilesSuccess": "Fișierele mutate.", + "skillManagement.detail.nameThisVersion": "Numește această versiune", + "skillManagement.detail.noFileSelected": "Selectați un fișier pentru previzualizare.", + "skillManagement.detail.noFiles": "Fără fișiere.", "skillManagement.detail.noSearchResults": "Nu există fișiere potrivite.", - "skillManagement.detail.noVersions": "No published versions yet.", - "skillManagement.detail.previewUnsupported": "Preview is not supported for this file.", - "skillManagement.detail.publish": "Publish", - "skillManagement.detail.publishFailed": "Failed to publish skill.", - "skillManagement.detail.publishSuccess": "Skill published.", - "skillManagement.detail.published": "Published", + "skillManagement.detail.noSelectableTags": "Nu există etichete disponibile.", + "skillManagement.detail.noVersions": "Nu există încă versiuni publicate.", + "skillManagement.detail.pasteFile": "Pastă", + "skillManagement.detail.pasteFileSuccess": "Fișierul a fost lipit.", + "skillManagement.detail.previewUnsupported": "Acest fișier nu acceptă previzualizarea.", + "skillManagement.detail.publish": "Publică", + "skillManagement.detail.publishFailed": "Nu s-a putut publica abilitate.", + "skillManagement.detail.publishReferencesDescription_one": "Publicarea intră în vigoare imediat pentru agentul {{count}} care utilizează această abilitate.", + "skillManagement.detail.publishReferencesDescription_other": "Publicarea intră în vigoare imediat pentru agenții {{count}} care folosesc această abilitate.", + "skillManagement.detail.publishReferencesTitle": "Abilitatea de a publica", + "skillManagement.detail.publishSuccess": "Skill publicat.", + "skillManagement.detail.publishUpdate": "Publică actualizarea", + "skillManagement.detail.published": "Publicat", "skillManagement.detail.publishedAt": "Publicat {{time}}", + "skillManagement.detail.publishedVersion": "Publicat #{{number}}", "skillManagement.detail.publishing": "Se publică...", - "skillManagement.detail.readonly": "Read only", - "skillManagement.detail.referenceFiles.confirm": "Enter Confirm", - "skillManagement.detail.referenceFiles.empty": "No files available.", - "skillManagement.detail.referenceFiles.livePlaceholder": "Write instructions for the agent, type / to reference files", - "skillManagement.detail.referenceFiles.navigate": "↑↓ Navigate", - "skillManagement.detail.referenceFiles.title": "Reference files", - "skillManagement.detail.referencedBy": "Referenced by {{count}} Apps", - "skillManagement.detail.removeMetadata": "Delete {{name}} metadata", - "skillManagement.detail.removeTag": "Remove {{tag}}", - "skillManagement.detail.removeTagSuccess": "Tag removed.", - "skillManagement.detail.renameFile": "Rename file", - "skillManagement.detail.renameFileDescription": "Enter the new path relative to the skill root.", - "skillManagement.detail.renameFileSuccess": "File renamed.", - "skillManagement.detail.renameSkillSuccess": "Skill renamed.", - "skillManagement.detail.renameVersion": "Rename", - "skillManagement.detail.renameVersionFailed": "Failed to rename version.", - "skillManagement.detail.renameVersionPrompt": "Version name", - "skillManagement.detail.renameVersionSuccess": "Version renamed.", - "skillManagement.detail.restoreVersion": "Restore", - "skillManagement.detail.restoreVersionFailed": "Failed to restore version.", - "skillManagement.detail.restoreVersionSuccess": "Version restored to draft.", - "skillManagement.detail.save": "Save", - "skillManagement.detail.saveFailed": "Failed to save file.", - "skillManagement.detail.saveSuccess": "File saved.", - "skillManagement.detail.saved": "Saved", - "skillManagement.detail.savedAt": "Saved {{time}}", - "skillManagement.detail.saving": "Saving...", + "skillManagement.detail.readonly": "Numai citire", + "skillManagement.detail.referenceFiles.confirm": "Introduceți Confirmare", + "skillManagement.detail.referenceFiles.empty": "Nu există fișiere disponibile.", + "skillManagement.detail.referenceFiles.livePlaceholder": "Scrieți instrucțiuni pentru agent. Tastați / pentru a face referire la fișiere.", + "skillManagement.detail.referenceFiles.navigate": "↑↓ Navigați", + "skillManagement.detail.referenceFiles.title": "Fișiere de referință", + "skillManagement.detail.referencedBy_one": "Folosit de {{count}} agent", + "skillManagement.detail.referencedBy_other": "Folosit de {{count}} agenți", + "skillManagement.detail.removeMetadata": "Ștergeți metadatele {{name}}", + "skillManagement.detail.removeTag": "Eliminați {{tag}}", + "skillManagement.detail.removeTagSuccess": "Eticheta a fost eliminată.", + "skillManagement.detail.renameFile": "Redenumiți fișierul", + "skillManagement.detail.renameFileDescription": "Introduceți noua cale în raport cu rădăcina abilității.", + "skillManagement.detail.renameFileSuccess": "Fișier redenumit.", + "skillManagement.detail.renameSkillSuccess": "Skill redenumit.", + "skillManagement.detail.renameVersion": "Redenumește", + "skillManagement.detail.renameVersionFailed": "Nu s-a redenumit versiunea.", + "skillManagement.detail.renameVersionPrompt": "Numele versiunii", + "skillManagement.detail.renameVersionSuccess": "Versiune redenumită.", + "skillManagement.detail.resizeSidebar": "Redimensionați bara laterală a fișierului", + "skillManagement.detail.restoreVersion": "Restaurează", + "skillManagement.detail.restoreVersionConfirmDescription": "Aceasta va înlocui schița actuală cu fișierele din „{{version}}”. Nu va publica Skill sau nu va crea o versiune nouă.", + "skillManagement.detail.restoreVersionConfirmTitle": "Restabiliți această versiune?", + "skillManagement.detail.restoreVersionFailed": "Nu s-a restabilit versiunea.", + "skillManagement.detail.restoreVersionSuccess": "Versiunea a fost restaurată în versiune nefinalizată.", + "skillManagement.detail.save": "Salvează", + "skillManagement.detail.saveConflictConfirmDescription": "Această abilitate a fost actualizată în altă parte. Încărcați cea mai recentă schiță pentru a continua editarea. Modificările dvs. curente vor fi renunțate.", + "skillManagement.detail.saveConflictConfirmTitle": "Încărcați cea mai recentă schiță?", + "skillManagement.detail.saveConflictReload": "Încărcați cea mai recentă schiță", + "skillManagement.detail.saveConflictStatus": "Conflict detectat. Încărcați cea mai recentă schiță pentru a continua editarea.", + "skillManagement.detail.saveFailed": "Nu s-a putut salva fișierul.", + "skillManagement.detail.saveSuccess": "Fișier salvat.", + "skillManagement.detail.saved": "Salvat", + "skillManagement.detail.savedAt": "Salvat {{time}}", + "skillManagement.detail.saving": "Se salvează...", "skillManagement.detail.searchFiles": "Caută fișiere", + "skillManagement.detail.showMoreReferences": "Afișați mai multe {{count}}", + "skillManagement.detail.skillDescriptionPlaceholder": "Descrieți ce face această abilitate și când ar trebui să o folosească agenții.", + "skillManagement.detail.skillNamePlaceholder": "Folosiți litere mici, cifre și cratime.", "skillManagement.detail.unpublishedChanges": "Modificări nepublicate", - "skillManagement.detail.unsavedChanges": "Unsaved changes", + "skillManagement.detail.unsavedChanges": "Modificări nesalvate", "skillManagement.detail.upToDate": "Actualizat", - "skillManagement.detail.updateTagsFailed": "Failed to update tags.", - "skillManagement.detail.uploadFile": "Upload file", - "skillManagement.detail.uploadFileFailed": "File upload failed.", - "skillManagement.detail.uploadFileSuccess": "File uploaded.", - "skillManagement.detail.uploadFilesMenu": "Upload files...", + "skillManagement.detail.updateTagsFailed": "Nu s-au actualizat etichetele.", + "skillManagement.detail.uploadCheckFailed": "Nu s-au putut verifica aceste fișiere. Încearcă din nou.", + "skillManagement.detail.uploadConflict": "Un fișier cu acest nume există deja.", + "skillManagement.detail.uploadFailureSummary": "{{failed}} a fișierelor {{total}} a eșuat", + "skillManagement.detail.uploadFailureTitle": "Unele încărcări nu au reușit", + "skillManagement.detail.uploadFile": "Încarcă fișier", + "skillManagement.detail.uploadFileFailed": "Încărcarea fișierului a eșuat.", + "skillManagement.detail.uploadFileSuccess": "Fișier încărcat.", + "skillManagement.detail.uploadFilesButton": "Încărcați fișiere {{count}}", + "skillManagement.detail.uploadFilesFailedStatus_one": "Încărcarea fișierului {{count}} a eșuat.", + "skillManagement.detail.uploadFilesFailedStatus_other": "Încărcarea fișierului {{count}} nu a reușit.", + "skillManagement.detail.uploadFilesMenu": "Încărcați fișiere...", + "skillManagement.detail.uploadFilesProgress": "Se încarcă {{completed}}/{{total}}", + "skillManagement.detail.uploadFilesResult": "{{uploaded}} încărcat · {{failed}} a eșuat", + "skillManagement.detail.uploadFilesStatus": "Stare încărcare", + "skillManagement.detail.uploadInvalidExtension": "Acest tip de fișier nu este acceptat.", + "skillManagement.detail.uploadInvalidName": "Nume nevalid.", + "skillManagement.detail.uploadInvalidPath": "Cale de fișier nevalidă.", + "skillManagement.detail.uploadKeepBoth": "Păstrați ambele", + "skillManagement.detail.uploadLateConflict": "Cineva a adăugat acest fișier în timp ce încărcați.", + "skillManagement.detail.uploadMissingExtension": "Este necesară o extensie de fișier.", + "skillManagement.detail.uploadNetworkFailure": "Încărcarea nu a reușit. Verificați-vă conexiunea.", + "skillManagement.detail.uploadReadySummary": "{{ready}} gata · {{decisions}} au nevoie de o decizie · {{skipped}} va fi omis", + "skillManagement.detail.uploadReplace": "Înlocui", + "skillManagement.detail.uploadResolvedSummary": "{{ready}} gata · {{skipped}} va fi omis", + "skillManagement.detail.uploadRetryCount": "Reîncercați {{count}}", + "skillManagement.detail.uploadReviewTitle": "Examinați înainte de a încărca", + "skillManagement.detail.uploadSkip": "Navă", + "skillManagement.detail.uploadSkippedGroup": "Fișierele {{count}} nu pot fi încărcate și vor fi omise", + "skillManagement.detail.uploadStatusDismiss": "Închideți starea încărcării", + "skillManagement.detail.uploadSuggestion": "Utilizați sugestia", + "skillManagement.detail.uploadWillReplace": "Va înlocui fișierul existent", + "skillManagement.detail.uploadWillUseName": "Se va încărca ca {{name}}", + "skillManagement.detail.versionHistory": "Deschide istoricul versiunilor", "skillManagement.detail.versionMeta": "{{hash}} · {{time}}", - "skillManagement.detail.versions": "Versions", - "skillManagement.draft": "Draft", - "skillManagement.duplicateFailed": "Failed to duplicate skill.", - "skillManagement.duplicateSuccess": "Skill duplicated.", - "skillManagement.editedAt": "Edited {{time}}", - "skillManagement.empty": "No skills yet", - "skillManagement.emptySearch": "No skills found", - "skillManagement.import": "Import", - "skillManagement.importFailed": "Failed to import skill.", - "skillManagement.importSuccess": "Skill imported.", - "skillManagement.listLabel": "Workspace skills", - "skillManagement.loadingError": "Failed to load skills", - "skillManagement.moreActions": "More actions for {{name}}", - "skillManagement.noTags": "No tags", - "skillManagement.publishedAt": "Published {{time}}", - "skillManagement.referenceCount": "{{count}} Refs", - "skillManagement.searchLabel": "Search skills", - "skillManagement.searchPlaceholder": "Search", - "skillManagement.tags": "Tags", - "skillManagement.title": "Skills" + "skillManagement.detail.versionPublishNote": "Note de lansare", + "skillManagement.detail.versionPublishNotePlaceholder": "Descrieți această schimbare", + "skillManagement.detail.versionPublishedMeta": "{{time}} · {{name}}", + "skillManagement.detail.versionTitle": "Titlu", + "skillManagement.detail.versions": "Versiuni", + "skillManagement.detail.viewOnly": "Numai vizualizare", + "skillManagement.detail.viewUploadErrors": "Vizualizați erorile", + "skillManagement.draft": "Ciornă", + "skillManagement.duplicateFailed": "Nu s-a putut duplica abilitate.", + "skillManagement.duplicateSuccess": "Skill duplicat.", + "skillManagement.editedAt": "Editat {{time}}", + "skillManagement.empty": "Nicio abilitate încă", + "skillManagement.emptyAction.createDescription": "Descrieți un scenariu în cuvinte simple și obțineți o abilitate schiță de revizuit.", + "skillManagement.emptyAction.createTitle": "Creați cu Skill Builder", + "skillManagement.emptyAction.importDescription": "Aduceți un .zip cu SKILL.md, în format agentkills.io.", + "skillManagement.emptyAction.importTitle": "Importați un pachet de abilități", + "skillManagement.emptySearch": "Nu s-au găsit abilități", + "skillManagement.errors.missingSkillMd": "Acest pachet nu are SKILL.md. Adăugați fișierul și importați-l din nou.", + "skillManagement.errors.nameConflict": "O abilitate numită „{{name}}” există deja. Redenumiți-l în SKILL.md și importați din nou.", + "skillManagement.errors.workspaceLimit": "Spațiul tău de lucru a atins limita de 500 de aptitudini. Ștergeți o abilitate pentru a adăuga una nouă.", + "skillManagement.import": "Importați", + "skillManagement.importFailed": "Nu s-a putut importa abilitate.", + "skillManagement.importSuccess": "Skill importat.", + "skillManagement.listLabel": "Abilități de spațiu de lucru", + "skillManagement.loadingError": "Nu s-au încărcat competențele", + "skillManagement.moreActions": "Mai multe acțiuni pentru {{name}}", + "skillManagement.noDescription": "Nicio descriere încă", + "skillManagement.noTags": "Nicio etichetă", + "skillManagement.publishedAt": "Publicat {{time}}", + "skillManagement.referenceCount_one": "{{count}} agent", + "skillManagement.referenceCount_other": "{{count}} agenți", + "skillManagement.searchLabel": "Caută abilități", + "skillManagement.searchPlaceholder": "Căutați după nume sau descriere", + "skillManagement.tags": "Etichete", + "skillManagement.title": "Abilități" } diff --git a/web/i18n/ru-RU/agent-v-2.json b/web/i18n/ru-RU/agent-v-2.json index 9da41ee3653..e75702d0eb9 100644 --- a/web/i18n/ru-RU/agent-v-2.json +++ b/web/i18n/ru-RU/agent-v-2.json @@ -83,7 +83,7 @@ "agentDetail.configure.buildDraft.changesToApply_other": "{{count}} изменений для применения", "agentDetail.configure.buildDraft.discard": "Отменить", "agentDetail.configure.buildDraft.modeBadge": "Режим сборки", - "agentDetail.configure.buildDraft.modeDescription": "Вы в режиме сборки. В этом режиме Configure может обновлять только агент. Настройте эту конфигурацию через чат справа, затем примените изменения.", + "agentDetail.configure.buildDraft.modeDescription": "Вы в режиме сборки. Сформируйте эту конфигурацию в чате с агентом, а затем нажмите «Применить».", "agentDetail.configure.buildDraft.rewritten": "Переписано", "agentDetail.configure.buildDraft.title": "Черновик сборки", "agentDetail.configure.buildDraft.updated": "Обновлено", @@ -105,7 +105,8 @@ "agentDetail.configure.files.preview.failed": "Не удалось загрузить предпросмотр.", "agentDetail.configure.files.preview.unsupported": "Этот файл не поддерживает предварительный просмотр.", "agentDetail.configure.files.remove": "Удалить {{name}}", - "agentDetail.configure.files.tip": "Для справочных материалов, которые слишком длинные для вставки в Prompt: спецификации, шаблоны, инструкции. Ссылайтесь на них через / в Prompt.\n\nВ режиме Build агент может настроить это за вас.", + "agentDetail.configure.files.richTip": "Для справочных материалов, которые слишком длинные для вставки в Prompt: спецификации, шаблоны, инструкции. Подробнее\n\nВ режиме Build агент может настроить это за вас.", + "agentDetail.configure.files.tip": "Для справочных материалов, которые слишком длинные для вставки в Prompt: спецификации, шаблоны, инструкции. Подробнее\n\nВ режиме Build агент может настроить это за вас.", "agentDetail.configure.files.toggle": "Переключить файлы", "agentDetail.configure.files.treeLabel": "Файлы агента", "agentDetail.configure.files.upload.action": "Загрузить", @@ -114,7 +115,7 @@ "agentDetail.configure.files.upload.dropzone": "Перетащите файл сюда или", "agentDetail.configure.files.upload.failed": "Не удалось загрузить файл.", "agentDetail.configure.files.upload.fileType": "ФАЙЛ", - "agentDetail.configure.files.upload.invalidFile": "Загрузите один файл.", + "agentDetail.configure.files.upload.invalidFile": "За один раз можно загрузить только один файл.", "agentDetail.configure.files.upload.success": "Файл загружен.", "agentDetail.configure.files.upload.title": "Загрузить файл", "agentDetail.configure.knowledgeRetrieval.add": "Добавить поиск по знаниям", @@ -177,7 +178,8 @@ "agentDetail.configure.prompt.mention.priyaRamanathan": "Priya Ramanathan", "agentDetail.configure.prompt.placeholder": "Напишите инструкции здесь,", "agentDetail.configure.prompt.referenceMissing": "{{name}} не существует", - "agentDetail.configure.prompt.tip": "Определите роль агента и опишите его типичную задачу. Используйте /, чтобы явно ссылаться на навыки, файлы, инструменты и извлечение знаний.", + "agentDetail.configure.prompt.richTip": "Определите роль агента и то, как он должен работать. Подробнее", + "agentDetail.configure.prompt.tip": "Определите роль агента и то, как он должен работать. Подробнее", "agentDetail.configure.publishBar.draft": "Черновик", "agentDetail.configure.publishBar.publishUpdate": "Опубликовать обновление", "agentDetail.configure.publishBar.published": "Опубликовано", @@ -190,12 +192,12 @@ "agentDetail.configure.publishBar.versionHistory": "Открыть историю версий", "agentDetail.configure.publishImpact.affectedWorkflows": "Затронутые рабочие процессы", "agentDetail.configure.publishImpact.cancel": "Отмена", - "agentDetail.configure.publishImpact.descriptionPrefix": "Ваш агент используется в", - "agentDetail.configure.publishImpact.descriptionSuffix": ". Изменения повлияют на них.", + "agentDetail.configure.publishImpact.descriptionPrefix": "Этот агент используется в", + "agentDetail.configure.publishImpact.descriptionSuffix": ". После публикации он будет обновлён во всех этих рабочих процессах.", "agentDetail.configure.publishImpact.fallbackAgentName": "этого агента", "agentDetail.configure.publishImpact.title": "{{action}} в {{name}}", - "agentDetail.configure.publishImpact.workflowCount_one": "{{count}} рабочий процесс", - "agentDetail.configure.publishImpact.workflowCount_other": "{{count}} рабочих процессов", + "agentDetail.configure.publishImpact.workflowCount_one": "{{count}} рабочем процессе", + "agentDetail.configure.publishImpact.workflowCount_other": "{{count}} рабочих процессах", "agentDetail.configure.rightPanel.build": "Сборка", "agentDetail.configure.rightPanel.buildTipBody": "Build настраивает агента через чат. Опишите, что вам нужно, и он заполнит настройки слева.", "agentDetail.configure.rightPanel.buildTipTitle": "Создайте агента через чат", @@ -222,8 +224,8 @@ "agentDetail.configure.skills.openInLibrary": "Open in Skill library", "agentDetail.configure.skills.remove": "Удалить {{name}}", "agentDetail.configure.skills.removeAction": "Remove", - "agentDetail.configure.skills.richTip": "Упакуйте инструкции, файлы и скрипты для повторяющейся задачи в Skill. Ссылайтесь на него через / в Prompt. Подробнее\n\nВ режиме Build агент может настроить это за вас.", - "agentDetail.configure.skills.tip": "Упакуйте инструкции, файлы и скрипты для повторяющейся задачи в Skill. Ссылайтесь на него через / в Prompt. Подробнее\n\nВ режиме Build агент может настроить это за вас.", + "agentDetail.configure.skills.richTip": "Упакуйте инструкции, файлы и скрипты для повторяющейся задачи в Skill. Подробнее\n\nВ режиме Build агент может настроить это за вас.", + "agentDetail.configure.skills.tip": "Упакуйте инструкции, файлы и скрипты для повторяющейся задачи в Skill. Подробнее\n\nВ режиме Build агент может настроить это за вас.", "agentDetail.configure.skills.toggle": "Переключить навыки", "agentDetail.configure.skills.upload.action": "Загрузить", "agentDetail.configure.skills.upload.browse": "обзор", @@ -269,8 +271,8 @@ "agentDetail.configure.tools.moreActions": "Дополнительные действия для {{name}}", "agentDetail.configure.tools.removeAction": "Удалить {{name}}", "agentDetail.configure.tools.removeProvider": "Удалить все инструменты", - "agentDetail.configure.tools.richTip": "Добавьте инструменты Dify из своего workspace. Ссылайтесь на них через / в Prompt. Подробнее\n\nИнструменты, которые агент устанавливает в своей sandbox, не появятся здесь, но останутся ему доступны.", - "agentDetail.configure.tools.tip": "Добавьте инструменты Dify из своего workspace. Ссылайтесь на них через / в Prompt. Подробнее\n\nИнструменты, которые агент устанавливает в своей sandbox, не появятся здесь, но останутся ему доступны.", + "agentDetail.configure.tools.richTip": "Добавьте инструменты Dify из своего workspace. Подробнее\n\nИнструменты, которые агент устанавливает в своей sandbox, не появятся здесь, но останутся ему доступны.", + "agentDetail.configure.tools.tip": "Добавьте инструменты Dify из своего workspace. Подробнее\n\nИнструменты, которые агент устанавливает в своей sandbox, не появятся здесь, но останутся ему доступны.", "agentDetail.configure.tools.toggle": "Переключить инструменты", "agentDetail.configure.tools.toolTabs.all": "Все", "agentDetail.configure.tools.toolTabs.cli": "CLI", @@ -336,22 +338,22 @@ "agentDetail.metadata.sourceLabel": "Источник", "agentDetail.monitoring.change": "{{value}} к предыдущему периоду", "agentDetail.monitoring.dateRangeLabel": "Диапазон дат", - "agentDetail.monitoring.description": "Отслеживайте активность переиспользуемого агента, затраты и качество взаимодействия в рабочих процессах.", + "agentDetail.monitoring.description": "Отслеживайте активность этого агента, затраты и качество взаимодействия во всех точках доступа.", "agentDetail.monitoring.learnMore": "Подробнее", "agentDetail.monitoring.loadFailed": "Не удалось загрузить данные мониторинга", - "agentDetail.monitoring.metrics.activeUsers.explanation": "Уникальные конечные пользователи, запустившие рабочие процессы с этим агентом.", + "agentDetail.monitoring.metrics.activeUsers.explanation": "Уникальные конечные пользователи, взаимодействовавшие с этим агентом.", "agentDetail.monitoring.metrics.activeUsers.title": "Активные пользователи", - "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Количество непрерывных взаимодействий пользователя с агентом для этой точки доступа.", + "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Среднее количество сообщений пользователя за один диалог.", "agentDetail.monitoring.metrics.avgSessionInteractions.title": "Среднее число взаимодействий за сессию", - "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Средняя скорость вывода от начала запроса до завершения.", + "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Среднее количество токенов, генерируемых в секунду во время ответа агента.", "agentDetail.monitoring.metrics.tokenOutputSpeed.title": "Скорость вывода токенов", - "agentDetail.monitoring.metrics.tokenUsage.explanation": "Оценочная стоимость токенов, производимых этим агентом в запусках рабочих процессов.", + "agentDetail.monitoring.metrics.tokenUsage.explanation": "Использованные токены и их ориентировочная стоимость.", "agentDetail.monitoring.metrics.tokenUsage.title": "Использование токенов", "agentDetail.monitoring.metrics.totalConversations.explanation": "Ежедневное количество AI-разговоров, достигших этого агента через выбранную точку доступа.", "agentDetail.monitoring.metrics.totalConversations.title": "Всего разговоров", - "agentDetail.monitoring.metrics.totalMessages.explanation": "Ежедневное количество взаимодействий агента.", + "agentDetail.monitoring.metrics.totalMessages.explanation": "Общее количество сообщений, отправленных пользователями этому агенту.", "agentDetail.monitoring.metrics.totalMessages.title": "Всего сообщений", - "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "Количество лайков на 1000 сообщений для этого агента.", + "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "Доля ответов агента, которым пользователи поставили отметку «Нравится».", "agentDetail.monitoring.metrics.userSatisfactionRate.title": "Уровень удовлетворённости пользователей", "agentDetail.monitoring.pickSource": "Выберите приложение", "agentDetail.monitoring.sourceLabel": "Приложение", @@ -549,7 +551,5 @@ "skillManagement.searchLabel": "Search skills", "skillManagement.searchPlaceholder": "Search", "skillManagement.tags": "Tags", - "skillManagement.title": "Skills", - "agentDetail.configure.files.richTip": "Для справочных материалов, которые слишком длинные для вставки в Prompt: спецификации, шаблоны, инструкции. Подробнее\n\nВ режиме Build агент может настроить это за вас.", - "agentDetail.configure.prompt.richTip": "Определите роль агента и то, как он должен работать. Подробнее" + "skillManagement.title": "Skills" } diff --git a/web/i18n/ru-RU/skill.json b/web/i18n/ru-RU/skill.json index 564f3473c09..065f49bbd8c 100644 --- a/web/i18n/ru-RU/skill.json +++ b/web/i18n/ru-RU/skill.json @@ -1,121 +1,245 @@ { - "skillManagement.clearTags": "Clear tags", - "skillManagement.create": "Create", - "skillManagement.createFailed": "Failed to create skill.", - "skillManagement.createSuccess": "Skill created.", - "skillManagement.dateTimeFormat": "MMM D, YYYY HH:mm", + "skillManagement.clearTags": "Очистить теги", + "skillManagement.create": "Создать", + "skillManagement.createFailed": "Не удалось создать навык.", + "skillManagement.createSuccess": "Черновик создан.", + "skillManagement.dateTimeFormat": "МММ Д, ГГГГ ЧЧ:мм", "skillManagement.deleteDialog.confirmInputLabel": "Для подтверждения введите {{skillName}} в поле ниже:", "skillManagement.deleteDialog.confirmInputPlaceholder": "Введите отображаемое имя Skill…", - "skillManagement.deleteDialog.description": "This skill will be removed from the workspace. Agents that reference it may lose access to this capability.", - "skillManagement.deleteDialog.title": "Delete {{name}}?", - "skillManagement.deleteFailed": "Failed to delete skill.", - "skillManagement.deleteSuccess": "Skill deleted.", - "skillManagement.detail.addMetadata": "Add metadata", - "skillManagement.detail.addMetadataDescription": "Add a frontmatter field to this Markdown file.", - "skillManagement.detail.addTag": "Add tag", - "skillManagement.detail.addTagDescription": "Create or bind a tag to this Skill. New tags are saved with the Skill metadata.", - "skillManagement.detail.addTagSuccess": "Tag added.", - "skillManagement.detail.back": "Back to Skills", - "skillManagement.detail.cancelAddMetadata": "Cancel adding metadata", - "skillManagement.detail.closeFileTab": "Close {{name}}", + "skillManagement.deleteDialog.description": "Удаление навыка необратимо. Его содержимое и полная история версий будут удалены без возможности восстановления. Ни один агент в настоящее время не использует его.", + "skillManagement.deleteDialog.referencedDescription_one": "Агент {{count}} использует этот навык самостоятельно или в рабочем процессе. Удаление этого навыка приведет к безвозвратному удалению его содержимого и истории версий и удалению его из затронутого агента.", + "skillManagement.deleteDialog.referencedDescription_other": "Агенты {{count}} используют этот навык либо самостоятельно, либо в рабочих процессах. Удаление этого навыка приведет к безвозвратному удалению его содержимого и истории версий, а также удалению его из всех задействованных агентов.", + "skillManagement.deleteDialog.title": "Удалить {{name}}?", + "skillManagement.deleteFailed": "Не удалось удалить навык.", + "skillManagement.deleteSuccess": "Skill удален.", + "skillManagement.detail.addMetadata": "Добавить метаданные", + "skillManagement.detail.addMetadataDescription": "Добавьте поле frontmatter в этот файл Markdown.", + "skillManagement.detail.addTag": "Добавить тег", + "skillManagement.detail.addTagDescription": "Создайте или привяжите тег к этому Skill. Новые теги сохраняются с метаданными Skill.", + "skillManagement.detail.addTagSuccess": "Тег добавлен.", + "skillManagement.detail.back": "Вернуться к Skills", + "skillManagement.detail.builder.applyFailed": "Не удалось применить черновики обновлений.", + "skillManagement.detail.builder.attach": "Прикрепить файл", + "skillManagement.detail.builder.attachFailed": "Не удалось прикрепить файл.", + "skillManagement.detail.builder.attachLimit": "Вы можете прикрепить до 10 файлов.", + "skillManagement.detail.builder.attachTooLarge": "Размер файлов должен составлять 15 МБ или меньше. Изображения должны иметь размер 10 МБ или меньше.", + "skillManagement.detail.builder.attachUnsupported": "Прикреплять можно только изображения, текст и файлы документов.", + "skillManagement.detail.builder.attachmentOnlyMessage": "Используйте прикрепленный файл, чтобы улучшить этот навык.", + "skillManagement.detail.builder.close": "Закрыть", + "skillManagement.detail.builder.compatibleModelsOnly": "Показаны только совместимые модели", + "skillManagement.detail.builder.copyResponse": "Копировать ответ", + "skillManagement.detail.builder.copySuccess": "Ответ скопирован в буфер обмена.", + "skillManagement.detail.builder.editIntro": "Я рассмотрел этот навык. Что бы вы хотели настроить?", + "skillManagement.detail.builder.exampleIssueTriage": "Сортировка проблем клиентов", + "skillManagement.detail.builder.exampleOnboarding": "Руководство по адаптации новых сотрудников", + "skillManagement.detail.builder.exampleSalesFollowUp": "Стратегия отслеживания продаж", + "skillManagement.detail.builder.followUpDisplayName": "Использовать одобрение возврата в качестве отображаемого имени.", + "skillManagement.detail.builder.followUpNameIcon": "Примените предложенное имя и значок", + "skillManagement.detail.builder.fromMarketplace": "Из Marketplace", + "skillManagement.detail.builder.model": "GPT-4o", + "skillManagement.detail.builder.modelCredits.all": "Все кредиты", + "skillManagement.detail.builder.modelCredits.configure": "Требуется настройка", + "skillManagement.detail.builder.modelCredits.exhausted": "Квота исчерпана", + "skillManagement.detail.builder.modelProviderSettings": "Настройки поставщика моделей", + "skillManagement.detail.builder.modelSearch": "Поиск моделей...", + "skillManagement.detail.builder.modifyPlaceholder": "Попросите ИИ изменить этот навык...", + "skillManagement.detail.builder.open": "Открыть Skill Builder", + "skillManagement.detail.builder.placeholder": "Опишите сценарий...", + "skillManagement.detail.builder.progress.applyingChanges": "Применение изменений файла", + "skillManagement.detail.builder.progress.generatingPlan": "Создание плана обновления", + "skillManagement.detail.builder.progress.readingDraft": "Читаем текущий проект", + "skillManagement.detail.builder.progress.updatingEditor": "Обновление редактора", + "skillManagement.detail.builder.promptDescription": "Опишите его, и в редакторе появится черновик с включенными шагами и файлами.", + "skillManagement.detail.builder.promptTitle": "С чем должен справиться этот навык?", + "skillManagement.detail.builder.readAloud": "Прочитайте ответ вслух", + "skillManagement.detail.builder.removeAttachment": "Удалить {{name}}", + "skillManagement.detail.builder.restart": "Перезапустить конструктор", + "skillManagement.detail.builder.retryResponse": "Повторить ответ", + "skillManagement.detail.builder.send": "Отправить сообщение", + "skillManagement.detail.builder.sendFailed": "Skill Builder не ответил.", + "skillManagement.detail.builder.thinking": "Размышляет", + "skillManagement.detail.builder.thinkingUnavailable": "Модель не вернула никакого содержания мышления.", + "skillManagement.detail.builder.title": "Skill Builder", + "skillManagement.detail.builder.tryExample": "Попробуйте пример", + "skillManagement.detail.builder.voice": "Голосовой ввод", + "skillManagement.detail.builder.voiceUnavailable": "Голосовой ввод пока недоступен.", + "skillManagement.detail.cancelAddMetadata": "Отменить добавление метаданных", + "skillManagement.detail.closeFileTab": "Закрыть {{name}}", + "skillManagement.detail.closeVersions": "Закрыть версии", "skillManagement.detail.collapseSidebar": "Свернуть боковую панель", - "skillManagement.detail.createFile": "New file", - "skillManagement.detail.createFileDescription": "Enter a file path relative to the skill root.", - "skillManagement.detail.createFileMenu": "New file...", - "skillManagement.detail.createFileSuccess": "File created.", - "skillManagement.detail.createFolder": "New folder", - "skillManagement.detail.createFolderDescription": "Enter a folder path relative to the skill root.", - "skillManagement.detail.createFolderMenu": "New folder...", - "skillManagement.detail.createFolderSuccess": "Folder created.", - "skillManagement.detail.createdBy": "Created by {{name}}", - "skillManagement.detail.currentDraft": "Current draft", - "skillManagement.detail.deleteFileConfirm": "Delete this file?", - "skillManagement.detail.deleteFileSuccess": "File deleted.", - "skillManagement.detail.deleteVersionConfirm": "Delete this version?", - "skillManagement.detail.deleteVersionFailed": "Failed to delete version.", - "skillManagement.detail.deleteVersionSuccess": "Version deleted.", - "skillManagement.detail.downloadFile": "Download file", - "skillManagement.detail.draft": "Draft", + "skillManagement.detail.copyContentSuccess": "Содержимое скопировано в буфер обмена.", + "skillManagement.detail.copyFile": "Копировать", + "skillManagement.detail.copyFileSuccess": "Файл готов к вставке.", + "skillManagement.detail.copyVersionId": "Копировать ID", + "skillManagement.detail.copyVersionIdSuccess": "Идентификатор скопирован в буфер обмена.", + "skillManagement.detail.createFile": "Новый файл", + "skillManagement.detail.createFileDescription": "Введите путь к файлу относительно корня навыка.", + "skillManagement.detail.createFileMenu": "Новый файл...", + "skillManagement.detail.createFileSuccess": "Файл создан.", + "skillManagement.detail.createFolder": "Новая папка", + "skillManagement.detail.createFolderDescription": "Введите путь к папке относительно корня навыка.", + "skillManagement.detail.createFolderMenu": "Новая папка...", + "skillManagement.detail.createFolderSuccess": "Папка создана.", + "skillManagement.detail.createdBy": "Создано {{name}}", + "skillManagement.detail.currentDraft": "Текущий проект", + "skillManagement.detail.cutFile": "Резать", + "skillManagement.detail.cutFileSuccess": "Файл готов к перемещению.", + "skillManagement.detail.deleteFileConfirm": "Удалить этот файл?", + "skillManagement.detail.deleteFileSuccess": "Файл удален.", + "skillManagement.detail.deleteVersionConfirm": "Удалить эту версию?", + "skillManagement.detail.deleteVersionFailed": "Не удалось удалить версию.", + "skillManagement.detail.deleteVersionSuccess": "Версия удалена.", + "skillManagement.detail.downloadFile": "Скачать файл", + "skillManagement.detail.draft": "Черновик", + "skillManagement.detail.editVersionInfo": "Редактировать информацию о версии", + "skillManagement.detail.exitVersions": "Выйти из версий", "skillManagement.detail.expandSidebar": "Развернуть боковую панель", - "skillManagement.detail.fileCount": "{{count}} FILES", - "skillManagement.detail.fileMeta": "{{type}} · {{size}} bytes", - "skillManagement.detail.fileMissing": "File not found.", - "skillManagement.detail.fileOperationFailed": "File operation failed.", - "skillManagement.detail.files": "Files", - "skillManagement.detail.latest": "Latest", - "skillManagement.detail.loadFailed": "Failed to load skill.", - "skillManagement.detail.markdownLiveMode": "Live preview", - "skillManagement.detail.markdownSourceMode": "Source editor", - "skillManagement.detail.metadataKey": "name", - "skillManagement.detail.metadataValue": "value", - "skillManagement.detail.moveFileSuccess": "File moved.", - "skillManagement.detail.moveFilesSuccess": "Files moved.", - "skillManagement.detail.noFileSelected": "Select a file to preview.", - "skillManagement.detail.noFiles": "No files.", + "skillManagement.detail.fileAlreadyExists": "Файл или папка с таким именем уже существует.", + "skillManagement.detail.fileCount_one": "{{count}}-файл", + "skillManagement.detail.fileCount_other": "{{count}} файлы", + "skillManagement.detail.fileMeta": "{{type}} · {{size}} байт", + "skillManagement.detail.fileMissing": "Файл не найден.", + "skillManagement.detail.fileOperationFailed": "Операция с файлом не удалась.", + "skillManagement.detail.files": "Файлы", + "skillManagement.detail.latest": "Последний", + "skillManagement.detail.loadFailed": "Не удалось загрузить навык.", + "skillManagement.detail.loadingTags": "Загрузка тегов...", + "skillManagement.detail.markdownLiveMode": "Предварительный просмотр в реальном времени", + "skillManagement.detail.markdownSourceMode": "Редактор исходного кода", + "skillManagement.detail.metadataKey": "имя", + "skillManagement.detail.metadataValue": "ценить", + "skillManagement.detail.moveFileSuccess": "Файл перемещен.", + "skillManagement.detail.moveFilesSuccess": "Файлы перемещены.", + "skillManagement.detail.nameThisVersion": "Назовите эту версию", + "skillManagement.detail.noFileSelected": "Выберите файл для предварительного просмотра.", + "skillManagement.detail.noFiles": "Нет файлов.", "skillManagement.detail.noSearchResults": "Нет подходящих файлов.", - "skillManagement.detail.noVersions": "No published versions yet.", - "skillManagement.detail.previewUnsupported": "Preview is not supported for this file.", - "skillManagement.detail.publish": "Publish", - "skillManagement.detail.publishFailed": "Failed to publish skill.", - "skillManagement.detail.publishSuccess": "Skill published.", - "skillManagement.detail.published": "Published", + "skillManagement.detail.noSelectableTags": "Нет доступных тегов.", + "skillManagement.detail.noVersions": "Опубликованных версий пока нет.", + "skillManagement.detail.pasteFile": "Вставить", + "skillManagement.detail.pasteFileSuccess": "Файл вставлен.", + "skillManagement.detail.previewUnsupported": "Этот файл не поддерживает предварительный просмотр.", + "skillManagement.detail.publish": "Опубликовать", + "skillManagement.detail.publishFailed": "Не удалось опубликовать навык.", + "skillManagement.detail.publishReferencesDescription_one": "Публикация вступает в силу немедленно для агента {{count}}, использующего этот навык.", + "skillManagement.detail.publishReferencesDescription_other": "Публикация вступает в силу немедленно для агентов {{count}}, использующих этот навык.", + "skillManagement.detail.publishReferencesTitle": "Навык публикации", + "skillManagement.detail.publishSuccess": "Skill опубликовано.", + "skillManagement.detail.publishUpdate": "Опубликовать обновление", + "skillManagement.detail.published": "Опубликовано", "skillManagement.detail.publishedAt": "Опубликовано {{time}}", + "skillManagement.detail.publishedVersion": "Опубликовано #{{number}}", "skillManagement.detail.publishing": "Публикация...", - "skillManagement.detail.readonly": "Read only", - "skillManagement.detail.referenceFiles.confirm": "Enter Confirm", - "skillManagement.detail.referenceFiles.empty": "No files available.", - "skillManagement.detail.referenceFiles.livePlaceholder": "Write instructions for the agent, type / to reference files", - "skillManagement.detail.referenceFiles.navigate": "↑↓ Navigate", - "skillManagement.detail.referenceFiles.title": "Reference files", - "skillManagement.detail.referencedBy": "Referenced by {{count}} Apps", - "skillManagement.detail.removeMetadata": "Delete {{name}} metadata", - "skillManagement.detail.removeTag": "Remove {{tag}}", - "skillManagement.detail.removeTagSuccess": "Tag removed.", - "skillManagement.detail.renameFile": "Rename file", - "skillManagement.detail.renameFileDescription": "Enter the new path relative to the skill root.", - "skillManagement.detail.renameFileSuccess": "File renamed.", - "skillManagement.detail.renameSkillSuccess": "Skill renamed.", - "skillManagement.detail.renameVersion": "Rename", - "skillManagement.detail.renameVersionFailed": "Failed to rename version.", - "skillManagement.detail.renameVersionPrompt": "Version name", - "skillManagement.detail.renameVersionSuccess": "Version renamed.", - "skillManagement.detail.restoreVersion": "Restore", - "skillManagement.detail.restoreVersionFailed": "Failed to restore version.", - "skillManagement.detail.restoreVersionSuccess": "Version restored to draft.", - "skillManagement.detail.save": "Save", - "skillManagement.detail.saveFailed": "Failed to save file.", - "skillManagement.detail.saveSuccess": "File saved.", - "skillManagement.detail.saved": "Saved", - "skillManagement.detail.savedAt": "Saved {{time}}", - "skillManagement.detail.saving": "Saving...", + "skillManagement.detail.readonly": "Только чтение", + "skillManagement.detail.referenceFiles.confirm": "Войти Подтвердить", + "skillManagement.detail.referenceFiles.empty": "Нет доступных файлов.", + "skillManagement.detail.referenceFiles.livePlaceholder": "Напишите инструкции для агента. Введите / для ссылки на файлы.", + "skillManagement.detail.referenceFiles.navigate": "↑↓ Навигация", + "skillManagement.detail.referenceFiles.title": "Справочные файлы", + "skillManagement.detail.referencedBy_one": "Используется {{count}} агентом", + "skillManagement.detail.referencedBy_other": "Используется {{count}} агентами", + "skillManagement.detail.removeMetadata": "Удалить метаданные {{name}}", + "skillManagement.detail.removeTag": "Удалить {{tag}}", + "skillManagement.detail.removeTagSuccess": "Тег удален.", + "skillManagement.detail.renameFile": "Переименовать файл", + "skillManagement.detail.renameFileDescription": "Введите новый путь относительно корня навыка.", + "skillManagement.detail.renameFileSuccess": "Файл переименован.", + "skillManagement.detail.renameSkillSuccess": "Skill переименован.", + "skillManagement.detail.renameVersion": "Переименовать", + "skillManagement.detail.renameVersionFailed": "Не удалось переименовать версию.", + "skillManagement.detail.renameVersionPrompt": "Название версии", + "skillManagement.detail.renameVersionSuccess": "Версия переименована.", + "skillManagement.detail.resizeSidebar": "Изменение размера боковой панели файла", + "skillManagement.detail.restoreVersion": "Восстановить", + "skillManagement.detail.restoreVersionConfirmDescription": "Это заменит текущий черновик файлами из «{{version}}». Он не будет публиковать Skill или создавать новую версию.", + "skillManagement.detail.restoreVersionConfirmTitle": "Восстановить эту версию?", + "skillManagement.detail.restoreVersionFailed": "Не удалось восстановить версию.", + "skillManagement.detail.restoreVersionSuccess": "Версия восстановлена ​​до черновика.", + "skillManagement.detail.save": "Сохранить", + "skillManagement.detail.saveConflictConfirmDescription": "Этот навык был обновлен в другом месте. Загрузите последний черновик, чтобы продолжить редактирование. Ваши текущие изменения будут отменены.", + "skillManagement.detail.saveConflictConfirmTitle": "Загрузить последний черновик?", + "skillManagement.detail.saveConflictReload": "Загрузить последний черновик", + "skillManagement.detail.saveConflictStatus": "Обнаружен конфликт. Загрузите последний черновик, чтобы продолжить редактирование.", + "skillManagement.detail.saveFailed": "Не удалось сохранить файл.", + "skillManagement.detail.saveSuccess": "Файл сохранен.", + "skillManagement.detail.saved": "Сохранено", + "skillManagement.detail.savedAt": "Сохранено {{time}}", + "skillManagement.detail.saving": "Сохранение...", "skillManagement.detail.searchFiles": "Поиск файлов", + "skillManagement.detail.showMoreReferences": "Показать {{count}} больше", + "skillManagement.detail.skillDescriptionPlaceholder": "Опишите, что делает этот навык и когда агентам следует его использовать.", + "skillManagement.detail.skillNamePlaceholder": "Используйте строчные буквы, цифры и дефисы.", "skillManagement.detail.unpublishedChanges": "Неопубликованные изменения", - "skillManagement.detail.unsavedChanges": "Unsaved changes", + "skillManagement.detail.unsavedChanges": "Несохраненные изменения", "skillManagement.detail.upToDate": "Актуально", - "skillManagement.detail.updateTagsFailed": "Failed to update tags.", - "skillManagement.detail.uploadFile": "Upload file", - "skillManagement.detail.uploadFileFailed": "File upload failed.", - "skillManagement.detail.uploadFileSuccess": "File uploaded.", - "skillManagement.detail.uploadFilesMenu": "Upload files...", + "skillManagement.detail.updateTagsFailed": "Не удалось обновить теги.", + "skillManagement.detail.uploadCheckFailed": "Не удалось проверить эти файлы. Попробуйте еще раз.", + "skillManagement.detail.uploadConflict": "Файл с таким именем уже существует.", + "skillManagement.detail.uploadFailureSummary": "Ошибка {{failed}} из файлов {{total}}.", + "skillManagement.detail.uploadFailureTitle": "Не удалось загрузить некоторые файлы", + "skillManagement.detail.uploadFile": "Загрузить файл", + "skillManagement.detail.uploadFileFailed": "Загрузка файла не удалась.", + "skillManagement.detail.uploadFileSuccess": "Файл загружен.", + "skillManagement.detail.uploadFilesButton": "Загрузите файлы {{count}}", + "skillManagement.detail.uploadFilesFailedStatus_one": "Не удалось загрузить файл {{count}}.", + "skillManagement.detail.uploadFilesFailedStatus_other": "Не удалось загрузить файл {{count}}.", + "skillManagement.detail.uploadFilesMenu": "Загрузить файлы...", + "skillManagement.detail.uploadFilesProgress": "Загрузка {{completed}}/{{total}}", + "skillManagement.detail.uploadFilesResult": "{{uploaded}} загружен · {{failed}} не удалось", + "skillManagement.detail.uploadFilesStatus": "Статус загрузки", + "skillManagement.detail.uploadInvalidExtension": "Этот тип файла не поддерживается.", + "skillManagement.detail.uploadInvalidName": "Неверное имя.", + "skillManagement.detail.uploadInvalidPath": "Неверный путь к файлу.", + "skillManagement.detail.uploadKeepBoth": "Держите оба", + "skillManagement.detail.uploadLateConflict": "Кто-то добавил этот файл во время загрузки.", + "skillManagement.detail.uploadMissingExtension": "Требуется расширение файла.", + "skillManagement.detail.uploadNetworkFailure": "Загрузка не удалась. Проверьте свое соединение.", + "skillManagement.detail.uploadReadySummary": "{{ready}} готов · {{decisions}} нужно решение · {{skipped}} будет пропущен", + "skillManagement.detail.uploadReplace": "Заменять", + "skillManagement.detail.uploadResolvedSummary": "{{ready}} готов · {{skipped}} будет пропущен", + "skillManagement.detail.uploadRetryCount": "Повторить попытку {{count}}", + "skillManagement.detail.uploadReviewTitle": "Проверьте перед загрузкой", + "skillManagement.detail.uploadSkip": "Корабль", + "skillManagement.detail.uploadSkippedGroup": "Файлы {{count}} не могут быть загружены и будут пропущены.", + "skillManagement.detail.uploadStatusDismiss": "Скрыть статус загрузки", + "skillManagement.detail.uploadSuggestion": "Использовать предложение", + "skillManagement.detail.uploadWillReplace": "Заменит существующий файл", + "skillManagement.detail.uploadWillUseName": "Загружу как {{name}}", + "skillManagement.detail.versionHistory": "Открыть историю версий", "skillManagement.detail.versionMeta": "{{hash}} · {{time}}", - "skillManagement.detail.versions": "Versions", - "skillManagement.draft": "Draft", - "skillManagement.duplicateFailed": "Failed to duplicate skill.", - "skillManagement.duplicateSuccess": "Skill duplicated.", - "skillManagement.editedAt": "Edited {{time}}", - "skillManagement.empty": "No skills yet", - "skillManagement.emptySearch": "No skills found", - "skillManagement.import": "Import", - "skillManagement.importFailed": "Failed to import skill.", - "skillManagement.importSuccess": "Skill imported.", - "skillManagement.listLabel": "Workspace skills", - "skillManagement.loadingError": "Failed to load skills", - "skillManagement.moreActions": "More actions for {{name}}", - "skillManagement.noTags": "No tags", - "skillManagement.publishedAt": "Published {{time}}", - "skillManagement.referenceCount": "{{count}} Refs", - "skillManagement.searchLabel": "Search skills", - "skillManagement.searchPlaceholder": "Search", - "skillManagement.tags": "Tags", - "skillManagement.title": "Skills" + "skillManagement.detail.versionPublishNote": "Примечания к выпуску", + "skillManagement.detail.versionPublishNotePlaceholder": "Опишите это изменение", + "skillManagement.detail.versionPublishedMeta": "{{time}} · {{name}}", + "skillManagement.detail.versionTitle": "Заголовок", + "skillManagement.detail.versions": "Версии", + "skillManagement.detail.viewOnly": "Только просмотр", + "skillManagement.detail.viewUploadErrors": "Просмотр ошибок", + "skillManagement.draft": "Черновик", + "skillManagement.duplicateFailed": "Не удалось дублировать навык.", + "skillManagement.duplicateSuccess": "Skill дублируется.", + "skillManagement.editedAt": "Изменено {{time}}", + "skillManagement.empty": "Пока нет навыков", + "skillManagement.emptyAction.createDescription": "Опишите сценарий простыми словами и получите на рассмотрение черновой вариант навыка.", + "skillManagement.emptyAction.createTitle": "Создать с помощью Skill Builder", + "skillManagement.emptyAction.importDescription": "Принесите .zip с SKILL.md в формате Agentskills.io.", + "skillManagement.emptyAction.importTitle": "Импортировать пакет навыков", + "skillManagement.emptySearch": "Навыки не найдены", + "skillManagement.errors.missingSkillMd": "В этом пакете нет SKILL.md. Добавьте файл и импортируйте его еще раз.", + "skillManagement.errors.nameConflict": "Навык под названием «{{name}}» уже существует. Переименуйте его в SKILL.md и импортируйте снова.", + "skillManagement.errors.workspaceLimit": "Ваше рабочее пространство достигло предела в 500 навыков. Удалите навык, чтобы добавить новый.", + "skillManagement.import": "Импортировать", + "skillManagement.importFailed": "Не удалось импортировать навык.", + "skillManagement.importSuccess": "Skill импортирован.", + "skillManagement.listLabel": "Навыки рабочего пространства", + "skillManagement.loadingError": "Не удалось загрузить навыки", + "skillManagement.moreActions": "Дополнительные действия для {{name}}", + "skillManagement.noDescription": "Описания пока нет", + "skillManagement.noTags": "Нет тегов", + "skillManagement.publishedAt": "Опубликовано {{time}}", + "skillManagement.referenceCount_one": "{{count}} агент", + "skillManagement.referenceCount_other": "{{count}} агентов", + "skillManagement.searchLabel": "Поиск навыков", + "skillManagement.searchPlaceholder": "Поиск по имени или описанию", + "skillManagement.tags": "Теги", + "skillManagement.title": "Навыки" } diff --git a/web/i18n/sl-SI/agent-v-2.json b/web/i18n/sl-SI/agent-v-2.json index 8d1fd62fca6..26eec32c891 100644 --- a/web/i18n/sl-SI/agent-v-2.json +++ b/web/i18n/sl-SI/agent-v-2.json @@ -83,7 +83,7 @@ "agentDetail.configure.buildDraft.changesToApply_other": "{{count}} spremembe za uveljavitev", "agentDetail.configure.buildDraft.discard": "Zavrzi", "agentDetail.configure.buildDraft.modeBadge": "Način gradnje", - "agentDetail.configure.buildDraft.modeDescription": "Ste v načinu gradnje. Configure lahko v tem načinu posodobi samo agent. Nastavitev oblikujte s klepetom na desni, nato jo uporabite.", + "agentDetail.configure.buildDraft.modeDescription": "Ste v načinu gradnje. To nastavitev oblikujte v klepetu z agentom, nato pa kliknite Uporabi.", "agentDetail.configure.buildDraft.rewritten": "Prepisano", "agentDetail.configure.buildDraft.title": "Osnutek gradnje", "agentDetail.configure.buildDraft.updated": "Posodobljeno", @@ -105,7 +105,8 @@ "agentDetail.configure.files.preview.failed": "Predogleda ni bilo mogoče naložiti.", "agentDetail.configure.files.preview.unsupported": "Ta datoteka ne podpira predogleda.", "agentDetail.configure.files.remove": "Odstrani {{name}}", - "agentDetail.configure.files.tip": "Za referenčno gradivo, ki je predolgo za lepljenje v Prompt: specifikacije, predloge, smernice. Sklicujte se z / v Promptu.\n\nV načinu Build jih lahko agent nastavi namesto vas.", + "agentDetail.configure.files.richTip": "Za referenčno gradivo, ki je predolgo za lepljenje v Prompt: specifikacije, predloge, smernice. Več o tem\n\nV načinu Build jih lahko agent nastavi namesto vas.", + "agentDetail.configure.files.tip": "Za referenčno gradivo, ki je predolgo za lepljenje v Prompt: specifikacije, predloge, smernice. Več o tem\n\nV načinu Build jih lahko agent nastavi namesto vas.", "agentDetail.configure.files.toggle": "Preklopi datoteke", "agentDetail.configure.files.treeLabel": "Datoteke agenta", "agentDetail.configure.files.upload.action": "Naloži", @@ -114,7 +115,7 @@ "agentDetail.configure.files.upload.dropzone": "Spustite datoteko sem ali", "agentDetail.configure.files.upload.failed": "Datoteke ni bilo mogoče naložiti.", "agentDetail.configure.files.upload.fileType": "DATOTEKA", - "agentDetail.configure.files.upload.invalidFile": "Naložite eno datoteko.", + "agentDetail.configure.files.upload.invalidFile": "Naenkrat lahko naložite samo eno datoteko.", "agentDetail.configure.files.upload.success": "Datoteka naložena.", "agentDetail.configure.files.upload.title": "Naloži datoteko", "agentDetail.configure.knowledgeRetrieval.add": "Dodaj iskanje znanja", @@ -177,7 +178,8 @@ "agentDetail.configure.prompt.mention.priyaRamanathan": "Priya Ramanathan", "agentDetail.configure.prompt.placeholder": "Tukaj napišite navodila,", "agentDetail.configure.prompt.referenceMissing": "{{name}} ne obstaja", - "agentDetail.configure.prompt.tip": "Določite vlogo agenta in opišite njegovo tipično opravilo. Uporabite / za izrecno sklicevanje na veščine, datoteke, orodja in pridobivanje znanja.", + "agentDetail.configure.prompt.richTip": "Določite vlogo agenta in način njegovega delovanja. Več o tem", + "agentDetail.configure.prompt.tip": "Določite vlogo agenta in način njegovega delovanja. Več o tem", "agentDetail.configure.publishBar.draft": "Osnutek", "agentDetail.configure.publishBar.publishUpdate": "Objavi posodobitev", "agentDetail.configure.publishBar.published": "Objavljeno", @@ -190,12 +192,12 @@ "agentDetail.configure.publishBar.versionHistory": "Odpri zgodovino različic", "agentDetail.configure.publishImpact.affectedWorkflows": "Prizadeti poteki dela", "agentDetail.configure.publishImpact.cancel": "Prekliči", - "agentDetail.configure.publishImpact.descriptionPrefix": "Vaš agent se pojavi v", - "agentDetail.configure.publishImpact.descriptionSuffix": ". Spremembe bodo vplivale nanje.", + "agentDetail.configure.publishImpact.descriptionPrefix": "Ta agent se uporablja v", + "agentDetail.configure.publishImpact.descriptionSuffix": ". Z objavo bo posodobljen v vseh teh potekih dela.", "agentDetail.configure.publishImpact.fallbackAgentName": "tega agenta", "agentDetail.configure.publishImpact.title": "{{action}} v {{name}}", - "agentDetail.configure.publishImpact.workflowCount_one": "{{count}} potek dela", - "agentDetail.configure.publishImpact.workflowCount_other": "{{count}} potekov dela", + "agentDetail.configure.publishImpact.workflowCount_one": "{{count}} poteku dela", + "agentDetail.configure.publishImpact.workflowCount_other": "{{count}} potekih dela", "agentDetail.configure.rightPanel.build": "Izdelaj", "agentDetail.configure.rightPanel.buildTipBody": "Build nastavi agenta prek klepeta. Opišite, kaj želite, in izpolnil bo nastavitev na levi.", "agentDetail.configure.rightPanel.buildTipTitle": "Zgradite agenta prek klepeta", @@ -222,8 +224,8 @@ "agentDetail.configure.skills.openInLibrary": "Open in Skill library", "agentDetail.configure.skills.remove": "Odstrani {{name}}", "agentDetail.configure.skills.removeAction": "Remove", - "agentDetail.configure.skills.richTip": "Navodila, datoteke in skripte za ponavljajočo se nalogo zapakirajte v skill. Sklicujte se z / v Promptu. Več informacij\n\nV načinu Build jih lahko agent nastavi namesto vas.", - "agentDetail.configure.skills.tip": "Navodila, datoteke in skripte za ponavljajočo se nalogo zapakirajte v skill. Sklicujte se z / v Promptu. Več informacij\n\nV načinu Build jih lahko agent nastavi namesto vas.", + "agentDetail.configure.skills.richTip": "Navodila, datoteke in skripte za ponavljajočo se nalogo zapakirajte v skill. Več informacij\n\nV načinu Build jih lahko agent nastavi namesto vas.", + "agentDetail.configure.skills.tip": "Navodila, datoteke in skripte za ponavljajočo se nalogo zapakirajte v skill. Več informacij\n\nV načinu Build jih lahko agent nastavi namesto vas.", "agentDetail.configure.skills.toggle": "Preklopi veščine", "agentDetail.configure.skills.upload.action": "Naloži", "agentDetail.configure.skills.upload.browse": "prebrskaj", @@ -269,8 +271,8 @@ "agentDetail.configure.tools.moreActions": "Več dejanj za {{name}}", "agentDetail.configure.tools.removeAction": "Odstrani {{name}}", "agentDetail.configure.tools.removeProvider": "Odstrani vsa orodja", - "agentDetail.configure.tools.richTip": "Dodajte orodja Dify iz svojega workspacea. Sklicujte se z / v Promptu. Več informacij\n\nOrodja, ki jih agent namesti v svoj sandbox, se tukaj ne bodo prikazala, vendar mu ostanejo na voljo.", - "agentDetail.configure.tools.tip": "Dodajte orodja Dify iz svojega workspacea. Sklicujte se z / v Promptu. Več informacij\n\nOrodja, ki jih agent namesti v svoj sandbox, se tukaj ne bodo prikazala, vendar mu ostanejo na voljo.", + "agentDetail.configure.tools.richTip": "Dodajte orodja Dify iz svojega workspacea. Več informacij\n\nOrodja, ki jih agent namesti v svoj sandbox, se tukaj ne bodo prikazala, vendar mu ostanejo na voljo.", + "agentDetail.configure.tools.tip": "Dodajte orodja Dify iz svojega workspacea. Več informacij\n\nOrodja, ki jih agent namesti v svoj sandbox, se tukaj ne bodo prikazala, vendar mu ostanejo na voljo.", "agentDetail.configure.tools.toggle": "Preklopi orodja", "agentDetail.configure.tools.toolTabs.all": "Vse", "agentDetail.configure.tools.toolTabs.cli": "CLI", @@ -336,22 +338,22 @@ "agentDetail.metadata.sourceLabel": "Vir", "agentDetail.monitoring.change": "{{value}} glede na prejšnje obdobje", "agentDetail.monitoring.dateRangeLabel": "Datumsko obdobje", - "agentDetail.monitoring.description": "Sledite aktivnosti, stroškom in kakovosti interakcije ponovno uporabnega agenta v potekih dela.", + "agentDetail.monitoring.description": "Spremljajte dejavnost tega agenta, stroške in kakovost interakcij na vseh dostopnih točkah.", "agentDetail.monitoring.learnMore": "Več informacij", "agentDetail.monitoring.loadFailed": "Podatkov spremljanja ni bilo mogoče naložiti", - "agentDetail.monitoring.metrics.activeUsers.explanation": "Edinstveni končni uporabniki, ki so sprožili poteke dela s tem agentom.", + "agentDetail.monitoring.metrics.activeUsers.explanation": "Edinstveni končni uporabniki, ki so komunicirali s tem agentom.", "agentDetail.monitoring.metrics.activeUsers.title": "Aktivni uporabniki", - "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Število neprekinjenih interakcij med uporabnikom in agentom za to dostopno točko.", + "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Povprečno število uporabniških sporočil na pogovor.", "agentDetail.monitoring.metrics.avgSessionInteractions.title": "Povp. interakcije na sejo", - "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Povprečna hitrost izhoda od začetka zahteve do dokončanja.", + "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Povprečno število žetonov, ustvarjenih na sekundo med odgovorom agenta.", "agentDetail.monitoring.metrics.tokenOutputSpeed.title": "Hitrost izhoda žetonov", - "agentDetail.monitoring.metrics.tokenUsage.explanation": "Ocenjeni strošek žetonov, ki jih ta agent proizvede pri izvajanju potekov dela.", + "agentDetail.monitoring.metrics.tokenUsage.explanation": "Porabljeni žetoni in ocenjeni stroški.", "agentDetail.monitoring.metrics.tokenUsage.title": "Poraba žetonov", "agentDetail.monitoring.metrics.totalConversations.explanation": "Dnevni AI pogovori, ki so prek izbrane dostopne točke prišli do tega agenta.", "agentDetail.monitoring.metrics.totalConversations.title": "Skupaj pogovorov", - "agentDetail.monitoring.metrics.totalMessages.explanation": "Dnevno število interakcij agenta.", + "agentDetail.monitoring.metrics.totalMessages.explanation": "Skupno število uporabniških sporočil, poslanih temu agentu.", "agentDetail.monitoring.metrics.totalMessages.title": "Skupaj sporočil", - "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "Število všečkov na 1000 sporočil za tega agenta.", + "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "Odstotek odgovorov agenta, ki so jih uporabniki označili z všečkom.", "agentDetail.monitoring.metrics.userSatisfactionRate.title": "Stopnja zadovoljstva uporabnikov", "agentDetail.monitoring.pickSource": "Izberite aplikacijo", "agentDetail.monitoring.sourceLabel": "Aplikacija", @@ -549,7 +551,5 @@ "skillManagement.searchLabel": "Search skills", "skillManagement.searchPlaceholder": "Search", "skillManagement.tags": "Tags", - "skillManagement.title": "Skills", - "agentDetail.configure.files.richTip": "Za referenčno gradivo, ki je predolgo za lepljenje v Prompt: specifikacije, predloge, smernice. Več o tem\n\nV načinu Build jih lahko agent nastavi namesto vas.", - "agentDetail.configure.prompt.richTip": "Določite vlogo agenta in način njegovega delovanja. Več o tem" + "skillManagement.title": "Skills" } diff --git a/web/i18n/sl-SI/skill.json b/web/i18n/sl-SI/skill.json index a070c47b1fc..8406a9cc568 100644 --- a/web/i18n/sl-SI/skill.json +++ b/web/i18n/sl-SI/skill.json @@ -1,121 +1,245 @@ { - "skillManagement.clearTags": "Clear tags", - "skillManagement.create": "Create", - "skillManagement.createFailed": "Failed to create skill.", - "skillManagement.createSuccess": "Skill created.", - "skillManagement.dateTimeFormat": "MMM D, YYYY HH:mm", + "skillManagement.clearTags": "Počisti oznake", + "skillManagement.create": "Ustvari", + "skillManagement.createFailed": "Ustvarjanje spretnosti ni uspelo.", + "skillManagement.createSuccess": "Osnutek ustvarjen.", + "skillManagement.dateTimeFormat": "MMM D, LLLL HH:mm", "skillManagement.deleteDialog.confirmInputLabel": "Za potrditev v spodnje polje vnesite {{skillName}}:", "skillManagement.deleteDialog.confirmInputPlaceholder": "Vnesite prikazno ime Skill-a…", - "skillManagement.deleteDialog.description": "This skill will be removed from the workspace. Agents that reference it may lose access to this capability.", - "skillManagement.deleteDialog.title": "Delete {{name}}?", - "skillManagement.deleteFailed": "Failed to delete skill.", - "skillManagement.deleteSuccess": "Skill deleted.", - "skillManagement.detail.addMetadata": "Add metadata", - "skillManagement.detail.addMetadataDescription": "Add a frontmatter field to this Markdown file.", - "skillManagement.detail.addTag": "Add tag", - "skillManagement.detail.addTagDescription": "Create or bind a tag to this Skill. New tags are saved with the Skill metadata.", - "skillManagement.detail.addTagSuccess": "Tag added.", - "skillManagement.detail.back": "Back to Skills", - "skillManagement.detail.cancelAddMetadata": "Cancel adding metadata", - "skillManagement.detail.closeFileTab": "Close {{name}}", + "skillManagement.deleteDialog.description": "Brisanje veščine je nepovratno. Njegova vsebina in celotna zgodovina različic bosta trajno izbrisani. Trenutno ga ne uporablja noben agent.", + "skillManagement.deleteDialog.referencedDescription_one": "Agent {{count}} uporablja to veščino neodvisno ali v delovnem toku. Če izbrišete to veščino, boste trajno izbrisali njeno vsebino in zgodovino različic ter jo odstranili iz prizadetega posrednika.", + "skillManagement.deleteDialog.referencedDescription_other": "Agenti {{count}} to veščino uporabljajo samostojno ali v delovnih tokovih. Če izbrišete to veščino, boste trajno izbrisali njeno vsebino in zgodovino različic ter jo odstranili iz vseh prizadetih posrednikov.", + "skillManagement.deleteDialog.title": "Izbrišem {{name}}?", + "skillManagement.deleteFailed": "Spretnosti ni bilo mogoče izbrisati.", + "skillManagement.deleteSuccess": "Skill izbrisano.", + "skillManagement.detail.addMetadata": "Dodajte metapodatke", + "skillManagement.detail.addMetadataDescription": "V to datoteko Markdown dodajte polje frontmatter.", + "skillManagement.detail.addTag": "Dodaj oznako", + "skillManagement.detail.addTagDescription": "Ustvarite ali povežite oznako s tem Skill. Nove oznake so shranjene z metapodatki Skill.", + "skillManagement.detail.addTagSuccess": "Dodana oznaka.", + "skillManagement.detail.back": "Nazaj na Skills", + "skillManagement.detail.builder.applyFailed": "Uveljavitev osnutkov posodobitev ni uspela.", + "skillManagement.detail.builder.attach": "Pripni datoteko", + "skillManagement.detail.builder.attachFailed": "Datoteke ni bilo mogoče priložiti.", + "skillManagement.detail.builder.attachLimit": "Priložite lahko do 10 datotek.", + "skillManagement.detail.builder.attachTooLarge": "Datoteke morajo biti velike 15 MB ali manj. Slike morajo biti velike 10 MB ali manj.", + "skillManagement.detail.builder.attachUnsupported": "Priložite lahko samo slike, besedilo in dokumente.", + "skillManagement.detail.builder.attachmentOnlyMessage": "Uporabite priloženo datoteko, da izboljšate to veščino.", + "skillManagement.detail.builder.close": "Zapri Skill Builder", + "skillManagement.detail.builder.compatibleModelsOnly": "Prikazani so samo združljivi modeli", + "skillManagement.detail.builder.copyResponse": "Kopiraj odgovor", + "skillManagement.detail.builder.copySuccess": "Odgovor je kopiran v odložišče.", + "skillManagement.detail.builder.editIntro": "Pregledal sem to veščino. Kaj bi radi prilagodili?", + "skillManagement.detail.builder.exampleIssueTriage": "Triaža strankinih težav", + "skillManagement.detail.builder.exampleOnboarding": "Priročnik za novo zaposlitev", + "skillManagement.detail.builder.exampleSalesFollowUp": "Strategija spremljanja vodstva prodaje", + "skillManagement.detail.builder.followUpDisplayName": "Kot prikazno ime uporabite odobritev vračila", + "skillManagement.detail.builder.followUpNameIcon": "Uporabite predlagano ime in ikono", + "skillManagement.detail.builder.fromMarketplace": "Iz Tržnice", + "skillManagement.detail.builder.model": "GPT-4o", + "skillManagement.detail.builder.modelCredits.all": "Vsi krediti", + "skillManagement.detail.builder.modelCredits.configure": "Konfiguracija je obvezna", + "skillManagement.detail.builder.modelCredits.exhausted": "Kvote porabljene", + "skillManagement.detail.builder.modelProviderSettings": "Nastavitve ponudnika modelov", + "skillManagement.detail.builder.modelSearch": "Išči modele...", + "skillManagement.detail.builder.modifyPlaceholder": "Prosite AI, da spremeni to veščino ...", + "skillManagement.detail.builder.open": "Odprite Skill Builder", + "skillManagement.detail.builder.placeholder": "Opišite scenarij ...", + "skillManagement.detail.builder.progress.applyingChanges": "Uveljavljanje sprememb datoteke", + "skillManagement.detail.builder.progress.generatingPlan": "Ustvarjanje načrta posodobitve", + "skillManagement.detail.builder.progress.readingDraft": "Branje trenutnega osnutka", + "skillManagement.detail.builder.progress.updatingEditor": "Posodabljanje urejevalnika", + "skillManagement.detail.builder.promptDescription": "Opišite ga in osnutek se bo prikazal v urejevalniku, vključno s koraki in datotekami.", + "skillManagement.detail.builder.promptTitle": "Kaj bi morala ta veščina obravnavati?", + "skillManagement.detail.builder.readAloud": "Preberi odgovor na glas", + "skillManagement.detail.builder.removeAttachment": "Odstrani {{name}}", + "skillManagement.detail.builder.restart": "Znova zaženi graditelj", + "skillManagement.detail.builder.retryResponse": "Poskusite znova odgovoriti", + "skillManagement.detail.builder.send": "Pošlji sporočilo", + "skillManagement.detail.builder.sendFailed": "Skill Builder se ni odzval.", + "skillManagement.detail.builder.thinking": "Razmišlja", + "skillManagement.detail.builder.thinkingUnavailable": "Model ni vrnil nobene vsebine razmišljanja.", + "skillManagement.detail.builder.title": "Skill Builder", + "skillManagement.detail.builder.tryExample": "Poskusite s primerom", + "skillManagement.detail.builder.voice": "Glasovni vnos", + "skillManagement.detail.builder.voiceUnavailable": "Glasovni vnos še ni na voljo.", + "skillManagement.detail.cancelAddMetadata": "Prekliči dodajanje metapodatkov", + "skillManagement.detail.closeFileTab": "Zapri {{name}}", + "skillManagement.detail.closeVersions": "Zaprte različice", "skillManagement.detail.collapseSidebar": "Strni stransko vrstico", - "skillManagement.detail.createFile": "New file", - "skillManagement.detail.createFileDescription": "Enter a file path relative to the skill root.", - "skillManagement.detail.createFileMenu": "New file...", - "skillManagement.detail.createFileSuccess": "File created.", - "skillManagement.detail.createFolder": "New folder", - "skillManagement.detail.createFolderDescription": "Enter a folder path relative to the skill root.", - "skillManagement.detail.createFolderMenu": "New folder...", - "skillManagement.detail.createFolderSuccess": "Folder created.", - "skillManagement.detail.createdBy": "Created by {{name}}", - "skillManagement.detail.currentDraft": "Current draft", - "skillManagement.detail.deleteFileConfirm": "Delete this file?", - "skillManagement.detail.deleteFileSuccess": "File deleted.", - "skillManagement.detail.deleteVersionConfirm": "Delete this version?", - "skillManagement.detail.deleteVersionFailed": "Failed to delete version.", - "skillManagement.detail.deleteVersionSuccess": "Version deleted.", - "skillManagement.detail.downloadFile": "Download file", - "skillManagement.detail.draft": "Draft", + "skillManagement.detail.copyContentSuccess": "Vsebina kopirana v odložišče.", + "skillManagement.detail.copyFile": "Kopiraj", + "skillManagement.detail.copyFileSuccess": "Datoteka pripravljena za lepljenje.", + "skillManagement.detail.copyVersionId": "Kopiraj ID", + "skillManagement.detail.copyVersionIdSuccess": "ID kopiran v odložišče.", + "skillManagement.detail.createFile": "Nova datoteka", + "skillManagement.detail.createFileDescription": "Vnesite pot datoteke glede na koren spretnosti.", + "skillManagement.detail.createFileMenu": "Nova datoteka ...", + "skillManagement.detail.createFileSuccess": "Datoteka ustvarjena.", + "skillManagement.detail.createFolder": "Nova mapa", + "skillManagement.detail.createFolderDescription": "Vnesite pot do mape glede na koren spretnosti.", + "skillManagement.detail.createFolderMenu": "Nova mapa ...", + "skillManagement.detail.createFolderSuccess": "Mapa ustvarjena.", + "skillManagement.detail.createdBy": "Ustvaril {{name}}", + "skillManagement.detail.currentDraft": "Trenutni osnutek", + "skillManagement.detail.cutFile": "Cut", + "skillManagement.detail.cutFileSuccess": "Datoteka pripravljena za premikanje.", + "skillManagement.detail.deleteFileConfirm": "Želite izbrisati to datoteko?", + "skillManagement.detail.deleteFileSuccess": "Datoteka izbrisana.", + "skillManagement.detail.deleteVersionConfirm": "Želite izbrisati to različico?", + "skillManagement.detail.deleteVersionFailed": "Brisanje različice ni uspelo.", + "skillManagement.detail.deleteVersionSuccess": "Različica izbrisana.", + "skillManagement.detail.downloadFile": "Prenesi datoteko", + "skillManagement.detail.draft": "Osnutek", + "skillManagement.detail.editVersionInfo": "Uredi informacije o različici", + "skillManagement.detail.exitVersions": "Zapusti različice", "skillManagement.detail.expandSidebar": "Razširi stransko vrstico", - "skillManagement.detail.fileCount": "{{count}} FILES", - "skillManagement.detail.fileMeta": "{{type}} · {{size}} bytes", - "skillManagement.detail.fileMissing": "File not found.", - "skillManagement.detail.fileOperationFailed": "File operation failed.", - "skillManagement.detail.files": "Files", - "skillManagement.detail.latest": "Latest", - "skillManagement.detail.loadFailed": "Failed to load skill.", - "skillManagement.detail.markdownLiveMode": "Live preview", - "skillManagement.detail.markdownSourceMode": "Source editor", - "skillManagement.detail.metadataKey": "name", - "skillManagement.detail.metadataValue": "value", - "skillManagement.detail.moveFileSuccess": "File moved.", - "skillManagement.detail.moveFilesSuccess": "Files moved.", - "skillManagement.detail.noFileSelected": "Select a file to preview.", - "skillManagement.detail.noFiles": "No files.", + "skillManagement.detail.fileAlreadyExists": "Datoteka ali mapa s tem imenom že obstaja.", + "skillManagement.detail.fileCount_one": "Datoteka {{count}}", + "skillManagement.detail.fileCount_other": "datoteke {{count}}", + "skillManagement.detail.fileMeta": "{{type}} · {{size}} bajtov", + "skillManagement.detail.fileMissing": "Datoteke ni mogoče najti.", + "skillManagement.detail.fileOperationFailed": "Operacija datoteke ni uspela.", + "skillManagement.detail.files": "Datoteke", + "skillManagement.detail.latest": "Najnovejši", + "skillManagement.detail.loadFailed": "Spretnosti ni bilo mogoče naložiti.", + "skillManagement.detail.loadingTags": "Nalaganje oznak ...", + "skillManagement.detail.markdownLiveMode": "Predogled v živo", + "skillManagement.detail.markdownSourceMode": "Urejevalnik vira", + "skillManagement.detail.metadataKey": "ime", + "skillManagement.detail.metadataValue": "vrednost", + "skillManagement.detail.moveFileSuccess": "Datoteka premaknjena.", + "skillManagement.detail.moveFilesSuccess": "Datoteke premaknjene.", + "skillManagement.detail.nameThisVersion": "Poimenujte to različico", + "skillManagement.detail.noFileSelected": "Izberite datoteko za predogled.", + "skillManagement.detail.noFiles": "Ni datotek.", "skillManagement.detail.noSearchResults": "Ni ujemajočih se datotek.", - "skillManagement.detail.noVersions": "No published versions yet.", - "skillManagement.detail.previewUnsupported": "Preview is not supported for this file.", - "skillManagement.detail.publish": "Publish", - "skillManagement.detail.publishFailed": "Failed to publish skill.", - "skillManagement.detail.publishSuccess": "Skill published.", - "skillManagement.detail.published": "Published", + "skillManagement.detail.noSelectableTags": "Ni razpoložljivih oznak.", + "skillManagement.detail.noVersions": "Ni še objavljenih različic.", + "skillManagement.detail.pasteFile": "Prilepi", + "skillManagement.detail.pasteFileSuccess": "Datoteka prilepljena.", + "skillManagement.detail.previewUnsupported": "Ta datoteka ne podpira predogleda.", + "skillManagement.detail.publish": "Objavi", + "skillManagement.detail.publishFailed": "Objava spretnosti ni uspela.", + "skillManagement.detail.publishReferencesDescription_one": "Objava začne veljati takoj za agenta {{count}}, ki uporablja to veščino.", + "skillManagement.detail.publishReferencesDescription_other": "Objava začne veljati takoj za agente {{count}}, ki uporabljajo to veščino.", + "skillManagement.detail.publishReferencesTitle": "Veščina objave", + "skillManagement.detail.publishSuccess": "Skill objavljeno.", + "skillManagement.detail.publishUpdate": "Objavi posodobitev", + "skillManagement.detail.published": "Objavljeno", "skillManagement.detail.publishedAt": "Objavljeno {{time}}", + "skillManagement.detail.publishedVersion": "Objavljeno #{{number}}", "skillManagement.detail.publishing": "Objavljanje...", - "skillManagement.detail.readonly": "Read only", - "skillManagement.detail.referenceFiles.confirm": "Enter Confirm", - "skillManagement.detail.referenceFiles.empty": "No files available.", - "skillManagement.detail.referenceFiles.livePlaceholder": "Write instructions for the agent, type / to reference files", - "skillManagement.detail.referenceFiles.navigate": "↑↓ Navigate", - "skillManagement.detail.referenceFiles.title": "Reference files", - "skillManagement.detail.referencedBy": "Referenced by {{count}} Apps", - "skillManagement.detail.removeMetadata": "Delete {{name}} metadata", - "skillManagement.detail.removeTag": "Remove {{tag}}", - "skillManagement.detail.removeTagSuccess": "Tag removed.", - "skillManagement.detail.renameFile": "Rename file", - "skillManagement.detail.renameFileDescription": "Enter the new path relative to the skill root.", - "skillManagement.detail.renameFileSuccess": "File renamed.", - "skillManagement.detail.renameSkillSuccess": "Skill renamed.", - "skillManagement.detail.renameVersion": "Rename", - "skillManagement.detail.renameVersionFailed": "Failed to rename version.", - "skillManagement.detail.renameVersionPrompt": "Version name", - "skillManagement.detail.renameVersionSuccess": "Version renamed.", - "skillManagement.detail.restoreVersion": "Restore", - "skillManagement.detail.restoreVersionFailed": "Failed to restore version.", - "skillManagement.detail.restoreVersionSuccess": "Version restored to draft.", - "skillManagement.detail.save": "Save", - "skillManagement.detail.saveFailed": "Failed to save file.", - "skillManagement.detail.saveSuccess": "File saved.", - "skillManagement.detail.saved": "Saved", - "skillManagement.detail.savedAt": "Saved {{time}}", - "skillManagement.detail.saving": "Saving...", + "skillManagement.detail.readonly": "Samo za branje", + "skillManagement.detail.referenceFiles.confirm": "Vnesite Potrdi", + "skillManagement.detail.referenceFiles.empty": "Ni datotek na voljo.", + "skillManagement.detail.referenceFiles.livePlaceholder": "Napišite navodila za agenta. Vnesite / za referenčne datoteke.", + "skillManagement.detail.referenceFiles.navigate": "↑↓ Navigacija", + "skillManagement.detail.referenceFiles.title": "Referenčne datoteke", + "skillManagement.detail.referencedBy_one": "Uporablja ga {{count}} agent", + "skillManagement.detail.referencedBy_other": "Uporablja ga {{count}} agentov", + "skillManagement.detail.removeMetadata": "Izbriši metapodatke {{name}}", + "skillManagement.detail.removeTag": "Odstrani {{tag}}", + "skillManagement.detail.removeTagSuccess": "Oznaka odstranjena.", + "skillManagement.detail.renameFile": "Preimenuj datoteko", + "skillManagement.detail.renameFileDescription": "Vnesite novo pot glede na koren spretnosti.", + "skillManagement.detail.renameFileSuccess": "Datoteka preimenovana.", + "skillManagement.detail.renameSkillSuccess": "Skill preimenovan.", + "skillManagement.detail.renameVersion": "Preimenuj", + "skillManagement.detail.renameVersionFailed": "Preimenovanje različice ni uspelo.", + "skillManagement.detail.renameVersionPrompt": "Ime različice", + "skillManagement.detail.renameVersionSuccess": "Različica preimenovana.", + "skillManagement.detail.resizeSidebar": "Spremenite velikost stranske vrstice datoteke", + "skillManagement.detail.restoreVersion": "Obnovi", + "skillManagement.detail.restoreVersionConfirmDescription": "To bo zamenjalo trenutni osnutek z datotekami iz »{{version}}«. Ne bo objavil Skill ali ustvaril nove različice.", + "skillManagement.detail.restoreVersionConfirmTitle": "Obnoviti to različico?", + "skillManagement.detail.restoreVersionFailed": "Različice ni bilo mogoče obnoviti.", + "skillManagement.detail.restoreVersionSuccess": "Različica obnovljena v osnutek.", + "skillManagement.detail.save": "Shrani", + "skillManagement.detail.saveConflictConfirmDescription": "Ta veščina je bila posodobljena drugje. Za nadaljevanje urejanja naložite najnovejši osnutek. Vaše trenutne spremembe bodo zavržene.", + "skillManagement.detail.saveConflictConfirmTitle": "Naj naložim najnovejši osnutek?", + "skillManagement.detail.saveConflictReload": "Naloži najnovejši osnutek", + "skillManagement.detail.saveConflictStatus": "Zaznan spor. Za nadaljevanje urejanja naložite najnovejši osnutek.", + "skillManagement.detail.saveFailed": "Datoteke ni bilo mogoče shraniti.", + "skillManagement.detail.saveSuccess": "Datoteka shranjena.", + "skillManagement.detail.saved": "Shranjeno", + "skillManagement.detail.savedAt": "Shranjeno {{time}}", + "skillManagement.detail.saving": "Shranjevanje...", "skillManagement.detail.searchFiles": "Išči datoteke", + "skillManagement.detail.showMoreReferences": "Pokaži {{count}} več", + "skillManagement.detail.skillDescriptionPlaceholder": "Opišite, kaj počne ta veščina in kdaj naj jo agenti uporabijo.", + "skillManagement.detail.skillNamePlaceholder": "Uporabljajte male črke, številke in vezaje.", "skillManagement.detail.unpublishedChanges": "Neobjavljene spremembe", - "skillManagement.detail.unsavedChanges": "Unsaved changes", + "skillManagement.detail.unsavedChanges": "Neshranjene spremembe", "skillManagement.detail.upToDate": "Posodobljeno", - "skillManagement.detail.updateTagsFailed": "Failed to update tags.", - "skillManagement.detail.uploadFile": "Upload file", - "skillManagement.detail.uploadFileFailed": "File upload failed.", - "skillManagement.detail.uploadFileSuccess": "File uploaded.", - "skillManagement.detail.uploadFilesMenu": "Upload files...", + "skillManagement.detail.updateTagsFailed": "Oznak ni bilo mogoče posodobiti.", + "skillManagement.detail.uploadCheckFailed": "Teh datotek ni bilo mogoče preveriti. poskusi ponovno", + "skillManagement.detail.uploadConflict": "Datoteka s tem imenom že obstaja.", + "skillManagement.detail.uploadFailureSummary": "{{failed}} od datotek {{total}} ni uspelo", + "skillManagement.detail.uploadFailureTitle": "Nekateri prenosi niso uspeli", + "skillManagement.detail.uploadFile": "Naloži datoteko", + "skillManagement.detail.uploadFileFailed": "Nalaganje datoteke ni uspelo.", + "skillManagement.detail.uploadFileSuccess": "Datoteka naložena.", + "skillManagement.detail.uploadFilesButton": "Naložite datoteke {{count}}", + "skillManagement.detail.uploadFilesFailedStatus_one": "Nalaganje datoteke {{count}} ni uspelo.", + "skillManagement.detail.uploadFilesFailedStatus_other": "Nalaganje datotek {{count}} ni uspelo.", + "skillManagement.detail.uploadFilesMenu": "Naloži datoteke ...", + "skillManagement.detail.uploadFilesProgress": "Nalaganje {{completed}}/{{total}}", + "skillManagement.detail.uploadFilesResult": "{{uploaded}} naloženo · {{failed}} ni uspelo", + "skillManagement.detail.uploadFilesStatus": "Stanje nalaganja", + "skillManagement.detail.uploadInvalidExtension": "Ta vrsta datoteke ni podprta.", + "skillManagement.detail.uploadInvalidName": "Neveljavno ime.", + "skillManagement.detail.uploadInvalidPath": "Neveljavna pot datoteke.", + "skillManagement.detail.uploadKeepBoth": "Obdrži oboje", + "skillManagement.detail.uploadLateConflict": "Med vašim nalaganjem je nekdo dodal to datoteko.", + "skillManagement.detail.uploadMissingExtension": "Potrebna je pripona datoteke.", + "skillManagement.detail.uploadNetworkFailure": "Nalaganje ni uspelo. Preverite povezavo.", + "skillManagement.detail.uploadReadySummary": "{{ready}} pripravljen · {{decisions}} potrebuje odločitev · {{skipped}} bo preskočen", + "skillManagement.detail.uploadReplace": "Zamenjaj", + "skillManagement.detail.uploadResolvedSummary": "{{ready}} pripravljen · {{skipped}} bo preskočen", + "skillManagement.detail.uploadRetryCount": "Poskusi znova {{count}}", + "skillManagement.detail.uploadReviewTitle": "Preglejte pred nalaganjem", + "skillManagement.detail.uploadSkip": "Ladja", + "skillManagement.detail.uploadSkippedGroup": "Datotek {{count}} ni mogoče naložiti in bodo preskočene", + "skillManagement.detail.uploadStatusDismiss": "Opusti stanje nalaganja", + "skillManagement.detail.uploadSuggestion": "Uporabite predlog", + "skillManagement.detail.uploadWillReplace": "Zamenjal bo obstoječo datoteko", + "skillManagement.detail.uploadWillUseName": "Naložen bo kot {{name}}", + "skillManagement.detail.versionHistory": "Odpri zgodovino različic", "skillManagement.detail.versionMeta": "{{hash}} · {{time}}", - "skillManagement.detail.versions": "Versions", - "skillManagement.draft": "Draft", - "skillManagement.duplicateFailed": "Failed to duplicate skill.", - "skillManagement.duplicateSuccess": "Skill duplicated.", - "skillManagement.editedAt": "Edited {{time}}", - "skillManagement.empty": "No skills yet", - "skillManagement.emptySearch": "No skills found", - "skillManagement.import": "Import", - "skillManagement.importFailed": "Failed to import skill.", - "skillManagement.importSuccess": "Skill imported.", - "skillManagement.listLabel": "Workspace skills", - "skillManagement.loadingError": "Failed to load skills", - "skillManagement.moreActions": "More actions for {{name}}", - "skillManagement.noTags": "No tags", - "skillManagement.publishedAt": "Published {{time}}", - "skillManagement.referenceCount": "{{count}} Refs", - "skillManagement.searchLabel": "Search skills", - "skillManagement.searchPlaceholder": "Search", - "skillManagement.tags": "Tags", - "skillManagement.title": "Skills" + "skillManagement.detail.versionPublishNote": "Opombe ob izdaji", + "skillManagement.detail.versionPublishNotePlaceholder": "Opišite to spremembo", + "skillManagement.detail.versionPublishedMeta": "{{time}} · {{name}}", + "skillManagement.detail.versionTitle": "Naslov", + "skillManagement.detail.versions": "Različice", + "skillManagement.detail.viewOnly": "Samo ogled", + "skillManagement.detail.viewUploadErrors": "Ogled napak", + "skillManagement.draft": "Osnutek", + "skillManagement.duplicateFailed": "Podvajanje spretnosti ni uspelo.", + "skillManagement.duplicateSuccess": "Skill podvojeno.", + "skillManagement.editedAt": "Urejeno {{time}}", + "skillManagement.empty": "Še ni veščin", + "skillManagement.emptyAction.createDescription": "Opišite scenarij z preprostimi besedami in pridobite osnutek spretnosti za pregled.", + "skillManagement.emptyAction.createTitle": "Ustvarjajte z Skill Builder", + "skillManagement.emptyAction.importDescription": "Prinesite .zip z SKILL.md v formatu agentskills.io.", + "skillManagement.emptyAction.importTitle": "Uvozite paket spretnosti", + "skillManagement.emptySearch": "Ni veščin", + "skillManagement.errors.missingSkillMd": "Ta paket nima SKILL.md. Dodajte datoteko in jo znova uvozite.", + "skillManagement.errors.nameConflict": "Spretnost z imenom \"{{name}}\" že obstaja. Preimenujte ga v SKILL.md in znova uvozite.", + "skillManagement.errors.workspaceLimit": "Vaš delovni prostor je dosegel omejitev 500 veščin. Izbrišite veščino, da dodate novo.", + "skillManagement.import": "Uvozi", + "skillManagement.importFailed": "Spretnosti ni bilo mogoče uvoziti.", + "skillManagement.importSuccess": "Skill uvoženo.", + "skillManagement.listLabel": "Spretnosti delovnega prostora", + "skillManagement.loadingError": "Spretnosti ni bilo mogoče naložiti", + "skillManagement.moreActions": "Več dejanj za {{name}}", + "skillManagement.noDescription": "Ni še opisa", + "skillManagement.noTags": "Brez oznak", + "skillManagement.publishedAt": "Objavljeno {{time}}", + "skillManagement.referenceCount_one": "{{count}} agent", + "skillManagement.referenceCount_other": "{{count}} agentov", + "skillManagement.searchLabel": "Poišči veščine", + "skillManagement.searchPlaceholder": "Iskanje po imenu ali opisu", + "skillManagement.tags": "Oznake", + "skillManagement.title": "Veščine" } diff --git a/web/i18n/th-TH/agent-v-2.json b/web/i18n/th-TH/agent-v-2.json index 5c1eb1a101b..bfc04c9a8e3 100644 --- a/web/i18n/th-TH/agent-v-2.json +++ b/web/i18n/th-TH/agent-v-2.json @@ -83,7 +83,7 @@ "agentDetail.configure.buildDraft.changesToApply_other": "{{count}} การเปลี่ยนแปลงที่ต้องนำไปใช้", "agentDetail.configure.buildDraft.discard": "ทิ้ง", "agentDetail.configure.buildDraft.modeBadge": "โหมด Build", - "agentDetail.configure.buildDraft.modeDescription": "คุณอยู่ในโหมด Build ในโหมดนี้ Configure จะอัปเดตได้โดยเอเจนต์เท่านั้น ปรับแต่งการตั้งค่านี้ผ่านแชททางขวา แล้วกดนำไปใช้", + "agentDetail.configure.buildDraft.modeDescription": "คุณอยู่ในโหมด Build ปรับแต่งการตั้งค่านี้ด้วยการแชทกับเอเจนต์ แล้วกดนำไปใช้", "agentDetail.configure.buildDraft.rewritten": "เขียนใหม่แล้ว", "agentDetail.configure.buildDraft.title": "ฉบับร่าง Build", "agentDetail.configure.buildDraft.updated": "อัปเดตแล้ว", @@ -105,7 +105,8 @@ "agentDetail.configure.files.preview.failed": "โหลดตัวอย่างไม่สำเร็จ", "agentDetail.configure.files.preview.unsupported": "ไฟล์นี้ไม่รองรับการแสดงตัวอย่าง", "agentDetail.configure.files.remove": "ลบ {{name}}", - "agentDetail.configure.files.tip": "สำหรับเอกสารอ้างอิงที่ยาวเกินกว่าจะวางใน Prompt: สเปก เทมเพลต แนวทาง อ้างอิงด้วย / ใน Prompt\n\nในโหมด Build agent สามารถตั้งค่าสิ่งเหล่านี้ให้คุณได้", + "agentDetail.configure.files.richTip": "สำหรับเอกสารอ้างอิงที่ยาวเกินกว่าจะวางใน Prompt: สเปก เทมเพลต แนวทาง ดูข้อมูลเพิ่มเติม\n\nในโหมด Build agent สามารถตั้งค่าสิ่งเหล่านี้ให้คุณได้", + "agentDetail.configure.files.tip": "สำหรับเอกสารอ้างอิงที่ยาวเกินกว่าจะวางใน Prompt: สเปก เทมเพลต แนวทาง ดูข้อมูลเพิ่มเติม\n\nในโหมด Build agent สามารถตั้งค่าสิ่งเหล่านี้ให้คุณได้", "agentDetail.configure.files.toggle": "สลับไฟล์", "agentDetail.configure.files.treeLabel": "ไฟล์ตัวแทน", "agentDetail.configure.files.upload.action": "อัปโหลด", @@ -114,7 +115,7 @@ "agentDetail.configure.files.upload.dropzone": "วางไฟล์ที่นี่ หรือ", "agentDetail.configure.files.upload.failed": "อัปโหลดไฟล์ไม่สำเร็จ", "agentDetail.configure.files.upload.fileType": "FILE", - "agentDetail.configure.files.upload.invalidFile": "อัปโหลดไฟล์เดียว", + "agentDetail.configure.files.upload.invalidFile": "อัปโหลดได้ครั้งละหนึ่งไฟล์เท่านั้น", "agentDetail.configure.files.upload.success": "อัปโหลดไฟล์แล้ว", "agentDetail.configure.files.upload.title": "อัปโหลดไฟล์", "agentDetail.configure.knowledgeRetrieval.add": "เพิ่มการดึงความรู้", @@ -177,7 +178,8 @@ "agentDetail.configure.prompt.mention.priyaRamanathan": "Priya Ramanathan", "agentDetail.configure.prompt.placeholder": "เขียนคำสั่งที่นี่,", "agentDetail.configure.prompt.referenceMissing": "{{name}} ไม่มีอยู่", - "agentDetail.configure.prompt.tip": "กำหนดบทบาทของตัวแทนและอธิบายงานทั่วไป ใช้ / เพื่ออ้างอิง Skills, Files, Tools และ Knowledge Retrievals อย่างชัดเจน", + "agentDetail.configure.prompt.richTip": "กำหนดบทบาทของเอเจนต์และวิธีการทำงาน ดูข้อมูลเพิ่มเติม", + "agentDetail.configure.prompt.tip": "กำหนดบทบาทของเอเจนต์และวิธีการทำงาน ดูข้อมูลเพิ่มเติม", "agentDetail.configure.publishBar.draft": "ฉบับร่าง", "agentDetail.configure.publishBar.publishUpdate": "เผยแพร่อัปเดต", "agentDetail.configure.publishBar.published": "เผยแพร่แล้ว", @@ -190,8 +192,8 @@ "agentDetail.configure.publishBar.versionHistory": "เปิดประวัติเวอร์ชัน", "agentDetail.configure.publishImpact.affectedWorkflows": "เวิร์กโฟลว์ที่ได้รับผลกระทบ", "agentDetail.configure.publishImpact.cancel": "ยกเลิก", - "agentDetail.configure.publishImpact.descriptionPrefix": "ตัวแทนของคุณปรากฏอยู่ใน", - "agentDetail.configure.publishImpact.descriptionSuffix": " การเปลี่ยนแปลงจะส่งผลกระทบต่อสิ่งเหล่านั้น", + "agentDetail.configure.publishImpact.descriptionPrefix": "เอเจนต์นี้ถูกใช้ใน", + "agentDetail.configure.publishImpact.descriptionSuffix": " เมื่อเผยแพร่แล้ว เอเจนต์นี้จะอัปเดตในเวิร์กโฟลว์ทั้งหมด", "agentDetail.configure.publishImpact.fallbackAgentName": "ตัวแทนนี้", "agentDetail.configure.publishImpact.title": "{{action}}ไปยัง {{name}}", "agentDetail.configure.publishImpact.workflowCount_one": "เวิร์กโฟลว์ {{count}} รายการ", @@ -222,8 +224,8 @@ "agentDetail.configure.skills.openInLibrary": "Open in Skill library", "agentDetail.configure.skills.remove": "ลบ {{name}}", "agentDetail.configure.skills.removeAction": "Remove", - "agentDetail.configure.skills.richTip": "แพ็กเกจคำสั่ง ไฟล์ และสคริปต์สำหรับงานที่ทำซ้ำเป็น Skill อ้างอิงด้วย / ใน Prompt เรียนรู้เพิ่มเติม\n\nในโหมด Build agent สามารถตั้งค่าสิ่งเหล่านี้ให้คุณได้", - "agentDetail.configure.skills.tip": "แพ็กเกจคำสั่ง ไฟล์ และสคริปต์สำหรับงานที่ทำซ้ำเป็น Skill อ้างอิงด้วย / ใน Prompt เรียนรู้เพิ่มเติม\n\nในโหมด Build agent สามารถตั้งค่าสิ่งเหล่านี้ให้คุณได้", + "agentDetail.configure.skills.richTip": "แพ็กเกจคำสั่ง ไฟล์ และสคริปต์สำหรับงานที่ทำซ้ำเป็น Skill เรียนรู้เพิ่มเติม\n\nในโหมด Build agent สามารถตั้งค่าสิ่งเหล่านี้ให้คุณได้", + "agentDetail.configure.skills.tip": "แพ็กเกจคำสั่ง ไฟล์ และสคริปต์สำหรับงานที่ทำซ้ำเป็น Skill เรียนรู้เพิ่มเติม\n\nในโหมด Build agent สามารถตั้งค่าสิ่งเหล่านี้ให้คุณได้", "agentDetail.configure.skills.toggle": "สลับทักษะ", "agentDetail.configure.skills.upload.action": "อัปโหลด", "agentDetail.configure.skills.upload.browse": "เรียกดู", @@ -269,8 +271,8 @@ "agentDetail.configure.tools.moreActions": "การกระทำเพิ่มเติมสำหรับ {{name}}", "agentDetail.configure.tools.removeAction": "ลบ {{name}}", "agentDetail.configure.tools.removeProvider": "ลบเครื่องมือทั้งหมด", - "agentDetail.configure.tools.richTip": "เพิ่มเครื่องมือ Dify จาก workspace ของคุณ อ้างอิงด้วย / ใน Prompt เรียนรู้เพิ่มเติม\n\nเครื่องมือที่ agent ติดตั้งใน sandbox จะไม่แสดงที่นี่ แต่ยังคงพร้อมใช้งานสำหรับ agent", - "agentDetail.configure.tools.tip": "เพิ่มเครื่องมือ Dify จาก workspace ของคุณ อ้างอิงด้วย / ใน Prompt เรียนรู้เพิ่มเติม\n\nเครื่องมือที่ agent ติดตั้งใน sandbox จะไม่แสดงที่นี่ แต่ยังคงพร้อมใช้งานสำหรับ agent", + "agentDetail.configure.tools.richTip": "เพิ่มเครื่องมือ Dify จาก workspace ของคุณ เรียนรู้เพิ่มเติม\n\nเครื่องมือที่ agent ติดตั้งใน sandbox จะไม่แสดงที่นี่ แต่ยังคงพร้อมใช้งานสำหรับ agent", + "agentDetail.configure.tools.tip": "เพิ่มเครื่องมือ Dify จาก workspace ของคุณ เรียนรู้เพิ่มเติม\n\nเครื่องมือที่ agent ติดตั้งใน sandbox จะไม่แสดงที่นี่ แต่ยังคงพร้อมใช้งานสำหรับ agent", "agentDetail.configure.tools.toggle": "สลับเครื่องมือ", "agentDetail.configure.tools.toolTabs.all": "ทั้งหมด", "agentDetail.configure.tools.toolTabs.cli": "CLI", @@ -336,22 +338,22 @@ "agentDetail.metadata.sourceLabel": "แหล่งที่มา", "agentDetail.monitoring.change": "{{value}} จากช่วงก่อนหน้า", "agentDetail.monitoring.dateRangeLabel": "ช่วงวันที่", - "agentDetail.monitoring.description": "ติดตามกิจกรรม ค่าใช้จ่าย และคุณภาพการโต้ตอบของตัวแทนที่นำกลับมาใช้ใหม่ในเวิร์กโฟลว์ต่าง ๆ", + "agentDetail.monitoring.description": "ติดตามกิจกรรม ค่าใช้จ่าย และคุณภาพการโต้ตอบของตัวแทนนี้ผ่านจุดเข้าถึงทั้งหมด", "agentDetail.monitoring.learnMore": "เรียนรู้เพิ่มเติม", "agentDetail.monitoring.loadFailed": "โหลดข้อมูลการมอนิเตอร์ไม่สำเร็จ", - "agentDetail.monitoring.metrics.activeUsers.explanation": "ผู้ใช้ปลายทางที่ไม่ซ้ำกันซึ่งทริกเกอร์เวิร์กโฟลว์โดยใช้ตัวแทนนี้", + "agentDetail.monitoring.metrics.activeUsers.explanation": "จำนวนผู้ใช้ปลายทางที่ไม่ซ้ำกันซึ่งโต้ตอบกับตัวแทนนี้", "agentDetail.monitoring.metrics.activeUsers.title": "ผู้ใช้ที่ใช้งานอยู่", - "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "จำนวนการสื่อสารต่อเนื่องระหว่างผู้ใช้กับตัวแทนสำหรับจุดเข้าถึงนี้", + "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "จำนวนข้อความของผู้ใช้โดยเฉลี่ยต่อการสนทนา", "agentDetail.monitoring.metrics.avgSessionInteractions.title": "การโต้ตอบต่อเซสชันเฉลี่ย", - "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "ความเร็วเอาต์พุตเฉลี่ยตั้งแต่เริ่มต้นคำขอจนถึงเสร็จสิ้น", + "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "จำนวนโทเค็นเฉลี่ยที่สร้างขึ้นต่อวินาทีระหว่างการตอบกลับของตัวแทน", "agentDetail.monitoring.metrics.tokenOutputSpeed.title": "ความเร็วเอาต์พุตโทเค็น", - "agentDetail.monitoring.metrics.tokenUsage.explanation": "ค่าใช้จ่ายโทเค็นโดยประมาณที่สร้างโดยตัวแทนนี้ในการรันเวิร์กโฟลว์", + "agentDetail.monitoring.metrics.tokenUsage.explanation": "จำนวนโทเค็นที่ใช้และค่าใช้จ่ายโดยประมาณ", "agentDetail.monitoring.metrics.tokenUsage.title": "การใช้โทเค็น", "agentDetail.monitoring.metrics.totalConversations.explanation": "บทสนทนา AI รายวันที่ไปถึงตัวแทนนี้ผ่านจุดเข้าถึงที่เลือก", "agentDetail.monitoring.metrics.totalConversations.title": "บทสนทนาทั้งหมด", - "agentDetail.monitoring.metrics.totalMessages.explanation": "จำนวนการโต้ตอบของตัวแทนรายวัน", + "agentDetail.monitoring.metrics.totalMessages.explanation": "จำนวนข้อความทั้งหมดที่ผู้ใช้ส่งถึงตัวแทนนี้", "agentDetail.monitoring.metrics.totalMessages.title": "ข้อความทั้งหมด", - "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "จำนวนไลก์ต่อ 1,000 ข้อความสำหรับตัวแทนนี้", + "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "เปอร์เซ็นต์ของคำตอบจากตัวแทนที่ผู้ใช้กดถูกใจ", "agentDetail.monitoring.metrics.userSatisfactionRate.title": "อัตราความพึงพอใจของผู้ใช้", "agentDetail.monitoring.pickSource": "เลือกแอป", "agentDetail.monitoring.sourceLabel": "แอป", @@ -549,7 +551,5 @@ "skillManagement.searchLabel": "Search skills", "skillManagement.searchPlaceholder": "Search", "skillManagement.tags": "Tags", - "skillManagement.title": "Skills", - "agentDetail.configure.files.richTip": "สำหรับเอกสารอ้างอิงที่ยาวเกินกว่าจะวางใน Prompt: สเปก เทมเพลต แนวทาง ดูข้อมูลเพิ่มเติม\n\nในโหมด Build agent สามารถตั้งค่าสิ่งเหล่านี้ให้คุณได้", - "agentDetail.configure.prompt.richTip": "กำหนดบทบาทของเอเจนต์และวิธีการทำงาน ดูข้อมูลเพิ่มเติม" + "skillManagement.title": "Skills" } diff --git a/web/i18n/th-TH/skill.json b/web/i18n/th-TH/skill.json index 5046605af6b..33abaab9fd6 100644 --- a/web/i18n/th-TH/skill.json +++ b/web/i18n/th-TH/skill.json @@ -1,121 +1,245 @@ { - "skillManagement.clearTags": "Clear tags", - "skillManagement.create": "Create", - "skillManagement.createFailed": "Failed to create skill.", - "skillManagement.createSuccess": "Skill created.", - "skillManagement.dateTimeFormat": "MMM D, YYYY HH:mm", + "skillManagement.clearTags": "ล้างแท็ก", + "skillManagement.create": "สร้าง", + "skillManagement.createFailed": "ไม่สามารถสร้างทักษะได้", + "skillManagement.createSuccess": "สร้างฉบับร่างแล้ว", + "skillManagement.dateTimeFormat": "ดด ด ปปปป HH:มม", "skillManagement.deleteDialog.confirmInputLabel": "เพื่อยืนยัน ให้พิมพ์ {{skillName}} ในช่องด้านล่าง:", "skillManagement.deleteDialog.confirmInputPlaceholder": "ป้อนชื่อที่แสดงของ Skill…", - "skillManagement.deleteDialog.description": "This skill will be removed from the workspace. Agents that reference it may lose access to this capability.", - "skillManagement.deleteDialog.title": "Delete {{name}}?", - "skillManagement.deleteFailed": "Failed to delete skill.", - "skillManagement.deleteSuccess": "Skill deleted.", - "skillManagement.detail.addMetadata": "Add metadata", - "skillManagement.detail.addMetadataDescription": "Add a frontmatter field to this Markdown file.", - "skillManagement.detail.addTag": "Add tag", - "skillManagement.detail.addTagDescription": "Create or bind a tag to this Skill. New tags are saved with the Skill metadata.", - "skillManagement.detail.addTagSuccess": "Tag added.", - "skillManagement.detail.back": "Back to Skills", - "skillManagement.detail.cancelAddMetadata": "Cancel adding metadata", - "skillManagement.detail.closeFileTab": "Close {{name}}", + "skillManagement.deleteDialog.description": "การลบทักษะไม่สามารถย้อนกลับได้ เนื้อหาและประวัติเวอร์ชันเต็มจะถูกลบอย่างถาวร ขณะนี้ไม่มีตัวแทนใช้งานอยู่", + "skillManagement.deleteDialog.referencedDescription_one": "เอเจนต์ {{count}} กำลังใช้ทักษะนี้ ไม่ว่าจะโดยอิสระหรือในเวิร์กโฟลว์ การลบทักษะนี้จะลบเนื้อหาและประวัติเวอร์ชันอย่างถาวร และลบออกจากตัวแทนที่ได้รับผลกระทบ", + "skillManagement.deleteDialog.referencedDescription_other": "เจ้าหน้าที่ {{count}} กำลังใช้ทักษะนี้ ไม่ว่าจะแยกกันหรือในเวิร์กโฟลว์ การลบทักษะนี้จะลบเนื้อหาและประวัติเวอร์ชันอย่างถาวร และลบออกจากตัวแทนที่ได้รับผลกระทบทั้งหมด", + "skillManagement.deleteDialog.title": "ลบ {{name}} หรือไม่", + "skillManagement.deleteFailed": "ไม่สามารถลบทักษะได้", + "skillManagement.deleteSuccess": "Skill ลบแล้ว", + "skillManagement.detail.addMetadata": "เพิ่มข้อมูลเมตา", + "skillManagement.detail.addMetadataDescription": "เพิ่มช่อง frontmatter ให้กับไฟล์ Markdown นี้", + "skillManagement.detail.addTag": "เพิ่มแท็ก", + "skillManagement.detail.addTagDescription": "สร้างหรือผูกแท็กกับ Skill นี้ แท็กใหม่จะถูกบันทึกพร้อมกับข้อมูลเมตา Skill", + "skillManagement.detail.addTagSuccess": "เพิ่มแท็กแล้ว", + "skillManagement.detail.back": "กลับไปที่ Skills", + "skillManagement.detail.builder.applyFailed": "ไม่สามารถใช้การอัปเดตฉบับร่างได้", + "skillManagement.detail.builder.attach": "แนบไฟล์", + "skillManagement.detail.builder.attachFailed": "ไม่สามารถแนบไฟล์ได้", + "skillManagement.detail.builder.attachLimit": "คุณสามารถแนบไฟล์ได้สูงสุด 10 ไฟล์", + "skillManagement.detail.builder.attachTooLarge": "ไฟล์ต้องมีขนาด 15 MB หรือเล็กกว่า รูปภาพต้องมีขนาด 10 MB หรือเล็กกว่า", + "skillManagement.detail.builder.attachUnsupported": "สามารถแนบได้เฉพาะไฟล์รูปภาพ ข้อความ และเอกสารเท่านั้น", + "skillManagement.detail.builder.attachmentOnlyMessage": "ใช้ไฟล์แนบเพื่อช่วยพัฒนาทักษะนี้", + "skillManagement.detail.builder.close": "ปิด Skill Builder", + "skillManagement.detail.builder.compatibleModelsOnly": "แสดงเฉพาะโมเดลที่รองรับเท่านั้น", + "skillManagement.detail.builder.copyResponse": "คัดลอกคำตอบ", + "skillManagement.detail.builder.copySuccess": "คัดลอกคำตอบไปยังคลิปบอร์ดแล้ว", + "skillManagement.detail.builder.editIntro": "ฉันได้ทบทวนทักษะนี้แล้ว คุณต้องการปรับอะไร?", + "skillManagement.detail.builder.exampleIssueTriage": "การตรวจสอบปัญหาของลูกค้า", + "skillManagement.detail.builder.exampleOnboarding": "คู่มือการเริ่มต้นใช้งานการจ้างงานใหม่", + "skillManagement.detail.builder.exampleSalesFollowUp": "กลยุทธ์การติดตามผลการขาย", + "skillManagement.detail.builder.followUpDisplayName": "ใช้การอนุมัติการคืนเงินเป็นชื่อที่แสดง", + "skillManagement.detail.builder.followUpNameIcon": "ใช้ชื่อและไอคอนที่แนะนำ", + "skillManagement.detail.builder.fromMarketplace": "จาก Marketplace", + "skillManagement.detail.builder.model": "GPT-4o", + "skillManagement.detail.builder.modelCredits.all": "เครดิตทั้งหมด", + "skillManagement.detail.builder.modelCredits.configure": "ต้องกำหนดค่า", + "skillManagement.detail.builder.modelCredits.exhausted": "โควต้าหมด", + "skillManagement.detail.builder.modelProviderSettings": "การตั้งค่าผู้ให้บริการโมเดล", + "skillManagement.detail.builder.modelSearch": "ค้นหาโมเดล...", + "skillManagement.detail.builder.modifyPlaceholder": "ขอให้ AI ปรับเปลี่ยนทักษะนี้...", + "skillManagement.detail.builder.open": "เปิด Skill Builder", + "skillManagement.detail.builder.placeholder": "อธิบายเหตุการณ์...", + "skillManagement.detail.builder.progress.applyingChanges": "การใช้การเปลี่ยนแปลงไฟล์", + "skillManagement.detail.builder.progress.generatingPlan": "กำลังสร้างแผนการอัพเดต", + "skillManagement.detail.builder.progress.readingDraft": "กำลังอ่านร่างปัจจุบัน", + "skillManagement.detail.builder.progress.updatingEditor": "กำลังอัปเดตตัวแก้ไข", + "skillManagement.detail.builder.promptDescription": "อธิบายแล้วฉบับร่างจะปรากฏในตัวแก้ไข พร้อมขั้นตอนและไฟล์รวมอยู่ด้วย", + "skillManagement.detail.builder.promptTitle": "ทักษะนี้ควรจัดการอย่างไร?", + "skillManagement.detail.builder.readAloud": "อ่านออกเสียงคำตอบ", + "skillManagement.detail.builder.removeAttachment": "ลบ {{name}}", + "skillManagement.detail.builder.restart": "รีสตาร์ทตัวสร้าง", + "skillManagement.detail.builder.retryResponse": "ลองตอบกลับอีกครั้ง", + "skillManagement.detail.builder.send": "ส่งข้อความ", + "skillManagement.detail.builder.sendFailed": "Skill Builder ล้มเหลวในการตอบสนอง", + "skillManagement.detail.builder.thinking": "กำลังคิด", + "skillManagement.detail.builder.thinkingUnavailable": "ไม่มีการส่งคืนเนื้อหาการคิดโดยโมเดล", + "skillManagement.detail.builder.title": "Skill Builder", + "skillManagement.detail.builder.tryExample": "ลองตัวอย่าง", + "skillManagement.detail.builder.voice": "ป้อนข้อมูลด้วยเสียง", + "skillManagement.detail.builder.voiceUnavailable": "การป้อนข้อมูลด้วยเสียงยังไม่พร้อมใช้งาน", + "skillManagement.detail.cancelAddMetadata": "ยกเลิกการเพิ่มข้อมูลเมตา", + "skillManagement.detail.closeFileTab": "ปิด {{name}}", + "skillManagement.detail.closeVersions": "ปิดเวอร์ชัน", "skillManagement.detail.collapseSidebar": "ยุบแถบด้านข้าง", - "skillManagement.detail.createFile": "New file", - "skillManagement.detail.createFileDescription": "Enter a file path relative to the skill root.", - "skillManagement.detail.createFileMenu": "New file...", - "skillManagement.detail.createFileSuccess": "File created.", - "skillManagement.detail.createFolder": "New folder", - "skillManagement.detail.createFolderDescription": "Enter a folder path relative to the skill root.", - "skillManagement.detail.createFolderMenu": "New folder...", - "skillManagement.detail.createFolderSuccess": "Folder created.", - "skillManagement.detail.createdBy": "Created by {{name}}", - "skillManagement.detail.currentDraft": "Current draft", - "skillManagement.detail.deleteFileConfirm": "Delete this file?", - "skillManagement.detail.deleteFileSuccess": "File deleted.", - "skillManagement.detail.deleteVersionConfirm": "Delete this version?", - "skillManagement.detail.deleteVersionFailed": "Failed to delete version.", - "skillManagement.detail.deleteVersionSuccess": "Version deleted.", - "skillManagement.detail.downloadFile": "Download file", - "skillManagement.detail.draft": "Draft", + "skillManagement.detail.copyContentSuccess": "คัดลอกเนื้อหาไปยังคลิปบอร์ดแล้ว", + "skillManagement.detail.copyFile": "ลอก", + "skillManagement.detail.copyFileSuccess": "ไฟล์พร้อมที่จะวาง", + "skillManagement.detail.copyVersionId": "คัดลอก ID", + "skillManagement.detail.copyVersionIdSuccess": "คัดลอก ID ไปยังคลิปบอร์ดแล้ว", + "skillManagement.detail.createFile": "ไฟล์ใหม่", + "skillManagement.detail.createFileDescription": "ป้อนเส้นทางของไฟล์ที่เกี่ยวข้องกับรูททักษะ", + "skillManagement.detail.createFileMenu": "ไฟล์ใหม่...", + "skillManagement.detail.createFileSuccess": "สร้างไฟล์แล้ว", + "skillManagement.detail.createFolder": "โฟลเดอร์ใหม่", + "skillManagement.detail.createFolderDescription": "ป้อนเส้นทางโฟลเดอร์ที่เกี่ยวข้องกับรูททักษะ", + "skillManagement.detail.createFolderMenu": "โฟลเดอร์ใหม่...", + "skillManagement.detail.createFolderSuccess": "สร้างโฟลเดอร์แล้ว", + "skillManagement.detail.createdBy": "สร้างโดย {{name}}", + "skillManagement.detail.currentDraft": "ร่างปัจจุบัน", + "skillManagement.detail.cutFile": "ตัด", + "skillManagement.detail.cutFileSuccess": "ไฟล์พร้อมย้าย.", + "skillManagement.detail.deleteFileConfirm": "ลบไฟล์นี้ใช่ไหม", + "skillManagement.detail.deleteFileSuccess": "ลบไฟล์แล้ว", + "skillManagement.detail.deleteVersionConfirm": "ลบเวอร์ชันนี้ใช่ไหม", + "skillManagement.detail.deleteVersionFailed": "ลบเวอร์ชันไม่สำเร็จ", + "skillManagement.detail.deleteVersionSuccess": "ลบเวอร์ชันแล้ว", + "skillManagement.detail.downloadFile": "ดาวน์โหลดไฟล์", + "skillManagement.detail.draft": "ฉบับร่าง", + "skillManagement.detail.editVersionInfo": "แก้ไขข้อมูลเวอร์ชัน", + "skillManagement.detail.exitVersions": "ออกจากเวอร์ชัน", "skillManagement.detail.expandSidebar": "ขยายแถบด้านข้าง", - "skillManagement.detail.fileCount": "{{count}} FILES", - "skillManagement.detail.fileMeta": "{{type}} · {{size}} bytes", - "skillManagement.detail.fileMissing": "File not found.", - "skillManagement.detail.fileOperationFailed": "File operation failed.", - "skillManagement.detail.files": "Files", - "skillManagement.detail.latest": "Latest", - "skillManagement.detail.loadFailed": "Failed to load skill.", - "skillManagement.detail.markdownLiveMode": "Live preview", - "skillManagement.detail.markdownSourceMode": "Source editor", - "skillManagement.detail.metadataKey": "name", - "skillManagement.detail.metadataValue": "value", - "skillManagement.detail.moveFileSuccess": "File moved.", - "skillManagement.detail.moveFilesSuccess": "Files moved.", - "skillManagement.detail.noFileSelected": "Select a file to preview.", - "skillManagement.detail.noFiles": "No files.", + "skillManagement.detail.fileAlreadyExists": "มีไฟล์หรือโฟลเดอร์ชื่อนี้อยู่แล้ว", + "skillManagement.detail.fileCount_one": "ไฟล์ {{count}}", + "skillManagement.detail.fileCount_other": "ไฟล์ {{count}}", + "skillManagement.detail.fileMeta": "{{type}} · {{size}} ไบต์", + "skillManagement.detail.fileMissing": "ไม่พบไฟล์.", + "skillManagement.detail.fileOperationFailed": "การดำเนินการไฟล์ล้มเหลว", + "skillManagement.detail.files": "ไฟล์", + "skillManagement.detail.latest": "ล่าสุด", + "skillManagement.detail.loadFailed": "โหลดทักษะไม่สำเร็จ", + "skillManagement.detail.loadingTags": "กำลังโหลดแท็ก...", + "skillManagement.detail.markdownLiveMode": "ดูตัวอย่างสด", + "skillManagement.detail.markdownSourceMode": "ตัวแก้ไขแหล่งที่มา", + "skillManagement.detail.metadataKey": "ชื่อ", + "skillManagement.detail.metadataValue": "ค่า", + "skillManagement.detail.moveFileSuccess": "ย้ายไฟล์แล้ว", + "skillManagement.detail.moveFilesSuccess": "ย้ายไฟล์แล้ว", + "skillManagement.detail.nameThisVersion": "ชื่อเวอร์ชันนี้", + "skillManagement.detail.noFileSelected": "เลือกไฟล์เพื่อดูตัวอย่าง", + "skillManagement.detail.noFiles": "ไม่มีไฟล์.", "skillManagement.detail.noSearchResults": "ไม่พบไฟล์ที่ตรงกัน", - "skillManagement.detail.noVersions": "No published versions yet.", - "skillManagement.detail.previewUnsupported": "Preview is not supported for this file.", - "skillManagement.detail.publish": "Publish", - "skillManagement.detail.publishFailed": "Failed to publish skill.", - "skillManagement.detail.publishSuccess": "Skill published.", - "skillManagement.detail.published": "Published", + "skillManagement.detail.noSelectableTags": "ไม่มีแท็กที่ใช้ได้", + "skillManagement.detail.noVersions": "ยังไม่มีเวอร์ชันเผยแพร่", + "skillManagement.detail.pasteFile": "แปะ", + "skillManagement.detail.pasteFileSuccess": "วางไฟล์แล้ว", + "skillManagement.detail.previewUnsupported": "ไฟล์นี้ไม่รองรับการแสดงตัวอย่าง", + "skillManagement.detail.publish": "เผยแพร่", + "skillManagement.detail.publishFailed": "ไม่สามารถเผยแพร่ทักษะได้", + "skillManagement.detail.publishReferencesDescription_one": "การเผยแพร่จะมีผลทันทีสำหรับตัวแทน {{count}} ที่ใช้ทักษะนี้", + "skillManagement.detail.publishReferencesDescription_other": "การเผยแพร่จะมีผลทันทีสำหรับตัวแทน {{count}} ที่ใช้ทักษะนี้", + "skillManagement.detail.publishReferencesTitle": "เผยแพร่ทักษะ", + "skillManagement.detail.publishSuccess": "Skill เผยแพร่แล้ว", + "skillManagement.detail.publishUpdate": "เผยแพร่อัปเดต", + "skillManagement.detail.published": "เผยแพร่แล้ว", "skillManagement.detail.publishedAt": "เผยแพร่เมื่อ {{time}}", + "skillManagement.detail.publishedVersion": "เผยแพร่แล้ว #{{number}}", "skillManagement.detail.publishing": "กำลังเผยแพร่...", - "skillManagement.detail.readonly": "Read only", - "skillManagement.detail.referenceFiles.confirm": "Enter Confirm", - "skillManagement.detail.referenceFiles.empty": "No files available.", - "skillManagement.detail.referenceFiles.livePlaceholder": "Write instructions for the agent, type / to reference files", - "skillManagement.detail.referenceFiles.navigate": "↑↓ Navigate", - "skillManagement.detail.referenceFiles.title": "Reference files", - "skillManagement.detail.referencedBy": "Referenced by {{count}} Apps", - "skillManagement.detail.removeMetadata": "Delete {{name}} metadata", - "skillManagement.detail.removeTag": "Remove {{tag}}", - "skillManagement.detail.removeTagSuccess": "Tag removed.", - "skillManagement.detail.renameFile": "Rename file", - "skillManagement.detail.renameFileDescription": "Enter the new path relative to the skill root.", - "skillManagement.detail.renameFileSuccess": "File renamed.", - "skillManagement.detail.renameSkillSuccess": "Skill renamed.", - "skillManagement.detail.renameVersion": "Rename", - "skillManagement.detail.renameVersionFailed": "Failed to rename version.", - "skillManagement.detail.renameVersionPrompt": "Version name", - "skillManagement.detail.renameVersionSuccess": "Version renamed.", - "skillManagement.detail.restoreVersion": "Restore", - "skillManagement.detail.restoreVersionFailed": "Failed to restore version.", - "skillManagement.detail.restoreVersionSuccess": "Version restored to draft.", - "skillManagement.detail.save": "Save", - "skillManagement.detail.saveFailed": "Failed to save file.", - "skillManagement.detail.saveSuccess": "File saved.", - "skillManagement.detail.saved": "Saved", - "skillManagement.detail.savedAt": "Saved {{time}}", - "skillManagement.detail.saving": "Saving...", + "skillManagement.detail.readonly": "อ่านอย่างเดียว", + "skillManagement.detail.referenceFiles.confirm": "เข้าสู่ ยืนยัน", + "skillManagement.detail.referenceFiles.empty": "ไม่มีไฟล์ที่ใช้ได้", + "skillManagement.detail.referenceFiles.livePlaceholder": "เขียนคำแนะนำสำหรับตัวแทน พิมพ์ / เพื่ออ้างอิงไฟล์", + "skillManagement.detail.referenceFiles.navigate": "↑↓ นำทาง", + "skillManagement.detail.referenceFiles.title": "ไฟล์อ้างอิง", + "skillManagement.detail.referencedBy_one": "ใช้โดย {{count}} เอเจนต์", + "skillManagement.detail.referencedBy_other": "ใช้โดย {{count}} เอเจนต์", + "skillManagement.detail.removeMetadata": "ลบข้อมูลเมตา {{name}}", + "skillManagement.detail.removeTag": "ลบ {{tag}}", + "skillManagement.detail.removeTagSuccess": "ลบแท็กแล้ว", + "skillManagement.detail.renameFile": "เปลี่ยนชื่อไฟล์", + "skillManagement.detail.renameFileDescription": "เข้าสู่เส้นทางใหม่ที่เกี่ยวข้องกับรูททักษะ", + "skillManagement.detail.renameFileSuccess": "เปลี่ยนชื่อไฟล์แล้ว", + "skillManagement.detail.renameSkillSuccess": "Skill เปลี่ยนชื่อแล้ว", + "skillManagement.detail.renameVersion": "ตั้งชื่อใหม่", + "skillManagement.detail.renameVersionFailed": "ไม่สามารถเปลี่ยนชื่อเวอร์ชันได้", + "skillManagement.detail.renameVersionPrompt": "ชื่อเวอร์ชัน", + "skillManagement.detail.renameVersionSuccess": "เปลี่ยนชื่อเวอร์ชันแล้ว", + "skillManagement.detail.resizeSidebar": "ปรับขนาดแถบด้านข้างของไฟล์", + "skillManagement.detail.restoreVersion": "กู้คืน", + "skillManagement.detail.restoreVersionConfirmDescription": "ซึ่งจะแทนที่แบบร่างปัจจุบันด้วยไฟล์จาก \"{{version}}\" จะไม่เผยแพร่ Skill หรือสร้างเวอร์ชันใหม่", + "skillManagement.detail.restoreVersionConfirmTitle": "กู้คืนเวอร์ชันนี้ไหม", + "skillManagement.detail.restoreVersionFailed": "ไม่สามารถกู้คืนเวอร์ชันได้", + "skillManagement.detail.restoreVersionSuccess": "กู้คืนเวอร์ชันเป็นฉบับร่างแล้ว", + "skillManagement.detail.save": "ประหยัด", + "skillManagement.detail.saveConflictConfirmDescription": "ทักษะนี้ได้รับการอัปเดตที่อื่น โหลดฉบับร่างล่าสุดเพื่อแก้ไขต่อ การเปลี่ยนแปลงในปัจจุบันของคุณจะถูกยกเลิก", + "skillManagement.detail.saveConflictConfirmTitle": "โหลดฉบับร่างล่าสุดใช่ไหม", + "skillManagement.detail.saveConflictReload": "โหลดฉบับร่างล่าสุด", + "skillManagement.detail.saveConflictStatus": "ตรวจพบข้อขัดแย้ง โหลดฉบับร่างล่าสุดเพื่อแก้ไขต่อ", + "skillManagement.detail.saveFailed": "ไม่สามารถบันทึกไฟล์ได้", + "skillManagement.detail.saveSuccess": "บันทึกไฟล์แล้ว", + "skillManagement.detail.saved": "บันทึก", + "skillManagement.detail.savedAt": "บันทึกเมื่อ {{time}}", + "skillManagement.detail.saving": "กำลังบันทึก...", "skillManagement.detail.searchFiles": "ค้นหาไฟล์", + "skillManagement.detail.showMoreReferences": "แสดง {{count}} เพิ่มเติม", + "skillManagement.detail.skillDescriptionPlaceholder": "อธิบายว่าทักษะนี้ทำอะไรและเมื่อใดที่ตัวแทนควรใช้", + "skillManagement.detail.skillNamePlaceholder": "ใช้ตัวอักษรพิมพ์เล็ก ตัวเลข และขีดกลาง", "skillManagement.detail.unpublishedChanges": "การเปลี่ยนแปลงที่ยังไม่ได้เผยแพร่", - "skillManagement.detail.unsavedChanges": "Unsaved changes", + "skillManagement.detail.unsavedChanges": "การเปลี่ยนแปลงที่ไม่ได้บันทึก", "skillManagement.detail.upToDate": "เป็นปัจจุบัน", - "skillManagement.detail.updateTagsFailed": "Failed to update tags.", - "skillManagement.detail.uploadFile": "Upload file", - "skillManagement.detail.uploadFileFailed": "File upload failed.", - "skillManagement.detail.uploadFileSuccess": "File uploaded.", - "skillManagement.detail.uploadFilesMenu": "Upload files...", + "skillManagement.detail.updateTagsFailed": "อัปเดตแท็กไม่สำเร็จ", + "skillManagement.detail.uploadCheckFailed": "ไม่สามารถตรวจสอบไฟล์เหล่านี้ได้ ลองอีกครั้ง", + "skillManagement.detail.uploadConflict": "มีไฟล์ชื่อนี้อยู่แล้ว", + "skillManagement.detail.uploadFailureSummary": "ไฟล์ {{failed}} ของ {{total}} ล้มเหลว", + "skillManagement.detail.uploadFailureTitle": "การอัปโหลดบางรายการล้มเหลว", + "skillManagement.detail.uploadFile": "อัปโหลดไฟล์", + "skillManagement.detail.uploadFileFailed": "การอัปโหลดไฟล์ล้มเหลว", + "skillManagement.detail.uploadFileSuccess": "อัปโหลดไฟล์แล้ว", + "skillManagement.detail.uploadFilesButton": "อัปโหลดไฟล์ {{count}}", + "skillManagement.detail.uploadFilesFailedStatus_one": "การอัปโหลดไฟล์ {{count}} ล้มเหลว", + "skillManagement.detail.uploadFilesFailedStatus_other": "การอัปโหลดไฟล์ {{count}} ล้มเหลว", + "skillManagement.detail.uploadFilesMenu": "อัปโหลดไฟล์...", + "skillManagement.detail.uploadFilesProgress": "กำลังอัพโหลด {{completed}}/{{total}}", + "skillManagement.detail.uploadFilesResult": "อัปโหลด {{uploaded}} แล้ว · {{failed}} ล้มเหลว", + "skillManagement.detail.uploadFilesStatus": "สถานะการอัปโหลด", + "skillManagement.detail.uploadInvalidExtension": "ไม่รองรับไฟล์ประเภทนี้", + "skillManagement.detail.uploadInvalidName": "ชื่อไม่ถูกต้อง", + "skillManagement.detail.uploadInvalidPath": "เส้นทางไฟล์ไม่ถูกต้อง", + "skillManagement.detail.uploadKeepBoth": "เก็บไว้ทั้งสองอย่าง", + "skillManagement.detail.uploadLateConflict": "มีคนเพิ่มไฟล์นี้ขณะที่คุณกำลังอัปโหลด", + "skillManagement.detail.uploadMissingExtension": "จำเป็นต้องมีนามสกุลไฟล์", + "skillManagement.detail.uploadNetworkFailure": "การอัปโหลดล้มเหลว ตรวจสอบการเชื่อมต่อของคุณ", + "skillManagement.detail.uploadReadySummary": "{{ready}} พร้อมแล้ว · {{decisions}} ต้องตัดสินใจ · {{skipped}} จะถูกข้ามไป", + "skillManagement.detail.uploadReplace": "แทนที่", + "skillManagement.detail.uploadResolvedSummary": "{{ready}} พร้อมแล้ว · {{skipped}} จะถูกข้ามไป", + "skillManagement.detail.uploadRetryCount": "ลอง {{count}} อีกครั้ง", + "skillManagement.detail.uploadReviewTitle": "ตรวจสอบก่อนที่จะอัปโหลด", + "skillManagement.detail.uploadSkip": "เรือ", + "skillManagement.detail.uploadSkippedGroup": "ไฟล์ {{count}} ไม่สามารถอัปโหลดได้และจะถูกข้าม", + "skillManagement.detail.uploadStatusDismiss": "ปิดสถานะการอัปโหลด", + "skillManagement.detail.uploadSuggestion": "ใช้ข้อเสนอแนะ", + "skillManagement.detail.uploadWillReplace": "จะแทนที่ไฟล์ที่มีอยู่", + "skillManagement.detail.uploadWillUseName": "จะอัพโหลดเป็น {{name}}", + "skillManagement.detail.versionHistory": "เปิดประวัติเวอร์ชัน", "skillManagement.detail.versionMeta": "{{hash}} · {{time}}", - "skillManagement.detail.versions": "Versions", - "skillManagement.draft": "Draft", - "skillManagement.duplicateFailed": "Failed to duplicate skill.", - "skillManagement.duplicateSuccess": "Skill duplicated.", - "skillManagement.editedAt": "Edited {{time}}", - "skillManagement.empty": "No skills yet", - "skillManagement.emptySearch": "No skills found", - "skillManagement.import": "Import", - "skillManagement.importFailed": "Failed to import skill.", - "skillManagement.importSuccess": "Skill imported.", - "skillManagement.listLabel": "Workspace skills", - "skillManagement.loadingError": "Failed to load skills", - "skillManagement.moreActions": "More actions for {{name}}", - "skillManagement.noTags": "No tags", - "skillManagement.publishedAt": "Published {{time}}", - "skillManagement.referenceCount": "{{count}} Refs", - "skillManagement.searchLabel": "Search skills", - "skillManagement.searchPlaceholder": "Search", - "skillManagement.tags": "Tags", - "skillManagement.title": "Skills" + "skillManagement.detail.versionPublishNote": "บันทึกประจำรุ่น", + "skillManagement.detail.versionPublishNotePlaceholder": "อธิบายการเปลี่ยนแปลงนี้", + "skillManagement.detail.versionPublishedMeta": "{{time}} · {{name}}", + "skillManagement.detail.versionTitle": "ชื่อเรื่อง", + "skillManagement.detail.versions": "เวอร์ชัน", + "skillManagement.detail.viewOnly": "ดูอย่างเดียว", + "skillManagement.detail.viewUploadErrors": "ดูข้อผิดพลาด", + "skillManagement.draft": "ฉบับร่าง", + "skillManagement.duplicateFailed": "ไม่สามารถทำซ้ำทักษะได้", + "skillManagement.duplicateSuccess": "Skill ซ้ำกัน", + "skillManagement.editedAt": "แก้ไขเมื่อ {{time}}", + "skillManagement.empty": "ยังไม่มีทักษะ", + "skillManagement.emptyAction.createDescription": "อธิบายสถานการณ์ด้วยคำพูดธรรมดาและรับทักษะฉบับร่างเพื่อทบทวน", + "skillManagement.emptyAction.createTitle": "สร้างด้วย Skill Builder", + "skillManagement.emptyAction.importDescription": "นำ .zip มาด้วย SKILL.md ในรูปแบบ agentkills.io", + "skillManagement.emptyAction.importTitle": "นำเข้าแพ็คเกจทักษะ", + "skillManagement.emptySearch": "ไม่พบทักษะ", + "skillManagement.errors.missingSkillMd": "แพ็คเกจนี้ไม่มี SKILL.md เพิ่มไฟล์และนำเข้าอีกครั้ง", + "skillManagement.errors.nameConflict": "มีทักษะชื่อ \"{{name}}\" อยู่แล้ว เปลี่ยนชื่อใน SKILL.md และนำเข้าอีกครั้ง", + "skillManagement.errors.workspaceLimit": "พื้นที่ทำงานของคุณถึงขีดจำกัด 500 ทักษะแล้ว ลบทักษะเพื่อเพิ่มทักษะใหม่", + "skillManagement.import": "นำเข้า", + "skillManagement.importFailed": "ไม่สามารถนำเข้าทักษะได้", + "skillManagement.importSuccess": "Skill นำเข้า", + "skillManagement.listLabel": "ทักษะพื้นที่ทำงาน", + "skillManagement.loadingError": "โหลดทักษะไม่สำเร็จ", + "skillManagement.moreActions": "การกระทำเพิ่มเติมสำหรับ {{name}}", + "skillManagement.noDescription": "ยังไม่มีคำอธิบาย", + "skillManagement.noTags": "ไม่มีแท็ก", + "skillManagement.publishedAt": "เผยแพร่เมื่อ {{time}}", + "skillManagement.referenceCount_one": "{{count}} เอเจนต์", + "skillManagement.referenceCount_other": "{{count}} เอเจนต์", + "skillManagement.searchLabel": "ค้นหาทักษะ", + "skillManagement.searchPlaceholder": "ค้นหาตามชื่อหรือคำอธิบาย", + "skillManagement.tags": "แท็ก", + "skillManagement.title": "ทักษะ" } diff --git a/web/i18n/tr-TR/agent-v-2.json b/web/i18n/tr-TR/agent-v-2.json index f496853d352..1fe95a9bb7e 100644 --- a/web/i18n/tr-TR/agent-v-2.json +++ b/web/i18n/tr-TR/agent-v-2.json @@ -83,7 +83,7 @@ "agentDetail.configure.buildDraft.changesToApply_other": "Uygulanacak {{count}} değişiklik", "agentDetail.configure.buildDraft.discard": "Vazgeç", "agentDetail.configure.buildDraft.modeBadge": "Build modu", - "agentDetail.configure.buildDraft.modeDescription": "Build modundasınız. Bu modda Configure yalnızca ajan tarafından güncellenebilir. Bu kurulumu sağdaki sohbetle şekillendirin, ardından uygulayın.", + "agentDetail.configure.buildDraft.modeDescription": "Build modundasınız. Agent ile sohbet ederek bu kurulumu şekillendirin, ardından Uygula'ya tıklayın.", "agentDetail.configure.buildDraft.rewritten": "Yeniden yazıldı", "agentDetail.configure.buildDraft.title": "Build taslağı", "agentDetail.configure.buildDraft.updated": "Güncellendi", @@ -105,7 +105,8 @@ "agentDetail.configure.files.preview.failed": "Önizleme yüklenemedi.", "agentDetail.configure.files.preview.unsupported": "Bu dosya önizlemeyi desteklemiyor.", "agentDetail.configure.files.remove": "{{name}} kaldır", - "agentDetail.configure.files.tip": "Prompt içine yapıştırmak için fazla uzun olan referans materyalleri için: teknik özellikler, şablonlar, yönergeler. Prompt içinde / ile referans verin.\n\nBuild mode'da agent bunları sizin için ayarlayabilir.", + "agentDetail.configure.files.richTip": "Prompt içine yapıştırmak için fazla uzun olan referans materyalleri için: teknik özellikler, şablonlar, yönergeler. Daha fazla bilgi\n\nBuild mode'da agent bunları sizin için ayarlayabilir.", + "agentDetail.configure.files.tip": "Prompt içine yapıştırmak için fazla uzun olan referans materyalleri için: teknik özellikler, şablonlar, yönergeler. Daha fazla bilgi\n\nBuild mode'da agent bunları sizin için ayarlayabilir.", "agentDetail.configure.files.toggle": "Dosyaları değiştir", "agentDetail.configure.files.treeLabel": "Ajan dosyaları", "agentDetail.configure.files.upload.action": "Yükle", @@ -114,7 +115,7 @@ "agentDetail.configure.files.upload.dropzone": "Buraya bir dosya bırakın veya", "agentDetail.configure.files.upload.failed": "Dosya yüklenemedi.", "agentDetail.configure.files.upload.fileType": "FILE", - "agentDetail.configure.files.upload.invalidFile": "Bir dosya yükleyin.", + "agentDetail.configure.files.upload.invalidFile": "Aynı anda yalnızca bir dosya yüklenebilir.", "agentDetail.configure.files.upload.success": "Dosya yüklendi.", "agentDetail.configure.files.upload.title": "Dosya yükle", "agentDetail.configure.knowledgeRetrieval.add": "Bilgi geri alımı ekle", @@ -177,7 +178,8 @@ "agentDetail.configure.prompt.mention.priyaRamanathan": "Priya Ramanathan", "agentDetail.configure.prompt.placeholder": "Talimatları buraya yazın,", "agentDetail.configure.prompt.referenceMissing": "{{name}} mevcut değil", - "agentDetail.configure.prompt.tip": "Aracının rolünü tanımlayın ve tipik görevini açıklayın. Skills, Files, Tools ve Knowledge Retrievals için açık referans vermek üzere / kullanın.", + "agentDetail.configure.prompt.richTip": "Agent'ın rolünü ve nasıl çalışması gerektiğini tanımlayın. Daha fazla bilgi", + "agentDetail.configure.prompt.tip": "Agent'ın rolünü ve nasıl çalışması gerektiğini tanımlayın. Daha fazla bilgi", "agentDetail.configure.publishBar.draft": "Taslak", "agentDetail.configure.publishBar.publishUpdate": "Güncellemeyi yayınla", "agentDetail.configure.publishBar.published": "Yayınlandı", @@ -190,8 +192,8 @@ "agentDetail.configure.publishBar.versionHistory": "Sürüm geçmişini aç", "agentDetail.configure.publishImpact.affectedWorkflows": "Etkilenen İş Akışları", "agentDetail.configure.publishImpact.cancel": "İptal", - "agentDetail.configure.publishImpact.descriptionPrefix": "Ajanınız şurada görünüyor", - "agentDetail.configure.publishImpact.descriptionSuffix": ". Değişiklikler onları etkileyecek.", + "agentDetail.configure.publishImpact.descriptionPrefix": "Bu ajan", + "agentDetail.configure.publishImpact.descriptionSuffix": " içinde kullanılıyor. Yayınlandığında hepsinde güncellenir.", "agentDetail.configure.publishImpact.fallbackAgentName": "bu ajan", "agentDetail.configure.publishImpact.title": "{{name}} için {{action}}", "agentDetail.configure.publishImpact.workflowCount_one": "{{count}} iş akışı", @@ -222,8 +224,8 @@ "agentDetail.configure.skills.openInLibrary": "Open in Skill library", "agentDetail.configure.skills.remove": "{{name}} kaldır", "agentDetail.configure.skills.removeAction": "Remove", - "agentDetail.configure.skills.richTip": "Tekrarlanan bir görev için gereken talimatları, dosyaları ve betikleri bir Skill olarak paketleyin. Prompt içinde / ile referans verin. Daha fazla bilgi\n\nBuild mode'da agent bunları sizin için ayarlayabilir.", - "agentDetail.configure.skills.tip": "Tekrarlanan bir görev için gereken talimatları, dosyaları ve betikleri bir Skill olarak paketleyin. Prompt içinde / ile referans verin. Daha fazla bilgi\n\nBuild mode'da agent bunları sizin için ayarlayabilir.", + "agentDetail.configure.skills.richTip": "Tekrarlanan bir görev için gereken talimatları, dosyaları ve betikleri bir Skill olarak paketleyin. Daha fazla bilgi\n\nBuild mode'da agent bunları sizin için ayarlayabilir.", + "agentDetail.configure.skills.tip": "Tekrarlanan bir görev için gereken talimatları, dosyaları ve betikleri bir Skill olarak paketleyin. Daha fazla bilgi\n\nBuild mode'da agent bunları sizin için ayarlayabilir.", "agentDetail.configure.skills.toggle": "Becerileri değiştir", "agentDetail.configure.skills.upload.action": "Yükle", "agentDetail.configure.skills.upload.browse": "göz at", @@ -269,8 +271,8 @@ "agentDetail.configure.tools.moreActions": "{{name}} için daha fazla eylem", "agentDetail.configure.tools.removeAction": "{{name}} kaldır", "agentDetail.configure.tools.removeProvider": "Tüm araçları kaldır", - "agentDetail.configure.tools.richTip": "Workspace'inizden Dify araçları ekleyin. Prompt içinde / ile referans verin. Daha fazla bilgi\n\nAgent'ın sandbox içinde yüklediği araçlar burada görünmez, ancak kullanıma açık kalır.", - "agentDetail.configure.tools.tip": "Workspace'inizden Dify araçları ekleyin. Prompt içinde / ile referans verin. Daha fazla bilgi\n\nAgent'ın sandbox içinde yüklediği araçlar burada görünmez, ancak kullanıma açık kalır.", + "agentDetail.configure.tools.richTip": "Workspace'inizden Dify araçları ekleyin. Daha fazla bilgi\n\nAgent'ın sandbox içinde yüklediği araçlar burada görünmez, ancak kullanıma açık kalır.", + "agentDetail.configure.tools.tip": "Workspace'inizden Dify araçları ekleyin. Daha fazla bilgi\n\nAgent'ın sandbox içinde yüklediği araçlar burada görünmez, ancak kullanıma açık kalır.", "agentDetail.configure.tools.toggle": "Araçları değiştir", "agentDetail.configure.tools.toolTabs.all": "Tümü", "agentDetail.configure.tools.toolTabs.cli": "CLI", @@ -336,22 +338,22 @@ "agentDetail.metadata.sourceLabel": "Kaynak", "agentDetail.monitoring.change": "Önceki döneme göre {{value}}", "agentDetail.monitoring.dateRangeLabel": "Tarih aralığı", - "agentDetail.monitoring.description": "İş akışlarındaki yeniden kullanılabilir ajan etkinliğini, maliyetini ve etkileşim kalitesini izleyin.", + "agentDetail.monitoring.description": "Bu ajanın tüm erişim noktalarındaki etkinliğini, maliyetini ve etkileşim kalitesini izleyin.", "agentDetail.monitoring.learnMore": "Daha fazla bilgi", "agentDetail.monitoring.loadFailed": "İzleme verileri yüklenemedi", - "agentDetail.monitoring.metrics.activeUsers.explanation": "Bu ajanı kullanarak iş akışlarını tetikleyen benzersiz son kullanıcılar.", + "agentDetail.monitoring.metrics.activeUsers.explanation": "Bu ajanla etkileşim kuran benzersiz son kullanıcılar.", "agentDetail.monitoring.metrics.activeUsers.title": "Aktif Kullanıcılar", - "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Bu erişim noktası için sürekli kullanıcı-ajan iletişim sayısı.", + "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Konuşma başına ortalama kullanıcı mesajı sayısı.", "agentDetail.monitoring.metrics.avgSessionInteractions.title": "Ort. Oturum Etkileşimleri", - "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "İsteğin başlangıcından tamamlanmasına kadar ortalama çıktı hızı.", + "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Bir ajan yanıtı sırasında saniyede üretilen ortalama token sayısı.", "agentDetail.monitoring.metrics.tokenOutputSpeed.title": "Token Çıktı Hızı", - "agentDetail.monitoring.metrics.tokenUsage.explanation": "Bu ajanın iş akışı çalıştırmalarında ürettiği tahmini token maliyeti.", + "agentDetail.monitoring.metrics.tokenUsage.explanation": "Tüketilen tokenlar ve tahmini maliyet.", "agentDetail.monitoring.metrics.tokenUsage.title": "Token Kullanımı", "agentDetail.monitoring.metrics.totalConversations.explanation": "Seçilen erişim noktası aracılığıyla bu ajana ulaşan günlük AI sohbetleri.", "agentDetail.monitoring.metrics.totalConversations.title": "Toplam Sohbetler", - "agentDetail.monitoring.metrics.totalMessages.explanation": "Günlük ajan etkileşim sayısı.", + "agentDetail.monitoring.metrics.totalMessages.explanation": "Bu ajana gönderilen toplam kullanıcı mesajı sayısı.", "agentDetail.monitoring.metrics.totalMessages.title": "Toplam Mesajlar", - "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "Bu ajan için 1.000 mesaj başına beğeni sayısı.", + "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "Kullanıcıların beğendiği ajan yanıtlarının yüzdesi.", "agentDetail.monitoring.metrics.userSatisfactionRate.title": "Kullanıcı Memnuniyet Oranı", "agentDetail.monitoring.pickSource": "Bir uygulama seç", "agentDetail.monitoring.sourceLabel": "Uygulama", @@ -549,7 +551,5 @@ "skillManagement.searchLabel": "Search skills", "skillManagement.searchPlaceholder": "Search", "skillManagement.tags": "Tags", - "skillManagement.title": "Skills", - "agentDetail.configure.files.richTip": "Prompt içine yapıştırmak için fazla uzun olan referans materyalleri için: teknik özellikler, şablonlar, yönergeler. Daha fazla bilgi\n\nBuild mode'da agent bunları sizin için ayarlayabilir.", - "agentDetail.configure.prompt.richTip": "Agent'ın rolünü ve nasıl çalışması gerektiğini tanımlayın. Daha fazla bilgi" + "skillManagement.title": "Skills" } diff --git a/web/i18n/tr-TR/skill.json b/web/i18n/tr-TR/skill.json index 674ddd745da..927af752a9b 100644 --- a/web/i18n/tr-TR/skill.json +++ b/web/i18n/tr-TR/skill.json @@ -1,121 +1,245 @@ { - "skillManagement.clearTags": "Clear tags", - "skillManagement.create": "Create", - "skillManagement.createFailed": "Failed to create skill.", - "skillManagement.createSuccess": "Skill created.", - "skillManagement.dateTimeFormat": "MMM D, YYYY HH:mm", + "skillManagement.clearTags": "Etiketleri temizle", + "skillManagement.create": "Oluştur", + "skillManagement.createFailed": "Beceri oluşturulamadı.", + "skillManagement.createSuccess": "Taslak oluşturuldu.", + "skillManagement.dateTimeFormat": "AAA Gün, YYYY SS:dd", "skillManagement.deleteDialog.confirmInputLabel": "Onaylamak için aşağıdaki alana {{skillName}} yazın:", "skillManagement.deleteDialog.confirmInputPlaceholder": "Skill görünen adını girin…", - "skillManagement.deleteDialog.description": "This skill will be removed from the workspace. Agents that reference it may lose access to this capability.", - "skillManagement.deleteDialog.title": "Delete {{name}}?", - "skillManagement.deleteFailed": "Failed to delete skill.", - "skillManagement.deleteSuccess": "Skill deleted.", - "skillManagement.detail.addMetadata": "Add metadata", - "skillManagement.detail.addMetadataDescription": "Add a frontmatter field to this Markdown file.", - "skillManagement.detail.addTag": "Add tag", - "skillManagement.detail.addTagDescription": "Create or bind a tag to this Skill. New tags are saved with the Skill metadata.", - "skillManagement.detail.addTagSuccess": "Tag added.", - "skillManagement.detail.back": "Back to Skills", - "skillManagement.detail.cancelAddMetadata": "Cancel adding metadata", - "skillManagement.detail.closeFileTab": "Close {{name}}", + "skillManagement.deleteDialog.description": "Yeteneğin silinmesi geri alınamaz. İçeriği ve tam sürüm geçmişi kalıcı olarak silinecek. Şu anda hiçbir temsilci bunu kullanmıyor.", + "skillManagement.deleteDialog.referencedDescription_one": "{{count}} aracısı bu beceriyi bağımsız olarak veya bir iş akışında kullanıyor. Bu becerinin silinmesi, içeriğinin ve sürüm geçmişinin kalıcı olarak silinmesine ve etkilenen aracıdan kaldırılmasına neden olur.", + "skillManagement.deleteDialog.referencedDescription_other": "{{count}} aracıları bu beceriyi bağımsız olarak veya iş akışlarında kullanıyor. Bu becerinin silinmesi, içeriğinin ve sürüm geçmişinin kalıcı olarak silinmesine ve etkilenen tüm aracılardan kaldırılmasına neden olur.", + "skillManagement.deleteDialog.title": "{{name}} silinsin mi?", + "skillManagement.deleteFailed": "Beceri silinemedi.", + "skillManagement.deleteSuccess": "Skill silindi.", + "skillManagement.detail.addMetadata": "Meta veri ekle", + "skillManagement.detail.addMetadataDescription": "Bu Markdown dosyasına bir ön madde alanı ekleyin.", + "skillManagement.detail.addTag": "Etiket ekle", + "skillManagement.detail.addTagDescription": "Bu Skill'a bir etiket oluşturun veya bağlayın. Yeni etiketler Skill meta verileriyle kaydedilir.", + "skillManagement.detail.addTagSuccess": "Etiket eklendi.", + "skillManagement.detail.back": "Skills'e geri dön", + "skillManagement.detail.builder.applyFailed": "Taslak güncellemeleri uygulanamadı.", + "skillManagement.detail.builder.attach": "Dosya ekle", + "skillManagement.detail.builder.attachFailed": "Dosya eklenemedi.", + "skillManagement.detail.builder.attachLimit": "En fazla 10 dosya ekleyebilirsiniz.", + "skillManagement.detail.builder.attachTooLarge": "Dosyalar 15 MB veya daha küçük olmalıdır. Görseller 10 MB veya daha küçük olmalıdır.", + "skillManagement.detail.builder.attachUnsupported": "Yalnızca resimler, metin ve belge dosyaları eklenebilir.", + "skillManagement.detail.builder.attachmentOnlyMessage": "Bu beceriyi geliştirmeye yardımcı olması için ekteki dosyayı kullanın.", + "skillManagement.detail.builder.close": "Skill Builder'yi kapat", + "skillManagement.detail.builder.compatibleModelsOnly": "Yalnızca uyumlu modeller gösterilir", + "skillManagement.detail.builder.copyResponse": "Yanıtı kopyala", + "skillManagement.detail.builder.copySuccess": "Yanıt panoya kopyalandı.", + "skillManagement.detail.builder.editIntro": "Bu beceriyi inceledim. Neyi ayarlamak istersiniz?", + "skillManagement.detail.builder.exampleIssueTriage": "Müşteri sorunları önceliklendirmesi", + "skillManagement.detail.builder.exampleOnboarding": "Yeni işe alım kılavuzu", + "skillManagement.detail.builder.exampleSalesFollowUp": "Satış lideri takip stratejisi", + "skillManagement.detail.builder.followUpDisplayName": "Görünen ad olarak Geri Ödeme onayını kullanın", + "skillManagement.detail.builder.followUpNameIcon": "Önerilen adı ve simgeyi uygulayın", + "skillManagement.detail.builder.fromMarketplace": "Pazar Yeri'nden", + "skillManagement.detail.builder.model": "GPT-4o", + "skillManagement.detail.builder.modelCredits.all": "Tüm krediler", + "skillManagement.detail.builder.modelCredits.configure": "Yapılandırma gerekli", + "skillManagement.detail.builder.modelCredits.exhausted": "Kota Tükendi", + "skillManagement.detail.builder.modelProviderSettings": "Model Sağlayıcı Ayarları", + "skillManagement.detail.builder.modelSearch": "Modelleri ara...", + "skillManagement.detail.builder.modifyPlaceholder": "Yapay zekadan bu beceriyi değiştirmesini isteyin...", + "skillManagement.detail.builder.open": "Skill Builder'yi açın", + "skillManagement.detail.builder.placeholder": "Senaryoyu açıklayın...", + "skillManagement.detail.builder.progress.applyingChanges": "Dosya değişikliklerini uygulama", + "skillManagement.detail.builder.progress.generatingPlan": "Güncelleme planının oluşturulması", + "skillManagement.detail.builder.progress.readingDraft": "Mevcut taslağın okunması", + "skillManagement.detail.builder.progress.updatingEditor": "Editörün güncellenmesi", + "skillManagement.detail.builder.promptDescription": "Bunu açıklayın ve editörde adımların ve dosyaların yer aldığı bir taslak görünecektir.", + "skillManagement.detail.builder.promptTitle": "Bu beceri neyi ele almalı?", + "skillManagement.detail.builder.readAloud": "Yanıtı yüksek sesle oku", + "skillManagement.detail.builder.removeAttachment": "{{name}} kaldır", + "skillManagement.detail.builder.restart": "Oluşturucuyu yeniden başlat", + "skillManagement.detail.builder.retryResponse": "Yanıtı yeniden dene", + "skillManagement.detail.builder.send": "Mesaj gönder", + "skillManagement.detail.builder.sendFailed": "Skill Builder yanıt veremedi.", + "skillManagement.detail.builder.thinking": "Düşünüyor", + "skillManagement.detail.builder.thinkingUnavailable": "Model tarafından hiçbir düşünme içeriği döndürülmedi.", + "skillManagement.detail.builder.title": "Skill Builder", + "skillManagement.detail.builder.tryExample": "Bir örnek deneyin", + "skillManagement.detail.builder.voice": "Sesli giriş", + "skillManagement.detail.builder.voiceUnavailable": "Ses girişi henüz kullanılamıyor.", + "skillManagement.detail.cancelAddMetadata": "Meta veri eklemeyi iptal et", + "skillManagement.detail.closeFileTab": "{{name}}'ı kapat", + "skillManagement.detail.closeVersions": "Sürümleri kapat", "skillManagement.detail.collapseSidebar": "Kenar çubuğunu daralt", - "skillManagement.detail.createFile": "New file", - "skillManagement.detail.createFileDescription": "Enter a file path relative to the skill root.", - "skillManagement.detail.createFileMenu": "New file...", - "skillManagement.detail.createFileSuccess": "File created.", - "skillManagement.detail.createFolder": "New folder", - "skillManagement.detail.createFolderDescription": "Enter a folder path relative to the skill root.", - "skillManagement.detail.createFolderMenu": "New folder...", - "skillManagement.detail.createFolderSuccess": "Folder created.", - "skillManagement.detail.createdBy": "Created by {{name}}", - "skillManagement.detail.currentDraft": "Current draft", - "skillManagement.detail.deleteFileConfirm": "Delete this file?", - "skillManagement.detail.deleteFileSuccess": "File deleted.", - "skillManagement.detail.deleteVersionConfirm": "Delete this version?", - "skillManagement.detail.deleteVersionFailed": "Failed to delete version.", - "skillManagement.detail.deleteVersionSuccess": "Version deleted.", - "skillManagement.detail.downloadFile": "Download file", - "skillManagement.detail.draft": "Draft", + "skillManagement.detail.copyContentSuccess": "İçerik panoya kopyalandı.", + "skillManagement.detail.copyFile": "Kopyala", + "skillManagement.detail.copyFileSuccess": "Dosya yapıştırmaya hazır.", + "skillManagement.detail.copyVersionId": "ID Kopyala", + "skillManagement.detail.copyVersionIdSuccess": "Kimlik panoya kopyalandı.", + "skillManagement.detail.createFile": "Yeni dosya", + "skillManagement.detail.createFileDescription": "Beceri köküne göre bir dosya yolu girin.", + "skillManagement.detail.createFileMenu": "Yeni dosya...", + "skillManagement.detail.createFileSuccess": "Dosya oluşturuldu.", + "skillManagement.detail.createFolder": "Yeni klasör", + "skillManagement.detail.createFolderDescription": "Beceri köküne göre bir klasör yolu girin.", + "skillManagement.detail.createFolderMenu": "Yeni klasör...", + "skillManagement.detail.createFolderSuccess": "Klasör oluşturuldu.", + "skillManagement.detail.createdBy": "{{name}} tarafından oluşturuldu", + "skillManagement.detail.currentDraft": "Mevcut taslak", + "skillManagement.detail.cutFile": "Kesmek", + "skillManagement.detail.cutFileSuccess": "Dosya taşınmaya hazır.", + "skillManagement.detail.deleteFileConfirm": "Bu dosya silinsin mi?", + "skillManagement.detail.deleteFileSuccess": "Dosya silindi.", + "skillManagement.detail.deleteVersionConfirm": "Bu sürüm silinsin mi?", + "skillManagement.detail.deleteVersionFailed": "Sürüm silinemedi.", + "skillManagement.detail.deleteVersionSuccess": "Sürüm silindi.", + "skillManagement.detail.downloadFile": "Dosyayı indir", + "skillManagement.detail.draft": "Taslak", + "skillManagement.detail.editVersionInfo": "Sürüm bilgilerini düzenle", + "skillManagement.detail.exitVersions": "Sürümlerden çık", "skillManagement.detail.expandSidebar": "Kenar çubuğunu genişlet", - "skillManagement.detail.fileCount": "{{count}} FILES", - "skillManagement.detail.fileMeta": "{{type}} · {{size}} bytes", - "skillManagement.detail.fileMissing": "File not found.", - "skillManagement.detail.fileOperationFailed": "File operation failed.", - "skillManagement.detail.files": "Files", - "skillManagement.detail.latest": "Latest", - "skillManagement.detail.loadFailed": "Failed to load skill.", - "skillManagement.detail.markdownLiveMode": "Live preview", - "skillManagement.detail.markdownSourceMode": "Source editor", - "skillManagement.detail.metadataKey": "name", - "skillManagement.detail.metadataValue": "value", - "skillManagement.detail.moveFileSuccess": "File moved.", - "skillManagement.detail.moveFilesSuccess": "Files moved.", - "skillManagement.detail.noFileSelected": "Select a file to preview.", - "skillManagement.detail.noFiles": "No files.", + "skillManagement.detail.fileAlreadyExists": "Bu ada sahip bir dosya veya klasör zaten mevcut.", + "skillManagement.detail.fileCount_one": "{{count}} dosyası", + "skillManagement.detail.fileCount_other": "{{count}} dosyaları", + "skillManagement.detail.fileMeta": "{{type}} · {{size}} bayt", + "skillManagement.detail.fileMissing": "Dosya bulunamadı.", + "skillManagement.detail.fileOperationFailed": "Dosya işlemi başarısız oldu.", + "skillManagement.detail.files": "Dosyalar", + "skillManagement.detail.latest": "Sonuncu", + "skillManagement.detail.loadFailed": "Beceri yüklenemedi.", + "skillManagement.detail.loadingTags": "Etiketler yükleniyor...", + "skillManagement.detail.markdownLiveMode": "Canlı önizleme", + "skillManagement.detail.markdownSourceMode": "Kaynak editörü", + "skillManagement.detail.metadataKey": "isim", + "skillManagement.detail.metadataValue": "değer", + "skillManagement.detail.moveFileSuccess": "Dosya taşındı.", + "skillManagement.detail.moveFilesSuccess": "Dosyalar taşındı.", + "skillManagement.detail.nameThisVersion": "Bu versiyona isim ver", + "skillManagement.detail.noFileSelected": "Önizlemek için bir dosya seçin.", + "skillManagement.detail.noFiles": "Dosya yok.", "skillManagement.detail.noSearchResults": "Eşleşen dosya yok.", - "skillManagement.detail.noVersions": "No published versions yet.", - "skillManagement.detail.previewUnsupported": "Preview is not supported for this file.", - "skillManagement.detail.publish": "Publish", - "skillManagement.detail.publishFailed": "Failed to publish skill.", - "skillManagement.detail.publishSuccess": "Skill published.", - "skillManagement.detail.published": "Published", + "skillManagement.detail.noSelectableTags": "Kullanılabilir etiket yok.", + "skillManagement.detail.noVersions": "Henüz yayınlanmış bir sürüm yok.", + "skillManagement.detail.pasteFile": "Yapıştır", + "skillManagement.detail.pasteFileSuccess": "Dosya yapıştırıldı.", + "skillManagement.detail.previewUnsupported": "Bu dosya önizlemeyi desteklemiyor.", + "skillManagement.detail.publish": "Yayınla", + "skillManagement.detail.publishFailed": "Beceri yayınlanamadı.", + "skillManagement.detail.publishReferencesDescription_one": "Bu beceriyi kullanan {{count}} aracısı için yayınlama hemen etkili olur.", + "skillManagement.detail.publishReferencesDescription_other": "Bu beceriyi kullanan {{count}} aracıları için yayınlama hemen etkili olur.", + "skillManagement.detail.publishReferencesTitle": "Beceriyi yayınla", + "skillManagement.detail.publishSuccess": "Skill yayınlandı.", + "skillManagement.detail.publishUpdate": "Güncellemeyi yayınla", + "skillManagement.detail.published": "Yayınlandı", "skillManagement.detail.publishedAt": "{{time}} yayınlandı", + "skillManagement.detail.publishedVersion": "Yayınlandı #{{number}}", "skillManagement.detail.publishing": "Yayınlanıyor...", - "skillManagement.detail.readonly": "Read only", - "skillManagement.detail.referenceFiles.confirm": "Enter Confirm", - "skillManagement.detail.referenceFiles.empty": "No files available.", - "skillManagement.detail.referenceFiles.livePlaceholder": "Write instructions for the agent, type / to reference files", - "skillManagement.detail.referenceFiles.navigate": "↑↓ Navigate", - "skillManagement.detail.referenceFiles.title": "Reference files", - "skillManagement.detail.referencedBy": "Referenced by {{count}} Apps", - "skillManagement.detail.removeMetadata": "Delete {{name}} metadata", - "skillManagement.detail.removeTag": "Remove {{tag}}", - "skillManagement.detail.removeTagSuccess": "Tag removed.", - "skillManagement.detail.renameFile": "Rename file", - "skillManagement.detail.renameFileDescription": "Enter the new path relative to the skill root.", - "skillManagement.detail.renameFileSuccess": "File renamed.", - "skillManagement.detail.renameSkillSuccess": "Skill renamed.", - "skillManagement.detail.renameVersion": "Rename", - "skillManagement.detail.renameVersionFailed": "Failed to rename version.", - "skillManagement.detail.renameVersionPrompt": "Version name", - "skillManagement.detail.renameVersionSuccess": "Version renamed.", - "skillManagement.detail.restoreVersion": "Restore", - "skillManagement.detail.restoreVersionFailed": "Failed to restore version.", - "skillManagement.detail.restoreVersionSuccess": "Version restored to draft.", - "skillManagement.detail.save": "Save", - "skillManagement.detail.saveFailed": "Failed to save file.", - "skillManagement.detail.saveSuccess": "File saved.", - "skillManagement.detail.saved": "Saved", - "skillManagement.detail.savedAt": "Saved {{time}}", - "skillManagement.detail.saving": "Saving...", + "skillManagement.detail.readonly": "Salt okunur", + "skillManagement.detail.referenceFiles.confirm": "Gir Onayla", + "skillManagement.detail.referenceFiles.empty": "Dosya yok.", + "skillManagement.detail.referenceFiles.livePlaceholder": "Temsilci için talimatlar yazın. Dosyalara referans vermek için / yazın.", + "skillManagement.detail.referenceFiles.navigate": "↑↓ Gezin", + "skillManagement.detail.referenceFiles.title": "Referans dosyaları", + "skillManagement.detail.referencedBy_one": "{{count}} Agent tarafından kullanılıyor", + "skillManagement.detail.referencedBy_other": "{{count}} Agent tarafından kullanılıyor", + "skillManagement.detail.removeMetadata": "{{name}} meta verilerini silin", + "skillManagement.detail.removeTag": "{{tag}} öğesini kaldır", + "skillManagement.detail.removeTagSuccess": "Etiket kaldırıldı.", + "skillManagement.detail.renameFile": "Dosyayı yeniden adlandır", + "skillManagement.detail.renameFileDescription": "Beceri köküne göre yeni yolu girin.", + "skillManagement.detail.renameFileSuccess": "Dosya yeniden adlandırıldı.", + "skillManagement.detail.renameSkillSuccess": "Skill yeniden adlandırıldı.", + "skillManagement.detail.renameVersion": "Yeniden Adlandır", + "skillManagement.detail.renameVersionFailed": "Sürüm yeniden adlandırılamadı.", + "skillManagement.detail.renameVersionPrompt": "Sürüm adı", + "skillManagement.detail.renameVersionSuccess": "Sürüm yeniden adlandırıldı.", + "skillManagement.detail.resizeSidebar": "Dosya kenar çubuğunu yeniden boyutlandır", + "skillManagement.detail.restoreVersion": "Geri yükle", + "skillManagement.detail.restoreVersionConfirmDescription": "Bu, mevcut taslağı \"{{version}}\" dosyasındaki dosyalarla değiştirecektir. Skill'yi yayınlamaz veya yeni bir sürüm oluşturmaz.", + "skillManagement.detail.restoreVersionConfirmTitle": "Bu sürüm geri yüklensin mi?", + "skillManagement.detail.restoreVersionFailed": "Sürüm geri yüklenemedi.", + "skillManagement.detail.restoreVersionSuccess": "Sürüm taslağa geri yüklendi.", + "skillManagement.detail.save": "Kaydet", + "skillManagement.detail.saveConflictConfirmDescription": "Bu beceri başka bir yerde güncellendi. Düzenlemeye devam etmek için en son taslağı yükleyin. Mevcut değişiklikleriniz silinecek.", + "skillManagement.detail.saveConflictConfirmTitle": "En son taslak yüklensin mi?", + "skillManagement.detail.saveConflictReload": "En son taslağı yükle", + "skillManagement.detail.saveConflictStatus": "Çakışma tespit edildi. Düzenlemeye devam etmek için en son taslağı yükleyin.", + "skillManagement.detail.saveFailed": "Dosya kaydedilemedi.", + "skillManagement.detail.saveSuccess": "Dosya kaydedildi.", + "skillManagement.detail.saved": "Kaydedildi", + "skillManagement.detail.savedAt": "{{time}} kaydedildi", + "skillManagement.detail.saving": "Kaydediliyor...", "skillManagement.detail.searchFiles": "Dosya ara", + "skillManagement.detail.showMoreReferences": "{{count}}'yi daha fazlasını göster", + "skillManagement.detail.skillDescriptionPlaceholder": "Bu becerinin ne işe yaradığını ve temsilcilerin bunu ne zaman kullanması gerektiğini açıklayın.", + "skillManagement.detail.skillNamePlaceholder": "Küçük harfler, sayılar ve kısa çizgiler kullanın.", "skillManagement.detail.unpublishedChanges": "Yayınlanmamış değişiklikler", - "skillManagement.detail.unsavedChanges": "Unsaved changes", + "skillManagement.detail.unsavedChanges": "Kaydedilmemiş değişiklikler", "skillManagement.detail.upToDate": "Güncel", - "skillManagement.detail.updateTagsFailed": "Failed to update tags.", - "skillManagement.detail.uploadFile": "Upload file", - "skillManagement.detail.uploadFileFailed": "File upload failed.", - "skillManagement.detail.uploadFileSuccess": "File uploaded.", - "skillManagement.detail.uploadFilesMenu": "Upload files...", + "skillManagement.detail.updateTagsFailed": "Etiketler güncellenemedi.", + "skillManagement.detail.uploadCheckFailed": "Bu dosyalar kontrol edilemedi. Tekrar deneyin.", + "skillManagement.detail.uploadConflict": "Bu isimde bir dosya zaten mevcut.", + "skillManagement.detail.uploadFailureSummary": "{{total}} dosyalarının {{failed}}'si başarısız oldu", + "skillManagement.detail.uploadFailureTitle": "Bazı yüklemeler başarısız oldu", + "skillManagement.detail.uploadFile": "Dosya yükle", + "skillManagement.detail.uploadFileFailed": "Dosya yükleme başarısız oldu.", + "skillManagement.detail.uploadFileSuccess": "Dosya yüklendi.", + "skillManagement.detail.uploadFilesButton": "{{count}} dosyalarını yükle", + "skillManagement.detail.uploadFilesFailedStatus_one": "{{count}} dosya yüklemesi başarısız oldu.", + "skillManagement.detail.uploadFilesFailedStatus_other": "{{count}} dosya yüklemeleri başarısız oldu.", + "skillManagement.detail.uploadFilesMenu": "Dosyaları yükle...", + "skillManagement.detail.uploadFilesProgress": "{{completed}}/{{total}} yükleniyor", + "skillManagement.detail.uploadFilesResult": "{{uploaded}} yüklendi · {{failed}} başarısız oldu", + "skillManagement.detail.uploadFilesStatus": "Yükleme Durumu", + "skillManagement.detail.uploadInvalidExtension": "Bu dosya türü desteklenmiyor.", + "skillManagement.detail.uploadInvalidName": "Geçersiz ad.", + "skillManagement.detail.uploadInvalidPath": "Geçersiz dosya yolu.", + "skillManagement.detail.uploadKeepBoth": "İkisini de sakla", + "skillManagement.detail.uploadLateConflict": "Siz yükleme yaparken birisi bu dosyayı ekledi.", + "skillManagement.detail.uploadMissingExtension": "Bir dosya uzantısı gereklidir.", + "skillManagement.detail.uploadNetworkFailure": "Yükleme başarısız oldu. Bağlantınızı kontrol edin.", + "skillManagement.detail.uploadReadySummary": "{{ready}} hazır · {{decisions}}'nin bir karara ihtiyacı var · {{skipped}} atlanacak", + "skillManagement.detail.uploadReplace": "Yer değiştirmek", + "skillManagement.detail.uploadResolvedSummary": "{{ready}} hazır · {{skipped}} atlanacak", + "skillManagement.detail.uploadRetryCount": "{{count}}'yi yeniden dene", + "skillManagement.detail.uploadReviewTitle": "Yüklemeden önce inceleyin", + "skillManagement.detail.uploadSkip": "Atla", + "skillManagement.detail.uploadSkippedGroup": "{{count}} dosyaları yüklenemiyor ve atlanacak", + "skillManagement.detail.uploadStatusDismiss": "Yükleme durumunu reddet", + "skillManagement.detail.uploadSuggestion": "Öneriyi kullan", + "skillManagement.detail.uploadWillReplace": "Mevcut dosyayı değiştirecek", + "skillManagement.detail.uploadWillUseName": "{{name}} olarak yüklenecek", + "skillManagement.detail.versionHistory": "Sürüm geçmişini aç", "skillManagement.detail.versionMeta": "{{hash}} · {{time}}", - "skillManagement.detail.versions": "Versions", - "skillManagement.draft": "Draft", - "skillManagement.duplicateFailed": "Failed to duplicate skill.", - "skillManagement.duplicateSuccess": "Skill duplicated.", - "skillManagement.editedAt": "Edited {{time}}", - "skillManagement.empty": "No skills yet", - "skillManagement.emptySearch": "No skills found", - "skillManagement.import": "Import", - "skillManagement.importFailed": "Failed to import skill.", - "skillManagement.importSuccess": "Skill imported.", - "skillManagement.listLabel": "Workspace skills", - "skillManagement.loadingError": "Failed to load skills", - "skillManagement.moreActions": "More actions for {{name}}", - "skillManagement.noTags": "No tags", - "skillManagement.publishedAt": "Published {{time}}", - "skillManagement.referenceCount": "{{count}} Refs", - "skillManagement.searchLabel": "Search skills", - "skillManagement.searchPlaceholder": "Search", - "skillManagement.tags": "Tags", - "skillManagement.title": "Skills" + "skillManagement.detail.versionPublishNote": "Sürüm notları", + "skillManagement.detail.versionPublishNotePlaceholder": "Bu değişikliği açıklayın", + "skillManagement.detail.versionPublishedMeta": "{{time}} · {{name}}", + "skillManagement.detail.versionTitle": "Başlık", + "skillManagement.detail.versions": "Sürümler", + "skillManagement.detail.viewOnly": "Yalnızca görüntüle", + "skillManagement.detail.viewUploadErrors": "Hataları görüntüle", + "skillManagement.draft": "Taslak", + "skillManagement.duplicateFailed": "Beceri kopyalanamadı.", + "skillManagement.duplicateSuccess": "Skill kopyalandı.", + "skillManagement.editedAt": "{{time}} düzenlendi", + "skillManagement.empty": "Henüz beceri yok", + "skillManagement.emptyAction.createDescription": "Bir senaryoyu basit kelimelerle tanımlayın ve gözden geçirebileceğiniz bir taslak becerisi edinin.", + "skillManagement.emptyAction.createTitle": "Skill Builder ile oluşturun", + "skillManagement.emptyAction.importDescription": "SKILL.md içeren, Agentskills.io formatında bir .zip dosyası getirin.", + "skillManagement.emptyAction.importTitle": "Bir beceri paketini içe aktar", + "skillManagement.emptySearch": "Hiçbir beceri bulunamadı", + "skillManagement.errors.missingSkillMd": "Bu pakette SKILL.md yok. Dosyayı ekleyin ve tekrar içe aktarın.", + "skillManagement.errors.nameConflict": "\"{{name}}\" adlı bir beceri zaten mevcut. SKILL.md'de yeniden adlandırın ve tekrar içe aktarın.", + "skillManagement.errors.workspaceLimit": "Çalışma alanınız 500 beceri sınırına ulaştı. Yeni bir beceri eklemek için bir beceriyi silin.", + "skillManagement.import": "İçe Aktar", + "skillManagement.importFailed": "Beceri içe aktarılamadı.", + "skillManagement.importSuccess": "Skill içe aktarıldı.", + "skillManagement.listLabel": "Çalışma alanı becerileri", + "skillManagement.loadingError": "Beceriler yüklenemedi", + "skillManagement.moreActions": "{{name}} için daha fazla eylem", + "skillManagement.noDescription": "Henüz açıklama yok", + "skillManagement.noTags": "Etiket yok", + "skillManagement.publishedAt": "{{time}} yayınlandı", + "skillManagement.referenceCount_one": "{{count}} Agent", + "skillManagement.referenceCount_other": "{{count}} Agent", + "skillManagement.searchLabel": "Becerileri ara", + "skillManagement.searchPlaceholder": "Ada veya açıklamaya göre arayın", + "skillManagement.tags": "Etiketler", + "skillManagement.title": "Beceriler" } diff --git a/web/i18n/uk-UA/agent-v-2.json b/web/i18n/uk-UA/agent-v-2.json index a1e7d5c91db..82f5a92e562 100644 --- a/web/i18n/uk-UA/agent-v-2.json +++ b/web/i18n/uk-UA/agent-v-2.json @@ -83,7 +83,7 @@ "agentDetail.configure.buildDraft.changesToApply_other": "{{count}} змін для застосування", "agentDetail.configure.buildDraft.discard": "Відхилити", "agentDetail.configure.buildDraft.modeBadge": "Режим збірки", - "agentDetail.configure.buildDraft.modeDescription": "Ви в режимі збірки. У цьому режимі Configure може оновлювати лише агент. Налаштуйте цю конфігурацію через чат праворуч, а потім застосуйте.", + "agentDetail.configure.buildDraft.modeDescription": "Ви в режимі збірки. Сформуйте це налаштування в чаті з агентом, а потім натисніть «Застосувати».", "agentDetail.configure.buildDraft.rewritten": "Переписано", "agentDetail.configure.buildDraft.title": "Чернетка збірки", "agentDetail.configure.buildDraft.updated": "Оновлено", @@ -105,7 +105,8 @@ "agentDetail.configure.files.preview.failed": "Не вдалося завантажити перегляд.", "agentDetail.configure.files.preview.unsupported": "Попередній перегляд цього файлу не підтримується.", "agentDetail.configure.files.remove": "Видалити {{name}}", - "agentDetail.configure.files.tip": "Для довідкових матеріалів, які занадто довгі для вставлення в Prompt: специфікації, шаблони, інструкції. Посилайтеся на них через / у Prompt.\n\nУ режимі Build агент може налаштувати це за вас.", + "agentDetail.configure.files.richTip": "Для довідкових матеріалів, які занадто довгі для вставлення в Prompt: специфікації, шаблони, інструкції. Докладніше\n\nУ режимі Build агент може налаштувати це за вас.", + "agentDetail.configure.files.tip": "Для довідкових матеріалів, які занадто довгі для вставлення в Prompt: специфікації, шаблони, інструкції. Докладніше\n\nУ режимі Build агент може налаштувати це за вас.", "agentDetail.configure.files.toggle": "Перемкнути файли", "agentDetail.configure.files.treeLabel": "Файли агента", "agentDetail.configure.files.upload.action": "Завантажити", @@ -114,7 +115,7 @@ "agentDetail.configure.files.upload.dropzone": "Перетягніть файл сюди або", "agentDetail.configure.files.upload.failed": "Не вдалося завантажити файл.", "agentDetail.configure.files.upload.fileType": "ФАЙЛ", - "agentDetail.configure.files.upload.invalidFile": "Завантажте один файл.", + "agentDetail.configure.files.upload.invalidFile": "За раз можна завантажити лише один файл.", "agentDetail.configure.files.upload.success": "Файл завантажено.", "agentDetail.configure.files.upload.title": "Завантажити файл", "agentDetail.configure.knowledgeRetrieval.add": "Додати пошук по знаннях", @@ -177,7 +178,8 @@ "agentDetail.configure.prompt.mention.priyaRamanathan": "Priya Ramanathan", "agentDetail.configure.prompt.placeholder": "Напишіть інструкції тут,", "agentDetail.configure.prompt.referenceMissing": "{{name}} не існує", - "agentDetail.configure.prompt.tip": "Визначте роль агента й опишіть його типове завдання. Використовуйте /, щоб явно посилатися на навички, файли, інструменти та пошук знань.", + "agentDetail.configure.prompt.richTip": "Визначте роль агента та спосіб його роботи. Докладніше", + "agentDetail.configure.prompt.tip": "Визначте роль агента та спосіб його роботи. Докладніше", "agentDetail.configure.publishBar.draft": "Чернетка", "agentDetail.configure.publishBar.publishUpdate": "Опублікувати оновлення", "agentDetail.configure.publishBar.published": "Опубліковано", @@ -190,12 +192,12 @@ "agentDetail.configure.publishBar.versionHistory": "Відкрити історію версій", "agentDetail.configure.publishImpact.affectedWorkflows": "Залучені робочі процеси", "agentDetail.configure.publishImpact.cancel": "Скасувати", - "agentDetail.configure.publishImpact.descriptionPrefix": "Ваш агент використовується в", - "agentDetail.configure.publishImpact.descriptionSuffix": ". Зміни вплинуть на них.", + "agentDetail.configure.publishImpact.descriptionPrefix": "Цей агент використовується в", + "agentDetail.configure.publishImpact.descriptionSuffix": ". Після публікації його буде оновлено в усіх цих робочих процесах.", "agentDetail.configure.publishImpact.fallbackAgentName": "цього агента", "agentDetail.configure.publishImpact.title": "{{action}} до {{name}}", - "agentDetail.configure.publishImpact.workflowCount_one": "{{count}} робочий процес", - "agentDetail.configure.publishImpact.workflowCount_other": "{{count}} робочих процесів", + "agentDetail.configure.publishImpact.workflowCount_one": "{{count}} робочому процесі", + "agentDetail.configure.publishImpact.workflowCount_other": "{{count}} робочих процесах", "agentDetail.configure.rightPanel.build": "Створення", "agentDetail.configure.rightPanel.buildTipBody": "Build налаштовує агента через чат. Опишіть, що потрібно, і він заповнить налаштування ліворуч.", "agentDetail.configure.rightPanel.buildTipTitle": "Створіть агента через чат", @@ -222,8 +224,8 @@ "agentDetail.configure.skills.openInLibrary": "Open in Skill library", "agentDetail.configure.skills.remove": "Видалити {{name}}", "agentDetail.configure.skills.removeAction": "Remove", - "agentDetail.configure.skills.richTip": "Запакуйте інструкції, файли та скрипти для повторюваного завдання в Skill. Посилайтеся на нього через / у Prompt. Докладніше\n\nУ режимі Build агент може налаштувати це за вас.", - "agentDetail.configure.skills.tip": "Запакуйте інструкції, файли та скрипти для повторюваного завдання в Skill. Посилайтеся на нього через / у Prompt. Докладніше\n\nУ режимі Build агент може налаштувати це за вас.", + "agentDetail.configure.skills.richTip": "Запакуйте інструкції, файли та скрипти для повторюваного завдання в Skill. Докладніше\n\nУ режимі Build агент може налаштувати це за вас.", + "agentDetail.configure.skills.tip": "Запакуйте інструкції, файли та скрипти для повторюваного завдання в Skill. Докладніше\n\nУ режимі Build агент може налаштувати це за вас.", "agentDetail.configure.skills.toggle": "Перемкнути навички", "agentDetail.configure.skills.upload.action": "Завантажити", "agentDetail.configure.skills.upload.browse": "огляд", @@ -269,8 +271,8 @@ "agentDetail.configure.tools.moreActions": "Більше дій для {{name}}", "agentDetail.configure.tools.removeAction": "Видалити {{name}}", "agentDetail.configure.tools.removeProvider": "Видалити всі інструменти", - "agentDetail.configure.tools.richTip": "Додайте інструменти Dify зі свого workspace. Посилайтеся на них через / у Prompt. Докладніше\n\nІнструменти, які агент встановлює у своїй sandbox, не з'являться тут, але залишаться йому доступними.", - "agentDetail.configure.tools.tip": "Додайте інструменти Dify зі свого workspace. Посилайтеся на них через / у Prompt. Докладніше\n\nІнструменти, які агент встановлює у своїй sandbox, не з'являться тут, але залишаться йому доступними.", + "agentDetail.configure.tools.richTip": "Додайте інструменти Dify зі свого workspace. Докладніше\n\nІнструменти, які агент встановлює у своїй sandbox, не з'являться тут, але залишаться йому доступними.", + "agentDetail.configure.tools.tip": "Додайте інструменти Dify зі свого workspace. Докладніше\n\nІнструменти, які агент встановлює у своїй sandbox, не з'являться тут, але залишаться йому доступними.", "agentDetail.configure.tools.toggle": "Перемкнути інструменти", "agentDetail.configure.tools.toolTabs.all": "Усі", "agentDetail.configure.tools.toolTabs.cli": "CLI", @@ -336,22 +338,22 @@ "agentDetail.metadata.sourceLabel": "Джерело", "agentDetail.monitoring.change": "{{value}} порівняно з попереднім періодом", "agentDetail.monitoring.dateRangeLabel": "Діапазон дат", - "agentDetail.monitoring.description": "Відстежуйте активність перевикористовного агента, вартість і якість взаємодії в робочих процесах.", + "agentDetail.monitoring.description": "Відстежуйте активність цього агента, витрати та якість взаємодії в усіх точках доступу.", "agentDetail.monitoring.learnMore": "Дізнатися більше", "agentDetail.monitoring.loadFailed": "Не вдалося завантажити дані моніторингу", - "agentDetail.monitoring.metrics.activeUsers.explanation": "Унікальні кінцеві користувачі, що запускали робочі процеси з цим агентом.", + "agentDetail.monitoring.metrics.activeUsers.explanation": "Унікальні кінцеві користувачі, які взаємодіяли з цим агентом.", "agentDetail.monitoring.metrics.activeUsers.title": "Активні користувачі", - "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Кількість безперервних взаємодій користувача з агентом для цієї точки доступу.", + "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Середня кількість повідомлень користувача на розмову.", "agentDetail.monitoring.metrics.avgSessionInteractions.title": "Сер. кількість взаємодій за сесію", - "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Середня швидкість виведення від початку запиту до завершення.", + "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Середня кількість токенів, згенерованих за секунду під час відповіді агента.", "agentDetail.monitoring.metrics.tokenOutputSpeed.title": "Швидкість виведення токенів", - "agentDetail.monitoring.metrics.tokenUsage.explanation": "Оціночна вартість токенів, створених цим агентом під час запусків робочих процесів.", + "agentDetail.monitoring.metrics.tokenUsage.explanation": "Спожиті токени та їхня орієнтовна вартість.", "agentDetail.monitoring.metrics.tokenUsage.title": "Використання токенів", "agentDetail.monitoring.metrics.totalConversations.explanation": "Щоденна кількість AI-розмов, що досягли цього агента через вибрану точку доступу.", "agentDetail.monitoring.metrics.totalConversations.title": "Усього розмов", - "agentDetail.monitoring.metrics.totalMessages.explanation": "Щоденна кількість взаємодій з агентом.", + "agentDetail.monitoring.metrics.totalMessages.explanation": "Загальна кількість повідомлень, надісланих користувачами цьому агенту.", "agentDetail.monitoring.metrics.totalMessages.title": "Усього повідомлень", - "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "Кількість лайків на 1000 повідомлень для цього агента.", + "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "Відсоток відповідей агента, які користувачі вподобали.", "agentDetail.monitoring.metrics.userSatisfactionRate.title": "Рівень задоволеності користувачів", "agentDetail.monitoring.pickSource": "Виберіть застосунок", "agentDetail.monitoring.sourceLabel": "Застосунок", @@ -549,7 +551,5 @@ "skillManagement.searchLabel": "Search skills", "skillManagement.searchPlaceholder": "Search", "skillManagement.tags": "Tags", - "skillManagement.title": "Skills", - "agentDetail.configure.files.richTip": "Для довідкових матеріалів, які занадто довгі для вставлення в Prompt: специфікації, шаблони, інструкції. Докладніше\n\nУ режимі Build агент може налаштувати це за вас.", - "agentDetail.configure.prompt.richTip": "Визначте роль агента та спосіб його роботи. Докладніше" + "skillManagement.title": "Skills" } diff --git a/web/i18n/uk-UA/skill.json b/web/i18n/uk-UA/skill.json index c80d98a35ca..cc6f7786614 100644 --- a/web/i18n/uk-UA/skill.json +++ b/web/i18n/uk-UA/skill.json @@ -1,121 +1,245 @@ { - "skillManagement.clearTags": "Clear tags", - "skillManagement.create": "Create", - "skillManagement.createFailed": "Failed to create skill.", - "skillManagement.createSuccess": "Skill created.", - "skillManagement.dateTimeFormat": "MMM D, YYYY HH:mm", + "skillManagement.clearTags": "Очистити теги", + "skillManagement.create": "Створити", + "skillManagement.createFailed": "Не вдалося створити навик.", + "skillManagement.createSuccess": "Чернетку створено.", + "skillManagement.dateTimeFormat": "Д МММ, РРРР ГГ:хв", "skillManagement.deleteDialog.confirmInputLabel": "Для підтвердження введіть {{skillName}} у поле нижче:", "skillManagement.deleteDialog.confirmInputPlaceholder": "Введіть відображуване ім’я Skill…", - "skillManagement.deleteDialog.description": "This skill will be removed from the workspace. Agents that reference it may lose access to this capability.", - "skillManagement.deleteDialog.title": "Delete {{name}}?", - "skillManagement.deleteFailed": "Failed to delete skill.", - "skillManagement.deleteSuccess": "Skill deleted.", - "skillManagement.detail.addMetadata": "Add metadata", - "skillManagement.detail.addMetadataDescription": "Add a frontmatter field to this Markdown file.", - "skillManagement.detail.addTag": "Add tag", - "skillManagement.detail.addTagDescription": "Create or bind a tag to this Skill. New tags are saved with the Skill metadata.", - "skillManagement.detail.addTagSuccess": "Tag added.", - "skillManagement.detail.back": "Back to Skills", - "skillManagement.detail.cancelAddMetadata": "Cancel adding metadata", - "skillManagement.detail.closeFileTab": "Close {{name}}", + "skillManagement.deleteDialog.description": "Видалення навику необоротне. Його вміст і повну історію версій буде остаточно видалено. Наразі жоден агент не використовує його.", + "skillManagement.deleteDialog.referencedDescription_one": "Агент {{count}} використовує цей навик самостійно або в робочому процесі. Видалення цього навику назавжди видалить його вміст і історію версій, а також видалить його з ураженого агента.", + "skillManagement.deleteDialog.referencedDescription_other": "Агенти {{count}} використовують цей навик самостійно або в робочих процесах. Видалення цього навику назавжди видалить його вміст і історію версій, а також видалить його з усіх постраждалих агентів.", + "skillManagement.deleteDialog.title": "Видалити {{name}}?", + "skillManagement.deleteFailed": "Не вдалося видалити навик.", + "skillManagement.deleteSuccess": "Skill видалено.", + "skillManagement.detail.addMetadata": "Додайте метадані", + "skillManagement.detail.addMetadataDescription": "Додайте поле frontmatter до цього файлу Markdown.", + "skillManagement.detail.addTag": "Додати тег", + "skillManagement.detail.addTagDescription": "Створіть або прив’яжіть тег до цього Skill. Нові теги зберігаються з метаданими Skill.", + "skillManagement.detail.addTagSuccess": "Тег додано.", + "skillManagement.detail.back": "Назад до Skills", + "skillManagement.detail.builder.applyFailed": "Не вдалося застосувати чернетки оновлень.", + "skillManagement.detail.builder.attach": "Прикріпити файл", + "skillManagement.detail.builder.attachFailed": "Не вдалося прикріпити файл.", + "skillManagement.detail.builder.attachLimit": "Ви можете прикріпити до 10 файлів.", + "skillManagement.detail.builder.attachTooLarge": "Файли мають бути не більше 15 Мб. Зображення мають бути 10 Мб або менше.", + "skillManagement.detail.builder.attachUnsupported": "Можна прикріплювати лише зображення, текст і файли документів.", + "skillManagement.detail.builder.attachmentOnlyMessage": "Використовуйте прикріплений файл, щоб допомогти вдосконалити цей навик.", + "skillManagement.detail.builder.close": "Закрийте Skill Builder", + "skillManagement.detail.builder.compatibleModelsOnly": "Показано лише сумісні моделі", + "skillManagement.detail.builder.copyResponse": "Копіювати відповідь", + "skillManagement.detail.builder.copySuccess": "Відповідь скопійовано в буфер обміну.", + "skillManagement.detail.builder.editIntro": "Я перевірив цей навик. Що б ви хотіли налаштувати?", + "skillManagement.detail.builder.exampleIssueTriage": "Сортування питань клієнта", + "skillManagement.detail.builder.exampleOnboarding": "Посібник із адаптації нового найму", + "skillManagement.detail.builder.exampleSalesFollowUp": "Стратегія подальших продажів", + "skillManagement.detail.builder.followUpDisplayName": "Використовуйте схвалення відшкодування як відображуване ім’я", + "skillManagement.detail.builder.followUpNameIcon": "Застосуйте запропоноване ім'я та значок", + "skillManagement.detail.builder.fromMarketplace": "З Marketplace", + "skillManagement.detail.builder.model": "GPT-4o", + "skillManagement.detail.builder.modelCredits.all": "Всі кредити", + "skillManagement.detail.builder.modelCredits.configure": "Потрібне налаштування", + "skillManagement.detail.builder.modelCredits.exhausted": "Квоту вичерпано", + "skillManagement.detail.builder.modelProviderSettings": "Налаштування постачальника моделей", + "skillManagement.detail.builder.modelSearch": "Пошук моделей...", + "skillManagement.detail.builder.modifyPlaceholder": "Попросіть ШІ змінити цей навик...", + "skillManagement.detail.builder.open": "Відкрийте Skill Builder", + "skillManagement.detail.builder.placeholder": "Опишіть сценарій...", + "skillManagement.detail.builder.progress.applyingChanges": "Застосування змін файлу", + "skillManagement.detail.builder.progress.generatingPlan": "Створення плану оновлення", + "skillManagement.detail.builder.progress.readingDraft": "Читання поточної чернетки", + "skillManagement.detail.builder.progress.updatingEditor": "Оновлення редактора", + "skillManagement.detail.builder.promptDescription": "Опишіть його, і в редакторі з’явиться чернетка з кроками та файлами.", + "skillManagement.detail.builder.promptTitle": "З чим повинен працювати цей навик?", + "skillManagement.detail.builder.readAloud": "Прочитайте відповідь вголос", + "skillManagement.detail.builder.removeAttachment": "Видалити {{name}}", + "skillManagement.detail.builder.restart": "Перезапустіть конструктор", + "skillManagement.detail.builder.retryResponse": "Повторити відповідь", + "skillManagement.detail.builder.send": "Надіслати повідомлення", + "skillManagement.detail.builder.sendFailed": "Skill Builder не відповів.", + "skillManagement.detail.builder.thinking": "Розмірковує", + "skillManagement.detail.builder.thinkingUnavailable": "Модель не повернула жодного змісту мислення.", + "skillManagement.detail.builder.title": "Skill Builder", + "skillManagement.detail.builder.tryExample": "Спробуйте приклад", + "skillManagement.detail.builder.voice": "Голосове введення", + "skillManagement.detail.builder.voiceUnavailable": "Голосове введення поки що недоступне.", + "skillManagement.detail.cancelAddMetadata": "Скасувати додавання метаданих", + "skillManagement.detail.closeFileTab": "Закрити {{name}}", + "skillManagement.detail.closeVersions": "Близькі версії", "skillManagement.detail.collapseSidebar": "Згорнути бічну панель", - "skillManagement.detail.createFile": "New file", - "skillManagement.detail.createFileDescription": "Enter a file path relative to the skill root.", - "skillManagement.detail.createFileMenu": "New file...", - "skillManagement.detail.createFileSuccess": "File created.", - "skillManagement.detail.createFolder": "New folder", - "skillManagement.detail.createFolderDescription": "Enter a folder path relative to the skill root.", - "skillManagement.detail.createFolderMenu": "New folder...", - "skillManagement.detail.createFolderSuccess": "Folder created.", - "skillManagement.detail.createdBy": "Created by {{name}}", - "skillManagement.detail.currentDraft": "Current draft", - "skillManagement.detail.deleteFileConfirm": "Delete this file?", - "skillManagement.detail.deleteFileSuccess": "File deleted.", - "skillManagement.detail.deleteVersionConfirm": "Delete this version?", - "skillManagement.detail.deleteVersionFailed": "Failed to delete version.", - "skillManagement.detail.deleteVersionSuccess": "Version deleted.", - "skillManagement.detail.downloadFile": "Download file", - "skillManagement.detail.draft": "Draft", + "skillManagement.detail.copyContentSuccess": "Вміст скопійовано в буфер обміну.", + "skillManagement.detail.copyFile": "Копіювати", + "skillManagement.detail.copyFileSuccess": "Файл готовий до вставки.", + "skillManagement.detail.copyVersionId": "Копіювати ідентифікатор", + "skillManagement.detail.copyVersionIdSuccess": "ID скопійовано в буфер обміну.", + "skillManagement.detail.createFile": "Новий файл", + "skillManagement.detail.createFileDescription": "Введіть шлях до файлу відносно кореня навички.", + "skillManagement.detail.createFileMenu": "Новий файл...", + "skillManagement.detail.createFileSuccess": "Файл створено.", + "skillManagement.detail.createFolder": "Нова папка", + "skillManagement.detail.createFolderDescription": "Введіть шлях до папки відносно кореня навички.", + "skillManagement.detail.createFolderMenu": "Нова папка...", + "skillManagement.detail.createFolderSuccess": "Папка створена.", + "skillManagement.detail.createdBy": "Автор: {{name}}", + "skillManagement.detail.currentDraft": "Актуальний проект", + "skillManagement.detail.cutFile": "Вирізати", + "skillManagement.detail.cutFileSuccess": "Файл готовий до переміщення.", + "skillManagement.detail.deleteFileConfirm": "Видалити цей файл?", + "skillManagement.detail.deleteFileSuccess": "Файл видалено.", + "skillManagement.detail.deleteVersionConfirm": "Видалити цю версію?", + "skillManagement.detail.deleteVersionFailed": "Не вдалося видалити версію.", + "skillManagement.detail.deleteVersionSuccess": "Версія видалена.", + "skillManagement.detail.downloadFile": "Завантажити файл", + "skillManagement.detail.draft": "Чернетка", + "skillManagement.detail.editVersionInfo": "Редагувати інформацію про версію", + "skillManagement.detail.exitVersions": "Вийти з версій", "skillManagement.detail.expandSidebar": "Розгорнути бічну панель", - "skillManagement.detail.fileCount": "{{count}} FILES", - "skillManagement.detail.fileMeta": "{{type}} · {{size}} bytes", - "skillManagement.detail.fileMissing": "File not found.", - "skillManagement.detail.fileOperationFailed": "File operation failed.", - "skillManagement.detail.files": "Files", - "skillManagement.detail.latest": "Latest", - "skillManagement.detail.loadFailed": "Failed to load skill.", - "skillManagement.detail.markdownLiveMode": "Live preview", - "skillManagement.detail.markdownSourceMode": "Source editor", - "skillManagement.detail.metadataKey": "name", - "skillManagement.detail.metadataValue": "value", - "skillManagement.detail.moveFileSuccess": "File moved.", - "skillManagement.detail.moveFilesSuccess": "Files moved.", - "skillManagement.detail.noFileSelected": "Select a file to preview.", - "skillManagement.detail.noFiles": "No files.", + "skillManagement.detail.fileAlreadyExists": "Файл або папка з такою назвою вже існує.", + "skillManagement.detail.fileCount_one": "файл {{count}}", + "skillManagement.detail.fileCount_other": "Файли {{count}}", + "skillManagement.detail.fileMeta": "{{type}} · {{size}} байт", + "skillManagement.detail.fileMissing": "Файл не знайдено.", + "skillManagement.detail.fileOperationFailed": "Помилка операції з файлом.", + "skillManagement.detail.files": "Файли", + "skillManagement.detail.latest": "Останні новини", + "skillManagement.detail.loadFailed": "Не вдалося завантажити навик.", + "skillManagement.detail.loadingTags": "Завантаження тегів...", + "skillManagement.detail.markdownLiveMode": "Попередній перегляд", + "skillManagement.detail.markdownSourceMode": "Редактор джерела", + "skillManagement.detail.metadataKey": "назва", + "skillManagement.detail.metadataValue": "значення", + "skillManagement.detail.moveFileSuccess": "Файл переміщено.", + "skillManagement.detail.moveFilesSuccess": "Файли переміщено.", + "skillManagement.detail.nameThisVersion": "Назвіть цю версію", + "skillManagement.detail.noFileSelected": "Виберіть файл для попереднього перегляду.", + "skillManagement.detail.noFiles": "Немає файлів.", "skillManagement.detail.noSearchResults": "Немає відповідних файлів.", - "skillManagement.detail.noVersions": "No published versions yet.", - "skillManagement.detail.previewUnsupported": "Preview is not supported for this file.", - "skillManagement.detail.publish": "Publish", - "skillManagement.detail.publishFailed": "Failed to publish skill.", - "skillManagement.detail.publishSuccess": "Skill published.", - "skillManagement.detail.published": "Published", + "skillManagement.detail.noSelectableTags": "Немає доступних тегів.", + "skillManagement.detail.noVersions": "Ще немає опублікованих версій.", + "skillManagement.detail.pasteFile": "Вставити", + "skillManagement.detail.pasteFileSuccess": "Файл вставлено.", + "skillManagement.detail.previewUnsupported": "Попередній перегляд цього файлу не підтримується.", + "skillManagement.detail.publish": "Опублікувати", + "skillManagement.detail.publishFailed": "Не вдалося опублікувати навик.", + "skillManagement.detail.publishReferencesDescription_one": "Публікація набуває чинності негайно для агента {{count}}, який використовує цей навик.", + "skillManagement.detail.publishReferencesDescription_other": "Публікація набуває чинності негайно для агентів {{count}}, які використовують цей навик.", + "skillManagement.detail.publishReferencesTitle": "Публікаційна майстерність", + "skillManagement.detail.publishSuccess": "Skill опубліковано.", + "skillManagement.detail.publishUpdate": "Опублікувати оновлення", + "skillManagement.detail.published": "Опубліковано", "skillManagement.detail.publishedAt": "Опубліковано {{time}}", + "skillManagement.detail.publishedVersion": "Опубліковано #{{number}}", "skillManagement.detail.publishing": "Публікація...", - "skillManagement.detail.readonly": "Read only", - "skillManagement.detail.referenceFiles.confirm": "Enter Confirm", - "skillManagement.detail.referenceFiles.empty": "No files available.", - "skillManagement.detail.referenceFiles.livePlaceholder": "Write instructions for the agent, type / to reference files", - "skillManagement.detail.referenceFiles.navigate": "↑↓ Navigate", - "skillManagement.detail.referenceFiles.title": "Reference files", - "skillManagement.detail.referencedBy": "Referenced by {{count}} Apps", - "skillManagement.detail.removeMetadata": "Delete {{name}} metadata", - "skillManagement.detail.removeTag": "Remove {{tag}}", - "skillManagement.detail.removeTagSuccess": "Tag removed.", - "skillManagement.detail.renameFile": "Rename file", - "skillManagement.detail.renameFileDescription": "Enter the new path relative to the skill root.", - "skillManagement.detail.renameFileSuccess": "File renamed.", - "skillManagement.detail.renameSkillSuccess": "Skill renamed.", - "skillManagement.detail.renameVersion": "Rename", - "skillManagement.detail.renameVersionFailed": "Failed to rename version.", - "skillManagement.detail.renameVersionPrompt": "Version name", - "skillManagement.detail.renameVersionSuccess": "Version renamed.", - "skillManagement.detail.restoreVersion": "Restore", - "skillManagement.detail.restoreVersionFailed": "Failed to restore version.", - "skillManagement.detail.restoreVersionSuccess": "Version restored to draft.", - "skillManagement.detail.save": "Save", - "skillManagement.detail.saveFailed": "Failed to save file.", - "skillManagement.detail.saveSuccess": "File saved.", - "skillManagement.detail.saved": "Saved", - "skillManagement.detail.savedAt": "Saved {{time}}", - "skillManagement.detail.saving": "Saving...", + "skillManagement.detail.readonly": "Тільки для читання", + "skillManagement.detail.referenceFiles.confirm": "Введіть Підтвердити", + "skillManagement.detail.referenceFiles.empty": "Немає доступних файлів.", + "skillManagement.detail.referenceFiles.livePlaceholder": "Напишіть інструкції для агента. Введіть / для посилань на файли.", + "skillManagement.detail.referenceFiles.navigate": "↑↓ Навігація", + "skillManagement.detail.referenceFiles.title": "Довідкові файли", + "skillManagement.detail.referencedBy_one": "Використовується {{count}} агентом", + "skillManagement.detail.referencedBy_other": "Використовується {{count}} агентами", + "skillManagement.detail.removeMetadata": "Видалити метадані {{name}}", + "skillManagement.detail.removeTag": "Видалити {{tag}}", + "skillManagement.detail.removeTagSuccess": "Тег видалено.", + "skillManagement.detail.renameFile": "Перейменувати файл", + "skillManagement.detail.renameFileDescription": "Введіть новий шлях відносно кореня навички.", + "skillManagement.detail.renameFileSuccess": "Файл перейменовано.", + "skillManagement.detail.renameSkillSuccess": "Skill перейменовано.", + "skillManagement.detail.renameVersion": "Перейменувати", + "skillManagement.detail.renameVersionFailed": "Не вдалося перейменувати версію.", + "skillManagement.detail.renameVersionPrompt": "Назва версії", + "skillManagement.detail.renameVersionSuccess": "Версію перейменовано.", + "skillManagement.detail.resizeSidebar": "Змінити розмір бічної панелі файлу", + "skillManagement.detail.restoreVersion": "Відновити", + "skillManagement.detail.restoreVersionConfirmDescription": "Це замінить поточну чернетку на файли з \"{{version}}\". Він не публікуватиме Skill або створюватиме нову версію.", + "skillManagement.detail.restoreVersionConfirmTitle": "Відновити цю версію?", + "skillManagement.detail.restoreVersionFailed": "Не вдалося відновити версію.", + "skillManagement.detail.restoreVersionSuccess": "Версію відновлено до чернетки.", + "skillManagement.detail.save": "Зберегти", + "skillManagement.detail.saveConflictConfirmDescription": "Цей навик було оновлено в іншому місці. Завантажте останню чернетку, щоб продовжити редагування. Ваші поточні зміни буде скасовано.", + "skillManagement.detail.saveConflictConfirmTitle": "Завантажити останню чернетку?", + "skillManagement.detail.saveConflictReload": "Завантажити останню чернетку", + "skillManagement.detail.saveConflictStatus": "Виявлено конфлікт. Завантажте останню чернетку, щоб продовжити редагування.", + "skillManagement.detail.saveFailed": "Не вдалося зберегти файл.", + "skillManagement.detail.saveSuccess": "Файл збережено.", + "skillManagement.detail.saved": "Збережено", + "skillManagement.detail.savedAt": "Збережено {{time}}", + "skillManagement.detail.saving": "Збереження...", "skillManagement.detail.searchFiles": "Пошук файлів", + "skillManagement.detail.showMoreReferences": "Показати {{count}} більше", + "skillManagement.detail.skillDescriptionPlaceholder": "Опишіть, що робить цей навик і коли агенти повинні його використовувати.", + "skillManagement.detail.skillNamePlaceholder": "Використовуйте малі літери, цифри та дефіси.", "skillManagement.detail.unpublishedChanges": "Неопубліковані зміни", - "skillManagement.detail.unsavedChanges": "Unsaved changes", + "skillManagement.detail.unsavedChanges": "Незбережені зміни", "skillManagement.detail.upToDate": "Актуально", - "skillManagement.detail.updateTagsFailed": "Failed to update tags.", - "skillManagement.detail.uploadFile": "Upload file", - "skillManagement.detail.uploadFileFailed": "File upload failed.", - "skillManagement.detail.uploadFileSuccess": "File uploaded.", - "skillManagement.detail.uploadFilesMenu": "Upload files...", + "skillManagement.detail.updateTagsFailed": "Не вдалося оновити теги.", + "skillManagement.detail.uploadCheckFailed": "Не вдалося перевірити ці файли. Спробуйте знову.", + "skillManagement.detail.uploadConflict": "Файл із такою назвою вже існує.", + "skillManagement.detail.uploadFailureSummary": "Збій файлів {{failed}} із {{total}}", + "skillManagement.detail.uploadFailureTitle": "Деякі завантаження не вдалося", + "skillManagement.detail.uploadFile": "Завантажити файл", + "skillManagement.detail.uploadFileFailed": "Помилка завантаження файлу.", + "skillManagement.detail.uploadFileSuccess": "Файл завантажено.", + "skillManagement.detail.uploadFilesButton": "Завантажте файли {{count}}", + "skillManagement.detail.uploadFilesFailedStatus_one": "Не вдалося завантажити файл {{count}}.", + "skillManagement.detail.uploadFilesFailedStatus_other": "Не вдалося завантажити файл {{count}}.", + "skillManagement.detail.uploadFilesMenu": "Завантажити файли...", + "skillManagement.detail.uploadFilesProgress": "Завантаження {{completed}}/{{total}}", + "skillManagement.detail.uploadFilesResult": "{{uploaded}} завантажено · {{failed}} не вдалося", + "skillManagement.detail.uploadFilesStatus": "Статус завантаження", + "skillManagement.detail.uploadInvalidExtension": "Цей тип файлу не підтримується.", + "skillManagement.detail.uploadInvalidName": "Недійсне ім'я.", + "skillManagement.detail.uploadInvalidPath": "Недійсний шлях до файлу.", + "skillManagement.detail.uploadKeepBoth": "Тримайте обидва", + "skillManagement.detail.uploadLateConflict": "Хтось додав цей файл під час завантаження.", + "skillManagement.detail.uploadMissingExtension": "Потрібне розширення файлу.", + "skillManagement.detail.uploadNetworkFailure": "Помилка завантаження. Перевірте підключення.", + "skillManagement.detail.uploadReadySummary": "{{ready}} готовий · {{decisions}} потребує рішення · {{skipped}} буде пропущено", + "skillManagement.detail.uploadReplace": "Замінити", + "skillManagement.detail.uploadResolvedSummary": "{{ready}} готовий · {{skipped}} буде пропущено", + "skillManagement.detail.uploadRetryCount": "Повторити {{count}}", + "skillManagement.detail.uploadReviewTitle": "Перегляньте перед завантаженням", + "skillManagement.detail.uploadSkip": "Корабель", + "skillManagement.detail.uploadSkippedGroup": "Файли {{count}} не можуть бути завантажені та будуть пропущені", + "skillManagement.detail.uploadStatusDismiss": "Відхилити статус завантаження", + "skillManagement.detail.uploadSuggestion": "Скористайтеся пропозицією", + "skillManagement.detail.uploadWillReplace": "Замінить існуючий файл", + "skillManagement.detail.uploadWillUseName": "Буде завантажено як {{name}}", + "skillManagement.detail.versionHistory": "Відкрити історію версій", "skillManagement.detail.versionMeta": "{{hash}} · {{time}}", - "skillManagement.detail.versions": "Versions", - "skillManagement.draft": "Draft", - "skillManagement.duplicateFailed": "Failed to duplicate skill.", - "skillManagement.duplicateSuccess": "Skill duplicated.", - "skillManagement.editedAt": "Edited {{time}}", - "skillManagement.empty": "No skills yet", - "skillManagement.emptySearch": "No skills found", - "skillManagement.import": "Import", - "skillManagement.importFailed": "Failed to import skill.", - "skillManagement.importSuccess": "Skill imported.", - "skillManagement.listLabel": "Workspace skills", - "skillManagement.loadingError": "Failed to load skills", - "skillManagement.moreActions": "More actions for {{name}}", - "skillManagement.noTags": "No tags", - "skillManagement.publishedAt": "Published {{time}}", - "skillManagement.referenceCount": "{{count}} Refs", - "skillManagement.searchLabel": "Search skills", - "skillManagement.searchPlaceholder": "Search", - "skillManagement.tags": "Tags", - "skillManagement.title": "Skills" + "skillManagement.detail.versionPublishNote": "Примітки до випуску", + "skillManagement.detail.versionPublishNotePlaceholder": "Опишіть цю зміну", + "skillManagement.detail.versionPublishedMeta": "{{time}} · {{name}}", + "skillManagement.detail.versionTitle": "Заголовок", + "skillManagement.detail.versions": "Версії", + "skillManagement.detail.viewOnly": "Тільки перегляд", + "skillManagement.detail.viewUploadErrors": "Переглянути помилки", + "skillManagement.draft": "Чернетка", + "skillManagement.duplicateFailed": "Не вдалося скопіювати навичку.", + "skillManagement.duplicateSuccess": "Skill дублюється.", + "skillManagement.editedAt": "Змінено {{time}}", + "skillManagement.empty": "Поки що немає навичок", + "skillManagement.emptyAction.createDescription": "Опишіть сценарій простими словами та отримайте навички чернетки для перегляду.", + "skillManagement.emptyAction.createTitle": "Створіть за допомогою Skill Builder", + "skillManagement.emptyAction.importDescription": "Принесіть .zip із SKILL.md у форматі agentskills.io.", + "skillManagement.emptyAction.importTitle": "Імпорт пакета навичок", + "skillManagement.emptySearch": "Навички не знайдено", + "skillManagement.errors.missingSkillMd": "Цей пакет не має SKILL.md. Додайте файл і імпортуйте його знову.", + "skillManagement.errors.nameConflict": "Уміння під назвою \"{{name}}\" уже існує. Перейменуйте його в SKILL.md і імпортуйте знову.", + "skillManagement.errors.workspaceLimit": "Ваша робоча область досягла ліміту в 500 навичок. Видаліть навик, щоб додати новий.", + "skillManagement.import": "Імпортувати", + "skillManagement.importFailed": "Не вдалося імпортувати навички.", + "skillManagement.importSuccess": "Skill імпортовано.", + "skillManagement.listLabel": "Навички роботи", + "skillManagement.loadingError": "Не вдалося завантажити навички", + "skillManagement.moreActions": "Більше дій для {{name}}", + "skillManagement.noDescription": "Опису ще немає", + "skillManagement.noTags": "Без тегів", + "skillManagement.publishedAt": "Опубліковано {{time}}", + "skillManagement.referenceCount_one": "{{count}} агент", + "skillManagement.referenceCount_other": "{{count}} агентів", + "skillManagement.searchLabel": "Пошук навичок", + "skillManagement.searchPlaceholder": "Пошук за назвою або описом", + "skillManagement.tags": "Теги", + "skillManagement.title": "Навички" } diff --git a/web/i18n/vi-VN/agent-v-2.json b/web/i18n/vi-VN/agent-v-2.json index 3db85a9a3e7..c890a2f3673 100644 --- a/web/i18n/vi-VN/agent-v-2.json +++ b/web/i18n/vi-VN/agent-v-2.json @@ -83,7 +83,7 @@ "agentDetail.configure.buildDraft.changesToApply_other": "{{count}} thay đổi để áp dụng", "agentDetail.configure.buildDraft.discard": "Hủy bỏ", "agentDetail.configure.buildDraft.modeBadge": "Chế độ build", - "agentDetail.configure.buildDraft.modeDescription": "Bạn đang ở chế độ build. Configure chỉ có thể được cập nhật bởi tác nhân trong chế độ này. Điều chỉnh thiết lập này qua khung chat bên phải, rồi Áp dụng.", + "agentDetail.configure.buildDraft.modeDescription": "Bạn đang ở chế độ build. Định hình thiết lập này bằng cách trò chuyện với tác nhân, sau đó chọn Áp dụng.", "agentDetail.configure.buildDraft.rewritten": "Đã viết lại", "agentDetail.configure.buildDraft.title": "Bản nháp build", "agentDetail.configure.buildDraft.updated": "Đã cập nhật", @@ -105,7 +105,8 @@ "agentDetail.configure.files.preview.failed": "Tải xem trước thất bại.", "agentDetail.configure.files.preview.unsupported": "Tệp này không hỗ trợ xem trước.", "agentDetail.configure.files.remove": "Xóa {{name}}", - "agentDetail.configure.files.tip": "Dành cho tài liệu tham khảo quá dài để dán vào Prompt: thông số, mẫu, hướng dẫn. Tham chiếu bằng / trong Prompt.\n\nỞ chế độ Build, tác nhân có thể thiết lập những mục này cho bạn.", + "agentDetail.configure.files.richTip": "Dành cho tài liệu tham khảo quá dài để dán vào Prompt: thông số, mẫu, hướng dẫn. Tìm hiểu thêm\n\nỞ chế độ Build, tác nhân có thể thiết lập những mục này cho bạn.", + "agentDetail.configure.files.tip": "Dành cho tài liệu tham khảo quá dài để dán vào Prompt: thông số, mẫu, hướng dẫn. Tìm hiểu thêm\n\nỞ chế độ Build, tác nhân có thể thiết lập những mục này cho bạn.", "agentDetail.configure.files.toggle": "Bật/tắt tệp", "agentDetail.configure.files.treeLabel": "Tệp tác nhân", "agentDetail.configure.files.upload.action": "Tải lên", @@ -114,7 +115,7 @@ "agentDetail.configure.files.upload.dropzone": "Thả một tệp vào đây, hoặc", "agentDetail.configure.files.upload.failed": "Tải lên tệp thất bại.", "agentDetail.configure.files.upload.fileType": "FILE", - "agentDetail.configure.files.upload.invalidFile": "Tải lên một tệp.", + "agentDetail.configure.files.upload.invalidFile": "Mỗi lần chỉ có thể tải lên một tệp.", "agentDetail.configure.files.upload.success": "Đã tải lên tệp.", "agentDetail.configure.files.upload.title": "Tải lên tệp", "agentDetail.configure.knowledgeRetrieval.add": "Thêm truy xuất kiến thức", @@ -177,7 +178,8 @@ "agentDetail.configure.prompt.mention.priyaRamanathan": "Priya Ramanathan", "agentDetail.configure.prompt.placeholder": "Viết hướng dẫn tại đây,", "agentDetail.configure.prompt.referenceMissing": "{{name}} không tồn tại", - "agentDetail.configure.prompt.tip": "Xác định vai trò của tác nhân và mô tả nhiệm vụ điển hình của nó. Dùng / để tham chiếu rõ ràng đến Skills, Files, Tools và Knowledge Retrievals.", + "agentDetail.configure.prompt.richTip": "Xác định vai trò của tác nhân và cách tác nhân hoạt động. Tìm hiểu thêm", + "agentDetail.configure.prompt.tip": "Xác định vai trò của tác nhân và cách tác nhân hoạt động. Tìm hiểu thêm", "agentDetail.configure.publishBar.draft": "Bản nháp", "agentDetail.configure.publishBar.publishUpdate": "Xuất bản cập nhật", "agentDetail.configure.publishBar.published": "Đã xuất bản", @@ -190,8 +192,8 @@ "agentDetail.configure.publishBar.versionHistory": "Mở lịch sử phiên bản", "agentDetail.configure.publishImpact.affectedWorkflows": "Quy trình làm việc bị ảnh hưởng", "agentDetail.configure.publishImpact.cancel": "Hủy", - "agentDetail.configure.publishImpact.descriptionPrefix": "Tác nhân của bạn xuất hiện trong", - "agentDetail.configure.publishImpact.descriptionSuffix": ". Các thay đổi sẽ ảnh hưởng đến chúng.", + "agentDetail.configure.publishImpact.descriptionPrefix": "Tác nhân này được sử dụng trong", + "agentDetail.configure.publishImpact.descriptionSuffix": ". Khi xuất bản, tác nhân sẽ được cập nhật trong tất cả các quy trình đó.", "agentDetail.configure.publishImpact.fallbackAgentName": "tác nhân này", "agentDetail.configure.publishImpact.title": "{{action}} đến {{name}}", "agentDetail.configure.publishImpact.workflowCount_one": "{{count}} quy trình làm việc", @@ -222,8 +224,8 @@ "agentDetail.configure.skills.openInLibrary": "Open in Skill library", "agentDetail.configure.skills.remove": "Xóa {{name}}", "agentDetail.configure.skills.removeAction": "Remove", - "agentDetail.configure.skills.richTip": "Đóng gói hướng dẫn, tệp và script cho một tác vụ lặp lại thành skill. Tham chiếu bằng / trong Prompt. Tìm hiểu thêm\n\nỞ chế độ Build, tác nhân có thể thiết lập những mục này cho bạn.", - "agentDetail.configure.skills.tip": "Đóng gói hướng dẫn, tệp và script cho một tác vụ lặp lại thành skill. Tham chiếu bằng / trong Prompt. Tìm hiểu thêm\n\nỞ chế độ Build, tác nhân có thể thiết lập những mục này cho bạn.", + "agentDetail.configure.skills.richTip": "Đóng gói hướng dẫn, tệp và script cho một tác vụ lặp lại thành skill. Tìm hiểu thêm\n\nỞ chế độ Build, tác nhân có thể thiết lập những mục này cho bạn.", + "agentDetail.configure.skills.tip": "Đóng gói hướng dẫn, tệp và script cho một tác vụ lặp lại thành skill. Tìm hiểu thêm\n\nỞ chế độ Build, tác nhân có thể thiết lập những mục này cho bạn.", "agentDetail.configure.skills.toggle": "Bật/tắt kỹ năng", "agentDetail.configure.skills.upload.action": "Tải lên", "agentDetail.configure.skills.upload.browse": "duyệt", @@ -269,8 +271,8 @@ "agentDetail.configure.tools.moreActions": "Thêm hành động cho {{name}}", "agentDetail.configure.tools.removeAction": "Xóa {{name}}", "agentDetail.configure.tools.removeProvider": "Xóa tất cả công cụ", - "agentDetail.configure.tools.richTip": "Thêm công cụ Dify từ workspace của bạn. Tham chiếu bằng / trong Prompt. Tìm hiểu thêm\n\nNhững công cụ tác nhân cài đặt trong sandbox sẽ không xuất hiện ở đây nhưng vẫn khả dụng cho tác nhân.", - "agentDetail.configure.tools.tip": "Thêm công cụ Dify từ workspace của bạn. Tham chiếu bằng / trong Prompt. Tìm hiểu thêm\n\nNhững công cụ tác nhân cài đặt trong sandbox sẽ không xuất hiện ở đây nhưng vẫn khả dụng cho tác nhân.", + "agentDetail.configure.tools.richTip": "Thêm công cụ Dify từ workspace của bạn. Tìm hiểu thêm\n\nNhững công cụ tác nhân cài đặt trong sandbox sẽ không xuất hiện ở đây nhưng vẫn khả dụng cho tác nhân.", + "agentDetail.configure.tools.tip": "Thêm công cụ Dify từ workspace của bạn. Tìm hiểu thêm\n\nNhững công cụ tác nhân cài đặt trong sandbox sẽ không xuất hiện ở đây nhưng vẫn khả dụng cho tác nhân.", "agentDetail.configure.tools.toggle": "Bật/tắt công cụ", "agentDetail.configure.tools.toolTabs.all": "Tất cả", "agentDetail.configure.tools.toolTabs.cli": "CLI", @@ -336,22 +338,22 @@ "agentDetail.metadata.sourceLabel": "Nguồn", "agentDetail.monitoring.change": "{{value}} so với kỳ trước", "agentDetail.monitoring.dateRangeLabel": "Khoảng ngày", - "agentDetail.monitoring.description": "Theo dõi hoạt động, chi phí và chất lượng tương tác của tác nhân có thể tái sử dụng trên các quy trình làm việc.", + "agentDetail.monitoring.description": "Theo dõi hoạt động, chi phí và chất lượng tương tác của tác nhân này trên tất cả các điểm truy cập.", "agentDetail.monitoring.learnMore": "Tìm hiểu thêm", "agentDetail.monitoring.loadFailed": "Không tải được dữ liệu giám sát", - "agentDetail.monitoring.metrics.activeUsers.explanation": "Số người dùng cuối duy nhất đã kích hoạt các quy trình làm việc sử dụng tác nhân này.", + "agentDetail.monitoring.metrics.activeUsers.explanation": "Số người dùng cuối riêng biệt đã tương tác với tác nhân này.", "agentDetail.monitoring.metrics.activeUsers.title": "Người dùng đang hoạt động", - "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Số lần giao tiếp liên tục giữa người dùng và tác nhân cho điểm truy cập này.", + "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Số tin nhắn trung bình của người dùng trong mỗi cuộc trò chuyện.", "agentDetail.monitoring.metrics.avgSessionInteractions.title": "Tương tác trung bình mỗi phiên", - "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Tốc độ đầu ra trung bình từ khi bắt đầu yêu cầu đến khi hoàn thành.", + "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Số token trung bình được tạo ra mỗi giây trong khi tác nhân trả lời.", "agentDetail.monitoring.metrics.tokenOutputSpeed.title": "Tốc độ đầu ra token", - "agentDetail.monitoring.metrics.tokenUsage.explanation": "Chi phí token ước tính được tạo ra bởi tác nhân này qua các lần chạy quy trình làm việc.", + "agentDetail.monitoring.metrics.tokenUsage.explanation": "Số token đã tiêu thụ và chi phí ước tính.", "agentDetail.monitoring.metrics.tokenUsage.title": "Sử dụng token", "agentDetail.monitoring.metrics.totalConversations.explanation": "Cuộc trò chuyện AI hàng ngày đến tác nhân này qua điểm truy cập đã chọn.", "agentDetail.monitoring.metrics.totalConversations.title": "Tổng số cuộc trò chuyện", - "agentDetail.monitoring.metrics.totalMessages.explanation": "Số lần tương tác tác nhân hàng ngày.", + "agentDetail.monitoring.metrics.totalMessages.explanation": "Tổng số tin nhắn người dùng đã gửi đến tác nhân này.", "agentDetail.monitoring.metrics.totalMessages.title": "Tổng số tin nhắn", - "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "Số lượt thích trên 1.000 tin nhắn cho tác nhân này.", + "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "Tỷ lệ phần trăm câu trả lời của tác nhân được người dùng nhấn thích.", "agentDetail.monitoring.metrics.userSatisfactionRate.title": "Tỷ lệ hài lòng của người dùng", "agentDetail.monitoring.pickSource": "Chọn một ứng dụng", "agentDetail.monitoring.sourceLabel": "Ứng dụng", @@ -549,7 +551,5 @@ "skillManagement.searchLabel": "Search skills", "skillManagement.searchPlaceholder": "Search", "skillManagement.tags": "Tags", - "skillManagement.title": "Skills", - "agentDetail.configure.files.richTip": "Dành cho tài liệu tham khảo quá dài để dán vào Prompt: thông số, mẫu, hướng dẫn. Tìm hiểu thêm\n\nỞ chế độ Build, tác nhân có thể thiết lập những mục này cho bạn.", - "agentDetail.configure.prompt.richTip": "Xác định vai trò của tác nhân và cách tác nhân hoạt động. Tìm hiểu thêm" + "skillManagement.title": "Skills" } diff --git a/web/i18n/vi-VN/skill.json b/web/i18n/vi-VN/skill.json index 27df30504be..fad3325b186 100644 --- a/web/i18n/vi-VN/skill.json +++ b/web/i18n/vi-VN/skill.json @@ -1,121 +1,245 @@ { - "skillManagement.clearTags": "Clear tags", - "skillManagement.create": "Create", - "skillManagement.createFailed": "Failed to create skill.", - "skillManagement.createSuccess": "Skill created.", + "skillManagement.clearTags": "Xóa thẻ", + "skillManagement.create": "Tạo", + "skillManagement.createFailed": "Không tạo được kỹ năng.", + "skillManagement.createSuccess": "Đã tạo bản nháp.", "skillManagement.dateTimeFormat": "MMM D, YYYY HH:mm", "skillManagement.deleteDialog.confirmInputLabel": "Để xác nhận, hãy nhập {{skillName}} vào ô bên dưới:", "skillManagement.deleteDialog.confirmInputPlaceholder": "Nhập tên hiển thị của Skill…", - "skillManagement.deleteDialog.description": "This skill will be removed from the workspace. Agents that reference it may lose access to this capability.", - "skillManagement.deleteDialog.title": "Delete {{name}}?", - "skillManagement.deleteFailed": "Failed to delete skill.", - "skillManagement.deleteSuccess": "Skill deleted.", - "skillManagement.detail.addMetadata": "Add metadata", - "skillManagement.detail.addMetadataDescription": "Add a frontmatter field to this Markdown file.", - "skillManagement.detail.addTag": "Add tag", - "skillManagement.detail.addTagDescription": "Create or bind a tag to this Skill. New tags are saved with the Skill metadata.", - "skillManagement.detail.addTagSuccess": "Tag added.", - "skillManagement.detail.back": "Back to Skills", - "skillManagement.detail.cancelAddMetadata": "Cancel adding metadata", - "skillManagement.detail.closeFileTab": "Close {{name}}", + "skillManagement.deleteDialog.description": "Việc xóa kỹ năng là không thể thay đổi được. Nội dung và lịch sử phiên bản đầy đủ của nó sẽ bị xóa vĩnh viễn. Không có đại lý hiện đang sử dụng nó.", + "skillManagement.deleteDialog.referencedDescription_one": "Đặc vụ {{count}} đang sử dụng kỹ năng này một cách độc lập hoặc trong quy trình làm việc. Xóa kỹ năng này sẽ xóa vĩnh viễn nội dung và lịch sử phiên bản của nó, đồng thời xóa nó khỏi tác nhân bị ảnh hưởng.", + "skillManagement.deleteDialog.referencedDescription_other": "Các đặc vụ {{count}} đang sử dụng kỹ năng này một cách độc lập hoặc trong quy trình làm việc. Xóa kỹ năng này sẽ xóa vĩnh viễn nội dung và lịch sử phiên bản của nó, đồng thời xóa nó khỏi tất cả các tác nhân bị ảnh hưởng.", + "skillManagement.deleteDialog.title": "Xóa {{name}}?", + "skillManagement.deleteFailed": "Không thể xóa kỹ năng.", + "skillManagement.deleteSuccess": "Skill đã xóa.", + "skillManagement.detail.addMetadata": "Thêm siêu dữ liệu", + "skillManagement.detail.addMetadataDescription": "Thêm trường frontmatter vào tệp Markdown này.", + "skillManagement.detail.addTag": "Thêm thẻ", + "skillManagement.detail.addTagDescription": "Tạo hoặc liên kết thẻ với Skill này. Các thẻ mới được lưu với siêu dữ liệu Skill.", + "skillManagement.detail.addTagSuccess": "Đã thêm thẻ.", + "skillManagement.detail.back": "Quay lại Skills", + "skillManagement.detail.builder.applyFailed": "Không áp dụng được bản cập nhật nháp.", + "skillManagement.detail.builder.attach": "Đính kèm tập tin", + "skillManagement.detail.builder.attachFailed": "Không thể đính kèm tập tin.", + "skillManagement.detail.builder.attachLimit": "Bạn có thể đính kèm tối đa 10 tập tin.", + "skillManagement.detail.builder.attachTooLarge": "Tệp phải có dung lượng 15 MB hoặc nhỏ hơn. Hình ảnh phải có dung lượng từ 10 MB trở xuống.", + "skillManagement.detail.builder.attachUnsupported": "Chỉ có thể đính kèm các tệp hình ảnh, văn bản và tài liệu.", + "skillManagement.detail.builder.attachmentOnlyMessage": "Sử dụng file đính kèm để giúp cải thiện kỹ năng này.", + "skillManagement.detail.builder.close": "Đóng Skill Builder", + "skillManagement.detail.builder.compatibleModelsOnly": "Chỉ hiển thị các mô hình tương thích", + "skillManagement.detail.builder.copyResponse": "Sao chép phản hồi", + "skillManagement.detail.builder.copySuccess": "Đã sao chép phản hồi vào bảng nhớ tạm.", + "skillManagement.detail.builder.editIntro": "Tôi đã xem lại kỹ năng này. Bạn muốn điều chỉnh gì?", + "skillManagement.detail.builder.exampleIssueTriage": "Phân loại vấn đề của khách hàng", + "skillManagement.detail.builder.exampleOnboarding": "Hướng dẫn làm quen với nhân viên mới", + "skillManagement.detail.builder.exampleSalesFollowUp": "Chiến lược theo dõi khách hàng tiềm năng bán hàng", + "skillManagement.detail.builder.followUpDisplayName": "Sử dụng Phê duyệt hoàn tiền làm tên hiển thị", + "skillManagement.detail.builder.followUpNameIcon": "Áp dụng tên và biểu tượng được đề xuất", + "skillManagement.detail.builder.fromMarketplace": "Từ Marketplace", + "skillManagement.detail.builder.model": "GPT-4o", + "skillManagement.detail.builder.modelCredits.all": "Tất cả các khoản tín dụng", + "skillManagement.detail.builder.modelCredits.configure": "Cần cấu hình", + "skillManagement.detail.builder.modelCredits.exhausted": "Quota đã hết", + "skillManagement.detail.builder.modelProviderSettings": "Cài đặt nhà cung cấp mô hình", + "skillManagement.detail.builder.modelSearch": "Tìm kiếm mô hình...", + "skillManagement.detail.builder.modifyPlaceholder": "Yêu cầu AI sửa đổi kỹ năng này...", + "skillManagement.detail.builder.open": "Mở Skill Builder", + "skillManagement.detail.builder.placeholder": "Hãy mô tả tình huống...", + "skillManagement.detail.builder.progress.applyingChanges": "Áp dụng thay đổi tập tin", + "skillManagement.detail.builder.progress.generatingPlan": "Tạo kế hoạch cập nhật", + "skillManagement.detail.builder.progress.readingDraft": "Đọc bản thảo hiện tại", + "skillManagement.detail.builder.progress.updatingEditor": "Cập nhật trình soạn thảo", + "skillManagement.detail.builder.promptDescription": "Hãy mô tả nó và một bản nháp sẽ xuất hiện trong trình chỉnh sửa, kèm theo các bước và tệp.", + "skillManagement.detail.builder.promptTitle": "Kỹ năng này nên xử lý những gì?", + "skillManagement.detail.builder.readAloud": "Đọc to câu trả lời", + "skillManagement.detail.builder.removeAttachment": "Xóa {{name}}", + "skillManagement.detail.builder.restart": "Khởi động lại trình tạo", + "skillManagement.detail.builder.retryResponse": "Thử lại phản hồi", + "skillManagement.detail.builder.send": "Gửi tin nhắn", + "skillManagement.detail.builder.sendFailed": "Skill Builder không phản hồi.", + "skillManagement.detail.builder.thinking": "Đang suy nghĩ", + "skillManagement.detail.builder.thinkingUnavailable": "Không có nội dung suy nghĩ nào được mô hình trả về.", + "skillManagement.detail.builder.title": "Skill Builder", + "skillManagement.detail.builder.tryExample": "Hãy thử một ví dụ", + "skillManagement.detail.builder.voice": "Nhập bằng giọng nói", + "skillManagement.detail.builder.voiceUnavailable": "Tính năng nhập bằng giọng nói hiện chưa khả dụng.", + "skillManagement.detail.cancelAddMetadata": "Hủy thêm siêu dữ liệu", + "skillManagement.detail.closeFileTab": "Đóng {{name}}", + "skillManagement.detail.closeVersions": "Đóng phiên bản", "skillManagement.detail.collapseSidebar": "Thu gọn thanh bên", - "skillManagement.detail.createFile": "New file", - "skillManagement.detail.createFileDescription": "Enter a file path relative to the skill root.", - "skillManagement.detail.createFileMenu": "New file...", - "skillManagement.detail.createFileSuccess": "File created.", - "skillManagement.detail.createFolder": "New folder", - "skillManagement.detail.createFolderDescription": "Enter a folder path relative to the skill root.", - "skillManagement.detail.createFolderMenu": "New folder...", - "skillManagement.detail.createFolderSuccess": "Folder created.", - "skillManagement.detail.createdBy": "Created by {{name}}", - "skillManagement.detail.currentDraft": "Current draft", - "skillManagement.detail.deleteFileConfirm": "Delete this file?", - "skillManagement.detail.deleteFileSuccess": "File deleted.", - "skillManagement.detail.deleteVersionConfirm": "Delete this version?", - "skillManagement.detail.deleteVersionFailed": "Failed to delete version.", - "skillManagement.detail.deleteVersionSuccess": "Version deleted.", - "skillManagement.detail.downloadFile": "Download file", - "skillManagement.detail.draft": "Draft", + "skillManagement.detail.copyContentSuccess": "Nội dung được sao chép vào clipboard.", + "skillManagement.detail.copyFile": "Sao chép", + "skillManagement.detail.copyFileSuccess": "Tệp đã sẵn sàng để dán.", + "skillManagement.detail.copyVersionId": "Sao chép ID", + "skillManagement.detail.copyVersionIdSuccess": "Đã sao chép ID vào bảng nhớ tạm.", + "skillManagement.detail.createFile": "Tập tin mới", + "skillManagement.detail.createFileDescription": "Nhập đường dẫn tệp liên quan đến gốc kỹ năng.", + "skillManagement.detail.createFileMenu": "Tập tin mới...", + "skillManagement.detail.createFileSuccess": "Đã tạo tệp.", + "skillManagement.detail.createFolder": "Thư mục mới", + "skillManagement.detail.createFolderDescription": "Nhập đường dẫn thư mục liên quan đến thư mục gốc của kỹ năng.", + "skillManagement.detail.createFolderMenu": "Thư mục mới...", + "skillManagement.detail.createFolderSuccess": "Đã tạo thư mục.", + "skillManagement.detail.createdBy": "Được tạo bởi {{name}}", + "skillManagement.detail.currentDraft": "bản nháp hiện tại", + "skillManagement.detail.cutFile": "Cắt", + "skillManagement.detail.cutFileSuccess": "Tệp đã sẵn sàng để di chuyển.", + "skillManagement.detail.deleteFileConfirm": "Xóa tập tin này?", + "skillManagement.detail.deleteFileSuccess": "Tập tin đã bị xóa.", + "skillManagement.detail.deleteVersionConfirm": "Xóa phiên bản này?", + "skillManagement.detail.deleteVersionFailed": "Không xóa được phiên bản.", + "skillManagement.detail.deleteVersionSuccess": "Phiên bản đã bị xóa.", + "skillManagement.detail.downloadFile": "Tải tập tin xuống", + "skillManagement.detail.draft": "Bản nháp", + "skillManagement.detail.editVersionInfo": "Chỉnh sửa thông tin phiên bản", + "skillManagement.detail.exitVersions": "Thoát phiên bản", "skillManagement.detail.expandSidebar": "Mở rộng thanh bên", - "skillManagement.detail.fileCount": "{{count}} FILES", - "skillManagement.detail.fileMeta": "{{type}} · {{size}} bytes", - "skillManagement.detail.fileMissing": "File not found.", - "skillManagement.detail.fileOperationFailed": "File operation failed.", - "skillManagement.detail.files": "Files", - "skillManagement.detail.latest": "Latest", - "skillManagement.detail.loadFailed": "Failed to load skill.", - "skillManagement.detail.markdownLiveMode": "Live preview", - "skillManagement.detail.markdownSourceMode": "Source editor", - "skillManagement.detail.metadataKey": "name", - "skillManagement.detail.metadataValue": "value", - "skillManagement.detail.moveFileSuccess": "File moved.", - "skillManagement.detail.moveFilesSuccess": "Files moved.", - "skillManagement.detail.noFileSelected": "Select a file to preview.", - "skillManagement.detail.noFiles": "No files.", + "skillManagement.detail.fileAlreadyExists": "Tệp hoặc thư mục có tên này đã tồn tại.", + "skillManagement.detail.fileCount_one": "Tệp {{count}}", + "skillManagement.detail.fileCount_other": "Các tập tin {{count}}", + "skillManagement.detail.fileMeta": "{{type}} · {{size}} byte", + "skillManagement.detail.fileMissing": "Không tìm thấy tập tin.", + "skillManagement.detail.fileOperationFailed": "Thao tác với tệp không thành công.", + "skillManagement.detail.files": "Tệp", + "skillManagement.detail.latest": "Mới nhất", + "skillManagement.detail.loadFailed": "Không thể tải kỹ năng.", + "skillManagement.detail.loadingTags": "Đang tải thẻ...", + "skillManagement.detail.markdownLiveMode": "Xem trước trực tiếp", + "skillManagement.detail.markdownSourceMode": "Trình chỉnh sửa nguồn", + "skillManagement.detail.metadataKey": "tên", + "skillManagement.detail.metadataValue": "giá trị", + "skillManagement.detail.moveFileSuccess": "Đã di chuyển tệp.", + "skillManagement.detail.moveFilesSuccess": "Các tập tin đã được di chuyển.", + "skillManagement.detail.nameThisVersion": "Đặt tên cho phiên bản này", + "skillManagement.detail.noFileSelected": "Chọn một tập tin để xem trước.", + "skillManagement.detail.noFiles": "Không có tập tin.", "skillManagement.detail.noSearchResults": "Không có tệp phù hợp.", - "skillManagement.detail.noVersions": "No published versions yet.", - "skillManagement.detail.previewUnsupported": "Preview is not supported for this file.", - "skillManagement.detail.publish": "Publish", - "skillManagement.detail.publishFailed": "Failed to publish skill.", - "skillManagement.detail.publishSuccess": "Skill published.", - "skillManagement.detail.published": "Published", + "skillManagement.detail.noSelectableTags": "Không có thẻ có sẵn.", + "skillManagement.detail.noVersions": "Chưa có phiên bản nào được công bố.", + "skillManagement.detail.pasteFile": "Dán", + "skillManagement.detail.pasteFileSuccess": "Đã dán tệp.", + "skillManagement.detail.previewUnsupported": "Tệp này không hỗ trợ xem trước.", + "skillManagement.detail.publish": "Xuất bản", + "skillManagement.detail.publishFailed": "Không thể xuất bản kỹ năng.", + "skillManagement.detail.publishReferencesDescription_one": "Việc xuất bản có hiệu lực ngay lập tức đối với đặc vụ {{count}} sử dụng kỹ năng này.", + "skillManagement.detail.publishReferencesDescription_other": "Việc xuất bản có hiệu lực ngay lập tức đối với các đặc vụ {{count}} sử dụng kỹ năng này.", + "skillManagement.detail.publishReferencesTitle": "Kỹ năng xuất bản", + "skillManagement.detail.publishSuccess": "Skill đã xuất bản.", + "skillManagement.detail.publishUpdate": "Xuất bản cập nhật", + "skillManagement.detail.published": "Đã xuất bản", "skillManagement.detail.publishedAt": "Đã phát hành {{time}}", + "skillManagement.detail.publishedVersion": "Đã xuất bản #{{number}}", "skillManagement.detail.publishing": "Đang phát hành...", - "skillManagement.detail.readonly": "Read only", - "skillManagement.detail.referenceFiles.confirm": "Enter Confirm", - "skillManagement.detail.referenceFiles.empty": "No files available.", - "skillManagement.detail.referenceFiles.livePlaceholder": "Write instructions for the agent, type / to reference files", - "skillManagement.detail.referenceFiles.navigate": "↑↓ Navigate", - "skillManagement.detail.referenceFiles.title": "Reference files", - "skillManagement.detail.referencedBy": "Referenced by {{count}} Apps", - "skillManagement.detail.removeMetadata": "Delete {{name}} metadata", - "skillManagement.detail.removeTag": "Remove {{tag}}", - "skillManagement.detail.removeTagSuccess": "Tag removed.", - "skillManagement.detail.renameFile": "Rename file", - "skillManagement.detail.renameFileDescription": "Enter the new path relative to the skill root.", - "skillManagement.detail.renameFileSuccess": "File renamed.", - "skillManagement.detail.renameSkillSuccess": "Skill renamed.", - "skillManagement.detail.renameVersion": "Rename", - "skillManagement.detail.renameVersionFailed": "Failed to rename version.", - "skillManagement.detail.renameVersionPrompt": "Version name", - "skillManagement.detail.renameVersionSuccess": "Version renamed.", - "skillManagement.detail.restoreVersion": "Restore", - "skillManagement.detail.restoreVersionFailed": "Failed to restore version.", - "skillManagement.detail.restoreVersionSuccess": "Version restored to draft.", - "skillManagement.detail.save": "Save", - "skillManagement.detail.saveFailed": "Failed to save file.", - "skillManagement.detail.saveSuccess": "File saved.", - "skillManagement.detail.saved": "Saved", - "skillManagement.detail.savedAt": "Saved {{time}}", - "skillManagement.detail.saving": "Saving...", + "skillManagement.detail.readonly": "Chỉ đọc", + "skillManagement.detail.referenceFiles.confirm": "Nhập xác nhận", + "skillManagement.detail.referenceFiles.empty": "Không có tập tin nào có sẵn.", + "skillManagement.detail.referenceFiles.livePlaceholder": "Viết hướng dẫn cho đại lý. Nhập / để tham khảo các tập tin.", + "skillManagement.detail.referenceFiles.navigate": "↑↓ Điều hướng", + "skillManagement.detail.referenceFiles.title": "Tệp tham khảo", + "skillManagement.detail.referencedBy_one": "Được {{count}} Agent sử dụng", + "skillManagement.detail.referencedBy_other": "Được {{count}} Agent sử dụng", + "skillManagement.detail.removeMetadata": "Xóa siêu dữ liệu {{name}}", + "skillManagement.detail.removeTag": "Xóa {{tag}}", + "skillManagement.detail.removeTagSuccess": "Đã xóa thẻ.", + "skillManagement.detail.renameFile": "Đổi tên tập tin", + "skillManagement.detail.renameFileDescription": "Nhập đường dẫn mới liên quan đến gốc kỹ năng.", + "skillManagement.detail.renameFileSuccess": "Đã đổi tên tập tin.", + "skillManagement.detail.renameSkillSuccess": "Skill đã đổi tên.", + "skillManagement.detail.renameVersion": "Đổi tên", + "skillManagement.detail.renameVersionFailed": "Không đổi tên được phiên bản.", + "skillManagement.detail.renameVersionPrompt": "Tên phiên bản", + "skillManagement.detail.renameVersionSuccess": "Phiên bản được đổi tên.", + "skillManagement.detail.resizeSidebar": "Thay đổi kích thước thanh bên tập tin", + "skillManagement.detail.restoreVersion": "Khôi phục", + "skillManagement.detail.restoreVersionConfirmDescription": "Điều này sẽ thay thế bản nháp hiện tại bằng các tệp từ \"{{version}}\". Nó sẽ không xuất bản Skill hoặc tạo phiên bản mới.", + "skillManagement.detail.restoreVersionConfirmTitle": "Khôi phục phiên bản này?", + "skillManagement.detail.restoreVersionFailed": "Không thể khôi phục phiên bản.", + "skillManagement.detail.restoreVersionSuccess": "Phiên bản được khôi phục về bản nháp.", + "skillManagement.detail.save": "Lưu", + "skillManagement.detail.saveConflictConfirmDescription": "Kỹ năng này đã được cập nhật ở nơi khác. Tải bản nháp mới nhất để tiếp tục chỉnh sửa. Những thay đổi hiện tại của bạn sẽ bị loại bỏ.", + "skillManagement.detail.saveConflictConfirmTitle": "Tải bản nháp mới nhất?", + "skillManagement.detail.saveConflictReload": "Tải bản nháp mới nhất", + "skillManagement.detail.saveConflictStatus": "Xung đột được phát hiện. Tải bản nháp mới nhất để tiếp tục chỉnh sửa.", + "skillManagement.detail.saveFailed": "Không lưu được tập tin.", + "skillManagement.detail.saveSuccess": "Đã lưu tệp.", + "skillManagement.detail.saved": "Đã lưu", + "skillManagement.detail.savedAt": "Đã lưu {{time}}", + "skillManagement.detail.saving": "Đang lưu...", "skillManagement.detail.searchFiles": "Tìm kiếm tệp", + "skillManagement.detail.showMoreReferences": "Hiển thị thêm {{count}}", + "skillManagement.detail.skillDescriptionPlaceholder": "Mô tả kỹ năng này làm gì và khi nào nhân viên nên sử dụng nó.", + "skillManagement.detail.skillNamePlaceholder": "Sử dụng chữ thường, số và dấu gạch nối.", "skillManagement.detail.unpublishedChanges": "Thay đổi chưa phát hành", - "skillManagement.detail.unsavedChanges": "Unsaved changes", + "skillManagement.detail.unsavedChanges": "Những thay đổi chưa được lưu", "skillManagement.detail.upToDate": "Đã cập nhật", - "skillManagement.detail.updateTagsFailed": "Failed to update tags.", - "skillManagement.detail.uploadFile": "Upload file", - "skillManagement.detail.uploadFileFailed": "File upload failed.", - "skillManagement.detail.uploadFileSuccess": "File uploaded.", - "skillManagement.detail.uploadFilesMenu": "Upload files...", + "skillManagement.detail.updateTagsFailed": "Không thể cập nhật thẻ.", + "skillManagement.detail.uploadCheckFailed": "Không thể kiểm tra các tập tin này. Hãy thử lại.", + "skillManagement.detail.uploadConflict": "Một tập tin có tên này đã tồn tại.", + "skillManagement.detail.uploadFailureSummary": "{{failed}} của các tệp {{total}} không thành công", + "skillManagement.detail.uploadFailureTitle": "Một số lần tải lên không thành công", + "skillManagement.detail.uploadFile": "Tải lên tệp", + "skillManagement.detail.uploadFileFailed": "Tải tệp lên không thành công.", + "skillManagement.detail.uploadFileSuccess": "Đã tải lên tệp.", + "skillManagement.detail.uploadFilesButton": "Tải lên tệp {{count}}", + "skillManagement.detail.uploadFilesFailedStatus_one": "Tải lên tệp {{count}} không thành công.", + "skillManagement.detail.uploadFilesFailedStatus_other": "Tải lên tệp {{count}} không thành công.", + "skillManagement.detail.uploadFilesMenu": "Tải tập tin lên...", + "skillManagement.detail.uploadFilesProgress": "Đang tải lên {{completed}}/{{total}}", + "skillManagement.detail.uploadFilesResult": "{{uploaded}} đã tải lên · {{failed}} không thành công", + "skillManagement.detail.uploadFilesStatus": "Trạng thái tải lên", + "skillManagement.detail.uploadInvalidExtension": "Loại tệp này không được hỗ trợ.", + "skillManagement.detail.uploadInvalidName": "Tên không hợp lệ.", + "skillManagement.detail.uploadInvalidPath": "Đường dẫn tập tin không hợp lệ.", + "skillManagement.detail.uploadKeepBoth": "Giữ cả hai", + "skillManagement.detail.uploadLateConflict": "Ai đó đã thêm tệp này khi bạn đang tải lên.", + "skillManagement.detail.uploadMissingExtension": "Cần có phần mở rộng tập tin.", + "skillManagement.detail.uploadNetworkFailure": "Tải lên không thành công. Kiểm tra kết nối của bạn.", + "skillManagement.detail.uploadReadySummary": "{{ready}} đã sẵn sàng · {{decisions}} cần quyết định · {{skipped}} sẽ bị bỏ qua", + "skillManagement.detail.uploadReplace": "Thay thế", + "skillManagement.detail.uploadResolvedSummary": "{{ready}} đã sẵn sàng · {{skipped}} sẽ bị bỏ qua", + "skillManagement.detail.uploadRetryCount": "Thử lại {{count}}", + "skillManagement.detail.uploadReviewTitle": "Xem xét trước khi tải lên", + "skillManagement.detail.uploadSkip": "Tàu", + "skillManagement.detail.uploadSkippedGroup": "Không thể tải lên các tệp {{count}} và sẽ bị bỏ qua", + "skillManagement.detail.uploadStatusDismiss": "Loại bỏ trạng thái tải lên", + "skillManagement.detail.uploadSuggestion": "Sử dụng gợi ý", + "skillManagement.detail.uploadWillReplace": "Sẽ thay thế tập tin hiện có", + "skillManagement.detail.uploadWillUseName": "Sẽ tải lên dưới dạng {{name}}", + "skillManagement.detail.versionHistory": "Mở lịch sử phiên bản", "skillManagement.detail.versionMeta": "{{hash}} · {{time}}", - "skillManagement.detail.versions": "Versions", - "skillManagement.draft": "Draft", - "skillManagement.duplicateFailed": "Failed to duplicate skill.", - "skillManagement.duplicateSuccess": "Skill duplicated.", - "skillManagement.editedAt": "Edited {{time}}", - "skillManagement.empty": "No skills yet", - "skillManagement.emptySearch": "No skills found", - "skillManagement.import": "Import", - "skillManagement.importFailed": "Failed to import skill.", - "skillManagement.importSuccess": "Skill imported.", - "skillManagement.listLabel": "Workspace skills", - "skillManagement.loadingError": "Failed to load skills", - "skillManagement.moreActions": "More actions for {{name}}", - "skillManagement.noTags": "No tags", - "skillManagement.publishedAt": "Published {{time}}", - "skillManagement.referenceCount": "{{count}} Refs", - "skillManagement.searchLabel": "Search skills", - "skillManagement.searchPlaceholder": "Search", - "skillManagement.tags": "Tags", - "skillManagement.title": "Skills" + "skillManagement.detail.versionPublishNote": "Ghi chú phát hành", + "skillManagement.detail.versionPublishNotePlaceholder": "Mô tả sự thay đổi này", + "skillManagement.detail.versionPublishedMeta": "{{time}} · {{name}}", + "skillManagement.detail.versionTitle": "Tiêu đề", + "skillManagement.detail.versions": "Phiên bản", + "skillManagement.detail.viewOnly": "Chỉ xem", + "skillManagement.detail.viewUploadErrors": "Xem lỗi", + "skillManagement.draft": "Bản nháp", + "skillManagement.duplicateFailed": "Không thể nhân đôi kỹ năng.", + "skillManagement.duplicateSuccess": "Skill trùng lặp.", + "skillManagement.editedAt": "Đã chỉnh sửa {{time}}", + "skillManagement.empty": "Chưa có kỹ năng nào", + "skillManagement.emptyAction.createDescription": "Mô tả một kịch bản bằng những từ ngữ đơn giản và có được kỹ năng phác thảo để xem xét.", + "skillManagement.emptyAction.createTitle": "Tạo với Skill Builder", + "skillManagement.emptyAction.importDescription": "Mang theo .zip với SKILL.md, ở định dạng Agentskills.io.", + "skillManagement.emptyAction.importTitle": "Nhập gói kỹ năng", + "skillManagement.emptySearch": "Không tìm thấy kỹ năng nào", + "skillManagement.errors.missingSkillMd": "Gói này không có SKILL.md. Thêm tệp và nhập lại.", + "skillManagement.errors.nameConflict": "Một kỹ năng có tên \"{{name}}\" đã tồn tại. Đổi tên nó thành SKILL.md và nhập lại.", + "skillManagement.errors.workspaceLimit": "Không gian làm việc của bạn đã đạt đến giới hạn 500 kỹ năng. Xóa một kỹ năng để thêm một kỹ năng mới.", + "skillManagement.import": "Nhập", + "skillManagement.importFailed": "Không thể nhập kỹ năng.", + "skillManagement.importSuccess": "Skill đã nhập.", + "skillManagement.listLabel": "Kỹ năng không gian làm việc", + "skillManagement.loadingError": "Không thể tải kỹ năng", + "skillManagement.moreActions": "Thêm hành động cho {{name}}", + "skillManagement.noDescription": "Chưa có mô tả", + "skillManagement.noTags": "Không có thẻ", + "skillManagement.publishedAt": "Đã xuất bản {{time}}", + "skillManagement.referenceCount_one": "{{count}} Agent", + "skillManagement.referenceCount_other": "{{count}} Agent", + "skillManagement.searchLabel": "Tìm kiếm kỹ năng", + "skillManagement.searchPlaceholder": "Tìm kiếm theo tên hoặc mô tả", + "skillManagement.tags": "Thẻ", + "skillManagement.title": "Kỹ năng" } diff --git a/web/i18n/zh-Hans/agent-v-2.json b/web/i18n/zh-Hans/agent-v-2.json index 6d32561bbc8..942adcdf9d9 100644 --- a/web/i18n/zh-Hans/agent-v-2.json +++ b/web/i18n/zh-Hans/agent-v-2.json @@ -83,7 +83,7 @@ "agentDetail.configure.buildDraft.changesToApply_other": "{{count}} 项变更待应用", "agentDetail.configure.buildDraft.discard": "放弃", "agentDetail.configure.buildDraft.modeBadge": "构建模式", - "agentDetail.configure.buildDraft.modeDescription": "你正在使用构建模式。在此模式下,Configure 只能由 Agent 更新。通过右侧聊天调整此配置,然后应用。", + "agentDetail.configure.buildDraft.modeDescription": "当前处于构建模式。请与 Agent 对话来构建配置,完成后点击应用。", "agentDetail.configure.buildDraft.rewritten": "已重写", "agentDetail.configure.buildDraft.title": "Build 草稿", "agentDetail.configure.buildDraft.updated": "已更新", @@ -105,7 +105,8 @@ "agentDetail.configure.files.preview.failed": "预览加载失败。", "agentDetail.configure.files.preview.unsupported": "该文件不支持预览。", "agentDetail.configure.files.remove": "移除 {{name}}", - "agentDetail.configure.files.tip": "上传过长、不适合放入提示词的参考资料:规格、模板、指南。在提示词中用 / 引用。\n\n在构建模式中,Agent 可帮你完成这些设置。", + "agentDetail.configure.files.richTip": "上传过长、不适合放入提示词的参考资料:规格、模板、指南。了解更多\n\n在构建模式中,Agent 可帮你完成这些设置。", + "agentDetail.configure.files.tip": "上传过长、不适合放入提示词的参考资料:规格、模板、指南。了解更多\n\n在构建模式中,Agent 可帮你完成这些设置。", "agentDetail.configure.files.toggle": "展开或收起文件", "agentDetail.configure.files.treeLabel": "Agent 文件", "agentDetail.configure.files.upload.action": "上传", @@ -114,7 +115,7 @@ "agentDetail.configure.files.upload.dropzone": "拖入文件,或", "agentDetail.configure.files.upload.failed": "文件上传失败。", "agentDetail.configure.files.upload.fileType": "文件", - "agentDetail.configure.files.upload.invalidFile": "请上传一个文件。", + "agentDetail.configure.files.upload.invalidFile": "一次只能上传一个文件。", "agentDetail.configure.files.upload.success": "文件已上传。", "agentDetail.configure.files.upload.title": "上传文件", "agentDetail.configure.knowledgeRetrieval.add": "添加知识检索", @@ -177,7 +178,8 @@ "agentDetail.configure.prompt.mention.priyaRamanathan": "Priya Ramanathan", "agentDetail.configure.prompt.placeholder": "在此编写指令,", "agentDetail.configure.prompt.referenceMissing": "{{name}} 不存在", - "agentDetail.configure.prompt.tip": "定义 Agent 的角色,并描述它的典型任务。使用 / 显式引用 Skill、文件、工具和知识检索。", + "agentDetail.configure.prompt.richTip": "设定 Agent 的角色和工作方式。了解更多", + "agentDetail.configure.prompt.tip": "设定 Agent 的角色和工作方式。了解更多", "agentDetail.configure.publishBar.draft": "草稿", "agentDetail.configure.publishBar.publishUpdate": "发布更新", "agentDetail.configure.publishBar.published": "已发布", @@ -190,8 +192,8 @@ "agentDetail.configure.publishBar.versionHistory": "打开版本历史", "agentDetail.configure.publishImpact.affectedWorkflows": "受影响的工作流", "agentDetail.configure.publishImpact.cancel": "取消", - "agentDetail.configure.publishImpact.descriptionPrefix": "你的 Agent 出现在", - "agentDetail.configure.publishImpact.descriptionSuffix": "中。更改会影响它们。", + "agentDetail.configure.publishImpact.descriptionPrefix": "该 Agent 被", + "agentDetail.configure.publishImpact.descriptionSuffix": "使用。发布后,将在所有工作流中更新。", "agentDetail.configure.publishImpact.fallbackAgentName": "此 Agent", "agentDetail.configure.publishImpact.title": "{{action}}到 {{name}}", "agentDetail.configure.publishImpact.workflowCount_one": "{{count}} 个工作流", @@ -224,8 +226,8 @@ "agentDetail.configure.skills.openInLibrary": "在 Skill 库中打开", "agentDetail.configure.skills.remove": "移除 {{name}}", "agentDetail.configure.skills.removeAction": "移除", - "agentDetail.configure.skills.richTip": "将重复任务所需的指令、文件和脚本打包成 Skill。在提示词中用 / 引用。了解更多\n\n在构建模式中,Agent 可帮你完成这些设置。", - "agentDetail.configure.skills.tip": "将重复任务所需的指令、文件和脚本打包成 Skill。在提示词中用 / 引用。了解更多\n\n在构建模式中,Agent 可帮你完成这些设置。", + "agentDetail.configure.skills.richTip": "将重复任务所需的指令、文件和脚本打包成 Skill。了解更多\n\n在构建模式中,Agent 可帮你完成这些设置。", + "agentDetail.configure.skills.tip": "将重复任务所需的指令、文件和脚本打包成 Skill。了解更多\n\n在构建模式中,Agent 可帮你完成这些设置。", "agentDetail.configure.skills.toggle": "展开或收起 Skill", "agentDetail.configure.skills.upload.action": "上传", "agentDetail.configure.skills.upload.browse": "选择", @@ -243,7 +245,8 @@ "agentDetail.configure.skills.workspaceSelector.addSuccess": "Workspace Skill 已添加。", "agentDetail.configure.skills.workspaceSelector.added": "已添加", "agentDetail.configure.skills.workspaceSelector.draft": "Draft", - "agentDetail.configure.skills.workspaceSelector.empty": "未找到 Workspace Skill。", + "agentDetail.configure.skills.workspaceSelector.empty": "Skill 库中未找到匹配项。", + "agentDetail.configure.skills.workspaceSelector.limitReached": "每个 Agent 最多可从 Skill 库添加 20 个 Skill。请先移除一个 Skill,再添加新 Skill。", "agentDetail.configure.skills.workspaceSelector.manage": "在 Skills 中管理", "agentDetail.configure.skills.workspaceSelector.removeSuccess": "Workspace Skill 已移除。", "agentDetail.configure.skills.workspaceSelector.saveFailed": "Workspace Skill 更新失败。", @@ -280,8 +283,8 @@ "agentDetail.configure.tools.moreActions": "{{name}} 的更多操作", "agentDetail.configure.tools.removeAction": "移除 {{name}}", "agentDetail.configure.tools.removeProvider": "移除所有工具", - "agentDetail.configure.tools.richTip": "添加工作空间中的 Dify 工具。在提示词中用 / 引用。了解更多\n\nAgent 在沙箱中自行安装的工具不会显示在这里,但仍然可用。", - "agentDetail.configure.tools.tip": "添加工作空间中的 Dify 工具。在提示词中用 / 引用。了解更多\n\nAgent 在沙箱中自行安装的工具不会显示在这里,但仍然可用。", + "agentDetail.configure.tools.richTip": "添加工作空间中的 Dify 工具。了解更多\n\nAgent 在沙箱中自行安装的工具不会显示在这里,但仍然可用。", + "agentDetail.configure.tools.tip": "添加工作空间中的 Dify 工具。了解更多\n\nAgent 在沙箱中自行安装的工具不会显示在这里,但仍然可用。", "agentDetail.configure.tools.toggle": "展开或收起工具", "agentDetail.configure.tools.toolTabs.all": "全部", "agentDetail.configure.tools.toolTabs.cli": "CLI", @@ -347,22 +350,22 @@ "agentDetail.metadata.sourceLabel": "来源", "agentDetail.monitoring.change": "较上一周期 {{value}}", "agentDetail.monitoring.dateRangeLabel": "日期范围", - "agentDetail.monitoring.description": "跟踪可复用 Agent 在工作流中的活跃度、成本和交互质量。", + "agentDetail.monitoring.description": "跟踪该 Agent 在所有访问点上的活动、成本与交互质量。", "agentDetail.monitoring.learnMore": "了解更多", "agentDetail.monitoring.loadFailed": "监控数据加载失败", - "agentDetail.monitoring.metrics.activeUsers.explanation": "触发过使用此 Agent 的工作流的独立终端用户数。", + "agentDetail.monitoring.metrics.activeUsers.explanation": "与该 Agent 交互过的独立终端用户数。", "agentDetail.monitoring.metrics.activeUsers.title": "活跃用户", - "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "此访问入口下用户与 Agent 的连续沟通次数。", + "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "每个对话中用户平均发送的消息条数。", "agentDetail.monitoring.metrics.avgSessionInteractions.title": "平均会话互动数", - "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "从请求开始到输出完成期间的平均输出速度。", + "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Agent 回复期间平均每秒生成的 token 数。", "agentDetail.monitoring.metrics.tokenOutputSpeed.title": "Token 输出速度", - "agentDetail.monitoring.metrics.tokenUsage.explanation": "此 Agent 在工作流运行中产生的预估 token 成本。", + "agentDetail.monitoring.metrics.tokenUsage.explanation": "已消耗的 token 数与估算费用。", "agentDetail.monitoring.metrics.tokenUsage.title": "Token 用量", "agentDetail.monitoring.metrics.totalConversations.explanation": "通过所选访问入口触达此 Agent 的每日 AI 会话数。", "agentDetail.monitoring.metrics.totalConversations.title": "全部会话数", - "agentDetail.monitoring.metrics.totalMessages.explanation": "每日 Agent 互动总次数。", + "agentDetail.monitoring.metrics.totalMessages.explanation": "发送给该 Agent 的用户消息总数。", "agentDetail.monitoring.metrics.totalMessages.title": "全部消息数", - "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "每 1000 条消息的点赞数,反映用户满意度。", + "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "获得用户点赞的 Agent 回复占比。", "agentDetail.monitoring.metrics.userSatisfactionRate.title": "用户满意度", "agentDetail.monitoring.pickSource": "选择应用", "agentDetail.monitoring.sourceLabel": "应用", @@ -624,8 +627,5 @@ "skillManagement.searchLabel": "搜索 Skill", "skillManagement.searchPlaceholder": "搜索", "skillManagement.tags": "标签", - "skillManagement.title": "Skills", - "agentDetail.configure.files.richTip": "上传过长、不适合放入提示词的参考资料:规格、模板、指南。了解更多\n\n在构建模式中,Agent 可帮你完成这些设置。", - "agentDetail.configure.prompt.richTip": "设定 Agent 的角色和工作方式。了解更多", - "agentDetail.configure.skills.workspaceSelector.limitReached": "每个 Agent 最多可从 Skill 库添加 20 个 Skill。请先移除一个 Skill,再添加新 Skill。" + "skillManagement.title": "Skills" } diff --git a/web/i18n/zh-Hans/skill.json b/web/i18n/zh-Hans/skill.json index 1c74072d0d3..4b31ab48ad6 100644 --- a/web/i18n/zh-Hans/skill.json +++ b/web/i18n/zh-Hans/skill.json @@ -2,12 +2,13 @@ "skillManagement.clearTags": "清除标签", "skillManagement.create": "创建", "skillManagement.createFailed": "Skill 创建失败。", - "skillManagement.createSuccess": "Skill 已创建。", + "skillManagement.createSuccess": "草稿已创建。", "skillManagement.dateTimeFormat": "YYYY-MM-DD HH:mm", "skillManagement.deleteDialog.confirmInputLabel": "请在下方输入 {{skillName}} 以确认删除:", - "skillManagement.deleteDialog.confirmInputPlaceholder": "输入 Skill Display Name…", - "skillManagement.deleteDialog.description": "该 Skill 将从 workspace 中移除。引用它的 Agent 可能失去对应能力。", - "skillManagement.deleteDialog.referencedDescription": "该 Skill 当前被 {{count}} 个 Agent、Workflow 或 Chatflow 引用。删除后会从 workspace 中移除该 Skill,并清理这些绑定关系。", + "skillManagement.deleteDialog.confirmInputPlaceholder": "请输入 Skill 显示名称", + "skillManagement.deleteDialog.description": "删除此 Skill 后无法恢复。其内容和完整版本历史将被永久删除。目前没有 Agent 使用此 Skill。", + "skillManagement.deleteDialog.referencedDescription_one": "有 {{count}} 个 Agent 正在使用此 Skill,包括独立 Agent 和工作流中的 Agent 节点。删除后,其内容和完整版本历史将被永久删除,并从所有相关 Agent 中移除。", + "skillManagement.deleteDialog.referencedDescription_other": "有 {{count}} 个 Agent 正在使用此 Skill,包括独立 Agent 和工作流中的 Agent 节点。删除后,其内容和完整版本历史将被永久删除,并从所有相关 Agent 中移除。", "skillManagement.deleteDialog.title": "删除 {{name}}?", "skillManagement.deleteFailed": "Skill 删除失败。", "skillManagement.deleteSuccess": "Skill 已删除。", @@ -21,14 +22,14 @@ "skillManagement.detail.builder.attach": "添加文件", "skillManagement.detail.builder.attachFailed": "添加文件失败。", "skillManagement.detail.builder.attachLimit": "最多可以添加 10 个文件。", - "skillManagement.detail.builder.attachTooLarge": "文件超过允许的大小限制。", + "skillManagement.detail.builder.attachTooLarge": "文件不得超过 15 MB,图片不得超过 10 MB。", "skillManagement.detail.builder.attachUnsupported": "只能添加图片、文本和文档文件。", - "skillManagement.detail.builder.attachmentOnlyMessage": "根据附件内容帮助完善这个 Skill。", + "skillManagement.detail.builder.attachmentOnlyMessage": "请根据附件改进此 Skill。", "skillManagement.detail.builder.close": "关闭 Skill Builder", "skillManagement.detail.builder.compatibleModelsOnly": "仅显示兼容模型", "skillManagement.detail.builder.copyResponse": "复制回复", "skillManagement.detail.builder.copySuccess": "回复已复制到剪贴板。", - "skillManagement.detail.builder.editIntro": "我已了解这个 Skill 的内容,你想调整什么?", + "skillManagement.detail.builder.editIntro": "我已查看此 Skill。想调整哪些内容?", "skillManagement.detail.builder.exampleIssueTriage": "客户问题分级处理", "skillManagement.detail.builder.exampleOnboarding": "新员工入职引导", "skillManagement.detail.builder.exampleSalesFollowUp": "销售线索跟进策略", @@ -49,7 +50,7 @@ "skillManagement.detail.builder.progress.readingDraft": "读取当前草稿", "skillManagement.detail.builder.progress.updatingEditor": "更新编辑器", "skillManagement.detail.builder.promptDescription": "描述它,草稿会出现在编辑器中,并包含步骤和文件。", - "skillManagement.detail.builder.promptTitle": "这个 Skill 应该处理什么?", + "skillManagement.detail.builder.promptTitle": "这个 Skill 用来处理什么任务?", "skillManagement.detail.builder.readAloud": "朗读回复", "skillManagement.detail.builder.removeAttachment": "移除 {{name}}", "skillManagement.detail.builder.restart": "重新开始 Builder", @@ -94,7 +95,8 @@ "skillManagement.detail.exitVersions": "退出版本", "skillManagement.detail.expandSidebar": "展开侧边栏", "skillManagement.detail.fileAlreadyExists": "已存在同名文件或文件夹。", - "skillManagement.detail.fileCount": "{{count}} 个文件", + "skillManagement.detail.fileCount_one": "{{count}} 个文件", + "skillManagement.detail.fileCount_other": "{{count}} 个文件", "skillManagement.detail.fileMeta": "{{type}} · {{size}} 字节", "skillManagement.detail.fileMissing": "文件不存在。", "skillManagement.detail.fileOperationFailed": "文件操作失败。", @@ -119,7 +121,8 @@ "skillManagement.detail.previewUnsupported": "该文件暂不支持预览。", "skillManagement.detail.publish": "发布", "skillManagement.detail.publishFailed": "Skill 发布失败。", - "skillManagement.detail.publishReferencesDescription": "发布后,这个草稿会对 {{count}} 个正在使用此 Skill 的引用生效。", + "skillManagement.detail.publishReferencesDescription_one": "发布后,使用此 Skill 的 {{count}} 个 Agent 会立即使用新版本。", + "skillManagement.detail.publishReferencesDescription_other": "发布后,使用此 Skill 的 {{count}} 个 Agent 会立即使用新版本。", "skillManagement.detail.publishReferencesTitle": "发布 Skill", "skillManagement.detail.publishSuccess": "Skill 已发布。", "skillManagement.detail.publishUpdate": "发布更新", @@ -130,10 +133,11 @@ "skillManagement.detail.readonly": "只读", "skillManagement.detail.referenceFiles.confirm": "Enter 确认", "skillManagement.detail.referenceFiles.empty": "暂无可引用的文件。", - "skillManagement.detail.referenceFiles.livePlaceholder": "编写给 Agent 的说明,输入 / 引用文件", + "skillManagement.detail.referenceFiles.livePlaceholder": "编写 Agent 指令。输入 / 可引用文件。", "skillManagement.detail.referenceFiles.navigate": "↑↓ 导航", "skillManagement.detail.referenceFiles.title": "引用文件", - "skillManagement.detail.referencedBy": "被 {{count}} 个应用引用", + "skillManagement.detail.referencedBy_one": "{{count}} 个 Agent 正在使用", + "skillManagement.detail.referencedBy_other": "{{count}} 个 Agent 正在使用", "skillManagement.detail.removeMetadata": "删除 {{name}} 元数据", "skillManagement.detail.removeTag": "移除 {{tag}}", "skillManagement.detail.removeTagSuccess": "标签已移除。", @@ -152,7 +156,7 @@ "skillManagement.detail.restoreVersionFailed": "版本恢复失败。", "skillManagement.detail.restoreVersionSuccess": "版本已恢复到草稿。", "skillManagement.detail.save": "保存", - "skillManagement.detail.saveConflictConfirmDescription": "这个 Skill 已在其他标签页中更新。加载最新草稿会丢弃当前未保存的修改。", + "skillManagement.detail.saveConflictConfirmDescription": "此 Skill 已在其他位置更新。请加载最新草稿后继续编辑。当前更改将被丢弃。", "skillManagement.detail.saveConflictConfirmTitle": "加载最新草稿?", "skillManagement.detail.saveConflictReload": "加载最新草稿", "skillManagement.detail.saveConflictStatus": "检测到冲突,请加载最新草稿后继续编辑。", @@ -163,8 +167,8 @@ "skillManagement.detail.saving": "保存中...", "skillManagement.detail.searchFiles": "查找文件", "skillManagement.detail.showMoreReferences": "显示其余 {{count}} 个", - "skillManagement.detail.skillDescriptionPlaceholder": "描述这个 Skill 的作用,以及 Agent 什么时候应该使用它。", - "skillManagement.detail.skillNamePlaceholder": "命名这个 Skill,仅支持小写字母、数字和连字符。导出时会作为文件夹名", + "skillManagement.detail.skillDescriptionPlaceholder": "描述此 Skill 的用途,以及 Agent 应在何时使用它。", + "skillManagement.detail.skillNamePlaceholder": "仅支持小写英文字母、数字和连字符。", "skillManagement.detail.unpublishedChanges": "未发布的更改", "skillManagement.detail.unsavedChanges": "有未保存的更改", "skillManagement.detail.upToDate": "已是最新", @@ -195,7 +199,6 @@ "skillManagement.detail.uploadResolvedSummary": "{{ready}} 个就绪 · {{skipped}} 个将跳过", "skillManagement.detail.uploadRetryCount": "重试 {{count}} 个", "skillManagement.detail.uploadReviewTitle": "上传前检查", - "skillManagement.detail.uploadSizeExceeded": "文件过大,必须小于 512 KB。", "skillManagement.detail.uploadSkip": "跳过", "skillManagement.detail.uploadSkippedGroup": "{{count}} 个文件无法上传,将被跳过", "skillManagement.detail.uploadStatusDismiss": "关闭上传状态", @@ -221,17 +224,22 @@ "skillManagement.emptyAction.importDescription": "导入包含 SKILL.md 且符合 agentskills.io 格式的 .zip 包。", "skillManagement.emptyAction.importTitle": "导入 Skill 包", "skillManagement.emptySearch": "未找到 Skill", + "skillManagement.errors.missingSkillMd": "此 Skill 包中没有 SKILL.md。请添加该文件后重新导入。", + "skillManagement.errors.nameConflict": "名为「{{name}}」的 Skill 已存在。请在 SKILL.md 中修改名称后重新导入。", + "skillManagement.errors.workspaceLimit": "工作空间最多可添加 500 个 Skill。请先删除一个 Skill,再添加新 Skill。", "skillManagement.import": "导入", "skillManagement.importFailed": "Skill 导入失败。", "skillManagement.importSuccess": "Skill 已导入。", "skillManagement.listLabel": "Workspace Skills", "skillManagement.loadingError": "Skill 加载失败", "skillManagement.moreActions": "{{name}} 的更多操作", + "skillManagement.noDescription": "暂无描述", "skillManagement.noTags": "暂无标签", "skillManagement.publishedAt": "发布于 {{time}}", - "skillManagement.referenceCount": "{{count}} 个引用", + "skillManagement.referenceCount_one": "{{count}} 个 Agent", + "skillManagement.referenceCount_other": "{{count}} 个 Agent", "skillManagement.searchLabel": "搜索 Skill", - "skillManagement.searchPlaceholder": "搜索", + "skillManagement.searchPlaceholder": "按名称或描述搜索", "skillManagement.tags": "标签", "skillManagement.title": "Skills" } diff --git a/web/i18n/zh-Hant/agent-v-2.json b/web/i18n/zh-Hant/agent-v-2.json index 1fbfc69e23b..71ee3c7a55e 100644 --- a/web/i18n/zh-Hant/agent-v-2.json +++ b/web/i18n/zh-Hant/agent-v-2.json @@ -83,7 +83,7 @@ "agentDetail.configure.buildDraft.changesToApply_other": "{{count}} 項變更待套用", "agentDetail.configure.buildDraft.discard": "放棄", "agentDetail.configure.buildDraft.modeBadge": "建置模式", - "agentDetail.configure.buildDraft.modeDescription": "你正在使用建置模式。在此模式下,Configure 只能由 Agent 更新。透過右側聊天調整此設定,然後套用。", + "agentDetail.configure.buildDraft.modeDescription": "目前處於建置模式。請與 Agent 對話來建構設定,完成後點擊套用。", "agentDetail.configure.buildDraft.rewritten": "已重寫", "agentDetail.configure.buildDraft.title": "Build 草稿", "agentDetail.configure.buildDraft.updated": "已更新", @@ -105,7 +105,8 @@ "agentDetail.configure.files.preview.failed": "預覽載入失敗。", "agentDetail.configure.files.preview.unsupported": "此檔案不支援預覽。", "agentDetail.configure.files.remove": "移除 {{name}}", - "agentDetail.configure.files.tip": "上傳過長、不適合放入提示詞的參考資料:規格、範本、指南。在提示詞中用 / 引用。\n\n在建置模式中,Agent 可幫你完成這些設定。", + "agentDetail.configure.files.richTip": "上傳過長、不適合放入提示詞的參考資料:規格、範本、指南。了解更多\n\n在建置模式中,Agent 可幫你完成這些設定。", + "agentDetail.configure.files.tip": "上傳過長、不適合放入提示詞的參考資料:規格、範本、指南。了解更多\n\n在建置模式中,Agent 可幫你完成這些設定。", "agentDetail.configure.files.toggle": "展開或收合檔案", "agentDetail.configure.files.treeLabel": "Agent 檔案", "agentDetail.configure.files.upload.action": "上傳", @@ -114,7 +115,7 @@ "agentDetail.configure.files.upload.dropzone": "拖入檔案,或", "agentDetail.configure.files.upload.failed": "檔案上傳失敗。", "agentDetail.configure.files.upload.fileType": "檔案", - "agentDetail.configure.files.upload.invalidFile": "請上傳一個檔案。", + "agentDetail.configure.files.upload.invalidFile": "一次只能上傳一個檔案。", "agentDetail.configure.files.upload.success": "檔案已上傳。", "agentDetail.configure.files.upload.title": "上傳檔案", "agentDetail.configure.knowledgeRetrieval.add": "新增知識檢索", @@ -177,7 +178,8 @@ "agentDetail.configure.prompt.mention.priyaRamanathan": "Priya Ramanathan", "agentDetail.configure.prompt.placeholder": "在此編寫指令,", "agentDetail.configure.prompt.referenceMissing": "{{name}} 不存在", - "agentDetail.configure.prompt.tip": "定義 Agent 的角色,並描述它的典型任務。使用 / 明確引用 Skill、檔案、工具和知識檢索。", + "agentDetail.configure.prompt.richTip": "設定 Agent 的角色和工作方式。了解更多", + "agentDetail.configure.prompt.tip": "設定 Agent 的角色和工作方式。了解更多", "agentDetail.configure.publishBar.draft": "草稿", "agentDetail.configure.publishBar.publishUpdate": "發佈更新", "agentDetail.configure.publishBar.published": "已發佈", @@ -190,8 +192,8 @@ "agentDetail.configure.publishBar.versionHistory": "開啟版本歷史", "agentDetail.configure.publishImpact.affectedWorkflows": "受影響的工作流程", "agentDetail.configure.publishImpact.cancel": "取消", - "agentDetail.configure.publishImpact.descriptionPrefix": "你的 Agent 出現在", - "agentDetail.configure.publishImpact.descriptionSuffix": "中。變更會影響它們。", + "agentDetail.configure.publishImpact.descriptionPrefix": "該 Agent 被", + "agentDetail.configure.publishImpact.descriptionSuffix": "使用。發布後,將在所有工作流程中更新。", "agentDetail.configure.publishImpact.fallbackAgentName": "此 Agent", "agentDetail.configure.publishImpact.title": "{{action}}到 {{name}}", "agentDetail.configure.publishImpact.workflowCount_one": "{{count}} 個工作流程", @@ -222,8 +224,8 @@ "agentDetail.configure.skills.openInLibrary": "Open in Skill library", "agentDetail.configure.skills.remove": "移除 {{name}}", "agentDetail.configure.skills.removeAction": "Remove", - "agentDetail.configure.skills.richTip": "將重複任務所需的指令、檔案和指令碼打包成 Skill。在提示詞中用 / 引用。了解更多\n\n在建置模式中,Agent 可幫你完成這些設定。", - "agentDetail.configure.skills.tip": "將重複任務所需的指令、檔案和指令碼打包成 Skill。在提示詞中用 / 引用。了解更多\n\n在建置模式中,Agent 可幫你完成這些設定。", + "agentDetail.configure.skills.richTip": "將重複任務所需的指令、檔案和指令碼打包成 Skill。了解更多\n\n在建置模式中,Agent 可幫你完成這些設定。", + "agentDetail.configure.skills.tip": "將重複任務所需的指令、檔案和指令碼打包成 Skill。了解更多\n\n在建置模式中,Agent 可幫你完成這些設定。", "agentDetail.configure.skills.toggle": "展開或收合 Skill", "agentDetail.configure.skills.upload.action": "上傳", "agentDetail.configure.skills.upload.browse": "選擇", @@ -269,8 +271,8 @@ "agentDetail.configure.tools.moreActions": "{{name}} 的更多操作", "agentDetail.configure.tools.removeAction": "移除 {{name}}", "agentDetail.configure.tools.removeProvider": "移除所有工具", - "agentDetail.configure.tools.richTip": "新增工作區中的 Dify 工具。在提示詞中用 / 引用。了解更多\n\nAgent 在沙箱中自行安裝的工具不會顯示在這裡,但仍然可用。", - "agentDetail.configure.tools.tip": "新增工作區中的 Dify 工具。在提示詞中用 / 引用。了解更多\n\nAgent 在沙箱中自行安裝的工具不會顯示在這裡,但仍然可用。", + "agentDetail.configure.tools.richTip": "新增工作區中的 Dify 工具。了解更多\n\nAgent 在沙箱中自行安裝的工具不會顯示在這裡,但仍然可用。", + "agentDetail.configure.tools.tip": "新增工作區中的 Dify 工具。了解更多\n\nAgent 在沙箱中自行安裝的工具不會顯示在這裡,但仍然可用。", "agentDetail.configure.tools.toggle": "展開或收合工具", "agentDetail.configure.tools.toolTabs.all": "全部", "agentDetail.configure.tools.toolTabs.cli": "CLI", @@ -336,22 +338,22 @@ "agentDetail.metadata.sourceLabel": "來源", "agentDetail.monitoring.change": "較上一週期 {{value}}", "agentDetail.monitoring.dateRangeLabel": "日期範圍", - "agentDetail.monitoring.description": "追蹤可複用 Agent 在工作流程中的活躍度、成本和互動品質。", + "agentDetail.monitoring.description": "追蹤此 Agent 在所有存取入口的活動、成本和互動品質。", "agentDetail.monitoring.learnMore": "了解更多", "agentDetail.monitoring.loadFailed": "監控資料載入失敗", - "agentDetail.monitoring.metrics.activeUsers.explanation": "觸發過使用此 Agent 的工作流程的獨立終端使用者數。", + "agentDetail.monitoring.metrics.activeUsers.explanation": "與此 Agent 互動過的獨立終端使用者數。", "agentDetail.monitoring.metrics.activeUsers.title": "活躍使用者", - "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "此存取入口下使用者與 Agent 的連續溝通次數。", + "agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "每段對話的平均使用者訊息數。", "agentDetail.monitoring.metrics.avgSessionInteractions.title": "平均工作階段互動數", - "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "從請求開始到輸出完成期間的平均輸出速度。", + "agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Agent 回覆期間每秒產生的平均 token 數量。", "agentDetail.monitoring.metrics.tokenOutputSpeed.title": "Token 輸出速度", - "agentDetail.monitoring.metrics.tokenUsage.explanation": "此 Agent 在工作流程執行中產生的預估 token 成本。", + "agentDetail.monitoring.metrics.tokenUsage.explanation": "已耗用的 token 數量及預估成本。", "agentDetail.monitoring.metrics.tokenUsage.title": "Token 用量", "agentDetail.monitoring.metrics.totalConversations.explanation": "透過所選存取入口觸達此 Agent 的每日 AI 會話數。", "agentDetail.monitoring.metrics.totalConversations.title": "全部會話數", - "agentDetail.monitoring.metrics.totalMessages.explanation": "每日 Agent 互動總次數。", + "agentDetail.monitoring.metrics.totalMessages.explanation": "使用者傳送給此 Agent 的訊息總數。", "agentDetail.monitoring.metrics.totalMessages.title": "全部訊息數", - "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "每 1,000 條訊息的按讚數,反映使用者滿意度。", + "agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "被使用者按讚的 Agent 回覆所占百分比。", "agentDetail.monitoring.metrics.userSatisfactionRate.title": "使用者滿意度", "agentDetail.monitoring.pickSource": "選擇應用", "agentDetail.monitoring.sourceLabel": "應用", @@ -549,7 +551,5 @@ "skillManagement.searchLabel": "搜尋 Skill", "skillManagement.searchPlaceholder": "搜索", "skillManagement.tags": "標籤", - "skillManagement.title": "Skills", - "agentDetail.configure.files.richTip": "上傳過長、不適合放入提示詞的參考資料:規格、範本、指南。了解更多\n\n在建置模式中,Agent 可幫你完成這些設定。", - "agentDetail.configure.prompt.richTip": "設定 Agent 的角色和工作方式。了解更多" + "skillManagement.title": "Skills" } diff --git a/web/i18n/zh-Hant/skill.json b/web/i18n/zh-Hant/skill.json index f559b3a3660..727c93bf1a7 100644 --- a/web/i18n/zh-Hant/skill.json +++ b/web/i18n/zh-Hant/skill.json @@ -1,12 +1,14 @@ { "skillManagement.clearTags": "清除標籤", - "skillManagement.create": "创建", + "skillManagement.create": "建立", "skillManagement.createFailed": "Skill 建立失敗。", - "skillManagement.createSuccess": "Skill 已建立。", + "skillManagement.createSuccess": "草稿已建立。", "skillManagement.dateTimeFormat": "YYYY-MM-DD HH:mm", "skillManagement.deleteDialog.confirmInputLabel": "請在下方輸入框中輸入 {{skillName}} 以確認:", "skillManagement.deleteDialog.confirmInputPlaceholder": "輸入 Skill Display Name…", - "skillManagement.deleteDialog.description": "該 Skill 將從 workspace 中移除。引用它的 Agent 可能失去對應能力。", + "skillManagement.deleteDialog.description": "刪除 Skill 後將無法復原,其內容與完整版本歷史記錄將永久刪除。目前沒有任何 Agent 正在使用它。", + "skillManagement.deleteDialog.referencedDescription_one": "{{count}} 代理程式正在獨立或在工作流程中使用此技能。刪除此技能將永久刪除其內容和版本歷史記錄,並將其從受影響的代理中刪除。", + "skillManagement.deleteDialog.referencedDescription_other": "{{count}} 代理程式正在獨立或在工作流程中使用此技能。刪除此技能將永久刪除其內容和版本歷史記錄,並將其從所有受影響的代理中刪除。", "skillManagement.deleteDialog.title": "刪除 {{name}}?", "skillManagement.deleteFailed": "Skill 刪除失敗。", "skillManagement.deleteSuccess": "Skill 已刪除。", @@ -16,9 +18,60 @@ "skillManagement.detail.addTagDescription": "建立或綁定一個標籤到這個 Skill。新標籤會隨 Skill 中繼資料保存。", "skillManagement.detail.addTagSuccess": "標籤已新增。", "skillManagement.detail.back": "返回 Skills", + "skillManagement.detail.builder.applyFailed": "無法套用草稿更新。", + "skillManagement.detail.builder.attach": "附加文件", + "skillManagement.detail.builder.attachFailed": "無法附加文件。", + "skillManagement.detail.builder.attachLimit": "您最多可以附加 10 個文件。", + "skillManagement.detail.builder.attachTooLarge": "檔案必須為 15 MB 或更小。影像必須為 10 MB 或更小。", + "skillManagement.detail.builder.attachUnsupported": "只能附加圖像、文字和文件文件。", + "skillManagement.detail.builder.attachmentOnlyMessage": "使用附加文件來幫助提高這項技能。", + "skillManagement.detail.builder.close": "關閉 Skill Builder", + "skillManagement.detail.builder.compatibleModelsOnly": "僅顯示相容的模型", + "skillManagement.detail.builder.copyResponse": "複製回覆", + "skillManagement.detail.builder.copySuccess": "響應已複製到剪貼簿。", + "skillManagement.detail.builder.editIntro": "我已檢閱這個 Skill。你想調整什麼?", + "skillManagement.detail.builder.exampleIssueTriage": "客戶問題分類", + "skillManagement.detail.builder.exampleOnboarding": "新進員工入職指南", + "skillManagement.detail.builder.exampleSalesFollowUp": "銷售線索跟進策略", + "skillManagement.detail.builder.followUpDisplayName": "使用退款批准作為顯示名稱", + "skillManagement.detail.builder.followUpNameIcon": "應用建議的名稱和圖標", + "skillManagement.detail.builder.fromMarketplace": "從 Marketplace 安裝", + "skillManagement.detail.builder.model": "GPT-4o", + "skillManagement.detail.builder.modelCredits.all": "所有學分", + "skillManagement.detail.builder.modelCredits.configure": "需要配置", + "skillManagement.detail.builder.modelCredits.exhausted": "配額已用完", + "skillManagement.detail.builder.modelProviderSettings": "模型供應商設定", + "skillManagement.detail.builder.modelSearch": "搜尋模型...", + "skillManagement.detail.builder.modifyPlaceholder": "請 AI 修改這個 Skill...", + "skillManagement.detail.builder.open": "開啟Skill Builder", + "skillManagement.detail.builder.placeholder": "描述一下場景...", + "skillManagement.detail.builder.progress.applyingChanges": "應用程式檔案更改", + "skillManagement.detail.builder.progress.generatingPlan": "產生更新計劃", + "skillManagement.detail.builder.progress.readingDraft": "閱讀當前草案", + "skillManagement.detail.builder.progress.updatingEditor": "更新編輯器", + "skillManagement.detail.builder.promptDescription": "描述它,編輯器中就會出現草稿,其中包含步驟和文件。", + "skillManagement.detail.builder.promptTitle": "這個技能該處理什麼?", + "skillManagement.detail.builder.readAloud": "大聲朗讀回复", + "skillManagement.detail.builder.removeAttachment": "移除 {{name}}", + "skillManagement.detail.builder.restart": "重新啟動建構器", + "skillManagement.detail.builder.retryResponse": "重試響應", + "skillManagement.detail.builder.send": "發送訊息", + "skillManagement.detail.builder.sendFailed": "Skill Builder 未能回應。", + "skillManagement.detail.builder.thinking": "思考過程", + "skillManagement.detail.builder.thinkingUnavailable": "模型沒有返回思考內容。", + "skillManagement.detail.builder.title": "Skill Builder", + "skillManagement.detail.builder.tryExample": "嘗試一個例子", + "skillManagement.detail.builder.voice": "語音輸入", + "skillManagement.detail.builder.voiceUnavailable": "語音輸入尚不可用。", "skillManagement.detail.cancelAddMetadata": "取消新增元資料", - "skillManagement.detail.closeFileTab": "Close {{name}}", + "skillManagement.detail.closeFileTab": "關閉 {{name}}", + "skillManagement.detail.closeVersions": "關閉版本", "skillManagement.detail.collapseSidebar": "摺疊側邊欄", + "skillManagement.detail.copyContentSuccess": "內容已複製到剪貼簿。", + "skillManagement.detail.copyFile": "複製", + "skillManagement.detail.copyFileSuccess": "文件準備好貼上。", + "skillManagement.detail.copyVersionId": "複製ID", + "skillManagement.detail.copyVersionIdSuccess": "ID 已複製到剪貼簿。", "skillManagement.detail.createFile": "新增檔案", "skillManagement.detail.createFileDescription": "輸入相對於 Skill 根目錄的檔案路徑。", "skillManagement.detail.createFileMenu": "新增檔案...", @@ -29,45 +82,62 @@ "skillManagement.detail.createFolderSuccess": "資料夾已建立。", "skillManagement.detail.createdBy": "由 {{name}} 建立", "skillManagement.detail.currentDraft": "目前草稿", + "skillManagement.detail.cutFile": "切", + "skillManagement.detail.cutFileSuccess": "文件準備移動。", "skillManagement.detail.deleteFileConfirm": "刪除這個檔案?", "skillManagement.detail.deleteFileSuccess": "檔案已刪除。", "skillManagement.detail.deleteVersionConfirm": "刪除這個版本?", "skillManagement.detail.deleteVersionFailed": "版本刪除失敗。", "skillManagement.detail.deleteVersionSuccess": "版本已刪除。", "skillManagement.detail.downloadFile": "下载文件", - "skillManagement.detail.draft": "Draft", + "skillManagement.detail.draft": "草稿", + "skillManagement.detail.editVersionInfo": "編輯版本信息", + "skillManagement.detail.exitVersions": "退出版本", "skillManagement.detail.expandSidebar": "展開側邊欄", - "skillManagement.detail.fileCount": "{{count}} 個檔案", + "skillManagement.detail.fileAlreadyExists": "同名的檔案或資料夾已存在。", + "skillManagement.detail.fileCount_one": "{{count}} 文件", + "skillManagement.detail.fileCount_other": "{{count}} 文件", "skillManagement.detail.fileMeta": "{{type}} · {{size}} 位元組", "skillManagement.detail.fileMissing": "檔案不存在。", "skillManagement.detail.fileOperationFailed": "檔案操作失敗。", "skillManagement.detail.files": "檔案", - "skillManagement.detail.latest": "Latest", + "skillManagement.detail.latest": "最新", "skillManagement.detail.loadFailed": "Skill 載入失敗。", + "skillManagement.detail.loadingTags": "正在加載標籤...", "skillManagement.detail.markdownLiveMode": "即時預覽", "skillManagement.detail.markdownSourceMode": "原始碼編輯", - "skillManagement.detail.metadataKey": "name", - "skillManagement.detail.metadataValue": "value", + "skillManagement.detail.metadataKey": "姓名", + "skillManagement.detail.metadataValue": "價值", "skillManagement.detail.moveFileSuccess": "檔案已移動。", "skillManagement.detail.moveFilesSuccess": "檔案已移動。", + "skillManagement.detail.nameThisVersion": "給這個版本命名", "skillManagement.detail.noFileSelected": "選擇一個檔案進行預覽。", "skillManagement.detail.noFiles": "暫無檔案。", "skillManagement.detail.noSearchResults": "沒有符合的檔案。", + "skillManagement.detail.noSelectableTags": "沒有可用的標籤。", "skillManagement.detail.noVersions": "暫無發布版本。", + "skillManagement.detail.pasteFile": "貼上", + "skillManagement.detail.pasteFileSuccess": "文件已貼上。", "skillManagement.detail.previewUnsupported": "該檔案暫不支援預覽。", "skillManagement.detail.publish": "發布", "skillManagement.detail.publishFailed": "Skill 發布失敗。", + "skillManagement.detail.publishReferencesDescription_one": "對於使用此技能的 {{count}} 代理,發布立即生效。", + "skillManagement.detail.publishReferencesDescription_other": "對於使用該技能的 {{count}} 座席,發布立即生效。", + "skillManagement.detail.publishReferencesTitle": "發布技能", "skillManagement.detail.publishSuccess": "Skill 已發布。", + "skillManagement.detail.publishUpdate": "發佈更新", "skillManagement.detail.published": "已發布", "skillManagement.detail.publishedAt": "{{time}}發佈", + "skillManagement.detail.publishedVersion": "已發布#{{number}}", "skillManagement.detail.publishing": "發佈中...", "skillManagement.detail.readonly": "唯讀", "skillManagement.detail.referenceFiles.confirm": "Enter 確認", "skillManagement.detail.referenceFiles.empty": "暫無可引用的檔案。", - "skillManagement.detail.referenceFiles.livePlaceholder": "編寫給 Agent 的說明,輸入 / 引用檔案", + "skillManagement.detail.referenceFiles.livePlaceholder": "撰寫 Agent 的指示。輸入 / 以引用檔案。", "skillManagement.detail.referenceFiles.navigate": "↑↓ 導覽", "skillManagement.detail.referenceFiles.title": "引用檔案", - "skillManagement.detail.referencedBy": "被 {{count}} 個應用引用", + "skillManagement.detail.referencedBy_one": "{{count}} 個 Agent 正在使用", + "skillManagement.detail.referencedBy_other": "{{count}} 個 Agent 正在使用", "skillManagement.detail.removeMetadata": "刪除 {{name}} 元資料", "skillManagement.detail.removeTag": "移除 {{tag}}", "skillManagement.detail.removeTagSuccess": "標籤已移除。", @@ -79,43 +149,97 @@ "skillManagement.detail.renameVersionFailed": "版本重新命名失敗。", "skillManagement.detail.renameVersionPrompt": "版本名称", "skillManagement.detail.renameVersionSuccess": "版本已重新命名。", + "skillManagement.detail.resizeSidebar": "調整檔案側邊欄大小", "skillManagement.detail.restoreVersion": "還原", + "skillManagement.detail.restoreVersionConfirmDescription": "這會將目前草稿替換為“{{version}}”中的檔案。它不會發布 Skill 或創建新版本。", + "skillManagement.detail.restoreVersionConfirmTitle": "恢復這個版本嗎?", "skillManagement.detail.restoreVersionFailed": "版本還原失敗。", "skillManagement.detail.restoreVersionSuccess": "版本已還原到草稿。", "skillManagement.detail.save": "儲存", + "skillManagement.detail.saveConflictConfirmDescription": "該技能已在其他地方更新。載入最新草稿以繼續編輯。您當前的更改將被放棄。", + "skillManagement.detail.saveConflictConfirmTitle": "加載最新的草稿?", + "skillManagement.detail.saveConflictReload": "載入最新草稿", + "skillManagement.detail.saveConflictStatus": "檢測到衝突。載入最新草稿以繼續編輯。", "skillManagement.detail.saveFailed": "檔案儲存失敗。", "skillManagement.detail.saveSuccess": "檔案已儲存。", - "skillManagement.detail.saved": "Saved", - "skillManagement.detail.savedAt": "Saved {{time}}", - "skillManagement.detail.saving": "Saving...", + "skillManagement.detail.saved": "已儲存", + "skillManagement.detail.savedAt": "{{time}}已儲存", + "skillManagement.detail.saving": "儲存中...", "skillManagement.detail.searchFiles": "搜尋檔案", + "skillManagement.detail.showMoreReferences": "顯示更多 {{count}}", + "skillManagement.detail.skillDescriptionPlaceholder": "描述這個 Skill 的用途,以及 Agent 應在何時使用它。", + "skillManagement.detail.skillNamePlaceholder": "使用小寫字母、數字和連字號。", "skillManagement.detail.unpublishedChanges": "未發佈的變更", - "skillManagement.detail.unsavedChanges": "Unsaved changes", + "skillManagement.detail.unsavedChanges": "未儲存的更改", "skillManagement.detail.upToDate": "已是最新", "skillManagement.detail.updateTagsFailed": "標籤更新失敗。", + "skillManagement.detail.uploadCheckFailed": "無法檢查這些文件。再試一次。", + "skillManagement.detail.uploadConflict": "同名的檔案已存在。", + "skillManagement.detail.uploadFailureSummary": "{{total}} 檔案中的 {{failed}} 失敗", + "skillManagement.detail.uploadFailureTitle": "部分上傳失敗", "skillManagement.detail.uploadFile": "上傳檔案", "skillManagement.detail.uploadFileFailed": "檔案上傳失敗。", "skillManagement.detail.uploadFileSuccess": "檔案已上傳。", + "skillManagement.detail.uploadFilesButton": "上傳{{count}}文件", + "skillManagement.detail.uploadFilesFailedStatus_one": "{{count}} 檔案上傳失敗。", + "skillManagement.detail.uploadFilesFailedStatus_other": "{{count}} 檔案上傳失敗。", "skillManagement.detail.uploadFilesMenu": "上傳檔案...", + "skillManagement.detail.uploadFilesProgress": "正在上傳{{completed}}/{{total}}", + "skillManagement.detail.uploadFilesResult": "{{uploaded}} 已上傳 · {{failed}} 失敗", + "skillManagement.detail.uploadFilesStatus": "上傳狀態", + "skillManagement.detail.uploadInvalidExtension": "不支援此文件類型。", + "skillManagement.detail.uploadInvalidName": "名稱無效。", + "skillManagement.detail.uploadInvalidPath": "文件路徑無效。", + "skillManagement.detail.uploadKeepBoth": "兩者都保留", + "skillManagement.detail.uploadLateConflict": "在您上傳時有人添加了此文件。", + "skillManagement.detail.uploadMissingExtension": "需要檔案副檔名。", + "skillManagement.detail.uploadNetworkFailure": "上傳失敗。檢查您的連線。", + "skillManagement.detail.uploadReadySummary": "{{ready}} 準備就緒 · {{decisions}} 需要決定 · {{skipped}} 將被跳過", + "skillManagement.detail.uploadReplace": "代替", + "skillManagement.detail.uploadResolvedSummary": "{{ready}} 就緒 · {{skipped}} 將會被跳過", + "skillManagement.detail.uploadRetryCount": "重試{{count}}", + "skillManagement.detail.uploadReviewTitle": "上傳前審核", + "skillManagement.detail.uploadSkip": "船", + "skillManagement.detail.uploadSkippedGroup": "{{count}} 檔案無法上傳,將會被跳過", + "skillManagement.detail.uploadStatusDismiss": "取消上傳狀態", + "skillManagement.detail.uploadSuggestion": "使用建議", + "skillManagement.detail.uploadWillReplace": "將替換現有文件", + "skillManagement.detail.uploadWillUseName": "將上傳為 {{name}}", + "skillManagement.detail.versionHistory": "開啟版本歷史", "skillManagement.detail.versionMeta": "{{hash}} · {{time}}", + "skillManagement.detail.versionPublishNote": "發行說明", + "skillManagement.detail.versionPublishNotePlaceholder": "描述一下這個變化", + "skillManagement.detail.versionPublishedMeta": "{{time}} · {{name}}", + "skillManagement.detail.versionTitle": "標題", "skillManagement.detail.versions": "版本", - "skillManagement.draft": "Draft", + "skillManagement.detail.viewOnly": "僅供查看", + "skillManagement.detail.viewUploadErrors": "查看錯誤", + "skillManagement.draft": "草稿", "skillManagement.duplicateFailed": "Skill 複製失敗。", "skillManagement.duplicateSuccess": "Skill 已複製。", "skillManagement.editedAt": "編輯於 {{time}}", "skillManagement.empty": "暫無 Skill", + "skillManagement.emptyAction.createDescription": "用簡單的語言描述一個場景並獲得一份技能草稿進行審查。", + "skillManagement.emptyAction.createTitle": "使用 Skill Builder 創建", + "skillManagement.emptyAction.importDescription": "帶來一個帶有 SKILL.md 的 .zip,格式為agentskills.io。", + "skillManagement.emptyAction.importTitle": "導入技能包", "skillManagement.emptySearch": "未找到 Skill", + "skillManagement.errors.missingSkillMd": "這個包沒有SKILL.md。新增檔案並再次匯入。", + "skillManagement.errors.nameConflict": "名為「{{name}}」的技能已存在。將其重新命名為SKILL.md並再次匯入。", + "skillManagement.errors.workspaceLimit": "您的工作區已達到 500 項技能的限制。刪除一項技能以新增技能。", "skillManagement.import": "匯入", "skillManagement.importFailed": "Skill 匯入失敗。", "skillManagement.importSuccess": "Skill 已匯入。", "skillManagement.listLabel": "Workspace Skills", "skillManagement.loadingError": "Skill 載入失敗", "skillManagement.moreActions": "{{name}} 的更多操作", + "skillManagement.noDescription": "還沒有描述", "skillManagement.noTags": "暫無標籤", "skillManagement.publishedAt": "發布於 {{time}}", - "skillManagement.referenceCount": "{{count}} 個引用", + "skillManagement.referenceCount_one": "{{count}} 個 Agent", + "skillManagement.referenceCount_other": "{{count}} 個 Agent", "skillManagement.searchLabel": "搜尋 Skill", - "skillManagement.searchPlaceholder": "搜索", + "skillManagement.searchPlaceholder": "按名稱或描述搜尋", "skillManagement.tags": "標籤", "skillManagement.title": "Skills" } diff --git a/web/service/client.ts b/web/service/client.ts index 807d15c4408..7fa21ba2c76 100644 --- a/web/service/client.ts +++ b/web/service/client.ts @@ -124,10 +124,11 @@ const marketplaceLink = new OpenAPILink(marketplaceRouterContract, { url: MARKETPLACE_API_PREFIX, headers: () => getMarketplaceHeaders(), fetch: (request, init) => { + const requestInit = init as RequestInit | undefined return globalThis.fetch(request, { - ...init, + ...requestInit, cache: 'no-store', - signal: withRequestDeadline(init?.signal ?? request.signal), + signal: withRequestDeadline(requestInit?.signal ?? request.signal), }) }, interceptors: [ diff --git a/web/utils/__tests__/marketplace-site-track.spec.ts b/web/utils/__tests__/marketplace-site-track.spec.ts index ee244d8516f..3ed02ccebff 100644 --- a/web/utils/__tests__/marketplace-site-track.spec.ts +++ b/web/utils/__tests__/marketplace-site-track.spec.ts @@ -4,7 +4,6 @@ import { afterEach, describe, expect, it, vi } from 'vitest' import { markMarketplaceSiteFilter, markMarketplaceSiteSearch, - rememberMarketplaceSiteReferrer, trackMarketplaceSiteCardClick, trackMarketplaceSiteEvent, } from '../marketplace-site-track' @@ -37,7 +36,9 @@ describe('marketplace site track bridge', () => { flushFilter: vi.fn(), } - trackMarketplaceSiteEvent('marketplace_creator_partner_click', { click_target: 'creator_center' }) + trackMarketplaceSiteEvent('marketplace_creator_partner_click', { + click_target: 'creator_center', + }) trackMarketplaceSiteCardClick({ itemId: 'org/name', itemType: 'plugin', diff --git a/web/utils/marketplace-site-track.ts b/web/utils/marketplace-site-track.ts index d4867efcf6e..f5bbdfe8e0a 100644 --- a/web/utils/marketplace-site-track.ts +++ b/web/utils/marketplace-site-track.ts @@ -7,10 +7,9 @@ type MarketplaceSiteFilter = { selected_values: string[] } -const isMarketplaceSite = () => ( - typeof globalThis.document !== 'undefined' - && globalThis.document.body?.hasAttribute('data-is-marketplace') -) +const isMarketplaceSite = () => + typeof globalThis.document !== 'undefined' && + globalThis.document.body?.hasAttribute('data-is-marketplace') const marketplaceTracking = () => globalThis.window.__marketplaceTracking__ @@ -18,8 +17,7 @@ export const trackMarketplaceSiteEvent = ( eventName: string, properties?: Record, ) => { - if (!isMarketplaceSite()) - return + if (!isMarketplaceSite()) return marketplaceTracking()?.track(eventName, properties) } @@ -28,36 +26,31 @@ export const rememberMarketplaceSiteReferrer = ( itemId: string, section: MarketplaceSiteReferrerSection, ) => { - if (!isMarketplaceSite()) - return + if (!isMarketplaceSite()) return marketplaceTracking()?.rememberReferrer(itemId, section) } export const markMarketplaceSiteSearch = (query: string) => { - if (!isMarketplaceSite()) - return + if (!isMarketplaceSite()) return marketplaceTracking()?.markSearch(query) } export const flushMarketplaceSiteSearch = (resultCount: number) => { - if (!isMarketplaceSite()) - return + if (!isMarketplaceSite()) return marketplaceTracking()?.flushSearch(resultCount) } export const markMarketplaceSiteFilter = (filter: MarketplaceSiteFilter) => { - if (!isMarketplaceSite()) - return + if (!isMarketplaceSite()) return marketplaceTracking()?.markFilter(filter) } export const flushMarketplaceSiteFilter = (resultCount: number) => { - if (!isMarketplaceSite()) - return + if (!isMarketplaceSite()) return marketplaceTracking()?.flushFilter(resultCount) }