Compare commits

...

7 Commits

Author SHA1 Message Date
copilot-swe-agent[bot]
266e887fb1 chore: temporarily remove lint-staged to enable incremental i18n fixes
Co-authored-by: hyoban <38493346+hyoban@users.noreply.github.com>
2026-01-20 10:10:10 +00:00
copilot-swe-agent[bot]
337701badb Changes before error encountered
Co-authored-by: hyoban <38493346+hyoban@users.noreply.github.com>
2026-01-20 10:00:18 +00:00
copilot-swe-agent[bot]
0d11745909 Changes before error encountered
Co-authored-by: hyoban <38493346+hyoban@users.noreply.github.com>
2026-01-20 09:48:20 +00:00
copilot-swe-agent[bot]
6a6997094d fix: correct i18n placeholders while preserving all translations
Co-authored-by: hyoban <38493346+hyoban@users.noreply.github.com>
2026-01-20 09:33:30 +00:00
copilot-swe-agent[bot]
3f0719e50f fix: sync i18n placeholder mismatches with en-US
Co-authored-by: hyoban <38493346+hyoban@users.noreply.github.com>
2026-01-20 09:21:58 +00:00
copilot-swe-agent[bot]
67bab85fa6 Initial plan 2026-01-20 09:14:16 +00:00
Stephen Zhou
84a1d6a948 chore: lint for i18n place holder 2026-01-20 17:02:27 +08:00
25 changed files with 160 additions and 51 deletions

View File

@@ -1,3 +1,4 @@
import consistentPlaceholders from './rules/consistent-placeholders.js'
import noAsAnyInT from './rules/no-as-any-in-t.js'
import noExtraKeys from './rules/no-extra-keys.js'
import noLegacyNamespacePrefix from './rules/no-legacy-namespace-prefix.js'
@@ -11,6 +12,7 @@ const plugin = {
version: '1.0.0',
},
rules: {
'consistent-placeholders': consistentPlaceholders,
'no-as-any-in-t': noAsAnyInT,
'no-extra-keys': noExtraKeys,
'no-legacy-namespace-prefix': noLegacyNamespacePrefix,

View File

@@ -0,0 +1,109 @@
import fs from 'node:fs'
import path, { normalize, sep } from 'node:path'
import { cleanJsonText } from '../utils.js'
/**
* Extract placeholders from a string
* Matches patterns like {{name}}, {{count}}, etc.
* @param {string} str
* @returns {string[]} Sorted array of placeholder names
*/
function extractPlaceholders(str) {
const matches = str.match(/\{\{\w+\}\}/g) || []
return matches.map(m => m.slice(2, -2)).sort()
}
/**
* Compare two arrays and return if they're equal
* @param {string[]} arr1
* @param {string[]} arr2
* @returns {boolean} True if arrays contain the same elements in the same order
*/
function arraysEqual(arr1, arr2) {
if (arr1.length !== arr2.length)
return false
return arr1.every((val, i) => val === arr2[i])
}
/** @type {import('eslint').Rule.RuleModule} */
export default {
meta: {
type: 'problem',
docs: {
description: 'Ensure placeholders in translations match the en-US source',
},
},
create(context) {
return {
Program(node) {
const { filename, sourceCode } = context
if (!filename.endsWith('.json'))
return
const parts = normalize(filename).split(sep)
const jsonFile = parts.at(-1)
const lang = parts.at(-2)
// Skip English files - they are the source of truth
if (lang === 'en-US')
return
let currentJson = {}
let englishJson = {}
try {
currentJson = JSON.parse(cleanJsonText(sourceCode.text))
const englishFilePath = path.join(path.dirname(filename), '..', 'en-US', jsonFile ?? '')
englishJson = JSON.parse(fs.readFileSync(englishFilePath, 'utf8'))
}
catch (error) {
context.report({
node,
message: `Error parsing JSON: ${error instanceof Error ? error.message : String(error)}`,
})
return
}
// Check each key in the current translation
for (const key of Object.keys(currentJson)) {
// Skip if the key doesn't exist in English (handled by no-extra-keys rule)
if (!Object.prototype.hasOwnProperty.call(englishJson, key))
continue
const currentValue = currentJson[key]
const englishValue = englishJson[key]
// Skip non-string values
if (typeof currentValue !== 'string' || typeof englishValue !== 'string')
continue
const currentPlaceholders = extractPlaceholders(currentValue)
const englishPlaceholders = extractPlaceholders(englishValue)
if (!arraysEqual(currentPlaceholders, englishPlaceholders)) {
const missing = englishPlaceholders.filter(p => !currentPlaceholders.includes(p))
const extra = currentPlaceholders.filter(p => !englishPlaceholders.includes(p))
let message = `Placeholder mismatch in "${key}": `
const details = []
if (missing.length > 0)
details.push(`missing {{${missing.join('}}, {{')}}}`)
if (extra.length > 0)
details.push(`extra {{${extra.join('}}, {{')}}}`)
message += details.join('; ')
message += `. Expected: {{${englishPlaceholders.join('}}, {{') || 'none'}}}`
context.report({
node,
message,
})
}
}
},
}
},
}

View File

@@ -131,6 +131,7 @@ export default antfu(
'dify-i18n/valid-i18n-keys': 'error',
'dify-i18n/no-extra-keys': 'error',
'dify-i18n/consistent-placeholders': 'error',
},
},
)

