diff --git a/web/i18n-config/auto-gen-i18n.js b/web/i18n-config/auto-gen-i18n.js index cfdd7fb96..45f560639 100644 --- a/web/i18n-config/auto-gen-i18n.js +++ b/web/i18n-config/auto-gen-i18n.js @@ -1,5 +1,6 @@ const fs = require('node:fs') const path = require('node:path') +const vm = require('node:vm') const transpile = require('typescript').transpile const magicast = require('magicast') const { parseModule, generateCode, loadFile } = magicast @@ -22,11 +23,16 @@ const languageKeyMap = data.languages.reduce((map, language) => { }, {}) async function translateMissingKeyDeeply(sourceObj, targetObject, toLanguage) { + const skippedKeys = [] + const translatedKeys = [] + await Promise.all(Object.keys(sourceObj).map(async (key) => { if (targetObject[key] === undefined) { if (typeof sourceObj[key] === 'object') { targetObject[key] = {} - await translateMissingKeyDeeply(sourceObj[key], targetObject[key], toLanguage) + const result = await translateMissingKeyDeeply(sourceObj[key], targetObject[key], toLanguage) + skippedKeys.push(...result.skipped) + translatedKeys.push(...result.translated) } else { try { @@ -35,73 +41,198 @@ async function translateMissingKeyDeeply(sourceObj, targetObject, toLanguage) { targetObject[key] = '' return } - // not support translate with '(' or ')' - if (source.includes('(') || source.includes(')')) - return + // Only skip obvious code patterns, not normal text with parentheses + const codePatterns = [ + /\{\{.*\}\}/, // Template variables like {{key}} + /\$\{.*\}/, // Template literals ${...} + /<[^>]+>/, // HTML/XML tags + /function\s*\(/, // Function definitions + /=\s*\(/, // Assignment with function calls + ] + + const isCodeLike = codePatterns.some(pattern => pattern.test(source)) + if (isCodeLike) { + console.log(`⏭️ Skipping code-like content: "${source.substring(0, 50)}..."`) + skippedKeys.push(`${key}: ${source}`) + return + } + + console.log(`🔄 Translating: "${source}" to ${toLanguage}`) const { translation } = await translate(sourceObj[key], null, languageKeyMap[toLanguage]) targetObject[key] = translation + translatedKeys.push(`${key}: ${translation}`) + console.log(`✅ Translated: "${translation}"`) } - catch { - console.error(`Error translating "${sourceObj[key]}" to ${toLanguage}. Key: ${key}`) + catch (error) { + console.error(`❌ Error translating "${sourceObj[key]}" to ${toLanguage}. Key: ${key}`, error.message) + skippedKeys.push(`${key}: ${sourceObj[key]} (Error: ${error.message})`) + + // Add retry mechanism for network errors + if (error.message.includes('network') || error.message.includes('timeout')) { + console.log(`🔄 Retrying translation for key: ${key}`) + try { + await new Promise(resolve => setTimeout(resolve, 1000)) // Wait 1 second + const { translation } = await translate(sourceObj[key], null, languageKeyMap[toLanguage]) + targetObject[key] = translation + translatedKeys.push(`${key}: ${translation}`) + console.log(`✅ Retry successful: "${translation}"`) + } + catch (retryError) { + console.error(`❌ Retry failed for key ${key}:`, retryError.message) + } + } } } } else if (typeof sourceObj[key] === 'object') { targetObject[key] = targetObject[key] || {} - await translateMissingKeyDeeply(sourceObj[key], targetObject[key], toLanguage) + const result = await translateMissingKeyDeeply(sourceObj[key], targetObject[key], toLanguage) + skippedKeys.push(...result.skipped) + translatedKeys.push(...result.translated) } })) + + return { skipped: skippedKeys, translated: translatedKeys } } -async function autoGenTrans(fileName, toGenLanguage) { - const fullKeyFilePath = path.join(__dirname, i18nFolder, targetLanguage, `${fileName}.ts`) - const toGenLanguageFilePath = path.join(__dirname, i18nFolder, toGenLanguage, `${fileName}.ts`) - // eslint-disable-next-line sonarjs/code-eval - const fullKeyContent = eval(transpile(fs.readFileSync(fullKeyFilePath, 'utf8'))) - // if toGenLanguageFilePath is not exist, create it - if (!fs.existsSync(toGenLanguageFilePath)) { - fs.writeFileSync(toGenLanguageFilePath, `const translation = { +async function autoGenTrans(fileName, toGenLanguage, isDryRun = false) { + const fullKeyFilePath = path.resolve(__dirname, i18nFolder, targetLanguage, `${fileName}.ts`) + const toGenLanguageFilePath = path.resolve(__dirname, i18nFolder, toGenLanguage, `${fileName}.ts`) + + try { + const content = fs.readFileSync(fullKeyFilePath, 'utf8') + + // Create a safer module environment for vm + const moduleExports = {} + const context = { + exports: moduleExports, + module: { exports: moduleExports }, + require, + console, + __filename: fullKeyFilePath, + __dirname: path.dirname(fullKeyFilePath), + } + + // Use vm.runInNewContext instead of eval for better security + vm.runInNewContext(transpile(content), context) + + const fullKeyContent = moduleExports.default || moduleExports + + if (!fullKeyContent || typeof fullKeyContent !== 'object') + throw new Error(`Failed to extract translation object from ${fullKeyFilePath}`) + + // if toGenLanguageFilePath is not exist, create it + if (!fs.existsSync(toGenLanguageFilePath)) { + fs.writeFileSync(toGenLanguageFilePath, `const translation = { } export default translation `) - } - // To keep object format and format it for magicast to work: const translation = { ... } => export default {...} - const readContent = await loadFile(toGenLanguageFilePath) - const { code: toGenContent } = generateCode(readContent) - const mod = await parseModule(`export default ${toGenContent.replace('export default translation', '').replace('const translation = ', '')}`) - const toGenOutPut = mod.exports.default + } + // To keep object format and format it for magicast to work: const translation = { ... } => export default {...} + const readContent = await loadFile(toGenLanguageFilePath) + const { code: toGenContent } = generateCode(readContent) + const mod = await parseModule(`export default ${toGenContent.replace('export default translation', '').replace('const translation = ', '')}`) + const toGenOutPut = mod.exports.default - await translateMissingKeyDeeply(fullKeyContent, toGenOutPut, toGenLanguage) - const { code } = generateCode(mod) - const res = `const translation =${code.replace('export default', '')} + console.log(`\n🌍 Processing ${fileName} for ${toGenLanguage}...`) + const result = await translateMissingKeyDeeply(fullKeyContent, toGenOutPut, toGenLanguage) + + // Generate summary report + console.log(`\n📊 Translation Summary for ${fileName} -> ${toGenLanguage}:`) + console.log(` ✅ Translated: ${result.translated.length} keys`) + console.log(` ⏭️ Skipped: ${result.skipped.length} keys`) + + if (result.skipped.length > 0) { + console.log(`\n⚠️ Skipped keys in ${fileName} (${toGenLanguage}):`) + result.skipped.slice(0, 5).forEach(item => console.log(` - ${item}`)) + if (result.skipped.length > 5) + console.log(` ... and ${result.skipped.length - 5} more`) + } + + const { code } = generateCode(mod) + const res = `const translation =${code.replace('export default', '')} export default translation `.replace(/,\n\n/g, ',\n').replace('};', '}') - fs.writeFileSync(toGenLanguageFilePath, res) + if (!isDryRun) { + fs.writeFileSync(toGenLanguageFilePath, res) + console.log(`💾 Saved translations to ${toGenLanguageFilePath}`) + } + else { + console.log(`🔍 [DRY RUN] Would save translations to ${toGenLanguageFilePath}`) + } + + return result + } + catch (error) { + console.error(`Error processing file ${fullKeyFilePath}:`, error.message) + throw error + } +} + +// Add command line argument support +const isDryRun = process.argv.includes('--dry-run') +const targetFile = process.argv.find(arg => arg.startsWith('--file='))?.split('=')[1] +const targetLang = process.argv.find(arg => arg.startsWith('--lang='))?.split('=')[1] + +// Rate limiting helper +function delay(ms) { + return new Promise(resolve => setTimeout(resolve, ms)) } async function main() { - // const fileName = 'workflow' - // Promise.all(Object.keys(languageKeyMap).map(async (toLanguage) => { - // await autoGenTrans(fileName, toLanguage) - // })) + console.log('🚀 Starting auto-gen-i18n script...') + console.log(`📋 Mode: ${isDryRun ? 'DRY RUN (no files will be modified)' : 'LIVE MODE'}`) + const files = fs - .readdirSync(path.join(__dirname, i18nFolder, targetLanguage)) - .map(file => file.replace(/\.ts/, '')) + .readdirSync(path.resolve(__dirname, i18nFolder, targetLanguage)) + .filter(file => /\.ts$/.test(file)) // Only process .ts files + .map(file => file.replace(/\.ts$/, '')) .filter(f => f !== 'app-debug') // ast parse error in app-debug - await Promise.all(files.map(async (file) => { - await Promise.all(Object.keys(languageKeyMap).map(async (language) => { + // Filter by target file if specified + const filesToProcess = targetFile ? files.filter(f => f === targetFile) : files + const languagesToProcess = targetLang ? [targetLang] : Object.keys(languageKeyMap) + + console.log(`📁 Files to process: ${filesToProcess.join(', ')}`) + console.log(`🌍 Languages to process: ${languagesToProcess.join(', ')}`) + + let totalTranslated = 0 + let totalSkipped = 0 + let totalErrors = 0 + + // Process files sequentially to avoid API rate limits + for (const file of filesToProcess) { + console.log(`\n📄 Processing file: ${file}`) + + // Process languages with rate limiting + for (const language of languagesToProcess) { try { - await autoGenTrans(file, language) + const result = await autoGenTrans(file, language, isDryRun) + totalTranslated += result.translated.length + totalSkipped += result.skipped.length + + // Rate limiting: wait 500ms between language processing + await delay(500) } catch (e) { - console.error(`Error translating ${file} to ${language}`, e) + console.error(`❌ Error translating ${file} to ${language}:`, e.message) + totalErrors++ } - })) - })) + } + } + + // Final summary + console.log('\n🎉 Auto-translation completed!') + console.log('📊 Final Summary:') + console.log(` ✅ Total keys translated: ${totalTranslated}`) + console.log(` ⏭️ Total keys skipped: ${totalSkipped}`) + console.log(` ❌ Total errors: ${totalErrors}`) + + if (isDryRun) + console.log('\n💡 This was a dry run. To actually translate, run without --dry-run flag.') } main() diff --git a/web/i18n-config/check-i18n.js b/web/i18n-config/check-i18n.js index c169e5500..7e3b725c9 100644 --- a/web/i18n-config/check-i18n.js +++ b/web/i18n-config/check-i18n.js @@ -1,15 +1,16 @@ const fs = require('node:fs') const path = require('node:path') +const vm = require('node:vm') const transpile = require('typescript').transpile const targetLanguage = 'en-US' const data = require('./languages.json') const languages = data.languages.filter(language => language.supported).map(language => language.value) -async function getKeysFromLanuage(language) { +async function getKeysFromLanguage(language) { return new Promise((resolve, reject) => { - const folderPath = path.join(__dirname, '../i18n', language) - let allKeys = [] + const folderPath = path.resolve(__dirname, '../i18n', language) + const allKeys = [] fs.readdir(folderPath, (err, files) => { if (err) { console.error('Error reading folder:', err) @@ -17,37 +18,61 @@ async function getKeysFromLanuage(language) { return } - files.forEach((file) => { + // Filter only .ts and .js files + const translationFiles = files.filter(file => /\.(ts|js)$/.test(file)) + + translationFiles.forEach((file) => { const filePath = path.join(folderPath, file) const fileName = file.replace(/\.[^/.]+$/, '') // Remove file extension const camelCaseFileName = fileName.replace(/[-_](.)/g, (_, c) => c.toUpperCase(), ) // Convert to camel case - // console.log(camelCaseFileName) - const content = fs.readFileSync(filePath, 'utf8') - // eslint-disable-next-line sonarjs/code-eval - const translationObj = eval(transpile(content)) - // console.log(translation) - if(!translationObj || typeof translationObj !== 'object') { - console.error(`Error parsing file: ${filePath}`) - reject(new Error(`Error parsing file: ${filePath}`)) - return - } - const keys = Object.keys(translationObj) - const nestedKeys = [] - const iterateKeys = (obj, prefix = '') => { - for (const key in obj) { - const nestedKey = prefix ? `${prefix}.${key}` : key - nestedKeys.push(nestedKey) - if (typeof obj[key] === 'object') - iterateKeys(obj[key], nestedKey) - } - } - iterateKeys(translationObj) - allKeys = [...keys, ...nestedKeys].map( - key => `${camelCaseFileName}.${key}`, - ) + try { + const content = fs.readFileSync(filePath, 'utf8') + + // Create a safer module environment for vm + const moduleExports = {} + const context = { + exports: moduleExports, + module: { exports: moduleExports }, + require, + console, + __filename: filePath, + __dirname: folderPath, + } + + // Use vm.runInNewContext instead of eval for better security + vm.runInNewContext(transpile(content), context) + + // Extract the translation object + const translationObj = moduleExports.default || moduleExports + + if(!translationObj || typeof translationObj !== 'object') { + console.error(`Error parsing file: ${filePath}`) + reject(new Error(`Error parsing file: ${filePath}`)) + return + } + + const nestedKeys = [] + const iterateKeys = (obj, prefix = '') => { + for (const key in obj) { + const nestedKey = prefix ? `${prefix}.${key}` : key + nestedKeys.push(nestedKey) + if (typeof obj[key] === 'object' && obj[key] !== null) + iterateKeys(obj[key], nestedKey) + } + } + iterateKeys(translationObj) + + // Fixed: accumulate keys instead of overwriting + const fileKeys = nestedKeys.map(key => `${camelCaseFileName}.${key}`) + allKeys.push(...fileKeys) + } + catch (error) { + console.error(`Error processing file ${filePath}:`, error.message) + reject(error) + } }) resolve(allKeys) }) @@ -56,8 +81,8 @@ async function getKeysFromLanuage(language) { async function main() { const compareKeysCount = async () => { - const targetKeys = await getKeysFromLanuage(targetLanguage) - const languagesKeys = await Promise.all(languages.map(language => getKeysFromLanuage(language))) + const targetKeys = await getKeysFromLanguage(targetLanguage) + const languagesKeys = await Promise.all(languages.map(language => getKeysFromLanguage(language))) const keysCount = languagesKeys.map(keys => keys.length) const targetKeysCount = targetKeys.length diff --git a/web/i18n/de-DE/app-annotation.ts b/web/i18n/de-DE/app-annotation.ts index ef2fa1f23..2e141ed38 100644 --- a/web/i18n/de-DE/app-annotation.ts +++ b/web/i18n/de-DE/app-annotation.ts @@ -17,6 +17,7 @@ const translation = { bulkImport: 'Massenimport', bulkExport: 'Massenexport', clearAll: 'Alle Anmerkungen löschen', + clearAllConfirm: 'Alle Anmerkungen löschen?', }, }, editModal: { diff --git a/web/i18n/de-DE/app.ts b/web/i18n/de-DE/app.ts index c28fcb2be..31221e8f0 100644 --- a/web/i18n/de-DE/app.ts +++ b/web/i18n/de-DE/app.ts @@ -268,6 +268,7 @@ const translation = { noAccessPermission: 'Keine Berechtigung zum Zugriff auf die Webanwendung', maxActiveRequests: 'Maximale gleichzeitige Anfragen', maxActiveRequestsPlaceholder: 'Geben Sie 0 für unbegrenzt ein', + maxActiveRequestsTip: 'Maximale Anzahl gleichzeitiger aktiver Anfragen pro App (0 für unbegrenzt)', } export default translation diff --git a/web/i18n/de-DE/plugin.ts b/web/i18n/de-DE/plugin.ts index 6fa6999ae..aa136528e 100644 --- a/web/i18n/de-DE/plugin.ts +++ b/web/i18n/de-DE/plugin.ts @@ -257,6 +257,7 @@ const translation = { fixOnly: { name: 'Nur fixieren', selectedDescription: 'Auto-Update nur für Patch-Versionen', + description: 'Automatische Aktualisierung nur für Patchversionen (z. B. 1.0.1 → 1.0.2). Kleinere Versionsänderungen lösen keine Aktualisierungen aus.', }, latest: { description: 'Immer auf die neueste Version aktualisieren', diff --git a/web/i18n/de-DE/workflow.ts b/web/i18n/de-DE/workflow.ts index de2c3ce38..121f5da1a 100644 --- a/web/i18n/de-DE/workflow.ts +++ b/web/i18n/de-DE/workflow.ts @@ -497,6 +497,7 @@ const translation = { search: 'Suchmetadaten', }, title: 'Metadatenfilterung', + tip: 'Metadatenfilterung ist der Prozess, Metadatenattribute (wie Tags, Kategorien oder Zugriffsberechtigungen) zu verwenden, um die Abfrage und Kontrolle der relevanten Informationen innerhalb eines Systems zu verfeinern.', }, }, http: { diff --git a/web/i18n/es-ES/app-annotation.ts b/web/i18n/es-ES/app-annotation.ts index e090c4612..2a797edcc 100644 --- a/web/i18n/es-ES/app-annotation.ts +++ b/web/i18n/es-ES/app-annotation.ts @@ -17,6 +17,7 @@ const translation = { bulkImport: 'Importar en Masa', bulkExport: 'Exportar en Masa', clearAll: 'Borrar Todas las Anotaciones', + clearAllConfirm: '¿Eliminar todas las anotaciones?', }, }, editModal: { diff --git a/web/i18n/es-ES/app.ts b/web/i18n/es-ES/app.ts index add9a4318..55e14df83 100644 --- a/web/i18n/es-ES/app.ts +++ b/web/i18n/es-ES/app.ts @@ -261,6 +261,7 @@ const translation = { noAccessPermission: 'No se permite el acceso a la aplicación web', maxActiveRequestsPlaceholder: 'Introduce 0 para ilimitado', maxActiveRequests: 'Máximas solicitudes concurrentes', + maxActiveRequestsTip: 'Número máximo de solicitudes activas concurrentes por aplicación (0 para ilimitado)', } export default translation diff --git a/web/i18n/es-ES/plugin.ts b/web/i18n/es-ES/plugin.ts index 629968485..e937db7a0 100644 --- a/web/i18n/es-ES/plugin.ts +++ b/web/i18n/es-ES/plugin.ts @@ -257,6 +257,7 @@ const translation = { fixOnly: { name: 'Arreglar Solo', selectedDescription: 'Actualización automática solo para versiones de parches', + description: 'Actualización automática solo para versiones de parche (por ejemplo, 1.0.1 → 1.0.2). Los cambios de versión menor no activarán actualizaciones.', }, latest: { selectedDescription: 'Siempre actualiza a la última versión', diff --git a/web/i18n/es-ES/workflow.ts b/web/i18n/es-ES/workflow.ts index 3c509934d..d57a0a40f 100644 --- a/web/i18n/es-ES/workflow.ts +++ b/web/i18n/es-ES/workflow.ts @@ -497,6 +497,7 @@ const translation = { search: 'Buscar metadatos', }, title: 'Filtrado de Metadatos', + tip: 'El filtrado de metadatos es el proceso de utilizar atributos de metadatos (como etiquetas, categorías o permisos de acceso) para refinar y controlar la recuperación de información relevante dentro de un sistema.', }, }, http: { diff --git a/web/i18n/fa-IR/app-annotation.ts b/web/i18n/fa-IR/app-annotation.ts index e78fc8cd7..d66c2eb0e 100644 --- a/web/i18n/fa-IR/app-annotation.ts +++ b/web/i18n/fa-IR/app-annotation.ts @@ -17,6 +17,7 @@ const translation = { bulkImport: 'واردات انبوه', bulkExport: 'صادرات انبوه', clearAll: 'پاک کردن همه یادداشت‌ها', + clearAllConfirm: 'آیا همه حاشیه‌نویسی‌ها را حذف کنیم؟', }, }, editModal: { diff --git a/web/i18n/fa-IR/app.ts b/web/i18n/fa-IR/app.ts index d8dfba3d8..b2cde413d 100644 --- a/web/i18n/fa-IR/app.ts +++ b/web/i18n/fa-IR/app.ts @@ -261,6 +261,7 @@ const translation = { noAccessPermission: 'دسترسی به برنامه وب مجاز نیست', maxActiveRequests: 'بیشترین درخواست‌های همزمان', maxActiveRequestsPlaceholder: 'برای نامحدود، 0 را وارد کنید', + maxActiveRequestsTip: 'حداکثر تعداد درخواست‌های فعال همزمان در هر برنامه (0 برای نامحدود)', } export default translation diff --git a/web/i18n/fa-IR/plugin.ts b/web/i18n/fa-IR/plugin.ts index 5e1cbe02b..1ba3a714a 100644 --- a/web/i18n/fa-IR/plugin.ts +++ b/web/i18n/fa-IR/plugin.ts @@ -257,6 +257,7 @@ const translation = { fixOnly: { name: 'فقط تعمیر کنید', selectedDescription: 'به‌روزرسانی خودکار تنها برای نسخه‌های وصله', + description: 'به‌روزرسانی خودکار فقط برای نسخه‌های پچ (مانند ۱.۰.۱ → ۱.۰.۲). تغییرات جزئی نسخه باعث راه‌اندازی به‌روزرسانی‌ها نمی‌شود.', }, latest: { name: 'جدیدترین', diff --git a/web/i18n/fa-IR/workflow.ts b/web/i18n/fa-IR/workflow.ts index b1aa11d3b..f95253e73 100644 --- a/web/i18n/fa-IR/workflow.ts +++ b/web/i18n/fa-IR/workflow.ts @@ -497,6 +497,7 @@ const translation = { conditions: 'شرایط', }, title: 'فیلتر کردن فراداده', + tip: 'فیلتر کردن متاداده فرایند استفاده از ویژگی‌های متاداده (مانند برچسب‌ها، دسته‌ها یا مجوزهای دسترسی) برای تصفیه و کنترل بازیابی اطلاعات مرتبط در یک سیستم است.', }, }, http: { diff --git a/web/i18n/fr-FR/app-annotation.ts b/web/i18n/fr-FR/app-annotation.ts index 3926fe5e2..3a34e326f 100644 --- a/web/i18n/fr-FR/app-annotation.ts +++ b/web/i18n/fr-FR/app-annotation.ts @@ -17,6 +17,7 @@ const translation = { bulkImport: 'Importation en Vrac', bulkExport: 'Exportation en Vrac', clearAll: 'Effacer toutes les annotations', + clearAllConfirm: 'Supprimer toutes les annotations ?', }, }, editModal: { diff --git a/web/i18n/fr-FR/app.ts b/web/i18n/fr-FR/app.ts index 523934152..f572658d1 100644 --- a/web/i18n/fr-FR/app.ts +++ b/web/i18n/fr-FR/app.ts @@ -261,6 +261,7 @@ const translation = { noAccessPermission: 'Pas de permission d\'accéder à l\'application web', maxActiveRequestsPlaceholder: 'Entrez 0 pour illimité', maxActiveRequests: 'Nombre maximal de requêtes simultanées', + maxActiveRequestsTip: 'Nombre maximum de requêtes actives concurrentes par application (0 pour illimité)', } export default translation diff --git a/web/i18n/fr-FR/plugin.ts b/web/i18n/fr-FR/plugin.ts index 255171058..ae6e8c068 100644 --- a/web/i18n/fr-FR/plugin.ts +++ b/web/i18n/fr-FR/plugin.ts @@ -257,6 +257,7 @@ const translation = { fixOnly: { selectedDescription: 'Mise à jour automatique uniquement pour les versions de correctif', name: 'Réparer seulement', + description: 'Mise à jour automatique uniquement pour les versions de correctif (par exemple, 1.0.1 → 1.0.2). Les changements de version mineure ne déclencheront pas de mises à jour.', }, latest: { name: 'Dernier', diff --git a/web/i18n/fr-FR/workflow.ts b/web/i18n/fr-FR/workflow.ts index 96bead7ff..884e3e977 100644 --- a/web/i18n/fr-FR/workflow.ts +++ b/web/i18n/fr-FR/workflow.ts @@ -497,6 +497,7 @@ const translation = { title: 'Conditions de filtrage des métadonnées', }, title: 'Filtrage des métadonnées', + tip: 'Le filtrage des métadonnées est le processus d\'utilisation des attributs de métadonnées (tels que les étiquettes, les catégories ou les autorisations d\'accès) pour affiner et contrôler la récupération d\'informations pertinentes au sein d\'un système.', }, }, http: { diff --git a/web/i18n/hi-IN/app-annotation.ts b/web/i18n/hi-IN/app-annotation.ts index 0249ebf7d..b89f33c43 100644 --- a/web/i18n/hi-IN/app-annotation.ts +++ b/web/i18n/hi-IN/app-annotation.ts @@ -17,6 +17,7 @@ const translation = { bulkImport: 'बल्क आयात', bulkExport: 'बल्क निर्यात', clearAll: 'सभी एनोटेशन साफ करें', + clearAllConfirm: 'क्या सभी टिप्पणियाँ हटानी हैं?', }, }, editModal: { diff --git a/web/i18n/hi-IN/app.ts b/web/i18n/hi-IN/app.ts index dcd5e54bd..4c6bc7a8f 100644 --- a/web/i18n/hi-IN/app.ts +++ b/web/i18n/hi-IN/app.ts @@ -261,6 +261,7 @@ const translation = { noAccessPermission: 'वेब एप्लिकेशन तक पहुँचने की अनुमति नहीं है', maxActiveRequests: 'अधिकतम समवर्ती अनुरोध', maxActiveRequestsPlaceholder: 'असीमित के लिए 0 दर्ज करें', + maxActiveRequestsTip: 'प्रति ऐप अधिकतम सक्रिय अनुरोधों की अधिकतम संख्या (असीमित के लिए 0)', } export default translation diff --git a/web/i18n/hi-IN/plugin.ts b/web/i18n/hi-IN/plugin.ts index ae4547421..e15b6a85a 100644 --- a/web/i18n/hi-IN/plugin.ts +++ b/web/i18n/hi-IN/plugin.ts @@ -257,6 +257,7 @@ const translation = { fixOnly: { name: 'केवल ठीक करें', selectedDescription: 'केवल पैच संस्करणों के लिए स्वचालित अपडेट', + description: 'केवल पैच संस्करणों के लिए स्वचालित अद्यतन (जैसे, 1.0.1 → 1.0.2)। छोटा संस्करण परिवर्तन अद्यतन को ट्रिगर नहीं करेगा।', }, latest: { name: 'नवीनतम', diff --git a/web/i18n/hi-IN/workflow.ts b/web/i18n/hi-IN/workflow.ts index 68937e515..d613c87f6 100644 --- a/web/i18n/hi-IN/workflow.ts +++ b/web/i18n/hi-IN/workflow.ts @@ -510,6 +510,7 @@ const translation = { search: 'खोज मेटाडेटा', }, title: 'मेटाडेटा फ़िल्टरिंग', + tip: 'मेटाडेटा छानने की प्रक्रिया है जिसमें मेटाडेटा विशेषताओं (जैसे टैग, श्रेणियाँ, या पहुंच अनुमतियाँ) का उपयोग करके एक प्रणाली के भीतर प्रासंगिक जानकारी की पुनर्प्राप्ति को सुधारने और नियंत्रित करने के लिए किया जाता है।', }, }, http: { diff --git a/web/i18n/it-IT/app-annotation.ts b/web/i18n/it-IT/app-annotation.ts index a7f615860..bba10ba84 100644 --- a/web/i18n/it-IT/app-annotation.ts +++ b/web/i18n/it-IT/app-annotation.ts @@ -18,6 +18,7 @@ const translation = { bulkImport: 'Importazione Bulk', bulkExport: 'Esportazione Bulk', clearAll: 'Cancella Tutte le Annotazioni', + clearAllConfirm: 'Eliminare tutte le annotazioni?', }, }, editModal: { diff --git a/web/i18n/it-IT/app.ts b/web/i18n/it-IT/app.ts index 63a25dccc..66cb50b2a 100644 --- a/web/i18n/it-IT/app.ts +++ b/web/i18n/it-IT/app.ts @@ -273,6 +273,7 @@ const translation = { noAccessPermission: 'Nessun permesso per accedere all\'app web', maxActiveRequestsPlaceholder: 'Inserisci 0 per illimitato', maxActiveRequests: 'Massimo numero di richieste concorrenti', + maxActiveRequestsTip: 'Numero massimo di richieste attive concorrenti per app (0 per illimitato)', } export default translation diff --git a/web/i18n/it-IT/plugin.ts b/web/i18n/it-IT/plugin.ts index e7b6b147f..616e19990 100644 --- a/web/i18n/it-IT/plugin.ts +++ b/web/i18n/it-IT/plugin.ts @@ -257,6 +257,7 @@ const translation = { fixOnly: { name: 'Ripara solo', selectedDescription: 'Aggiornamento automatico solo per versioni patch', + description: 'Aggiornamento automatico solo per le versioni patch (ad es., 1.0.1 → 1.0.2). Le modifiche delle versioni minori non attiveranno aggiornamenti.', }, latest: { selectedDescription: 'Aggiorna sempre all\'ultima versione', diff --git a/web/i18n/it-IT/workflow.ts b/web/i18n/it-IT/workflow.ts index 97e4bc14f..196e6f761 100644 --- a/web/i18n/it-IT/workflow.ts +++ b/web/i18n/it-IT/workflow.ts @@ -514,6 +514,7 @@ const translation = { search: 'Cerca metadati', }, title: 'Filtraggio dei metadati', + tip: 'Il filtraggio dei metadati è il processo di utilizzo degli attributi dei metadati (come tag, categorie o permessi di accesso) per affinare e controllare il recupero di informazioni pertinenti all\'interno di un sistema.', }, }, http: { diff --git a/web/i18n/ja-JP/app.ts b/web/i18n/ja-JP/app.ts index e03e9e117..f68835c7e 100644 --- a/web/i18n/ja-JP/app.ts +++ b/web/i18n/ja-JP/app.ts @@ -260,6 +260,7 @@ const translation = { noAccessPermission: 'Web アプリにアクセス権限がありません', maxActiveRequestsPlaceholder: '無制限のために0を入力してください', maxActiveRequests: '最大同時リクエスト数', + maxActiveRequestsTip: 'アプリごとの同時アクティブリクエストの最大数(無制限の場合は0)', } export default translation diff --git a/web/i18n/ja-JP/plugin.ts b/web/i18n/ja-JP/plugin.ts index 38b73a847..b202b404b 100644 --- a/web/i18n/ja-JP/plugin.ts +++ b/web/i18n/ja-JP/plugin.ts @@ -257,6 +257,7 @@ const translation = { fixOnly: { name: '修正のみ', selectedDescription: 'パッチバージョンのみの自動更新', + description: 'パッチバージョンのみ自動更新 (例: 1.0.1 → 1.0.2)。マイナーバージョンの変更は更新をトリガーしません。', }, latest: { name: '最新', diff --git a/web/i18n/ko-KR/app-annotation.ts b/web/i18n/ko-KR/app-annotation.ts index 7a93d1782..662dc3f08 100644 --- a/web/i18n/ko-KR/app-annotation.ts +++ b/web/i18n/ko-KR/app-annotation.ts @@ -17,6 +17,7 @@ const translation = { bulkImport: '일괄 가져오기', bulkExport: '일괄 내보내기', clearAll: '모든 어노테이션 지우기', + clearAllConfirm: '모든 주석을 삭제하시겠습니까?', }, }, editModal: { diff --git a/web/i18n/ko-KR/app.ts b/web/i18n/ko-KR/app.ts index bcc18e70f..c11394796 100644 --- a/web/i18n/ko-KR/app.ts +++ b/web/i18n/ko-KR/app.ts @@ -286,6 +286,7 @@ const translation = { noAccessPermission: '웹 앱에 대한 접근 권한이 없습니다.', maxActiveRequests: '동시 최대 요청 수', maxActiveRequestsPlaceholder: '무제한 사용을 원하시면 0을 입력하세요.', + maxActiveRequestsTip: '앱당 최대 동시 활성 요청 수(무제한은 0)', } export default translation diff --git a/web/i18n/ko-KR/plugin.ts b/web/i18n/ko-KR/plugin.ts index 1f60f1365..815a30d3b 100644 --- a/web/i18n/ko-KR/plugin.ts +++ b/web/i18n/ko-KR/plugin.ts @@ -257,6 +257,7 @@ const translation = { fixOnly: { name: '수정만 하기', selectedDescription: '패치 버전만 자동 업데이트', + description: '패치 버전만 자동 업데이트 (예: 1.0.1 → 1.0.2). 마이너 버전 변경은 업데이트를 유발하지 않습니다.', }, latest: { name: '최신', diff --git a/web/i18n/ko-KR/workflow.ts b/web/i18n/ko-KR/workflow.ts index be6c78f3e..a65925f25 100644 --- a/web/i18n/ko-KR/workflow.ts +++ b/web/i18n/ko-KR/workflow.ts @@ -525,6 +525,7 @@ const translation = { conditions: '조건', }, title: '메타데이터 필터링', + tip: '메타데이터 필터링은 시스템 내에서 관련 정보를 검색하는 과정을 정제하고 제어하기 위해 메타데이터 속성(예: 태그, 카테고리 또는 접근 권한)을 사용하는 과정입니다.', }, }, http: { diff --git a/web/i18n/pl-PL/app-annotation.ts b/web/i18n/pl-PL/app-annotation.ts index 81a525935..32efc76e6 100644 --- a/web/i18n/pl-PL/app-annotation.ts +++ b/web/i18n/pl-PL/app-annotation.ts @@ -18,6 +18,7 @@ const translation = { bulkImport: 'Masowy import', bulkExport: 'Masowy eksport', clearAll: 'Wyczyść wszystkie adnotacje', + clearAllConfirm: 'Usunąć wszystkie adnotacje?', }, }, editModal: { diff --git a/web/i18n/pl-PL/app.ts b/web/i18n/pl-PL/app.ts index 040789424..9a42b702e 100644 --- a/web/i18n/pl-PL/app.ts +++ b/web/i18n/pl-PL/app.ts @@ -268,6 +268,7 @@ const translation = { noAccessPermission: 'Brak uprawnień do dostępu do aplikacji internetowej', maxActiveRequests: 'Maksymalne równoczesne żądania', maxActiveRequestsPlaceholder: 'Wprowadź 0, aby uzyskać nielimitowane', + maxActiveRequestsTip: 'Maksymalna liczba jednoczesnych aktywnych żądań na aplikację (0 dla nieograniczonej)', } export default translation diff --git a/web/i18n/pl-PL/plugin.ts b/web/i18n/pl-PL/plugin.ts index 10944a339..5badeafe2 100644 --- a/web/i18n/pl-PL/plugin.ts +++ b/web/i18n/pl-PL/plugin.ts @@ -257,6 +257,7 @@ const translation = { fixOnly: { selectedDescription: 'Automatyczna aktualizacja tylko dla wersji poprawek', name: 'Napraw tylko', + description: 'Automatyczna aktualizacja tylko dla wersji łatkowych (np. 1.0.1 → 1.0.2). Zmiany w wersjach mniejszych nie będą wywoływać aktualizacji.', }, latest: { name: 'Najświeższy', diff --git a/web/i18n/pl-PL/workflow.ts b/web/i18n/pl-PL/workflow.ts index bd47328a6..a29ec9b8f 100644 --- a/web/i18n/pl-PL/workflow.ts +++ b/web/i18n/pl-PL/workflow.ts @@ -497,6 +497,7 @@ const translation = { select: 'Wybierz zmienną...', }, title: 'Filtrowanie metadanych', + tip: 'Filtracja metadanych to proces wykorzystania atrybutów metadanych (takich jak tagi, kategorie lub uprawnienia dostępu) do precyzowania i kontrolowania pozyskiwania istotnych informacji w systemie.', }, }, http: { diff --git a/web/i18n/pt-BR/app-annotation.ts b/web/i18n/pt-BR/app-annotation.ts index 3ae53ca69..9e2760bf2 100644 --- a/web/i18n/pt-BR/app-annotation.ts +++ b/web/i18n/pt-BR/app-annotation.ts @@ -17,6 +17,7 @@ const translation = { bulkImport: 'Importação em Massa', bulkExport: 'Exportação em Massa', clearAll: 'Limpar Todas as Anotações', + clearAllConfirm: 'Excluir todas as anotações?', }, }, editModal: { diff --git a/web/i18n/pt-BR/app.ts b/web/i18n/pt-BR/app.ts index 980767316..6122a75a9 100644 --- a/web/i18n/pt-BR/app.ts +++ b/web/i18n/pt-BR/app.ts @@ -261,6 +261,7 @@ const translation = { noAccessPermission: 'Sem permissão para acessar o aplicativo web', maxActiveRequestsPlaceholder: 'Digite 0 para ilimitado', maxActiveRequests: 'Máximo de solicitações simultâneas', + maxActiveRequestsTip: 'Número máximo de solicitações ativas simultâneas por aplicativo (0 para ilimitado)', } export default translation diff --git a/web/i18n/pt-BR/plugin.ts b/web/i18n/pt-BR/plugin.ts index 47490d218..9b31f5e19 100644 --- a/web/i18n/pt-BR/plugin.ts +++ b/web/i18n/pt-BR/plugin.ts @@ -257,6 +257,7 @@ const translation = { fixOnly: { selectedDescription: 'Atualização automática apenas para versões de patch', name: 'Reparar Apenas', + description: 'Atualização automática apenas para versões de patch (por exemplo, 1.0.1 → 1.0.2). Mudanças de versão menor não ativarão atualizações.', }, latest: { description: 'Sempre atualize para a versão mais recente', diff --git a/web/i18n/pt-BR/workflow.ts b/web/i18n/pt-BR/workflow.ts index f36e3b849..ec870d0e1 100644 --- a/web/i18n/pt-BR/workflow.ts +++ b/web/i18n/pt-BR/workflow.ts @@ -497,6 +497,7 @@ const translation = { placeholder: 'Insira o valor', }, title: 'Filtragem de Metadados', + tip: 'A filtragem de metadados é o processo de usar atributos de metadados (como etiquetas, categorias ou permissões de acesso) para refinar e controlar a recuperação de informações relevantes dentro de um sistema.', }, }, http: { diff --git a/web/i18n/ro-RO/app-annotation.ts b/web/i18n/ro-RO/app-annotation.ts index 42fd17c12..67feb9db1 100644 --- a/web/i18n/ro-RO/app-annotation.ts +++ b/web/i18n/ro-RO/app-annotation.ts @@ -17,6 +17,7 @@ const translation = { bulkImport: 'Import în Masă', bulkExport: 'Export în Masă', clearAll: 'Șterge Toate Anotațiile', + clearAllConfirm: 'Șterge toate anotările?', }, }, editModal: { diff --git a/web/i18n/ro-RO/app.ts b/web/i18n/ro-RO/app.ts index 791bbcbc7..d674b4ca8 100644 --- a/web/i18n/ro-RO/app.ts +++ b/web/i18n/ro-RO/app.ts @@ -261,6 +261,7 @@ const translation = { noAccessPermission: 'Nici o permisiune pentru a accesa aplicația web', maxActiveRequestsPlaceholder: 'Introduceți 0 pentru nelimitat', maxActiveRequests: 'Maxime cereri simultane', + maxActiveRequestsTip: 'Numărul maxim de cereri active concurente pe aplicație (0 pentru nelimitat)', } export default translation diff --git a/web/i18n/ro-RO/plugin.ts b/web/i18n/ro-RO/plugin.ts index 8c3ba06bb..d65dc829f 100644 --- a/web/i18n/ro-RO/plugin.ts +++ b/web/i18n/ro-RO/plugin.ts @@ -257,6 +257,7 @@ const translation = { fixOnly: { selectedDescription: 'Actualizare automată doar pentru versiuni patch', name: 'Fix doar', + description: 'Actualizare automată doar pentru versiunile de patch (de exemplu, 1.0.1 → 1.0.2). Schimbările de versiune minore nu vor declanșa actualizări.', }, latest: { name: 'Ultimul', diff --git a/web/i18n/ro-RO/workflow.ts b/web/i18n/ro-RO/workflow.ts index 2569d5339..5612f5d1f 100644 --- a/web/i18n/ro-RO/workflow.ts +++ b/web/i18n/ro-RO/workflow.ts @@ -497,6 +497,7 @@ const translation = { search: 'Căutare metadate', }, title: 'Filtrarea metadatelor', + tip: 'Filtrarea metadatelor este procesul de utilizare a atributelor metadatelor (cum ar fi etichetele, categoriile sau permisiunile de acces) pentru a rafina și controla recuperarea informațiilor relevante într-un sistem.', }, }, http: { diff --git a/web/i18n/ru-RU/app-annotation.ts b/web/i18n/ru-RU/app-annotation.ts index 18f2ae4a1..e189c9ca9 100644 --- a/web/i18n/ru-RU/app-annotation.ts +++ b/web/i18n/ru-RU/app-annotation.ts @@ -17,6 +17,7 @@ const translation = { bulkImport: 'Массовый импорт', bulkExport: 'Массовый экспорт', clearAll: 'Очистить все аннотации', + clearAllConfirm: 'Удалить все аннотации?', }, }, editModal: { diff --git a/web/i18n/ru-RU/app.ts b/web/i18n/ru-RU/app.ts index d12f25ed5..b02d01b26 100644 --- a/web/i18n/ru-RU/app.ts +++ b/web/i18n/ru-RU/app.ts @@ -261,6 +261,7 @@ const translation = { noAccessPermission: 'Нет разрешения на доступ к веб-приложению', maxActiveRequests: 'Максимальное количество параллельных запросов', maxActiveRequestsPlaceholder: 'Введите 0 для неограниченного количества', + maxActiveRequestsTip: 'Максимальное количество одновременно активных запросов на одно приложение (0 для неограниченного количества)', } export default translation diff --git a/web/i18n/ru-RU/plugin.ts b/web/i18n/ru-RU/plugin.ts index f39139aa0..9bbb3c485 100644 --- a/web/i18n/ru-RU/plugin.ts +++ b/web/i18n/ru-RU/plugin.ts @@ -257,6 +257,7 @@ const translation = { fixOnly: { name: 'Только исправить', selectedDescription: 'Автообновление только для версий патчей', + description: 'Автообновление только для патч-версий (например, 1.0.1 → 1.0.2). Изменения в минорных версиях не вызовут обновления.', }, latest: { name: 'Новости', diff --git a/web/i18n/ru-RU/workflow.ts b/web/i18n/ru-RU/workflow.ts index d8452122a..8ab0f04c8 100644 --- a/web/i18n/ru-RU/workflow.ts +++ b/web/i18n/ru-RU/workflow.ts @@ -497,6 +497,7 @@ const translation = { search: 'Поиск метаданных', }, title: 'Фильтрация метаданных', + tip: 'Фильтрация метаданных — это процесс использования атрибутов метаданных (таких как теги, категории или права доступа) для уточнения и контроля извлечения соответствующей информации внутри системы.', }, }, http: { diff --git a/web/i18n/sl-SI/app-annotation.ts b/web/i18n/sl-SI/app-annotation.ts index 07b175a8e..6cd88a47e 100644 --- a/web/i18n/sl-SI/app-annotation.ts +++ b/web/i18n/sl-SI/app-annotation.ts @@ -17,6 +17,7 @@ const translation = { bulkImport: 'Množični uvoz', bulkExport: 'Množični izvoz', clearAll: 'Počisti vse opombe', + clearAllConfirm: 'Izbrišite vse opombe?', }, }, editModal: { diff --git a/web/i18n/sl-SI/app.ts b/web/i18n/sl-SI/app.ts index cd6d1169a..337bd1035 100644 --- a/web/i18n/sl-SI/app.ts +++ b/web/i18n/sl-SI/app.ts @@ -261,6 +261,7 @@ const translation = { noAccessPermission: 'Brez dovoljenja za dostop do spletne aplikacije', maxActiveRequestsPlaceholder: 'Vnesite 0 za neomejeno', maxActiveRequests: 'Maksimalno število hkratnih zahtevkov', + maxActiveRequestsTip: 'Največje število hkrati aktivnih zahtevkov na aplikacijo (0 za neomejeno)', } export default translation diff --git a/web/i18n/sl-SI/plugin.ts b/web/i18n/sl-SI/plugin.ts index 049a80f85..dc435f230 100644 --- a/web/i18n/sl-SI/plugin.ts +++ b/web/i18n/sl-SI/plugin.ts @@ -257,6 +257,7 @@ const translation = { fixOnly: { name: 'Popravi samo', selectedDescription: 'Samodejno posodabljanje samo za različice popravkov', + description: 'Samodejno posodabljanje samo za različice popravkov (npr. 1.0.1 → 1.0.2). Spremembe manjših različic ne bodo povzročile posodobitev.', }, latest: { selectedDescription: 'Vedno posodobite na najnovejšo različico', diff --git a/web/i18n/sl-SI/workflow.ts b/web/i18n/sl-SI/workflow.ts index 125d82e78..72150701d 100644 --- a/web/i18n/sl-SI/workflow.ts +++ b/web/i18n/sl-SI/workflow.ts @@ -279,6 +279,7 @@ const translation = { 'start': 'Določite začetne parametre za zagon delovnega toka', 'variable-assigner': 'Združite večpodružinske spremenljivke v eno samo spremenljivko za enotno konfiguracijo spodnjih vozlišč.', 'variable-aggregator': 'Združite večpodružnične spremenljivke v eno samo spremenljivko za enotno konfiguracijo spodnjih vozlišč.', + 'assigner': 'Vožnji vozlišča za dodelitev spremenljivk se uporablja za dodeljevanje vrednosti spremenljivkam, ki jih je mogoče zapisati (kot so spremenljivke za pogovor).', }, operator: { zoomOut: 'Zoomirati ven', @@ -312,6 +313,7 @@ const translation = { organizeBlocks: 'Organizirajte vozlišča', minimize: 'Izhod iz celotnega zaslona', maximize: 'Maksimiziraj platno', + optional: '(neobvezno)', }, nodes: { common: { @@ -497,6 +499,7 @@ const translation = { add: 'Dodaj pogoj', }, title: 'Filtriranje metapodatkov', + tip: 'Filtriranje metapodatkov je postopek uporabe metapodatkovnih atributov (kot so oznake, kategorije ali dovoljenja za dostop) za natančnejše določanje in nadzorovanje pridobivanja relevantnih informacij znotraj sistema.', }, queryVariable: 'Vprašanje spremenljivka', knowledge: 'Znanje', diff --git a/web/i18n/th-TH/app-annotation.ts b/web/i18n/th-TH/app-annotation.ts index 5fba357d0..f038f5ef8 100644 --- a/web/i18n/th-TH/app-annotation.ts +++ b/web/i18n/th-TH/app-annotation.ts @@ -17,6 +17,7 @@ const translation = { bulkImport: 'นําเข้าจํานวนมาก', bulkExport: 'ส่งออกจํานวนมาก', clearAll: 'ล้างคําอธิบายประกอบทั้งหมด', + clearAllConfirm: 'ลบหมายเหตุต่างๆ ทั้งหมดหรือไม่?', }, }, editModal: { diff --git a/web/i18n/th-TH/app.ts b/web/i18n/th-TH/app.ts index af2f67bcc..8c8c0e02a 100644 --- a/web/i18n/th-TH/app.ts +++ b/web/i18n/th-TH/app.ts @@ -257,6 +257,7 @@ const translation = { noAccessPermission: 'ไม่มีสิทธิ์เข้าถึงเว็บแอป', maxActiveRequestsPlaceholder: 'ใส่ 0 สำหรับไม่จำกัด', maxActiveRequests: 'จำนวนคำขอพร้อมกันสูงสุด', + maxActiveRequestsTip: 'จำนวนการร้องขอที่ใช้งานพร้อมกันสูงสุดต่อแอป (0 หมายถึงไม่จำกัด)', } export default translation diff --git a/web/i18n/th-TH/plugin.ts b/web/i18n/th-TH/plugin.ts index 6a53350ca..a967280db 100644 --- a/web/i18n/th-TH/plugin.ts +++ b/web/i18n/th-TH/plugin.ts @@ -257,6 +257,7 @@ const translation = { fixOnly: { name: 'ซ่อมเฉพาะ', selectedDescription: 'อัปเดตอัตโนมัติเฉพาะเวอร์ชันแพตช์เท่านั้น', + description: 'การอัปเดตอัตโนมัติสำหรับเฉพาะเวอร์ชันแพทช์ (เช่น 1.0.1 → 1.0.2) การเปลี่ยนแปลงเวอร์ชันย่อยจะไม่ทำให้เกิดการอัปเดต', }, latest: { name: 'ล่าสุด', diff --git a/web/i18n/th-TH/workflow.ts b/web/i18n/th-TH/workflow.ts index f03b021fd..875f347cb 100644 --- a/web/i18n/th-TH/workflow.ts +++ b/web/i18n/th-TH/workflow.ts @@ -497,6 +497,7 @@ const translation = { placeholder: 'ใส่ค่า', }, title: 'การกรองข้อมูลเมตา', + tip: 'การกรองข้อมูลเมตาดาต้าเป็นกระบวนการที่ใช้คุณลักษณะของเมตาดาต้า (เช่น แท็ก หมวดหมู่ หรือสิทธิการเข้าถึง) เพื่อปรับแต่งและควบคุมการดึงข้อมูลที่เกี่ยวข้องภายในระบบ.', }, }, http: { diff --git a/web/i18n/tr-TR/app-annotation.ts b/web/i18n/tr-TR/app-annotation.ts index bcd6db1fb..f9b29bb71 100644 --- a/web/i18n/tr-TR/app-annotation.ts +++ b/web/i18n/tr-TR/app-annotation.ts @@ -17,6 +17,7 @@ const translation = { bulkImport: 'Toplu İçe Aktarma', bulkExport: 'Toplu Dışa Aktarma', clearAll: 'Tüm Ek Açıklamaları Temizle', + clearAllConfirm: 'Tüm açıklamaları silinsin mi?', }, }, editModal: { diff --git a/web/i18n/tr-TR/app.ts b/web/i18n/tr-TR/app.ts index 1847af9cf..05ad7c137 100644 --- a/web/i18n/tr-TR/app.ts +++ b/web/i18n/tr-TR/app.ts @@ -257,6 +257,7 @@ const translation = { noAccessPermission: 'Web uygulamasına erişim izni yok', maxActiveRequestsPlaceholder: 'Sınırsız için 0 girin', maxActiveRequests: 'Maksimum eş zamanlı istekler', + maxActiveRequestsTip: 'Her uygulama için maksimum eşzamanlı aktif istek sayısı (sınırsız için 0)', } export default translation diff --git a/web/i18n/tr-TR/plugin.ts b/web/i18n/tr-TR/plugin.ts index 4c2b5510d..1856a34c7 100644 --- a/web/i18n/tr-TR/plugin.ts +++ b/web/i18n/tr-TR/plugin.ts @@ -257,6 +257,7 @@ const translation = { fixOnly: { selectedDescription: 'Sadece yamanın versiyonları için otomatik güncelleme', name: 'Sadece Düzelt', + description: 'Yalnızca yamanın sürüm güncellemeleri için otomatik güncelleme (örneğin, 1.0.1 → 1.0.2). Küçük sürüm değişiklikleri güncellemeleri tetiklemez.', }, latest: { name: 'Son', diff --git a/web/i18n/tr-TR/workflow.ts b/web/i18n/tr-TR/workflow.ts index b30442023..957221706 100644 --- a/web/i18n/tr-TR/workflow.ts +++ b/web/i18n/tr-TR/workflow.ts @@ -497,6 +497,7 @@ const translation = { datePlaceholder: 'Bir zaman seçin...', }, title: 'Meta Verileri Filtreleme', + tip: 'Metadata filtreleme, bir sistem içinde ilgili bilgilerin alınmasını ince ayar ve kontrol etmek için metadata özniteliklerini (etiketler, kategoriler veya erişim izinleri gibi) kullanma sürecidir.', }, }, http: { diff --git a/web/i18n/uk-UA/app-annotation.ts b/web/i18n/uk-UA/app-annotation.ts index d34be76d7..918cea529 100644 --- a/web/i18n/uk-UA/app-annotation.ts +++ b/web/i18n/uk-UA/app-annotation.ts @@ -17,6 +17,7 @@ const translation = { bulkImport: 'Масовий імпорт', bulkExport: 'Масовий експорт', clearAll: 'Очистити всі анотації', + clearAllConfirm: 'Видалити всі анотації?', }, }, editModal: { diff --git a/web/i18n/uk-UA/app.ts b/web/i18n/uk-UA/app.ts index 0d41e1e63..26c059f72 100644 --- a/web/i18n/uk-UA/app.ts +++ b/web/i18n/uk-UA/app.ts @@ -261,6 +261,7 @@ const translation = { noAccessPermission: 'Немає дозволу на доступ до веб-додатку', maxActiveRequestsPlaceholder: 'Введіть 0 для необмеженого', maxActiveRequests: 'Максимальна кількість одночасних запитів', + maxActiveRequestsTip: 'Максимальна кількість одночасних активних запитів на додаток (0 для необмеженої кількості)', } export default translation diff --git a/web/i18n/uk-UA/plugin.ts b/web/i18n/uk-UA/plugin.ts index 877d7843f..22b98fbd4 100644 --- a/web/i18n/uk-UA/plugin.ts +++ b/web/i18n/uk-UA/plugin.ts @@ -257,6 +257,7 @@ const translation = { fixOnly: { name: 'Виправити тільки', selectedDescription: 'Автоматичне оновлення лише для версій патчів', + description: 'Автооновлення лише для патч-версій (наприклад, 1.0.1 → 1.0.2). Зміни в малих версіях не активують оновлення.', }, latest: { name: 'Останні', diff --git a/web/i18n/uk-UA/workflow.ts b/web/i18n/uk-UA/workflow.ts index 5b62ef83e..65dfab68a 100644 --- a/web/i18n/uk-UA/workflow.ts +++ b/web/i18n/uk-UA/workflow.ts @@ -497,6 +497,7 @@ const translation = { add: 'Додати умову', }, title: 'Фільтрація метаданих', + tip: 'Фільтрація метаданих — це процес використання атрибутів метаданих (таких як теги, категорії або права доступу) для уточнення та контролю отримання відповідної інформації в системі.', }, }, http: { diff --git a/web/i18n/vi-VN/app-annotation.ts b/web/i18n/vi-VN/app-annotation.ts index 6a9457f3d..5b9f3b35a 100644 --- a/web/i18n/vi-VN/app-annotation.ts +++ b/web/i18n/vi-VN/app-annotation.ts @@ -17,6 +17,7 @@ const translation = { bulkImport: 'Nhập hàng loạt', bulkExport: 'Xuất hàng loạt', clearAll: 'Xóa tất cả chú thích', + clearAllConfirm: 'Xóa tất cả các chú thích?', }, }, editModal: { diff --git a/web/i18n/vi-VN/app.ts b/web/i18n/vi-VN/app.ts index 4100b52b3..9ad205833 100644 --- a/web/i18n/vi-VN/app.ts +++ b/web/i18n/vi-VN/app.ts @@ -261,6 +261,7 @@ const translation = { accessControl: 'Kiểm soát truy cập ứng dụng web', maxActiveRequestsPlaceholder: 'Nhập 0 để không giới hạn', maxActiveRequests: 'Số yêu cầu đồng thời tối đa', + maxActiveRequestsTip: 'Số yêu cầu hoạt động đồng thời tối đa cho mỗi ứng dụng (0 để không giới hạn)', } export default translation diff --git a/web/i18n/vi-VN/plugin.ts b/web/i18n/vi-VN/plugin.ts index 677d90e6a..c0f3dfac5 100644 --- a/web/i18n/vi-VN/plugin.ts +++ b/web/i18n/vi-VN/plugin.ts @@ -257,6 +257,7 @@ const translation = { fixOnly: { name: 'Chỉ sửa chữa', selectedDescription: 'Tự động cập nhật chỉ cho các phiên bản bản vá', + description: 'Tự động cập nhật chỉ cho các phiên bản vá (ví dụ: 1.0.1 → 1.0.2). Thay đổi phiên bản nhỏ sẽ không kích hoạt cập nhật.', }, latest: { name: 'Mới nhất', diff --git a/web/i18n/vi-VN/workflow.ts b/web/i18n/vi-VN/workflow.ts index a4525a3ff..ebe06807b 100644 --- a/web/i18n/vi-VN/workflow.ts +++ b/web/i18n/vi-VN/workflow.ts @@ -497,6 +497,7 @@ const translation = { search: 'Tìm kiếm siêu dữ liệu', }, title: 'Lọc siêu dữ liệu', + tip: 'Lọc siêu dữ liệu là quá trình sử dụng các thuộc tính siêu dữ liệu (chẳng hạn như thẻ, danh mục hoặc quyền truy cập) để tinh chỉnh và kiểm soát việc truy xuất thông tin liên quan trong một hệ thống.', }, }, http: { diff --git a/web/i18n/zh-Hant/app-annotation.ts b/web/i18n/zh-Hant/app-annotation.ts index e1fee4626..02eb98f5d 100644 --- a/web/i18n/zh-Hant/app-annotation.ts +++ b/web/i18n/zh-Hant/app-annotation.ts @@ -19,6 +19,7 @@ const translation = { bulkImport: '批次匯入', bulkExport: '批次匯出', clearAll: '刪除所有標註', + clearAllConfirm: '要刪除所有標註嗎?', }, }, editModal: { diff --git a/web/i18n/zh-Hant/app.ts b/web/i18n/zh-Hant/app.ts index 07b6c8545..e6a3a0b57 100644 --- a/web/i18n/zh-Hant/app.ts +++ b/web/i18n/zh-Hant/app.ts @@ -260,6 +260,7 @@ const translation = { noAccessPermission: '沒有權限訪問網絡應用程式', maxActiveRequestsPlaceholder: '輸入 0 以表示無限', maxActiveRequests: '同時最大請求數', + maxActiveRequestsTip: '每個應用程式可同時活躍請求的最大數量(0為無限制)', } export default translation diff --git a/web/i18n/zh-Hant/plugin.ts b/web/i18n/zh-Hant/plugin.ts index 0d0e1f878..117491fe0 100644 --- a/web/i18n/zh-Hant/plugin.ts +++ b/web/i18n/zh-Hant/plugin.ts @@ -257,6 +257,7 @@ const translation = { fixOnly: { name: '僅修理', selectedDescription: '僅限於修補版本的自動更新', + description: '僅為補丁版本自動更新(例如:1.0.1 → 1.0.2)。次要版本變更不會觸發更新。', }, latest: { description: '始終更新至最新版本', diff --git a/web/i18n/zh-Hant/workflow.ts b/web/i18n/zh-Hant/workflow.ts index 0ffdde771..935d042fa 100644 --- a/web/i18n/zh-Hant/workflow.ts +++ b/web/i18n/zh-Hant/workflow.ts @@ -497,6 +497,7 @@ const translation = { placeholder: '輸入數值', }, title: '元數據過濾', + tip: '元數據過濾是使用元數據屬性(如標籤、類別或訪問權限)來精煉和控制在系統內檢索相關信息的過程。', }, }, http: {