mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-10-27 02:45:24 +08:00
feat(i18n): localize backend messages by workspace language
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from ....i18n import t
|
||||
|
||||
from contextlib import aclosing
|
||||
|
||||
import datetime
|
||||
@@ -432,7 +434,7 @@ class AgentService:
|
||||
pipeline_uuid = await self.ap.pipeline_service.create_pipeline(
|
||||
context,
|
||||
{
|
||||
'name': agent_data.get('name') or 'New Pipeline',
|
||||
'name': agent_data.get('name') or t('New Pipeline'),
|
||||
'description': agent_data.get('description') or '',
|
||||
'emoji': agent_data.get('emoji') or '⚙️',
|
||||
'config': {},
|
||||
@@ -461,7 +463,7 @@ class AgentService:
|
||||
values = {
|
||||
'workspace_uuid': workspace_uuid,
|
||||
'uuid': new_uuid,
|
||||
'name': agent_data.get('name') or 'New Agent',
|
||||
'name': agent_data.get('name') or t('New Agent'),
|
||||
'description': agent_data.get('description') or '',
|
||||
'emoji': agent_data.get('emoji') or ('🧩' if kind == AGENT_KIND_EVENT_PROCESSOR else '🤖'),
|
||||
'kind': kind,
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from ....i18n import t
|
||||
|
||||
import sqlalchemy
|
||||
|
||||
from ....api.http.authz import WorkspaceRequiredError
|
||||
@@ -63,7 +65,13 @@ class KnowledgeService:
|
||||
if max_knowledge_bases >= 0:
|
||||
knowledge_bases = await self.ap.rag_mgr.get_all_knowledge_base_details(context)
|
||||
if len(knowledge_bases) >= max_knowledge_bases:
|
||||
raise ValueError(f'Maximum number of knowledge bases ({max_knowledge_bases}) reached')
|
||||
raise ValueError(
|
||||
t(
|
||||
'Maximum number of {resource} ({limit}) reached',
|
||||
resource=t('knowledge bases'),
|
||||
limit=max_knowledge_bases,
|
||||
)
|
||||
)
|
||||
|
||||
knowledge_engine_plugin_id = kb_data.get('knowledge_engine_plugin_id')
|
||||
if not knowledge_engine_plugin_id:
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from ....i18n import t
|
||||
|
||||
import copy
|
||||
import re
|
||||
import uuid
|
||||
@@ -228,7 +230,9 @@ class MCPService:
|
||||
.where(persistence_plugin.PluginSetting.workspace_uuid == workspace_uuid)
|
||||
)
|
||||
if (mcp_count_result.scalar() or 0) + (plugin_count_result.scalar() or 0) >= max_extensions:
|
||||
raise ValueError(f'Maximum number of extensions ({max_extensions}) reached')
|
||||
raise ValueError(
|
||||
t('Maximum number of {resource} ({limit}) reached', resource=t('extensions'), limit=max_extensions)
|
||||
)
|
||||
|
||||
payload = dict(server_data)
|
||||
payload.pop('workspace_uuid', None)
|
||||
@@ -246,7 +250,7 @@ class MCPService:
|
||||
)
|
||||
)
|
||||
if existing_result.first() is not None:
|
||||
raise ValueError(f'MCP server already exists: {server_name}')
|
||||
raise ValueError(t('MCP server already exists: {name}', name=server_name))
|
||||
|
||||
await self.ap.persistence_mgr.execute_async(sqlalchemy.insert(persistence_mcp.MCPServer).values(payload))
|
||||
created = await self._get_mcp_server_by_uuid_raw(execution_context, payload['uuid'])
|
||||
@@ -332,7 +336,7 @@ class MCPService:
|
||||
raise ValueError('MCP server name is required')
|
||||
duplicate = await self._get_mcp_server_by_name_raw(execution_context, payload['name'])
|
||||
if duplicate is not None and duplicate['uuid'] != server_uuid:
|
||||
raise ValueError(f'MCP server already exists: {payload["name"]}')
|
||||
raise ValueError(t('MCP server already exists: {name}', name=payload['name']))
|
||||
|
||||
effective_server = {**old_server, **payload}
|
||||
# Existing disabled rows remain readable/deletable. Switching away
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from ....i18n import t
|
||||
|
||||
import uuid
|
||||
|
||||
import sqlalchemy
|
||||
@@ -146,7 +148,13 @@ async def _validate_provider_supports(
|
||||
if not support_type:
|
||||
return
|
||||
if model_type not in support_type:
|
||||
raise ValueError(f'Provider requester "{requester_name}" does not support {model_type} models')
|
||||
raise ValueError(
|
||||
t(
|
||||
'Provider {provider} does not support {model_type} models',
|
||||
provider=requester_name,
|
||||
model_type=model_type,
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
async def _require_workspace_provider(
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from ....i18n import t
|
||||
|
||||
import sqlalchemy
|
||||
import argon2
|
||||
import jwt
|
||||
@@ -423,12 +425,12 @@ class UserService:
|
||||
|
||||
user_obj = await self.get_user_by_email(user_email)
|
||||
if user_obj is None:
|
||||
raise ValueError('用户不存在')
|
||||
raise ValueError(t('Resource not found'))
|
||||
self._require_active_account(user_obj)
|
||||
|
||||
# Check if this user has a local password set
|
||||
if not user_obj.password:
|
||||
raise ValueError('请使用 LangBot 账号登录')
|
||||
raise ValueError(t('Please sign in with your LangBot Account'))
|
||||
|
||||
await self._verify_password(user_obj.password, password)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user