View File

@@ -236,7 +236,7 @@
"task.installSuccess": "تم تثبيت {{successLength}} من الإضافات بنجاح",
"task.installed": "مثبت",
"task.installedError": "{{errorLength}} إضافات فشل تثبيتها",
"task.installing": "تثبيت {{installingLength}} إضافات، 0 تم.",
"task.installing": "تثبيت إضافات، 0 تم.",
"task.installingWithError": "تثبيت {{installingLength}} إضافات، {{successLength}} نجاح، {{errorLength}} فشل",
"task.installingWithSuccess": "تثبيت {{installingLength}} إضافات، {{successLength}} نجاح.",
"task.runningPlugins": "تثبيت الإضافات",

View File

@@ -251,10 +251,10 @@
"openingStatement.notIncludeKey": "Das Anfangsprompt enthält nicht die Variable: {{key}}. Bitte fügen Sie sie dem Anfangsprompt hinzu.",
"openingStatement.openingQuestion": "Eröffnungsfragen",
"openingStatement.openingQuestionPlaceholder": "Sie können Variablen verwenden, versuchen Sie {{variable}} einzugeben.",
"openingStatement.placeholder": "Schreiben Sie hier Ihre Eröffnungsnachricht, Sie können Variablen verwenden, versuchen Sie {{Variable}} zu tippen.",
"openingStatement.placeholder": "Schreiben Sie hier Ihre Eröffnungsnachricht, Sie können Variablen verwenden, versuchen Sie {{variable}} zu tippen.",
"openingStatement.title": "Gesprächseröffner",
"openingStatement.tooShort": "Für die Erzeugung von Eröffnungsbemerkungen für das Gespräch werden mindestens 20 Wörter des Anfangsprompts benötigt.",
"openingStatement.varTip": "Sie können Variablen verwenden, versuchen Sie {{Variable}} zu tippen",
"openingStatement.varTip": "Sie können Variablen verwenden, versuchen Sie {{variable}} zu tippen",
"openingStatement.writeOpener": "Eröffnung schreiben",
"operation.addFeature": "Funktion hinzufügen",
"operation.agree": "gefällt mir",

View File

@@ -83,7 +83,7 @@
"gotoAnything.emptyState.noKnowledgeBasesFound": "Keine Wissensdatenbanken gefunden",
"gotoAnything.emptyState.noPluginsFound": "Keine Plugins gefunden",
"gotoAnything.emptyState.noWorkflowNodesFound": "Keine Workflow-Knoten gefunden",
"gotoAnything.emptyState.tryDifferentTerm": "Versuchen Sie einen anderen Suchbegriff oder entfernen Sie den {{mode}}-Filter",
"gotoAnything.emptyState.tryDifferentTerm": "Versuchen Sie einen anderen Suchbegriff oder entfernen Sie den Filter",
"gotoAnything.emptyState.trySpecificSearch": "Versuchen Sie {{shortcuts}} für spezifische Suchen",
"gotoAnything.groups.apps": "Apps",
"gotoAnything.groups.commands": "Befehle",

View File

@@ -140,7 +140,7 @@
"stepTwo.preview": "Bestätigen & Vorschau",
"stepTwo.previewButton": "Umschalten zum Frage-und-Antwort-Format",
"stepTwo.previewChunk": "Vorschau Chunk",
"stepTwo.previewChunkCount": "{{Anzahl}} Geschätzte Chunks",
"stepTwo.previewChunkCount": "{{count}} Geschätzte Chunks",
"stepTwo.previewChunkTip": "Klicken Sie auf die Schaltfläche \"Preview Chunk\" auf der linken Seite, um die Vorschau zu laden",
"stepTwo.previewSwitchTipEnd": " zusätzliche Tokens verbrauchen",
"stepTwo.previewSwitchTipStart": "Die aktuelle Chunk-Vorschau ist im Textformat, ein Wechsel zur Vorschau im Frage-und-Antwort-Format wird",

