fix(i18n): add missing keys and plural forms, translate agent card menu

This commit is contained in:
ManishMadan2882 committed 2026-09-22 05:28:13 +05:30
1 parent 6282161b5a
commit a0ffafd19f
14 files changed
+126 -38

No files matched your search

+20 -14
View File
@@ -75,7 +75,7 @@ export default function AgentCard({
template: [
{
icon: Duplicate,
label: 'Duplicate',
label: t('modals.prompts.duplicate'),
onClick: (e: SyntheticEvent) => {
e.stopPropagation();
handleDuplicate();
@@ -88,7 +88,7 @@ export default function AgentCard({
user: [
{
icon: Monitoring,
label: 'Logs',
label: t('agents.form.buttons.logs'),
onClick: (e: SyntheticEvent) => {
e.stopPropagation();
navigate(`/agents/logs/${agent.id}`);
@@ -99,7 +99,7 @@ export default function AgentCard({
},
{
icon: Edit,
label: 'Edit',
label: t('agents.edit'),
onClick: (e: SyntheticEvent) => {
e.stopPropagation();
if (agent.agent_type === 'workflow') {
@@ -144,7 +144,9 @@ export default function AgentCard({
? [
{
icon: agent.pinned ? UnPin : Pin,
label: agent.pinned ? 'Unpin' : 'Pin agent',
label: agent.pinned
? t('agents.card.unpin')
: t('agents.card.pin'),
onClick: (e: SyntheticEvent) => {
e.stopPropagation();
togglePin();
@@ -168,7 +170,7 @@ export default function AgentCard({
},
{
icon: Trash,
label: 'Delete',
label: t('agents.form.buttons.delete'),
onClick: (e: SyntheticEvent) => {
e.stopPropagation();
setDeleteConfirmation('ACTIVE');
@@ -185,7 +187,7 @@ export default function AgentCard({
team: [
{
icon: Edit,
label: 'Edit',
label: t('agents.edit'),
onClick: (e: SyntheticEvent) => {
e.stopPropagation();
if (agent.agent_type === 'workflow') {
@@ -202,7 +204,9 @@ export default function AgentCard({
? [
{
icon: agent.pinned ? UnPin : Pin,
label: agent.pinned ? 'Unpin' : 'Pin agent',
label: agent.pinned
? t('agents.card.unpin')
: t('agents.card.pin'),
onClick: (e: SyntheticEvent) => {
e.stopPropagation();
togglePin();
@@ -217,7 +221,7 @@ export default function AgentCard({
shared: [
{
icon: Link,
label: 'Open',
label: t('agents.card.open'),
onClick: (e: SyntheticEvent) => {
e.stopPropagation();
navigate(`/agents/shared/${agent.shared_token}`);
@@ -228,7 +232,7 @@ export default function AgentCard({
},
{
icon: agent.pinned ? UnPin : Pin,
label: agent.pinned ? 'Unpin' : 'Pin agent',
label: agent.pinned ? t('agents.card.unpin') : t('agents.card.pin'),
onClick: (e: SyntheticEvent) => {
e.stopPropagation();
togglePin();
@@ -239,7 +243,7 @@ export default function AgentCard({
},
{
icon: Trash,
label: 'Remove',
label: t('agents.card.remove'),
onClick: (e: SyntheticEvent) => {
e.stopPropagation();
handleHideSharedAgent();
@@ -453,7 +457,9 @@ export default function AgentCard({
imgClassName="h-7 w-7 rounded-full object-contain"
/>
{agent.status === 'draft' && (
<p className="text-foreground text-xs opacity-50">{`(Draft)`}</p>
<p className="text-foreground text-xs opacity-50">
({t('agents.card.draft')})
</p>
)}
</div>
<div className="mt-2">
@@ -469,15 +475,15 @@ export default function AgentCard({
</div>
</div>
<ConfirmationModal
message="Are you sure you want to delete this agent?"
message={t('agents.deleteConfirmation')}
modalState={deleteConfirmation}
setModalState={setDeleteConfirmation}
submitLabel="Delete"
submitLabel={t('agents.form.buttons.delete')}
handleSubmit={() => {
handleDelete();
setDeleteConfirmation('INACTIVE');
}}
cancelLabel="Cancel"
cancelLabel={t('cancel')}
variant="danger"
/>
<Modal
@@ -168,7 +168,7 @@ export default function ConversationMessages({
index,
});
}}
aria-label={t('Retry') || 'Retry'}
aria-label={t('conversation.retry')}
>
<Retry
width={12}
+10 -1
View File
@@ -197,7 +197,7 @@
"queryPlaceholder": "Frage etwas, das diese Quelle beantworten sollte...",
"run": "Ausführen",
"notSavedHint": "Diese Einstellungen gelten nur für diesen Test – sie werden nicht in der Quelle gespeichert. Ändere sie in den Quelleneinstellungen, um sie dauerhaft zu übernehmen.",
"resultSummary": "{{total}} Chunks abgerufen · {{retriever}}",
"resultSummary": "{{count}} Chunks abgerufen · {{retriever}}",
"latency": "{{ms}} ms",
"empty": "Keine Chunks für diese Anfrage abgerufen.",
"emptyWithThreshold": "Keine Chunks haben den Score-Schwellenwert ({{threshold}}) erreicht. Senke ihn, um knappe Treffer zu sehen.",
@@ -589,6 +589,8 @@
"serverName": "Servername",
"serverUrl": "Server-URL",
"headerName": "Header-Name",
"username": "Benutzername",
"password": "Passwort",
"timeout": "Timeout (Sekunden)",
"testConnection": "Verbindung testen",
"testing": "Teste...",
@@ -1282,6 +1284,13 @@
"agents": {
"title": "Agenten",
"edit": "Bearbeiten",
"card": {
"pin": "Agent anheften",
"unpin": "Agent lösen",
"open": "Öffnen",
"remove": "Entfernen",
"draft": "Entwurf"
},
"description": "Entdecke und erstelle benutzerdefinierte Versionen von DocsGPT, die Anweisungen, zusätzliches Wissen und beliebige Kombinationen von Fähigkeiten kombinieren",
"newAgent": "Neuer Agent",
"importAgent": "Import",
+20 -7
View File
@@ -25,7 +25,7 @@
"memberAddedBody": "You were added to {{team}} as {{role}}",
"sharedTitle": "Shared with you",
"sharedBody": "{{type}} shared with your team: {{name}} ({{access}})",
"sharedBodyNoName": "A {{type}} was shared with your team ({{access}})",
"sharedBodyNoName": "{{type}} shared with your team ({{access}})",
"dismiss": "Dismiss"
},
"demo": [
@@ -201,7 +201,8 @@
"queryPlaceholder": "Ask something this source should answer...",
"run": "Run",
"notSavedHint": "These settings are only used for this test — they are not saved to the source. Change them in Source settings to make them permanent.",
"resultSummary": "{{total}} chunks retrieved · {{retriever}}",
"resultSummary_one": "{{count}} chunk retrieved · {{retriever}}",
"resultSummary_other": "{{count}} chunks retrieved · {{retriever}}",
"latency": "{{ms}} ms",
"empty": "No chunks retrieved for this query.",
"emptyWithThreshold": "No chunks scored at or above the score threshold ({{threshold}}). Lower it to see near misses.",
@@ -546,7 +547,7 @@
"needsAuth": "Needs Auth",
"configured": "Configured"
},
"deleteWarning": "Are you sure you want to delete the tool \"{{toolName}}\" ?",
"deleteWarning": "Are you sure you want to delete the tool \"{{toolName}}\"?",
"unsavedChanges": "You have unsaved changes that will be lost if you leave without saving.",
"leaveWithoutSaving": "Leave without Saving",
"saveAndLeave": "Save and Leave",
@@ -594,6 +595,8 @@
"serverName": "Server Name",
"serverUrl": "Server URL",
"headerName": "Header Name",
"username": "Username",
"password": "Password",
"timeout": "Timeout (seconds)",
"testConnection": "Test Connection",
"testing": "Testing",
@@ -925,7 +928,7 @@
"preparing": "Preparing upload",
"parsing": "Parsing files…",
"embedding": "Embedding…",
"tokenLimit": "Over the token limit, please consider uploading smaller document",
"tokenLimit": "Over the token limit, please consider uploading a smaller document",
"expandDetails": "Expand upload details",
"collapseDetails": "Collapse upload details",
"dismiss": "Dismiss upload toast",
@@ -1145,7 +1148,8 @@
"parseError": "Failed to parse the specification. Please check the file format.",
"version": "Version",
"baseUrl": "Base URL",
"actionsFound": "{{count}} actions found",
"actionsFound_one": "{{count}} action found",
"actionsFound_other": "{{count}} actions found",
"selectAll": "Select all",
"deselectAll": "Deselect all",
"cancel": "Cancel",
@@ -1219,7 +1223,8 @@
"title": "Sources",
"text": "Choose Your Sources",
"link": "Source link",
"view_more": "{{count}} more sources",
"view_more_one": "{{count}} more source",
"view_more_other": "{{count}} more sources",
"noSourcesAvailable": "No sources available",
"selectedCount": "{{count}} sources selected",
"groupOwn": "Your sources",
@@ -1293,6 +1298,13 @@
"agents": {
"title": "Agents",
"edit": "Edit",
"card": {
"pin": "Pin agent",
"unpin": "Unpin agent",
"open": "Open",
"remove": "Remove",
"draft": "Draft"
},
"description": "Discover and create custom versions of DocsGPT that combine instructions, extra knowledge, and any combination of skills",
"newAgent": "New Agent",
"importAgent": "Import",
@@ -1473,7 +1485,8 @@
"confidence": "Confidence threshold",
"confidenceHint": "The judge must both flag the content and be at least this confident (default: 0.7)",
"activeCount": "{{count}} active",
"needsSetup": "{{count}} need setup",
"needsSetup_one": "{{count}} needs setup",
"needsSetup_other": "{{count}} need setup",
"setupRequired": "Fill in this check's settings before saving.",
"pickAtLeastOne": "Pick at least one — the check cannot run with none selected.",
"remove": "Remove",
+12 -3
View File
@@ -20,8 +20,8 @@
"memberAddedTitle": "Añadido a un equipo",
"memberAddedBody": "Te añadieron a {{team}} como {{role}}",
"sharedTitle": "Compartido contigo",
"sharedBody": "{{type}} compartido con tu equipo: {{name}} ({{access}})",
"sharedBodyNoName": "Se compartió un {{type}} con tu equipo ({{access}})",
"sharedBody": "Se compartió con tu equipo: {{type}} «{{name}}» ({{access}})",
"sharedBodyNoName": "Se compartió con tu equipo: {{type}} ({{access}})",
"dismiss": "Descartar"
},
"demo": [
@@ -197,7 +197,7 @@
"queryPlaceholder": "Pregunta algo que esta fuente debería responder...",
"run": "Ejecutar",
"notSavedHint": "Estos ajustes solo se usan para esta prueba — no se guardan en la fuente. Cámbialos en Configuración de la fuente para hacerlos permanentes.",
"resultSummary": "{{total}} fragmentos recuperados · {{retriever}}",
"resultSummary": "{{count}} fragmentos recuperados · {{retriever}}",
"latency": "{{ms}} ms",
"empty": "No se recuperaron fragmentos para esta consulta.",
"emptyWithThreshold": "Ningún fragmento alcanzó el umbral de puntuación ({{threshold}}). Bájalo para ver los que estuvieron cerca.",
@@ -589,6 +589,8 @@
"serverName": "Server Name",
"serverUrl": "Server URL",
"headerName": "Header Name",
"username": "Nombre de usuario",
"password": "Contraseña",
"timeout": "Timeout (seconds)",
"testConnection": "Test Connection",
"testing": "Testing",
@@ -1282,6 +1284,13 @@
"agents": {
"title": "Agentes",
"edit": "Editar",
"card": {
"pin": "Fijar agente",
"unpin": "Dejar de fijar agente",
"open": "Abrir",
"remove": "Quitar",
"draft": "Borrador"
},
"description": "Descubre y crea versiones personalizadas de DocsGPT que combinan instrucciones, conocimiento adicional y cualquier combinación de habilidades",
"newAgent": "Nuevo Agente",
"importAgent": "Import",
+10 -1
View File
@@ -197,7 +197,7 @@
"queryPlaceholder": "このソースが回答できそうな質問を入力...",
"run": "実行",
"notSavedHint": "これらの設定はこのテストにのみ使用され、ソースには保存されません。恒久的に変更するにはソース設定で変更してください。",
"resultSummary": "{{total}}件のチャンクを取得 · {{retriever}}",
"resultSummary": "{{count}}件のチャンクを取得 · {{retriever}}",
"latency": "{{ms}} ms",
"empty": "このクエリで取得されたチャンクはありません。",
"emptyWithThreshold": "スコアしきい値({{threshold}})以上のチャンクがありません。しきい値を下げると、惜しい候補を確認できます。",
@@ -589,6 +589,8 @@
"serverName": "Server Name",
"serverUrl": "Server URL",
"headerName": "Header Name",
"username": "ユーザー名",
"password": "パスワード",
"timeout": "Timeout (seconds)",
"testConnection": "Test Connection",
"testing": "Testing",
@@ -1282,6 +1284,13 @@
"agents": {
"title": "エージェント",
"edit": "編集",
"card": {
"pin": "エージェントをピン留め",
"unpin": "エージェントのピン留めを解除",
"open": "開く",
"remove": "削除",
"draft": "下書き"
},
"description": "指示、追加知識、スキルの組み合わせを含むDocsGPTのカスタムバージョンを発見して作成します",
"newAgent": "新しいエージェント",
"importAgent": "Import",
+20 -1
View File
@@ -137,8 +137,12 @@
"confirm": "Преобразовать в вики",
"inProgress": "Преобразование файлов в страницы вики…",
"summaryPages_one": "Создана {{count}} страница",
"summaryPages_few": "Создано страниц: {{count}}",
"summaryPages_many": "Создано страниц: {{count}}",
"summaryPages_other": "Создано страниц: {{count}}",
"summarySkipped_one": "Пропущен {{count}} файл",
"summarySkipped_few": "Пропущено файлов: {{count}}",
"summarySkipped_many": "Пропущено файлов: {{count}}",
"summarySkipped_other": "Пропущено файлов: {{count}}",
"skippedHeading": "Пропущенные файлы",
"done": "Готово",
@@ -165,10 +169,16 @@
"inProgress": "Построение графа…",
"inProgressPct": "Построение графа… {{pct}}%",
"summaryNodes_one": "{{count}} сущность",
"summaryNodes_few": "Сущностей: {{count}}",
"summaryNodes_many": "Сущностей: {{count}}",
"summaryNodes_other": "Сущностей: {{count}}",
"summaryEdges_one": "{{count}} связь",
"summaryEdges_few": "Связей: {{count}}",
"summaryEdges_many": "Связей: {{count}}",
"summaryEdges_other": "Связей: {{count}}",
"summaryChunks_one": "Обработан {{count}} фрагмент",
"summaryChunks_few": "Обработано фрагментов: {{count}}",
"summaryChunks_many": "Обработано фрагментов: {{count}}",
"summaryChunks_other": "Обработано фрагментов: {{count}}",
"done": "Готово",
"errors": {
@@ -197,7 +207,7 @@
"queryPlaceholder": "Спросите что-нибудь, на что этот источник должен ответить...",
"run": "Запустить",
"notSavedHint": "Эти настройки используются только для этого теста — они не сохраняются в источнике. Чтобы сделать их постоянными, измените их в настройках источника.",
"resultSummary": "Извлечено фрагментов: {{total}} · {{retriever}}",
"resultSummary": "Извлечено фрагментов: {{count}} · {{retriever}}",
"latency": "{{ms}} мс",
"empty": "По этому запросу фрагменты не извлечены.",
"emptyWithThreshold": "Ни один фрагмент не набрал оценку не ниже порога ({{threshold}}). Понизьте порог, чтобы увидеть близкие результаты.",
@@ -589,6 +599,8 @@
"serverName": "Server Name",
"serverUrl": "Server URL",
"headerName": "Header Name",
"username": "Имя пользователя",
"password": "Пароль",
"timeout": "Timeout (seconds)",
"testConnection": "Test Connection",
"testing": "Testing",
@@ -1302,6 +1314,13 @@
"agents": {
"title": "Агенты",
"edit": "Редактировать",
"card": {
"pin": "Закрепить агента",
"unpin": "Открепить агента",
"open": "Открыть",
"remove": "Удалить",
"draft": "Черновик"
},
"description": "Откройте и создайте пользовательские версии DocsGPT, которые объединяют инструкции, дополнительные знания и любую комбинацию навыков",
"newAgent": "Новый Агент",
"importAgent": "Import",
+10 -1
View File
@@ -197,7 +197,7 @@
"queryPlaceholder": "輸入此來源應能回答的問題...",
"run": "執行",
"notSavedHint": "這些設定僅用於此次測試,不會儲存到來源。若要永久生效,請至來源設定中修改。",
"resultSummary": "檢索到 {{total}} 個區塊 · {{retriever}}",
"resultSummary": "檢索到 {{count}} 個區塊 · {{retriever}}",
"latency": "{{ms}} ms",
"empty": "此查詢未檢索到任何區塊。",
"emptyWithThreshold": "沒有區塊的分數達到分數門檻({{threshold}})。調低門檻可查看接近的結果。",
@@ -589,6 +589,8 @@
"serverName": "Server Name",
"serverUrl": "Server URL",
"headerName": "Header Name",
"username": "使用者名稱",
"password": "密碼",
"timeout": "Timeout (seconds)",
"testConnection": "Test Connection",
"testing": "Testing",
@@ -1282,6 +1284,13 @@
"agents": {
"title": "代理",
"edit": "編輯",
"card": {
"pin": "釘選代理",
"unpin": "取消釘選代理",
"open": "開啟",
"remove": "移除",
"draft": "草稿"
},
"description": "探索並創建結合指令、額外知識和任意技能組合的DocsGPT自訂版本",
"newAgent": "新建代理",
"importAgent": "Import",
+10 -1
View File
@@ -197,7 +197,7 @@
"queryPlaceholder": "输入一个此来源应能回答的问题...",
"run": "运行",
"notSavedHint": "这些设置仅用于本次测试,不会保存到来源。如需永久生效,请在来源设置中修改。",
"resultSummary": "检索到 {{total}} 个文本块 · {{retriever}}",
"resultSummary": "检索到 {{count}} 个文本块 · {{retriever}}",
"latency": "{{ms}} 毫秒",
"empty": "此查询未检索到任何文本块。",
"emptyWithThreshold": "没有文本块的得分达到分数阈值({{threshold}})。降低阈值可查看接近的结果。",
@@ -589,6 +589,8 @@
"serverName": "Server Name",
"serverUrl": "Server URL",
"headerName": "Header Name",
"username": "用户名",
"password": "密码",
"timeout": "Timeout (seconds)",
"testConnection": "Test Connection",
"testing": "Testing",
@@ -1282,6 +1284,13 @@
"agents": {
"title": "代理",
"edit": "编辑",
"card": {
"pin": "固定代理",
"unpin": "取消固定代理",
"open": "打开",
"remove": "移除",
"draft": "草稿"
},
"description": "发现并创建结合指令、额外知识和任意技能组合的DocsGPT自定义版本",
"newAgent": "新建代理",
"importAgent": "Import",
+2 -2
View File
@@ -524,7 +524,7 @@ export default function MCPServerModal({
type="text"
value={formData.username}
onChange={(e) => handleInputChange('username', e.target.value)}
placeholder={t('settings.tools.mcp.username')}
placeholder={t('settings.tools.mcp.placeholders.username')}
aria-invalid={!!errors.username || undefined}
className="rounded-xl"
/>
@@ -542,7 +542,7 @@ export default function MCPServerModal({
type="password"
value={formData.password}
onChange={(e) => handleInputChange('password', e.target.value)}
placeholder={t('settings.tools.mcp.password')}
placeholder={t('settings.tools.mcp.placeholders.password')}
aria-invalid={!!errors.password || undefined}
className="rounded-xl"
/>
+1 -1
View File
@@ -193,7 +193,7 @@ export default function MoveToFolderModal({
{isLoading ? (
<div className="flex h-[200px] items-center justify-center">
<span className="text-muted-foreground text-sm">
{t('loading')}...
{t('modals.searchConversations.loading')}
</span>
</div>
) : (
+2 -2
View File
@@ -387,7 +387,7 @@ function AddPrompt({
<VariableMenu
options={toolVariables}
label="Tool Variables"
label={t('modals.prompts.toolVariables')}
textareaId="new-prompt-content"
content={newPromptContent}
setContent={setNewPromptContent}
@@ -537,7 +537,7 @@ function EditPrompt({
<VariableMenu
options={toolVariables}
label="Tool Variables"
label={t('modals.prompts.toolVariables')}
textareaId="edit-prompt-content"
content={editPromptContent}
setContent={setEditPromptContent}
+7 -2
View File
@@ -339,9 +339,14 @@ export default function Prompts({
)}
>
<Command>
<CommandInput placeholder="Search..." className="h-9" />
<CommandInput
placeholder={t('settings.sources.searchPlaceholder')}
className="h-9"
/>
<CommandList>
<CommandEmpty>No results found</CommandEmpty>
<CommandEmpty>
{t('settings.sources.noResults')}
</CommandEmpty>
{prompts.map((prompt) => {
const isActive = selectedPrompt?.id === prompt.id;
const canModify = prompt.type !== 'public';
+1 -1
View File
@@ -246,7 +246,7 @@ export default function TestRetrievalModal({
<div className="text-muted-foreground flex flex-row items-center justify-between text-xs">
<span>
{tr('resultSummary', {
total: result.total,
count: result.total,
retriever: result.retriever,
})}
</span>