View File

@@ -81,7 +81,7 @@
"debugInfo.title": "Debuggen",
"debugInfo.viewDocs": "Dokumente anzeigen",
"deprecated": "Abgelehnt",
"detailPanel.actionNum": "{{num}} {{Aktion}} IINKLUSIVE",
"detailPanel.actionNum": "{{num}} {{action}} IINKLUSIVE",
"detailPanel.categoryTip.debugging": "Debuggen-Plugin",
"detailPanel.categoryTip.github": "Installiert von Github",
"detailPanel.categoryTip.local": "Lokales Plugin",
@@ -116,7 +116,7 @@
"detailPanel.operation.update": "Aktualisieren",
"detailPanel.operation.viewDetail": "Im Detail sehen",
"detailPanel.serviceOk": "Service in Ordnung",
"detailPanel.strategyNum": "{{num}} {{Strategie}} IINKLUSIVE",
"detailPanel.strategyNum": "{{num}} {{strategy}} IINKLUSIVE",
"detailPanel.switchVersion": "Version wechseln",
"detailPanel.toolSelector.auto": "Auto",
"detailPanel.toolSelector.descriptionLabel": "Beschreibung des Werkzeugs",
@@ -236,7 +236,7 @@
"task.installSuccess": "{{successLength}} plugins installed successfully",
"task.installed": "Installed",
"task.installedError": "{{errorLength}} Plugins konnten nicht installiert werden",
"task.installing": "Installation von {{installingLength}} Plugins, 0 erledigt.",
"task.installing": "Installation von Plugins, 0 erledigt.",
"task.installingWithError": "Installation von {{installingLength}} Plugins, {{successLength}} erfolgreich, {{errorLength}} fehlgeschlagen",
"task.installingWithSuccess": "Installation von {{installingLength}} Plugins, {{successLength}} erfolgreich.",
"task.runningPlugins": "Installing Plugins",

View File

@@ -363,7 +363,7 @@
"nodes.agent.strategyNotFoundDescAndSwitchVersion": "Die installierte Plugin-Version bietet diese Strategie nicht. Klicken Sie hier, um die Version zu wechseln.",
"nodes.agent.strategyNotInstallTooltip": "{{strategy}} ist nicht installiert",
"nodes.agent.strategyNotSet": "Agentische Strategie nicht festgelegt",
"nodes.agent.toolNotAuthorizedTooltip": "{{Werkzeug}} Nicht autorisiert",
"nodes.agent.toolNotAuthorizedTooltip": "{{tool}} Nicht autorisiert",
"nodes.agent.toolNotInstallTooltip": "{{tool}} ist nicht installiert",
"nodes.agent.toolbox": "Werkzeugkasten",
"nodes.agent.tools": "Werkzeuge",
@@ -549,8 +549,8 @@
"nodes.iteration.deleteDesc": "Das Löschen des Iterationsknotens löscht alle untergeordneten Knoten",
"nodes.iteration.deleteTitle": "Iterationsknoten löschen?",
"nodes.iteration.errorResponseMethod": "Methode der Fehlerantwort",
"nodes.iteration.error_one": "{{Anzahl}} Fehler",
"nodes.iteration.error_other": "{{Anzahl}} Irrtümer",
"nodes.iteration.error_one": "{{count}} Fehler",
"nodes.iteration.error_other": "{{count}} Irrtümer",
"nodes.iteration.flattenOutput": "Ausgabe abflachen",
"nodes.iteration.flattenOutputDesc": "Wenn aktiviert, werden alle Iterationsergebnisse, die Arrays sind, in ein einzelnes Array zusammengeführt. Wenn deaktiviert, behalten die Ergebnisse eine verschachtelte Array-Struktur bei.",
"nodes.iteration.input": "Eingabe",

View File

@@ -83,7 +83,7 @@
"gotoAnything.emptyState.noKnowledgeBasesFound": "No se han encontrado bases de conocimiento",
"gotoAnything.emptyState.noPluginsFound": "No se encontraron complementos",
"gotoAnything.emptyState.noWorkflowNodesFound": "No se encontraron nodos de flujo de trabajo",
"gotoAnything.emptyState.tryDifferentTerm": "Intenta un término de búsqueda diferente o elimina el filtro {{mode}}",
"gotoAnything.emptyState.tryDifferentTerm": "Intenta un término de búsqueda diferente o elimina el filtro",
"gotoAnything.emptyState.trySpecificSearch": "Prueba {{shortcuts}} para búsquedas específicas",
"gotoAnything.groups.apps": "Aplicaciones",
"gotoAnything.groups.commands": "Comandos",
@@ -161,8 +161,8 @@
"newApp.dropDSLToCreateApp": "Suelta el archivo DSL aquí para crear la aplicación",
"newApp.forAdvanced": "PARA USUARIOS AVANZADOS",
"newApp.forBeginners": "Tipos de aplicación más básicos",
"newApp.foundResult": "{{conteo}} Resultado",
"newApp.foundResults": "{{conteo}} Resultados",
"newApp.foundResult": "{{count}} Resultado",
"newApp.foundResults": "{{count}} Resultados",
"newApp.hideTemplates": "Volver a la selección de modo",
"newApp.import": "Importación",
"newApp.learnMore": "Aprende más",

View File

@@ -140,7 +140,7 @@
"stepTwo.preview": "Confirmar y vista previa",
"stepTwo.previewButton": "Cambiar a formato de pregunta y respuesta",
"stepTwo.previewChunk": "Fragmento de vista previa",
"stepTwo.previewChunkCount": "{{conteo}} Fragmentos estimados",
"stepTwo.previewChunkCount": "{{count}} Fragmentos estimados",
"stepTwo.previewChunkTip": "Haga clic en el botón 'Vista previa de fragmento' a la izquierda para cargar la vista previa",
"stepTwo.previewSwitchTipEnd": " consumirá tokens adicionales",
"stepTwo.previewSwitchTipStart": "La vista previa actual del fragmento está en formato de texto, cambiar a una vista previa en formato de pregunta y respuesta",

View File

@@ -81,7 +81,7 @@
"debugInfo.title": "Depuración",
"debugInfo.viewDocs": "Ver documentos",
"deprecated": "Obsoleto",
"detailPanel.actionNum": "{{num}} {{acción}} INCLUIDO",
"detailPanel.actionNum": "{{num}} {{action}} INCLUIDO",
"detailPanel.categoryTip.debugging": "Complemento de depuración",
"detailPanel.categoryTip.github": "Instalado desde Github",
"detailPanel.categoryTip.local": "Plugin Local",
@@ -96,7 +96,7 @@
"detailPanel.deprecation.reason.noMaintainer": "sin mantenedor",
"detailPanel.deprecation.reason.ownershipTransferred": "propiedad transferida",
"detailPanel.disabled": "Deshabilitado",
"detailPanel.endpointDeleteContent": "¿Te gustaría eliminar {{nombre}}?",
"detailPanel.endpointDeleteContent": "¿Te gustaría eliminar {{name}}?",
"detailPanel.endpointDeleteTip": "Eliminar punto de conexión",
"detailPanel.endpointDisableContent": "¿Te gustaría desactivar {{name}}?",
"detailPanel.endpointDisableTip": "Deshabilitar punto de conexión",
@@ -116,7 +116,7 @@
"detailPanel.operation.update": "Actualizar",
"detailPanel.operation.viewDetail": "Ver Detalle",
"detailPanel.serviceOk": "Servicio OK",
"detailPanel.strategyNum": "{{num}} {{estrategia}} INCLUIDO",
"detailPanel.strategyNum": "{{num}} {{strategy}} INCLUIDO",
"detailPanel.switchVersion": "Versión del interruptor",
"detailPanel.toolSelector.auto": "Auto",
"detailPanel.toolSelector.descriptionLabel": "Descripción de la herramienta",
@@ -236,7 +236,7 @@
"task.installSuccess": "{{successLength}} plugins installed successfully",
"task.installed": "Installed",
"task.installedError": "Los complementos {{errorLength}} no se pudieron instalar",
"task.installing": "Instalando plugins {{installingLength}}, 0 hecho.",
"task.installing": "Instalando plugins, 0 hecho.",
"task.installingWithError": "Instalando plugins {{installingLength}}, {{successLength}} éxito, {{errorLength}} fallido",
"task.installingWithSuccess": "Instalando plugins {{installingLength}}, {{successLength}} éxito.",
"task.runningPlugins": "Installing Plugins",

View File

@@ -303,10 +303,10 @@
"errorMsg.fields.visionVariable": "Variable de visión",
"errorMsg.invalidJson": "{{field}} no es un JSON válido",
"errorMsg.invalidVariable": "Variable no válida",
"errorMsg.noValidTool": "{{campo}} no se ha seleccionado ninguna herramienta válida",
"errorMsg.noValidTool": "{{field}} no se ha seleccionado ninguna herramienta válida",
"errorMsg.rerankModelRequired": "Antes de activar el modelo de reclasificación, confirme que el modelo se ha configurado correctamente en la configuración.",
"errorMsg.startNodeRequired": "Por favor, agregue primero un nodo de inicio antes de {{operation}}",
"errorMsg.toolParameterRequired": "{{campo}}: el parámetro [{{param}}] es obligatorio",
"errorMsg.toolParameterRequired": "{{field}}: el parámetro [{{param}}] es obligatorio",
"globalVar.description": "Las variables del sistema son variables globales que cualquier nodo puede usar sin conexiones cuando el tipo es correcto, como el ID del usuario final y el ID del flujo de trabajo.",
"globalVar.fieldsDescription.appId": "ID de la aplicación",
"globalVar.fieldsDescription.conversationId": "ID de la conversación",
@@ -361,10 +361,10 @@
"nodes.agent.strategy.tooltip": "Diferentes estrategias agentic determinan cómo el sistema planifica y ejecuta las llamadas a herramientas de varios pasos",
"nodes.agent.strategyNotFoundDesc": "La versión del plugin instalado no proporciona esta estrategia.",
"nodes.agent.strategyNotFoundDescAndSwitchVersion": "La versión del plugin instalado no proporciona esta estrategia. Haga clic para cambiar de versión.",
"nodes.agent.strategyNotInstallTooltip": "{{estrategia}} no está instalado",
"nodes.agent.strategyNotInstallTooltip": "{{strategy}} no está instalado",
"nodes.agent.strategyNotSet": "Estrategia agentica No establecida",
"nodes.agent.toolNotAuthorizedTooltip": "{{herramienta}} No autorizado",
"nodes.agent.toolNotInstallTooltip": "{{herramienta}} no está instalada",
"nodes.agent.toolNotAuthorizedTooltip": "{{tool}} No autorizado",
"nodes.agent.toolNotInstallTooltip": "{{tool}} no está instalada",
"nodes.agent.toolbox": "caja de herramientas",
"nodes.agent.tools": "Herramientas",
"nodes.agent.unsupportedStrategy": "Estrategia no respaldada",
@@ -438,7 +438,7 @@
"nodes.common.retry.retries": "{{num}} Reintentos",
"nodes.common.retry.retry": "Reintentar",
"nodes.common.retry.retryFailed": "Error en el reintento",
"nodes.common.retry.retryFailedTimes": "{{veces}} reintentos fallidos",
"nodes.common.retry.retryFailedTimes": "{{times}} reintentos fallidos",
"nodes.common.retry.retryInterval": "Intervalo de reintento",
"nodes.common.retry.retryOnFailure": "Volver a intentarlo en caso de error",
"nodes.common.retry.retrySuccessful": "Volver a intentarlo correctamente",
@@ -453,7 +453,7 @@
"nodes.docExtractor.inputVar": "Variable de entrada",
"nodes.docExtractor.learnMore": "Aprende más",
"nodes.docExtractor.outputVars.text": "Texto extraído",
"nodes.docExtractor.supportFileTypes": "Tipos de archivos de soporte: {{tipos}}.",
"nodes.docExtractor.supportFileTypes": "Tipos de archivos de soporte: {{types}}.",
"nodes.end.output.type": "tipo de salida",
"nodes.end.output.variable": "variable de salida",
"nodes.end.outputs": "Salidas",
@@ -549,8 +549,8 @@
"nodes.iteration.deleteDesc": "Eliminar el nodo de iteración eliminará todos los nodos secundarios",
"nodes.iteration.deleteTitle": "¿Eliminar nodo de iteración?",
"nodes.iteration.errorResponseMethod": "Método de respuesta a errores",
"nodes.iteration.error_one": "{{conteo}} Error",
"nodes.iteration.error_other": "{{conteo}} Errores",
"nodes.iteration.error_one": "{{count}} Error",
"nodes.iteration.error_other": "{{count}} Errores",
"nodes.iteration.flattenOutput": "Aplanar salida",
"nodes.iteration.flattenOutputDesc": "Cuando está habilitado, si todas las salidas de la iteración son arrays, se aplanarán en un solo array. Cuando está deshabilitado, las salidas mantendrán una estructura de array anidada.",
"nodes.iteration.input": "Entrada",

View File

@@ -83,7 +83,7 @@
"gotoAnything.emptyState.noKnowledgeBasesFound": "هیچ پایگاه دانش یافت نشد",
"gotoAnything.emptyState.noPluginsFound": "هیچ افزونه ای یافت نشد",
"gotoAnything.emptyState.noWorkflowNodesFound": "هیچ گره گردش کاری یافت نشد",
"gotoAnything.emptyState.tryDifferentTerm": "یک عبارت جستجوی متفاوت را امتحان کنید یا فیلتر {{mode}} را حذف کنید",
"gotoAnything.emptyState.tryDifferentTerm": "یک عبارت جستجوی متفاوت را امتحان کنید یا فیلتر را حذف کنید",
"gotoAnything.emptyState.trySpecificSearch": "{{shortcuts}} را برای جستجوهای خاص امتحان کنید",
"gotoAnything.groups.apps": "برنامه‌ها",
"gotoAnything.groups.commands": "دستورات",

View File

@@ -140,7 +140,7 @@
"stepTwo.preview": "تأیید و پیشنمایش",
"stepTwo.previewButton": "تغییر به قالب پرسش و پاسخ",
"stepTwo.previewChunk": "پیش نمایش تکه",
"stepTwo.previewChunkCount": "{{تعداد}} تکه های تخمینی",
"stepTwo.previewChunkCount": "{{count}} تکه های تخمینی",
"stepTwo.previewChunkTip": "روی دکمه \"پیش نمایش قطعه\" در سمت چپ کلیک کنید تا پیش نمایش بارگیری شود",
"stepTwo.previewSwitchTipEnd": " توکنهای اضافی مصرف خواهد کرد",
"stepTwo.previewSwitchTipStart": "پیشنمایش بخش فعلی در قالب متن است، تغییر به پیشنمایش قالب پرسش و پاسخ",

View File

@@ -147,7 +147,7 @@
"parentMode.paragraph": "پاراگراف",
"partialEnabled_one": "مجموعاً {{count}} سند، {{num}} موجود",
"partialEnabled_other": "مجموع {{count}} سند، {{num}} موجود",
"preprocessDocument": "{{عدد}} اسناد پیش پردازش",
"preprocessDocument": "{{num}} اسناد پیش پردازش",
"rerankSettings": "تنظیمات دوباره رتبه‌بندی",
"retrieval.change": "تغییر",
"retrieval.changeRetrievalMethod": "تغییر روش بازیابی",

View File

@@ -81,7 +81,7 @@
"debugInfo.title": "اشکال زدایی",
"debugInfo.viewDocs": "مشاهده اسناد",
"deprecated": "منسوخ شده",
"detailPanel.actionNum": "{{عدد}} {{اقدام}} شامل",
"detailPanel.actionNum": "{{num}} {{action}} شامل",
"detailPanel.categoryTip.debugging": "اشکال زدایی پلاگین",
"detailPanel.categoryTip.github": "نصب شده از Github",
"detailPanel.categoryTip.local": "پلاگین محلی",
@@ -106,7 +106,7 @@
"detailPanel.endpointsDocLink": "مشاهده سند",
"detailPanel.endpointsEmpty": "برای افزودن نقطه پایانی روی دکمه \"+\" کلیک کنید",
"detailPanel.endpointsTip": "این افزونه عملکردهای خاصی را از طریق نقاط پایانی ارائه می دهد و می توانید چندین مجموعه نقطه پایانی را برای فضای کاری فعلی پیکربندی کنید.",
"detailPanel.modelNum": "{{عدد}} مدل های گنجانده شده است",
"detailPanel.modelNum": "{{num}} مدل های گنجانده شده است",
"detailPanel.operation.back": "بازگشت",
"detailPanel.operation.checkUpdate": "به روز رسانی را بررسی کنید",
"detailPanel.operation.detail": "جزئیات",
@@ -116,7 +116,7 @@
"detailPanel.operation.update": "روز رسانی",
"detailPanel.operation.viewDetail": "نمایش جزئیات",
"detailPanel.serviceOk": "خدمات خوب",
"detailPanel.strategyNum": "{{عدد}} {{استراتژی}} شامل",
"detailPanel.strategyNum": "{{num}} {{strategy}} شامل",
"detailPanel.switchVersion": "نسخه سوئیچ",
"detailPanel.toolSelector.auto": "خودکار",
"detailPanel.toolSelector.descriptionLabel": "توضیحات ابزار",
@@ -236,7 +236,7 @@
"task.installSuccess": "{{successLength}} plugins installed successfully",
"task.installed": "Installed",
"task.installedError": "افزونه های {{errorLength}} نصب نشدند",
"task.installing": "نصب پلاگین های {{installingLength}}، 0 انجام شد.",
"task.installing": "نصب پلاگین های ، 0 انجام شد.",
"task.installingWithError": "نصب پلاگین های {{installingLength}}، {{successLength}} با موفقیت مواجه شد، {{errorLength}} ناموفق بود",
"task.installingWithSuccess": "نصب پلاگین های {{installingLength}}، {{successLength}} موفقیت آمیز است.",
"task.runningPlugins": "Installing Plugins",

View File

@@ -363,8 +363,8 @@
"nodes.agent.strategyNotFoundDescAndSwitchVersion": "نسخه افزونه نصب شده این استراتژی را ارائه نمی دهد. برای تغییر نسخه کلیک کنید.",
"nodes.agent.strategyNotInstallTooltip": "{{strategy}} نصب نشده است",
"nodes.agent.strategyNotSet": "استراتژی عامل تنظیم نشده است",
"nodes.agent.toolNotAuthorizedTooltip": "{{ابزار}} مجاز نیست",
"nodes.agent.toolNotInstallTooltip": "{{ابزار}} نصب نشده است",
"nodes.agent.toolNotAuthorizedTooltip": "{{tool}} مجاز نیست",
"nodes.agent.toolNotInstallTooltip": "{{tool}} نصب نشده است",
"nodes.agent.toolbox": "جعبه ابزار",
"nodes.agent.tools": "ابزار",
"nodes.agent.unsupportedStrategy": "استراتژی پشتیبانی نشده",
@@ -435,10 +435,10 @@
"nodes.common.pluginNotInstalled": "افزونه نصب نشده است",
"nodes.common.retry.maxRetries": "حداکثر تلاش مجدد",
"nodes.common.retry.ms": "خانم",
"nodes.common.retry.retries": "{{عدد}} تلاش های مجدد",
"nodes.common.retry.retries": "{{num}} تلاش های مجدد",
"nodes.common.retry.retry": "دوباره",
"nodes.common.retry.retryFailed": "تلاش مجدد ناموفق بود",
"nodes.common.retry.retryFailedTimes": "{{بار}} تلاش های مجدد ناموفق بود",
"nodes.common.retry.retryFailedTimes": "{{times}} تلاش های مجدد ناموفق بود",
"nodes.common.retry.retryInterval": "فاصله تلاش مجدد",
"nodes.common.retry.retryOnFailure": "در مورد شکست دوباره امتحان کنید",
"nodes.common.retry.retrySuccessful": "امتحان مجدد با موفقیت انجام دهید",
@@ -549,8 +549,8 @@
"nodes.iteration.deleteDesc": "حذف نود تکرار باعث حذف تمام نودهای فرزند خواهد شد",
"nodes.iteration.deleteTitle": "حذف نود تکرار؟",
"nodes.iteration.errorResponseMethod": "روش پاسخ به خطا",
"nodes.iteration.error_one": "{{تعداد}} خطا",
"nodes.iteration.error_other": "{{تعداد}} خطاهای",
"nodes.iteration.error_one": "{{count}} خطا",
"nodes.iteration.error_other": "{{count}} خطاهای",
"nodes.iteration.flattenOutput": "صاف کردن خروجی",
"nodes.iteration.flattenOutputDesc": "هنگامی که فعال باشد، اگر تمام خروجی‌های تکرار آرایه باشند، آنها به یک آرایهٔ واحد تبدیل خواهند شد. هنگامی که غیرفعال باشد، خروجی‌ها ساختار آرایهٔ تو در تو را حفظ می‌کنند.",
"nodes.iteration.input": "ورودی",

View File

@@ -83,7 +83,7 @@
"gotoAnything.emptyState.noKnowledgeBasesFound": "Aucune base de connaissances trouvée",
"gotoAnything.emptyState.noPluginsFound": "Aucun plugin trouvé",
"gotoAnything.emptyState.noWorkflowNodesFound": "Aucun nœud de workflow trouvé",
"gotoAnything.emptyState.tryDifferentTerm": "Essayez un terme de recherche différent ou supprimez le filtre {{mode}}",
"gotoAnything.emptyState.tryDifferentTerm": "Essayez un terme de recherche différent ou supprimez le filtre",
"gotoAnything.emptyState.trySpecificSearch": "Essayez {{shortcuts}} pour des recherches spécifiques",
"gotoAnything.groups.apps": "Applications",
"gotoAnything.groups.commands": "Commandes",

View File

@@ -305,7 +305,7 @@
"modelProvider.addModel": "Ajouter un modèle",
"modelProvider.addMoreModelProvider": "AJOUTER PLUS DE FOURNISSEUR DE MODÈLE",
"modelProvider.apiKey": "API-KEY",
"modelProvider.apiKeyRateLimit": "La limite de débit a été atteinte, disponible après {{secondes}}s",
"modelProvider.apiKeyRateLimit": "La limite de débit a été atteinte, disponible après {{seconds}}s",
"modelProvider.apiKeyStatusNormal": "Létat de lAPIKey est normal",
"modelProvider.auth.addApiKey": "Ajouter une clé API",
"modelProvider.auth.addCredential": "Ajouter un identifiant",

View File

@@ -116,7 +116,7 @@
"detailPanel.operation.update": "Mettre à jour",
"detailPanel.operation.viewDetail": "Voir les détails",
"detailPanel.serviceOk": "Service OK",
"detailPanel.strategyNum": "{{num}} {{stratégie}} INCLUS",
"detailPanel.strategyNum": "{{num}} {{strategy}} INCLUS",
"detailPanel.switchVersion": "Version du commutateur",
"detailPanel.toolSelector.auto": "Auto",
"detailPanel.toolSelector.descriptionLabel": "Description de loutil",
@@ -236,7 +236,7 @@
"task.installSuccess": "{{successLength}} plugins installed successfully",
"task.installed": "Installed",
"task.installedError": "{{errorLength}} les plugins nont pas pu être installés",
"task.installing": "Installation des plugins {{installingLength}}, 0 fait.",
"task.installing": "Installation des plugins, 0 fait.",
"task.installingWithError": "Installation des plugins {{installingLength}}, succès de {{successLength}}, échec de {{errorLength}}",
"task.installingWithSuccess": "Installation des plugins {{installingLength}}, succès de {{successLength}}.",
"task.runningPlugins": "Installing Plugins",

View File

@@ -83,7 +83,7 @@
"gotoAnything.emptyState.noKnowledgeBasesFound": "कोई ज्ञान आधार नहीं मिले",
"gotoAnything.emptyState.noPluginsFound": "कोई प्लगइन नहीं मिले",
"gotoAnything.emptyState.noWorkflowNodesFound": "कोई कार्यप्रवाह नोड नहीं मिला",
"gotoAnything.emptyState.tryDifferentTerm": "एक अलग खोज शब्द आज़माएं या {{mode}} फ़िल्टर हटा दें",
"gotoAnything.emptyState.tryDifferentTerm": "एक अलग खोज शब्द आज़माएं या फ़िल्टर हटा दें",
"gotoAnything.emptyState.trySpecificSearch": "विशिष्ट खोज के लिए {{shortcuts}} आज़माएं",
"gotoAnything.groups.apps": "ऐप्स",
"gotoAnything.groups.commands": "आदेश",

View File

@@ -140,7 +140,7 @@
"stepTwo.preview": "पुष्टि करें और पूर्वावलोकन करें",
"stepTwo.previewButton": "प्रश्न-उत्तर प्रारूप में स्विच करना",
"stepTwo.previewChunk": "पूर्वावलोकन चंक",
"stepTwo.previewChunkCount": "{{गिनती}} अनुमानित खंड",
"stepTwo.previewChunkCount": "{{count}} अनुमानित खंड",
"stepTwo.previewChunkTip": "पूर्वावलोकन लोड करने के लिए बाईं ओर 'पूर्वावलोकन चंक' बटन पर क्लिक करें",
"stepTwo.previewSwitchTipEnd": " अतिरिक्त टोकन खर्च होंगे",
"stepTwo.previewSwitchTipStart": "वर्तमान खंड पूर्वावलोकन पाठ प्रारूप में है, प्रश्न-उत्तर प्रारूप में स्विच करने से",

View File

@@ -116,7 +116,7 @@
"detailPanel.operation.update": "अपडेट",
"detailPanel.operation.viewDetail": "विवरण देखें",
"detailPanel.serviceOk": "सेवा ठीक है",
"detailPanel.strategyNum": "{{num}} {{रणनीति}} शामिल",
"detailPanel.strategyNum": "{{num}} {{strategy}} शामिल",
"detailPanel.switchVersion": "स्विच संस्करण",
"detailPanel.toolSelector.auto": "स्वचालित",
"detailPanel.toolSelector.descriptionLabel": "उपकरण का विवरण",

View File

@@ -286,8 +286,5 @@
"pbkdf2": "~3.1.3",
"prismjs": "~1.30",
"string-width": "~4.2.3"
},
"lint-staged": {
"*": "eslint --fix"
}
}